[1]:
from pprint import pprint
import pystatis
pystatis
Presentation for Data Journalists
[2]:
pystatis.clear_cache()
CorrelAid
https://www.correlaid.org/en/about/
Our Mission
CorrelAid is a non-profit community of data science enthusiasts who want to change the world using data science. We dedicate our work to the humans, initiatives and organizations that strive to make the world a better place.
We value open knowledge management and transparency in our work wherever possible while complying with GDPR regulations and following strong principles of data ethics.
Our Work
Our work is based on three pillars:
Using data: We enable data analysts and scientists to apply their knowledge for the common good and social organizations to increase their impact on society by conducting pro-bono data for good (Data4Good) projects and providing consulting on data topics.
Education: We strongly believe in sharing our knowledge. It is not for nothing that we have chosen “education” as our association’s official purpose. This is why we offer numerous education formats for nonprofits and volunteers. In addition, we share our knowledge, code, and materials publicly.
Community: Our community is the basis of our work. We unite data scientists of different backgrounds and experience levels. We organize ourselves both online and on-site within our CorrelAidX local groups.
pystatis
pystatis
is a small Python library to conveniently wrap the different GENESIS web services (APIs) in a centralized and user-friendly manner.
It allows users to browse the different databases and download the desired tables from all supported databases in a convenient pandas
DataFrame
object, suited for further analysis.
Setup
We won’t cover the initial only-once setup here because the user has to enter their credentials for the supported databases (GENESIS, Regionalstatistik, Zensus). But there is a dedicated notebook Setup with examples and explanations.
Main Use Cases
Find
pystatis.Find
allows a user to use a keyword to browse the data available on the chosen database. Finds 3 different objects: - Tables: the tables containing the relevant keyword in title - Statistics: statistics is the larger collections of tables on the topic, finds the ones with keyword in title - Variables: variables are the values (DE: Merkmal) in columns of the tables, find ones with keyword in label
Returns the titles of relevant tables/statistics/variables and their EVAS number – useful tool to look these up (EVAS is necessary for the Table method)
call Find using a keyword
query=<keyword>
and specifying a databasedb_name=<genesis|zensus|regio>
actually query the API and print the results using
.run()
access the various objects, their EVAS numbers, or preview using metadata
[3]:
results = pystatis.Find(query="Abfall", db_name="regio")
results.run()
##### Results #####
----------------------------------------
# Number of tables: 5
# Preview:
| | Code | Content | Time |
|---:|:----------------|:-------------------------------------------------------------------------------------------|:-------|
| 0 | 32121-01-02-4 | Haushaltsabfälle - Jahr - regionale Tiefe: Kreise und krfr. Städte | |
| 1 | 32121-01-02-4-B | Haushaltsabfälle - Jahr - regionale Ebenen | |
| 2 | 32151-01-01-4 | Primär nachgewiesene Abfallmengen - Jahressumme - regionale Tiefe: Kreise und krfr. Städte | |
| 3 | 32151-01-01-4-B | Primär nachgewiesene Abfallmengen - Jahressumme - regionale Ebenen | |
| 4 | AI019 | Regionalatlas Deutschland Themenbereich "Umwelt" Indikatoren zu "Haushaltsabfälle" | |
----------------------------------------
# Number of statistics: 3
# Preview:
| | Code | Content | Cubes | Information |
|---:|-------:|:----------------------------------------------------------------------|--------:|:--------------|
| 0 | 32121 | Erhebung der öffentlich-rechtlichen Abfallentsorgung | 8 | true |
| 1 | 32151 | Erhebung der gefährlichen Abfälle, über die Nachweise zu führen sind | 8 | true |
| 2 | 99910 | Regionalatlas Deutschland | 208 | true |
----------------------------------------
# Number of variables: 3
# Preview:
| | Code | Content | Type | Values | Information |
|---:|:-------|:--------------------------------------------------|:---------|---------:|:--------------|
| 0 | ABFA01 | Abfallarten von Haushaltsabfällen | sachlich | 6 | false |
| 1 | AI1904 | Abfälle aus der Biotonne je EW | Wert | -1 | true |
| 2 | RVUEA1 | Reg. Verbleib der überwachungsbedürftigen Abfälle | sachlich | 2 | false |
----------------------------------------
# Number of cubes: 16
# Preview:
| | Code | Content | State | Time | LatestUpdate | Information |
|---:|:-----------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------|:----------|:---------------------|:--------------|
| 0 | 32121BJ002 | Erhebung der öffentlich-rechtlichen Abfallentsorgung, Aufkommen an Haushaltsabfällen (oh.Elektroaltger.), Deutschland, Abfallarten von Haushaltsabfällen, Jahr | vollständig mit Werten | 2004-2021 | 12.05.2023 08:58:59h | false |
| 1 | 32121KJ002 | Erhebung der öffentlich-rechtlichen Abfallentsorgung, Aufkommen an Haushaltsabfällen (oh.Elektroaltger.), Kreise und kreisfreie Städte, Abfallarten von Haushaltsabfällen, Jahr | vollständig mit Werten | 2004-2021 | 09.10.2023 13:13:52h | false |
| 2 | 32121LJ002 | Erhebung der öffentlich-rechtlichen Abfallentsorgung, Aufkommen an Haushaltsabfällen (oh.Elektroaltger.), Bundesländer, Abfallarten von Haushaltsabfällen, Jahr | vollständig mit Werten | 2004-2021 | 01.09.2023 14:41:23h | false |
| 3 | 32121RJ002 | Erhebung der öffentlich-rechtlichen Abfallentsorgung, Aufkommen an Haushaltsabfällen (oh.Elektroaltger.), Regierungsbezirke / Statistische Regionen, Abfallarten von Haushaltsabfällen, Jahr | vollständig mit Werten | 2004-2021 | 01.09.2023 14:41:23h | false |
| 4 | 32151BJ001 | Erhebung der gefährlichen Abfälle, über die Nachweise zu führen sind , Erzeuger von primär nachgewiesenen Abfallmengen, Abgegebene Abfallmenge an Entsorger, Deutschland, Jahr | vollständig mit Werten | 2001-2021 | 26.07.2023 14:30:27h | false |
----------------------------------------
# Use object.tables, object.statistics, object.variables or object.cubes to get all results.
----------------------------------------
If interested in specific object, can run results.tables
, results.statistics
, or results.variables
directly.
[4]:
results.tables
[4]:
| | Code | Content | Time |
|---:|:----------------|:-------------------------------------------------------------------------------------------|:-------|
| 0 | 32121-01-02-4 | Haushaltsabfälle - Jahr - regionale Tiefe: Kreise und krfr. Städte | |
| 1 | 32121-01-02-4-B | Haushaltsabfälle - Jahr - regionale Ebenen | |
| 2 | 32151-01-01-4 | Primär nachgewiesene Abfallmengen - Jahressumme - regionale Tiefe: Kreise und krfr. Städte | |
| 3 | 32151-01-01-4-B | Primär nachgewiesene Abfallmengen - Jahressumme - regionale Ebenen | |
| 4 | AI019 | Regionalatlas Deutschland Themenbereich "Umwelt" Indikatoren zu "Haushaltsabfälle" | |
Add .df
to convert to a dataframe for easier handling.
[5]:
results.tables.df
[5]:
Code | Content | Time | |
---|---|---|---|
0 | 32121-01-02-4 | Haushaltsabfälle - Jahr - regionale Tiefe: Kreise und krfr. Städte | |
1 | 32121-01-02-4-B | Haushaltsabfälle - Jahr - regionale Ebenen | |
2 | 32151-01-01-4 | Primär nachgewiesene Abfallmengen - Jahressumme - regionale Tiefe: Kreise und krfr. Städte | |
3 | 32151-01-01-4-B | Primär nachgewiesene Abfallmengen - Jahressumme - regionale Ebenen | |
4 | AI019 | Regionalatlas Deutschland Themenbereich "Umwelt" Indikatoren zu "Haushaltsabfälle" |
We can then access the relevant codes with .get_code([#])
. Doing this returns a list of codes from specified rows which may be useful to run in the Table method.
[6]:
results.tables.get_code([0, 1, 2])
[6]:
['32121-01-02-4', '32121-01-02-4-B', '32151-01-01-4']
To then check that the object has the relevant data, we can preview the columns using the .get_metadata()
method.
[7]:
results.tables.get_metadata([1, 2])
TABLES 32121-01-02-4-B - 1
Name:
Erhebung der öffentlich-rechtlichen Abfallentsorgung
--------------------
Columns:
Aufkommen an Haushaltsabfällen (oh.Elektroaltger.)
--------------------
Rows:
Kreise und kreisfreie Städte
----------------------------------------
TABLES 32151-01-01-4 - 2
Name:
Erhebung der gefährlichen Abfälle, über die Nachweise zu führen sind
--------------------
Columns:
Erzeuger von primär nachgewiesenen Abfallmengen
Abgegebene Abfallmenge an Entsorger
--------------------
Rows:
Kreise und kreisfreie Städte
----------------------------------------
The pystatis.Find
is a useful search tool to browse the database by any keyword. It is quicker than downloading a table and does not need the EVAS number to run.
Use this to identify the tables of interest and to look up their EVAS as to use in the further analysis with a pystatis.Table
method.
Table
pystatis.Table
offers a simple Interface to get any table via its “name” (EVAS number).
Create a new Table instance by passing
name=<EVAS>
Download the actual data with
.get_data(prettify=<True|False>)
Access data via either
.raw_data
or.data
, metadata via.metadata
[3]:
# GENESIS - https://www-genesis.destatis.de/genesis//online?operation=table&code=31231-0001&bypass=true&levelindex=1&levelid=1706599948340#abreadcrumb
t = pystatis.Table(name="31231-0001") #
Per default, prettify
is set to True
and will return a more readable format. Here we show the original format first.
[6]:
t.get_data(prettify=False)
[7]:
t.raw_data.splitlines()
[7]:
['Statistik_Code;Statistik_Label;Zeit_Code;Zeit_Label;Zeit;1_Merkmal_Code;1_Merkmal_Label;1_Auspraegung_Code;1_Auspraegung_Label;WOH001__Wohnungen_in_Wohn-_und_Nichtwohngebaeuden__Anzahl;WOH004__Wohnungen_je_1000_Einwohner__Anzahl;FLC001__Wohnflaeche__1000_qm;FLC102__Wohnflaeche_je_Wohnung__qm;FLC103__Wohnflaeche_je_Einwohner__qm;RME001__Raeume__Anzahl;RME002__Raeume_je_Wohnung__Anzahl;RME003__Raeume_je_Einwohner__Anzahl',
'31231;Fortschreibung Wohngebäude- und Wohnungsbestand;STAG;Stichtag;31.12.2015;DINSG;Deutschland insgesamt;DG;Deutschland;41446271;504;3794976;91,6;46,2;182295713;4,4;2,2',
'31231;Fortschreibung Wohngebäude- und Wohnungsbestand;STAG;Stichtag;31.12.2016;DINSG;Deutschland insgesamt;DG;Deutschland;41703347;505;3822507;91,7;46,3;183354291;4,4;2,2',
'31231;Fortschreibung Wohngebäude- und Wohnungsbestand;STAG;Stichtag;31.12.2017;DINSG;Deutschland insgesamt;DG;Deutschland;41968066;507;3850742;91,8;46,5;184427760;4,4;2,2',
'31231;Fortschreibung Wohngebäude- und Wohnungsbestand;STAG;Stichtag;31.12.2018;DINSG;Deutschland insgesamt;DG;Deutschland;42235402;509;3878901;91,8;46,7;185491224;4,4;2,2',
'31231;Fortschreibung Wohngebäude- und Wohnungsbestand;STAG;Stichtag;31.12.2019;DINSG;Deutschland insgesamt;DG;Deutschland;42512771;511;3908347;91,9;47,0;186594482;4,4;2,2',
'31231;Fortschreibung Wohngebäude- und Wohnungsbestand;STAG;Stichtag;31.12.2020;DINSG;Deutschland insgesamt;DG;Deutschland;42803737;515;3938871;92,0;47,4;187746588;4,4;2,3',
'31231;Fortschreibung Wohngebäude- und Wohnungsbestand;STAG;Stichtag;31.12.2021;DINSG;Deutschland insgesamt;DG;Deutschland;43084122;518;3967765;92,1;47,7;188829383;4,4;2,3',
'31231;Fortschreibung Wohngebäude- und Wohnungsbestand;STAG;Stichtag;31.12.2022;DINSG;Deutschland insgesamt;DG;Deutschland;43366919;514;3996995;92,2;47,4;189920514;4,4;2,3']
[8]:
t.data
[8]:
Statistik_Code | Statistik_Label | Zeit_Code | Zeit_Label | Zeit | 1_Merkmal_Code | 1_Merkmal_Label | 1_Auspraegung_Code | 1_Auspraegung_Label | WOH001__Wohnungen_in_Wohn-_und_Nichtwohngebaeuden__Anzahl | WOH004__Wohnungen_je_1000_Einwohner__Anzahl | FLC001__Wohnflaeche__1000_qm | FLC102__Wohnflaeche_je_Wohnung__qm | FLC103__Wohnflaeche_je_Einwohner__qm | RME001__Raeume__Anzahl | RME002__Raeume_je_Wohnung__Anzahl | RME003__Raeume_je_Einwohner__Anzahl | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 31231 | Fortschreibung Wohngebäude- und Wohnungsbestand | STAG | Stichtag | 31.12.2015 | DINSG | Deutschland insgesamt | DG | Deutschland | 41446271 | 504 | 3794976 | 91,6 | 46,2 | 182295713 | 4,4 | 2,2 |
1 | 31231 | Fortschreibung Wohngebäude- und Wohnungsbestand | STAG | Stichtag | 31.12.2016 | DINSG | Deutschland insgesamt | DG | Deutschland | 41703347 | 505 | 3822507 | 91,7 | 46,3 | 183354291 | 4,4 | 2,2 |
2 | 31231 | Fortschreibung Wohngebäude- und Wohnungsbestand | STAG | Stichtag | 31.12.2017 | DINSG | Deutschland insgesamt | DG | Deutschland | 41968066 | 507 | 3850742 | 91,8 | 46,5 | 184427760 | 4,4 | 2,2 |
3 | 31231 | Fortschreibung Wohngebäude- und Wohnungsbestand | STAG | Stichtag | 31.12.2018 | DINSG | Deutschland insgesamt | DG | Deutschland | 42235402 | 509 | 3878901 | 91,8 | 46,7 | 185491224 | 4,4 | 2,2 |
4 | 31231 | Fortschreibung Wohngebäude- und Wohnungsbestand | STAG | Stichtag | 31.12.2019 | DINSG | Deutschland insgesamt | DG | Deutschland | 42512771 | 511 | 3908347 | 91,9 | 47,0 | 186594482 | 4,4 | 2,2 |
5 | 31231 | Fortschreibung Wohngebäude- und Wohnungsbestand | STAG | Stichtag | 31.12.2020 | DINSG | Deutschland insgesamt | DG | Deutschland | 42803737 | 515 | 3938871 | 92,0 | 47,4 | 187746588 | 4,4 | 2,3 |
6 | 31231 | Fortschreibung Wohngebäude- und Wohnungsbestand | STAG | Stichtag | 31.12.2021 | DINSG | Deutschland insgesamt | DG | Deutschland | 43084122 | 518 | 3967765 | 92,1 | 47,7 | 188829383 | 4,4 | 2,3 |
7 | 31231 | Fortschreibung Wohngebäude- und Wohnungsbestand | STAG | Stichtag | 31.12.2022 | DINSG | Deutschland insgesamt | DG | Deutschland | 43366919 | 514 | 3996995 | 92,2 | 47,4 | 189920514 | 4,4 | 2,3 |
As you can see, the original format has a lot of redundant information and columns with metadata like the codes for the different variables. Let’s rerun get_data
with prettify=True
.
[9]:
t.get_data()
[10]:
t.data
[10]:
Stichtag | Deutschland insgesamt | Wohnungen_in_Wohn-_und_Nichtwohngebaeuden | Wohnungen_je_1000_Einwohner | Wohnflaeche | Wohnflaeche_je_Wohnung | Wohnflaeche_je_Einwohner | Raeume | Raeume_je_Wohnung | Raeume_je_Einwohner | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 31.12.2015 | Deutschland | 41446271 | 504 | 3794976 | 91,6 | 46,2 | 182295713 | 4,4 | 2,2 |
1 | 31.12.2016 | Deutschland | 41703347 | 505 | 3822507 | 91,7 | 46,3 | 183354291 | 4,4 | 2,2 |
2 | 31.12.2017 | Deutschland | 41968066 | 507 | 3850742 | 91,8 | 46,5 | 184427760 | 4,4 | 2,2 |
3 | 31.12.2018 | Deutschland | 42235402 | 509 | 3878901 | 91,8 | 46,7 | 185491224 | 4,4 | 2,2 |
4 | 31.12.2019 | Deutschland | 42512771 | 511 | 3908347 | 91,9 | 47,0 | 186594482 | 4,4 | 2,2 |
5 | 31.12.2020 | Deutschland | 42803737 | 515 | 3938871 | 92,0 | 47,4 | 187746588 | 4,4 | 2,3 |
6 | 31.12.2021 | Deutschland | 43084122 | 518 | 3967765 | 92,1 | 47,7 | 188829383 | 4,4 | 2,3 |
7 | 31.12.2022 | Deutschland | 43366919 | 514 | 3996995 | 92,2 | 47,4 | 189920514 | 4,4 | 2,3 |
You can also access the metadata as returned by the Catalogue endpoint.
[11]:
pprint(t.metadata)
{'Copyright': '© Statistisches Bundesamt (Destatis), 2024',
'Ident': {'Method': 'table', 'Service': 'metadata'},
'Object': {'Code': '31231-0001',
'Content': 'Wohnungen in Wohn- und Nichtwohngebäuden, Wohnfläche, '
'Räume:\n'
'Deutschland, Stichtag',
'Structure': {'Columns': [{'Code': 'WOH001',
'Content': 'Wohnungen in Wohn- und '
'Nichtwohngebäuden',
'Selected': None,
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': None},
{'Code': 'WOH004',
'Content': 'Wohnungen je 1000 Einwohner',
'Selected': None,
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': None},
{'Code': 'FLC001',
'Content': 'Wohnfläche',
'Selected': None,
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': None},
{'Code': 'FLC102',
'Content': 'Wohnfläche je Wohnung',
'Selected': None,
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': None},
{'Code': 'FLC103',
'Content': 'Wohnfläche je Einwohner',
'Selected': None,
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': None},
{'Code': 'RME001',
'Content': 'Räume',
'Selected': None,
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': None},
{'Code': 'RME002',
'Content': 'Räume je Wohnung',
'Selected': None,
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': None},
{'Code': 'RME003',
'Content': 'Räume je Einwohner',
'Selected': None,
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': None}],
'Head': {'Code': '31231',
'Content': 'Fortschreibung Wohngebäude- und '
'Wohnungsbestand',
'Selected': None,
'Structure': [{'Code': 'DINSG',
'Content': 'Deutschland '
'insgesamt',
'Selected': '1',
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': '1'}],
'Type': 'Statistik',
'Updated': 'see parent',
'Values': None},
'Rows': [{'Code': 'STAG',
'Content': 'Stichtag',
'Selected': None,
'Structure': None,
'Type': 'Merkmal',
'Updated': 'see parent',
'Values': None}],
'Subheading': None,
'Subtitel': None},
'Time': {'From': '31.12.2015', 'To': '31.12.2022'},
'Updated': '16.08.2023 16:38:39h',
'Valid': 'false'},
'Parameter': {'area': 'Alle',
'language': 'de',
'name': '31231-0001',
'password': '********************',
'username': '********************'},
'Status': {'Code': 0, 'Content': 'erfolgreich', 'Type': 'Information'}}
You can use any EVAS number from the supported databases like GENESIS, Regionalstatistik or Zensus. The library identifies the database for you so you don’t have to care about this.
[12]:
# GENESIS
t = pystatis.Table(name="43311-0001")
t.get_data()
t.data
[12]:
Jahr | Deutschland insgesamt | Energieträger | Elektrizitaetserzeugung_(brutto) | Elektrizitaetserzeugung_(netto) | Nettowaermeerzeugung | Brennstoffeinsatz | |
---|---|---|---|---|---|---|---|
0 | 2022 | Deutschland | Steinkohlen | 60759486.0 | 55443585.0 | 19106288.0 | 5.712968e+08 |
1 | 2022 | Deutschland | Steinkohlenkoks | NaN | NaN | NaN | NaN |
2 | 2022 | Deutschland | Steinkohlenbriketts | NaN | NaN | NaN | NaN |
3 | 2022 | Deutschland | Kohlenwertstoffe aus Steinkohle | NaN | NaN | NaN | NaN |
4 | 2022 | Deutschland | Sonstige Steinkohlen | NaN | NaN | NaN | NaN |
5 | 2022 | Deutschland | Rohbraunkohlen | 113611255.0 | 105943521.0 | 6558509.0 | 1.039784e+09 |
6 | 2022 | Deutschland | Hartbraunkohlen | NaN | NaN | NaN | NaN |
7 | 2022 | Deutschland | Braunkohlenbriketts | 43460.0 | 40444.0 | NaN | 4.102690e+05 |
8 | 2022 | Deutschland | Braunkohlenkoks | NaN | NaN | NaN | NaN |
9 | 2022 | Deutschland | Wirbelschichtkohle | NaN | NaN | NaN | NaN |
10 | 2022 | Deutschland | Staub- und Trockenkohle | NaN | NaN | NaN | NaN |
11 | 2022 | Deutschland | Sonstige Braunkohlen | NaN | NaN | NaN | NaN |
12 | 2022 | Deutschland | Dieselkraftstoff | NaN | NaN | NaN | NaN |
13 | 2022 | Deutschland | Heizöl, leicht | 829009.0 | 773967.0 | 1386039.0 | 1.301587e+07 |
14 | 2022 | Deutschland | Heizöl, schwer | 237152.0 | 214908.0 | 33706.0 | 2.366438e+06 |
15 | 2022 | Deutschland | Flüssiggas | NaN | NaN | NaN | NaN |
16 | 2022 | Deutschland | Raffineriegas | NaN | NaN | NaN | NaN |
17 | 2022 | Deutschland | Petrolkoks | NaN | NaN | NaN | NaN |
18 | 2022 | Deutschland | Sonstige Mineralölprodukte | NaN | NaN | NaN | 1.827200e+05 |
19 | 2022 | Deutschland | Erdgas, Erdölgas | 46636174.0 | 45163692.0 | 41934364.0 | 4.312443e+08 |
20 | 2022 | Deutschland | Grubengas | 582597.0 | 577321.0 | NaN | 5.708188e+06 |
21 | 2022 | Deutschland | Kokereigas | NaN | NaN | NaN | NaN |
22 | 2022 | Deutschland | Hochofengas | NaN | NaN | NaN | NaN |
23 | 2022 | Deutschland | Sonstige hergestellte Gase | NaN | NaN | NaN | NaN |
24 | 2022 | Deutschland | Wasserstoff | NaN | NaN | NaN | NaN |
25 | 2022 | Deutschland | Laufwasser | 13404202.0 | 13281638.0 | NaN | NaN |
26 | 2022 | Deutschland | Speicherwasser | 614789.0 | 611162.0 | NaN | NaN |
27 | 2022 | Deutschland | Pumpspeicherwasser | NaN | NaN | NaN | NaN |
28 | 2022 | Deutschland | Pumpspeicher mit natürlichem Zufluss | 480142.0 | 480142.0 | NaN | NaN |
29 | 2022 | Deutschland | Pumpspeicher ohne natürlichen Zufluss | NaN | NaN | NaN | NaN |
30 | 2022 | Deutschland | Windkraft | NaN | NaN | NaN | NaN |
31 | 2022 | Deutschland | Photovoltaik | NaN | NaN | NaN | NaN |
32 | 2022 | Deutschland | Geothermie | NaN | NaN | NaN | NaN |
33 | 2022 | Deutschland | Wärmepumpen (Erd- und Umweltwärme) | NaN | NaN | NaN | NaN |
34 | 2022 | Deutschland | Solarthermie | NaN | NaN | NaN | NaN |
35 | 2022 | Deutschland | Feste biogene Stoffe | 5157301.0 | 4555379.0 | 5496277.0 | 7.738774e+07 |
36 | 2022 | Deutschland | Flüssige biogene Stoffe | NaN | NaN | NaN | NaN |
37 | 2022 | Deutschland | Biogas | 2781281.0 | 2662858.0 | 2238806.0 | 2.547129e+07 |
38 | 2022 | Deutschland | Biomethan (Bioerdgas) | 1031257.0 | 1007770.0 | 1172103.0 | 9.574762e+06 |
39 | 2022 | Deutschland | Klärgas | NaN | NaN | NaN | NaN |
40 | 2022 | Deutschland | Deponiegas | 59864.0 | 56080.0 | 35286.0 | 6.237530e+05 |
41 | 2022 | Deutschland | Sonstige erneuerbare Energien | NaN | NaN | NaN | NaN |
42 | 2022 | Deutschland | Klärschlamm | 206726.0 | 181848.0 | 107537.0 | 2.241021e+06 |
43 | 2022 | Deutschland | Abfall (Hausmüll, Industrie) | NaN | NaN | NaN | NaN |
44 | 2022 | Deutschland | Abfall (Industrie) | 542529.0 | 368799.0 | 1083604.0 | 1.036228e+07 |
45 | 2022 | Deutschland | Abfall (Hausmüll, Siedlungsabfälle) | 10494870.0 | 8248924.0 | 16865152.0 | 1.899352e+08 |
46 | 2022 | Deutschland | Kernenergie | 34709262.0 | 32765409.0 | NaN | NaN |
47 | 2022 | Deutschland | Wärme | 346035.0 | 330543.0 | 1115125.0 | 8.318414e+06 |
48 | 2022 | Deutschland | Strom (Elektrokessel) | NaN | NaN | NaN | NaN |
49 | 2022 | Deutschland | Sonstige Energieträger | NaN | NaN | NaN | NaN |
50 | 2022 | Deutschland | Andere Speicher | NaN | NaN | NaN | NaN |
51 | 2022 | Deutschland | Insgesamt | 293024354.0 | 273144778.0 | 98388835.0 | 2.395591e+09 |
[13]:
# Regionalstatistik
t = pystatis.Table(name="21311-01-01-4")
t.get_data()
t.data
/Users/miay/git/github/CorrelAid/pystatis/src/pystatis/table.py:48: DtypeWarning: Columns (7) have mixed types. Specify dtype option on import or set low_memory=False.
self.data = pd.read_csv(
[13]:
Semester | Kreise und kreisfreie Städte | Geschlecht | Nationalität (inkl. insgesamt) | Fächergruppe (mit Insgesamt) | Kreise und kreisfreie Städte_Code | Geschlecht_Code | Nationalität (inkl. insgesamt)_Code | Fächergruppe (mit Insgesamt)_Code | Studierende_(im_Kreisgebiet) | |
---|---|---|---|---|---|---|---|---|---|---|
0 | WS 2021/22 | Deutschland | Insgesamt | Insgesamt | Geisteswissenschaften | DG | INSGESAMT | INSGESAMT | HS-FG01 | 316442.0 |
1 | WS 2021/22 | Deutschland | Insgesamt | Insgesamt | Sport | DG | INSGESAMT | INSGESAMT | HS-FG02 | 31157.0 |
2 | WS 2021/22 | Deutschland | Insgesamt | Insgesamt | Rechts-, Wirtschafts- und Sozialwissenschaften | DG | INSGESAMT | INSGESAMT | HS-FG03 | 1138785.0 |
3 | WS 2021/22 | Deutschland | Insgesamt | Insgesamt | Mathematik/Naturwissenschaften | DG | INSGESAMT | INSGESAMT | HS-FG04 | 314060.0 |
4 | WS 2021/22 | Deutschland | Insgesamt | Insgesamt | Humanmedizin/Gesundheitswissenschaften | DG | INSGESAMT | INSGESAMT | HS-FG05 | 196239.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
48415 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Agrar-, Forst- und Ernährungswissensch., Veterinär | 16077 | GESW | NATD | HS-FG07 | NaN |
48416 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Ingenieurwissenschaften | 16077 | GESW | NATD | HS-FG08 | NaN |
48417 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Kunst, Kunstwissenschaft | 16077 | GESW | NATD | HS-FG09 | NaN |
48418 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Außerhalb der Studienbereichsgliederung | 16077 | GESW | NATD | HS-FG10 | NaN |
48419 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Insgesamt | 16077 | GESW | NATD | INSGESAMT | NaN |
48420 rows × 10 columns
[4]:
# Zensus
t = pystatis.Table(name="2000S-1006")
t.get_data()
t.data
[4]:
Stichtag | Deutschland | Höchster Schulabschluss | Personen ab 15 Jahren | |
---|---|---|---|---|
0 | 2011-05-09 | Deutschland | Mittlerer Schulabschluss und gymnasiale Oberstufe | 1 |
1 | 2011-05-09 | Deutschland | Haupt-/ Volksschulabschluss | 2 |
2 | 2011-05-09 | Deutschland | Ohne Abschluss | 4932710 |
3 | 2011-05-09 | Deutschland | Insgesamt | 6 |
4 | 2011-05-09 | Deutschland | Allg./fachgebundene Hochschulreife (Abitur) | 1 |
5 | 2011-05-09 | Deutschland | Fachhochschulreife | 5531480 |
6 | 2011-05-09 | Deutschland | Noch in schulischer Ausbildung | 1691700 |
7 | 2011-05-09 | Deutschland | Allg./fachgebundene Hochschulreife (Abitur) | 1 |
8 | 2011-05-09 | Deutschland | Schüler/-innen der gymnasialen Oberstufe | 1339490 |
9 | 2011-05-09 | Deutschland | Realschul- oder gleichwertiger Abschluss | 1 |
10 | 2011-05-09 | Deutschland | Haupt-/ Volksschulabschluss | 2 |
11 | 2011-05-09 | Deutschland | Fachhochschulreife | 5531480 |
12 | 2011-05-09 | Deutschland | Ohne Schulabschluss | 3241010 |
The get_data()
method supports all parameters that you can pass to the API, like startyear
, endyear
or timeslices
[5]:
# GENESIS
t = pystatis.Table(name="43311-0001")
t.get_data(startyear=2000)
t.data
[5]:
Jahr | Deutschland insgesamt | Energieträger | Elektrizitaetserzeugung_(brutto) | Elektrizitaetserzeugung_(netto) | Nettowaermeerzeugung | Brennstoffeinsatz | |
---|---|---|---|---|---|---|---|
0 | 2002 | Deutschland | Steinkohlen | 121062371.0 | 111426568.0 | NaN | 1.081030e+09 |
1 | 2002 | Deutschland | Steinkohlenkoks | NaN | NaN | NaN | NaN |
2 | 2002 | Deutschland | Steinkohlenbriketts | NaN | NaN | NaN | NaN |
3 | 2002 | Deutschland | Kohlenwertstoffe aus Steinkohle | NaN | NaN | NaN | NaN |
4 | 2002 | Deutschland | Sonstige Steinkohlen | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... |
1087 | 2022 | Deutschland | Wärme | 346035.0 | 330543.0 | 1115125.0 | 8.318414e+06 |
1088 | 2022 | Deutschland | Strom (Elektrokessel) | NaN | NaN | NaN | NaN |
1089 | 2022 | Deutschland | Sonstige Energieträger | NaN | NaN | NaN | NaN |
1090 | 2022 | Deutschland | Andere Speicher | NaN | NaN | NaN | NaN |
1091 | 2022 | Deutschland | Insgesamt | 293024354.0 | 273144778.0 | 98388835.0 | 2.395591e+09 |
1092 rows × 7 columns
Advanced Features
Caching
Handling background jobs
Cubes
Geo-Visualization
Case study: international students in Germany - time evolution - regional differences (at the level of federal states)
[24]:
# !pip install geopandas
# !pip install matplotlib
[55]:
import geopandas
import pandas as pd
from matplotlib import pyplot as plt
Load Data from Regionalstatistik
[56]:
students = pystatis.Table(name="21311-01-01-4")
[57]:
students.get_data(startyear=2015)
/Users/macbookpro/Git Repos/pystatis/src/pystatis/table.py:46: DtypeWarning: Columns (7) have mixed types. Specify dtype option on import or set low_memory=False.
self.data = pd.read_csv(data_str, sep=";", na_values = ["...",".","-","/","x"])
Set Proper Column Types
[61]:
students.data["Kreise und kreisfreie Städte_Code"] = students.data[
"Kreise und kreisfreie Städte_Code"
].astype(str)
students.data["Kreise und kreisfreie Städte_Code"]
[61]:
0 DG
1 DG
2 DG
3 DG
4 DG
...
338935 16077
338936 16077
338937 16077
338938 16077
338939 16077
Name: Kreise und kreisfreie Städte_Code, Length: 338940, dtype: object
[59]:
students.data["Kreise und kreisfreie Städte_Code"] = students.data[
"Kreise und kreisfreie Städte_Code"
].apply(lambda x: "0" + x if len(x) <= 1 else x)
students.data["Kreise und kreisfreie Städte_Code"]
[59]:
0 DG
1 DG
2 DG
3 DG
4 DG
...
338935 16077
338936 16077
338937 16077
338938 16077
338939 16077
Name: Kreise und kreisfreie Städte_Code, Length: 338940, dtype: object
Inspect Dataframe
[62]:
students.data
[62]:
Semester | Kreise und kreisfreie Städte | Geschlecht | Nationalität (inkl. insgesamt) | Fächergruppe (mit Insgesamt) | Kreise und kreisfreie Städte_Code | Geschlecht_Code | Nationalität (inkl. insgesamt)_Code | Fächergruppe (mit Insgesamt)_Code | Studierende_(im_Kreisgebiet) | |
---|---|---|---|---|---|---|---|---|---|---|
0 | WS 2015/16 | Deutschland | Insgesamt | Insgesamt | Geisteswissenschaften | DG | INSGESAMT | INSGESAMT | HS-FG01 | 339730.0 |
1 | WS 2015/16 | Deutschland | Insgesamt | Insgesamt | Sport | DG | INSGESAMT | INSGESAMT | HS-FG02 | 27771.0 |
2 | WS 2015/16 | Deutschland | Insgesamt | Insgesamt | Rechts-, Wirtschafts- und Sozialwissenschaften | DG | INSGESAMT | INSGESAMT | HS-FG03 | 1006645.0 |
3 | WS 2015/16 | Deutschland | Insgesamt | Insgesamt | Mathematik/Naturwissenschaften | DG | INSGESAMT | INSGESAMT | HS-FG04 | 309194.0 |
4 | WS 2015/16 | Deutschland | Insgesamt | Insgesamt | Humanmedizin/Gesundheitswissenschaften | DG | INSGESAMT | INSGESAMT | HS-FG05 | 166331.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
338935 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Agrar-, Forst- und Ernährungswissensch., Veterinär | 16077 | GESW | NATD | HS-FG07 | NaN |
338936 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Ingenieurwissenschaften | 16077 | GESW | NATD | HS-FG08 | NaN |
338937 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Kunst, Kunstwissenschaft | 16077 | GESW | NATD | HS-FG09 | NaN |
338938 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Außerhalb der Studienbereichsgliederung | 16077 | GESW | NATD | HS-FG10 | NaN |
338939 | WS 2021/22 | Altenburger Land, Landkreis | weiblich | Deutsche | Insgesamt | 16077 | GESW | NATD | INSGESAMT | NaN |
338940 rows × 10 columns
Determine Ratio of International Students per Year and Region
[63]:
ratio_international = (
students.data[
(students.data.Geschlecht == "Insgesamt")
& (students.data["Fächergruppe (mit Insgesamt)"] == "Insgesamt")
]
.groupby(
by=[
"Kreise und kreisfreie Städte",
"Kreise und kreisfreie Städte_Code",
"Semester",
]
)["Studierende_(im_Kreisgebiet)"]
.apply(lambda x: x.iloc[1] / x.iloc[0] if x.count() == 3 else None)
)
ratio_international.rename("ratio_international", inplace=True)
ratio_international = pd.DataFrame(ratio_international)
ratio_international["year"] = [
int(semester[3:7])
for semester in ratio_international.index.get_level_values(2)
]
ratio_international
[63]:
ratio_international | year | |||
---|---|---|---|---|
Kreise und kreisfreie Städte | Kreise und kreisfreie Städte_Code | Semester | ||
Aachen, Kreis | 05354 | WS 2015/16 | NaN | 2015 |
WS 2016/17 | NaN | 2016 | ||
WS 2018/19 | NaN | 2018 | ||
WS 2020/21 | NaN | 2020 | ||
5354 | WS 2017/18 | NaN | 2017 | |
... | ... | ... | ... | ... |
Deutschland | DG | WS 2017/18 | 0.131665 | 2017 |
WS 2018/19 | 0.137599 | 2018 | ||
WS 2019/20 | 0.142371 | 2019 | ||
WS 2020/21 | 0.141446 | 2020 | ||
WS 2021/22 | 0.149754 | 2021 |
3767 rows × 2 columns
[64]:
ratio_international[ratio_international.index.get_level_values(0) == " Bayern"]
[64]:
ratio_international | year | |||
---|---|---|---|---|
Kreise und kreisfreie Städte | Kreise und kreisfreie Städte_Code | Semester | ||
Bayern | 09 | WS 2015/16 | 0.114288 | 2015 |
WS 2016/17 | 0.120434 | 2016 | ||
WS 2017/18 | 0.128948 | 2017 | ||
WS 2018/19 | 0.139124 | 2018 | ||
WS 2019/20 | 0.147157 | 2019 | ||
WS 2020/21 | 0.150818 | 2020 | ||
WS 2021/22 | 0.167680 | 2021 |
Plot Evoluation of International Students over Time
[65]:
for region in [
"Deutschland",
" Baden-Württemberg",
" Bayern",
" Nordrhein-Westfalen",
" Thüringen",
" Sachsen",
" Niedersachsen",
" Schleswig-Holstein",
" Berlin",
]:
plt.plot(
ratio_international[
ratio_international.index.get_level_values(0) == region
].year,
ratio_international[
ratio_international.index.get_level_values(0) == region
].ratio_international,
label=region,
)
plt.legend()
[65]:
<matplotlib.legend.Legend at 0x11e7b9f50>
Load Shape File for the Map of Germany
[66]:
path_to_data = "./data/VG2500_LAN.shp"
gdf = geopandas.read_file(path_to_data)
[67]:
gdf.loc[:, "area"] = gdf.area
[68]:
gdf.plot("area", legend=True)
[68]:
<Axes: >
[69]:
gdf.GEN
[69]:
0 Schleswig-Holstein
1 Hamburg
2 Niedersachsen
3 Bremen
4 Nordrhein-Westfalen
5 Hessen
6 Rheinland-Pfalz
7 Baden-Württemberg
8 Bayern
9 Saarland
10 Berlin
11 Brandenburg
12 Mecklenburg-Vorpommern
13 Sachsen
14 Sachsen-Anhalt
15 Thüringen
16 Schleswig-Holstein
17 Hamburg
18 Niedersachsen
19 Niedersachsen
20 Bremen
21 Mecklenburg-Vorpommern
22 Baden-Württemberg (Bodensee)
23 Bayern (Bodensee)
Name: GEN, dtype: object
[70]:
gdf.AGS = gdf.AGS.astype(str)
Merge GeoDataFrame
with Data and Visualize on the Map
[102]:
fig = plt.figure(figsize=(10, 5))
ax1 = fig.add_subplot(131)
year = 2015
plt.title(str(year))
gdf_merged = pd.merge(
left=gdf,
right=ratio_international[ratio_international.year == year],
left_on="AGS",
right_on="Kreise und kreisfreie Städte_Code",
)
gdf_merged.ratio_international
gdf_merged.plot(
"ratio_international",
ax=ax1,
legend=True,
missing_kwds={"color": "lightgrey"},
legend_kwds={
"label": "ratio of int. students",
"orientation": "horizontal",
},
vmin=0.08,
vmax=0.23,
)
ax2 = fig.add_subplot(132)
year = 2018
plt.title(str(year))
gdf_merged = pd.merge(
left=gdf,
right=ratio_international[ratio_international.year == year],
left_on="AGS",
right_on="Kreise und kreisfreie Städte_Code",
)
gdf_merged.ratio_international
gdf_merged.plot(
"ratio_international",
ax=ax2,
legend=True,
missing_kwds={"color": "lightgrey"},
legend_kwds={
"label": "ratio of int. students",
"orientation": "horizontal",
},
vmin=0.08,
vmax=0.23,
)
ax3 = fig.add_subplot(133)
year = 2021
plt.title(str(year))
gdf_merged = pd.merge(
left=gdf,
right=ratio_international[ratio_international.year == year],
left_on="AGS",
right_on="Kreise und kreisfreie Städte_Code",
)
gdf_merged.ratio_international
gdf_merged.plot(
"ratio_international",
ax=ax3,
legend=True,
missing_kwds={"color": "lightgrey"},
legend_kwds={
"label": "ratio of int. students",
"orientation": "horizontal",
},
vmin=0.08,
vmax=0.23,
)
[102]:
<Axes: title={'center': '2021'}>
Outlook
quality=on
-> handle the different quality identifiersFind
to work across all databases -> search for and find results over all supported databases with a single queryLLM
? -> ideation: provide some kind of interface that allows to talk with GENESIS via a LLM like ChatGPT