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())
예제 #2
0
    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
예제 #3
0
    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]))
예제 #4
0
    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]))
예제 #5
0
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
예제 #7
0
    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()
예제 #8
0
    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
예제 #9
0
    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]))
예제 #10
0
 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)