Datamunging with Python & Sqlite

1 Ein Beispiel

1.1 Imports

Zuerst laden wir die entsprechenden Bibliotheken:

import pandas as pd
import sqlite3

Wir nutzen pandas 1um die Daten aus den CSV-Dateien einzulesen und als SQLite Datenbank abzuspeichern.

1.2 Daten einlesen

Zuerst das Einlesen - wichtig ist hier nur, den Feldtrenner (Tab) anzugeben.

df1 = pd.read_csv('data1.txt', sep='\t')
df2 = pd.read_csv('data2.txt', sep='\t')

print(df1)
print(df2)
>>> >>>      ptnumber gender         dob  age      labno  result1
0      213033      M  08/11/1977   39  17U303726     1.18
1      464621      M  19/11/1970   45  16U861786    25.66
2      481464      M  11/12/1963   53  17U363928    33.72
3      483077      M  24/03/1990   27  17U245750      NaN
4      485389      M  01/03/1990   27  17U505232    27.96
5      485395      M  01/05/1978   39  17U477665    21.27
6      487086      M  04/05/1991   26  17U476600     6.90
7      487129      M  16/04/1987   30  17U470278    23.23
8    41419337      M  12/01/1972   45  17U087018     0.09
9  UB00527828      F  26/06/1979   37  16U582511      NaN
labno    ptnumber gender         dob  age  result2
0  17U303726      213033      M  08/11/1977   39        1
1  17U087018    41419337      M  12/01/1972   45        1
2  17U363928      481464      M  11/12/1963   53        0
3  17U245750      483077      M  24/03/1990   27        0
4  16U582511  UB00527828      F  26/06/1979   37        0
5  17U505232      485389      M  01/03/1990   27        1
6  17U476600      487086      M  04/05/1991   26        1

Jezt die Daten in eine SQLite-Datenbank schreiben.

with sqlite3.connect("dataframes.sqlite") as con:
    df1.to_sql('data1', con)
    df2.to_sql('data2', con)

Die Daten sind jetzt persistent in der Datenbank und können später wieder eingelesen werden.

1.3 Daten verarbeiten

with sqlite3.connect("dataframes.sqlite") as con:
    sql = '''SELECT data.ptnumber, result1, result2 FROM data, data2
             WHERE data.ptnumber = data2.ptnumber'''
    df3 = pd.read_sql_query(sql, con)

df3.head()
... ... ... >>>   ptnumber  result1  result2
0   213033     1.18        1
1   481464    33.72        0
2   483077      NaN        0
3   485389    27.96        1
4   487086     6.90        1

Schön an Pandas ist, dass die Bibliothek heuristisch versucht vernünftige Datentypen zu ermitteln. Dabei wird auch aus dem String 'NaN' in der SQL-Datenbank ein 'unknown'.

print(df3.dtypes)
ptnumber     object
result1     float64
result2       int64
dtype: object

Auch wenn das erst einmal wie einfache Tabellen aussieht - das sind Frames (ähnlich wie in R):

df2.describe()
age   result2
count   7.000000  7.000000
mean   36.285714  0.571429
std    10.339476  0.534522
min    26.000000  0.000000
25%    27.000000  0.000000
50%    37.000000  1.000000
75%    42.000000  1.000000
max    53.000000  1.000000