price_plot.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #
  2. # Copyright (c) Daniel Sheffield 2023
  3. #
  4. # All rights reserved
  5. #
  6. # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY
  7. from datetime import date, datetime
  8. import os
  9. import sys
  10. from psycopg import connect, Cursor
  11. import seaborn as sns
  12. from db_credentials import HOST, PASSWORD
  13. from app.activities.Plot import (
  14. get_data,
  15. get_input,
  16. pivot_data,
  17. pie,
  18. line,
  19. )
  20. from app.data.QueryManager import QueryManager, display_mapper
  21. ALL_UNITS = {'g','kg','mL','L','Pieces','Bunches','Bags'}
  22. host = f'host={HOST}'
  23. password = f'password={PASSWORD}'
  24. user = os.getenv('USER')
  25. conn = connect(f"{host} dbname=grocery user={user} {password}")
  26. cur: Cursor = conn.cursor()
  27. cur.execute("BEGIN")
  28. query_manager = QueryManager(cur, display_mapper)
  29. fields = get_input(query_manager, ALL_UNITS)
  30. unit = fields['unit'] = fields['unit'] or 'kg'
  31. fields = { k: v or None for k,v in fields.items() }
  32. if unit not in ALL_UNITS:
  33. print(f'Invalid unit: {unit}')
  34. exit(2)
  35. print('Getting data for selection:\n ')
  36. print('\n '.join([
  37. f'{k.title()}: {v}' for k,v in fields.items()
  38. ]))
  39. data = get_data(query_manager, **fields)
  40. if data.empty:
  41. sys.exit(1)
  42. now = datetime.now().date()
  43. pivot = pivot_data(data[data['ts_month'] == date(now.year,now.month,1)])
  44. sns.set_theme()
  45. if not pivot.empty:
  46. pie(pivot, col='quantity', title=f'Quantity ({unit})')
  47. pie(pivot, col='price', title='Price ($)')
  48. pivot = data.pivot_table(index=['ts_raw',], columns=['product',], values=['$/unit'], aggfunc='mean')
  49. pivot.columns = pivot.columns.droplevel()
  50. print(pivot.info())
  51. print(pivot)
  52. line(pivot, xlabel='Time', ylabel=f'$ / {unit}')