Thanks for the tips. This is what I have so far, cashflow.py and balance.py
cashflow.py
import datetime
import pandas as pd
import csv
import os
class CashFlow(object):
def __init__(self, name='cashflow'):
self.name = name
self.columns = ['date_of_activity', 'description', 'amount']
self.series = pd.DataFrame(columns=self.columns)
def generate_series(self, description, amount, frequency='MS',
start=datetime.date(datetime.date.today().year, 1, 1),
end=datetime.date(datetime.date.today().year, 12, 31)):
"""Generate a new data series and append it to the existing data"""
data = [(date_of_activity, description, amount)
for date_of_activity in pd.date_range(start, end, freq=frequency)]
self.series = pd.concat(
[self.series, pd.DataFrame(data, columns=self.columns)])
def add_event(self, description, amount, date_of_activity):
"""Add a single event"""
self.generate_series(description, amount, frequency='D',
start=date_of_activity, end=date_of_activity),
def export_to_csv(self, dirpath, filename):
""" Export the data to a csv file."""
""" Sort data by 1) date_of_activity ascending and 2) amount ascending before the export."""
path = os.path.join(dirpath, filename)
with open(path, 'w') as csvfile:
csv_writer = csv.writer(csvfile, delimiter=',')
csv_writer.writerow(self.columns)
self.series.sort_values(by=['date_of_activity', 'amount'], ascending=[
True, True], inplace=True)
for index, record in self.series.iterrows():
csv_writer.writerow(record)
balance.py
import pandas as pd
import plotly.express as px
import datetime
import cashflow
cf = cashflow.CashFlow('Cash flow forecast')
# Balance
balance = 98000
# start_date
start_year = 2022
start_month= 6
start_day = 2
# End date
end_year = 2022
end_month = 12
end_day = 29
# Generate data
cf.add_event('Original balance', balance, datetime.date(start_year, start_month, start_day))
# weekly
cf.generate_series('Food', -100, frequency='W',
start=datetime.date(2022, 6, 3), end=datetime.date(end_year, end_month, end_day))
# Monthly
cf.generate_series('Rent', -1500, frequency='M',
start=datetime.date(2022, 6, 3), end=datetime.date(end_year, end_month, end_day))
# Quarterly
cf.generate_series('subscription', -1500, frequency='Q',
start=datetime.date(2022, 6, 15), end=datetime.date(end_year, end_month, end_day))
# One-offs
cf.add_event('One off payment - auto', -5000, datetime.date(2023, 5, 15))
#
# Show the data
print(cf.series)
cf.export_to_csv('', 'balance.csv')
However the output still does not match up with the startdates
that I have in balance.py
. :
date_of_activity,description,amount
2022-06-02 00:00:00,Original balance,98000
2022-06-05 00:00:00,Food,-100
2022-06-12 00:00:00,Food,-100
2022-06-19 00:00:00,Food,-100
2022-06-26 00:00:00,Food,-100
2022-07-01 00:00:00,Rent,-1500
2022-07-01 00:00:00,subscription,-1500
Food should start at the 3-6-2022, but in the output starts at the 5-6-2022. It seems that the date frequency for week is fixed to Sundays?