def prepare_data(self, data: DataProvider): df_all = data.get_all_transactions() df_agg_months = data.aggregate_by_category(df_all, 'MS', config.CATEGORY_MAIN_COL) self._prepare_data_monthly_chart(data, df_agg_months) self._prepare_data_average_table(df_agg_months.reset_index())
def prepare_data(self, data: DataProvider): df_all = data.get_all_transactions().copy() df_all.loc[df_all[config.CATEGORY_SUB_COL] == '', config.CATEGORY_SUB_COL] = config.MISC_CATEGORY for main_category in config.categories.keys(): df_cat = df_all.loc[ df_all[config.CATEGORY_MAIN_COL] == main_category, [config.CATEGORY_SUB_COL, config.ABSAMOUNT_COL]] self._x_axis, sub_category_values = data.aggregate_by_category_as_tuple( df_cat, 'MS', config.CATEGORY_SUB_COL, main_category) self._main_category_values[main_category] = sub_category_values
def test_aggregate_transactions_by_year(self): transactions = [ Transaction('123456', datetime(year=2018, month=3, day=5), 120.0, 'reason', 'recipient', config.INCOME_CATEGORY), Transaction('123456', datetime(year=2018, month=5, day=18), -50.0, 'reason', 'recipient', self.category1), Transaction('123456', datetime(year=2018, month=8, day=15), -30.0, 'reason', 'recipient', self.category1), Transaction('123456', datetime(year=2018, month=9, day=3), -100.0, 'reason', 'recipient', self.category2), Transaction('123456', datetime(year=2019, month=6, day=21), -150.0, 'reason', 'recipient', self.category2), ] data_provider = DataProvider.load(transactions) df_all = data_provider.get_all_transactions() x_axis, category_values = data_provider.aggregate_by_category_as_tuple( df_all, 'YS', config.CATEGORY_MAIN_COL) self.assertEqual(2, len(x_axis)) self.assertEqual(3, len( category_values.keys())) # includes income category self.assertListEqual([120.0, 0.0], list(category_values[config.INCOME_CATEGORY])) self.assertListEqual([80.0, 0.0], list(category_values[self.category1])) self.assertListEqual([100.0, 150.0], list(category_values[self.category2]))
def test_aggregate_different_expenses_by_month(self): transactions = [ Transaction('123456', datetime(year=2019, month=3, day=1), -20.0, 'reason', 'recipient', self.category1), Transaction('123456', datetime(year=2019, month=3, day=18), -50.0, 'reason', 'recipient', self.category2), Transaction('123456', datetime(year=2019, month=4, day=15), -30.0, 'reason', 'recipient', self.category1), Transaction('123456', datetime(year=2019, month=6, day=5), -100.0, 'reason', 'recipient', self.category2), Transaction('123456', datetime(year=2019, month=6, day=21), -150.0, 'reason', 'recipient', self.category2), ] data_provider = DataProvider.load(transactions) df_all = data_provider.get_all_transactions() x_axis, category_values = data_provider.aggregate_by_category_as_tuple( df_all, 'MS', config.CATEGORY_MAIN_COL) self.assertEqual(4, len(x_axis)) self.assertEqual(3, len(category_values.keys())) self.assertListEqual([20.0, 30.0, 0.0, 0.0], list(category_values[self.category1])) self.assertListEqual([50.0, 0.0, 0.0, 250.0], list(category_values[self.category2]))
def assign_category_to_transactions(): global _transactions transactions = _transactions category_finder = CategoryFinder() category_finder.assign_category(transactions) global _data_provider _data_provider = DataProvider.load(transactions) print_transactions_statistics(transactions)
def prepare_data(self, data: DataProvider): df_out = data.get_out_transactions() self._df_agg_years = df_out.groupby([ df_out.index.year, config.CATEGORY_MAIN_COL, config.CATEGORY_SUB_COL ])[config.ABSAMOUNT_COL].sum().reset_index() self._df_agg_years.loc[ self._df_agg_years.sub_category == '', config.CATEGORY_SUB_COL] = None # do not plot missing values
def prepare_data(self, data: DataProvider): column_order = [config.PAYMENT_REASON_COL, config.RECIPIENT_COL, config.CATEGORY_MAIN_COL, config.CATEGORY_SUB_COL, config.AMOUNT_COL] self._df_all_ta = data.get_all_transactions(). \ sort_values(by=[config.DATE_COL, config.CATEGORY_MAIN_COL, config.CATEGORY_SUB_COL]). \ loc[:, column_order].reset_index()
def prepare_data(self, data: DataProvider): """ Accumulates all transactions by category """ df_all = data.get_all_transactions() self._x_axis = list( map(lambda date: date, df_all.resample('D').sum().index)) for category_name in reversed(list(config.categories.keys())): df_category = df_all[df_all[config.CATEGORY_MAIN_COL] == category_name] df_category = df_category.resample('D').sum().reindex( df_all.index).resample('D').max().fillna(0) values = list(df_category[config.ABSAMOUNT_COL].cumsum()) self._cumulative_categories[category_name] = values
def test_aggregate_income_by_month(self): transactions = [ Transaction('123456', datetime(year=2019, month=3, day=5), 20.0, 'reason', 'recipient', config.INCOME_CATEGORY), Transaction('123456', datetime(year=2019, month=3, day=18), 50.0, 'reason', 'recipient', config.INCOME_CATEGORY), Transaction('123456', datetime(year=2019, month=5, day=8), 100.0, 'reason', 'recipient', config.INCOME_CATEGORY), ] data_provider = DataProvider.load(transactions) df_all = data_provider.get_all_transactions() x_axis, category_values = data_provider.aggregate_by_category_as_tuple( df_all, 'MS', config.CATEGORY_MAIN_COL) self.assertEqual(3, len(x_axis)) self.assertEqual(3, len(category_values.keys())) self.assertListEqual([70.0, 0.0, 100.0], list(category_values[config.INCOME_CATEGORY]))
def prepare_data(self, data: DataProvider): """ Preprocesses each transaction and calculates the relative amount within its category """ RATIO = 'ratio' df_all = data.get_all_transactions() for category_name in config.categories.keys(): df_category = df_all[df_all[config.CATEGORY_MAIN_COL] == category_name] category_total = df_category[config.ABSAMOUNT_COL].sum() df_category.loc[:, RATIO] = df_category[ config.ABSAMOUNT_COL] / category_total x_axis = list( map(lambda datetime: pd.Timestamp(datetime), pd.DatetimeIndex(df_category.index).values)) if x_axis: self._category_values[category_name] = ( x_axis, df_category[config.ABSAMOUNT_COL].values, df_category[RATIO].values, df_category[config.LABEL].values)
def _prepare_data_monthly_chart(self, data: DataProvider, df_agg_months: pd.DataFrame): self._x_axis, self._category_values = data.expand_by_categories( df_agg_months, config.CATEGORY_MAIN_COL)
def prepare_data(self, data: DataProvider): df_all = data.get_all_transactions() self._x_axis, self._category_values = data.aggregate_by_category_as_tuple( df_all, 'YS', config.CATEGORY_MAIN_COL)