From ad28b1203fde7bb13d0a982c074432ac8121c23f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Rod=C3=A9s-Guirao?= Date: Wed, 11 Dec 2024 17:58:30 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=8A=20wittgenstein=20human=20capital?= =?UTF-8?q?=20(#3702)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 📊 wittgenstein human capital * wip * add dependency * remove comment * wip * wip * wip * wip * snapshot * wip meadow * wip * wip * wip garden + grapher * wip * wip * wip * wip * working version * filter & keep only relevant for grapher * wip dag * allow 2020 data in meadow, use numbers to identify scenarios * abstract functions * fix jinja typo * wip * allow some age groups into grapher * wip * combined dataset * renames * wip * various fixes * various fixes * minor fix * update indicator titles * archive * add scenario description * estimate prop ourselves * fix missing column drop * do not import projections-only dataset * archive --- dag/archive/demography.yml | 8 + dag/archive/education.yml | 12 +- dag/demography.yml | 32 +- dag/education.yml | 15 +- .../garden/demography/2024-12-06/shared.py | 147 +++++ .../wittgenstein_human_capital.meta.yml | 530 ++++++++++++++++ .../2024-12-06/wittgenstein_human_capital.py | 127 ++++ ...in_human_capital_historical.countries.json | 231 +++++++ ...genstein_human_capital_historical.meta.yml | 501 ++++++++++++++++ .../wittgenstein_human_capital_historical.py | 133 +++++ ...genstein_human_capital_proj.countries.json | 231 +++++++ .../wittgenstein_human_capital_proj.meta.yml | 565 ++++++++++++++++++ .../wittgenstein_human_capital_proj.py | 133 +++++ .../2024-12-06/wittgenstein_human_capital.py | 48 ++ .../wittgenstein_human_capital_proj.py | 48 ++ .../meadow/demography/2024-12-06/shared.py | 372 ++++++++++++ .../wittgenstein_human_capital_historical.py | 144 +++++ .../wittgenstein_human_capital_proj.py | 131 ++++ pyproject.toml | 1 + .../2024-12-06/wittgenstein_human_capital.py | 202 +++++++ .../wittgenstein_human_capital.zip.dvc | 32 + ...tgenstein_human_capital_historical.zip.dvc | 32 + uv.lock | 345 +---------- 23 files changed, 3681 insertions(+), 339 deletions(-) create mode 100644 etl/steps/data/garden/demography/2024-12-06/shared.py create mode 100644 etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital.meta.yml create mode 100644 etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital.py create mode 100644 etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.countries.json create mode 100644 etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.meta.yml create mode 100644 etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.py create mode 100644 etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.countries.json create mode 100644 etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.meta.yml create mode 100644 etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.py create mode 100644 etl/steps/data/grapher/demography/2024-12-06/wittgenstein_human_capital.py create mode 100644 etl/steps/data/grapher/demography/2024-12-06/wittgenstein_human_capital_proj.py create mode 100644 etl/steps/data/meadow/demography/2024-12-06/shared.py create mode 100644 etl/steps/data/meadow/demography/2024-12-06/wittgenstein_human_capital_historical.py create mode 100644 etl/steps/data/meadow/demography/2024-12-06/wittgenstein_human_capital_proj.py create mode 100644 snapshots/demography/2024-12-06/wittgenstein_human_capital.py create mode 100644 snapshots/demography/2024-12-06/wittgenstein_human_capital.zip.dvc create mode 100644 snapshots/demography/2024-12-06/wittgenstein_human_capital_historical.zip.dvc diff --git a/dag/archive/demography.yml b/dag/archive/demography.yml index 8319f1b63d2..7cbb7a7ee38 100644 --- a/dag/archive/demography.yml +++ b/dag/archive/demography.yml @@ -118,3 +118,11 @@ steps: - data://garden/un/2022-07-11/un_wpp data://grapher/demography/2023-10-10/life_expectancy: - data://garden/demography/2023-10-09/life_expectancy + + ## Population by education group (Wittgenstein centre) + data://meadow/demography/2023-04-07/population_education_wittgenstein: + - snapshot://demography/2023-04-07/population_education_wittgenstein.csv + data://garden/demography/2023-04-07/population_education_wittgenstein: + - data://meadow/demography/2023-04-07/population_education_wittgenstein + data://grapher/demography/2023-04-07/population_education_wittgenstein: + - data://garden/demography/2023-04-07/population_education_wittgenstein diff --git a/dag/archive/education.yml b/dag/archive/education.yml index 7fb0ac85e2b..1359bbefef6 100644 --- a/dag/archive/education.yml +++ b/dag/archive/education.yml @@ -9,4 +9,14 @@ steps: - data://garden/education/2018-04-18/literacy_rates data://grapher/wb/2023-07-10/education: - - data://garden/wb/2023-07-10/education \ No newline at end of file + - data://garden/wb/2023-07-10/education + + # Wittgenstein Center Population and Human Capital Projections - Educational Attainment + data://meadow/education/2023-12-15/wittgenstein_center: + - snapshot://education/2023-12-15/wittgenstein_center_data.csv + - snapshot://education/2023-12-15/wittgenstein_center_dictionary.csv + data://garden/education/2023-12-15/wittgenstein_center: + - data://meadow/education/2023-12-15/wittgenstein_center + - data://garden/education/2023-08-14/oecd_education + data://grapher/education/2023-12-15/wittgenstein_center: + - data://garden/education/2023-12-15/wittgenstein_center diff --git a/dag/demography.yml b/dag/demography.yml index 536bbc339ad..68c1051fa49 100644 --- a/dag/demography.yml +++ b/dag/demography.yml @@ -88,13 +88,6 @@ steps: data://grapher/hyde/2024-01-02/all_indicators: - data://garden/hyde/2024-01-02/all_indicators - ## Population by education group (Wittgenstein centre) - data://meadow/demography/2023-04-07/population_education_wittgenstein: - - snapshot://demography/2023-04-07/population_education_wittgenstein.csv - data://garden/demography/2023-04-07/population_education_wittgenstein: - - data://meadow/demography/2023-04-07/population_education_wittgenstein - data://grapher/demography/2023-04-07/population_education_wittgenstein: - - data://garden/demography/2023-04-07/population_education_wittgenstein ## Population doubling times data://garden/demography/2024-07-18/population_doubling_times: - data://garden/demography/2024-07-15/population @@ -270,3 +263,28 @@ steps: - data://garden/hmd/2024-12-01/hmd data://grapher/hmd/2024-12-03/hmd_country: - data://garden/hmd/2024-12-03/hmd_country + + ######################################################################## + # OTHERS + ######################################################################## + + # Wittgenstein Centre (Projections) + data://meadow/demography/2024-12-06/wittgenstein_human_capital_proj: + - snapshot://demography/2024-12-06/wittgenstein_human_capital.zip + data://garden/demography/2024-12-06/wittgenstein_human_capital_proj: + - data://meadow/demography/2024-12-06/wittgenstein_human_capital_proj + # data://grapher/demography/2024-12-06/wittgenstein_human_capital_proj: + # - data://garden/demography/2024-12-06/wittgenstein_human_capital_proj + + # Wittgenstein Centre (Historical) + data://meadow/demography/2024-12-06/wittgenstein_human_capital_historical: + - snapshot://demography/2024-12-06/wittgenstein_human_capital_historical.zip + data://garden/demography/2024-12-06/wittgenstein_human_capital_historical: + - data://meadow/demography/2024-12-06/wittgenstein_human_capital_historical + + # Wittgenstein Centre (Projections + Historical) + data://garden/demography/2024-12-06/wittgenstein_human_capital: + - data://garden/demography/2024-12-06/wittgenstein_human_capital_historical + - data://garden/demography/2024-12-06/wittgenstein_human_capital_proj + data://grapher/demography/2024-12-06/wittgenstein_human_capital: + - data://garden/demography/2024-12-06/wittgenstein_human_capital diff --git a/dag/education.yml b/dag/education.yml index a52b02d95cc..515ee62bd68 100644 --- a/dag/education.yml +++ b/dag/education.yml @@ -11,7 +11,6 @@ steps: data://grapher/education/2023-07-17/education_barro_lee_projections: - data://garden/education/2023-07-17/education_barro_lee_projections - # Barro and Lee historical estimates data://meadow/education/2023-07-17/education_lee_lee: - snapshot://education/2023-07-17/education_lee_lee.xlsx @@ -25,8 +24,7 @@ steps: data://grapher/education/2023-07-17/education_lee_lee: - data://garden/education/2023-07-17/education_lee_lee - -# OECD historical education data + # OECD historical education data data://meadow/education/2023-08-09/clio_infra_education: - snapshot://education/2023-08-09/years_of_education.xlsx - snapshot://education/2023-08-09/years_of_education_gini.xlsx @@ -80,16 +78,6 @@ steps: data://grapher/oecd/2023-12-06/pisa: - data://garden/oecd/2023-12-06/pisa - # Wittgenstein Center Population and Human Capital Projections - Educational Attainment - data://meadow/education/2023-12-15/wittgenstein_center: - - snapshot://education/2023-12-15/wittgenstein_center_data.csv - - snapshot://education/2023-12-15/wittgenstein_center_dictionary.csv - data://garden/education/2023-12-15/wittgenstein_center: - - data://meadow/education/2023-12-15/wittgenstein_center - - data://garden/education/2023-08-14/oecd_education - data://grapher/education/2023-12-15/wittgenstein_center: - - data://garden/education/2023-12-15/wittgenstein_center - # UNESCO data on other policy related education indicators data://meadow/unesco/2024-06-16/education_opri: - snapshot://unesco/2024-06-16/education_opri.zip @@ -117,7 +105,6 @@ steps: data://grapher/unesco/2024-11-21/enrolment_rates: - data://garden/unesco/2024-11-21/enrolment_rates - # World Bank EdStats data://meadow/wb/2024-11-04/edstats: - snapshot://wb/2024-11-04/edstats.csv diff --git a/etl/steps/data/garden/demography/2024-12-06/shared.py b/etl/steps/data/garden/demography/2024-12-06/shared.py new file mode 100644 index 00000000000..ad11f6c7ff2 --- /dev/null +++ b/etl/steps/data/garden/demography/2024-12-06/shared.py @@ -0,0 +1,147 @@ +import owid.catalog.processing as pr + +from etl.data_helpers import geo + +# Columns index +COLUMNS_INDEX = [ + "country", + "year", + "scenario", + "sex", + "age", + "education", +] + + +def make_table( + tb, + country_mapping_path, + dtypes=None, + all_single=False, + all_range=False, + cols_single=None, + cols_range=None, + per_10=None, + per_100=None, + per_1000=None, + div_10=None, + div_100=None, + div_1000=None, +): + dtypes = {**{"scenario": "UInt8", "country": "category"}, **(dtypes or {})} + tb = tb.astype(dtypes) + + if all_single: + tb["year"] = tb["year"].astype("Int32") + elif all_range: + assert tb["year"].str.contains("-").all(), "Some years are not ranges!" + tb["year"] = tb["year"].str.extract(r"(\d{4}\.?0?)$").astype("Float32").astype("Int32") + else: + tb = consolidate_year_single_and_ranges( + tb=tb, + cols_single=cols_single, + cols_range=cols_range, + ) + + # Ensure expected scenario IDs + assert set(tb["scenario"].unique()) == set(range(1, 6)) + + # Harmonize country names + tb = geo.harmonize_countries( + df=tb, + countries_file=country_mapping_path, + show_full_warning=False, + ) + + # Scale + tb = scale_values( + tb, per_10=per_10, per_100=per_100, per_1000=per_1000, div_10=div_10, div_100=div_100, div_1000=div_1000 + ) + return tb + + +def scale_values(tb, per_10=None, per_100=None, per_1000=None, div_10=None, div_100=None, div_1000=None): + if per_10 is not None: + for col in per_10: + tb[col] *= 10 + if per_100 is not None: + for col in per_100: + tb[col] *= 100 + if per_1000 is not None: + for col in per_1000: + tb[col] *= 1000 + if div_10 is not None: + for col in div_10: + tb[col] /= 10 + if div_100 is not None: + for col in div_100: + tb[col] /= 100 + if div_1000 is not None: + for col in div_1000: + tb[col] /= 1000 + return tb + + +def consolidate_year_single_and_ranges(tb, cols_single, cols_range): + # 1) Periods like "2020-2025" are mapped to 2025 + # 2) While doing 1, we should make sure that the tables are properly aligned + flag = tb["year"].str.contains("-") + + # Check columns for single year data + single_year_cols = set(tb.loc[~flag].dropna(axis=1, how="all").columns) - set(COLUMNS_INDEX) + assert single_year_cols == set(cols_single), f"Unexpected columns in single year data: {single_year_cols}" + + # Check columns for range year data + range_year_cols = set(tb.loc[flag].dropna(axis=1, how="all").columns) - set(COLUMNS_INDEX) + assert range_year_cols == set(cols_range), f"Unexpected columns in range year data: {range_year_cols}" + + # Fix year type + tb["year"] = tb["year"].str.extract(r"(\d{4}\.?0?)$").astype("Float32").astype("Int32") + + # Create two tables: year range and single year + cols_index = list(tb.columns.intersection(COLUMNS_INDEX)) + tb_single = tb[cols_index + cols_single].dropna(subset=cols_single, how="all") + tb_range = tb[cols_index + cols_range].dropna(subset=cols_range, how="all") + + # Merge back + tb = tb_single.merge(tb_range, on=cols_index, how="outer") + + return tb + + +def add_dim_some_education(tb): + """Add dimension "some education" to sex+age+education table. + + It only adds it for sex=total and age=total. + """ + SOME_EDUCATION = "some_education" + # Add education="some_education" (only for sex=total and age=total, and indicator 'pop') + cols_index = ["country", "year", "age", "sex", "scenario"] + tb_tmp = tb.loc[tb["education"].isin(["total", "no_education"]), cols_index + ["education", "pop"]] + tb_tmp = tb_tmp.pivot(index=cols_index, columns="education", values="pop").reset_index().dropna() + tb_tmp["some_education"] = tb_tmp["total"] - tb_tmp["no_education"] + assert (tb_tmp["some_education"] >= 0).all() + tb_tmp = tb_tmp.melt(id_vars=cols_index, value_vars=SOME_EDUCATION, var_name="education", value_name="pop") + + # Add new education + tb["education"] = tb["education"].cat.add_categories([SOME_EDUCATION]) + + dtypes = tb.dtypes + tb = pr.concat([tb, tb_tmp], ignore_index=True) + tb = tb.astype(dtypes) + + return tb + + +def get_index_columns(tb): + cols_index = list(tb.columns.intersection(COLUMNS_INDEX)) + return cols_index + + +def add_prop(tb): + # Add + tbx = tb[tb["education"] == "total"].drop(columns=["education", "assr"]) + tb = tb.merge(tbx, on=["country", "year", "age", "sex", "scenario"], suffixes=["", "_total"]) + tb["prop"] = (100 * tb["pop"] / tb["pop_total"]).copy_metadata(tb["pop"]) + tb = tb.drop(columns=["pop_total"]) + return tb diff --git a/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital.meta.yml b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital.meta.yml new file mode 100644 index 00000000000..f886cbc03b4 --- /dev/null +++ b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital.meta.yml @@ -0,0 +1,530 @@ +# NOTE: To learn more about the fields, hover over their names. +definitions: + common: + display: + numDecimalPlaces: 2 + others: + education: |- + <> + title: |- + << title >> - Scenario: SSP<> + title_age: |- + << title >> - Scenario: SSP<> - + <%- if age == 'total' %> + All population + <%- else %> + Age: <> + <%- endif %> + title_sex: |- + << title >> - Scenario: SSP<> - + <%- if sex == 'total' %> + All population + <%- else %> + Sex: <>s + <%- endif %> + title_edu: |- + << title >> - Scenario: SSP<> - + <%- if education == 'total' %> + All population + <%- elif education == 'no_education' %> + Education: None + <%- else %> + Education: {definitions.others.education} + <%- endif %> + title_sex_age: |- + << title >> - Scenario: SSP<> - + <%- if (sex == 'total') and (age == 'total') %> + All population + <% else %> + <%- if (sex == 'total') %> + Sex: All - + <% else %> + Sex: <>s - + <%- endif %> + <%- if (age == 'total') %> + Age: All + <% else %> + Age: <> + <%- endif %> + <%- endif %> + title_age_edu: |- + << title >> - Scenario: SSP<> - + <%- if (age == 'total') and (education == 'total') %> + All population + <% else %> + <%- if (age == 'total') %> + Age: All - + <% else %> + Age: <> - + <%- endif %> + <%- if (education == 'total') %> + Education: All + <% elif (education == "no_education") %> + Education: None + <% else %> + Education: {definitions.others.education} + <%- endif %> + <%- endif %> + title_sex_age_edu: |- + << title >> - Scenario: SSP<> - + <%- if (age == 'total') and (sex == 'total') and (education == 'total') %> + All population + <% else %> + <%- if (sex == 'total') %> + Sex: All - + <% else %> + Sex: <>s - + <%- endif %> + <%- if (age == 'total') %> + Age: All - + <% else %> + Age: <> - + <%- endif %> + <%- if (education == 'total') %> + Education: All + <% elif (education == "no_education") %> + Education: None + <% else %> + Education: {definitions.others.education} + <%- endif %> + <%- endif %> + projections: |- + Projections from 2025 onwards are based on the << scenario >> scenario + dim_ssp: |- + <% if scenario == "1" %> + **Population Component of Rapid Development (SSP1)**: This scenario assumes a future that is moving toward a more sustainable path, with educational and health investments accelerating the demographic transition, leading to a relatively low world population. The emphasis is on strengthening human wellbeing. This is associated with high education, low mortality and low fertility. Migration levels are assumed to be medium for all countries under this SSP. + <%- elif scenario == "2" %> + **Population Component of Medium (SSP2)**: This is the middle of the road scenario that can also be seen as the most likely path for each country. It combines for all countries medium fertility with medium mortality, medium migration, and the Global Education Trend (GET) education scenario. + <%- elif scenario == "3" %> + **Population Component of Stalled Development (SSP3)**: This scenario portrays a world separated into regions characterized by extreme poverty, pockets of moderate wealth, and many countries struggling to maintain living standards for rapidly growing populations. This is associated with low education, high mortality and high fertility. Due to the emphasis on security and barriers to international exchange, migration is assumed to be low for all countries. + <%- elif scenario == "4" %> + **Population Component of Inequality (SSP4)**: This scenario assumes increasing inequalities and stratification both across and within countries. It assumes high fertility and mortality scenarios in high-fertility countries and low fertility and medium mortality scenarios in low-fertility countries combined with medium migration scenario. In terms of education the SSP3 education transitions (CER) are decreased by 10% for levels up to lower secondary education, keeping the SSP2 (GET) education transitions for upper and post-secondary education. + <%- elif scenario == "5" %> + **Population Component of Conventional Development (SSP5)**: This scenario is similar to SSP1 for the fertility, mortality and education assumptions except that it combines them with high migration scenario in a context of widespread globalization. + <%- endif %> + dim_edu: |- + <% if education == "total" %> + Over all education categories. + <% elif education == "under_15" %> + Population below 15 years old. + <% elif education == "no_education" %> + Highest level of education attained: No level and Grade 1 of ISCED 1 not completed. + <% elif education == "incomplete_primary" %> + Highest level of education attained: Incomplete ISCED 1. + <% elif education == "primary" %> + Highest level of education attained: Completed ISCED 1 and incomplete ISCED 2. + <% elif education == "lower_secondary" %> + Highest level of education attained: Completed ISCED 2 and incomplete ISCED 3. + <% elif education == "upper_secondary" %> + Highest level of education attained: Completed ISCED 3 and incomplete ISCED 4 5 or 6. + <% elif education == "post_secondary" %> + Highest level of education attained: Completed ISCED 4 5 6 7 or 8. + <% endif %> + dim_edu_all: |- + Under-15: Population below 15 years old. + No education: Highest level of education attained: No level and Grade 1 of ISCED 1 not completed. + Incomplete primary: Highest level of education attained: Incomplete ISCED 1. + Primary: Highest level of education attained: Completed ISCED 1 and incomplete ISCED 2. + Lower secondary: Highest level of education attained: Completed ISCED 2 and incomplete ISCED 3. + Upper secondary: Highest level of education attained: Completed ISCED 3 and incomplete ISCED 4 5 or 6. + Post secondary: Highest level of education attained: Completed ISCED 4 5 6 7 or 8. +# Learn more about the available fields: +# http://docs.owid.io/projects/etl/architecture/metadata/reference/ +dataset: + update_period_days: 730 + title: Wittgenstein Centre, Human Capital (Historical data + Projections) + +tables: + main: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + # Population + growth: + title: |- + <% set title = "Average Annual Growth Rate" %> + {definitions.others.title} + unit: "%" + short_unit: "%" + description_short: |- + Rate of growth of the population over the period of one year. {definitions.others.projections}. + presentation: + topic_tags: + - Population Growth + nirate: + title: |- + <% set title = "Average Annual Rate of Natural Increase" %> + {definitions.others.title} + unit: "per 1,000 people" + description_short: |- + Represents the portion of population growth (or decline) determined exclusively by births and deaths. {definitions.others.projections}. + display: + numDecimalPlaces: 1 + presentation: + topic_tags: + - Population Growth + + # Years + ggapmys15: + title: |- + <% set title = "Gender Gap in Mean Years Schooling (15+)" %> + {definitions.others.title} + unit: years + description_short: |- + The difference between female and male mean years of schooling for the population over 15 years of age. {definitions.others.projections}. Negative values indicate that women spent fewer years in school. + display: + numDecimalPlaces: 0 + presentation: + topic_tags: + - Global Education + ggapmys25: + title: |- + <% set title = "Gender Gap in Mean Years Schooling (25+)" %> + {definitions.others.title} + unit: years + description_short: |- + The difference between female and male mean years of schooling for population over 25 years of age. {definitions.others.projections}. Negative values indicate that women spent fewer years in school. + display: + numDecimalPlaces: 0 + presentation: + topic_tags: + - Global Education + mage: + title: |- + <% set title = "Population Median Age" %> + {definitions.others.title} + unit: years + description_short: |- + Age that divides the population in two parts of equal size, that is, there are as many persons with ages above the median as there are with ages below the median. {definitions.others.projections}. + presentation: + topic_tags: + - Population Growth + + # Rates (Births, Deaths) + cbr: + title: |- + <% set title = "Crude Birth Rate" %> + {definitions.others.title} + unit: births per 1,000 people + description_short: |- + Number of live births recorded over the last 5-year period, divided by population-years. It is based on the civil calendar year, spanning from January 1 to December 31. {definitions.others.projections}. + presentation: + topic_tags: + - Fertility Rate + - Population Growth + + cdr: + title: |- + <% set title = "Crude Death Rate" %> + {definitions.others.title} + unit: deaths per 1,000 people + description_short: |- + Number of deaths recorded in the last 5-year period, divided by population-years. It is based on the civil calendar year, spanning from January 1 to December 31. {definitions.others.projections}. + presentation: + topic_tags: + - Population Growth + - Life Expectancy + + # Ratios + tdr: + title: |- + <% set title = "Total Dependency Ratio" %> + {definitions.others.title} + unit: "%" + description_short: |- + The ratio of the youth (0-14) and elderly (65+) population over the working age (15-64) population. {definitions.others.projections}. + description_processing: |- + The source gives the values as the number of young and elderly persons per person of working age. We have scaled the figures to have percentages instead. + presentation: + topic_tags: + - Age Structure + ydr: + title: |- + <% set title = "Youth Dependency Ratio" %> + {definitions.others.title} + unit: "%" + description_short: |- + The ratio of the youth (0-14) population over the working age (15-64) population. {definitions.others.projections}. + description_processing: |- + The source gives the values as the number of young persons per person of working age. We have scaled the figures to have percentages instead. + presentation: + topic_tags: + - Age Structure + + odr: + title: |- + <% set title = "Old-age Dependency Ratio" %> + {definitions.others.title} + unit: "%" + description_short: |- + The ratio of the elderly (65+) population over the working age (15-64) population. {definitions.others.projections}. + description_processing: |- + The source gives the values as the number of elderly persons per person of working age. We have scaled the figures to have percentages instead. + presentation: + topic_tags: + - Age Structure + + by_age: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + sexratio: + title: |- + <% set title = "Sex ratio" %> + {definitions.others.title_age} + unit: "males per 100 females" + description_short: |- + <% if age == "total" %> + The number of male population per 100 female population. {definitions.others.projections}. + <%- else %> + The number of male population per 100 female population (aged << age >>). {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Gender Ratio + + by_sex: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + e0: + title: |- + <% set title = "Life expectancy" %> + {definitions.others.title_sex} + unit: "years" + description_short: |- + <% if sex == "total" %> + The number of years a newborn is expected to live. {definitions.others.projections}. + <%- else %> + The number of years a << sex >> newborn is expected to live. {definitions.others.projections}. + <% endif %> + presentation: + topic_tags: + - Life Expectancy + ryl15: + title: |- + <% set title = "Age when remaining Life Expectancy is below 15 years" %> + {definitions.others.title_sex} + unit: "years" + description_short: |- + <% if sex == "total" %> + The age of a person in a population when remaining life expectancy is 15 years. {definitions.others.projections}. + <%- else %> + The age of a << sex >> person in a population when remaining life expectancy is 15 years. {definitions.others.projections}. + <%- endif %> + description_processing: |- + Source: [Lutz et al. 2008](https://previous.iiasa.ac.at/web/home/research/researchPrograms/WorldPopulation/PublicationsMediaCoverage/POPNETNewsletter/popnet39.pdf#page=4) + presentation: + topic_tags: + - Life Expectancy + pryl15: + title: |- + <% set title = "Proportion of population with a remaining Life Expectancy below 15 Years" %> + {definitions.others.title_sex} + unit: "%" + short_unit: "%" + description_short: |- + <% if sex == "total" %> + Proportion of the population with a remaining life expectancy below 15 years in the total population. {definitions.others.projections}. + <%- else %> + Proportion of the << sex >> population with a remaining life expectancy below 15 years in the total population. {definitions.others.projections}. + <%- endif %> + description_processing: |- + Source: [Sanderson and Scherbov 2010](https://dataexplorer.wittgensteincentre.org/wcde-v3/www.iiasa.ac.at/web/home/research/researchPrograms/WorldPopulation/PublicationsMediaCoverage/POPNETNewsletter/popnet42.pdf#page=6) + presentation: + topic_tags: + - Life Expectancy + + by_edu: + variables: + ggapedu15: + title: |- + <% set title = "Gender gap in Educational Attainment (15+)" %> + {definitions.others.title_edu} + unit: "%" + short_unit: "%" + description_short: |- + The difference between the proportion of females and the proportion of males in the population over 15 years of age achieving education level "{definitions.others.education}". {definitions.others.projections}. + presentation: + topic_tags: + - Global Education + ggapedu25: + title: |- + <% set title = "Gender gap in Educational Attainment (25+)" %> + {definitions.others.title_edu} + unit: "%" + short_unit: "%" + description_short: |- + The difference between the proportion of females and the proportion of males in the population over 25 years of age achieving education level "{definitions.others.education}". {definitions.others.projections}. + presentation: + topic_tags: + - Global Education + # macb: + # title: |- + # <% set title = "Mean age at childbearing" %> + # {definitions.others.title_edu} + # unit: "years" + # short_unit: "years" + # description_short: |- + # <% if education == "total" %> + # The mean age of mothers at the birth of their children observed in the last five-year period. {definitions.others.projections}. + # <%- else %> + # The mean age of mothers at the birth of their children observed in the last five-year period. Data for people with education level "{definitions.others.education}". {definitions.others.projections}. + # <%- endif %> + # presentation: + # topic_tags: + # - Fertility Rate + tfr: + title: |- + <% set title = "Total Fertility Rate" %> + {definitions.others.title_edu} + unit: "births per woman in last 5 years" + description_short: |- + <% if education == "total" %> + The average number of children born in the last 5-year period to the women of reproductive age (15-49). + <%- else %> + The average number of children born in the last 5-year period to the women of reproductive age (15-49). Data for people with education level "{definitions.others.education}". {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Fertility Rate + # net: + # title: |- + # <% set title = "Net migration" %> + # {definitions.others.title_edu} + # unit: "people" + # description_short: |- + # <% if education == "total" %> + # The number of immigrants minus the number of emigrants over the last five-year period. {definitions.others.projections}. + # <%- else %> + # The number of immigrants minus the number of emigrants over the last five-year period. Data for migrants with education level "{definitions.others.education}". {definitions.others.projections}. + # <%- endif %> + # presentation: + # topic_tags: + # - Migration + + by_sex_age: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + mys: + title: |- + <% set title = "Mean years of schooling" %> + {definitions.others.title_sex_age} + unit: years + description_short: |- + <%- if (age == "total") and (sex == "total") %> + Mean number of years spent in school. {definitions.others.projections}. + <%- elif (age != "total") and (sex == "total") %> + Mean number of years spent in school (aged <>). {definitions.others.projections}. + <%- elif (age == "total") and (sex != "total") %> + Mean number of years spent in school (<>s). {definitions.others.projections}. + <%- else %> + Mean number of years spent in school (aged <>, <>s). {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Global Education + + by_age_edu: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + asfr: + title: |- + <% set title = "Age-Specific Fertility Rate" %> + {definitions.others.title_age_edu} + unit: births per 1,000 women + description_short: |- + <%- if (education == "total") %> + Number of births occurring to women aged <> in the last five years, divided by the number of women in the age group. {definitions.others.projections}. + <%- elif (education == "no_education") %> + Number of births occurring to women aged <> and no education in the last five years, divided by the number of women in that same group. {definitions.others.projections}. + <%- else %> + Number of births occurring to women aged <> and {definitions.others.education}-level education in the last five years, divided by the number of women in that age group. {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Global Education + - Fertility Rate + + by_sex_age_edu: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + assr: + title: |- + <% set title = "Age-Specific Survival Ratio" %> + {definitions.others.title_sex_age_edu} + unit: "%" + description_short: |- + <%- if (education == "total") %> + <%- if (age == "newborn") %> + The percentage of the <> newborn who are alive after the last five-year period. {definitions.others.projections}. + <%- else %> + The percentage of the <> population aged <> who are alive after the last five-year period. {definitions.others.projections}. + <%- endif %> + <%- elif (education == "no_education") %> + The percentage of the <> population aged <> with no education who are alive after the last five-year period. {definitions.others.projections}. + <%- else %> + The percentage of the <> population aged <> with <> education who are alive after the last five-year period. {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Life Expectancy + + pop: + title: |- + <% set title = "Population" %> + {definitions.others.title_sex_age_edu} + unit: "people" + description_short: |- + De facto population + <%- if (sex != "total") %> + of <>s + <%- endif %> + <%- if (age != "total") %> + aged <> + <%- endif %> + <%- if (education != "total") %> + with <%- if (education == "no_education") %>no education<%- else %><> education<%- endif %> + <%- endif %> + in a country or region. + presentation: + topic_tags: + - Population Growth + + prop: + title: |- + <% set title = "Educational Attainment Distribution" %> + {definitions.others.title_sex_age_edu} + unit: "%" + description_short: |- + De facto share of population + <%- if (sex != "total") %> + of <>s + <%- endif %> + <%- if (age != "total") %> + aged <> + <%- endif %> + <%- if (education != "total") %> + with <%- if (education == "no_education") %>no education<%- elif (education == "some_education") %>some formal education<%- else %><> education<%- endif %> + <%- endif %> + in a country or region. + description_processing: |- + We have estimated this indicator with the population values from this source. + presentation: + topic_tags: + - Global Education diff --git a/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital.py b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital.py new file mode 100644 index 00000000000..1e218d25d32 --- /dev/null +++ b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital.py @@ -0,0 +1,127 @@ +"""Load a meadow dataset and create a garden dataset.""" + +import owid.catalog.processing as pr + +from etl.helpers import PathFinder, create_dataset + +from .shared import get_index_columns + +# Get paths and naming conventions for current step. +paths = PathFinder(__file__) +# Not all columns are present in historical and projections datasets. This dictionary contains the expected differences. +TABLE_COLUMN_DIFFERENCES = { + "by_edu": { + "missing_in_hist": {"macb", "net"}, + }, + "by_sex_age": { + "missing_in_proj": {"net"}, + }, + "main": { + "missing_in_hist": {"emi", "imm"}, + "missing_in_proj": {"macb"}, + }, +} +DTYPES = { + "sex": "category", + "age": "category", + "education": "category", + "country": "category", + "year": "UInt16", + "scenario": "UInt8", +} + + +def run(dest_dir: str) -> None: + # + # Load inputs. + # + # Load meadow dataset. + ds_proj = paths.load_dataset("wittgenstein_human_capital_proj") + ds_hist = paths.load_dataset("wittgenstein_human_capital_historical") + + # Read table from meadow dataset. + paths.log.info("reading tables...") + tbs_proj = {t.m.short_name: t.reset_index() for t in ds_proj} + tbs_hist = {t.m.short_name: t.reset_index() for t in ds_hist} + + # + # Processing + # + assert tbs_proj.keys() == tbs_hist.keys(), "Mismatch in tables between historical and projection datasets" + + tables = [] + for key in tbs_proj.keys(): + paths.log.info(f"Building {key}") + + # Get tables + tb_proj = tbs_proj[key] + tb_hist = tbs_hist[key] + + # Dtypes + tb_proj = tb_proj.astype({k: v for k, v in DTYPES.items() if k in tb_proj.columns}) + tb_hist = tb_hist.astype({k: v for k, v in DTYPES.items() if k in tb_hist.columns}) + + # Check + sanity_checks(tb_proj, tb_hist) + + # Keep only the columns that are present in both datasets + columns_common = tb_proj.columns.intersection(tb_hist.columns) + + # Concatenate + tb = pr.concat([tb_proj[columns_common], tb_hist[columns_common]], ignore_index=True) + + # Remove duplicates + index = get_index_columns(tb) + tb = tb.drop_duplicates(subset=index, keep="first") + + # Format + tb = tb.format(index, short_name=key) + + # Reduce origins + for col in tb.columns: + tb[col].metadata.origins = [tb[col].metadata.origins[0]] + + # Add to list + tables.append(tb) + # + # Save outputs. + # + # Create a new garden dataset with the same metadata as the meadow dataset. + ds_garden = create_dataset( + dest_dir, + tables=tables, + check_variables_metadata=True, + ) + + # Save changes in the new garden dataset. + ds_garden.save() + + +def sanity_checks(tb_proj, tb_hist): + # Short name sanity check + assert ( + tb_proj.m.short_name == tb_hist.m.short_name + ), f"Mismatch in short_name of historical ({tb_hist.m.short_name}) and projection ({tb_proj.m.short_name})" + key = tb_proj.m.short_name + + # Look for differences + missing_in_hist = set(tb_proj.columns) - set(tb_hist.columns) + missing_in_proj = set(tb_hist.columns) - set(tb_proj.columns) + + # Check with expected differences + if key in TABLE_COLUMN_DIFFERENCES: + missing_in_hist_expected = TABLE_COLUMN_DIFFERENCES[key].get("missing_in_hist", set()) + missing_in_proj_expected = TABLE_COLUMN_DIFFERENCES[key].get("missing_in_proj", set()) + assert missing_in_hist == missing_in_hist_expected, ( + f"Table {key}: Missing columns in historical dataset. " + f"Expected: {missing_in_hist_expected}, Found: {missing_in_hist}" + ) + assert missing_in_proj == missing_in_proj_expected, ( + f"Table {key}: Missing columns in projection dataset. " + f"Expected: {missing_in_proj_expected}, Found: {missing_in_proj}" + ) + else: + assert set(tb_proj.columns) == set(tb_hist.columns), ( + f"Table {key}: Mismatch in columns between historical and projection. " + f"Projection columns: {tb_proj.columns.tolist()}, Historical columns: {tb_hist.columns.tolist()}" + ) diff --git a/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.countries.json b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.countries.json new file mode 100644 index 00000000000..3b8bc22b510 --- /dev/null +++ b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.countries.json @@ -0,0 +1,231 @@ +{ + "Afghanistan": "Afghanistan", + "Albania": "Albania", + "Algeria": "Algeria", + "Angola": "Angola", + "Antigua and Barbuda": "Antigua and Barbuda", + "Argentina": "Argentina", + "Armenia": "Armenia", + "Aruba": "Aruba", + "Australia": "Australia", + "Austria": "Austria", + "Azerbaijan": "Azerbaijan", + "Bahamas": "Bahamas", + "Bahrain": "Bahrain", + "Bangladesh": "Bangladesh", + "Barbados": "Barbados", + "Belarus": "Belarus", + "Belgium": "Belgium", + "Belize": "Belize", + "Benin": "Benin", + "Bhutan": "Bhutan", + "Bolivia (Plurinational State of)": "Bolivia", + "Bosnia and Herzegovina": "Bosnia and Herzegovina", + "Botswana": "Botswana", + "Brazil": "Brazil", + "Brunei Darussalam": "Brunei", + "Bulgaria": "Bulgaria", + "Burkina Faso": "Burkina Faso", + "Burundi": "Burundi", + "Cambodia": "Cambodia", + "Cameroon": "Cameroon", + "Canada": "Canada", + "Cape Verde": "Cape Verde", + "Central African Republic": "Central African Republic", + "Chad": "Chad", + "Chile": "Chile", + "China": "China", + "Colombia": "Colombia", + "Comoros": "Comoros", + "Congo": "Congo", + "Costa Rica": "Costa Rica", + "Cote d'Ivoire": "Cote d'Ivoire", + "Croatia": "Croatia", + "Cuba": "Cuba", + "Cura\u00e7ao": "Curacao", + "Cyprus": "Cyprus", + "Czech Republic": "Czechia", + "Democratic People's Republic of Korea": "North Korea", + "Democratic Republic of the Congo": "Democratic Republic of Congo", + "Denmark": "Denmark", + "Djibouti": "Djibouti", + "Dominican Republic": "Dominican Republic", + "Ecuador": "Ecuador", + "Egypt": "Egypt", + "El Salvador": "El Salvador", + "Equatorial Guinea": "Equatorial Guinea", + "Eritrea": "Eritrea", + "Estonia": "Estonia", + "Ethiopia": "Ethiopia", + "Fiji": "Fiji", + "Finland": "Finland", + "France": "France", + "French Guiana": "French Guiana", + "French Polynesia": "French Polynesia", + "Gabon": "Gabon", + "Gambia": "Gambia", + "Georgia": "Georgia", + "Germany": "Germany", + "Ghana": "Ghana", + "Greece": "Greece", + "Grenada": "Grenada", + "Guadeloupe": "Guadeloupe", + "Guam": "Guam", + "Guatemala": "Guatemala", + "Guinea": "Guinea", + "Guinea-Bissau": "Guinea-Bissau", + "Guyana": "Guyana", + "Haiti": "Haiti", + "Honduras": "Honduras", + "Hungary": "Hungary", + "Iceland": "Iceland", + "India": "India", + "Indonesia": "Indonesia", + "Iran (Islamic Republic of)": "Iran", + "Iraq": "Iraq", + "Ireland": "Ireland", + "Israel": "Israel", + "Italy": "Italy", + "Jamaica": "Jamaica", + "Japan": "Japan", + "Jordan": "Jordan", + "Kazakhstan": "Kazakhstan", + "Kenya": "Kenya", + "Kiribati": "Kiribati", + "Kuwait": "Kuwait", + "Kyrgyzstan": "Kyrgyzstan", + "Lao People's Democratic Republic": "Laos", + "Latvia": "Latvia", + "Lebanon": "Lebanon", + "Lesotho": "Lesotho", + "Liberia": "Liberia", + "Lithuania": "Lithuania", + "Luxembourg": "Luxembourg", + "Madagascar": "Madagascar", + "Malawi": "Malawi", + "Malaysia": "Malaysia", + "Maldives": "Maldives", + "Mali": "Mali", + "Malta": "Malta", + "Martinique": "Martinique", + "Mauritania": "Mauritania", + "Mauritius": "Mauritius", + "Mayotte": "Mayotte", + "Mexico": "Mexico", + "Micronesia": "Micronesia (UNSD)", + "Micronesia (Federated States of)": "Micronesia (country)", + "Mongolia": "Mongolia", + "Montenegro": "Montenegro", + "Morocco": "Morocco", + "Mozambique": "Mozambique", + "Myanmar": "Myanmar", + "Namibia": "Namibia", + "Nepal": "Nepal", + "Netherlands": "Netherlands", + "New Caledonia": "New Caledonia", + "New Zealand": "New Zealand", + "Nicaragua": "Nicaragua", + "Niger": "Niger", + "Nigeria": "Nigeria", + "Norway": "Norway", + "Occupied Palestinian Territory": "Palestine", + "Oman": "Oman", + "Pakistan": "Pakistan", + "Panama": "Panama", + "Papua New Guinea": "Papua New Guinea", + "Paraguay": "Paraguay", + "Peru": "Peru", + "Philippines": "Philippines", + "Poland": "Poland", + "Portugal": "Portugal", + "Puerto Rico": "Puerto Rico", + "Qatar": "Qatar", + "Republic of Korea": "South Korea", + "Republic of Moldova": "Moldova", + "Reunion": "Reunion", + "Romania": "Romania", + "Russian Federation": "Russia", + "Rwanda": "Rwanda", + "Saint Lucia": "Saint Lucia", + "Saint Vincent and the Grenadines": "Saint Vincent and the Grenadines", + "Samoa": "Samoa", + "Sao Tome and Principe": "Sao Tome and Principe", + "Saudi Arabia": "Saudi Arabia", + "Senegal": "Senegal", + "Serbia": "Serbia", + "Seychelles": "Seychelles", + "Sierra Leone": "Sierra Leone", + "Singapore": "Singapore", + "Slovakia": "Slovakia", + "Slovenia": "Slovenia", + "Solomon Islands": "Solomon Islands", + "Somalia": "Somalia", + "South Africa": "South Africa", + "South Sudan": "South Sudan", + "Spain": "Spain", + "Sri Lanka": "Sri Lanka", + "Sudan": "Sudan", + "Suriname": "Suriname", + "Swaziland": "Eswatini", + "Sweden": "Sweden", + "Switzerland": "Switzerland", + "Syrian Arab Republic": "Syria", + "Tajikistan": "Tajikistan", + "Thailand": "Thailand", + "Timor-Leste": "East Timor", + "Togo": "Togo", + "Tonga": "Tonga", + "Trinidad and Tobago": "Trinidad and Tobago", + "Tunisia": "Tunisia", + "Turkey": "Turkey", + "Turkmenistan": "Turkmenistan", + "Uganda": "Uganda", + "Ukraine": "Ukraine", + "United Arab Emirates": "United Arab Emirates", + "United Kingdom of Great Britain and Northern Ireland": "United Kingdom", + "United Republic of Tanzania": "Tanzania", + "United States Virgin Islands": "United States Virgin Islands", + "United States of America": "United States", + "Uruguay": "Uruguay", + "Uzbekistan": "Uzbekistan", + "Vanuatu": "Vanuatu", + "Venezuela (Bolivarian Republic of)": "Venezuela", + "Viet Nam": "Vietnam", + "Western Sahara": "Western Sahara", + "World": "World", + "Yemen": "Yemen", + "Zambia": "Zambia", + "Zimbabwe": "Zimbabwe", + "Africa": "Africa (UNSD)", + "Asia": "Asia (UNSD)", + "Australia and New Zealand": "Australia and New Zealand (UNSD)", + "Caribbean": "Caribbean (UNSD)", + "Central America": "Central America (UNSD)", + "Central Asia": "Central Asia (UNSD)", + "Eastern Africa": "Eastern Africa (UNSD)", + "Eastern Asia": "Eastern Asia (UNSD)", + "Eastern Europe": "Eastern Europe (UNSD)", + "Europe": "Europe (UNSD)", + "Hong Kong Special Administrative Region of China": "Hong Kong", + "Latin America and the Caribbean": "Latin America and the Caribbean (UNSD)", + "Libyan Arab Jamahiriya": "Libya", + "Macao Special Administrative Region of China": "Macao", + "Melanesia": "Melanesia (UNSD)", + "Middle Africa": "Middle Africa (UNSD)", + "Northern Africa": "Northern Africa (UNSD)", + "Northern America": "Northern America (UNSD)", + "Northern Europe": "Northern Europe (UNSD)", + "Oceania": "Oceania (UNSD)", + "Polynesia": "Polynesia (UNSD)", + "South America": "South America (UNSD)", + "South-Eastern Asia": "South-eastern Asia (UNSD)", + "Southern Africa": "Southern Africa (UNSD)", + "Southern Asia": "Southern Asia (UNSD)", + "Southern Europe": "Southern Europe (UNSD)", + "Taiwan Province of China": "Taiwan", + "The former Yugoslav Republic of Macedonia": "North Macedonia", + "Western Africa": "Western Africa (UNSD)", + "Western Asia": "Western Asia (UNSD)", + "Western Europe": "Western Europe (UNSD)", + "Channel Islands": "Channel Islands" +} diff --git a/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.meta.yml b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.meta.yml new file mode 100644 index 00000000000..fbddd08a368 --- /dev/null +++ b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.meta.yml @@ -0,0 +1,501 @@ +# NOTE: To learn more about the fields, hover over their names. +definitions: + common: + display: + numDecimalPlaces: 2 + others: + education: |- + <> + title: |- + << title >> - Scenario: SSP<> + title_age: |- + << title >> - Scenario: SSP<> - + <%- if age == 'total' %> + All population + <%- else %> + Age: <> + <%- endif %> + title_sex: |- + << title >> - Scenario: SSP<> - + <%- if sex == 'total' %> + All population + <%- else %> + Sex: <>s + <%- endif %> + title_edu: |- + << title >> - Scenario: SSP<> - + <%- if education == 'total' %> + All population + <%- elif education == 'no_education' %> + Education: None + <%- else %> + Education: {definitions.others.education} + <%- endif %> + title_sex_age: |- + << title >> - Scenario: SSP<> - + <%- if (sex == 'total') and (age == 'total') %> + All population + <% else %> + <%- if (sex == 'total') %> + Sex: All - + <% else %> + Sex: <>s - + <%- endif %> + <%- if (age == 'total') %> + Age: All + <% else %> + Age: <> + <%- endif %> + <%- endif %> + title_age_edu: |- + << title >> - Scenario: SSP<> - + <%- if (age == 'total') and (education == 'total') %> + All population + <% else %> + <%- if (age == 'total') %> + Age: All - + <% else %> + Age: <> - + <%- endif %> + <%- if (education == 'total') %> + Education: All + <% elif (education == "no_education") %> + Education: None + <% else %> + Education: {definitions.others.education} + <%- endif %> + <%- endif %> + title_sex_age_edu: |- + << title >> - Scenario: SSP<> - + <%- if (age == 'total') and (sex == 'total') and (education == 'total') %> + All population + <% else %> + <%- if (sex == 'total') %> + Sex: All - + <% else %> + Sex: <>s - + <%- endif %> + <%- if (age == 'total') %> + Age: All - + <% else %> + Age: <> - + <%- endif %> + <%- if (education == 'total') %> + Education: All + <% elif (education == "no_education") %> + Education: None + <% else %> + Education: {definitions.others.education} + <%- endif %> + <%- endif %> + projections: |- + Projections from 2025 onwards are based on the << scenario >> scenario + dim_ssp: |- + <% if scenario == "1" %> + **Population Component of Rapid Development (SSP1)**: This scenario assumes a future that is moving toward a more sustainable path, with educational and health investments accelerating the demographic transition, leading to a relatively low world population. The emphasis is on strengthening human wellbeing. This is associated with high education, low mortality and low fertility. Migration levels are assumed to be medium for all countries under this SSP. + <%- elif scenario == "2" %> + **Population Component of Medium (SSP2)**: This is the middle of the road scenario that can also be seen as the most likely path for each country. It combines for all countries medium fertility with medium mortality, medium migration, and the Global Education Trend (GET) education scenario. + <%- elif scenario == "3" %> + **Population Component of Stalled Development (SSP3)**: This scenario portrays a world separated into regions characterized by extreme poverty, pockets of moderate wealth, and many countries struggling to maintain living standards for rapidly growing populations. This is associated with low education, high mortality and high fertility. Due to the emphasis on security and barriers to international exchange, migration is assumed to be low for all countries. + <%- elif scenario == "4" %> + **Population Component of Inequality (SSP4)**: This scenario assumes increasing inequalities and stratification both across and within countries. It assumes high fertility and mortality scenarios in high-fertility countries and low fertility and medium mortality scenarios in low-fertility countries combined with medium migration scenario. In terms of education the SSP3 education transitions (CER) are decreased by 10% for levels up to lower secondary education, keeping the SSP2 (GET) education transitions for upper and post-secondary education. + <%- elif scenario == "5" %> + **Population Component of Conventional Development (SSP5)**: This scenario is similar to SSP1 for the fertility, mortality and education assumptions except that it combines them with high migration scenario in a context of widespread globalization. + <%- endif %> + dim_edu: |- + <% if education == "total" %> + Over all education categories. + <% elif education == "under_15" %> + Population below 15 years old. + <% elif education == "no_education" %> + Highest level of education attained: No level and Grade 1 of ISCED 1 not completed. + <% elif education == "incomplete_primary" %> + Highest level of education attained: Incomplete ISCED 1. + <% elif education == "primary" %> + Highest level of education attained: Completed ISCED 1 and incomplete ISCED 2. + <% elif education == "lower_secondary" %> + Highest level of education attained: Completed ISCED 2 and incomplete ISCED 3. + <% elif education == "upper_secondary" %> + Highest level of education attained: Completed ISCED 3 and incomplete ISCED 4 5 or 6. + <% elif education == "post_secondary" %> + Highest level of education attained: Completed ISCED 4 5 6 7 or 8. + <% endif %> + dim_edu_all: |- + Under-15: Population below 15 years old. + No education: Highest level of education attained: No level and Grade 1 of ISCED 1 not completed. + Incomplete primary: Highest level of education attained: Incomplete ISCED 1. + Primary: Highest level of education attained: Completed ISCED 1 and incomplete ISCED 2. + Lower secondary: Highest level of education attained: Completed ISCED 2 and incomplete ISCED 3. + Upper secondary: Highest level of education attained: Completed ISCED 3 and incomplete ISCED 4 5 or 6. + Post secondary: Highest level of education attained: Completed ISCED 4 5 6 7 or 8. +# Learn more about the available fields: +# http://docs.owid.io/projects/etl/architecture/metadata/reference/ +dataset: + update_period_days: 730 + title: Wittgenstein Centre, Human Capital (Historical data) + +tables: + main: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + # Population + growth: + title: |- + <% set title = "Average Annual Growth Rate" %> + {definitions.others.title} + unit: "%" + short_unit: "%" + description_short: |- + Rate of growth of the population over the period of one year. {definitions.others.projections}. + presentation: + topic_tags: + - Population Growth + nirate: + title: |- + <% set title = "Average Annual Rate of Natural Increase" %> + {definitions.others.title} + unit: "per 1,000 people" + description_short: |- + Represents the portion of population growth (or decline) determined exclusively by births and deaths. {definitions.others.projections}. + display: + numDecimalPlaces: 1 + presentation: + topic_tags: + - Population Growth + + # Years + ggapmys15: + title: |- + <% set title = "Gender Gap in Mean Years Schooling (15+)" %> + {definitions.others.title} + unit: years + description_short: |- + The difference between female and male mean years of schooling for the population over 15 years of age. {definitions.others.projections}. Negative values indicate that women spent fewer years in school. + display: + numDecimalPlaces: 0 + presentation: + topic_tags: + - Global Education + ggapmys25: + title: |- + <% set title = "Gender Gap in Mean Years Schooling (25+)" %> + {definitions.others.title} + unit: years + description_short: |- + The difference between female and male mean years of schooling for population over 25 years of age. {definitions.others.projections}. Negative values indicate that women spent fewer years in school. + display: + numDecimalPlaces: 0 + presentation: + topic_tags: + - Global Education + mage: + title: |- + <% set title = "Population Median Age" %> + {definitions.others.title} + unit: years + description_short: |- + Age that divides the population in two parts of equal size, that is, there are as many persons with ages above the median as there are with ages below the median. {definitions.others.projections}. + presentation: + topic_tags: + - Population Growth + + # Rates (Births, Deaths) + cbr: + title: |- + <% set title = "Crude Birth Rate" %> + {definitions.others.title} + unit: births per 1,000 people + description_short: |- + Number of live births recorded over the last 5-year period, divided by population-years. It is based on the civil calendar year, spanning from January 1 to December 31. {definitions.others.projections}. + presentation: + topic_tags: + - Fertility Rate + - Population Growth + + cdr: + title: |- + <% set title = "Crude Death Rate" %> + {definitions.others.title} + unit: deaths per 1,000 people + description_short: |- + Number of deaths recorded in the last 5-year period, divided by population-years. It is based on the civil calendar year, spanning from January 1 to December 31. {definitions.others.projections}. + presentation: + topic_tags: + - Population Growth + - Life Expectancy + + # Ratios + tdr: + title: |- + <% set title = "Total Dependency Ratio" %> + {definitions.others.title} + unit: "%" + description_short: |- + The ratio of the youth (0-14) and elderly (65+) population over the working age (15-64) population. {definitions.others.projections}. + description_processing: |- + The source gives the values as the number of young and elderly persons per person of working age. We have scaled the figures to have percentages instead. + presentation: + topic_tags: + - Age Structure + ydr: + title: |- + <% set title = "Youth Dependency Ratio" %> + {definitions.others.title} + unit: "%" + description_short: |- + The ratio of the youth (0-14) population over the working age (15-64) population. {definitions.others.projections}. + description_processing: |- + The source gives the values as the number of young persons per person of working age. We have scaled the figures to have percentages instead. + presentation: + topic_tags: + - Age Structure + + odr: + title: |- + <% set title = "Old-age Dependency Ratio" %> + {definitions.others.title} + unit: "%" + description_short: |- + The ratio of the elderly (65+) population over the working age (15-64) population. {definitions.others.projections}. + description_processing: |- + The source gives the values as the number of elderly persons per person of working age. We have scaled the figures to have percentages instead. + presentation: + topic_tags: + - Age Structure + + by_age: + variables: + sexratio: + title: |- + <% set title = "Sex ratio" %> + {definitions.others.title_age} + unit: "males per 100 females" + description_short: |- + <% if age == "total" %> + The number of male population per 100 female population. {definitions.others.projections}. + <%- else %> + The number of male population per 100 female population (aged << age >>). {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Gender Ratio + + by_sex: + variables: + e0: + title: |- + <% set title = "Life expectancy" %> + {definitions.others.title_sex} + unit: "years" + description_short: |- + <% if sex == "total" %> + The number of years a newborn is expected to live. {definitions.others.projections}. + <%- else %> + The number of years a << sex >> newborn is expected to live. {definitions.others.projections}. + <% endif %> + presentation: + topic_tags: + - Life Expectancy + ryl15: + title: |- + <% set title = "Age when remaining Life Expectancy is below 15 years" %> + {definitions.others.title_sex} + unit: "years" + description_short: |- + <% if sex == "total" %> + The age of a person in a population when remaining life expectancy is 15 years. {definitions.others.projections}. + <%- else %> + The age of a << sex >> person in a population when remaining life expectancy is 15 years. {definitions.others.projections}. + <%- endif %> + description_processing: |- + Source: [Lutz et al. 2008](https://previous.iiasa.ac.at/web/home/research/researchPrograms/WorldPopulation/PublicationsMediaCoverage/POPNETNewsletter/popnet39.pdf#page=4) + presentation: + topic_tags: + - Life Expectancy + pryl15: + title: |- + <% set title = "Proportion of population with a remaining Life Expectancy below 15 Years" %> + {definitions.others.title_sex} + unit: "%" + short_unit: "%" + description_short: |- + <% if sex == "total" %> + Proportion of the population with a remaining life expectancy below 15 years in the total population. {definitions.others.projections}. + <%- else %> + Proportion of the << sex >> population with a remaining life expectancy below 15 years in the total population. {definitions.others.projections}. + <%- endif %> + description_processing: |- + Source: [Sanderson and Scherbov 2010](https://dataexplorer.wittgensteincentre.org/wcde-v3/www.iiasa.ac.at/web/home/research/researchPrograms/WorldPopulation/PublicationsMediaCoverage/POPNETNewsletter/popnet42.pdf#page=6) + presentation: + topic_tags: + - Life Expectancy + + by_edu: + variables: + ggapedu15: + title: |- + <% set title = "Gender gap in Educational Attainment (15+)" %> + {definitions.others.title_edu} + unit: "%" + short_unit: "%" + description_short: |- + The difference between the proportion of females and the proportion of males in the population over 15 years of age achieving education level "{definitions.others.education}". {definitions.others.projections}. + presentation: + topic_tags: + - Global Education + ggapedu25: + title: |- + <% set title = "Gender gap in Educational Attainment (25+)" %> + {definitions.others.title_edu} + unit: "%" + short_unit: "%" + description_short: |- + The difference between the proportion of females and the proportion of males in the population over 25 years of age achieving education level "{definitions.others.education}". {definitions.others.projections}. + presentation: + topic_tags: + - Global Education + + tfr: + title: |- + <% set title = "Total Fertility Rate" %> + {definitions.others.title_edu} + unit: "births per woman in last 5 years" + description_short: |- + <% if education == "total" %> + The average number of children born in the last 5-year period to the women of reproductive age (15-49). + <%- else %> + The average number of children born in the last 5-year period to the women of reproductive age (15-49). Data for people with education level "{definitions.others.education}". {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Fertility Rate + + by_sex_age: + variables: + mys: + title: |- + <% set title = "Mean years of schooling" %> + {definitions.others.title_sex_age} + unit: years + description_short: |- + <%- if (age == "total") and (sex == "total") %> + Mean number of years spent in school. {definitions.others.projections}. + <%- elif (age != "total") and (sex == "total") %> + Mean number of years spent in school (aged <>). {definitions.others.projections}. + <%- elif (age == "total") and (sex != "total") %> + Mean number of years spent in school (<>s). {definitions.others.projections}. + <%- else %> + Mean number of years spent in school (aged <>, <>s). {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Global Education + + net: + title: |- + <% set title = "Net migration" %> + {definitions.others.title_sex_age} + unit: "people" + description_short: |- + <%- if (age == "total") and (sex == "total") %> + The number of immigrants minus the number of emigrants over the last five-year period. {definitions.others.projections}. + <%- elif (age != "total") and (sex == "total") %> + The number of immigrants minus the number of emigrants over the last five-year period. Only migrants aged <> are considered. {definitions.others.projections}. + <%- elif (age == "total") and (sex != "total") %> + The number of immigrants minus the number of emigrants over the last five-year period. Only <> migrants are considered. {definitions.others.projections}. + <%- else %> + The number of immigrants minus the number of emigrants over the last five-year period. Only <> migrants aged <> are considered. {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Migration + + by_age_edu: + variables: + asfr: + title: |- + <% set title = "Age-Specific Fertility Rate" %> + {definitions.others.title_age_edu} + unit: births per 1,000 women + description_short: |- + <%- if (education == "total") %> + Number of births occurring to women aged <> in the last five years, divided by the number of women in the age group. {definitions.others.projections}. + <%- elif (education == "no_education") %> + Number of births occurring to women aged <> and no education in the last five years, divided by the number of women in that same group. {definitions.others.projections}. + <%- else %> + Number of births occurring to women aged <> and {definitions.others.education}-level education in the last five years, divided by the number of women in that age group. {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Global Education + - Fertility Rate + + by_sex_age_edu: + variables: + assr: + title: |- + <% set title = "Age-Specific Survival Ratio" %> + {definitions.others.title_sex_age_edu} + unit: "%" + description_short: |- + <%- if (education == "total") %> + <%- if (age == "newborn") %> + The percentage of the <> newborn who are alive after the last five-year period. {definitions.others.projections}. + <%- else %> + The percentage of the <> population aged <> who are alive after the last five-year period. {definitions.others.projections}. + <%- endif %> + <%- elif (education == "no_education") %> + The percentage of the <> population aged <> with no education who are alive after the last five-year period. {definitions.others.projections}. + <%- else %> + The percentage of the <> population aged <> with <> education who are alive after the last five-year period. {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Life Expectancy + + pop: + title: |- + <% set title = "Population" %> + {definitions.others.title_sex_age_edu} + unit: "people" + description_short: |- + De facto population + <%- if (sex != "total") %> + of <>s + <%- endif %> + <%- if (age != "total") %> + aged <> + <%- endif %> + <%- if (education != "total") %> + with <%- if (education == "no_education") %>no education<%- else %><> education<%- endif %> + <%- endif %> + in a country or region. + presentation: + topic_tags: + - Population Growth + + prop: + title: |- + <% set title = "Educational Attainment Distribution" %> + {definitions.others.title_sex_age_edu} + unit: "%" + description_short: |- + De facto share of population + <%- if (sex != "total") %> + of <>s + <%- endif %> + <%- if (age != "total") %> + aged <> + <%- endif %> + <%- if (education != "total") %> + with <%- if (education == "no_education") %>no education<%- if (education == "some_education") %>some formal education<%- else %><> education<%- endif %> + <%- endif %> + in a country or region. + description_processing: |- + We have estimated this indicator with the population values from this source. + presentation: + topic_tags: + - Global Education diff --git a/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.py b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.py new file mode 100644 index 00000000000..98b06d87181 --- /dev/null +++ b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_historical.py @@ -0,0 +1,133 @@ +"""Load a meadow dataset and create a garden dataset.""" + +from etl.helpers import PathFinder, create_dataset + +from .shared import add_dim_some_education, add_prop, make_table + +# Get paths and naming conventions for current step. +paths = PathFinder(__file__) + + +def run(dest_dir: str) -> None: + # + # Load inputs. + # + # Load meadow dataset. + ds_meadow = paths.load_dataset("wittgenstein_human_capital_historical") + + # Read table from meadow dataset. + paths.log.info("reading tables...") + tb = ds_meadow.read("main").reset_index(drop=True) + tb_age = ds_meadow.read("by_age").reset_index(drop=True) + tb_sex = ds_meadow.read("by_sex").reset_index(drop=True) + tb_edu = ds_meadow.read("by_edu").reset_index( + drop=True + ) # TODO: add metadata field for table explaining the different education levels + tb_sex_age = ds_meadow.read("by_sex_age").reset_index(drop=True) + tb_age_edu = ds_meadow.read("by_age_edu").reset_index(drop=True) + tb_sex_age_edu = ds_meadow.read("by_sex_age_edu").reset_index(drop=True) + + # + # Process data. + # + + # 1/ MAKE MAIN TABLE + paths.log.info("baking main table...") + tb = make_table( + tb, + country_mapping_path=paths.country_mapping_path, + cols_single=["ggapmys25", "ggapmys15", "mage", "odr", "ydr", "tdr"], + cols_range=["nirate", "cbr", "cdr", "macb", "growth"], + per_100=["tdr", "odr", "ydr"], + ) + + # 2.1/ MAKE BY AGE TABLE (sexratio) + paths.log.info("baking tables by age...") + tb_age = make_table( + tb_age, + country_mapping_path=paths.country_mapping_path, + all_single=True, + per_100=["sexratio"], + ) + + # 2.2/ BY SEX + paths.log.info("baking tables by sex...") + tb_sex = make_table( + tb_sex, + country_mapping_path=paths.country_mapping_path, + all_range=True, + ) + + # 2.3/ BY EDU + paths.log.info("baking tables by education...") + tb_edu = make_table( + tb_edu, + country_mapping_path=paths.country_mapping_path, + cols_single=["ggapedu15", "ggapedu25"], + cols_range=["tfr"], + ) + + # 3.1/ BY SEX+AGE + paths.log.info("baking tables by sex+age...") + tb_sex_age = make_table( + tb_sex_age, + country_mapping_path=paths.country_mapping_path, + cols_single=["mys"], + cols_range=["net"], + per_100=["net"], + ) + + # 3.2/ BY AGE+EDU + paths.log.info("baking tables by age+education...") + assert "total" not in set(tb_age_edu["age"].unique()), "Unexpected age category: 'total'" + tb_age_edu = make_table( + tb_age_edu, + country_mapping_path=paths.country_mapping_path, + all_range=True, + ) + + # 4.1/ BY SEX+AGE+EDU + paths.log.info("baking tables by sex+age+education...") + tb_sex_age_edu = make_table( + tb_sex_age_edu, + country_mapping_path=paths.country_mapping_path, + dtypes={ + "sex": "category", + "age": "category", + "education": "category", + }, + cols_single=["pop"], + cols_range=["assr"], + per_1000=["pop"], + per_100=["assr"], + ) + + # Add education="some_education" (only for sex=total and age=total, and indicator 'pop') + tb_sex_age_edu = add_dim_some_education(tb_sex_age_edu) + + # Add population share + tb_sex_age_edu = add_prop(tb_sex_age_edu) + + # + # Save outputs. + # + # Format + tables = [ + tb.format(["country", "year", "scenario"], short_name="main"), + tb_age.format(["country", "scenario", "age", "year"], short_name="by_age"), + tb_sex.format(["country", "scenario", "sex", "year"], short_name="by_sex"), + tb_edu.format(["country", "scenario", "education", "year"], short_name="by_edu"), + tb_sex_age.format(["country", "scenario", "sex", "age", "year"], short_name="by_sex_age"), + tb_age_edu.format(["country", "scenario", "age", "education", "year"], short_name="by_age_edu"), + tb_sex_age_edu.format(["country", "scenario", "sex", "age", "education", "year"], short_name="by_sex_age_edu"), + ] + # Create a new garden dataset with the same metadata as the meadow dataset. + ds_garden = create_dataset( + dest_dir, + tables=tables, + check_variables_metadata=True, + default_metadata=ds_meadow.metadata, + ) + + # Save changes in the new garden dataset. + ds_garden.save() diff --git a/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.countries.json b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.countries.json new file mode 100644 index 00000000000..3b8bc22b510 --- /dev/null +++ b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.countries.json @@ -0,0 +1,231 @@ +{ + "Afghanistan": "Afghanistan", + "Albania": "Albania", + "Algeria": "Algeria", + "Angola": "Angola", + "Antigua and Barbuda": "Antigua and Barbuda", + "Argentina": "Argentina", + "Armenia": "Armenia", + "Aruba": "Aruba", + "Australia": "Australia", + "Austria": "Austria", + "Azerbaijan": "Azerbaijan", + "Bahamas": "Bahamas", + "Bahrain": "Bahrain", + "Bangladesh": "Bangladesh", + "Barbados": "Barbados", + "Belarus": "Belarus", + "Belgium": "Belgium", + "Belize": "Belize", + "Benin": "Benin", + "Bhutan": "Bhutan", + "Bolivia (Plurinational State of)": "Bolivia", + "Bosnia and Herzegovina": "Bosnia and Herzegovina", + "Botswana": "Botswana", + "Brazil": "Brazil", + "Brunei Darussalam": "Brunei", + "Bulgaria": "Bulgaria", + "Burkina Faso": "Burkina Faso", + "Burundi": "Burundi", + "Cambodia": "Cambodia", + "Cameroon": "Cameroon", + "Canada": "Canada", + "Cape Verde": "Cape Verde", + "Central African Republic": "Central African Republic", + "Chad": "Chad", + "Chile": "Chile", + "China": "China", + "Colombia": "Colombia", + "Comoros": "Comoros", + "Congo": "Congo", + "Costa Rica": "Costa Rica", + "Cote d'Ivoire": "Cote d'Ivoire", + "Croatia": "Croatia", + "Cuba": "Cuba", + "Cura\u00e7ao": "Curacao", + "Cyprus": "Cyprus", + "Czech Republic": "Czechia", + "Democratic People's Republic of Korea": "North Korea", + "Democratic Republic of the Congo": "Democratic Republic of Congo", + "Denmark": "Denmark", + "Djibouti": "Djibouti", + "Dominican Republic": "Dominican Republic", + "Ecuador": "Ecuador", + "Egypt": "Egypt", + "El Salvador": "El Salvador", + "Equatorial Guinea": "Equatorial Guinea", + "Eritrea": "Eritrea", + "Estonia": "Estonia", + "Ethiopia": "Ethiopia", + "Fiji": "Fiji", + "Finland": "Finland", + "France": "France", + "French Guiana": "French Guiana", + "French Polynesia": "French Polynesia", + "Gabon": "Gabon", + "Gambia": "Gambia", + "Georgia": "Georgia", + "Germany": "Germany", + "Ghana": "Ghana", + "Greece": "Greece", + "Grenada": "Grenada", + "Guadeloupe": "Guadeloupe", + "Guam": "Guam", + "Guatemala": "Guatemala", + "Guinea": "Guinea", + "Guinea-Bissau": "Guinea-Bissau", + "Guyana": "Guyana", + "Haiti": "Haiti", + "Honduras": "Honduras", + "Hungary": "Hungary", + "Iceland": "Iceland", + "India": "India", + "Indonesia": "Indonesia", + "Iran (Islamic Republic of)": "Iran", + "Iraq": "Iraq", + "Ireland": "Ireland", + "Israel": "Israel", + "Italy": "Italy", + "Jamaica": "Jamaica", + "Japan": "Japan", + "Jordan": "Jordan", + "Kazakhstan": "Kazakhstan", + "Kenya": "Kenya", + "Kiribati": "Kiribati", + "Kuwait": "Kuwait", + "Kyrgyzstan": "Kyrgyzstan", + "Lao People's Democratic Republic": "Laos", + "Latvia": "Latvia", + "Lebanon": "Lebanon", + "Lesotho": "Lesotho", + "Liberia": "Liberia", + "Lithuania": "Lithuania", + "Luxembourg": "Luxembourg", + "Madagascar": "Madagascar", + "Malawi": "Malawi", + "Malaysia": "Malaysia", + "Maldives": "Maldives", + "Mali": "Mali", + "Malta": "Malta", + "Martinique": "Martinique", + "Mauritania": "Mauritania", + "Mauritius": "Mauritius", + "Mayotte": "Mayotte", + "Mexico": "Mexico", + "Micronesia": "Micronesia (UNSD)", + "Micronesia (Federated States of)": "Micronesia (country)", + "Mongolia": "Mongolia", + "Montenegro": "Montenegro", + "Morocco": "Morocco", + "Mozambique": "Mozambique", + "Myanmar": "Myanmar", + "Namibia": "Namibia", + "Nepal": "Nepal", + "Netherlands": "Netherlands", + "New Caledonia": "New Caledonia", + "New Zealand": "New Zealand", + "Nicaragua": "Nicaragua", + "Niger": "Niger", + "Nigeria": "Nigeria", + "Norway": "Norway", + "Occupied Palestinian Territory": "Palestine", + "Oman": "Oman", + "Pakistan": "Pakistan", + "Panama": "Panama", + "Papua New Guinea": "Papua New Guinea", + "Paraguay": "Paraguay", + "Peru": "Peru", + "Philippines": "Philippines", + "Poland": "Poland", + "Portugal": "Portugal", + "Puerto Rico": "Puerto Rico", + "Qatar": "Qatar", + "Republic of Korea": "South Korea", + "Republic of Moldova": "Moldova", + "Reunion": "Reunion", + "Romania": "Romania", + "Russian Federation": "Russia", + "Rwanda": "Rwanda", + "Saint Lucia": "Saint Lucia", + "Saint Vincent and the Grenadines": "Saint Vincent and the Grenadines", + "Samoa": "Samoa", + "Sao Tome and Principe": "Sao Tome and Principe", + "Saudi Arabia": "Saudi Arabia", + "Senegal": "Senegal", + "Serbia": "Serbia", + "Seychelles": "Seychelles", + "Sierra Leone": "Sierra Leone", + "Singapore": "Singapore", + "Slovakia": "Slovakia", + "Slovenia": "Slovenia", + "Solomon Islands": "Solomon Islands", + "Somalia": "Somalia", + "South Africa": "South Africa", + "South Sudan": "South Sudan", + "Spain": "Spain", + "Sri Lanka": "Sri Lanka", + "Sudan": "Sudan", + "Suriname": "Suriname", + "Swaziland": "Eswatini", + "Sweden": "Sweden", + "Switzerland": "Switzerland", + "Syrian Arab Republic": "Syria", + "Tajikistan": "Tajikistan", + "Thailand": "Thailand", + "Timor-Leste": "East Timor", + "Togo": "Togo", + "Tonga": "Tonga", + "Trinidad and Tobago": "Trinidad and Tobago", + "Tunisia": "Tunisia", + "Turkey": "Turkey", + "Turkmenistan": "Turkmenistan", + "Uganda": "Uganda", + "Ukraine": "Ukraine", + "United Arab Emirates": "United Arab Emirates", + "United Kingdom of Great Britain and Northern Ireland": "United Kingdom", + "United Republic of Tanzania": "Tanzania", + "United States Virgin Islands": "United States Virgin Islands", + "United States of America": "United States", + "Uruguay": "Uruguay", + "Uzbekistan": "Uzbekistan", + "Vanuatu": "Vanuatu", + "Venezuela (Bolivarian Republic of)": "Venezuela", + "Viet Nam": "Vietnam", + "Western Sahara": "Western Sahara", + "World": "World", + "Yemen": "Yemen", + "Zambia": "Zambia", + "Zimbabwe": "Zimbabwe", + "Africa": "Africa (UNSD)", + "Asia": "Asia (UNSD)", + "Australia and New Zealand": "Australia and New Zealand (UNSD)", + "Caribbean": "Caribbean (UNSD)", + "Central America": "Central America (UNSD)", + "Central Asia": "Central Asia (UNSD)", + "Eastern Africa": "Eastern Africa (UNSD)", + "Eastern Asia": "Eastern Asia (UNSD)", + "Eastern Europe": "Eastern Europe (UNSD)", + "Europe": "Europe (UNSD)", + "Hong Kong Special Administrative Region of China": "Hong Kong", + "Latin America and the Caribbean": "Latin America and the Caribbean (UNSD)", + "Libyan Arab Jamahiriya": "Libya", + "Macao Special Administrative Region of China": "Macao", + "Melanesia": "Melanesia (UNSD)", + "Middle Africa": "Middle Africa (UNSD)", + "Northern Africa": "Northern Africa (UNSD)", + "Northern America": "Northern America (UNSD)", + "Northern Europe": "Northern Europe (UNSD)", + "Oceania": "Oceania (UNSD)", + "Polynesia": "Polynesia (UNSD)", + "South America": "South America (UNSD)", + "South-Eastern Asia": "South-eastern Asia (UNSD)", + "Southern Africa": "Southern Africa (UNSD)", + "Southern Asia": "Southern Asia (UNSD)", + "Southern Europe": "Southern Europe (UNSD)", + "Taiwan Province of China": "Taiwan", + "The former Yugoslav Republic of Macedonia": "North Macedonia", + "Western Africa": "Western Africa (UNSD)", + "Western Asia": "Western Asia (UNSD)", + "Western Europe": "Western Europe (UNSD)", + "Channel Islands": "Channel Islands" +} diff --git a/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.meta.yml b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.meta.yml new file mode 100644 index 00000000000..02a41a28d00 --- /dev/null +++ b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.meta.yml @@ -0,0 +1,565 @@ +# NOTE: To learn more about the fields, hover over their names. +definitions: + common: + display: + numDecimalPlaces: 2 + others: + education: |- + <> + title: |- + << title >> - Scenario: SSP<> + title_age: |- + << title >> - Scenario: SSP<> - + <%- if age == 'total' %> + All population + <%- else %> + Age: <> + <%- endif %> + title_sex: |- + << title >> - Scenario: SSP<> - + <%- if sex == 'total' %> + All population + <%- else %> + Sex: <>s + <%- endif %> + title_edu: |- + << title >> - Scenario: SSP<> - + <%- if education == 'total' %> + All population + <%- elif education == 'no_education' %> + Education: None + <%- else %> + Education: {definitions.others.education} + <%- endif %> + title_sex_age: |- + << title >> - Scenario: SSP<> - + <%- if (sex == 'total') and (age == 'total') %> + All population + <% else %> + <%- if (sex == 'total') %> + Sex: All - + <% else %> + Sex: <>s - + <%- endif %> + <%- if (age == 'total') %> + Age: All + <% else %> + Age: <> + <%- endif %> + <%- endif %> + title_age_edu: |- + << title >> - Scenario: SSP<> - + <%- if (age == 'total') and (education == 'total') %> + All population + <% else %> + <%- if (age == 'total') %> + Age: All - + <% else %> + Age: <> - + <%- endif %> + <%- if (education == 'total') %> + Education: All + <% elif (education == "no_education") %> + Education: None + <% else %> + Education: {definitions.others.education} + <%- endif %> + <%- endif %> + title_sex_age_edu: |- + << title >> - Scenario: SSP<> - + <%- if (age == 'total') and (sex == 'total') and (education == 'total') %> + All population + <% else %> + <%- if (sex == 'total') %> + Sex: All - + <% else %> + Sex: <>s - + <%- endif %> + <%- if (age == 'total') %> + Age: All - + <% else %> + Age: <> - + <%- endif %> + <%- if (education == 'total') %> + Education: All + <% elif (education == "no_education") %> + Education: None + <% else %> + Education: {definitions.others.education} + <%- endif %> + <%- endif %> + projections: |- + Projections from 2025 onwards are based on the << scenario >> scenario + dim_ssp: |- + <% if scenario == "1" %> + **Population Component of Rapid Development (SSP1)**: This scenario assumes a future that is moving toward a more sustainable path, with educational and health investments accelerating the demographic transition, leading to a relatively low world population. The emphasis is on strengthening human wellbeing. This is associated with high education, low mortality and low fertility. Migration levels are assumed to be medium for all countries under this SSP. + <%- elif scenario == "2" %> + **Population Component of Medium (SSP2)**: This is the middle of the road scenario that can also be seen as the most likely path for each country. It combines for all countries medium fertility with medium mortality, medium migration, and the Global Education Trend (GET) education scenario. + <%- elif scenario == "3" %> + **Population Component of Stalled Development (SSP3)**: This scenario portrays a world separated into regions characterized by extreme poverty, pockets of moderate wealth, and many countries struggling to maintain living standards for rapidly growing populations. This is associated with low education, high mortality and high fertility. Due to the emphasis on security and barriers to international exchange, migration is assumed to be low for all countries. + <%- elif scenario == "4" %> + **Population Component of Inequality (SSP4)**: This scenario assumes increasing inequalities and stratification both across and within countries. It assumes high fertility and mortality scenarios in high-fertility countries and low fertility and medium mortality scenarios in low-fertility countries combined with medium migration scenario. In terms of education the SSP3 education transitions (CER) are decreased by 10% for levels up to lower secondary education, keeping the SSP2 (GET) education transitions for upper and post-secondary education. + <%- elif scenario == "5" %> + **Population Component of Conventional Development (SSP5)**: This scenario is similar to SSP1 for the fertility, mortality and education assumptions except that it combines them with high migration scenario in a context of widespread globalization. + <%- endif %> + dim_edu: |- + <% if education == "total" %> + Over all education categories. + <% elif education == "under_15" %> + Population below 15 years old. + <% elif education == "no_education" %> + Highest level of education attained: No level and Grade 1 of ISCED 1 not completed. + <% elif education == "incomplete_primary" %> + Highest level of education attained: Incomplete ISCED 1. + <% elif education == "primary" %> + Highest level of education attained: Completed ISCED 1 and incomplete ISCED 2. + <% elif education == "lower_secondary" %> + Highest level of education attained: Completed ISCED 2 and incomplete ISCED 3. + <% elif education == "upper_secondary" %> + Highest level of education attained: Completed ISCED 3 and incomplete ISCED 4 5 or 6. + <% elif education == "post_secondary" %> + Highest level of education attained: Completed ISCED 4 5 6 7 or 8. + <% endif %> + dim_edu_all: |- + Under-15: Population below 15 years old. + No education: Highest level of education attained: No level and Grade 1 of ISCED 1 not completed. + Incomplete primary: Highest level of education attained: Incomplete ISCED 1. + Primary: Highest level of education attained: Completed ISCED 1 and incomplete ISCED 2. + Lower secondary: Highest level of education attained: Completed ISCED 2 and incomplete ISCED 3. + Upper secondary: Highest level of education attained: Completed ISCED 3 and incomplete ISCED 4 5 or 6. + Post secondary: Highest level of education attained: Completed ISCED 4 5 6 7 or 8. +# Learn more about the available fields: +# http://docs.owid.io/projects/etl/architecture/metadata/reference/ +dataset: + update_period_days: 730 + title: Wittgenstein Centre, Human Capital (Projections) + +tables: + main: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + # Population + growth: + title: |- + <% set title = "Average Annual Growth Rate" %> + {definitions.others.title} + unit: "%" + short_unit: "%" + description_short: |- + Rate of growth of the population over the period of one year. {definitions.others.projections}. + presentation: + topic_tags: + - Population Growth + nirate: + title: |- + <% set title = "Average Annual Rate of Natural Increase" %> + {definitions.others.title} + unit: "per 1,000 people" + description_short: |- + Represents the portion of population growth (or decline) determined exclusively by births and deaths. {definitions.others.projections}. + display: + numDecimalPlaces: 1 + presentation: + topic_tags: + - Population Growth + + # Years + ggapmys15: + title: |- + <% set title = "Gender Gap in Mean Years Schooling (15+)" %> + {definitions.others.title} + unit: years + description_short: |- + The difference between female and male mean years of schooling for the population over 15 years of age. {definitions.others.projections}. Negative values indicate that women spent fewer years in school. + display: + numDecimalPlaces: 0 + presentation: + topic_tags: + - Global Education + ggapmys25: + title: |- + <% set title = "Gender Gap in Mean Years Schooling (25+)" %> + {definitions.others.title} + unit: years + description_short: |- + The difference between female and male mean years of schooling for population over 25 years of age. {definitions.others.projections}. Negative values indicate that women spent fewer years in school. + display: + numDecimalPlaces: 0 + presentation: + topic_tags: + - Global Education + mage: + title: |- + <% set title = "Population Median Age" %> + {definitions.others.title} + unit: years + description_short: |- + Age that divides the population in two parts of equal size, that is, there are as many persons with ages above the median as there are with ages below the median. {definitions.others.projections}. + presentation: + topic_tags: + - Population Growth + + # Rates (Births, Deaths) + cbr: + title: |- + <% set title = "Crude Birth Rate" %> + {definitions.others.title} + unit: births per 1,000 people + description_short: |- + Number of live births recorded over the last 5-year period, divided by population-years. It is based on the civil calendar year, spanning from January 1 to December 31. {definitions.others.projections}. + presentation: + topic_tags: + - Fertility Rate + - Population Growth + + cdr: + title: |- + <% set title = "Crude Death Rate" %> + {definitions.others.title} + unit: deaths per 1,000 people + description_short: |- + Number of deaths recorded in the last 5-year period, divided by population-years. It is based on the civil calendar year, spanning from January 1 to December 31. {definitions.others.projections}. + presentation: + topic_tags: + - Population Growth + - Life Expectancy + + # Ratios + tdr: + title: |- + <% set title = "Total Dependency Ratio" %> + {definitions.others.title} + unit: "%" + description_short: |- + The ratio of the youth (0-14) and elderly (65+) population over the working age (15-64) population. {definitions.others.projections}. + description_processing: |- + The source gives the values as the number of young and elderly persons per person of working age. We have scaled the figures to have percentages instead. + presentation: + topic_tags: + - Age Structure + ydr: + title: |- + <% set title = "Youth Dependency Ratio" %> + {definitions.others.title} + unit: "%" + description_short: |- + The ratio of the youth (0-14) population over the working age (15-64) population. {definitions.others.projections}. + description_processing: |- + The source gives the values as the number of young persons per person of working age. We have scaled the figures to have percentages instead. + presentation: + topic_tags: + - Age Structure + + odr: + title: |- + <% set title = "Old-age Dependency Ratio" %> + {definitions.others.title} + unit: "%" + description_short: |- + The ratio of the elderly (65+) population over the working age (15-64) population. {definitions.others.projections}. + description_processing: |- + The source gives the values as the number of elderly persons per person of working age. We have scaled the figures to have percentages instead. + presentation: + topic_tags: + - Age Structure + + # Migration + emi: + title: |- + <% set title = "Emigration Flows" %> + {definitions.others.title} + unit: "people in last 5 years" + description_short: |- + The number of emigrants over a five-year period. {definitions.others.projections}. + description_processing: |- + The source provides the values in thousands. We have scaled them to have the actual number of emigrants. + display: + numDecimalPlaces: 0 + presentation: + topic_tags: + - Migration + + imm: + title: |- + <% set title = "Immigration Flows" %> + {definitions.others.title} + unit: "people in last 5 years" + description_short: |- + The number of immigrants over a five-year period. {definitions.others.projections}. + description_processing: |- + The source provides the values in thousands. We have scaled them to have the actual number of immigrants. + display: + numDecimalPlaces: 0 + presentation: + topic_tags: + - Migration + + by_age: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + sexratio: + title: |- + <% set title = "Sex ratio" %> + {definitions.others.title_age} + unit: "males per 100 females" + description_short: |- + <% if age == "total" %> + The number of male population per 100 female population. {definitions.others.projections}. + <%- else %> + The number of male population per 100 female population (aged << age >>). {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Gender Ratio + + by_sex: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + e0: + title: |- + <% set title = "Life expectancy" %> + {definitions.others.title_sex} + unit: "years" + description_short: |- + <% if sex == "total" %> + The number of years a newborn is expected to live. {definitions.others.projections}. + <%- else %> + The number of years a << sex >> newborn is expected to live. {definitions.others.projections}. + <% endif %> + presentation: + topic_tags: + - Life Expectancy + ryl15: + title: |- + <% set title = "Age when remaining Life Expectancy is below 15 years" %> + {definitions.others.title_sex} + unit: "years" + description_short: |- + <% if sex == "total" %> + The age of a person in a population when remaining life expectancy is 15 years. {definitions.others.projections}. + <%- else %> + The age of a << sex >> person in a population when remaining life expectancy is 15 years. {definitions.others.projections}. + <%- endif %> + description_processing: |- + Source: [Lutz et al. 2008](https://previous.iiasa.ac.at/web/home/research/researchPrograms/WorldPopulation/PublicationsMediaCoverage/POPNETNewsletter/popnet39.pdf#page=4) + presentation: + topic_tags: + - Life Expectancy + pryl15: + title: |- + <% set title = "Proportion of population with a remaining Life Expectancy below 15 Years" %> + {definitions.others.title_sex} + unit: "%" + short_unit: "%" + description_short: |- + <% if sex == "total" %> + Proportion of the population with a remaining life expectancy below 15 years in the total population. {definitions.others.projections}. + <%- else %> + Proportion of the << sex >> population with a remaining life expectancy below 15 years in the total population. {definitions.others.projections}. + <%- endif %> + description_processing: |- + Source: [Sanderson and Scherbov 2010](https://dataexplorer.wittgensteincentre.org/wcde-v3/www.iiasa.ac.at/web/home/research/researchPrograms/WorldPopulation/PublicationsMediaCoverage/POPNETNewsletter/popnet42.pdf#page=6) + presentation: + topic_tags: + - Life Expectancy + + by_edu: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + ggapedu15: + title: |- + <% set title = "Gender gap in Educational Attainment (15+)" %> + {definitions.others.title_edu} + unit: "%" + short_unit: "%" + description_short: |- + The difference between the proportion of females and the proportion of males in the population over 15 years of age achieving education level "{definitions.others.education}". {definitions.others.projections}. + presentation: + topic_tags: + - Global Education + ggapedu25: + title: |- + <% set title = "Gender gap in Educational Attainment (25+)" %> + {definitions.others.title_edu} + unit: "%" + short_unit: "%" + description_short: |- + The difference between the proportion of females and the proportion of males in the population over 25 years of age achieving education level "{definitions.others.education}". {definitions.others.projections}. + presentation: + topic_tags: + - Global Education + macb: + title: |- + <% set title = "Mean age at childbearing" %> + {definitions.others.title_edu} + unit: "years" + short_unit: "years" + description_short: |- + <% if education == "total" %> + The mean age of mothers at the birth of their children observed in the last five-year period. {definitions.others.projections}. + <%- else %> + The mean age of mothers at the birth of their children observed in the last five-year period. Data for people with education level "{definitions.others.education}". {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Fertility Rate + tfr: + title: |- + <% set title = "Total Fertility Rate" %> + {definitions.others.title_edu} + unit: "births per woman in last 5 years" + description_short: |- + <% if education == "total" %> + The average number of children born in the last 5-year period to the women of reproductive age (15-49). + <%- else %> + The average number of children born in the last 5-year period to the women of reproductive age (15-49). Data for people with education level "{definitions.others.education}". {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Fertility Rate + net: + title: |- + <% set title = "Net migration" %> + {definitions.others.title_edu} + unit: "people" + description_short: |- + <% if education == "total" %> + The number of immigrants minus the number of emigrants over the last five-year period. {definitions.others.projections}. + <%- else %> + The number of immigrants minus the number of emigrants over the last five-year period. Data for migrants with education level "{definitions.others.education}". {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Migration + + by_sex_age: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + mys: + title: |- + <% set title = "Mean years of schooling" %> + {definitions.others.title_sex_age} + unit: years + description_short: |- + <%- if (age == "total") and (sex == "total") %> + Mean number of years spent in school. {definitions.others.projections}. + <%- elif (age != "total") and (sex == "total") %> + Mean number of years spent in school (aged <>). {definitions.others.projections}. + <%- elif (age == "total") and (sex != "total") %> + Mean number of years spent in school (<>s). {definitions.others.projections}. + <%- else %> + Mean number of years spent in school (aged <>, <>s). {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Global Education + + by_age_edu: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + asfr: + title: |- + <% set title = "Age-Specific Fertility Rate" %> + {definitions.others.title_age_edu} + unit: births per 1,000 women + description_short: |- + <%- if (education == "total") %> + Number of births occurring to women aged <> in the last five years, divided by the number of women in the age group. {definitions.others.projections}. + <%- elif (education == "no_education") %> + Number of births occurring to women aged <> and no education in the last five years, divided by the number of women in that same group. {definitions.others.projections}. + <%- else %> + Number of births occurring to women aged <> and {definitions.others.education}-level education in the last five years, divided by the number of women in that age group. {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Global Education + - Fertility Rate + + by_sex_age_edu: + common: + description_key: + - "{definitions.others.dim_ssp}" + + variables: + assr: + title: |- + <% set title = "Age-Specific Survival Ratio" %> + {definitions.others.title_sex_age_edu} + unit: "%" + description_short: |- + <%- if (education == "total") %> + <%- if (age == "newborn") %> + The percentage of the <> newborn who are alive after the last five-year period. {definitions.others.projections}. + <%- else %> + The percentage of the <> population aged <> who are alive after the last five-year period. {definitions.others.projections}. + <%- endif %> + <%- elif (education == "no_education") %> + The percentage of the <> population aged <> with no education who are alive after the last five-year period. {definitions.others.projections}. + <%- else %> + The percentage of the <> population aged <> with <> education who are alive after the last five-year period. {definitions.others.projections}. + <%- endif %> + presentation: + topic_tags: + - Life Expectancy + + pop: + title: |- + <% set title = "Population" %> + {definitions.others.title_sex_age_edu} + unit: "people" + description_short: |- + De facto population + <%- if (sex != "total") %> + of <>s + <%- endif %> + <%- if (age != "total") %> + aged <> + <%- endif %> + <%- if (education != "total") %> + with <%- if (education == "no_education") %>no education<%- else %><> education<%- endif %> + <%- endif %> + in a country or region. + presentation: + topic_tags: + - Population Growth + + prop: + title: |- + <% set title = "Educational Attainment Distribution" %> + {definitions.others.title_sex_age_edu} + unit: "%" + description_short: |- + De facto share of population + <%- if (sex != "total") %> + of <>s + <%- endif %> + <%- if (age != "total") %> + aged <> + <%- endif %> + <%- if (education != "total") %> + with <%- if (education == "no_education") %>no education<%- elif (education == "some_education") %>some formal education<%- else %><> education<%- endif %> + <%- endif %> + in a country or region. + description_processing: |- + We have estimated this indicator with the population values from this source. + presentation: + topic_tags: + - Global Education diff --git a/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.py b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.py new file mode 100644 index 00000000000..3fe57a84e89 --- /dev/null +++ b/etl/steps/data/garden/demography/2024-12-06/wittgenstein_human_capital_proj.py @@ -0,0 +1,133 @@ +"""Load a meadow dataset and create a garden dataset.""" + +from etl.helpers import PathFinder, create_dataset + +from .shared import add_dim_some_education, add_prop, make_table + +# Get paths and naming conventions for current step. +paths = PathFinder(__file__) + + +def run(dest_dir: str) -> None: + # + # Load inputs. + # + # Load meadow dataset. + ds_meadow = paths.load_dataset("wittgenstein_human_capital_proj") + + # Read table from meadow dataset. + paths.log.info("reading tables...") + tb = ds_meadow.read("main").reset_index(drop=True) + tb_age = ds_meadow.read("by_age").reset_index(drop=True) + tb_sex = ds_meadow.read("by_sex").reset_index(drop=True) + tb_edu = ds_meadow.read("by_edu").reset_index( + drop=True + ) # TODO: add metadata field for table explaining the different education levels + tb_sex_age = ds_meadow.read("by_sex_age").reset_index(drop=True) + tb_age_edu = ds_meadow.read("by_age_edu").reset_index(drop=True) + tb_sex_age_edu = ds_meadow.read("by_sex_age_edu").reset_index(drop=True) + + # + # Process data. + # + + # 1/ MAKE MAIN TABLE + paths.log.info("baking main table...") + tb = make_table( + tb, + country_mapping_path=paths.country_mapping_path, + cols_single=["tdr", "ggapmys25", "mage", "ydr", "ggapmys15", "odr"], + cols_range=["growth", "imm", "emi", "cbr", "nirate", "cdr"], + per_100=["tdr", "odr", "ydr"], + per_1000=["emi", "imm"], + ) + + # 2.1/ MAKE BY AGE TABLE (sexratio) + paths.log.info("baking tables by age...") + tb_age = make_table( + tb_age, + country_mapping_path=paths.country_mapping_path, + all_single=True, + per_100=["sexratio"], + ) + + # 2.2/ BY SEX + paths.log.info("baking tables by sex...") + tb_sex = make_table( + tb_sex, + country_mapping_path=paths.country_mapping_path, + all_range=True, + ) + + # 2.3/ BY EDU + paths.log.info("baking tables by education...") + tb_edu = make_table( + tb_edu, + country_mapping_path=paths.country_mapping_path, + cols_single=["ggapedu15", "ggapedu25"], + cols_range=["macb", "tfr", "net"], + per_1000=["net"], + ) + + # 3.1/ BY SEX+AGE + paths.log.info("baking tables by sex+age...") + tb_sex_age = make_table( + tb_sex_age, + country_mapping_path=paths.country_mapping_path, + all_single=True, + ) + + # 3.2/ BY AGE+EDU + paths.log.info("baking tables by age+education...") + assert "total" not in set(tb_age_edu["age"].unique()), "Unexpected age category: 'total'" + tb_age_edu = make_table( + tb_age_edu, + country_mapping_path=paths.country_mapping_path, + all_range=True, + ) + + # 4.1/ BY SEX+AGE+EDU + paths.log.info("baking tables by sex+age+education...") + tb_sex_age_edu = make_table( + tb_sex_age_edu, + country_mapping_path=paths.country_mapping_path, + dtypes={ + "sex": "category", + "age": "category", + "education": "category", + }, + cols_single=["pop"], + cols_range=["assr"], + per_1000=["pop"], + per_100=["assr"], + ) + + # Add education="some_education" (only for sex=total and age=total, and indicator 'pop') + tb_sex_age_edu = add_dim_some_education(tb_sex_age_edu) + + # Add population share + tb_sex_age_edu = add_prop(tb_sex_age_edu) + + # + # Save outputs. + # + # Format + tables = [ + tb.format(["country", "year", "scenario"], short_name="main"), + tb_age.format(["country", "scenario", "age", "year"], short_name="by_age"), + tb_sex.format(["country", "scenario", "sex", "year"], short_name="by_sex"), + tb_edu.format(["country", "scenario", "education", "year"], short_name="by_edu"), + tb_sex_age.format(["country", "scenario", "sex", "age", "year"], short_name="by_sex_age"), + tb_age_edu.format(["country", "scenario", "age", "education", "year"], short_name="by_age_edu"), + tb_sex_age_edu.format(["country", "scenario", "sex", "age", "education", "year"], short_name="by_sex_age_edu"), + ] + # Create a new garden dataset with the same metadata as the meadow dataset. + ds_garden = create_dataset( + dest_dir, + tables=tables, + check_variables_metadata=True, + default_metadata=ds_meadow.metadata, + ) + + # Save changes in the new garden dataset. + ds_garden.save() diff --git a/etl/steps/data/grapher/demography/2024-12-06/wittgenstein_human_capital.py b/etl/steps/data/grapher/demography/2024-12-06/wittgenstein_human_capital.py new file mode 100644 index 00000000000..c739d9b9a63 --- /dev/null +++ b/etl/steps/data/grapher/demography/2024-12-06/wittgenstein_human_capital.py @@ -0,0 +1,48 @@ +"""Load a garden dataset and create a grapher dataset.""" + +from etl.helpers import PathFinder, create_dataset + +# Get paths and naming conventions for current step. +paths = PathFinder(__file__) + +AGE_ACCEPTED = [ + "total", + "15+", + "15-19", + "20-39", + "40-64", + "65+", +] + + +def run(dest_dir: str) -> None: + # + # Load inputs. + # + # Load garden dataset. + ds_garden = paths.load_dataset("wittgenstein_human_capital") + + # Read table from garden dataset. + tables = {t.m.short_name: t for t in list(ds_garden)} + + # Filter out some dimensions, to make the step faster + tb = tables["by_sex_age_edu"] + index_cols = tb.index.names + tb = tb.reset_index() + tb = tb.loc[(tb["sex"] == "total") & (tb["age"].isin(AGE_ACCEPTED))] + tables["by_sex_age_edu"] = tb.format(index_cols) + + # + # Save outputs. + # + tables = list(tables.values()) + # Create a new grapher dataset with the same metadata as the garden dataset. + ds_grapher = create_dataset( + dest_dir, + tables=tables, + check_variables_metadata=True, + default_metadata=ds_garden.metadata, + ) + + # Save changes in the new grapher dataset. + ds_grapher.save() diff --git a/etl/steps/data/grapher/demography/2024-12-06/wittgenstein_human_capital_proj.py b/etl/steps/data/grapher/demography/2024-12-06/wittgenstein_human_capital_proj.py new file mode 100644 index 00000000000..0210be8e5dc --- /dev/null +++ b/etl/steps/data/grapher/demography/2024-12-06/wittgenstein_human_capital_proj.py @@ -0,0 +1,48 @@ +"""Load a garden dataset and create a grapher dataset.""" + +from etl.helpers import PathFinder, create_dataset + +# Get paths and naming conventions for current step. +paths = PathFinder(__file__) + +AGE_ACCEPTED = [ + "total", + "15+", + "15-19", + "20-39", + "40-64", + "65+", +] + + +def run(dest_dir: str) -> None: + # + # Load inputs. + # + # Load garden dataset. + ds_garden = paths.load_dataset("wittgenstein_human_capital_proj") + + # Read table from garden dataset. + tables = {t.m.short_name: t for t in list(ds_garden)} + + # Filter out some dimensions, to make the step faster + tb = tables["by_sex_age_edu"] + index_cols = tb.index.names + tb = tb.reset_index() + tb = tb.loc[(tb["sex"] == "total") & (tb["age"].isin(AGE_ACCEPTED))] + tables["by_sex_age_edu"] = tb.format(index_cols) + + # + # Save outputs. + # + tables = list(tables.values()) + # Create a new grapher dataset with the same metadata as the garden dataset. + ds_grapher = create_dataset( + dest_dir, + tables=tables, + check_variables_metadata=True, + default_metadata=ds_garden.metadata, + ) + + # Save changes in the new grapher dataset. + ds_grapher.save() diff --git a/etl/steps/data/meadow/demography/2024-12-06/shared.py b/etl/steps/data/meadow/demography/2024-12-06/shared.py new file mode 100644 index 00000000000..4095a690582 --- /dev/null +++ b/etl/steps/data/meadow/demography/2024-12-06/shared.py @@ -0,0 +1,372 @@ +"""Load a snapshot and create a meadow dataset. + +This snapshot step is a bit more complex than usual. This is because the snapshot is a ZIP file that contains numerous RDS files. These RDS files can be merged and concatenated, so that we build a single table with all the data. + + +The output table has index columns: country, year, scenario, sex, age, education. + +When values are aggregates, dimensions are set to "total". +""" + +import os +from concurrent.futures import ThreadPoolExecutor, as_completed +from pathlib import Path + +import owid.catalog.processing as pr +import pyreadr +from owid.catalog import Table +from owid.catalog.tables import _add_table_and_variables_metadata_to_table + +from etl.helpers import PathFinder + +# Get paths and naming conventions for current step. +paths = PathFinder(__file__) + +# Renaming of relevant columns +COLUMNS_RENAME = { + "name": "country", + "period": "year", +} + +# Harmonization of the dimension values +REPLACE_AGE = { + "all": "total", +} +REPLACE_SEX = { + "both": "total", +} + + +def make_scenario_tables(tbs_scenario, tables_combine_edu, tables_concat, tables_drop, tables_composition): + """Create main table from all scenarios. + + Index: country, year, scenario, age, sex, education. + """ + # Obtain tables + tbs_base = [] + for scenario, tbs in tbs_scenario.items(): + paths.log.info(f"> scenario {scenario}") + tb = make_tables_from_scenario( + tbs=tbs, + scenario_num=scenario, + tables_combine_edu=tables_combine_edu, + tables_concat=tables_concat, + tables_drop=tables_drop, + tables_composition=tables_composition, + ) + tbs_base.append(tb) + + # Re-shape table structure + tbs_ = {group: [] for group in tables_composition} + for tbs in tbs_base: + for key, tb in tbs.items(): + tbs_[key].append(tb) + + return tbs_ + + +def concatenate_tables(tbs_scenario): + tables = [] + for tname, tbs in tbs_scenario.items(): + paths.log.info(f"Concatenating table {tname}") + # Check columns match for all tables in group + cols_index = None + for tb in tbs: + cols_index_ = _get_index_columns(tb) + if cols_index is None: + cols_index = list(cols_index_) + else: + assert set(cols_index) == set(cols_index_), "Unexpected index columns!" + # Merge + tb = pr.concat(tbs, short_name=tname) + + # Format + paths.log.info(f"Formatting table {tname}") + assert isinstance(cols_index, list) + tb = tb.format(cols_index + ["scenario"]) + + # Add to main list + tables.append(tb) + return tables + + +def make_tables_from_scenario(tbs, scenario_num, tables_combine_edu, tables_concat, tables_drop, tables_composition): + """Integrate all tables from scenario into single tables. + + We generate multiple single tables since different tables may use different dimensions. This helps in optimizing computation. + """ + # Sanity check country - country_code match + tables = [] + for tb in tbs: + # Check columns are in tables + assert ("country" in tb.columns) and ("country_code" in tb.columns), "Missing country or country_code!" + # Check there is a one-to-one correspondence + assert ( + tb.groupby("country")["country_code"].nunique().max() == 1 + ), "Multiple country codes for a single country!" + # Drop country_code + tb = tb.drop(columns="country_code") + tables.append(tb) + + # Create dictionary to ease navigation + tables = {t.m.short_name: t for t in tables} + # Dictionary with table combinations made + tables = reduce_tables(tables, tables_combine_edu, tables_concat, tables_drop) + + # Composition of tables + tables = consolidate_table_all(tables, scenario_num, tables_composition) + + return tables + + +def reduce_tables(tables, tables_combine_edu, tables_concat, tables_drop): + """Reduces the original number based on similar indicators. + + Given a key-value dictionary with all the tables, this function simplifies it structure: + + - It combines different tables into a single one. That is possible when, e.g. a table contains the same indicator but broken down by an additional dimension. + - Some tables don't have new data. These can be discarded. + """ + paths.log.info("Reducing tables...") + # Start by defining the output dictionary `tables_reduced`, with those tables that are not combined and thus should be kept, at least for now, as they are + tables_combined = [cc for c in tables_combine_edu for cc in c] + [cc for c in tables_concat for cc in c] + if ("net" in tables) and ("netedu" in tables): + tables_combined += ["net", "netedu"] + tables_not_combined = [name for name in tables.keys() if name not in tables_combined] + tables_reduced = {name: harmonize_tb(tables[name]) for name in tables_not_combined} + + # Iterate over the tables from `tables_combine_edu` to consolidate the pairs into single representation. + # Index 1 contains data broken down by 'education'. Index 0 contains data with 'education' = 'total'. + for tb_comb in tables_combine_edu: + # Load tables + tb1 = tables[tb_comb[0]] + tb2 = tables[tb_comb[1]] + # Drop in special case + if tb_comb[0] == "bpop": + tb1 = tb1.loc[tb1["age"] != "All"] + # Prepare tables for merge + tb1 = tb1.assign(education="total") + tb2 = tb2.rename(columns={tb_comb[1]: tb_comb[0]}) + # Check: columns are identical except 'education' + assert set(tb1.columns) == set(tb2.columns), "Unexpected columns!" + # Harmonize + tb1 = harmonize_tb(tb1) + tb2 = harmonize_tb(tb2) + # Concatenate + tb = pr.concat([tb1, tb2], ignore_index=True).drop_duplicates() + # Add to dictionary + tables_reduced[tb_comb[0]] = tb + for tb_comb in tables_concat: + # Load tables + tb1 = tables[tb_comb[0]] + tb2 = tables[tb_comb[1]] + # Prepare tables for merge + tb2 = tb2.rename(columns={tb_comb[1]: tb_comb[0]}) + # Check: columns are identical except 'education' + assert set(tb1.columns) == set(tb2.columns), "Unexpected columns!" + # Harmonize + tb1 = harmonize_tb(tb1) + tb2 = harmonize_tb(tb2) + # Concatenate + tb = pr.concat([tb1, tb2], ignore_index=True).drop_duplicates() + # Add to dictionary + tables_reduced[tb_comb[0]] = tb + + # Special case: net and netedu + if ("net" in tables) and ("netedu" in tables): + # net has age=all and sex=all, so we can drop these columns + # NOTE: net is equivalent to sum(netedu) + epsilon (probably unknown education?) + tb1 = tables["net"] + tb2 = tables["netedu"] + assert set(tb1["age"].unique()) == {"All"} + assert set(tb1["sex"].unique()) == {"Both"} + tb1 = tb1.drop(columns=["age", "sex"]) + tb1["education"] = "total" + # Rename + tb2 = tb2.rename(columns={"netedu": "net"}) + # Check: columns are identical except 'education' + assert set(tb1.columns) == set(tb2.columns), "Unexpected columns!" + # Harmonize + tb1 = harmonize_tb(tb1) + tb2 = harmonize_tb(tb2) + # Concatenate + tb = pr.concat([tb1, tb2], ignore_index=True).drop_duplicates() + tables_reduced["net"] = tb + + # Remove tables that are not needed + tables_reduced = {tname: tb for tname, tb in tables_reduced.items() if tname not in tables_drop} + + # Special: rename 'bpop' -> 'pop' + tables_reduced["pop"] = tables_reduced["bpop"].rename(columns={"bpop": "pop"}) + del tables_reduced["bpop"] + + # Sort dictionary by keys + tables_reduced = dict(sorted(tables_reduced.items())) + return tables_reduced + + +def consolidate_table_all(tables, scenario_num, tables_composition): + """Consolidate tables into new groups. + + Each table group is differentiated from the rest based on the index its tables use. + Grouping by index helps make the merge of all tables way faster. + The idea is that in garden, we process & export each table separately. + This function also harmonizes dimension names. + """ + # Group tables in new groups + tables_new = {} + for tname_new, tnames in tables_composition.items(): + paths.log.info(f"Building {tname_new}...") + # Get list with table objects, with harmonized dimensions + tbs_ = [] + # Index columns + cols_index = None + for tname in tnames: + # Get table + tb_ = tables[tname] + # Harmonize table + tb_ = harmonize_tb(tb_) + # Check dimensions + cols_index_ = _get_index_columns(tb_) + if cols_index is None: + cols_index = list(cols_index_) + else: + assert set(cols_index) == set(cols_index_), "Unexpected index columns!" + tbs_.append(tb_) + # Merge all tables in list + tb = merge_tables_opt(tbs_, on=cols_index, how="outer") + # Add scenario information + tb["scenario"] = scenario_num + tb["scenario"] = tb["scenario"].astype("string") + # Add consolidated table in main dictionary + tables_new[tname_new] = tb + return tables_new + + +def _get_index_columns(tb): + cols_index_all = ["country", "year", "sex", "age", "education"] + cols_index = list(tb.columns.intersection(cols_index_all)) + return cols_index + + +def harmonize_tb(tb): + """Harmonizes tables. + + - Dimensions are named differently in different tables. This function ensures that they are consistent. + - Makes sure DTypes are set correctly. + """ + if "age" in tb.columns: + tb["age"] = ( + tb["age"] + .str.lower() + .replace(REPLACE_AGE) + .str.replace("––", "-", regex=False) + .str.replace("--", "-", regex=False) + ).astype("string") + if "sex" in tb.columns: + tb["sex"] = tb["sex"].str.lower().replace(REPLACE_SEX).astype("string") + if "education" in tb.columns: + tb["education"] = tb["education"].str.lower().str.replace(" ", "_").astype("string") + + # Set dtype + tb = tb.astype( + { + "country": "string", + "year": "string", + } + ) + return tb + + +def merge_tables_opt(tables, **kwargs): + """Optimized & parallelized version of merge_tables.""" + + def _merge_pair(tables): + """Merge two tables.""" + left, right = tables + return left.merge(right, **kwargs) + + # Divide tables into pairs to merge in parallel + with ThreadPoolExecutor() as executor: + while len(tables) > 1: + # Pair tables and merge them in parallel + future_to_merge = { + executor.submit(_merge_pair, (tables[i], tables[i + 1])): i for i in range(0, len(tables) - 1, 2) + } + + # Collect merged tables + merged_tables = [] + for future in as_completed(future_to_merge): + merged_tables.append(future.result()) + + # If odd number of tables, append the last unpaired table + if len(tables) % 2 == 1: + merged_tables.append(tables[-1]) + + # Update tables list with merged results + tables = merged_tables + + # Final merged table + merged_tb = tables[0] + return merged_tb + + +def read_data_from_snap(snap, scenarios_expected): + """Read snapshot. + + Snapshot is a ZIP file that contains numerous RDS files. + """ + tbs_scenario = {} + with snap.extract_to_tempdir() as tmp: + files = os.listdir(tmp) + for i, f in enumerate(files): + if i % 10 == 0: + paths.log.info(f"Processing file {i}/{len(files)}: {f}") + # Add relevant columns + scenario = f.split("_")[0] + assert scenario in scenarios_expected, f"Unexpected scenario: {scenario}" + if scenario in {"22", "23"}: + continue + filename = f.split("_")[1] + # Read RDS file + path = tmp / Path(f) + if f.endswith(".rds"): + data = pyreadr.read_r(path) + assert set(data.keys()) == {None}, "Unexpected keys in RDS file!" + df = data[None] + # Map to table + tb = Table(df) + tb = _add_table_and_variables_metadata_to_table( + table=tb, metadata=snap.to_table_metadata(), origin=snap.metadata.origin + ) + tb.metadata.short_name = filename.replace(".rds", "") + elif f.endswith(".csv.gz"): + scenario = scenario.replace("ssp", "") + tb = pr.read_csv( + path, + metadata=snap.to_table_metadata(), + origin=snap.metadata.origin, + ) + tb.metadata.short_name = filename.replace(".csv.gz", "") + else: + raise ValueError(f"Unexpected file format: {f}!") + # Rename columns + tb = tb.rename(columns=COLUMNS_RENAME) + # Add to main list + if scenario in tbs_scenario.keys(): + tbs_scenario[scenario].append(tb) + else: + tbs_scenario[scenario] = [tb] + return tbs_scenario + + +def inspect_tbs_in_scenario(tbs): + """For exploration purposes only.""" + cols_index = ["country", "country_code", "scenario", "year", "age", "sex", "education"] + for tname, tb in tbs.items(): + cols = set(tb.columns) + cols_index_ = [col for col in cols_index if col in cols] + cols_indicators_ = [col for col in cols if col not in cols_index_] + # cols_ = list(sorted(cols_index_)) + list(sorted(cols_indicators_)) + print(f"> {', '.join(sorted(cols_indicators_))} ({tname}): {', '.join(cols_index_)}") + # print(f"{', '.join(cols_index_)}") diff --git a/etl/steps/data/meadow/demography/2024-12-06/wittgenstein_human_capital_historical.py b/etl/steps/data/meadow/demography/2024-12-06/wittgenstein_human_capital_historical.py new file mode 100644 index 00000000000..476f1d5b57b --- /dev/null +++ b/etl/steps/data/meadow/demography/2024-12-06/wittgenstein_human_capital_historical.py @@ -0,0 +1,144 @@ +"""Load a snapshot and create a meadow dataset. + +This snapshot step is a bit more complex than usual. This is because the snapshot is a ZIP file that contains numerous RDS files. These RDS files can be merged and concatenated, so that we build a single table with all the data. + + +The output table has index columns: country, year, scenario, sex, age, education. + +When values are aggregates, dimensions are set to "total". +""" + + +from etl.helpers import PathFinder, create_dataset + +from .shared import concatenate_tables, make_scenario_tables, read_data_from_snap + +# Get paths and naming conventions for current step. +paths = PathFinder(__file__) + +SCENARIOS_EXPECTED = { + "ssp1", + "ssp2", + "ssp3", + "ssp4", + "ssp5", +} + +# Renaming of relevant columns +COLUMNS_RENAME = { + "name": "country", + "period": "year", +} + +# Harmonization of the dimension values +REPLACE_AGE = { + "all": "total", +} +REPLACE_SEX = { + "both": "total", +} + + +# First table contains education = "all", the other the rest +TABLES_COMBINE_EDUCATION = [ + ("asfr", "easfr"), + ("assr", "eassr"), + # ("macb", "emacb"), + ("tfr", "etfr"), + ("bpop", "epop"), +] + +TABLES_CONCAT = [ + # ("prop", "bprop"), + ("mys", "bmys"), +] +TABLES_DROP = [] + +# Composition of tables +TABLES_COMPOSITION = { + # 0/ No dimension + "main": {"cbr", "cdr", "ggapmys15", "ggapmys25", "growth", "mage", "nirate", "odr", "ydr", "tdr", "macb"}, + # 1/ Sex dimension. NOTE: no sex=total + "by_sex": {"e0", "pryl15", "ryl15"}, + # 1/ Age dimension + "by_age": {"sexratio"}, + # 1/ Education dimension + "by_edu": {"ggapedu15", "ggapedu25", "tfr"}, + # 2/ Sex+Age dimensions. NOTE: no age=total + "by_sex_age": {"mys", "net"}, + # 2/ Age+Education dimensions. NOTE: no age=total, that's fine. We have tfr for all ages actually. + "by_age_edu": {"asfr"}, + # 3/ Sex+Age+Education dimensions + "by_sex_age_edu": {"assr", "pop"}, +} + + +def run(dest_dir: str) -> None: + """Overall, this step could take 6:30 minutes on my machine (lucas).""" + # + # Load inputs. + # + # Retrieve snapshot. + snap = paths.load_snapshot("wittgenstein_human_capital_historical.zip") + + # Load data from snapshot. {"1": [tb1, tb2, ...], "2": [tb1, tb2, ...], ...} + # ~ 1:20 minutes (2 minutes if all scenarios are used) + tbs_scenario = read_data_from_snap(snap, SCENARIOS_EXPECTED) + + # + # Process data. + # + # Consolidate individual scenario tables: {"main": [tb_main1, tb_main2, ...], "by_sex": [tb_sex1, tb_sex2, ...], ...} + # ~ 3 minutes (4:30 if all scenarios are used) + # dix = {k: v for k, v in tbs_scenario.items() if k == "ssp1"} + # tbs_scenario_ = make_scenario_tables(dix) + tables = make_scenario_tables( + tbs_scenario=tbs_scenario, + tables_combine_edu=TABLES_COMBINE_EDUCATION, + tables_concat=TABLES_CONCAT, + tables_drop=TABLES_DROP, + tables_composition=TABLES_COMPOSITION, + ) + + # Filter out rows that are >2020 + year_ranges_ignore = [f"{i}-{i+5}" for i in range(2021, 2101, 5)] + [f"{i}.0-{i+5}.0" for i in range(2020, 2101, 5)] + year_ranges_ignore += [f"{i}.0" for i in range(2021, 2101)] + [f"{i}" for i in range(2020, 2101)] + + for tname, tbs in tables.items(): + for i, tb in enumerate(tbs): + # Remove unwanted years + tb = tb.loc[~(tb["year"].isin(year_ranges_ignore))] + # Remove duplicate rows + # An alternative to solve this is: drop age=All in bpop table. + # if tname == "by_sex_age_edu": + # cols = ["country", "year", "age", "education", "sex", "scenario"] + # x = tb.groupby(["country", "year", "age", "education", "sex", "scenario"], as_index=False).size() + # x = x[x["size"] > 1] + # assert set(x["year"].unique()) == {"2015"} + # assert set(x["age"].unique()) == {"total"} + # assert set(x["sex"].unique()) == {"male"} + # assert set(x["education"].unique()) == {"total"} + # tb = tb.drop_duplicates(subset=cols) + + # Overwrite + tables[tname][i] = tb + + # Remove duplicates + + # Concatenate: [table_main, table_sex, ...] + # ~ 2 minutes + tables = concatenate_tables(tables) + + # + # Save outputs. + # + # Create a new meadow dataset with the same metadata as the snapshot. + ds_meadow = create_dataset( + dest_dir, + tables=tables, + check_variables_metadata=True, + default_metadata=snap.metadata, + ) + + # Save changes in the new meadow dataset. + ds_meadow.save() diff --git a/etl/steps/data/meadow/demography/2024-12-06/wittgenstein_human_capital_proj.py b/etl/steps/data/meadow/demography/2024-12-06/wittgenstein_human_capital_proj.py new file mode 100644 index 00000000000..b06249c6e94 --- /dev/null +++ b/etl/steps/data/meadow/demography/2024-12-06/wittgenstein_human_capital_proj.py @@ -0,0 +1,131 @@ +"""Load a snapshot and create a meadow dataset. + +This snapshot step is a bit more complex than usual. This is because the snapshot is a ZIP file that contains numerous RDS files. These RDS files can be merged and concatenated, so that we build a single table with all the data. + + +The output table has index columns: country, year, scenario, sex, age, education. + +When values are aggregates, dimensions are set to "total". +""" + + +from etl.helpers import PathFinder, create_dataset + +from .shared import concatenate_tables, make_scenario_tables, read_data_from_snap + +# Get paths and naming conventions for current step. +paths = PathFinder(__file__) + +SCENARIOS_EXPECTED = { + "1", + "2", + "22", + "23", + "3", + "4", + "5", +} + +# Renaming of relevant columns +COLUMNS_RENAME = { + "name": "country", + "period": "year", +} + +# Harmonization of the dimension values +REPLACE_AGE = { + "all": "total", +} +REPLACE_SEX = { + "both": "total", +} + + +# First table contains education = "all", the other the rest +TABLES_COMBINE_EDUCATION = [ + ("asfr", "easfr"), + ("assr", "eassr"), + ("macb", "emacb"), + # ("net", "netedu"), + ("tfr", "etfr"), + ("bpop", "epop"), +] + +TABLES_CONCAT = [ + # ("prop", "bprop"), + ("mys", "bmys"), +] +TABLES_DROP = [ + # Several tables are just population! + "pop", + "pop-age", + "pop-age-edattain", + "pop-age-sex", + "pop-age-sex-edattain", + "pop-sex", + "pop-sex-edattain", + "pop-total", +] +# Composition of tables +TABLES_COMPOSITION = { + # 0/ No dimension + "main": {"cbr", "cdr", "emi", "ggapmys15", "ggapmys25", "growth", "imm", "mage", "nirate", "odr", "ydr", "tdr"}, + # 1/ Sex dimension. NOTE: no sex=total + "by_sex": {"e0", "pryl15", "ryl15"}, + # 1/ Age dimension + "by_age": {"sexratio"}, + # 1/ Education dimension + "by_edu": {"ggapedu15", "ggapedu25", "macb", "net", "tfr"}, + # 2/ Sex+Age dimensions. NOTE: no age=total + "by_sex_age": {"mys"}, + # 2/ Age+Education dimensions. NOTE: no age=total, that's fine. We have tfr for all ages actually. + "by_age_edu": {"asfr"}, + # 3/ Sex+Age+Education dimensions + "by_sex_age_edu": {"assr", "pop"}, +} + + +def run(dest_dir: str) -> None: + """Overall, this step could take 6:30 minutes on my machine (lucas).""" + # + # Load inputs. + # + # Retrieve snapshot. + snap = paths.load_snapshot("wittgenstein_human_capital.zip") + + # Load data from snapshot. {"1": [tb1, tb2, ...], "2": [tb1, tb2, ...], ...} + # ~ 1:20 minutes (2 minutes if all scenarios are used) + tbs_scenario = read_data_from_snap(snap, SCENARIOS_EXPECTED) + + # + # Process data. + # + # Consolidate individual scenario tables: {"main": [tb_main1, tb_main2, ...], "by_sex": [tb_sex1, tb_sex2, ...], ...} + # ~ 3 minutes (4:30 if all scenarios are used) + # dix = {k: v for k, v in tbs_scenario.items() if k == "1"} + # tbs_scenario_ = make_scenario_tables(dix) + tbs_scenario = make_scenario_tables( + tbs_scenario=tbs_scenario, + tables_combine_edu=TABLES_COMBINE_EDUCATION, + tables_concat=TABLES_CONCAT, + tables_drop=TABLES_DROP, + tables_composition=TABLES_COMPOSITION, + ) + + # Concatenate: [table_main, table_sex, ...] + # ~ 2 minutes + tables = concatenate_tables(tbs_scenario) + + # + # Save outputs. + # + # Create a new meadow dataset with the same metadata as the snapshot. + ds_meadow = create_dataset( + dest_dir, + tables=tables, + check_variables_metadata=True, + default_metadata=snap.metadata, + ) + + # Save changes in the new meadow dataset. + ds_meadow.save() diff --git a/pyproject.toml b/pyproject.toml index 462eaa42eea..8a4f89aa904 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,6 +66,7 @@ dependencies = [ "scikit-learn>=1.5.2", "geopy>=2.4.1", "py7zr>=0.22.0", + "pyreadr>=0.5.2", ] [tool.uv.sources] diff --git a/snapshots/demography/2024-12-06/wittgenstein_human_capital.py b/snapshots/demography/2024-12-06/wittgenstein_human_capital.py new file mode 100644 index 00000000000..da013c6fd64 --- /dev/null +++ b/snapshots/demography/2024-12-06/wittgenstein_human_capital.py @@ -0,0 +1,202 @@ +"""Script to create a snapshot of dataset.""" + +import os +import shutil +from pathlib import Path +from typing import Optional + +import click +import requests + +from etl.snapshot import Snapshot + +# Version for current snapshot dataset. +SNAPSHOT_VERSION = Path(__file__).parent.name + +# Latest version available +URL_SERVER = "https://wicshiny2023.iiasa.ac.at/wcde-data/wcde-v3-batch" +INDICATORS = [ + "asfr", + "assr", + "bmys", + "bpop", + "bprop", + "cbr", + "cdr", + "e0", + "easfr", + "eassr", + "emacb", + "emi", + "epop", + "etfr", + "ggapedu15", + "ggapedu25", + "ggapmys15", + "ggapmys25", + "growth", + "imm", + "macb", + "mage", + "mys", + "net", + "netedu", + "nirate", + "odr", + "pop-age-edattain", + "pop-age-sex-edattain", + "pop-age-sex", + "pop-age", + "pop-sex-edattain", + "pop-sex", + "pop-total", + "pop", + "prop", + "pryl15", + "ryl15", + "sexratio", + "tdr", + "tfr", + "ydr", +] +SCENARIOS = [ + "1", + "2", + "22", + "23", + "3", + "4", + "5", +] + +# Batch with historical data +URL_SERVER_HISTORICAL = "https://wicshiny2023.iiasa.ac.at/wcde-data/data-batch/" +SCENARIOS_HISTORICAL = [ + "ssp1", + "ssp2", + "ssp3", + "ssp4", + "ssp5", +] +INDICATORS_HISTORICAL = [ + "asfr", + "assr", + "bmys", + "bpop", + "bprop", + "cbr", + "cdr", + "e0", + "easfr", + "eassr", + # "emacb", + # "emi", + "epop", + "etfr", + "ggapedu15", + "ggapedu25", + "ggapmys15", + "ggapmys25", + "growth", + # "imm", + "macb", + "mage", + "mys", + "net", + # "netedu", + "nirate", + "odr", + # "pop-age-edattain", + # "pop-age-sex-edattain", + # "pop-age-sex", + # "pop-age", + # "pop-sex-edattain", + # "pop-sex", + # "pop-total", + "pop", + "prop", + "pryl15", + "ryl15", + "sexratio", + "tdr", + "tfr", + "ydr", +] + + +@click.command() +@click.option("--upload/--skip-upload", default=True, type=bool, help="Upload dataset to Snapshot") +@click.option("--path-to-file", "-f1", type=str, help="Path to local data file.") +@click.option("--path-to-file-historical", "-f2", type=str, help="Path to local data file.") +def main(path_to_file: Optional[str], path_to_file_historical: str, upload: bool) -> None: + if path_to_file is not None: + # Create a new snapshot. + snap = Snapshot(f"demography/{SNAPSHOT_VERSION}/wittgenstein_human_capital.zip") + + # Copy local data file to snapshots data folder, add file to DVC and upload to S3. + snap.create_snapshot(filename=path_to_file, upload=upload) + + if path_to_file_historical is not None: + # Create a new snapshot. + snap = Snapshot(f"demography/{SNAPSHOT_VERSION}/wittgenstein_human_capital_historical.zip") + + # Copy local data file to snapshots data folder, add file to DVC and upload to S3. + snap.create_snapshot(filename=path_to_file_historical, upload=upload) + + +def get_data(folder: str): + """Download all files from the WCDE server. + + Relevant files: + - All scenarios in SCENARIOS + - All indicators in INDICATORS + + Saves all these files in `folder`. + """ + os.makedirs(folder, exist_ok=True) + for scenario in SCENARIOS: + for indicator in INDICATORS: + url = f"{URL_SERVER}/{scenario}/{indicator}.rds" + try: + file_path = f"{folder}/{scenario}_{indicator}.rds" + response = requests.get(url) + response.raise_for_status() # Raise HTTPError for bad responses + with open(file_path, "wb") as file: + file.write(response.content) + print(f"Saved: {file_path}") + except requests.exceptions.RequestException as e: + print(f"Failed to download {url}: {e}") + + # Zip file + shutil.make_archive(folder, "zip", folder) + + +def get_data_historical(folder: str): + """Download all files from the WCDE server (historical values). + + Relevant files: + - All scenarios in SCENARIOS_HISTORICAL + - All indicators in INDICATORS + + Saves all these files in `folder`. + """ + os.makedirs(folder, exist_ok=True) + for scenario in SCENARIOS_HISTORICAL: + for indicator in INDICATORS_HISTORICAL: + url = f"{URL_SERVER_HISTORICAL}/{scenario}/{indicator}.csv.gz" + try: + file_path = f"{folder}/{scenario}_{indicator}.csv.gz" + response = requests.get(url) + response.raise_for_status() # Raise HTTPError for bad responses + with open(file_path, "wb") as file: + file.write(response.content) + print(f"Saved: {file_path}") + except requests.exceptions.RequestException as e: + print(f"Failed to download {url}: {e}") + + # Zip file + shutil.make_archive(folder, "zip", folder) + + +if __name__ == "__main__": + main() diff --git a/snapshots/demography/2024-12-06/wittgenstein_human_capital.zip.dvc b/snapshots/demography/2024-12-06/wittgenstein_human_capital.zip.dvc new file mode 100644 index 00000000000..ad14a25bd53 --- /dev/null +++ b/snapshots/demography/2024-12-06/wittgenstein_human_capital.zip.dvc @@ -0,0 +1,32 @@ +# Learn more at: +# http://docs.owid.io/projects/etl/architecture/metadata/reference/ +meta: + origin: + # Data product / Snapshot + title: Human Capital, Wittgenstein Centre + description: |- + This website presents the 2023 revision of the Wittgenstein Centre population projections (Version 3), following the initial projections (Version 1) in 2013 (Lutz, Butz, and KC (Eds.) 2014) and the 2018 update (Version 2) (Lutz, Goujon, KC, Stonawski, and, Stilianakis (Eds.) 2018). Further details on the updates and the revisions can be found in K.C. et al. (2024) and in other satellite papers focusing on the migration component (Yildiz and Abel 2024), the mortality component (Dhakad and KC 2024 - forthcoming), and the fertility component (Adhikari et al. 2024 - forthcoming). + + In 2021, the Shared Socioeconomic Pathways (SSPs) scenario community related to the Intergovernmental Panel on Climate Change requested an update of the human core of the SSPs, which is at the origin of this version. This updated version is based on 2020 as the reference year, with adjustments to certain short-term assumptions extending to 2030. However, most long-term assumptions have not been changed. Several changes were nevertheless implemented particularly in estimating and using country-specific education differentials in mortality and migration. + + This new version includes population projections by levels of educational attainment from 2020 to 2100 for 200 countries according to seven scenarios (SSP1-5, SSP2-Zero Migration and SSP2-Double Migration). The reconstruction will become available in the course of 2024. + version_producer: 3 + date_published: "2024-02-08" + + # Citation + producer: Wittgenstein Centre + citation_full: |- + K.C., S., Dhakad, M., Potancokova, M., Adhikari, S., Yildiz, D., Mamolo, M., Sobotka, T., Zeman, K., Abel, G., Lutz, W., and Goujon, A. (2024). Updating the Shared Socioeconomic Pathways (SSPs) Global Population and Human Capital Projections. IIASA Working Paper. Laxenburg, Austria: WP-24-003. https://pure.iiasa.ac.at/19487. Available at: http://www.wittgensteincentre.org/dataexplorer. + + # Files + url_main: https://dataexplorer.wittgensteincentre.org/wcde-v3/ + date_accessed: 2024-12-06 + + # License + license: + name: CC BY 4.0 + url: https://creativecommons.org/licenses/by/4.0/deed.en +outs: + - md5: a1bc7bb756f24d5a0e6eb1fe90f057e5 + size: 115287227 + path: wittgenstein_human_capital.zip diff --git a/snapshots/demography/2024-12-06/wittgenstein_human_capital_historical.zip.dvc b/snapshots/demography/2024-12-06/wittgenstein_human_capital_historical.zip.dvc new file mode 100644 index 00000000000..f84a0d74b6b --- /dev/null +++ b/snapshots/demography/2024-12-06/wittgenstein_human_capital_historical.zip.dvc @@ -0,0 +1,32 @@ +# Learn more at: +# http://docs.owid.io/projects/etl/architecture/metadata/reference/ +meta: + origin: + # Data product / Snapshot + title: Human Capital, Wittgenstein Centre + description: |- + This website presents the 2023 revision of the Wittgenstein Centre population projections (Version 3), following the initial projections (Version 1) in 2013 (Lutz, Butz, and KC (Eds.) 2014) and the 2018 update (Version 2) (Lutz, Goujon, KC, Stonawski, and, Stilianakis (Eds.) 2018). Further details on the updates and the revisions can be found in K.C. et al. (2024) and in other satellite papers focusing on the migration component (Yildiz and Abel 2024), the mortality component (Dhakad and KC 2024 - forthcoming), and the fertility component (Adhikari et al. 2024 - forthcoming). + + In 2021, the Shared Socioeconomic Pathways (SSPs) scenario community related to the Intergovernmental Panel on Climate Change requested an update of the human core of the SSPs, which is at the origin of this version. This updated version is based on 2020 as the reference year, with adjustments to certain short-term assumptions extending to 2030. However, most long-term assumptions have not been changed. Several changes were nevertheless implemented particularly in estimating and using country-specific education differentials in mortality and migration. + + This new version includes population projections by levels of educational attainment from 2020 to 2100 for 200 countries according to seven scenarios (SSP1-5, SSP2-Zero Migration and SSP2-Double Migration). The reconstruction will become available in the course of 2024. + title_snapshot: Human Capital, Wittgenstein Centre (Historical data) + date_published: "2024-02-08" + + # Citation + producer: Wittgenstein Centre + citation_full: |- + K.C., S., Dhakad, M., Potancokova, M., Adhikari, S., Yildiz, D., Mamolo, M., Sobotka, T., Zeman, K., Abel, G., Lutz, W., and Goujon, A. (2024). Updating the Shared Socioeconomic Pathways (SSPs) Global Population and Human Capital Projections. IIASA Working Paper. Laxenburg, Austria: WP-24-003. https://pure.iiasa.ac.at/19487. Available at: http://www.wittgensteincentre.org/dataexplorer. + + # Files + url_main: https://dataexplorer.wittgensteincentre.org/wcde-v3/ + date_accessed: 2024-12-06 + + # License + license: + name: CC BY 4.0 + url: https://creativecommons.org/licenses/by/4.0/deed.en +outs: + - md5: 6aaf6017779daed3356935b745d8d25e + size: 318304437 + path: wittgenstein_human_capital_historical.zip diff --git a/uv.lock b/uv.lock index d52f17610dc..23ad3eb556e 100644 --- a/uv.lock +++ b/uv.lock @@ -84,21 +84,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f5/76/a57ceff577ae26fe9a6f31ac799bc638ecf26e4acdf04295290b9929b349/aiohttp-3.11.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d18a8b44ec8502a7fde91446cd9c9b95ce7c49f1eacc1fb2358b8907d4369fd", size = 1690038 }, { url = "https://files.pythonhosted.org/packages/4b/81/b20e09003b6989a7f23a721692137a6143420a151063c750ab2a04878e3c/aiohttp-3.11.7-cp312-cp312-win32.whl", hash = "sha256:3d1c9c15d3999107cbb9b2d76ca6172e6710a12fda22434ee8bd3f432b7b17e8", size = 409887 }, { url = "https://files.pythonhosted.org/packages/b7/0b/607c98bff1d07bb21e0c39e7711108ef9ff4f2a361a3ec1ce8dce93623a5/aiohttp-3.11.7-cp312-cp312-win_amd64.whl", hash = "sha256:018f1b04883a12e77e7fc161934c0f298865d3a484aea536a6a2ca8d909f0ba0", size = 436462 }, - { url = "https://files.pythonhosted.org/packages/7a/53/8d77186c6a33bd087714df18274cdcf6e36fd69a9e841c85b7e81a20b18e/aiohttp-3.11.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:241a6ca732d2766836d62c58c49ca7a93d08251daef0c1e3c850df1d1ca0cbc4", size = 695811 }, - { url = "https://files.pythonhosted.org/packages/62/b6/4c3d107a5406aa6f99f618afea82783f54ce2d9644020f50b9c88f6e823d/aiohttp-3.11.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa3705a8d14de39898da0fbad920b2a37b7547c3afd2a18b9b81f0223b7d0f68", size = 458530 }, - { url = "https://files.pythonhosted.org/packages/d9/05/dbf0bd3966be8ebed3beb4007a2d1356d79af4fe7c93e54f984df6385193/aiohttp-3.11.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9acfc7f652b31853eed3b92095b0acf06fd5597eeea42e939bd23a17137679d5", size = 451371 }, - { url = "https://files.pythonhosted.org/packages/19/6a/2198580314617b6cf9c4b813b84df5832b5f8efedcb8a7e8b321a187233c/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcefcf2915a2dbdbce37e2fc1622129a1918abfe3d06721ce9f6cdac9b6d2eaa", size = 1662905 }, - { url = "https://files.pythonhosted.org/packages/2b/65/08696fd7503f6a6f9f782bd012bf47f36d4ed179a7d8c95dba4726d5cc67/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c1f6490dd1862af5aae6cfcf2a274bffa9a5b32a8f5acb519a7ecf5a99a88866", size = 1713794 }, - { url = "https://files.pythonhosted.org/packages/c8/a3/b9a72dce6f15e2efbc09fa67c1067c4f3a3bb05661c0ae7b40799cde02b7/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac5462582d6561c1c1708853a9faf612ff4e5ea5e679e99be36143d6eabd8e", size = 1770757 }, - { url = "https://files.pythonhosted.org/packages/78/7e/8fb371b5f8c4c1eaa0d0a50750c0dd68059f86794aeb36919644815486f5/aiohttp-3.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1a6309005acc4b2bcc577ba3b9169fea52638709ffacbd071f3503264620da", size = 1673136 }, - { url = "https://files.pythonhosted.org/packages/2f/0f/09685d13d2c7634cb808868ea29c170d4dcde4215a4a90fb86491cd3ae25/aiohttp-3.11.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5b973cce96793725ef63eb449adfb74f99c043c718acb76e0d2a447ae369962", size = 1600370 }, - { url = "https://files.pythonhosted.org/packages/00/2e/18fd38b117f9b3a375166ccb70ed43cf7e3dfe2cc947139acc15feefc5a2/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ce91a24aac80de6be8512fb1c4838a9881aa713f44f4e91dd7bb3b34061b497d", size = 1613459 }, - { url = "https://files.pythonhosted.org/packages/2c/94/10a82abc680d753be33506be699aaa330152ecc4f316eaf081f996ee56c2/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:875f7100ce0e74af51d4139495eec4025affa1a605280f23990b6434b81df1bd", size = 1613924 }, - { url = "https://files.pythonhosted.org/packages/e9/58/897c0561f5c522dda6e173192f1e4f10144e1a7126096f17a3f12b7aa168/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c171fc35d3174bbf4787381716564042a4cbc008824d8195eede3d9b938e29a8", size = 1681164 }, - { url = "https://files.pythonhosted.org/packages/8b/8b/3a48b1cdafa612679d976274355f6a822de90b85d7dba55654ecfb01c979/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ee9afa1b0d2293c46954f47f33e150798ad68b78925e3710044e0d67a9487791", size = 1712139 }, - { url = "https://files.pythonhosted.org/packages/aa/9d/70ab5b4dd7900db04af72840e033aee06e472b1343e372ea256ed675511c/aiohttp-3.11.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8360c7cc620abb320e1b8d603c39095101391a82b1d0be05fb2225471c9c5c52", size = 1667446 }, - { url = "https://files.pythonhosted.org/packages/cb/98/b5fbcc8f6056f0c56001c75227e6b7ca9ee4f2e5572feca82ff3d65d485d/aiohttp-3.11.7-cp313-cp313-win32.whl", hash = "sha256:7a9318da4b4ada9a67c1dd84d1c0834123081e746bee311a16bb449f363d965e", size = 408689 }, - { url = "https://files.pythonhosted.org/packages/ef/07/4d1504577fa6349dd2e3839e89fb56e5dee38d64efe3d4366e9fcfda0cdb/aiohttp-3.11.7-cp313-cp313-win_amd64.whl", hash = "sha256:fc6da202068e0a268e298d7cd09b6e9f3997736cd9b060e2750963754552a0a9", size = 434809 }, ] [[package]] @@ -444,18 +429,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d8/63/1c1585b2aa554fe6dbce30f0c18bdbc877fa9a1bf5ff17677d9cca0ac122/Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839", size = 2930029 }, { url = "https://files.pythonhosted.org/packages/5f/3b/4e3fd1893eb3bbfef8e5a80d4508bec17a57bb92d586c85c12d28666bb13/Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0", size = 333276 }, { url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951", size = 357255 }, - { url = "https://files.pythonhosted.org/packages/0a/9f/fb37bb8ffc52a8da37b1c03c459a8cd55df7a57bdccd8831d500e994a0ca/Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5", size = 815681 }, - { url = "https://files.pythonhosted.org/packages/06/b3/dbd332a988586fefb0aa49c779f59f47cae76855c2d00f450364bb574cac/Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8", size = 422475 }, - { url = "https://files.pythonhosted.org/packages/bb/80/6aaddc2f63dbcf2d93c2d204e49c11a9ec93a8c7c63261e2b4bd35198283/Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f", size = 2906173 }, - { url = "https://files.pythonhosted.org/packages/ea/1d/e6ca79c96ff5b641df6097d299347507d39a9604bde8915e76bf026d6c77/Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648", size = 2943803 }, - { url = "https://files.pythonhosted.org/packages/ac/a3/d98d2472e0130b7dd3acdbb7f390d478123dbf62b7d32bda5c830a96116d/Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0", size = 2918946 }, - { url = "https://files.pythonhosted.org/packages/c4/a5/c69e6d272aee3e1423ed005d8915a7eaa0384c7de503da987f2d224d0721/Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089", size = 2845707 }, - { url = "https://files.pythonhosted.org/packages/58/9f/4149d38b52725afa39067350696c09526de0125ebfbaab5acc5af28b42ea/Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368", size = 2936231 }, - { url = "https://files.pythonhosted.org/packages/5a/5a/145de884285611838a16bebfdb060c231c52b8f84dfbe52b852a15780386/Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c", size = 2848157 }, - { url = "https://files.pythonhosted.org/packages/50/ae/408b6bfb8525dadebd3b3dd5b19d631da4f7d46420321db44cd99dcf2f2c/Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284", size = 3035122 }, - { url = "https://files.pythonhosted.org/packages/af/85/a94e5cfaa0ca449d8f91c3d6f78313ebf919a0dbd55a100c711c6e9655bc/Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7", size = 2930206 }, - { url = "https://files.pythonhosted.org/packages/c2/f0/a61d9262cd01351df22e57ad7c34f66794709acab13f34be2675f45bf89d/Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0", size = 333804 }, - { url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b", size = 358517 }, ] [[package]] @@ -583,17 +556,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, ] [[package]] @@ -755,24 +717,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/25/632eab595e3140adfa92f1322bf8915f68c932bac468e89eae9974cf1c00/contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35", size = 1322833 }, { url = "https://files.pythonhosted.org/packages/73/e3/69738782e315a1d26d29d71a550dbbe3eb6c653b028b150f70c1a5f4f229/contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb", size = 172681 }, { url = "https://files.pythonhosted.org/packages/0c/89/9830ba00d88e43d15e53d64931e66b8792b46eb25e2050a88fec4a0df3d5/contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b", size = 218283 }, - { url = "https://files.pythonhosted.org/packages/53/a1/d20415febfb2267af2d7f06338e82171824d08614084714fb2c1dac9901f/contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3", size = 267879 }, - { url = "https://files.pythonhosted.org/packages/aa/45/5a28a3570ff6218d8bdfc291a272a20d2648104815f01f0177d103d985e1/contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7", size = 251573 }, - { url = "https://files.pythonhosted.org/packages/39/1c/d3f51540108e3affa84f095c8b04f0aa833bb797bc8baa218a952a98117d/contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84", size = 303184 }, - { url = "https://files.pythonhosted.org/packages/00/56/1348a44fb6c3a558c1a3a0cd23d329d604c99d81bf5a4b58c6b71aab328f/contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0", size = 340262 }, - { url = "https://files.pythonhosted.org/packages/2b/23/00d665ba67e1bb666152131da07e0f24c95c3632d7722caa97fb61470eca/contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b", size = 313806 }, - { url = "https://files.pythonhosted.org/packages/5a/42/3cf40f7040bb8362aea19af9a5fb7b32ce420f645dd1590edcee2c657cd5/contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da", size = 319710 }, - { url = "https://files.pythonhosted.org/packages/05/32/f3bfa3fc083b25e1a7ae09197f897476ee68e7386e10404bdf9aac7391f0/contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14", size = 1264107 }, - { url = "https://files.pythonhosted.org/packages/1c/1e/1019d34473a736664f2439542b890b2dc4c6245f5c0d8cdfc0ccc2cab80c/contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8", size = 1322458 }, - { url = "https://files.pythonhosted.org/packages/22/85/4f8bfd83972cf8909a4d36d16b177f7b8bdd942178ea4bf877d4a380a91c/contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294", size = 172643 }, - { url = "https://files.pythonhosted.org/packages/cc/4a/fb3c83c1baba64ba90443626c228ca14f19a87c51975d3b1de308dd2cf08/contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087", size = 218301 }, - { url = "https://files.pythonhosted.org/packages/76/65/702f4064f397821fea0cb493f7d3bc95a5d703e20954dce7d6d39bacf378/contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8", size = 278972 }, - { url = "https://files.pythonhosted.org/packages/80/85/21f5bba56dba75c10a45ec00ad3b8190dbac7fd9a8a8c46c6116c933e9cf/contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b", size = 263375 }, - { url = "https://files.pythonhosted.org/packages/0a/64/084c86ab71d43149f91ab3a4054ccf18565f0a8af36abfa92b1467813ed6/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973", size = 307188 }, - { url = "https://files.pythonhosted.org/packages/3d/ff/d61a4c288dc42da0084b8d9dc2aa219a850767165d7d9a9c364ff530b509/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18", size = 345644 }, - { url = "https://files.pythonhosted.org/packages/ca/aa/00d2313d35ec03f188e8f0786c2fc61f589306e02fdc158233697546fd58/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8", size = 317141 }, - { url = "https://files.pythonhosted.org/packages/8d/6a/b5242c8cb32d87f6abf4f5e3044ca397cb1a76712e3fa2424772e3ff495f/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6", size = 323469 }, - { url = "https://files.pythonhosted.org/packages/6f/a6/73e929d43028a9079aca4bde107494864d54f0d72d9db508a51ff0878593/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2", size = 1260894 }, - { url = "https://files.pythonhosted.org/packages/2b/1e/1e726ba66eddf21c940821df8cf1a7d15cb165f0682d62161eaa5e93dae1/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927", size = 1314829 }, { url = "https://files.pythonhosted.org/packages/d1/09/60e486dc2b64c94ed33e58dcfb6f808192c03dfc5574c016218b9b7680dc/contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c", size = 261886 }, { url = "https://files.pythonhosted.org/packages/19/20/b57f9f7174fcd439a7789fb47d764974ab646fa34d1790551de386457a8e/contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779", size = 311008 }, { url = "https://files.pythonhosted.org/packages/74/fc/5040d42623a1845d4f17a418e590fd7a79ae8cb2bad2b2f83de63c3bdca4/contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4", size = 215690 }, @@ -994,6 +938,7 @@ dependencies = [ { name = "pyhumps" }, { name = "pymysql" }, { name = "pypdf2" }, + { name = "pyreadr" }, { name = "python-docx" }, { name = "python-dotenv" }, { name = "pyyaml" }, @@ -1118,6 +1063,7 @@ requires-dist = [ { name = "pymysql", specifier = ">=1.1.1" }, { name = "pypdf2", specifier = ">=2.11.1" }, { name = "pyproj", marker = "extra == 'wizard'", specifier = ">=3.6.1" }, + { name = "pyreadr", specifier = ">=0.5.2" }, { name = "python-docx", specifier = ">=1.1.2" }, { name = "python-dotenv", specifier = ">=0.19.0" }, { name = "pyyaml", specifier = ">=6.0.1" }, @@ -1301,10 +1247,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/49/977d24c3eb4261beee1139a509464a93e6a7e5293979a8def2ff31655015/fiona-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ad1ea80555bc56047d4b4e60c9424cf66875f161b3e56ebd60fa0574dc6693f", size = 14756387 }, { url = "https://files.pythonhosted.org/packages/ed/21/815615edd4f2eb7c31c5acc0d1af431907379902f547268f14112e245ce0/fiona-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a273cc957e86289609b47155f75d60c2cc37974a92618e016f75bc5ab9cc2dec", size = 17226047 }, { url = "https://files.pythonhosted.org/packages/0e/b0/22219e4d73fcace11cc8377788df647af14332f8b934dd6c1b0b02f4cdeb/fiona-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:ef44b3b0704244503a5f12ae92ca88b2cf4fedc9fd881b00c7c58b6899ca5133", size = 24466058 }, - { url = "https://files.pythonhosted.org/packages/d2/05/ae6e15b975d32ee36ad52adde64612fdb239b9139c75609a6f59adb27c1d/fiona-1.10.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:80929d220a92b50592b5ce96233d631c61a3c9b9bebd26ea136e7e48ffb50616", size = 16108158 }, - { url = "https://files.pythonhosted.org/packages/e2/6d/75ff305c3de77d5c649b33463851b90232d4ebebdb3cd1955da7f85fa32b/fiona-1.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82514e8cc113245f2c7deda1c66f0aba67b183e20404365bbb7347e12b35c80f", size = 14739701 }, - { url = "https://files.pythonhosted.org/packages/a1/71/5b906e16c129a9cefa0e2655c878b27577221f6825a48c9323b50a07c7e9/fiona-1.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c1a555b2546d3c69d0826a526a5c3e50a1cd330c95e2e0ebf6e82fa81fc2d96", size = 17223184 }, - { url = "https://files.pythonhosted.org/packages/b8/93/c3b3d91f292ff35a2c632de95128138c82bdd6aa0de6928e2650af36e4fe/fiona-1.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:bf11de868ab601b8d917dc38719b39bf8bdeaadc4fda9964d96b4b354e528fff", size = 24462629 }, ] [[package]] @@ -1437,21 +1379,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, - { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, - { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, - { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, - { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, - { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, - { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, - { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, - { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, - { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, - { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, - { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, - { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, - { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, - { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, - { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, ] @@ -1738,15 +1665,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fb/e8/9374e77fc204973d6d901c8bb2d7cb223e81513754874cbee6cc5c5fc0ba/greenlet-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665", size = 1154076 }, { url = "https://files.pythonhosted.org/packages/a2/90/912a1227a841d5df57d6dbe5730e049d5fd38c902c3940e45222360ca336/greenlet-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811", size = 1182665 }, { url = "https://files.pythonhosted.org/packages/0d/20/89674b7d62a19138b3352f6080f2ff3e1ee4a298b29bb793746423d0b908/greenlet-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b", size = 294647 }, - { url = "https://files.pythonhosted.org/packages/f9/5f/fb128714bbd96614d570fff1d91bbef7a49345bea183e9ea19bdcda1f235/greenlet-3.1.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd", size = 268913 }, - { url = "https://files.pythonhosted.org/packages/cc/d2/460d00a72720a8798815d29cc4281b72103910017ca2d560a12f801b2138/greenlet-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca", size = 662715 }, - { url = "https://files.pythonhosted.org/packages/86/01/852b8c516b35ef2b16812655612092e02608ea79de7e79fde841cfcdbae4/greenlet-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64", size = 675985 }, - { url = "https://files.pythonhosted.org/packages/eb/9b/39930fdefa5dab2511ed813a6764458980e04e10c8c3560862fb2f340128/greenlet-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b", size = 670880 }, - { url = "https://files.pythonhosted.org/packages/66/49/de46b2da577000044e7f5ab514021bbc48a0b0c6dd7af2da9732db36c584/greenlet-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989", size = 672944 }, - { url = "https://files.pythonhosted.org/packages/af/c1/abccddcb2ec07538b6ee1fa30999a239a1ec807109a8dc069e55288df636/greenlet-3.1.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17", size = 629493 }, - { url = "https://files.pythonhosted.org/packages/c1/e8/30c84a3c639691f6c00b04575abd474d94d404a9ad686e60ba0c17c797d0/greenlet-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5", size = 1150524 }, - { url = "https://files.pythonhosted.org/packages/f7/ed/f25832e30a54a92fa13ab94a206f2ea296306acdf5f6a48f88bbb41a6e44/greenlet-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484", size = 1180196 }, - { url = "https://files.pythonhosted.org/packages/87/b0/ac381b73c9b9e2cb55970b9a5842ff5b6bc83a7f23aedd3dded1589f0039/greenlet-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0", size = 294593 }, ] [[package]] @@ -2572,22 +2490,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/08/3a5bb2c53c89660863a5aa1ee236912269f2af8762af04a2e11df851d7b2/kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b", size = 46367 }, { url = "https://files.pythonhosted.org/packages/19/93/c05f0a6d825c643779fc3c70876bff1ac221f0e31e6f701f0e9578690d70/kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb", size = 55884 }, { url = "https://files.pythonhosted.org/packages/d2/f9/3828d8f21b6de4279f0667fb50a9f5215e6fe57d5ec0d61905914f5b6099/kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a", size = 48528 }, - { url = "https://files.pythonhosted.org/packages/c4/06/7da99b04259b0f18b557a4effd1b9c901a747f7fdd84cf834ccf520cb0b2/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e", size = 121913 }, - { url = "https://files.pythonhosted.org/packages/97/f5/b8a370d1aa593c17882af0a6f6755aaecd643640c0ed72dcfd2eafc388b9/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6", size = 65627 }, - { url = "https://files.pythonhosted.org/packages/2a/fc/6c0374f7503522539e2d4d1b497f5ebad3f8ed07ab51aed2af988dd0fb65/kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750", size = 63888 }, - { url = "https://files.pythonhosted.org/packages/bf/3e/0b7172793d0f41cae5c923492da89a2ffcd1adf764c16159ca047463ebd3/kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d", size = 1369145 }, - { url = "https://files.pythonhosted.org/packages/77/92/47d050d6f6aced2d634258123f2688fbfef8ded3c5baf2c79d94d91f1f58/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379", size = 1461448 }, - { url = "https://files.pythonhosted.org/packages/9c/1b/8f80b18e20b3b294546a1adb41701e79ae21915f4175f311a90d042301cf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c", size = 1578750 }, - { url = "https://files.pythonhosted.org/packages/a4/fe/fe8e72f3be0a844f257cadd72689c0848c6d5c51bc1d60429e2d14ad776e/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34", size = 1507175 }, - { url = "https://files.pythonhosted.org/packages/39/fa/cdc0b6105d90eadc3bee525fecc9179e2b41e1ce0293caaf49cb631a6aaf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1", size = 1463963 }, - { url = "https://files.pythonhosted.org/packages/6e/5c/0c03c4e542720c6177d4f408e56d1c8315899db72d46261a4e15b8b33a41/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f", size = 2248220 }, - { url = "https://files.pythonhosted.org/packages/3d/ee/55ef86d5a574f4e767df7da3a3a7ff4954c996e12d4fbe9c408170cd7dcc/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b", size = 2404463 }, - { url = "https://files.pythonhosted.org/packages/0f/6d/73ad36170b4bff4825dc588acf4f3e6319cb97cd1fb3eb04d9faa6b6f212/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27", size = 2352842 }, - { url = "https://files.pythonhosted.org/packages/0b/16/fa531ff9199d3b6473bb4d0f47416cdb08d556c03b8bc1cccf04e756b56d/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a", size = 2501635 }, - { url = "https://files.pythonhosted.org/packages/78/7e/aa9422e78419db0cbe75fb86d8e72b433818f2e62e2e394992d23d23a583/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee", size = 2314556 }, - { url = "https://files.pythonhosted.org/packages/a8/b2/15f7f556df0a6e5b3772a1e076a9d9f6c538ce5f05bd590eca8106508e06/kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07", size = 46364 }, - { url = "https://files.pythonhosted.org/packages/0b/db/32e897e43a330eee8e4770bfd2737a9584b23e33587a0812b8e20aac38f7/kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76", size = 55887 }, - { url = "https://files.pythonhosted.org/packages/c8/a4/df2bdca5270ca85fd25253049eb6708d4127be2ed0e5c2650217450b59e9/kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650", size = 48530 }, { url = "https://files.pythonhosted.org/packages/ac/59/741b79775d67ab67ced9bb38552da688c0305c16e7ee24bba7a2be253fb7/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643", size = 59491 }, { url = "https://files.pythonhosted.org/packages/58/cc/fb239294c29a5656e99e3527f7369b174dd9cc7c3ef2dea7cb3c54a8737b/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706", size = 57648 }, { url = "https://files.pythonhosted.org/packages/3b/ef/2f009ac1f7aab9f81efb2d837301d255279d618d27b6015780115ac64bdd/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6", size = 84257 }, @@ -2685,23 +2587,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7d/ed/e6276c8d9668028213df01f598f385b05b55a4e1b4662ee12ef05dab35aa/lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d", size = 5012542 }, { url = "https://files.pythonhosted.org/packages/36/88/684d4e800f5aa28df2a991a6a622783fb73cf0e46235cfa690f9776f032e/lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30", size = 3486454 }, { url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f", size = 3816857 }, - { url = "https://files.pythonhosted.org/packages/94/6a/42141e4d373903bfea6f8e94b2f554d05506dfda522ada5343c651410dc8/lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a", size = 8156284 }, - { url = "https://files.pythonhosted.org/packages/91/5e/fa097f0f7d8b3d113fb7312c6308af702f2667f22644441715be961f2c7e/lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd", size = 4432407 }, - { url = "https://files.pythonhosted.org/packages/2d/a1/b901988aa6d4ff937f2e5cfc114e4ec561901ff00660c3e56713642728da/lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51", size = 5048331 }, - { url = "https://files.pythonhosted.org/packages/30/0f/b2a54f48e52de578b71bbe2a2f8160672a8a5e103df3a78da53907e8c7ed/lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b", size = 4744835 }, - { url = "https://files.pythonhosted.org/packages/82/9d/b000c15538b60934589e83826ecbc437a1586488d7c13f8ee5ff1f79a9b8/lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002", size = 5316649 }, - { url = "https://files.pythonhosted.org/packages/e3/ee/ffbb9eaff5e541922611d2c56b175c45893d1c0b8b11e5a497708a6a3b3b/lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4", size = 4812046 }, - { url = "https://files.pythonhosted.org/packages/15/ff/7ff89d567485c7b943cdac316087f16b2399a8b997007ed352a1248397e5/lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492", size = 4918597 }, - { url = "https://files.pythonhosted.org/packages/c6/a3/535b6ed8c048412ff51268bdf4bf1cf052a37aa7e31d2e6518038a883b29/lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3", size = 4738071 }, - { url = "https://files.pythonhosted.org/packages/7a/8f/cbbfa59cb4d4fd677fe183725a76d8c956495d7a3c7f111ab8f5e13d2e83/lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4", size = 5342213 }, - { url = "https://files.pythonhosted.org/packages/5c/fb/db4c10dd9958d4b52e34d1d1f7c1f434422aeaf6ae2bbaaff2264351d944/lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367", size = 4893749 }, - { url = "https://files.pythonhosted.org/packages/f2/38/bb4581c143957c47740de18a3281a0cab7722390a77cc6e610e8ebf2d736/lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832", size = 4945901 }, - { url = "https://files.pythonhosted.org/packages/fc/d5/18b7de4960c731e98037bd48fa9f8e6e8f2558e6fbca4303d9b14d21ef3b/lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff", size = 4815447 }, - { url = "https://files.pythonhosted.org/packages/97/a8/cd51ceaad6eb849246559a8ef60ae55065a3df550fc5fcd27014361c1bab/lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd", size = 5411186 }, - { url = "https://files.pythonhosted.org/packages/89/c3/1e3dabab519481ed7b1fdcba21dcfb8832f57000733ef0e71cf6d09a5e03/lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb", size = 5324481 }, - { url = "https://files.pythonhosted.org/packages/b6/17/71e9984cf0570cd202ac0a1c9ed5c1b8889b0fc8dc736f5ef0ffb181c284/lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", size = 5011053 }, - { url = "https://files.pythonhosted.org/packages/69/68/9f7e6d3312a91e30829368c2b3217e750adef12a6f8eb10498249f4e8d72/lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", size = 3485634 }, - { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 }, { url = "https://files.pythonhosted.org/packages/99/f7/b73a431c8500565aa500e99e60b448d305eaf7c0b4c893c7c5a8a69cc595/lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c", size = 3925431 }, { url = "https://files.pythonhosted.org/packages/db/48/4a206623c0d093d0e3b15f415ffb4345b0bdf661a3d0b15a112948c033c7/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a", size = 4216683 }, { url = "https://files.pythonhosted.org/packages/54/47/577820c45dd954523ae8453b632d91e76da94ca6d9ee40d8c98dd86f916b/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005", size = 4326732 }, @@ -3151,21 +3036,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, - { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 }, - { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 }, - { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 }, - { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 }, - { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 }, - { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 }, - { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 }, - { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 }, - { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 }, - { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 }, - { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 }, - { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 }, - { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 }, - { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 }, - { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 }, { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, ] @@ -3748,19 +3618,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, - { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, - { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, - { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, - { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, - { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, - { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, - { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, - { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, - { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, - { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, - { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, - { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, - { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, ] [[package]] @@ -3926,17 +3783,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690 }, { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951 }, { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427 }, - { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685 }, - { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883 }, - { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837 }, - { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562 }, - { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761 }, - { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767 }, - { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989 }, - { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255 }, - { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603 }, - { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972 }, - { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375 }, { url = "https://files.pythonhosted.org/packages/38/30/095d4f55f3a053392f75e2eae45eba3228452783bab3d9a920b951ac495c/pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", size = 3493889 }, { url = "https://files.pythonhosted.org/packages/f3/e8/4ff79788803a5fcd5dc35efdc9386af153569853767bff74540725b45863/pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", size = 3346160 }, { url = "https://files.pythonhosted.org/packages/d7/ac/4184edd511b14f760c73f5bb8a5d6fd85c591c8aff7c2229677a355c4179/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", size = 3435020 }, @@ -4064,22 +3910,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/bd/8657918a35d50b18a9e4d78a5df7b6c82a637a311ab20851eef4326305c1/propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", size = 235922 }, { url = "https://files.pythonhosted.org/packages/a8/6f/ec0095e1647b4727db945213a9f395b1103c442ef65e54c62e92a72a3f75/propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", size = 40177 }, { url = "https://files.pythonhosted.org/packages/20/a2/bd0896fdc4f4c1db46d9bc361c8c79a9bf08ccc08ba054a98e38e7ba1557/propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", size = 44446 }, - { url = "https://files.pythonhosted.org/packages/a8/a7/5f37b69197d4f558bfef5b4bceaff7c43cc9b51adf5bd75e9081d7ea80e4/propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7", size = 78120 }, - { url = "https://files.pythonhosted.org/packages/c8/cd/48ab2b30a6b353ecb95a244915f85756d74f815862eb2ecc7a518d565b48/propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763", size = 45127 }, - { url = "https://files.pythonhosted.org/packages/a5/ba/0a1ef94a3412aab057bd996ed5f0ac7458be5bf469e85c70fa9ceb43290b/propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d", size = 44419 }, - { url = "https://files.pythonhosted.org/packages/b4/6c/ca70bee4f22fa99eacd04f4d2f1699be9d13538ccf22b3169a61c60a27fa/propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a", size = 229611 }, - { url = "https://files.pythonhosted.org/packages/19/70/47b872a263e8511ca33718d96a10c17d3c853aefadeb86dc26e8421184b9/propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b", size = 234005 }, - { url = "https://files.pythonhosted.org/packages/4f/be/3b0ab8c84a22e4a3224719099c1229ddfdd8a6a1558cf75cb55ee1e35c25/propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb", size = 237270 }, - { url = "https://files.pythonhosted.org/packages/04/d8/f071bb000d4b8f851d312c3c75701e586b3f643fe14a2e3409b1b9ab3936/propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf", size = 231877 }, - { url = "https://files.pythonhosted.org/packages/93/e7/57a035a1359e542bbb0a7df95aad6b9871ebee6dce2840cb157a415bd1f3/propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2", size = 217848 }, - { url = "https://files.pythonhosted.org/packages/f0/93/d1dea40f112ec183398fb6c42fde340edd7bab202411c4aa1a8289f461b6/propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f", size = 216987 }, - { url = "https://files.pythonhosted.org/packages/62/4c/877340871251145d3522c2b5d25c16a1690ad655fbab7bb9ece6b117e39f/propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136", size = 212451 }, - { url = "https://files.pythonhosted.org/packages/7c/bb/a91b72efeeb42906ef58ccf0cdb87947b54d7475fee3c93425d732f16a61/propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325", size = 212879 }, - { url = "https://files.pythonhosted.org/packages/9b/7f/ee7fea8faac57b3ec5d91ff47470c6c5d40d7f15d0b1fccac806348fa59e/propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44", size = 222288 }, - { url = "https://files.pythonhosted.org/packages/ff/d7/acd67901c43d2e6b20a7a973d9d5fd543c6e277af29b1eb0e1f7bd7ca7d2/propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83", size = 228257 }, - { url = "https://files.pythonhosted.org/packages/8d/6f/6272ecc7a8daad1d0754cfc6c8846076a8cb13f810005c79b15ce0ef0cf2/propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544", size = 221075 }, - { url = "https://files.pythonhosted.org/packages/7c/bd/c7a6a719a6b3dd8b3aeadb3675b5783983529e4a3185946aa444d3e078f6/propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032", size = 39654 }, - { url = "https://files.pythonhosted.org/packages/88/e7/0eef39eff84fa3e001b44de0bd41c7c0e3432e7648ffd3d64955910f002d/propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e", size = 43705 }, { url = "https://files.pythonhosted.org/packages/3d/b6/e6d98278f2d49b22b4d033c9f792eda783b9ab2094b041f013fc69bcde87/propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", size = 11603 }, ] @@ -4115,8 +3945,6 @@ version = "6.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/18/c7/8c6872f7372eb6a6b2e4708b88419fb46b857f7a2e1892966b851cc79fc9/psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", size = 508067 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/66/78c9c3020f573c58101dc43a44f6855d01bbbd747e24da2f0c4491200ea3/psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", size = 249766 }, - { url = "https://files.pythonhosted.org/packages/e1/3f/2403aa9558bea4d3854b0e5e567bc3dd8e9fbc1fc4453c0aa9aafeb75467/psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", size = 253024 }, { url = "https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", size = 250961 }, { url = "https://files.pythonhosted.org/packages/35/56/72f86175e81c656a01c4401cd3b1c923f891b31fbcebe98985894176d7c9/psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", size = 287478 }, { url = "https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", size = 290455 }, @@ -4342,18 +4170,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/5e/6c716810ea20a6419188992973a73c2fb4eb99cd382368d0637ddb6d3c99/pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd", size = 2119191 }, { url = "https://files.pythonhosted.org/packages/06/fc/6123b00a9240fbb9ae0babad7a005d51103d9a5d39c957a986f5cdd0c271/pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688", size = 1717788 }, { url = "https://files.pythonhosted.org/packages/d5/36/e61ad5a46607a469e2786f398cd671ebafcd9fb17f09a2359985c7228df5/pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d", size = 1898188 }, - { url = "https://files.pythonhosted.org/packages/49/75/40b0e98b658fdba02a693b3bacb4c875a28bba87796c7b13975976597d8c/pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686", size = 1838688 }, - { url = "https://files.pythonhosted.org/packages/75/02/d8ba2d4a266591a6a623c68b331b96523d4b62ab82a951794e3ed8907390/pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a", size = 1768409 }, - { url = "https://files.pythonhosted.org/packages/91/ae/25ecd9bc4ce4993e99a1a3c9ab111c082630c914260e129572fafed4ecc2/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b", size = 1789317 }, - { url = "https://files.pythonhosted.org/packages/7a/80/72057580681cdbe55699c367963d9c661b569a1d39338b4f6239faf36cdc/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19", size = 1771949 }, - { url = "https://files.pythonhosted.org/packages/a2/be/d9bbabc55b05019013180f141fcaf3b14dbe15ca7da550e95b60c321009a/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac", size = 1974392 }, - { url = "https://files.pythonhosted.org/packages/79/2d/7bcd938c6afb0f40293283f5f09988b61fb0a4f1d180abe7c23a2f665f8e/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703", size = 2625565 }, - { url = "https://files.pythonhosted.org/packages/ac/88/ca758e979457096008a4b16a064509028e3e092a1e85a5ed6c18ced8da88/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c", size = 2098784 }, - { url = "https://files.pythonhosted.org/packages/eb/de/2fad6d63c3c42e472e985acb12ec45b7f56e42e6f4cd6dfbc5e87ee8678c/pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83", size = 1900198 }, - { url = "https://files.pythonhosted.org/packages/fe/50/077c7f35b6488dc369a6d22993af3a37901e198630f38ac43391ca730f5b/pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203", size = 1968005 }, - { url = "https://files.pythonhosted.org/packages/5d/1f/f378631574ead46d636b9a04a80ff878b9365d4b361b1905ef1667d4182a/pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0", size = 2118920 }, - { url = "https://files.pythonhosted.org/packages/7a/ea/e4943f17df7a3031d709481fe4363d4624ae875a6409aec34c28c9e6cf59/pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e", size = 1717397 }, - { url = "https://files.pythonhosted.org/packages/13/63/b95781763e8d84207025071c0cec16d921c0163c7a9033ae4b9a0e020dc7/pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20", size = 1898013 }, { url = "https://files.pythonhosted.org/packages/73/73/0c7265903f66cce39ed7ca939684fba344210cefc91ccc999cfd5b113fd3/pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906", size = 1828190 }, { url = "https://files.pythonhosted.org/packages/27/55/60b8b0e58b49ee3ed36a18562dd7c6bc06a551c390e387af5872a238f2ec/pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94", size = 1715252 }, { url = "https://files.pythonhosted.org/packages/28/3d/d66314bad6bb777a36559195a007b31e916bd9e2c198f7bb8f4ccdceb4fa/pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f", size = 1782641 }, @@ -4588,6 +4404,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/f3/2f32fe143cd7ba1d4d68f1b6dce9ca402d909cbd5a5830e3a8fa3d1acbbf/pyproj-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:7a27151ddad8e1439ba70c9b4b2b617b290c39395fa9ddb7411ebb0eb86d6fb0", size = 6079779 }, ] +[[package]] +name = "pyreadr" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/9b/732136124fec08851ce846544b3d48e9f109638abd250f6c0311671db636/pyreadr-0.5.2.tar.gz", hash = "sha256:33d5747fe210d41e4a329afef2232c9d1258847094b87a2a96efffbef223fae8", size = 1175696 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/f5/087d0ea21bf31f43f2ca377f5f03b15e43fc406cd7e1fcfc73a9f4fc055e/pyreadr-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab20da5c1b1a547316bd45f0a8984f3c7c26bb548a41c8c606da939766ae3bc9", size = 304689 }, + { url = "https://files.pythonhosted.org/packages/37/36/d394c0bd09c37e24e9a0435989ee1c5fe91470a0faf43475eb7a41493f68/pyreadr-0.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0b445a6ffe09922ade3dc003585a589163a5dbab2d006aebcd2e00c7738e17c0", size = 300820 }, + { url = "https://files.pythonhosted.org/packages/fa/3b/af53ad8bebc3aa9252ccc99d1394fa85c185daa34aac0295a286f58d6f29/pyreadr-0.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5552b17a2e32b885b789a50bfdf895663fb6fc2e0db85351b620a74ece474c6", size = 415788 }, + { url = "https://files.pythonhosted.org/packages/ca/69/0a6abc458561f7f84ee87ac2b872ea4cd355c376822e73ebc7d44ff94536/pyreadr-0.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35967860dace4a736108740b6127abb59c2e25c1b081f426181907666c7f9dac", size = 416973 }, + { url = "https://files.pythonhosted.org/packages/2a/00/9141eb7747cd6a04425f071adfb32226d77094766d9901b856345d832743/pyreadr-0.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:fae6a270842bd5d0d2729ab2ad6bb0125786b0b1023fd3cdc51deedc1d66cb61", size = 1251181 }, + { url = "https://files.pythonhosted.org/packages/cf/47/1f666551444156b18524632fb93da10bbcf9a9cf0cb20faebd1f85512558/pyreadr-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b8fa9c92609e2b925900ba1e5f236a9d38bfd49ad37038e41ac1c7d853fddda", size = 301435 }, + { url = "https://files.pythonhosted.org/packages/9e/7a/f9b6786876cbc016019d7de7fef5ed7a5397fbb986cfa9f10fdbef52ec03/pyreadr-0.5.2-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:49b94459a1ed0003e59861f0ad088dc17f97632e451797b79cbf12fe312e6b6d", size = 305194 }, + { url = "https://files.pythonhosted.org/packages/8b/72/73b2979ee06d58844a4f7206dd96c4927a4406c15645945d69c90e00c968/pyreadr-0.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5698418c4fedcbc0b7600c967a2943a79803d39cf7f13b73999c58815f7a5ebc", size = 414793 }, + { url = "https://files.pythonhosted.org/packages/79/9f/a0e84861e0d0939b71830d30960c9215487d5278d2d89890988035f02b9c/pyreadr-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2af40aa8de034c24cdefd2dfdbf8c21277cf1c27cce063729604e48aa908aba", size = 416025 }, + { url = "https://files.pythonhosted.org/packages/61/c3/a5eb51a2c8d65c78da160618c6d892178aadf3b977928994efe6a27a5f8c/pyreadr-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:82e1a5388d8910eac75e3cd37696851c52175a0b263afaedd570e000d385781c", size = 1251639 }, + { url = "https://files.pythonhosted.org/packages/58/5f/e6c0726bb90c2bb7371d7b68b825c03aaf6bfc89d35b88844a4979de0767/pyreadr-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7750624a6158ba0393c0cbc7f44a169735799862089891408f9a83ece04662bf", size = 300822 }, + { url = "https://files.pythonhosted.org/packages/c0/b0/7e955064875988eb000286e405952f1b0931a366f15303e78abcb8a2256a/pyreadr-0.5.2-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:f0c8feaa26f5f45f91bfc07dbea7334c7c22cfaf3fa923e203f30a5c976eda71", size = 303775 }, + { url = "https://files.pythonhosted.org/packages/8a/74/b9c6b39170e7272ebdb44091dce6ad07181bce465becd22977e85d530b9a/pyreadr-0.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3f200d4bd7dcfa37b9d244f05b3708b7183bb7978c6865a1364f39727021fb0", size = 412713 }, + { url = "https://files.pythonhosted.org/packages/10/54/1cd3de1f08d8f86bf273de23d55a1b25e4dccaae45be116512a7b2cfff0b/pyreadr-0.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa4919beb4cfa9c915e704b41d32d8c40a4f505a7c9bfdfc4930b3b4da5d2b8", size = 413567 }, + { url = "https://files.pythonhosted.org/packages/bb/2b/e16e4acc1bacde128add8ae3596f2cd0d899cb8d304332700827fd18c5f8/pyreadr-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:6bae17a8970b62c2af257ec8c5aad9d759a1bdc2a763e299ff82826d7140afe4", size = 1249250 }, +] + [[package]] name = "pyright" version = "1.1.373" @@ -4785,15 +4627,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, ] [[package]] @@ -4853,27 +4686,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/18/907134c85c7152f679ed744e73e645b365f3ad571f38bdb62e36f347699a/pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", size = 575533 }, { url = "https://files.pythonhosted.org/packages/ce/2c/a6f4a20202a4d3c582ad93f95ee78d79bbdc26803495aec2912b17dbbb6c/pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", size = 637768 }, { url = "https://files.pythonhosted.org/packages/5f/0e/eb16ff731632d30554bf5af4dbba3ffcd04518219d82028aea4ae1b02ca5/pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", size = 540675 }, - { url = "https://files.pythonhosted.org/packages/04/a7/0f7e2f6c126fe6e62dbae0bc93b1bd3f1099cf7fea47a5468defebe3f39d/pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", size = 1006564 }, - { url = "https://files.pythonhosted.org/packages/31/b6/a187165c852c5d49f826a690857684333a6a4a065af0a6015572d2284f6a/pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", size = 1340447 }, - { url = "https://files.pythonhosted.org/packages/68/ba/f4280c58ff71f321602a6e24fd19879b7e79793fb8ab14027027c0fb58ef/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", size = 665485 }, - { url = "https://files.pythonhosted.org/packages/77/b5/c987a5c53c7d8704216f29fc3d810b32f156bcea488a940e330e1bcbb88d/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", size = 903484 }, - { url = "https://files.pythonhosted.org/packages/29/c9/07da157d2db18c72a7eccef8e684cefc155b712a88e3d479d930aa9eceba/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", size = 859981 }, - { url = "https://files.pythonhosted.org/packages/43/09/e12501bd0b8394b7d02c41efd35c537a1988da67fc9c745cae9c6c776d31/pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", size = 860334 }, - { url = "https://files.pythonhosted.org/packages/eb/ff/f5ec1d455f8f7385cc0a8b2acd8c807d7fade875c14c44b85c1bddabae21/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", size = 1196179 }, - { url = "https://files.pythonhosted.org/packages/ec/8a/bb2ac43295b1950fe436a81fc5b298be0b96ac76fb029b514d3ed58f7b27/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", size = 1507668 }, - { url = "https://files.pythonhosted.org/packages/a9/49/dbc284ebcfd2dca23f6349227ff1616a7ee2c4a35fe0a5d6c3deff2b4fed/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", size = 1406539 }, - { url = "https://files.pythonhosted.org/packages/00/68/093cdce3fe31e30a341d8e52a1ad86392e13c57970d722c1f62a1d1a54b6/pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", size = 575567 }, - { url = "https://files.pythonhosted.org/packages/92/ae/6cc4657148143412b5819b05e362ae7dd09fb9fe76e2a539dcff3d0386bc/pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", size = 637551 }, - { url = "https://files.pythonhosted.org/packages/6c/67/fbff102e201688f97c8092e4c3445d1c1068c2f27bbd45a578df97ed5f94/pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", size = 540378 }, - { url = "https://files.pythonhosted.org/packages/3f/fe/2d998380b6e0122c6c4bdf9b6caf490831e5f5e2d08a203b5adff060c226/pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", size = 1007378 }, - { url = "https://files.pythonhosted.org/packages/4a/f4/30d6e7157f12b3a0390bde94d6a8567cdb88846ed068a6e17238a4ccf600/pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", size = 1329532 }, - { url = "https://files.pythonhosted.org/packages/82/86/3fe917870e15ee1c3ad48229a2a64458e36036e64b4afa9659045d82bfa8/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", size = 653242 }, - { url = "https://files.pythonhosted.org/packages/50/2d/242e7e6ef6c8c19e6cb52d095834508cd581ffb925699fd3c640cdc758f1/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", size = 888404 }, - { url = "https://files.pythonhosted.org/packages/ac/11/7270566e1f31e4ea73c81ec821a4b1688fd551009a3d2bab11ec66cb1e8f/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", size = 845858 }, - { url = "https://files.pythonhosted.org/packages/91/d5/72b38fbc69867795c8711bdd735312f9fef1e3d9204e2f63ab57085434b9/pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", size = 847375 }, - { url = "https://files.pythonhosted.org/packages/dd/9a/10ed3c7f72b4c24e719c59359fbadd1a27556a28b36cdf1cd9e4fb7845d5/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", size = 1183489 }, - { url = "https://files.pythonhosted.org/packages/72/2d/8660892543fabf1fe41861efa222455811adac9f3c0818d6c3170a1153e3/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", size = 1492932 }, - { url = "https://files.pythonhosted.org/packages/7b/d6/32fd69744afb53995619bc5effa2a405ae0d343cd3e747d0fbc43fe894ee/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", size = 1392485 }, { url = "https://files.pythonhosted.org/packages/53/fb/36b2b2548286e9444e52fcd198760af99fd89102b5be50f0660fcfe902df/pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072", size = 906955 }, { url = "https://files.pythonhosted.org/packages/77/8f/6ce54f8979a01656e894946db6299e2273fcee21c8e5fa57c6295ef11f57/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1", size = 565701 }, { url = "https://files.pythonhosted.org/packages/ee/1c/bf8cd66730a866b16db8483286078892b7f6536f8c389fb46e4beba0a970/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d", size = 794312 }, @@ -4929,20 +4741,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/ce/647b9c7602ac477c9e62cf9399810f72bb5dba8f508e7cdf8be1d260e6f9/pyzstd-0.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:79b183beae1c080ad3dca39019e49b7785391947f9aab68893ad85d27828c6e7", size = 431373 }, { url = "https://files.pythonhosted.org/packages/8b/fb/4141e3d4549eea26e5a59ec723eade271980816cb2ed7613df855baa672f/pyzstd-0.16.2-cp312-cp312-win32.whl", hash = "sha256:b8d00631a3c466bc313847fab2a01f6b73b3165de0886fb03210e08567ae3a89", size = 218541 }, { url = "https://files.pythonhosted.org/packages/51/b9/e1373b179129c2095d70bd1df02a51d388f4c7e4ecb62acb4e5e9570269b/pyzstd-0.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:c0d43764e9a60607f35d8cb3e60df772a678935ab0e02e2804d4147377f4942c", size = 245320 }, - { url = "https://files.pythonhosted.org/packages/66/10/cc7c764c7673f1af1728abdcf58e58f88ef5d44ab4500677a2b7b4c01e7d/pyzstd-0.16.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3ae9ae7ad730562810912d7ecaf1fff5eaf4c726f4b4dfe04784ed5f06d7b91f", size = 373223 }, - { url = "https://files.pythonhosted.org/packages/3f/a7/bcaf7d635ee929dd4d08ae1c35101892db56a11542471eecfbf46b9dd988/pyzstd-0.16.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2ce8d3c213f76a564420f3d0137066ac007ce9fb4e156b989835caef12b367a7", size = 295701 }, - { url = "https://files.pythonhosted.org/packages/93/49/a604113a2f3135b29371a894c0faad22d7ea3f7b58f38d77baad8a817483/pyzstd-0.16.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2c14dac23c865e2d78cebd9087e148674b7154f633afd4709b4cd1520b99a61", size = 392395 }, - { url = "https://files.pythonhosted.org/packages/b0/38/886ecf3ebb13a4b6e3ee85f448f54eef37a5ae2b453bd9d5d9edc909e119/pyzstd-0.16.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4527969d66a943e36ef374eda847e918077de032d58b5df84d98ffd717b6fa77", size = 474523 }, - { url = "https://files.pythonhosted.org/packages/14/98/121da6ac072c00090c218b4888ef00ead15979f09a657d9a5ff770d6bb17/pyzstd-0.16.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd8256149b88e657e99f31e6d4b114c8ff2935951f1d8bb8e1fe501b224999c0", size = 417974 }, - { url = "https://files.pythonhosted.org/packages/b6/ba/56652a67c0bcfaceb2945e5f07d5aa21af86e07cf33d1ae47bb3529a56c3/pyzstd-0.16.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5bd1f1822d65c9054bf36d35307bf8ed4aa2d2d6827431761a813628ff671b1d", size = 414587 }, - { url = "https://files.pythonhosted.org/packages/cc/30/cab6f45101f0113ced609ef65482aedd276e0f022d9f25a327d4284142f5/pyzstd-0.16.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6733f4d373ec9ad2c1976cf06f973a3324c1f9abe236d114d6bb91165a397d", size = 415071 }, - { url = "https://files.pythonhosted.org/packages/6d/44/2187fc8a46662926943aeb16d639dd4f3d06267c7e8abb2c6f97700ab11c/pyzstd-0.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7bec165ab6524663f00b69bfefd13a46a69fed3015754abaf81b103ec73d92c6", size = 407835 }, - { url = "https://files.pythonhosted.org/packages/de/d5/6edca97d5453cba820d2ad5630e6ec1fcfad66f69af5ad7d6c688ea301be/pyzstd-0.16.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e4460fa6949aac6528a1ad0de8871079600b12b3ef4db49316306786a3598321", size = 421755 }, - { url = "https://files.pythonhosted.org/packages/54/c1/1a0339e014ed97f4e6fd9166b0409ceda8f32e28e8ecda70fd7bb0915566/pyzstd-0.16.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75df79ea0315c97d88337953a17daa44023dbf6389f8151903d371513f503e3c", size = 489174 }, - { url = "https://files.pythonhosted.org/packages/07/01/c65f2c9f0b902b33efcb0bdf3cbd07fc828fda6ff6333189eb71cf7acc60/pyzstd-0.16.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:93e1d45f4a196afb6f18682c79bdd5399277ead105b67f30b35c04c207966071", size = 573025 }, - { url = "https://files.pythonhosted.org/packages/a7/54/7ab9cc54171b7f8bb97cfd1c1aa7fcb706a4babeb629732529d8111bc4e6/pyzstd-0.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:075e18b871f38a503b5d23e40a661adfc750bd4bd0bb8b208c1e290f3ceb8fa2", size = 429582 }, - { url = "https://files.pythonhosted.org/packages/6c/a5/f9c950bb378dd1335bc4cc56444ec2ab40b1dab085c5798c5d16a9bf9d0b/pyzstd-0.16.2-cp313-cp313-win32.whl", hash = "sha256:9e4295eb299f8d87e3487852bca033d30332033272a801ca8130e934475e07a9", size = 218544 }, - { url = "https://files.pythonhosted.org/packages/9a/df/a15b9a8a59cd9908ae2b70bce2cb4ac3e2d7da11414ee0d0ceb46e4d0439/pyzstd-0.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:18deedc70f858f4cf574e59f305d2a0678e54db2751a33dba9f481f91bc71c28", size = 245313 }, { url = "https://files.pythonhosted.org/packages/f9/ad/c09fb722c12a82b826c97efc50a919e229bfbaf644f5a140adcd71941473/pyzstd-0.16.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4b631117b97a42ff6dfd0ffc885a92fff462d7c34766b28383c57b996f863338", size = 364187 }, { url = "https://files.pythonhosted.org/packages/57/f9/93175fe72f85fb675fe04abca296fe583112a25d0ec7faa026288d9463c2/pyzstd-0.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:56493a3fbe1b651a02102dd0902b0aa2377a732ff3544fb6fb3f114ca18db52f", size = 279825 }, { url = "https://files.pythonhosted.org/packages/8a/de/0b40acf76d7ed1f7975877535e004de85ec2e869632754b5d4d389258b8a/pyzstd-0.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1eae9bdba4a1e5d3181331f403114ff5b8ce0f4b569f48eba2b9beb2deef1e4", size = 321313 }, @@ -5078,10 +4876,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/64/6a34c3ba5b1d412d85f399fe761a2c9d2baeb57f8eee6932caf3b6ce1597/rasterio-1.3.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:476be03290bb937b63b14bb4394b1300c828d79cb4acc540fdc5cbdae8af8cf6", size = 18432225 }, { url = "https://files.pythonhosted.org/packages/bd/6b/872012d5f275d1b065878d3ac076c7015248b2d5be6fb63894e9b08efcd2/rasterio-1.3.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:958d7cb4b81ed9bab8167eced60c3b0f4263c9d12dc7cfd395531ed5579baf07", size = 21762272 }, { url = "https://files.pythonhosted.org/packages/30/cc/0192175dd6b213cd38f062ab7b071b31c2764a9f291770311a0b6d50ff0b/rasterio-1.3.11-cp312-cp312-win_amd64.whl", hash = "sha256:5c811f77e20c439195f93367390ec054790b337b51f1ff689691a558976e80c6", size = 24756530 }, - { url = "https://files.pythonhosted.org/packages/dc/ed/2abc91b144a83fd45e5fa596ce0541676e5e2c27280fe6dfbf11e624536c/rasterio-1.3.11-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:18d296abd40d220f062c4459968b77f157aa503a5d1b676d510475fbe9ba1331", size = 20987264 }, - { url = "https://files.pythonhosted.org/packages/b2/94/84a5763bbdb8bfdccf046cbde5b20432fb671d0cf72880b03d4d81fed8ca/rasterio-1.3.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e9ae169dcc497d7bc6e059810ffa74c69c5d1173f62e7b3b1aaf1ce5a9a0a58", size = 18427417 }, - { url = "https://files.pythonhosted.org/packages/20/52/5ee82a9b101d120dd0552ce2dd9b1fc01eff2073c9b3f193f9d6bbd36306/rasterio-1.3.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cd38249e07582c05b333d7b3c2c257852a1a36c347a189ba5d847b2cd130d88", size = 21752036 }, - { url = "https://files.pythonhosted.org/packages/7d/ee/6ecb9661024931c90b329c1fbf5f1aa6951657241eb883927b8d9f71ed44/rasterio-1.3.11-cp313-cp313-win_amd64.whl", hash = "sha256:962315780045dbd37a88d58516d2d73c5d4de7534102677b1c5e4c9b7ff4c5f9", size = 24750886 }, ] [[package]] @@ -5329,19 +5123,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/2d/5536d28c507a4679179ab15aa0049440e4d3dd6752050fa0843ed11e9354/rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174", size = 528807 }, { url = "https://files.pythonhosted.org/packages/e3/62/7ebe6ec0d3dd6130921f8cffb7e34afb7f71b3819aa0446a24c5e81245ec/rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139", size = 200993 }, { url = "https://files.pythonhosted.org/packages/ec/2f/b938864d66b86a6e4acadefdc56de75ef56f7cafdfd568a6464605457bd5/rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585", size = 214458 }, - { url = "https://files.pythonhosted.org/packages/99/32/43b919a0a423c270a838ac2726b1c7168b946f2563fd99a51aaa9692d00f/rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29", size = 321465 }, - { url = "https://files.pythonhosted.org/packages/58/a9/c4d899cb28e9e47b0ff12462e8f827381f243176036f17bef9c1604667f2/rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91", size = 312900 }, - { url = "https://files.pythonhosted.org/packages/8f/90/9e51670575b5dfaa8c823369ef7d943087bfb73d4f124a99ad6ef19a2b26/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24", size = 370973 }, - { url = "https://files.pythonhosted.org/packages/fc/c1/523f2a03f853fc0d4c1acbef161747e9ab7df0a8abf6236106e333540921/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7", size = 370890 }, - { url = "https://files.pythonhosted.org/packages/51/ca/2458a771f16b0931de4d384decbe43016710bc948036c8f4562d6e063437/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9", size = 397174 }, - { url = "https://files.pythonhosted.org/packages/00/7d/6e06807f6305ea2408b364efb0eef83a6e21b5e7b5267ad6b473b9a7e416/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8", size = 426449 }, - { url = "https://files.pythonhosted.org/packages/8c/d1/6c9e65260a819a1714510a7d69ac1d68aa23ee9ce8a2d9da12187263c8fc/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879", size = 357698 }, - { url = "https://files.pythonhosted.org/packages/5d/fb/ecea8b5286d2f03eec922be7173a03ed17278944f7c124348f535116db15/rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f", size = 378530 }, - { url = "https://files.pythonhosted.org/packages/e3/e3/ac72f858957f52a109c588589b73bd2fad4a0fc82387fb55fb34aeb0f9cd/rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c", size = 545753 }, - { url = "https://files.pythonhosted.org/packages/b2/a4/a27683b519d5fc98e4390a3b130117d80fd475c67aeda8aac83c0e8e326a/rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2", size = 552443 }, - { url = "https://files.pythonhosted.org/packages/a1/ed/c074d248409b4432b1ccb2056974175fa0af2d1bc1f9c21121f80a358fa3/rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57", size = 528380 }, - { url = "https://files.pythonhosted.org/packages/d5/bd/04caf938895d2d78201e89c0c8a94dfd9990c34a19ff52fb01d0912343e3/rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a", size = 200540 }, - { url = "https://files.pythonhosted.org/packages/95/cc/109eb8b9863680411ae703664abacaa035820c7755acc9686d5dd02cdd2e/rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2", size = 214111 }, { url = "https://files.pythonhosted.org/packages/06/39/bf1f664c347c946ef56cecaa896e3693d91acc741afa78ebb3fdb7aba08b/rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045", size = 319444 }, { url = "https://files.pythonhosted.org/packages/c1/71/876135d3cb90d62468540b84e8e83ff4dc92052ab309bfdea7ea0b9221ad/rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc", size = 311699 }, { url = "https://files.pythonhosted.org/packages/f7/da/8ccaeba6a3dda7467aebaf893de9eafd56275e2c90773c83bf15fb0b8374/rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02", size = 367825 }, @@ -5490,16 +5271,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/22/4d/b6208d918e83daa84b424c0ac3191ae61b44b3191613a3a5a7b38f94b8ad/safetensors-0.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a6ba28118636a130ccbb968bc33d4684c48678695dba2590169d5ab03a45646", size = 605390 }, { url = "https://files.pythonhosted.org/packages/e8/20/bf0e01825dc01ed75538021a98b9a046e60ead63c6c6700764c821a8c873/safetensors-0.4.5-cp312-none-win32.whl", hash = "sha256:c859c7ed90b0047f58ee27751c8e56951452ed36a67afee1b0a87847d065eec6", size = 273250 }, { url = "https://files.pythonhosted.org/packages/f1/5f/ab6b6cec85b40789801f35b7d2fb579ae242d8193929974a106d5ff5c835/safetensors-0.4.5-cp312-none-win_amd64.whl", hash = "sha256:b5a8810ad6a6f933fff6c276eae92c1da217b39b4d8b1bc1c0b8af2d270dc532", size = 286307 }, - { url = "https://files.pythonhosted.org/packages/90/61/0e27b1403e311cba0be20026bee4ee822d90eda7dad372179e7f18bb99f3/safetensors-0.4.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:25e5f8e2e92a74f05b4ca55686234c32aac19927903792b30ee6d7bd5653d54e", size = 392062 }, - { url = "https://files.pythonhosted.org/packages/b1/9f/cc31fafc9f5d79da10a83a820ca37f069bab0717895ad8cbcacf629dd1c5/safetensors-0.4.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:81efb124b58af39fcd684254c645e35692fea81c51627259cdf6d67ff4458916", size = 382517 }, - { url = "https://files.pythonhosted.org/packages/a4/c7/4fda8a0ebb96662550433378f4a74c677fa5fc4d0a43a7ec287d1df254a9/safetensors-0.4.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:585f1703a518b437f5103aa9cf70e9bd437cb78eea9c51024329e4fb8a3e3679", size = 441378 }, - { url = "https://files.pythonhosted.org/packages/14/31/9abb431f6209de9c80dab83e1112ebd769f1e32e7ab7ab228a02424a4693/safetensors-0.4.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b99fbf72e3faf0b2f5f16e5e3458b93b7d0a83984fe8d5364c60aa169f2da89", size = 438831 }, - { url = "https://files.pythonhosted.org/packages/37/37/99bfb195578a808b8d045159ee9264f8da58d017ac0701853dcacda14d4e/safetensors-0.4.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b17b299ca9966ca983ecda1c0791a3f07f9ca6ab5ded8ef3d283fff45f6bcd5f", size = 477112 }, - { url = "https://files.pythonhosted.org/packages/7d/05/fac3ef107e60d2a78532bed171a91669d4bb259e1236f5ea8c67a6976c75/safetensors-0.4.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76ded72f69209c9780fdb23ea89e56d35c54ae6abcdec67ccb22af8e696e449a", size = 493373 }, - { url = "https://files.pythonhosted.org/packages/cf/7a/825800ee8c68214b4fd3506d5e19209338c69b41e01c6e14dd13969cc8b9/safetensors-0.4.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2783956926303dcfeb1de91a4d1204cd4089ab441e622e7caee0642281109db3", size = 435422 }, - { url = "https://files.pythonhosted.org/packages/5e/6c/7a3233c08bde558d6c33a41219119866cb596139a4673cc6c24024710ffd/safetensors-0.4.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d94581aab8c6b204def4d7320f07534d6ee34cd4855688004a4354e63b639a35", size = 457382 }, - { url = "https://files.pythonhosted.org/packages/a0/58/0b7bcba3788ff503990cf9278d611b56c029400612ba93e772c987b5aa03/safetensors-0.4.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:67e1e7cb8678bb1b37ac48ec0df04faf689e2f4e9e81e566b5c63d9f23748523", size = 619301 }, - { url = "https://files.pythonhosted.org/packages/82/cc/9c2cf58611daf1c83ce5d37f9de66353e23fcda36008b13fd3409a760aa3/safetensors-0.4.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:dbd280b07e6054ea68b0cb4b16ad9703e7d63cd6890f577cb98acc5354780142", size = 605580 }, { url = "https://files.pythonhosted.org/packages/cf/ff/037ae4c0ee32db496669365e66079b6329906c6814722b159aa700e67208/safetensors-0.4.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdadf66b5a22ceb645d5435a0be7a0292ce59648ca1d46b352f13cff3ea80410", size = 392951 }, { url = "https://files.pythonhosted.org/packages/f1/d6/6621e16b35bf83ae099eaab07338f04991a26c9aa43879d05f19f35e149c/safetensors-0.4.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d42ffd4c2259f31832cb17ff866c111684c87bd930892a1ba53fed28370c918c", size = 383417 }, { url = "https://files.pythonhosted.org/packages/ae/88/3068e1bb16f5e9f9068901de3cf7b3db270b9bfe6e7d51d4b55c1da0425d/safetensors-0.4.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd8a1f6d2063a92cd04145c7fd9e31a1c7d85fbec20113a14b487563fdbc0597", size = 442311 }, @@ -5536,11 +5307,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a1/32/4a7a205b14c11225609b75b28402c196e4396ac754dab6a81971b811781c/scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd", size = 12085794 }, { url = "https://files.pythonhosted.org/packages/c6/29/044048c5e911373827c0e1d3051321b9183b2a4f8d4e2f11c08fcff83f13/scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6", size = 12945797 }, { url = "https://files.pythonhosted.org/packages/aa/ce/c0b912f2f31aeb1b756a6ba56bcd84dd1f8a148470526a48515a3f4d48cd/scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1", size = 10985467 }, - { url = "https://files.pythonhosted.org/packages/a4/50/8891028437858cc510e13578fe7046574a60c2aaaa92b02d64aac5b1b412/scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5", size = 12025584 }, - { url = "https://files.pythonhosted.org/packages/d2/79/17feef8a1c14149436083bec0e61d7befb4812e272d5b20f9d79ea3e9ab1/scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908", size = 10959795 }, - { url = "https://files.pythonhosted.org/packages/b1/c8/f08313f9e2e656bd0905930ae8bf99a573ea21c34666a813b749c338202f/scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3", size = 12077302 }, - { url = "https://files.pythonhosted.org/packages/a7/48/fbfb4dc72bed0fe31fe045fb30e924909ad03f717c36694351612973b1a9/scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12", size = 13002811 }, - { url = "https://files.pythonhosted.org/packages/a5/e7/0c869f9e60d225a77af90d2aefa7a4a4c0e745b149325d1450f0f0ce5399/scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f", size = 10951354 }, ] [[package]] @@ -5927,12 +5693,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/e1/60a652f18996a40a7410aeb7eb476c18da8a39792c7effe67f06883e9852/statsmodels-0.14.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bbb150620b53133d6cd1c5d14c28a4f85701e6c781d9b689b53681effaa655f", size = 10741763 }, { url = "https://files.pythonhosted.org/packages/81/0c/2453eec3ac25e300847d9ed97f41156de145e507391ecb5ac989e111e525/statsmodels-0.14.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb695c2025d122a101c2aca66d2b78813c321b60d3a7c86bb8ec4467bb53b0f9", size = 10879534 }, { url = "https://files.pythonhosted.org/packages/59/9a/e466a1b887a1441141e52dbcc98152f013d85076576da6eed2357f2016ae/statsmodels-0.14.4-cp312-cp312-win_amd64.whl", hash = "sha256:7f7917a51766b4e074da283c507a25048ad29a18e527207883d73535e0dc6184", size = 9823866 }, - { url = "https://files.pythonhosted.org/packages/31/f8/2662e6a101315ad336f75168fa9bac71f913ebcb92a6be84031d84a0f21f/statsmodels-0.14.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5a24f5d2c22852d807d2b42daf3a61740820b28d8381daaf59dcb7055bf1a79", size = 10186886 }, - { url = "https://files.pythonhosted.org/packages/fa/c0/ee6e8ed35fc1ca9c7538c592f4974547bf72274bc98db1ae4a6e87481a83/statsmodels-0.14.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df4f7864606fa843d7e7c0e6af288f034a2160dba14e6ccc09020a3cf67cb092", size = 9880066 }, - { url = "https://files.pythonhosted.org/packages/d1/97/3380ca6d8fd66cfb3d12941e472642f26e781a311c355a4e97aab2ed0216/statsmodels-0.14.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91341cbde9e8bea5fb419a76e09114e221567d03f34ca26e6d67ae2c27d8fe3c", size = 10283521 }, - { url = "https://files.pythonhosted.org/packages/fe/2a/55c5b5c5e5124a202ea3fe0bcdbdeceaf91b4ec6164b8434acb9dd97409c/statsmodels-0.14.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1322286a7bfdde2790bf72d29698a1b76c20b8423a55bdcd0d457969d0041f72", size = 10723228 }, - { url = "https://files.pythonhosted.org/packages/4f/76/67747e49dc758daae06f33aad8247b718cd7d224f091d2cd552681215bb2/statsmodels-0.14.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e31b95ac603415887c9f0d344cb523889cf779bc52d68e27e2d23c358958fec7", size = 10859503 }, - { url = "https://files.pythonhosted.org/packages/1d/eb/cb8b01f5edf8f135eb3d0553d159db113a35b2948d0e51eeb735e7ae09ea/statsmodels-0.14.4-cp313-cp313-win_amd64.whl", hash = "sha256:81030108d27aecc7995cac05aa280cf8c6025f6a6119894eef648997936c2dd0", size = 9817574 }, ] [[package]] @@ -6320,16 +6080,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/aa/66e8a81e07a791ca6ee9d74ee6de1ffbcd3985149f13aeb530bd409baba0/tokenizers-0.15.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a308a607ca9de2c64c1b9ba79ec9a403969715a1b8ba5f998a676826f1a7039d", size = 9995614 }, { url = "https://files.pythonhosted.org/packages/bf/e1/aed3bc98785c54bd26bf6dd3d2f54cc00de33e8b1f922a23131372eedec8/tokenizers-0.15.2-cp312-none-win32.whl", hash = "sha256:b8fcfa81bcb9447df582c5bc96a031e6df4da2a774b8080d4f02c0c16b42be0b", size = 2011030 }, { url = "https://files.pythonhosted.org/packages/c9/ea/5800f4941a713b2feed955b6a256aacc1ca68a6699916d2668622c075d38/tokenizers-0.15.2-cp312-none-win_amd64.whl", hash = "sha256:38d7ab43c6825abfc0b661d95f39c7f8af2449364f01d331f3b51c94dcff7221", size = 2180523 }, - { url = "https://files.pythonhosted.org/packages/6d/04/406f35822d785ccdcd740f95ba58515c739b6d57c05dd278ee64c70d1565/tokenizers-0.15.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:38bfb0204ff3246ca4d5e726e8cc8403bfc931090151e6eede54d0e0cf162ef0", size = 2574496 }, - { url = "https://files.pythonhosted.org/packages/6c/b4/6cc305767c9b1b97b8f5bc61fc472abf42b24ad39388e8f0c57250a7c145/tokenizers-0.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c861d35e8286a53e06e9e28d030b5a05bcbf5ac9d7229e561e53c352a85b1fc", size = 2411609 }, - { url = "https://files.pythonhosted.org/packages/6b/6c/ae2437a3e233298a962053c62b943ffabb38627fd6787ff8da62352333fa/tokenizers-0.15.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:936bf3842db5b2048eaa53dade907b1160f318e7c90c74bfab86f1e47720bdd6", size = 3652369 }, - { url = "https://files.pythonhosted.org/packages/00/8b/21600349146d9fa4d341c507faf8d11b7292b7f29f8def440b81e65ad1ee/tokenizers-0.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:620beacc3373277700d0e27718aa8b25f7b383eb8001fba94ee00aeea1459d89", size = 3529510 }, - { url = "https://files.pythonhosted.org/packages/53/cd/6ffc60fbc5eae02629d736d578a7c5ca5c20b2b84e9866d61a0c6395684a/tokenizers-0.15.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2735ecbbf37e52db4ea970e539fd2d450d213517b77745114f92867f3fc246eb", size = 3396516 }, - { url = "https://files.pythonhosted.org/packages/d5/4c/15b66eb6a47dc9345192aa77988655830c1ebd1306d2b894ecd28fbfbbca/tokenizers-0.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:473c83c5e2359bb81b0b6fde870b41b2764fcdd36d997485e07e72cc3a62264a", size = 3918812 }, - { url = "https://files.pythonhosted.org/packages/ed/3b/f9df83311475e456473958cce65a3709f07a1d1dd8ed046d4779ec4336c8/tokenizers-0.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968fa1fb3c27398b28a4eca1cbd1e19355c4d3a6007f7398d48826bbe3a0f728", size = 4025495 }, - { url = "https://files.pythonhosted.org/packages/36/ee/2055fbeb590719393d29cea3016491fd3a6da10598541bff256cc3750349/tokenizers-0.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:865c60ae6eaebdde7da66191ee9b7db52e542ed8ee9d2c653b6d190a9351b980", size = 3575316 }, - { url = "https://files.pythonhosted.org/packages/93/53/ae4e5e49bdc61849b668263a1a4c398b4e33aea1bb9b0a59c9677bb5266b/tokenizers-0.15.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7c0d8b52664ab2d4a8d6686eb5effc68b78608a9008f086a122a7b2996befbab", size = 9682779 }, - { url = "https://files.pythonhosted.org/packages/04/c6/8818b867611734889cd8faca1153ec5dbdd59c98e85e5f6980e7be338839/tokenizers-0.15.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f33dfbdec3784093a9aebb3680d1f91336c56d86cc70ddf88708251da1fe9064", size = 9995614 }, { url = "https://files.pythonhosted.org/packages/a5/2c/9c2f7a0601cccc8cf169006873ed7775ad76804e98b7236d1f345faf69f8/tokenizers-0.15.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9b648a58281c4672212fab04e60648fde574877d0139cd4b4f93fe28ca8944", size = 2576142 }, { url = "https://files.pythonhosted.org/packages/2e/4f/93ccada67079065f892a2c4e7159caf0ce65084fdf60253815ca964403af/tokenizers-0.15.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7c7d18b733be6bbca8a55084027f7be428c947ddf871c500ee603e375013ffba", size = 2412714 }, { url = "https://files.pythonhosted.org/packages/fd/8f/1dbeaf8b2a2c00e5172d8ed000fba94edb1d424fd50dcbdcc755fbf3c0aa/tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:13ca3611de8d9ddfbc4dc39ef54ab1d2d4aaa114ac8727dfdc6a6ec4be017378", size = 3646249 }, @@ -6840,18 +6590,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/44/81/1f701323a9f70805bc81c74c990137123344a80ea23ab9504a99492907f8/watchfiles-0.24.0-cp312-none-win32.whl", hash = "sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444", size = 264109 }, { url = "https://files.pythonhosted.org/packages/b4/0b/32cde5bc2ebd9f351be326837c61bdeb05ad652b793f25c91cac0b48a60b/watchfiles-0.24.0-cp312-none-win_amd64.whl", hash = "sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896", size = 277055 }, { url = "https://files.pythonhosted.org/packages/4b/81/daade76ce33d21dbec7a15afd7479de8db786e5f7b7d249263b4ea174e08/watchfiles-0.24.0-cp312-none-win_arm64.whl", hash = "sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418", size = 266169 }, - { url = "https://files.pythonhosted.org/packages/30/dc/6e9f5447ae14f645532468a84323a942996d74d5e817837a5c8ce9d16c69/watchfiles-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48", size = 373764 }, - { url = "https://files.pythonhosted.org/packages/79/c0/c3a9929c372816c7fc87d8149bd722608ea58dc0986d3ef7564c79ad7112/watchfiles-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90", size = 367873 }, - { url = "https://files.pythonhosted.org/packages/2e/11/ff9a4445a7cfc1c98caf99042df38964af12eed47d496dd5d0d90417349f/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94", size = 438381 }, - { url = "https://files.pythonhosted.org/packages/48/a3/763ba18c98211d7bb6c0f417b2d7946d346cdc359d585cc28a17b48e964b/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e", size = 432809 }, - { url = "https://files.pythonhosted.org/packages/30/4c/616c111b9d40eea2547489abaf4ffc84511e86888a166d3a4522c2ba44b5/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827", size = 451801 }, - { url = "https://files.pythonhosted.org/packages/b6/be/d7da83307863a422abbfeb12903a76e43200c90ebe5d6afd6a59d158edea/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df", size = 468886 }, - { url = "https://files.pythonhosted.org/packages/1d/d3/3dfe131ee59d5e90b932cf56aba5c996309d94dafe3d02d204364c23461c/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab", size = 472973 }, - { url = "https://files.pythonhosted.org/packages/42/6c/279288cc5653a289290d183b60a6d80e05f439d5bfdfaf2d113738d0f932/watchfiles-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f", size = 425282 }, - { url = "https://files.pythonhosted.org/packages/d6/d7/58afe5e85217e845edf26d8780c2d2d2ae77675eeb8d1b8b8121d799ce52/watchfiles-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b", size = 612540 }, - { url = "https://files.pythonhosted.org/packages/6d/d5/b96eeb9fe3fda137200dd2f31553670cbc731b1e13164fd69b49870b76ec/watchfiles-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18", size = 593625 }, - { url = "https://files.pythonhosted.org/packages/c1/e5/c326fe52ee0054107267608d8cea275e80be4455b6079491dfd9da29f46f/watchfiles-0.24.0-cp313-none-win32.whl", hash = "sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07", size = 263899 }, - { url = "https://files.pythonhosted.org/packages/a6/8b/8a7755c5e7221bb35fe4af2dc44db9174f90ebf0344fd5e9b1e8b42d381e/watchfiles-0.24.0-cp313-none-win_amd64.whl", hash = "sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366", size = 276622 }, { url = "https://files.pythonhosted.org/packages/df/94/1ad200e937ec91b2a9d6b39ae1cf9c2b1a9cc88d5ceb43aa5c6962eb3c11/watchfiles-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:632676574429bee8c26be8af52af20e0c718cc7f5f67f3fb658c71928ccd4f7f", size = 376986 }, { url = "https://files.pythonhosted.org/packages/ee/fd/d9e020d687ccf90fe95efc513fbb39a8049cf5a3ff51f53c59fcf4c47a5d/watchfiles-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a2a9891723a735d3e2540651184be6fd5b96880c08ffe1a98bae5017e65b544b", size = 369445 }, { url = "https://files.pythonhosted.org/packages/43/cb/c0279b35053555d10ef03559c5aebfcb0c703d9c70a7b4e532df74b9b0e8/watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fa2bc0efef3e209a8199fd111b8969fe9db9c711acc46636686331eda7dd4", size = 439383 }, @@ -6956,17 +6694,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9b/47/20af68a313b6453d2d094ccc497b7232e8475175d234e3e5bef5088521e5/websockets-13.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9bbc525f4be3e51b89b2a700f5746c2a6907d2e2ef4513a8daafc98198b92237", size = 157818 }, { url = "https://files.pythonhosted.org/packages/f8/bb/60aaedc80e388e978617dda1ff38788780c6b0f6e462b85368cb934131a5/websockets-13.0.1-cp312-cp312-win32.whl", hash = "sha256:3624fd8664f2577cf8de996db3250662e259bfbc870dd8ebdcf5d7c6ac0b5185", size = 151785 }, { url = "https://files.pythonhosted.org/packages/16/2e/e47692f569e1be2e66c1dbc5e85ea4d2cc93b80027fbafa28ae8b0dee52c/websockets-13.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0513c727fb8adffa6d9bf4a4463b2bade0186cbd8c3604ae5540fae18a90cb99", size = 152214 }, - { url = "https://files.pythonhosted.org/packages/46/37/d8ef4b68684d1fa368a5c64be466db07fc58b68163bc2496db2d4cc208ff/websockets-13.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1ee4cc030a4bdab482a37462dbf3ffb7e09334d01dd37d1063be1136a0d825fa", size = 150962 }, - { url = "https://files.pythonhosted.org/packages/95/49/78aeb3af08ec9887a9065e85cef9d7e199d6c6261fcd39eec087f3a62328/websockets-13.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbb0b697cc0655719522406c059eae233abaa3243821cfdfab1215d02ac10231", size = 148621 }, - { url = "https://files.pythonhosted.org/packages/31/0d/dc9b7cec8deaee452092a631ccda894bd7098859f71dd7639b4b5b9c615c/websockets-13.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:acbebec8cb3d4df6e2488fbf34702cbc37fc39ac7abf9449392cefb3305562e9", size = 148853 }, - { url = "https://files.pythonhosted.org/packages/16/bf/734cbd815d7bc94cffe35c934f4e08b619bf3b47df1c6c7af21c1d35bcfe/websockets-13.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63848cdb6fcc0bf09d4a155464c46c64ffdb5807ede4fb251da2c2692559ce75", size = 158741 }, - { url = "https://files.pythonhosted.org/packages/af/9b/756f89b12fee8931785531a314e6f087b21774a7f8c60878e597c684f91b/websockets-13.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:872afa52a9f4c414d6955c365b6588bc4401272c629ff8321a55f44e3f62b553", size = 157690 }, - { url = "https://files.pythonhosted.org/packages/d3/37/31f97132d2262e666b797e250879ca833eab55115f88043b3952a2840eb8/websockets-13.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e70fec7c54aad4d71eae8e8cab50525e899791fc389ec6f77b95312e4e9920", size = 158132 }, - { url = "https://files.pythonhosted.org/packages/41/ce/59c8d44e148c002fec506a9527504fb4281676e2e75c2ee5a58180f1b99a/websockets-13.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e82db3756ccb66266504f5a3de05ac6b32f287faacff72462612120074103329", size = 158490 }, - { url = "https://files.pythonhosted.org/packages/1a/74/5b31ce0f318b902c0d70c031f8e1228ba1a4d95a46b2a24a2a5ac17f9cf0/websockets-13.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4e85f46ce287f5c52438bb3703d86162263afccf034a5ef13dbe4318e98d86e7", size = 157879 }, - { url = "https://files.pythonhosted.org/packages/0d/a7/6eac4f04177644bbc98deb98d11770cc7fbc216f6f67ab187c150540fd52/websockets-13.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3fea72e4e6edb983908f0db373ae0732b275628901d909c382aae3b592589f2", size = 157873 }, - { url = "https://files.pythonhosted.org/packages/72/f6/b8b30a3b134dfdb4ccd1694befa48fddd43783957c988a1dab175732af33/websockets-13.0.1-cp313-cp313-win32.whl", hash = "sha256:254ecf35572fca01a9f789a1d0f543898e222f7b69ecd7d5381d8d8047627bdb", size = 151782 }, - { url = "https://files.pythonhosted.org/packages/3e/88/d94ccc006c69583168aa9dd73b3f1885c8931f2c676f4bdd8cbfae91c7b6/websockets-13.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca48914cdd9f2ccd94deab5bcb5ac98025a5ddce98881e5cce762854a5de330b", size = 152212 }, { url = "https://files.pythonhosted.org/packages/ae/d8/9d0e5c836f89147aa769b72e2d82217ae1c17ffd5f375de8d785e1e16870/websockets-13.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:faef9ec6354fe4f9a2c0bbb52fb1ff852effc897e2a4501e25eb3a47cb0a4f89", size = 148629 }, { url = "https://files.pythonhosted.org/packages/9c/ff/005a440db101d298b42cc7565579ed55a7e12ccc0c6ea0491e53bb073930/websockets-13.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:03d3f9ba172e0a53e37fa4e636b86cc60c3ab2cfee4935e66ed1d7acaa4625ad", size = 148863 }, { url = "https://files.pythonhosted.org/packages/9f/06/44d7c7d48e0beaecbacaf0020eafccd490741e496622da6b2a5626fe6689/websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d450f5a7a35662a9b91a64aefa852f0c0308ee256122f5218a42f1d13577d71e", size = 150226 }, @@ -7139,21 +6866,5 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/40/19/09ce976c624c9d3cc898f0be5035ddef0c0759d85b2313321cfe77b69915/yarl-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1a3297b9cad594e1ff0c040d2881d7d3a74124a3c73e00c3c71526a1234a9f7", size = 357599 }, { url = "https://files.pythonhosted.org/packages/7d/35/6f33fd29791af2ec161aebe8abe63e788c2b74a6c7e8f29c92e5f5e96849/yarl-1.18.0-cp312-cp312-win32.whl", hash = "sha256:cd6ab7d6776c186f544f893b45ee0c883542b35e8a493db74665d2e594d3ca75", size = 83832 }, { url = "https://files.pythonhosted.org/packages/4e/8e/cdb40ef98597be107de67b11e2f1f23f911e0f1416b938885d17a338e304/yarl-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:039c299a0864d1f43c3e31570045635034ea7021db41bf4842693a72aca8df3a", size = 90132 }, - { url = "https://files.pythonhosted.org/packages/2b/77/2196b657c66f97adaef0244e9e015f30eac0df59c31ad540f79ce328feed/yarl-1.18.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6fb64dd45453225f57d82c4764818d7a205ee31ce193e9f0086e493916bd4f72", size = 140512 }, - { url = "https://files.pythonhosted.org/packages/0e/d8/2bb6e26fddba5c01bad284e4571178c651b97e8e06318efcaa16e07eb9fd/yarl-1.18.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3adaaf9c6b1b4fc258584f4443f24d775a2086aee82d1387e48a8b4f3d6aecf6", size = 93875 }, - { url = "https://files.pythonhosted.org/packages/54/e4/99fbb884dd9f814fb0037dc1783766bb9edcd57b32a76f3ec5ac5c5772d7/yarl-1.18.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:da206d1ec78438a563c5429ab808a2b23ad7bc025c8adbf08540dde202be37d5", size = 91705 }, - { url = "https://files.pythonhosted.org/packages/3b/a2/5bd86eca9449e6b15d3b08005cf4e58e3da972240c2bee427b358c311549/yarl-1.18.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:576d258b21c1db4c6449b1c572c75d03f16a482eb380be8003682bdbe7db2f28", size = 333325 }, - { url = "https://files.pythonhosted.org/packages/94/50/a218da5f159cd985685bc72c500bb1a7fd2d60035d2339b8a9d9e1f99194/yarl-1.18.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c60e547c0a375c4bfcdd60eef82e7e0e8698bf84c239d715f5c1278a73050393", size = 344121 }, - { url = "https://files.pythonhosted.org/packages/a4/e3/830ae465811198b4b5ebecd674b5b3dca4d222af2155eb2144bfe190bbb8/yarl-1.18.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3818eabaefb90adeb5e0f62f047310079d426387991106d4fbf3519eec7d90a", size = 345163 }, - { url = "https://files.pythonhosted.org/packages/7a/74/05c4326877ca541eee77b1ef74b7ac8081343d3957af8f9291ca6eca6fec/yarl-1.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5f72421246c21af6a92fbc8c13b6d4c5427dfd949049b937c3b731f2f9076bd", size = 339130 }, - { url = "https://files.pythonhosted.org/packages/29/42/842f35aa1dae25d132119ee92185e8c75d8b9b7c83346506bd31e9fa217f/yarl-1.18.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa7d37f2ada0f42e0723632993ed422f2a679af0e200874d9d861720a54f53e", size = 326418 }, - { url = "https://files.pythonhosted.org/packages/f9/ed/65c0514f2d1e8b92a61f564c914381d078766cab38b5fbde355b3b3af1fb/yarl-1.18.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:42ba84e2ac26a3f252715f8ec17e6fdc0cbf95b9617c5367579fafcd7fba50eb", size = 345204 }, - { url = "https://files.pythonhosted.org/packages/23/31/351f64f0530c372fa01160f38330f44478e7bf3092f5ce2bfcb91605561d/yarl-1.18.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6a49ad0102c0f0ba839628d0bf45973c86ce7b590cdedf7540d5b1833ddc6f00", size = 341652 }, - { url = "https://files.pythonhosted.org/packages/49/aa/0c6e666c218d567727c1d040d01575685e7f9b18052fd68a59c9f61fe5d9/yarl-1.18.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:96404e8d5e1bbe36bdaa84ef89dc36f0e75939e060ca5cd45451aba01db02902", size = 347257 }, - { url = "https://files.pythonhosted.org/packages/36/0b/33a093b0e13bb8cd0f27301779661ff325270b6644929001f8f33307357d/yarl-1.18.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a0509475d714df8f6d498935b3f307cd122c4ca76f7d426c7e1bb791bcd87eda", size = 359735 }, - { url = "https://files.pythonhosted.org/packages/a8/92/dcc0b37c48632e71ffc2b5f8b0509347a0bde55ab5862ff755dce9dd56c4/yarl-1.18.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ff116f0285b5c8b3b9a2680aeca29a858b3b9e0402fc79fd850b32c2bcb9f8b", size = 365982 }, - { url = "https://files.pythonhosted.org/packages/0e/39/30e2a24a7a6c628dccb13eb6c4a03db5f6cd1eb2c6cda56a61ddef764c11/yarl-1.18.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2580c1d7e66e6d29d6e11855e3b1c6381971e0edd9a5066e6c14d79bc8967af", size = 360128 }, - { url = "https://files.pythonhosted.org/packages/76/13/12b65dca23b1fb8ae44269a4d24048fd32ac90b445c985b0a46fdfa30cfe/yarl-1.18.0-cp313-cp313-win32.whl", hash = "sha256:14408cc4d34e202caba7b5ac9cc84700e3421a9e2d1b157d744d101b061a4a88", size = 309888 }, - { url = "https://files.pythonhosted.org/packages/f6/60/478d3d41a4bf0b9e7dca74d870d114e775d1ff7156b7d1e0e9972e8f97fd/yarl-1.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:1db1537e9cb846eb0ff206eac667f627794be8b71368c1ab3207ec7b6f8c5afc", size = 315459 }, { url = "https://files.pythonhosted.org/packages/30/9c/3f7ab894a37b1520291247cbc9ea6756228d098dae5b37eec848d404a204/yarl-1.18.0-py3-none-any.whl", hash = "sha256:dbf53db46f7cf176ee01d8d98c39381440776fcda13779d269a8ba664f69bec0", size = 44840 }, ]