|
|
@@ -0,0 +1,70 @@
|
|
|
+from datetime import datetime
|
|
|
+from tqdm import tqdm
|
|
|
+from pandas import DataFrame
|
|
|
+from sqlalchemy import create_engine
|
|
|
+from sqlalchemy.orm import sessionmaker
|
|
|
+from pycoingecko import CoinGeckoAPI
|
|
|
+from Coin import Coin, CoinMarketPosition
|
|
|
+from requests import HTTPError
|
|
|
+import time
|
|
|
+from multiprocessing import Pool
|
|
|
+
|
|
|
+DATABASE_URI = 'sqlite:///coins.db'
|
|
|
+engine = create_engine('sqlite:///coins.db', echo=False)
|
|
|
+
|
|
|
+# create a Session
|
|
|
+Session = sessionmaker(bind=engine)
|
|
|
+session = Session()
|
|
|
+
|
|
|
+cg = CoinGeckoAPI()
|
|
|
+def importMarketPosition(coin:Coin):
|
|
|
+ engine = create_engine(DATABASE_URI, echo=False)
|
|
|
+
|
|
|
+ # create a Session
|
|
|
+ Session = sessionmaker(bind=engine)
|
|
|
+ session = Session()
|
|
|
+
|
|
|
+ # skip already bootstraped items
|
|
|
+ if session.query(CoinMarketPosition).filter(CoinMarketPosition.coin_id == coin.row_id).first() is not None:
|
|
|
+ return
|
|
|
+ try:
|
|
|
+ positions = cg.get_coin_market_chart_by_id(coin.id,"usd","max")
|
|
|
+ except (HTTPError) as e:
|
|
|
+ print("We wait 60s :(", e.response)
|
|
|
+ time.sleep(61)
|
|
|
+ positions = cg.get_coin_market_chart_by_id(coin.id,"usd","max")
|
|
|
+
|
|
|
+ df_prices = DataFrame(positions["prices"])
|
|
|
+ df_prices.columns=["date","prices"]
|
|
|
+
|
|
|
+ df_total_volumes = DataFrame(positions["total_volumes"])
|
|
|
+ df_total_volumes.columns=["date","total_volumes"]
|
|
|
+
|
|
|
+ df_market_caps = DataFrame(positions["market_caps"])
|
|
|
+ df_market_caps.columns=["date","market_caps"]
|
|
|
+
|
|
|
+ df = df_prices.set_index('date').join(df_market_caps.set_index('date'),"date",'outer').join(df_total_volumes.set_index('date'),"date",'outer')
|
|
|
+
|
|
|
+ for t,row in df.iterrows():
|
|
|
+ try:
|
|
|
+ market_position = CoinMarketPosition(coin.row_id,datetime.fromtimestamp(t/1000),row.total_volumes,row.market_caps,row.prices)
|
|
|
+ session.add(market_position)
|
|
|
+ except OSError as e:
|
|
|
+ print("ERROR", "Invalid data for coin ", coin.id,row.total_volumes,row.market_caps,row.prices)
|
|
|
+
|
|
|
+ session.commit()
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ # Create objects
|
|
|
+ for c in cg.get_coins_list():
|
|
|
+ obj = Coin (c["id"], c["symbol"], c["name"])
|
|
|
+ if session.query(Coin).filter(Coin.id == obj.id).first() is None:
|
|
|
+ session.add(obj)
|
|
|
+ # Save the change made on the database.
|
|
|
+ session.commit()
|
|
|
+
|
|
|
+ # collect market position
|
|
|
+ with Pool(10) as p:
|
|
|
+ coin_list = session.query(Coin).order_by(Coin.row_id).all()
|
|
|
+ r = list(tqdm(p.imap(importMarketPosition, coin_list), total=len(coin_list)))
|