prepare_from_csv.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from __future__ import annotations
  2. import collections
  3. import sys
  4. import typing
  5. import prepare
  6. def main() -> None:
  7. (month,) = sys.argv[1:]
  8. with open(f'rawData/{month}.csv', 'r', newline='') as f:
  9. data = prepare.read_data(f)
  10. prices = prepare.get_prices(month)
  11. prod_data, company_data = get_prod_and_company_data(data, prices)
  12. prepare.calc_consumption_profit(month, prod_data, company_data)
  13. prepare.write_data(month, data, prod_data, company_data)
  14. prepare.check_missing_tickers(prod_data)
  15. def get_prod_and_company_data(data: dict[str, list[prepare.Row]], prices: typing.Mapping[str, float]
  16. ) -> tuple[typing.Mapping[str, prepare.ProdData], prepare.CompanyData]:
  17. prod: dict[str, prepare.ProdData] = {}
  18. individual: dict[str, dict[str, prepare.CompanyTickerData]] = collections.defaultdict(dict)
  19. totals: dict[str, prepare.CompanyTotals] = collections.defaultdict(lambda: {'volume': 0.0})
  20. for section, rows in data.items():
  21. if (ticker := get_production_ticker(section)) is None:
  22. continue
  23. price = prices[ticker]
  24. prod_amount = sum(row.num for row in rows) / 30
  25. prod[ticker] = {'amount': prod_amount, 'volume': prod_amount * price}
  26. for row in rows:
  27. amount = row.num / 30
  28. volume = amount * price
  29. co_data: prepare.CompanyTickerData = {
  30. 'amount': amount,
  31. 'volume': volume,
  32. 'rank': row.rank,
  33. }
  34. individual[row.company_id][ticker] = co_data
  35. totals[row.company_id]['volume'] += volume
  36. company_data: prepare.CompanyData = {'totals': prepare.add_company_ranks(totals), 'individual': dict(individual)}
  37. return prod, company_data
  38. def get_production_ticker(section: str) -> str | None:
  39. prefix = 'PRODUCTION_'
  40. suffix = '_DAYS_30'
  41. if not section.startswith(prefix) or not section.endswith(suffix):
  42. return None
  43. return section[len(prefix):-len(suffix)]
  44. if __name__ == '__main__':
  45. main()