In [1]:
import gspread, gspread_dataframe
from oauth2client.service_account import ServiceAccountCredentials

import pandas as pd
import re

def num_to_col_letters(num) :
    letters = ''
    while num:
        mod = (num - 1) % 26
        letters += chr(mod + 65)
        num = (num - 1) // 26
    return ''.join(reversed(letters))

In [2]:
def connect_to_sheets(spreadsheet='GemeinsameBilanzierung_16_17', sheetname='') :
    
    if type(spreadsheet) is str : 
        scope = ['https://spreadsheets.google.com/feeds']
        creds = ServiceAccountCredentials.from_json_keyfile_name('client-secret.json', scope)
        client = gspread.authorize(creds)
        spreadsheet = client.open(spreadsheet)

    # Find a workbook by name and open the first sheet
    # Make sure you use the right name here.
    if sheetname == '' :
        return spreadsheet
    else :
        worksheet = spreadsheet.worksheet(sheetname)
        return worksheet

In [4]:
res = { # re for at all valid
               'valid_range' : r'^[A-Z]+\d*(:[A-Z]+\d*)?$',
               # re for complete range
               'normal_range' : r'^[A-Z]+\d+:[A-Z]+\d+$',
               # re for single cell
               'single_cell' : r'^[A-Z]+\d+$',
               # re for only letters
               'only_cols' : r'^[A-Z]+:[A-Z]+$',
               # re for open end
               'missing_start' : r'^[A-Z]+\d+:[A-Z]+$',
               # re for open beginning
               'missing_end' : r'^[A-Z]+:[A-Z]+\d+$'}

def normalize_range(range_string, worksheet) :
    re_strings = [
                # re for at all valid
                r'^[A-Z]+\d*(:[A-Z]+\d*)?$', 
                # re for complete range
                r'^[A-Z]+\d+:[A-Z]+\d+$',
                # re for single cell
                r'^[A-Z]+\d+$',
                # re for only letters
                r'^[A-Z]+:[A-Z]+$',
                # re for open end
                r'^[A-Z]+\d+:[A-Z]+$',
                # re for open beginning
                r'^[A-Z]+:[A-Z]+\d+$']
    res = [re.compile(re_string) for re_string in re_strings]
    if not res[0].match(range_string) :
        raise RuntimeError('This is not a valid descriptor of ranges or cells')
    if res[1].match(range_string) or res[2].match(range_string) :
        return range_string
    if res[5].match(range_string) :
        pos_colon = range_string.find(':')
        return range_string[0:pos_colon] + '1' + range_string[pos_colon:]
    if res[4].match(range_string) :
        return range_string + str(worksheet.row_count)
    if res[3].match(range_string) :
        pos_colon = range_string.find(':')
        return range_string[0:pos_colon] + '1' + range_string[pos_colon:] + str(worksheet.row_count)
    
# def get_rowcol_range(range_string, worksheet) :

In [6]:
def read_gsheet_into_df(range_string, worksheet, date_col=None) :
    range_string = normalize_range(range_string, worksheet)
    cell_range = worksheet.range(range_string)
    result = pd.DataFrame()
    for cell in cell_range :
        if pd.isnull(cell.numeric_value) :
            if cell.value == '' :
                value = cell.numeric_value
            else :
                value = cell.value
        else :
            value = round(cell.numeric_value, 2)
        result.loc[cell.row, num_to_col_letters(cell.col)] = value
        
    if date_col is not None and date_col in result.columns :
        result[date_col] = pd.to_datetime('1899-12-30') + pd.to_timedelta(result[date_col], 'D')
    return result.dropna(how='all')

In [7]:
def read_gsheet_into_df(range_string, worksheet, date_col=None) :
    range_string = normalize_range(range_string, worksheet)
    gspread.models.
            
    if date_col is not None and date_col in result.columns :
        result[date_col] = pd.to_datetime('1899-12-30') + pd.to_timedelta(result[date_col], 'D')
    return result.dropna(how='all')


  File "<ipython-input-7-44da3d80670c>", line 3
    gspread.models.
                   ^
SyntaxError: invalid syntax

In [8]:
workbook = connect_to_sheets()
sheet = connect_to_sheets(workbook, 'August')

