prepare_from_csv.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. with open(f'rawData/{month}-prices.json', 'r') as f:
  11. prices = prepare.get_prices(f)
  12. prod_data, company_data = get_prod_and_company_data(data, prices)
  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], typing.Mapping[str, typing.Any]]:
  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. individual[row.company_id][ticker] = {
  30. 'amount': amount,
  31. 'volume': volume,
  32. 'rank': row.rank,
  33. }
  34. totals[row.company_id]['volume'] += volume
  35. company_data = {'totals': prepare.add_company_ranks(totals), 'individual': dict(individual)}
  36. return prod, company_data
  37. def get_production_ticker(section: str) -> str | None:
  38. prefix = 'PRODUCTION_'
  39. suffix = '_DAYS_30'
  40. if not section.startswith(prefix) or not section.endswith(suffix):
  41. return None
  42. return section[len(prefix):-len(suffix)]
  43. if __name__ == '__main__':
  44. main()