populate.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from datetime import datetime
  2. from tqdm import tqdm
  3. from pandas import DataFrame
  4. from sqlalchemy import create_engine
  5. from sqlalchemy.orm import sessionmaker
  6. from pycoingecko import CoinGeckoAPI
  7. from Coin import Coin, CoinMarketPosition
  8. from requests import HTTPError
  9. import time
  10. from multiprocessing import Pool
  11. DATABASE_URI = 'sqlite:///coins.db'
  12. engine = create_engine('sqlite:///coins.db', echo=False)
  13. # create a Session
  14. Session = sessionmaker(bind=engine)
  15. session = Session()
  16. cg = CoinGeckoAPI()
  17. def importMarketPosition(coin:Coin):
  18. engine = create_engine(DATABASE_URI, echo=False)
  19. # create a Session
  20. Session = sessionmaker(bind=engine)
  21. session = Session()
  22. # skip already bootstraped items
  23. if session.query(CoinMarketPosition).filter(CoinMarketPosition.coin_id == coin.row_id).first() is not None:
  24. return
  25. try:
  26. positions = cg.get_coin_market_chart_by_id(coin.id,"usd","max")
  27. except (HTTPError) as e:
  28. print("We wait 60s :(", e.response)
  29. time.sleep(61)
  30. positions = cg.get_coin_market_chart_by_id(coin.id,"usd","max")
  31. df_prices = DataFrame(positions["prices"])
  32. df_prices.columns=["date","prices"]
  33. df_total_volumes = DataFrame(positions["total_volumes"])
  34. df_total_volumes.columns=["date","total_volumes"]
  35. df_market_caps = DataFrame(positions["market_caps"])
  36. df_market_caps.columns=["date","market_caps"]
  37. df = df_prices.set_index('date').join(df_market_caps.set_index('date'),"date",'outer').join(df_total_volumes.set_index('date'),"date",'outer')
  38. for t,row in df.iterrows():
  39. try:
  40. market_position = CoinMarketPosition(coin.row_id,datetime.fromtimestamp(t/1000),row.total_volumes,row.market_caps,row.prices)
  41. session.add(market_position)
  42. except OSError as e:
  43. print("ERROR", "Invalid data for coin ", coin.id,row.total_volumes,row.market_caps,row.prices)
  44. session.commit()
  45. if __name__ == "__main__":
  46. # Create objects
  47. for c in cg.get_coins_list():
  48. obj = Coin (c["id"], c["symbol"], c["name"])
  49. if session.query(Coin).filter(Coin.id == obj.id).first() is None:
  50. session.add(obj)
  51. # Save the change made on the database.
  52. session.commit()
  53. # collect market position
  54. with Pool(10) as p:
  55. coin_list = session.query(Coin).order_by(Coin.row_id).all()
  56. r = list(tqdm(p.imap(importMarketPosition, coin_list), total=len(coin_list)))