From a79c245511bf79311b93d3696378bcfa9f9c0955 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 12 Apr 2025 15:20:05 +0100 Subject: [PATCH] almost there --- data_check.py | 7 ++++++- main.py | 2 ++ visuals/components.py | 8 +++----- visuals/dash_app.py | 14 ++++++++++---- visuals/layout.py | 45 ++++++++++++++++++++++++------------------- 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/data_check.py b/data_check.py index c288602..065313d 100644 --- a/data_check.py +++ b/data_check.py @@ -1,4 +1,5 @@ import polars as pl +from datetime import date, timedelta accounts = pl.read_parquet('data/warehouse/accounts.parquet') categories = pl.read_parquet('data/warehouse/categories.parquet') @@ -52,4 +53,8 @@ spend_per_payee = master_transactions.sql(''' ''' ) -print(spend_per_payee) \ No newline at end of file +# print(spend_per_day) +today = date(date.today()) + # Convert the dates to datetime objects that are compatible with Polars +start_date = pl.Date(today) +print(start_date) diff --git a/main.py b/main.py index ae494d5..431e2cd 100644 --- a/main.py +++ b/main.py @@ -35,6 +35,8 @@ def load_config(): except yaml.YAMLError as e: logging.error(f'Error loading config.yaml: {e}') sys.exit(ec.CORRUPTED_CONFIG_FILE) + except Exception as e: + logging.error(f'some other problem {e}') logger = logging.getLogger("data_pipeline_for_ynab") os.makedirs('logs', exist_ok=True) diff --git a/visuals/components.py b/visuals/components.py index 68c9a60..03ed662 100644 --- a/visuals/components.py +++ b/visuals/components.py @@ -4,7 +4,7 @@ import pandas as pd import logging import sys import config.exit_codes as ec -import datetime +# import datetime try: accounts = pl.read_parquet('data/warehouse/accounts.parquet') @@ -30,9 +30,7 @@ except Exception as e: def update_dates(start_date, end_date): master_data = master_transactions.filter( - (pl.col('year') >= start_date.year ) & (pl.col('year') <= end_date.year) & - (pl.col('month') >= start_date.month ) & (pl.col('month') <= end_date.month) & - (pl.col('day') >= start_date.day ) & (pl.col('day') <= end_date.day) + pl.col("date").is_between(start_date, end_date) ) return master_data @@ -119,5 +117,5 @@ def update_data(master_data): "spend_per_category_bar": spend_per_category_bar, "spend_per_payee_bar": spend_per_payee_bar, "total_spend": total_spend} - print(data) + return data diff --git a/visuals/dash_app.py b/visuals/dash_app.py index a6356fb..7ae76d5 100644 --- a/visuals/dash_app.py +++ b/visuals/dash_app.py @@ -1,21 +1,27 @@ '''Module to create a Dash app that displays visualizations of YNAB data.''' import dash from dash import dcc, html -from dash.dependencies import Input, Output +from dash.dependencies import Input, Output, State import dash_bootstrap_components as dbc from visuals.layout import create_layout from visuals.components import update_data, update_dates -from datetime import date +from datetime import date, timedelta +today = date.today() +one_year_ago = today - timedelta(days=365) -master_data = update_dates(start_date=date(2024, 1, 1), end_date=date(2026, 1, 1)) +master_data = update_dates(start_date=one_year_ago, end_date=today) data = update_data(master_data) app = dash.Dash(__name__, external_stylesheets=[dbc.themes.DARKLY]) @app.callback( - Output("layout-container", "children"), + Output("spend_per_day","figure"), + Output("spend_per_category","figure"), + Output("spend_per_payee","figure"), + Output("total_spend","children"), + [Input('date-picker-range', 'start_date'), Input('date-picker-range', 'end_date')] ) diff --git a/visuals/layout.py b/visuals/layout.py index 85ed882..0451544 100644 --- a/visuals/layout.py +++ b/visuals/layout.py @@ -1,6 +1,10 @@ from dash import html, dcc from datetime import date import dash_bootstrap_components as dbc +from datetime import date, timedelta + +today = date.today() +one_year_ago = today - timedelta(days=365) def create_layout(data): @@ -13,22 +17,22 @@ def create_layout(data): def create_topbar(): return [ dbc.Container( - dbc.Row( - [ - dbc.Col( - dcc.DatePickerRange( - id="date-picker-range", - start_date=date(2024, 1, 1), - end_date=date(2026, 1, 1), - ), - width=4, - ), - dbc.Col( - html.Button("Change Date Range", id="date-range-confirm-button"), - width=2, - ), - ] - ) + dbc.Row( + [ + dbc.Col( + dcc.DatePickerRange( + id="date-picker-range", + start_date=one_year_ago, + end_date=today, + ), + width=4, + ), + dbc.Col( + html.Button("Change Date Range", id="date-range-confirm-button"), + width=2, + ), + ] + ) ) ] @@ -54,7 +58,7 @@ def create_main_body(data): html.H4( "Spend Per Day", className="card-title" ), - dcc.Graph(figure=data.spend_per_day_line), + dcc.Graph(figure=data['spend_per_day_line'],id='spend_per_day'), ] ), className="mb-4", @@ -72,7 +76,7 @@ def create_main_body(data): html.H4( "Spend Per Category", className="card-title" ), - dcc.Graph(figure=data.spend_per_category_bar), + dcc.Graph(figure=data['spend_per_category_bar'],id='spend_per_category'), ] ), className="mb-4", @@ -85,10 +89,11 @@ def create_main_body(data): [ dcc.Markdown(f""" ## Total Spend: -### £{data.total_spend:,} +### £{data['total_spend']:,} """), ] ), + id='total_spend', className="mb-4", ), width=2, @@ -100,7 +105,7 @@ def create_main_body(data): html.H4( "Spend Per Payee", className="card-title" ), - dcc.Graph(figure=data.spend_per_payee_bar), + dcc.Graph(figure=data['spend_per_payee_bar'],id='spend_per_payee'), ] ), className="mb-4",