In [9]:
col_titles = ['description', 'date', 'amount']

budgeting = read_gsheet_into_df('A6:D', sheet, 'C')
budgeting.columns = ['budget_type'] + col_titles

max_bargeld = read_gsheet_into_df('H7:J', sheet, 'I')
max_bargeld.columns = col_titles
max_bargeld['money_pot'] = 'BM'

paul_bargeld = read_gsheet_into_df('K7:M', sheet, 'L')
paul_bargeld.columns = col_titles
paul_bargeld['money_pot'] = 'BP'

konto = read_gsheet_into_df('N7:P', sheet, 'O')
konto.columns = col_titles
konto['money_pot'] = 'KG'

conjoined = pd.concat([max_bargeld, paul_bargeld, konto])

display(budgeting, conjoined)


budget_type description date amount
6 R Miete 2017-08-01 -568.00
7 R Miete FFM 2017-08-02 -450.00
8 R Berufsunfähigkeitsversicherung 2017-08-01 -49.05
9 R Strom EnviaM NaT -51.00
10 R Vodafone NaT -19.99
11 M Telefonie NaT -6.00
12 R Rechtsschutzversicherung 2017-01-30 -13.90
13 R Haftpflichtversicherung 2017-08-01 -7.50
14 G GEW NaT -2.50
15 R Semestergebühr Paul 2016-06-21 -46.15
16 R GEZ 2017-03-31 -17.50
17 R Handy Max 2017-08-10 -7.99
18 R Handy Paul 2017-08-10 -7.99
19 G Spotify Max 2017-08-15 -4.99
20 G Apple Music Paul NaT -4.99
21 G Backblaze Max 2017-04-18 -3.77
22 G Backblaze Paul 2017-04-18 -3.77
23 G Fitnessstudio 2017-08-03 -39.80
24 L Aldi 2017-07-31 -23.97
25 R Monatskarte FFM 2017-07-31 -87.40
26 L Netto 2017-07-31 -9.44
27 L Rewe 2017-08-01 -8.71
28 D Rossmann 2017-08-01 -9.17
29 D DM 2017-08-01 -9.45
30 D DM 2017-08-01 -12.25
31 AM Mittagessen Casino 2017-08-01 -2.80
32 L Türkischer Supermarkt 2017-08-01 -10.37
33 L Brot 2017-08-01 -0.95
34 AM Doppelter Kaffee Trianon 2017-08-02 -1.50
35 AM Kaffee 2017-08-02 -0.70
... ... ... ... ...
61 AM Mr Tom 2017-08-07 -0.40
62 AM Kaffee 2017-08-07 -0.70
63 L Brot 2017-08-08 -1.40
64 AM Mittagssalat 2017-08-10 -2.26
65 S Rossmann Zahnbürste 2017-08-10 -15.99
66 D Rossmann 2017-08-10 -4.54
67 L Edeka 2017-08-10 -3.17
68 AM Miitag Zwiebelsuppe 2017-08-11 -0.60
69 AM Espresso 2017-08-11 -0.80
70 AM Mr Tom 2017-08-11 -0.40
71 L Aldi 2017-08-11 -19.31
72 D Schirm Rossmann 2017-08-11 -2.95
73 A Eisessen 2017-08-13 -4.80
74 L Wasser 2017-08-13 -1.30
75 L Rewe 2017-08-13 -34.42
76 A Eisessen 2017-08-13 -4.80
77 A Wasser 2017-08-13 -1.30
78 AM Balisto 2017-08-14 -0.50
79 L Netto 2017-08-14 -13.42
80 T Fahrkarte Frankfurt 2017-08-14 -2.90
81 AM Mittagessen Casino 2017-08-15 -4.30
82 AM KitKat 2017-08-15 -1.00
83 L Rewe 2017-08-16 -17.57
84 AM Kakao 2017-08-16 -0.40
85 L Real 2017-08-18 -10.19
86 L Rewe 2017-08-18 -2.69
87 AM Suppe 2017-08-18 -0.60
88 T Sitzplatz reservierung 2017-08-18 -4.50
89 A Eisessen 2017-08-17 -1.20
90 M Toilette 2017-08-18 -0.25

