prepare_from_csv.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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.write_data(month, data, prod_data, company_data)
  13. prepare.check_missing_tickers(prod_data)
  14. def get_prod_and_company_data(data: dict[str, list[prepare.Row]], prices: typing.Mapping[str, float]
  15. ) -> tuple[typing.Mapping[str, prepare.ProdData], prepare.CompanyData]:
  16. prod: dict[str, prepare.ProdData] = {}
  17. individual: dict[str, dict[str, prepare.CompanyTickerData]] = collections.defaultdict(dict)
  18. totals: dict[str, prepare.CompanyTotals] = collections.defaultdict(lambda: {'volume': 0.0})
  19. for section, rows in data.items():
  20. if (ticker := get_production_ticker(section)) is None:
  21. continue
  22. price = prices[ticker]
  23. prod_amount = sum(row.num for row in rows) / 30
  24. prod[ticker] = {'amount': prod_amount, 'volume': prod_amount * price}
  25. for row in rows:
  26. amount = row.num / 30
  27. volume = amount * price
  28. individual[row.company_id][ticker] = {
  29. 'amount': amount,
  30. 'volume': volume,
  31. 'rank': row.rank,
  32. }
  33. totals[row.company_id]['volume'] += volume
  34. company_data: prepare.CompanyData = {'totals': prepare.add_company_ranks(totals), 'individual': dict(individual)}
  35. return prod, company_data
  36. def get_production_ticker(section: str) -> str | None:
  37. prefix = 'PRODUCTION_'
  38. suffix = '_DAYS_30'
  39. if not section.startswith(prefix) or not section.endswith(suffix):
  40. return None
  41. return section[len(prefix):-len(suffix)]
  42. if __name__ == '__main__':
  43. main()