Spaces:
Sleeping
Sleeping
import atexit | |
import datetime | |
import pandas as pd | |
import uvicorn | |
from apscheduler.schedulers.background import BackgroundScheduler | |
from fastapi import FastAPI | |
import utils | |
from classes import Metagraph, Productivity, Throughput | |
# Global variables (saves time on loading data) | |
state_vars = None | |
reload_timestamp = datetime.datetime.now().strftime('%D %T') | |
data_all = None | |
data_30d = None | |
data_24h = None | |
app = FastAPI() | |
def load_data(): | |
""" | |
Reload the state variables | |
""" | |
global data_all, data_30d ,data_24h, reload_timestamp | |
utils.fetch_new_runs() | |
data_all = utils.preload_data() | |
data_30d = data_all[(pd.Timestamp.now() - data_all['updated_at'].apply(lambda x: pd.Timestamp(x)) < pd.Timedelta('30 days'))] | |
data_24h = data_all[(pd.Timestamp.now() - data_all['updated_at'].apply(lambda x: pd.Timestamp(x)) < pd.Timedelta('1 days'))] | |
reload_timestamp = datetime.datetime.now().strftime('%D %T') | |
print(f'Reloaded data at {reload_timestamp}') | |
def start_scheduler(): | |
scheduler = BackgroundScheduler() | |
scheduler.add_job(func=load_data, trigger="interval", seconds=60*30) | |
scheduler.start() | |
# Shut down the scheduler when exiting the app | |
atexit.register(lambda: scheduler.shutdown()) | |
def home(): | |
return "Welcome to the Bittensor Protein Folding Leaderboard API!" | |
def updated(): | |
return reload_timestamp | |
def productivity_metrics(): | |
""" | |
Get the productivity metrics | |
""" | |
result = utils.get_productivity(df_all=data_all, df_24h=data_24h, df_30d=data_30d) | |
return result | |
def get_metagraph(): | |
""" | |
Get the metagraph | |
""" | |
df_m = utils.get_metagraph() | |
df_miners = df_m.sort_values('I', ascending=False).reset_index() | |
incentives = df_miners['I'].astype(float).values | |
emissions = df_miners['E'].astype(float).values | |
identities = df_miners['identity'] | |
hotkeys = df_miners['hotkey'] | |
coldkeys = df_miners['coldkey'] | |
trusts = df_miners['trust'].astype(float).values | |
results = {'incentives': incentives, | |
'emissions': emissions, | |
'identities': identities, | |
'hotkeys': hotkeys, | |
'coldkeys': coldkeys, | |
'trusts': trusts} | |
return results | |
def throughput_metrics(): | |
""" | |
Get the throughput metrics | |
""" | |
return utils.get_data_transferred(data_all, data_24h) | |
if __name__ == '__main__': | |
load_data() | |
start_scheduler() | |
uvicorn.run(app, host='0.0.0.0', port=5001) | |
# to test locally | |
# curl -X GET http://0.0.0.0:5001/data | |