85 rows × 4 columns

description date amount money_pot
7 Geld aufladen Mitarbeiter ausweis 2017-08-01 -20.00 BM
8 Geld abheben 2017-08-03 30.00 BM
9 Geld aufladen Trianon 2017-08-02 -20.00 BM
10 Geld aus Schatulle 2017-08-05 1.30 BM
11 Betriebsausflug 2017-08-07 -18.50 BM
12 Geldfund 2017-08-12 0.05 BM
13 Eisessen 2017-08-13 -4.80 BM
14 Wasser 2017-08-13 -1.30 BM
15 BBk Karte Aufladen 2017-08-14 -10.00 BM
16 Eisessen 2017-08-17 -1.20 BM
17 Toilette 2017-08-18 -0.25 BM
7 Geld aus Schatulle NaT 1.00 BP
8 Brot 2017-08-01 -0.95 BP
9 Brot 2017-08-08 -1.40 BP
10 Geld aus Schatulle 2017-08-08 1.35 BP
7 Budgetbeitrag von BMS 2017-07-28 1468.00 KG
8 Aldi 2017-07-31 -23.97 KG
9 Monatskarte FFM 2017-07-31 -87.40 KG
10 Netto 2017-07-31 -9.44 KG
11 Haftpflichtversicherung 2017-08-01 -7.50 KG
12 Berufsunfähigkeitsversicherung 2017-08-01 -49.05 KG
13 Miete 2017-08-01 -568.00 KG
14 Rewe 2017-08-01 -8.71 KG
15 Rossmann 2017-08-01 -9.17 KG
16 DM 2017-08-01 -9.45 KG
17 DM 2017-08-01 -12.25 KG
18 Türkischer Supermarkt 2017-08-01 -10.37 KG
19 Miete FFM auf Max Konto 2017-08-02 450.00 KG
20 Miete FFM 2017-08-02 -450.00 KG
21 Ausgehen mit Kollegen 2017-08-02 -20.60 KG
... ... ... ... ...
27 H&M 2017-08-05 -55.08 KG
28 Rewe Wasser 2017-08-05 -1.17 KG
29 Sommerticket DB 2017-08-05 -96.00 KG
30 Sommerticket DB 2017-08-05 -96.00 KG
31 Edeka 2017-08-05 -5.43 KG
32 Amazon Bestellung 2017-08-06 -39.24 KG
33 Sitzplatz reservierung 2017-08-06 -4.50 KG
34 Rewe 2017-08-07 -21.00 KG
35 H&M Hose 2017-08-07 -30.14 KG
36 Briefmarken 2017-08-07 -21.50 KG
37 Netto 2017-08-07 -16.60 KG
38 Real 2017-08-07 -3.99 KG
39 Amazon Festplatte Paul 2017-08-06 -52.94 KG
40 Amazon Fail Topf 2017-08-06 -4.61 KG
41 Handy Max 2017-08-10 -7.99 KG
42 Handy Paul 2017-08-10 -13.99 KG
43 Rossmann 2017-08-10 -20.53 KG
44 Edeka 2017-08-10 -3.17 KG
45 Aldi 2017-08-11 -19.31 KG
46 Schirm Rossmann 2017-08-11 -2.95 KG
47 Rewe 2017-08-13 -34.42 KG
48 Sommerticket DB 2017-08-14 -192.00 KG
49 Vorschuss für Sparticket 2017-08-14 192.00 KG
50 Netto 2017-08-14 -13.42 KG
51 Spotify Max 2017-08-15 -4.99 KG
52 Rewe 2017-08-16 -17.57 KG
53 Fahrkarte Frankfurt 2017-08-14 -2.90 KG
54 Real 2017-08-18 -10.19 KG
55 Rewe 2017-08-18 -2.69 KG
56 Sitzplatz reservierung 2017-08-18 -4.50 KG

65 rows × 4 columns


In [12]:
all_info = pd.merge(budgeting, conjoined, how='outer', 
                    on=['description', 'date', 'amount'])

display(all_info)

perfect_result = all_info.dropna()
display(perfect_result)


