def compute_applications(data, base_date): previous_month_data = rs.records_for_month(data, dth.months_ago(base_date, 1)) current_month_data = rs.records_for_month(data, base_date) difference = rs.total_amount_by( APPLICATIONS_GROUPBY, current_month_data) - rs.total_amount_by( APPLICATIONS_GROUPBY, previous_month_data) return difference.amount
def food_expenses(expenses, base_date): data = rs.total_amount_by('category', rs.records_for_month(expenses, base_date)) if 'mercado' in data.index and 'restaurante' in data.index: return pd.Series(data.loc['mercado'].amount + data.loc['restaurante'].amount) * -1 else: return pd.Series(0)
def distribution(expenses, incomes, categories={}): expenses_by_category = rs.total_amount_by('category', expenses) dist_by_spent = distribution_by_category(expenses, expenses) dist_by_income = distribution_by_category( expenses, incomes[incomes.category == 'renda']) * -1 data = { 'amount #': expenses_by_category.amount, '% by expenses': dist_by_spent.amount, '% by income': dist_by_income.amount, '% by income goal': categories, } return pd.DataFrame(data, columns=list(data.keys())).sort_values('amount #')
def preprocess_applications(funds): funds = normalize_amount(funds, 'application') funds = rs.total_amount_by(['date', 'title', 'type', 'account', 'goal'], funds).reset_index() funds = rs.describe_over_time(funds, compute_applications)\ .transpose()\ .reset_index()\ .melt(id_vars=APPLICATIONS_GROUPBY, var_name='date', value_name='amount') # Fix date to be in the beginning of month funds['date'] = pd.to_datetime( funds.date.map(lambda d: dth.beginning_of_month(rs.month_to_date(d)))) funds['category'] = 'aplicação' # Remove first month because there is no record for its previous month funds = funds[funds.date > funds.date.min()] return funds
def expenses_by_month(expenses): return rs.total_amount_by(rs.groupby_month(expenses), expenses)
def incomes_by_month(incomes): income_salary = incomes[incomes.category == 'renda'][['date', 'amount']] return rs.total_amount_by(rs.groupby_month(income_salary), income_salary)
def total_invested_by(column, invest): """Total invested grouped by column""" return rs.total_amount_by(column, ft.invested(invest))
def applications_for_month(incomes, base_date): """Total applications on current month given base_date""" applications = rs.records_for_month(ft.applications(incomes), base_date) return rs.total_amount_by('title', applications)
def total_discounts_by(column, incomes): """Total discounts grouped by column""" return rs.total_amount_by(column, ft.discounts(incomes))
def total_income_by(column, incomes): """Total incomes/salaries grouped by column""" return rs.total_amount_by(column, ft.income(incomes))
def total_applications_by(column, invest): """Total applications grouped by column""" return rs.total_amount_by(column, ft.applications(invest))
def distribution_by_category(expenses, denominator): denominator_sum = denominator.amount.sum() expenses_by_category = rs.total_amount_by('category', expenses).sort_values('amount') return expenses_by_category / denominator_sum
def preprocess_invested(funds): funds = normalize_amount(funds, 'gross amount') funds = rs.total_amount_by(['date', 'title', 'type', 'account', 'goal'], funds).reset_index() funds['category'] = 'valor aplicado' return funds