[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:

  1. 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.

  2. 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.

  3. 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)

  1. call Find using a keyword query=<keyword> and specifying a database db_name=<genesis|zensus|regio>

  2. actually query the API and print the results using .run()

  3. 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).

  1. Create a new Table instance by passing name=<EVAS>

  2. Download the actual data with .get_data(prettify=<True|False>)

  3. 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>
../_images/nb_05_presentation_52_1.png

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: >
../_images/nb_05_presentation_56_1.png
[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'}>
../_images/nb_05_presentation_60_1.png

Outlook

  • quality=on -> handle the different quality identifiers

  • Find to work across all databases -> search for and find results over all supported databases with a single query

  • LLM? -> ideation: provide some kind of interface that allows to talk with GENESIS via a LLM like ChatGPT