budget_type description date amount money_pot
0 R Miete 2017-08-01 -568.00 KG
1 R Miete FFM 2017-08-02 -450.00 KG
2 R Berufsunfähigkeitsversicherung 2017-08-01 -49.05 KG
3 R Strom EnviaM NaT -51.00 NaN
4 R Vodafone NaT -19.99 NaN
5 M Telefonie NaT -6.00 NaN
6 R Rechtsschutzversicherung 2017-01-30 -13.90 NaN
7 R Haftpflichtversicherung 2017-08-01 -7.50 KG
8 G GEW NaT -2.50 NaN
9 R Semestergebühr Paul 2016-06-21 -46.15 NaN
10 R GEZ 2017-03-31 -17.50 NaN
11 R Handy Max 2017-08-10 -7.99 KG
12 R Handy Paul 2017-08-10 -7.99 NaN
13 G Spotify Max NaT -4.99 NaN
14 G Apple Music Paul NaT -4.99 NaN
15 G Backblaze Max 2017-04-18 -3.77 NaN
16 G Backblaze Paul 2017-04-18 -3.77 NaN
17 G Fitnessstudio 2017-08-03 -39.80 KG
18 L Aldi 2017-07-31 -23.97 KG
19 R Monatskarte FFM 2017-07-31 -87.40 KG
20 L Netto 2017-07-31 -9.44 KG
21 L Rewe 2017-08-01 -8.71 KG
22 D Rossmann 2017-08-01 -9.17 KG
23 D DM 2017-08-01 -9.45 KG
24 D DM 2017-08-01 -12.25 KG
25 AM Mittagessen Casino 2017-08-01 -2.80 NaN
26 L Türkischer Supermarkt 2017-08-01 -10.37 KG
27 L Brot 2017-08-01 -0.95 NaN
28 AM Doppelter Kaffee Trianon 2017-08-02 -1.50 NaN
29 AM Kaffee 2017-08-02 -0.70 NaN
... ... ... ... ... ...
54 AM Kaffee 2017-08-07 -0.70 NaN
55 AM Mr Tom 2017-08-07 -0.40 NaN
56 AM Mittagssalat 2017-08-10 -2.26 NaN
57 S Rossmann Zahnbürste 2017-08-10 -15.99 NaN
58 D Rossmann 2017-08-10 -4.54 NaN
59 AM Miitag Zwiebelsuppe 2017-08-11 -0.60 NaN
60 AM Espresso 2017-08-11 -0.80 NaN
61 AM Mr Tom 2017-08-11 -0.40 NaN
62 A Eisessen 2017-08-13 -4.80 BM
63 L Wasser 2017-08-13 -1.30 BM
64 L Aldi 2017-08-11 -19.31 KG
65 D Schirm Rossmann 2017-08-11 -2.95 KG
66 L Rewe 2017-08-13 -34.42 KG
67 NaN Geld aufladen Mitarbeiter ausweis 2017-08-01 -20.00 BM
68 NaN Geld abheben 2017-08-03 30.00 BM
69 NaN Geld aufladen Trianon 2017-08-02 -20.00 BM
70 NaN Geld aus Schatulle 2017-08-05 1.30 BM
71 NaN Betriebsausflug 2017-08-07 -18.50 BM
72 NaN Geldfund 2017-08-12 0.05 BM
73 NaN Geld aus Schatulle NaT 1.00 BP
74 NaN Brot NaT -0.95 BP
75 NaN Budgetbeitrag von BMS 2017-07-28 1468.00 KG
76 NaN Miete FFM auf Max Konto 2017-08-02 450.00 KG
77 NaN Ausgehen mit Kollegen 2017-08-02 -20.60 KG
78 NaN Abheben 2017-08-03 -30.00 KG
79 NaN Sommerticket DB 2017-08-05 -96.00 KG
80 NaN Sommerticket DB 2017-08-05 -96.00 KG
81 NaN Amazon Fail Topf 2017-08-06 -4.61 KG
82 NaN Handy Paul 2017-08-10 -13.99 KG
83 NaN Rossmann 2017-08-10 -20.53 KG

84 rows × 5 columns

