Newer
Older
xmpp-bot / python / report.py
#!/usr/bin/python3

# TODO format output

import pandas as pd
import argparse

# setup CLI parsing
parser = argparse.ArgumentParser(
    prog='xmpp-expenses-report',
    description='Generate a report from a CSV file generated by the XMPP expense bot.',
    epilog='')

parser.add_argument('-f', '--filename')
parser.add_argument('-n', '--nexp')
parser.add_argument('-l', '--lang')
args = parser.parse_args()

# localize

sentences = { 'it':
                [f'Ciao, ecco le ultime {args.nexp} spese:',
                 f'Totale speso dal',
                 f'Totale per ogni utente dal'],
              'en':
                [f'Hi, here\'s the latest {args.nexp} expenses:',
                 f'Total sum of expenses since',
                 f'Sum of expenses for every user since']}


# load CSV
df = pd.read_csv(args.filename)
df['dt'] = pd.to_datetime(df['Time'])
df['FloatValue'] = df[['Value']].astype(float)

recent = df.sort_values(by='dt', ascending=False)

# latest N expenses
print(sentences[args.lang][0] + '\n')

print(
    recent[['ID', 'Time', 'Value', 'User', 'Notes']]
    .head(int(args.nexp))   # only print latest args.nexp expenses
    .to_string(index=False))

# totals of whole
startdate = recent.dt.iloc[-1].date()
ntot = recent.FloatValue.sum()

print('\n{0} {1}:\n{2:.2f} euro'.format(
    sentences[args.lang][1],
    startdate,
    abs(ntot)))

usertot = pd.DataFrame(recent[['User','FloatValue']].groupby('User', group_keys=True).sum())

print('\n{0} {1}:'.format(
    sentences[args.lang][2],
    startdate))

for user,value in usertot.iterrows():
    print('{0}: {1:.2f} euro'.format(user,abs(value.values[0])))