rosacastillo's picture
Refactoring queries and new logic about live markets info
2cf93ef
raw
history blame
5.15 kB
import requests
import os
from datetime import datetime, timedelta, UTC
import pandas as pd
from collections import defaultdict
from typing import Any, Optional
from tqdm import tqdm
from live_utils import OMEN_SUBGRAPH_URL, CREATOR, BATCH_SIZE, DATA_DIR
from utils import SUBGRAPH_API_KEY, _to_content
from queries import omen_trader_votes_query
headers = {
"Accept": "application/json, multipart/mixed",
"Content-Type": "application/json",
}
def _query_omen_xdai_subgraph(
fpmm_id: str,
) -> dict[str, Any]:
"""Query the subgraph."""
omen_subgraph = OMEN_SUBGRAPH_URL.substitute(subgraph_api_key=SUBGRAPH_API_KEY)
print(f"omen_subgraph = {omen_subgraph}")
grouped_results = defaultdict(list)
id_gt = ""
while True:
query = omen_trader_votes_query.substitute(
fpmm_creator=CREATOR.lower(),
first=BATCH_SIZE,
id_gt=id_gt,
fpmm_id=fpmm_id,
)
print(f"query for the omen to collect trades {query}")
content_json = _to_content(query)
res = requests.post(omen_subgraph, headers=headers, json=content_json)
result_json = res.json()
# print(f"result = {result_json}")
user_trades = result_json.get("data", {}).get("fpmmTrades", [])
if not user_trades:
break
for trade in user_trades:
fpmm_id = trade.get("fpmm", {}).get("id")
grouped_results[fpmm_id].append(trade)
id_gt = user_trades[len(user_trades) - 1]["id"]
all_results = {
"data": {
"fpmmTrades": [
trade
for trades_list in grouped_results.values()
for trade in trades_list
]
}
}
return all_results
def transform_trades(trades_json: dict) -> pd.DataFrame:
# convert to dataframe
print("transforming trades")
df = pd.DataFrame(trades_json["data"]["fpmmTrades"])
if len(df) == 0:
print("No trades for this market")
return df
# print(df.info())
# convert creator to address
df["trade_creator"] = df["creator"].apply(lambda x: x["id"])
# normalize fpmm column
fpmm = pd.json_normalize(df["fpmm"])
fpmm.columns = [f"fpmm.{col}" for col in fpmm.columns]
df = pd.concat([df, fpmm], axis=1)
# drop fpmm column
df.drop(["fpmm"], axis=1, inplace=True)
# convert into int
df.outcomeIndex = pd.to_numeric(df.outcomeIndex, errors="coerce")
return df
def compute_from_timestamp_value(
fpmm_id: str, opening_timestamp: int, fpmms: pd.DataFrame
) -> Optional[int]:
"""Function to find the latest timestamp registered for a specific market"""
try:
market_data = fpmms.loc[fpmms["id"] == fpmm_id]
# how many previous samples do we have?
if len(market_data) == 1:
# take the opening Timestamp of the Market
return opening_timestamp
timestamps = (market_data.tokens_timestamp.values).sort()
# the last value is the current timestamp so we need to take the previous one
return timestamps[-2]
except Exception as e:
print(
f"Error when trying to get the from timestamp value of the market id {fpmm_id}"
)
return None
def compute_votes_distribution(market_trades: pd.DataFrame):
"""Function to compute the distribution of votes for the trades of a market"""
total_trades = len(market_trades)
print(f"The total number of trades is {total_trades}")
# outcomeIndex is always 1 or 0?
sum_outcome_index_1 = sum(market_trades.outcomeIndex)
print(f"The total number of votes for index 1 is {sum_outcome_index_1}")
percentage_index_1 = round((sum_outcome_index_1 / total_trades) * 100, 2)
return (100 - percentage_index_1), percentage_index_1
def add_trading_info(fpmms: pd.DataFrame) -> None:
# Iterate over the markets
print("Adding votes distribution per market")
fpmms["votes_first_outcome_perc"] = 0.0
fpmms["votes_second_outcome_perc"] = 0.0
for i, fpmm in tqdm(fpmms.iterrows(), total=len(fpmms), desc="Analysing trades"):
# read trades from latest read timestamp
market_id = fpmm["id"]
print(f"Adding information for the market {market_id}")
market_trades_json = _query_omen_xdai_subgraph(
fpmm_id=market_id,
)
market_trades = transform_trades(market_trades_json)
if len(market_trades) == 0:
continue
# to compute the votes distribution
print("Computing the votes distribution")
first_outcome, second_outcome = compute_votes_distribution(market_trades)
print(
f"first outcome votes ={first_outcome}, second outcome votes = {second_outcome}"
)
fpmms.loc[fpmms["id"] == market_id, "votes_first_outcome_perc"] = first_outcome
fpmms.loc[fpmms["id"] == market_id, "votes_second_outcome_perc"] = (
second_outcome
)
print("Dataset after adding trading info")
print(fpmms.head())
return
if __name__ == "__main__":
print("collecting votes distribution")