budget_type description date amount money_pot
0 R Miete 2017-08-01 -568.00 KG
1 R Miete FFM 2017-08-02 -450.00 KG
2 R Berufsunfähigkeitsversicherung 2017-08-01 -49.05 KG
7 R Haftpflichtversicherung 2017-08-01 -7.50 KG
11 R Handy Max 2017-08-10 -7.99 KG
17 G Fitnessstudio 2017-08-03 -39.80 KG
18 L Aldi 2017-07-31 -23.97 KG
19 R Monatskarte FFM 2017-07-31 -87.40 KG
20 L Netto 2017-07-31 -9.44 KG
21 L Rewe 2017-08-01 -8.71 KG
22 D Rossmann 2017-08-01 -9.17 KG
23 D DM 2017-08-01 -9.45 KG
24 D DM 2017-08-01 -12.25 KG
26 L Türkischer Supermarkt 2017-08-01 -10.37 KG
31 L Real 2017-08-02 -6.86 KG
38 L Kaufland 2017-08-04 -13.95 KG
40 A McDonalds 2017-08-05 -2.59 KG
41 S H&M 2017-08-05 -55.08 KG
42 L Rewe Wasser 2017-08-05 -1.17 KG
43 L Edeka 2017-08-05 -5.43 KG
45 T Sitzplatz reservierung 2017-08-06 -4.50 KG
46 S Amazon Bestellung 2017-08-06 -39.24 KG
47 L Rewe 2017-08-07 -21.00 KG
48 S H&M Hose 2017-08-07 -30.14 KG
49 M Briefmarken 2017-08-07 -21.50 KG
50 L Netto 2017-08-07 -16.60 KG
51 L Real 2017-08-07 -3.99 KG
52 S Amazon Festplatte Paul 2017-08-06 -52.94 KG
62 A Eisessen 2017-08-13 -4.80 BM
63 L Wasser 2017-08-13 -1.30 BM
64 L Aldi 2017-08-11 -19.31 KG
65 D Schirm Rossmann 2017-08-11 -2.95 KG
66 L Rewe 2017-08-13 -34.42 KG

In [14]:
import sqlite3 as sql
db = sql.connect('my-budget-v0.sqlite')

In [26]:
def id_generation(date) :
    date_int = int(date.strftime('%Y%m%d'))
    crsr = db.cursor()
    crsr.execute('SELECT id FROM money_events WHERE id BETWEEN {} AND {}'.format(
        date_int, date_int + 99))
    results = [row[0] for row in crsr.fetchall()]

    current_id = date_int + 1
    while current_id in results :
        current_id += 1
    if current_id > date_int + 99 :
        raise IndexError('Encountered to many ids for the date {}'.format(date))

    return current_id

In [28]:
def simple_payment(date, description, amount, budget_type, transaction_type, money_pot): 
    new_id = id_generation(date)
    crsr = db.cursor()

    crsr.execute("INSERT INTO money_events VALUES ({}, '{}', '{}', DATE('{}'), NULL, NULL, 'auto-gen');".format(
        new_id, transaction_type, description, date))
    crsr.execute("INSERT INTO budget_events VALUES ({}, '{}', {}, NULL, DATE('{}'), NULL, NULL, 'auto-gen');".format(
        new_id, budget_type, amount, date))
    crsr.execute("INSERT INTO payments VALUES ({}, '{}', {}, NULL, NULL, DATE('{}'), NULL, NULL, 'auto-gen');".format(
        new_id, money_pot, amount, date))

    db.commit()

In [29]:
for index, row in perfect_result.iterrows() :
    simple_payment(row['date'], row['description'], row['amount'], row['budget_type'], 
                   'Kartenzahlung' if row['money_pot'] == 'KG' else 'Barzahlung', row['money_pot'])


