Die neuesten Beiträge
Pandas: eine Python-Bibliothek, die es in sich hat
Wer grössere Mengen von Daten analysiert oder transformiert, kommt um "Pandas" kaum herum. Diese Software-Bibliothek ist sozusagen das Schweizer Taschenmesser für Daten, die sich in Tabellenform darstellen lassen.
Pandas verfügt über ein so umfangreiches Repertoire an Möglichkeiten, dass der Neuling rasch überfordert ist und sich nur schwer zurecht findet. Dem gegenüber steht jedoch der enorme Gewinn an Produktivität, sobald man auch nur die Anfangsgründer von Pandas gemeistert hat.
Bevor man mit Pandas loslegt, stellt sich natürlich die Frage: Wie und wo installiere ich diese Software? Darauf gibt es nicht eine, sondern viele Antworten. Ich greife drei davon heraus:
⁃ Installation von Python (ab Version 3.6.1) auf dem eigenen Windows-, Mac- oder Linux-Rechner
Diese Variante liegt nahe, wenn man Python-Programme entwickelt und Pandas lediglich eines von vielen Python-Modulen sein wird. Die offizielle Pandas-Website empfiehlte eine Installation im Rahmen von "Anaconda" https://pandas.pydata.org/docs/getting_started/install.html, doch lässt sich Pandas auch mit "Pip" installieren.
⁃ Verwendung eines Docker-Containers
Niels Borie stellt auf Github ein "all-in-one Docker image for machine learning" zur Verfügung. Dieses enthält unter anderem die Pakete Numpy, Pandas, Matplotlib, SciPy, Seaborn und Yellowbrick. Wer bereits ein wenig Erfahrung im Umgang mit Docker hat, kann dieses Image ohne Mühe installieren und hat dann in kürzester Zeit einen funktionierenden Jupyter Notebook Server zur Verfügung, auf dem sich mit Pandas arbeiten lässt. Docker läuft unter Windows ebenso wie unter Mac OS und Linux.
⁃ Ausführen von Jupyter-Notebooks auf Binder oder Google Colab
Unter https://mybinder.org/ stellt "binder" unentgeltlich einen JupyterHub Server zur Verfügung, auf dem sich Docker-Container mit Python-, R- oder Julia-Code ausführen lassen. Alles, was es braucht, ist ein Github-Repository, aus dem sich "binder" die benötigten Dateien holt, um daraus einen Container zu erstellen und darin einen Jupyter Notebook Server zu starten. Im Minimum erforderlich sind ein Jupyter Notebook ([Dateiname].ipynb) und eine Datei mit dem Namen 'requirements.txt', in der 'pandas' stehen muss, damit Pandas im Container installiert wird.
Auch ohne Github-Repository, dafür mit einem Google-Konto, kann man unter https://colab.research.google.com/drive/ Jupyter Notebooks erstellen und ausführen. Da Colab bereits alle gängigen Pakete für Arbeiten im Bereich Datenanalyse und Machine Learning installiert hat, reicht es, in den Python Code die Zeile "import pandas" bzw. "import pandas as pd" einzufügen.
Hat man Python/Pandas installiert oder den entsprechenden Notebook-Server gestartet, steht einem eine grosse Zahl an Möglichkeiten offen. Als Beispiel dafür, was mit wenig Aufwand machbar ist sei hier die Aufgabe gestellt, drei CSV-Dateien, die von Google Analytics heruntergeladen wurden, zusammenzuführen und monatsweise zusammenzufassen.
Ausgangsdaten: ⁃ users.csv ⁃ sessions.csv ⁃ pageviews.csv
Die Daten sehen - in verkürzter Form - so aus:
Day Index,Users
8/28/22,471
8/29/22,512
8/30/22,476
8/31/22,423
9/1/22,510
9/2/22,409
9/3/22,386
...
Day Index,Sessions
8/28/22,502
8/29/22,565
8/30/22,499
8/31/22,487
9/1/22,553
9/2/22,459
9/3/22,407
...
Day Index,Pageviews
8/28/22,810
8/29/22,867
8/30/22,685
8/31/22,924
9/1/22,774
9/2/22,589
9/3/22,618
...
Was wir möchten, ist eine Tabelle, deren Zeilen diese Struktur haben:
Day Index,Users,Sessions,Pageviews
8/28/22,471,502,810
8/29/22,512,565,867
...
Und schliesslich möchten wir noch die Zahlen für August und September summieren, so dass sich folgende Kreuztabelle ergibt:
Monat,Users,Sessions,Pageviews
August,1882,2053,3286
September,1305,1419,1981
Total,3187,3472,5267
Mit Pandas lässt sich diese Aufgabe ohne grossen Programmieraufwand erledigen.
import pandas as pd
files = ["Sessions","Users","Pageviews"]
filename_template = '{} 20210101-20211014.csv'
dataframes = []
for i in range (0,len(files)):
csv_data_file = filename_template.format(files[i])
cols = ['Day Index',files[i]]
df_tmp = pd.read_csv(csv_data_file,sep=',',header=0, usecols=cols, parse_dates=[0], index_col=0,thousands=',')
df_tmp[files[i]] = df_tmp[files[i]].astype(int)
dataframes += [df_tmp]
df_merged = pd.merge(
pd.merge(dataframes[0],
dataframes[1],
left_index=True,
right_index=True
),
dataframes[2],
left_index=True,
right_index=True
)
df_merged['Year'] = df_merged.index.year.astype('category')
df_merged['Month'] = df_merged.index.month.astype('category')
pivot = pd.pivot_table(df_merged,
index=['Month'],
columns=['Year'],
values=["Users","Sessions","Pageviews"],
aggfunc = 'sum',
fill_value=0, margins=False
)
Beispiel für eine Kreuztabelle (Pivot Table)
Pageviews | Sessions | Users | ||||
---|---|---|---|---|---|---|
Year | 2021 | 2022 | 2021 | 2022 | 2021 | 2022 |
Month | ||||||
1 | 9245276 | 2619203 | 2390611 | 261917 | 1640285 | 26189 |
2 | 9205413 | 0 | 2276599 | 0 | 1560994 | 0 |
3 | 9973808 | 0 | 2466865 | 0 | 1679733 | 0 |
4 | 9778438 | 0 | 2415951 | 0 | 1669745 | 0 |
5 | 11028055 | 0 | 2615205 | 0 | 1778502 | 0 |
6 | 11101271 | 0 | 2570095 | 0 | 1770023 | 0 |
7 | 11697018 | 0 | 2668631 | 0 | 1811710 | 0 |
8 | 9916761 | 0 | 2713303 | 0 | 1906870 | 0 |
9 | 10574801 | 0 | 2690550 | 0 | 1916595 | 0 |
10 | 5378804 | 0 | 1307165 | 0 | 946210 | 0 |
Hätten wir es nur mit ein paar wenigen Datensätzen zu tun, könnten wir die Auswertung von Hand auf einem Blatt Papier schneller erledigen; bei bis zu 1000 Datensätzen lägen wir mit Excel oder Google Sheets gut im Rennen, doch wenn wir es mit einer grösseren Menge an Daten zu tun haben, ist Pandas der Favorit.