prepare_from_sqlite.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from __future__ import annotations
  2. import httpx
  3. import collections
  4. import dataclasses
  5. import csv
  6. import json
  7. import sqlite3
  8. import sys
  9. import typing
  10. import prepare
  11. def main() -> None:
  12. month, sqlite_path, run_id_s = sys.argv[1:]
  13. run_id = int(run_id_s)
  14. db = sqlite3.connect(sqlite_path)
  15. db.row_factory = sqlite3.Row
  16. cur = db.execute('SELECT started_at, finished_at, type, range, materials_failed FROM runs WHERE id = ?', (run_id,))
  17. (run,) = cur.fetchall()
  18. print(', '.join(f'{k}: {run[k]}' for k in run.keys())) # noqa: SIM118
  19. assert run['type'] == 'PRODUCTION' and run['range'] == 'DAYS_30' and run['materials_failed'] == 0
  20. with open(f'rawData/{month}-prices.json', 'r') as f:
  21. prices = prepare.get_prices(f)
  22. prod_data, company_data = get_prod_and_company_data(db, run_id, prices)
  23. with open(f'rawData/{month}.csv', 'r', newline='') as f:
  24. data = prepare.read_data(f)
  25. prepare.write_data(month, data, prod_data, company_data)
  26. prepare.check_missing_tickers(prod_data)
  27. def get_prod_and_company_data(db: sqlite3.Connection, run_id: int, prices: typing.Mapping[str, float]
  28. ) -> tuple[typing.Mapping[str, prepare.ProdData], typing.Mapping[str, typing.Any]]:
  29. cur = db.execute('''
  30. SELECT ticker, entity_id, score, rank FROM leaderboard_scores
  31. JOIN materials ON materials.material_pk = leaderboard_scores.material_rowid
  32. JOIN entities ON entities.id = leaderboard_scores.entity_rowid
  33. WHERE run_id = ?''', (run_id,))
  34. individual: dict[str, dict[str, prepare.CompanyTickerData]] = collections.defaultdict(dict)
  35. company_totals: dict[str, prepare.CompanyTotals] = collections.defaultdict(lambda: {'volume': 0.0})
  36. universe_total_score: dict[str, float] = collections.defaultdict(int)
  37. while row := cur.fetchone():
  38. ticker = row['ticker']
  39. price = prices[ticker]
  40. universe_total_score[ticker] += row['score']
  41. amount = row['score'] / 30
  42. volume = amount * price
  43. individual[row['entity_id']][ticker] = {
  44. 'amount': amount,
  45. 'volume': volume,
  46. 'rank': row['rank'],
  47. }
  48. company_totals[row['entity_id']]['volume'] += volume
  49. prod: dict[str, prepare.ProdData] = {} # TODO: universe / 30
  50. for ticker, total_score in universe_total_score.items():
  51. amount = total_score / 30
  52. prod[ticker] = {'amount': amount, 'volume': amount * prices[ticker]}
  53. company_data = {'totals': prepare.add_company_ranks(company_totals), 'individual': dict(individual)}
  54. return prod, company_data
  55. if __name__ == '__main__':
  56. main()