Spaces:
Sleeping
Sleeping
import pandas as pd | |
import gradio as gr | |
import matplotlib.pyplot as plt | |
import seaborn as sns | |
from datetime import datetime, UTC, date | |
import plotly.express as px | |
HEIGHT = 300 | |
WIDTH = 600 | |
def get_dist_gap_time_evolution( | |
market_id: str, all_markets: pd.DataFrame | |
) -> gr.LinePlot: | |
"""Function to paint the evolution in time of the distance gap between the tokens and the price weighted distributions""" | |
sns.set_style("darkgrid") | |
selected_market = all_markets.loc[all_markets["id"] == market_id] | |
selected_market["sample_date"] = selected_market["sample_date"].astype(str) | |
selected_market.columns = selected_market.columns.astype(str) | |
return gr.LinePlot( | |
value=selected_market, | |
x="sample_date", | |
y="dist_gap_perc", | |
y_title="Distribution gap in %", | |
interactive=True, | |
show_actions_button=True, | |
tooltip=[ | |
"sample_datetime", | |
"dist_gap_perc", | |
"total_trades", | |
"total_bet_amount", | |
], | |
height=HEIGHT, | |
width=WIDTH, | |
) | |
def get_dist_gap_timeline_plotly(market_id: str, all_markets: pd.DataFrame) -> gr.Plot: | |
selected_market = all_markets.loc[all_markets["id"] == market_id] | |
fig = px.line(selected_market, x="sample_date", y="dist_gap_perc") | |
fig.update_layout( | |
xaxis_title="Day of the sample", | |
yaxis_title="Distribution gap in %", | |
) | |
fig.update_layout(width=WIDTH, height=HEIGHT) | |
fig.update_xaxes(tickformat="%b-%d-%Y") | |
return gr.Plot(value=fig) | |
def get_avg_gap_time_evolution_grouped_markets(all_markets: pd.DataFrame) -> gr.Plot: | |
# filter by the opening datetime | |
current = pd.Timestamp("today") | |
recent_markets = all_markets.loc[all_markets["opening_datetime"] > current] | |
recent_markets["creation_datetime"] = recent_markets["creationTimestamp"].apply( | |
lambda x: datetime.fromtimestamp(int(x)) | |
) | |
recent_markets["creation_date"] = pd.to_datetime( | |
recent_markets["creation_datetime"] | |
).dt.date | |
# Define the cutoff date | |
cutoff_date = date(2024, 1, 1) | |
# Filter the DataFrame with very old markets | |
recent_markets = recent_markets[recent_markets["creation_date"] > cutoff_date] | |
avg_dist_gap_perc = ( | |
recent_markets.groupby(["sample_date", "creation_date"])["dist_gap_perc"] | |
.mean() | |
.reset_index() | |
) | |
avg_dist_gap_perc["creation_date"] = avg_dist_gap_perc["creation_date"].astype(str) | |
avg_dist_gap_perc.rename( | |
columns={"dist_gap_perc": "mean_dist_gap_perc"}, inplace=True | |
) | |
fig = px.line( | |
avg_dist_gap_perc, | |
x="sample_date", | |
y="mean_dist_gap_perc", | |
color="creation_date", | |
) | |
fig.update_layout( | |
xaxis_title="Day the samples were collected", | |
yaxis_title="Mean dist gap percentage (%)", | |
) | |
fig.update_xaxes(tickformat="%b-%d-%Y") | |
return gr.Plot(value=fig) | |
def get_top_best_behaviour_markets(markets_data: pd.DataFrame): | |
"""Function to paint the top markets with the lowest metric of distribution gap""" | |
sorted_data = markets_data.sort_values(by="dist_gap_perc", ascending=False) | |
top_best_markets = sorted_data[["title", "sample_datetime", "dist_gap_perc"]].head( | |
5 | |
) | |
return gr.DataFrame(top_best_markets) | |
def get_distribution_plot(markets_data: pd.DataFrame): | |
"""Function to paint the density plot of the metric distribution gap percentage""" | |
# A kernel density estimate (KDE) plot is a method for visualizing the distribution of | |
# observations in a dataset, analogous to a histogram. KDE represents the data using a | |
# continuous probability density curve in one or more dimensions. | |
sns.set_theme(palette="viridis") | |
plt.figure(figsize=(10, 5)) | |
plot = sns.kdeplot(markets_data, x="dist_gap_perc", fill=True) | |
# TODO Add title and labels | |
# Display the plot using gr.Plot | |
return gr.Plot(value=plot.get_figure()) | |
def get_kde_with_trades(markets_data: pd.DataFrame): | |
"""Function to paint the density plot of the metric in terms of the number of trades""" | |
plot = sns.kdeplot(markets_data, x="dist_gap_perc", y="total_trades", fill=True) | |
plt.ylabel("Total number of trades per market") | |
return gr.Plot(value=plot.get_figure()) | |
def get_kde_with_total_bet_amount(markets_data: pd.DataFrame): | |
"""Function to paint the density plot of the metric in terms of the total bet amount""" | |
plot = sns.kdeplot(markets_data, x="dist_gap_perc", y="total_bet_amount", fill=True) | |
plt.ylabel("Total bet amount per market") | |
return gr.Plot(value=plot.get_figure()) | |
def get_regplot_with_mean_trade_size(markets_data: pd.DataFrame): | |
"""Function to Plot data and a linear regression model fit between the metric and the mean trade size""" | |
regplot = sns.regplot(markets_data, x="dist_gap_perc", y="mean_trade_size") | |
plt.ylabel("Mean trade size in USD") | |
return gr.Plot(value=regplot.get_figure()) | |
def get_correlation_map(markets_data: pd.DataFrame): | |
"""Function to paint the correlation between different variables""" | |
columns_of_interest = [ | |
"total_trades", | |
"dist_gap_perc", | |
"liquidityMeasure", | |
"mean_trade_size", | |
"total_bet_amount", | |
] | |
data = markets_data[columns_of_interest] | |
# Compute the correlation matrix | |
correlation_matrix = data.corr() | |
# Create the heatmap | |
heatmap = sns.heatmap( | |
correlation_matrix, | |
annot=True, # Show the correlation values | |
cmap="coolwarm", # Color scheme | |
vmin=-1, | |
vmax=1, # Set the range of values | |
center=0, # Center the colormap at 0 | |
square=True, # Make each cell square-shaped | |
linewidths=0.5, # Add lines between cells | |
cbar_kws={"shrink": 0.8}, | |
) # Adjust the size of the colorbar | |
# Set the title | |
plt.title("Correlation Heatmap") | |
# Rotate the y-axis labels for better readability | |
plt.yticks(rotation=0) | |
# Show the plot | |
plt.tight_layout() | |
return gr.Plot(value=heatmap.get_figure()) | |