prepare_from_sqlite.py 2.3 KB

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