import tempfile
import pandas as pd
import geopandas as gpd
import pyogrio
import httpx
with tempfile.TemporaryDirectory() as tmpdirname:
with open(tmpdirname + "/data.csv", "wb") as f:
= httpx.get("https://www.czso.cz/documents/62353418/205988586/sldb2021_vzdelani_vek2_pohlavi.csv/5d7a6d5c-a7b1-468f-aa48-80560fbce267?version=1.1")
r
f.write(r.content)= pd.read_csv(tmpdirname + "/data.csv") edu_age_sex
"pohlavi_txt"] = edu_age_sex["pohlavi_txt"].fillna("both") edu_age_sex[
= edu_age_sex[edu_age_sex.uzemi_typ == "obec"] obce
= obce.set_index(["uzemi_kod", "vzdelani_txt", "vek_txt", "pohlavi_txt"])["hodnota"]
vals vals
uzemi_kod vzdelani_txt vek_txt pohlavi_txt
500011 Bez vzdělání 15 - 64 let both 6
muž 4
žena 2
65 a více let both 3
muž 2
..
599999 Nezjištěno 15 - 64 let muž 38
žena 13
65 a více let both 21
muž 10
žena 11
Name: hodnota, Length: 525336, dtype: int64
= vals[:, :, :, "both"].groupby(level=0).sum()
total_population = vals[:, :, :, "both"].groupby(level=[0, 1]).sum().unstack() by_edu
= by_edu.div(total_population, axis=0) * 100 proportions
= "https://vdp.cuzk.cz/vymenny_format/soucasna/20230930_ST_UZSZ.xml.zip" uzsz_url
pyogrio.list_layers(uzsz_url)
array([['Staty', 'Point'],
['RegionySoudrznosti', 'Point'],
['Kraje', 'Point'],
['Vusc', 'Point'],
['Okresy', 'Point'],
['Orp', 'MultiPoint'],
['Pou', 'MultiPoint'],
['Obce', 'MultiPoint'],
['SpravniObvody', 'Point'],
['Mop', 'Point'],
['Momc', 'Point'],
['CastiObci', 'Point'],
['KatastralniUzemi', 'MultiPoint'],
['Zsj', 'MultiPoint']], dtype=object)
= gpd.read_file(uzsz_url, layer="Obce") obce
= obce.set_index("Kod")["OkresKod"].rename_axis(index="uzemi_kod")
obec_to_okres obec_to_okres
uzemi_kod
569151 3601.0
569291 3601.0
569330 3811.0
569402 3601.0
569615 3601.0
...
551503 3301.0
530166 3201.0
548235 3304.0
550159 3306.0
530611 3201.0
Name: OkresKod, Length: 6258, dtype: float64
= gpd.read_file(uzsz_url, layer="Okresy") okresy
= obec_to_okres.map(dict(zip(okresy.Kod, okresy.Nazev))).fillna("Praha")
obec_to_okres obec_to_okres
uzemi_kod
569151 Havlíčkův Brod
569291 Havlíčkův Brod
569330 Jeseník
569402 Havlíčkův Brod
569615 Havlíčkův Brod
...
551503 České Budějovice
530166 Benešov
548235 Pelhřimov
550159 Prachatice
530611 Benešov
Name: OkresKod, Length: 6258, dtype: object
= proportions.assign(okres=obec_to_okres) proportions_w_okres
proportions_w_okres.columns
Index(['Bez vzdělání', 'Nezjištěno', 'Neúplné základní vzdělání',
'Nižší střední a střední vzdělání', 'Nástavbové vzdělání',
'Pomaturitní studium', 'Vysokoškolské bakalářské vzdělání',
'Vysokoškolské doktorské vzdělání',
'Vysokoškolské magisterské vzdělání', 'Vyšší odborné vzdělání',
'Vyšší odborné vzdělání v konzervatoři', 'Základní vzdělání',
'Úplné střední odborné vzdělání', 'Úplné střední všeobecné vzdělání',
'okres'],
dtype='object', name='vzdelani_txt')
= [
proportions_w_okres.columns 'Without education',
'Undetermined',
'Incomplete primary education',
'Lower secondary and secondary education',
'Further education',
'Post_maturita studies',
'Bachelors degree',
'Doctoral degree',
'Masters degree',
'Higher vocational education',
'Higher vocational education in a conservatory',
'Primary education',
'Complete secondary vocational education',
'Complete secondary general education',
'Okres',
]= proportions_w_okres.columns.str.lower().str.replace(" ", "_") proportions_w_okres.columns
proportions_w_okres
without_education | undetermined | incomplete_primary_education | lower_secondary_and_secondary_education | further_education | post_maturita_studies | bachelors_degree | doctoral_degree | masters_degree | higher_vocational_education | higher_vocational_education_in_a_conservatory | primary_education | complete_secondary_vocational_education | complete_secondary_general_education | okres | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
uzemi_kod | |||||||||||||||
500011 | 0.570704 | 3.741281 | 1.141408 | 34.242232 | 1.775523 | 0.507292 | 2.853519 | 0.634115 | 12.935954 | 1.395054 | 0.126823 | 11.350666 | 17.945466 | 10.779962 | Zlín |
500020 | 0.885827 | 3.346457 | 1.968504 | 40.157480 | 2.066929 | 0.885827 | 1.771654 | 0.492126 | 6.299213 | 1.574803 | 0.000000 | 15.059055 | 16.338583 | 9.153543 | Šumperk |
500046 | 0.359195 | 3.232759 | 0.790230 | 39.152299 | 2.514368 | 0.790230 | 3.520115 | 0.215517 | 10.632184 | 1.364943 | 0.143678 | 9.770115 | 15.301724 | 12.212644 | Nový Jičín |
500062 | 0.238237 | 3.573556 | 1.072067 | 32.757594 | 2.084574 | 1.131626 | 3.037522 | 0.178678 | 13.281715 | 0.714711 | 0.119119 | 11.316260 | 18.701608 | 11.792734 | Vsetín |
500071 | 0.412939 | 2.890571 | 1.238816 | 34.067447 | 1.720578 | 0.757054 | 3.028217 | 0.137646 | 11.080523 | 0.894701 | 0.000000 | 9.772884 | 20.027529 | 13.971094 | Vsetín |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
599930 | 0.717703 | 5.645933 | 1.339713 | 38.133971 | 1.818182 | 0.622010 | 3.157895 | 0.191388 | 8.086124 | 1.148325 | 0.095694 | 11.531100 | 16.555024 | 10.956938 | Nový Jičín |
599948 | 0.714031 | 4.534095 | 1.677972 | 35.201714 | 1.856480 | 0.892538 | 3.498750 | 0.392717 | 11.602999 | 1.392360 | 0.071403 | 10.888968 | 16.137094 | 11.138879 | Nový Jičín |
599956 | 0.272480 | 3.337875 | 1.294278 | 35.217984 | 2.520436 | 0.681199 | 3.269755 | 0.272480 | 10.967302 | 1.430518 | 0.204360 | 10.354223 | 18.528610 | 11.648501 | Nový Jičín |
599964 | 0.253807 | 1.903553 | 0.888325 | 32.994924 | 2.030457 | 0.507614 | 3.045685 | 1.015228 | 14.467005 | 2.538071 | 0.126904 | 11.675127 | 17.131980 | 11.421320 | Nový Jičín |
599999 | 0.437318 | 3.498542 | 1.117590 | 32.361516 | 2.089407 | 1.068999 | 3.449951 | 0.631681 | 15.014577 | 1.506317 | 0.242954 | 9.912536 | 16.909621 | 11.758989 | Nový Jičín |
6254 rows × 15 columns
"../../regression/data/education.csv") proportions_w_okres.to_csv(