Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
plot
Browse files
app.py
CHANGED
|
@@ -17,6 +17,7 @@ import gspread
|
|
| 17 |
import numpy as np
|
| 18 |
import pandas as pd
|
| 19 |
import requests
|
|
|
|
| 20 |
|
| 21 |
from requests import HTTPError
|
| 22 |
from apscheduler.executors.pool import ThreadPoolExecutor
|
|
@@ -28,7 +29,7 @@ from gspread_dataframe import get_as_dataframe, set_with_dataframe
|
|
| 28 |
from gspread_formatting.dataframe import format_with_dataframe
|
| 29 |
from huggingface_hub import HfApi, list_liked_repos, list_metrics, list_models
|
| 30 |
from tabulate import tabulate
|
| 31 |
-
from datetime import datetime
|
| 32 |
|
| 33 |
|
| 34 |
DISCORD_TOKEN = os.environ.get("DISCORD_TOKEN", None)
|
|
@@ -701,7 +702,133 @@ def get_data2():
|
|
| 701 |
display_df = pd.DataFrame(display_data)
|
| 702 |
return display_df
|
| 703 |
except Exception as e:
|
| 704 |
-
print(f"get_data2 Error: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 705 |
|
| 706 |
|
| 707 |
demo = gr.Blocks()
|
|
@@ -740,7 +867,21 @@ with demo:
|
|
| 740 |
gr.Markdown("# π How to earn Experience!")
|
| 741 |
with gr.Row():
|
| 742 |
gr.DataFrame(get_data2, every=5, interactive=False)
|
| 743 |
-
#with gr.TabItem("π
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 744 |
|
| 745 |
#with gr.TabItem("π Hub-only leaderboard", elem_id="hub-table", id=2):
|
| 746 |
except Exception as e:
|
|
|
|
| 17 |
import numpy as np
|
| 18 |
import pandas as pd
|
| 19 |
import requests
|
| 20 |
+
import plotly.graph_objects as go
|
| 21 |
|
| 22 |
from requests import HTTPError
|
| 23 |
from apscheduler.executors.pool import ThreadPoolExecutor
|
|
|
|
| 29 |
from gspread_formatting.dataframe import format_with_dataframe
|
| 30 |
from huggingface_hub import HfApi, list_liked_repos, list_metrics, list_models
|
| 31 |
from tabulate import tabulate
|
| 32 |
+
from datetime import datetime, timedelta
|
| 33 |
|
| 34 |
|
| 35 |
DISCORD_TOKEN = os.environ.get("DISCORD_TOKEN", None)
|
|
|
|
| 702 |
display_df = pd.DataFrame(display_data)
|
| 703 |
return display_df
|
| 704 |
except Exception as e:
|
| 705 |
+
print(f"get_data2 Error: {e}")
|
| 706 |
+
|
| 707 |
+
|
| 708 |
+
#-------------------------------------------------------------------------------------------------------------------------------
|
| 709 |
+
colors = ['white', 'lightgreen', 'green', 'darkgreen']
|
| 710 |
+
|
| 711 |
+
# year->get all dates
|
| 712 |
+
def get_dates_in_year(year):
|
| 713 |
+
start_date = datetime(year, 1, 1)
|
| 714 |
+
end_date = datetime(year + 1, 1, 1)
|
| 715 |
+
delta = end_date - start_date
|
| 716 |
+
return [start_date + timedelta(days=i) for i in range(delta.days)]
|
| 717 |
+
|
| 718 |
+
# HF API->get activity
|
| 719 |
+
def get_user_likes(username):
|
| 720 |
+
url = f"https://huggingface.co/api/users/{username}/likes"
|
| 721 |
+
response = requests.get(url)
|
| 722 |
+
if response.status_code == 200:
|
| 723 |
+
return response.json()
|
| 724 |
+
else:
|
| 725 |
+
print(f"Failed to fetch data: {response.status_code}")
|
| 726 |
+
return []
|
| 727 |
+
|
| 728 |
+
# data->get dates
|
| 729 |
+
def parse_activity_dates(activity_data):
|
| 730 |
+
activity_dates = []
|
| 731 |
+
for item in activity_data:
|
| 732 |
+
timestamp = item.get('createdAt')
|
| 733 |
+
if timestamp:
|
| 734 |
+
date = datetime.fromisoformat(timestamp[:-1]).date()
|
| 735 |
+
activity_dates.append(date)
|
| 736 |
+
return activity_dates
|
| 737 |
+
|
| 738 |
+
def create_plot(username, year):
|
| 739 |
+
dates_in_year = get_dates_in_year(year)
|
| 740 |
+
|
| 741 |
+
dates_in_year = [d.date() for d in dates_in_year]
|
| 742 |
+
|
| 743 |
+
activity_data = get_user_likes(username)
|
| 744 |
+
activity_dates = parse_activity_dates(activity_data)
|
| 745 |
+
|
| 746 |
+
activity_count = {date: 0 for date in dates_in_year}
|
| 747 |
+
for date in activity_dates:
|
| 748 |
+
if date in activity_count:
|
| 749 |
+
activity_count[date] += 1
|
| 750 |
+
|
| 751 |
+
# activity->color
|
| 752 |
+
def get_color(activity_count):
|
| 753 |
+
if activity_count == 0:
|
| 754 |
+
return 'white'
|
| 755 |
+
elif activity_count < 5:
|
| 756 |
+
return 'lightgreen'
|
| 757 |
+
elif activity_count < 10:
|
| 758 |
+
return 'green'
|
| 759 |
+
else:
|
| 760 |
+
return 'darkgreen'
|
| 761 |
+
|
| 762 |
+
# data->Plotly
|
| 763 |
+
num_weeks = len(dates_in_year) // 7 + (1 if len(dates_in_year) % 7 != 0 else 0)
|
| 764 |
+
|
| 765 |
+
z = [[None for _ in range(num_weeks)] for _ in range(7)] # Was 0
|
| 766 |
+
hover_texts = [["" for _ in range(num_weeks)] for _ in range(7)]
|
| 767 |
+
|
| 768 |
+
for idx, date in enumerate(dates_in_year):
|
| 769 |
+
week = idx // 7
|
| 770 |
+
day = idx % 7
|
| 771 |
+
z[day][week] = activity_count[date]
|
| 772 |
+
hover_texts[day][week] = f"{date}: {activity_count[date]} activities"
|
| 773 |
+
|
| 774 |
+
# heatmap
|
| 775 |
+
fig = go.Figure(data=go.Heatmap(
|
| 776 |
+
z=z,
|
| 777 |
+
x=list(range(num_weeks)),
|
| 778 |
+
y=list(range(7)),
|
| 779 |
+
hoverinfo='text',
|
| 780 |
+
text=hover_texts,
|
| 781 |
+
showscale=False,
|
| 782 |
+
colorscale=[
|
| 783 |
+
[0, 'white'],
|
| 784 |
+
[0.25, 'lightgreen'],
|
| 785 |
+
[0.5, 'green'],
|
| 786 |
+
[1, 'darkgreen']
|
| 787 |
+
],
|
| 788 |
+
zmin=0,
|
| 789 |
+
zmax=20
|
| 790 |
+
))
|
| 791 |
+
|
| 792 |
+
# lock the plot size and ensure cells are square
|
| 793 |
+
cell_size = 20
|
| 794 |
+
fig.update_layout(
|
| 795 |
+
title=f'{username} Activity in {year}',
|
| 796 |
+
xaxis_nticks=52,
|
| 797 |
+
yaxis_nticks=7,
|
| 798 |
+
xaxis_title=' ',
|
| 799 |
+
yaxis_title=' ',
|
| 800 |
+
yaxis=dict(
|
| 801 |
+
tickmode='array',
|
| 802 |
+
tickvals=list(range(7)),
|
| 803 |
+
ticktext=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
|
| 804 |
+
scaleanchor="x", # This ensures that the cells are square
|
| 805 |
+
scaleratio=1
|
| 806 |
+
),
|
| 807 |
+
xaxis=dict(
|
| 808 |
+
scaleanchor="y",
|
| 809 |
+
scaleratio=1,
|
| 810 |
+
fixedrange=True, # disable zoom and pan
|
| 811 |
+
showticklabels=False # hide the x-axis labels
|
| 812 |
+
),
|
| 813 |
+
autosize=False,
|
| 814 |
+
width=num_weeks * cell_size,
|
| 815 |
+
height=14 * cell_size, # halve height of each cell
|
| 816 |
+
margin=dict(
|
| 817 |
+
l=20,
|
| 818 |
+
r=20,
|
| 819 |
+
b=20,
|
| 820 |
+
t=50,
|
| 821 |
+
pad=2
|
| 822 |
+
)
|
| 823 |
+
)
|
| 824 |
+
|
| 825 |
+
fig.update_layout(
|
| 826 |
+
xaxis=dict(fixedrange=True), # disable zoom and pan
|
| 827 |
+
yaxis=dict(fixedrange=True) # disable zoom and pan
|
| 828 |
+
)
|
| 829 |
+
|
| 830 |
+
return fig
|
| 831 |
+
#-------------------------------------------------------------------------------------------------------------------------------
|
| 832 |
|
| 833 |
|
| 834 |
demo = gr.Blocks()
|
|
|
|
| 867 |
gr.Markdown("# π How to earn Experience!")
|
| 868 |
with gr.Row():
|
| 869 |
gr.DataFrame(get_data2, every=5, interactive=False)
|
| 870 |
+
#with gr.TabItem("π Activity Heatmap", elem_id="activity-heatmap", id=1):
|
| 871 |
+
with gr.Row():
|
| 872 |
+
username_input = gr.Textbox(label="Enter Username")
|
| 873 |
+
with gr.Row():
|
| 874 |
+
year_buttons = [gr.Button(str(year)) for year in range(2021, 2025)]
|
| 875 |
+
with gr.Row():
|
| 876 |
+
plot = gr.Plot(label="Activity Heatmap")
|
| 877 |
+
|
| 878 |
+
# buttons for updating the plot
|
| 879 |
+
for button in year_buttons:
|
| 880 |
+
button.click(
|
| 881 |
+
fn=create_plot,
|
| 882 |
+
inputs=[username_input, gr.State(int(button.value))],
|
| 883 |
+
outputs=plot
|
| 884 |
+
)
|
| 885 |
|
| 886 |
#with gr.TabItem("π Hub-only leaderboard", elem_id="hub-table", id=2):
|
| 887 |
except Exception as e:
|