2017-08-01 00:00:00
2017-08-02 00:00:00
2017-08-01 00:00:00
2017-08-01 00:00:00
2017-08-10 00:00:00
2017-08-03 00:00:00
2017-07-31 00:00:00
2017-07-31 00:00:00
2017-07-31 00:00:00
2017-08-01 00:00:00
2017-08-01 00:00:00
2017-08-01 00:00:00
2017-08-01 00:00:00
2017-08-01 00:00:00
2017-08-02 00:00:00
2017-08-04 00:00:00
2017-08-05 00:00:00
2017-08-05 00:00:00
2017-08-05 00:00:00
2017-08-05 00:00:00
2017-08-06 00:00:00
2017-08-06 00:00:00
2017-08-07 00:00:00
2017-08-07 00:00:00
2017-08-07 00:00:00
2017-08-07 00:00:00
2017-08-07 00:00:00
2017-08-06 00:00:00
2017-08-13 00:00:00
2017-08-13 00:00:00
2017-08-11 00:00:00
2017-08-11 00:00:00
2017-08-13 00:00:00

In [30]:
def print_action_tables() :
    crsr = db.cursor()

    for table in ['money_events', 'budget_events', 'payments'] :
        display(pd.read_sql_query('SELECT * FROM {};'.format(table), db))
    
print_action_tables()


