| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- 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)))
|