id type description creation_date modification_dates comments complete
0 20170732 Kartenzahlung Aldi 2017-07-31 None None YES
1 20170733 Kartenzahlung Monatskarte FFM 2017-07-31 None None YES
2 20170734 Kartenzahlung Netto 2017-07-31 None None YES
3 20170802 Kartenzahlung Miete 2017-08-01 None None YES
4 20170803 Kartenzahlung Miete FFM 2017-08-02 None None YES
5 20170804 Kartenzahlung Berufsunfähigkeitsversicherung 2017-08-01 None None YES
6 20170805 Kartenzahlung Haftpflichtversicherung 2017-08-01 None None YES
7 20170806 Kartenzahlung Fitnessstudio 2017-08-03 None None YES
8 20170807 Kartenzahlung Rewe 2017-08-01 None None YES
9 20170808 Kartenzahlung Rossmann 2017-08-01 None None YES
10 20170809 Kartenzahlung DM 2017-08-01 None None YES
11 20170810 Kartenzahlung DM 2017-08-01 None None YES
12 20170811 Kartenzahlung Handy Max 2017-08-10 None None YES
13 20170812 Kartenzahlung Türkischer Supermarkt 2017-08-01 None None YES
14 20170813 Kartenzahlung Real 2017-08-02 None None YES
15 20170814 Kartenzahlung Kaufland 2017-08-04 None None YES
16 20170815 Kartenzahlung McDonalds 2017-08-05 None None YES
17 20170816 Kartenzahlung H&M 2017-08-05 None None YES
18 20170817 Kartenzahlung Rewe Wasser 2017-08-05 None None YES
19 20170818 Kartenzahlung Edeka 2017-08-05 None None YES
20 20170819 Kartenzahlung Sitzplatz reservierung 2017-08-06 None None YES
21 20170820 Kartenzahlung Amazon Bestellung 2017-08-06 None None YES
22 20170821 Kartenzahlung Rewe 2017-08-07 None None YES
23 20170822 Kartenzahlung H&M Hose 2017-08-07 None None YES
24 20170823 Kartenzahlung Briefmarken 2017-08-07 None None YES
25 20170824 Kartenzahlung Netto 2017-08-07 None None YES
26 20170825 Kartenzahlung Real 2017-08-07 None None YES
27 20170826 Kartenzahlung Amazon Festplatte Paul 2017-08-06 None None YES
28 20170827 Barzahlung Eisessen 2017-08-13 None None YES
29 20170828 Barzahlung Wasser 2017-08-13 None None YES
30 20170829 Kartenzahlung Aldi 2017-08-11 None None YES
31 20170830 Kartenzahlung Schirm Rossmann 2017-08-11 None None YES
32 20170831 Kartenzahlung Rewe 2017-08-13 None None YES
id budget_pot amount additional_description creation_date modification_dates comments complete
0 20170802 R -568.00 None 2017-08-01 None None YES
1 20170803 R -450.00 None 2017-08-02 None None YES
2 20170804 R -49.05 None 2017-08-01 None None YES
3 20170805 R -7.50 None 2017-08-01 None None YES
4 20170811 R -7.99 None 2017-08-10 None None YES
5 20170806 G -39.80 None 2017-08-03 None None YES
6 20170732 L -23.97 None 2017-07-31 None None YES
7 20170733 R -87.40 None 2017-07-31 None None YES
8 20170734 L -9.44 None 2017-07-31 None None YES
9 20170807 L -8.71 None 2017-08-01 None None YES
10 20170808 D -9.17 None 2017-08-01 None None YES
11 20170809 D -9.45 None 2017-08-01 None None YES
12 20170810 D -12.25 None 2017-08-01 None None YES
13 20170812 L -10.37 None 2017-08-01 None None YES
14 20170813 L -6.86 None 2017-08-02 None None YES
15 20170814 L -13.95 None 2017-08-04 None None YES
16 20170815 A -2.59 None 2017-08-05 None None YES
17 20170816 S -55.08 None 2017-08-05 None None YES
18 20170817 L -1.17 None 2017-08-05 None None YES
19 20170818 L -5.43 None 2017-08-05 None None YES
20 20170819 T -4.50 None 2017-08-06 None None YES
21 20170820 S -39.24 None 2017-08-06 None None YES
22 20170821 L -21.00 None 2017-08-07 None None YES
23 20170822 S -30.14 None 2017-08-07 None None YES
24 20170823 M -21.50 None 2017-08-07 None None YES
25 20170824 L -16.60 None 2017-08-07 None None YES
26 20170825 L -3.99 None 2017-08-07 None None YES
27 20170826 S -52.94 None 2017-08-06 None None YES
28 20170827 A -4.80 None 2017-08-13 None None YES
29 20170828 L -1.30 None 2017-08-13 None None YES
30 20170829 L -19.31 None 2017-08-11 None None YES
31 20170830 D -2.95 None 2017-08-11 None None YES
32 20170831 L -34.42 None 2017-08-13 None None YES
id money_pot amount additional_description budget_effect_date creation_date modification_dates comments complete
0 20170802 KG -568.00 None None 2017-08-01 None None YES
1 20170803 KG -450.00 None None 2017-08-02 None None YES
2 20170804 KG -49.05 None None 2017-08-01 None None YES
3 20170805 KG -7.50 None None 2017-08-01 None None YES
4 20170811 KG -7.99 None None 2017-08-10 None None YES
5 20170806 KG -39.80 None None 2017-08-03 None None YES
6 20170732 KG -23.97 None None 2017-07-31 None None YES
7 20170733 KG -87.40 None None 2017-07-31 None None YES
8 20170734 KG -9.44 None None 2017-07-31 None None YES
9 20170807 KG -8.71 None None 2017-08-01 None None YES
10 20170808 KG -9.17 None None 2017-08-01 None None YES
11 20170809 KG -9.45 None None 2017-08-01 None None YES
12 20170810 KG -12.25 None None 2017-08-01 None None YES
13 20170812 KG -10.37 None None 2017-08-01 None None YES
14 20170813 KG -6.86 None None 2017-08-02 None None YES
15 20170814 KG -13.95 None None 2017-08-04 None None YES
16 20170815 KG -2.59 None None 2017-08-05 None None YES
17 20170816 KG -55.08 None None 2017-08-05 None None YES
18 20170817 KG -1.17 None None 2017-08-05 None None YES
19 20170818 KG -5.43 None None 2017-08-05 None None YES
20 20170819 KG -4.50 None None 2017-08-06 None None YES
21 20170820 KG -39.24 None None 2017-08-06 None None YES
22 20170821 KG -21.00 None None 2017-08-07 None None YES
23 20170822 KG -30.14 None None 2017-08-07 None None YES
24 20170823 KG -21.50 None None 2017-08-07 None None YES
25 20170824 KG -16.60 None None 2017-08-07 None None YES
26 20170825 KG -3.99 None None 2017-08-07 None None YES
27 20170826 KG -52.94 None None 2017-08-06 None None YES
28 20170827 BM -4.80 None None 2017-08-13 None None YES
29 20170828 BM -1.30 None None 2017-08-13 None None YES
30 20170829 KG -19.31 None None 2017-08-11 None None YES
31 20170830 KG -2.95 None None 2017-08-11 None None YES
32 20170831 KG -34.42 None None 2017-08-13 None None YES

In [ ]: