Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import requests | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
import seaborn as sns | |
from datetime import datetime, timedelta | |
import numpy as np | |
import streamlit as st | |
import plotly.graph_objects as go | |
import plotly.express as px | |
from PIL import Image | |
import io | |
import base64 | |
# νμ΄μ§ μ€μ | |
st.set_page_config(layout="wide", page_title="HuggingFace Spaces Trending Analysis") | |
# μ€νμΌ μ μ© | |
st.markdown(""" | |
<style> | |
.main { | |
background-color: #f5f5f5; | |
} | |
.stButton>button { | |
background-color: #ff4b4b; | |
color: white; | |
border-radius: 5px; | |
} | |
.trending-card { | |
padding: 20px; | |
border-radius: 10px; | |
background-color: white; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
margin: 10px 0; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# νμ΄ν | |
st.title("π€ HuggingFace Spaces Trending Analysis") | |
# κ΄μ¬ μ€νμ΄μ€ URL 리μ€νΈμ μ 보 | |
target_spaces = { | |
"ginipick/FLUXllama": "https://huggingface.co/spaces/ginipick/FLUXllama", | |
"ginipick/SORA-3D": "https://huggingface.co/spaces/ginipick/SORA-3D", | |
"fantaxy/Sound-AI-SFX": "https://huggingface.co/spaces/fantaxy/Sound-AI-SFX", | |
# ... [λλ¨Έμ§ μ€νμ΄μ€λ€λ λμΌν νμμΌλ‘ μΆκ°] | |
"NCSOFT/VARCO_Arena": "https://huggingface.co/spaces/NCSOFT/VARCO_Arena" | |
} | |
def get_trending_spaces(date): | |
url = f"https://huggingface.co/api/spaces/trending?date={date}&limit=300" | |
response = requests.get(url) | |
if response.status_code == 200: | |
return response.json() | |
return None | |
def get_space_rank(spaces, space_id): | |
for idx, space in enumerate(spaces, 1): | |
if space.get('id', '') == space_id: | |
return idx | |
return None | |
# λ°μ΄ν° μμ§ | |
def fetch_trending_data(): | |
start_date = datetime(2023, 12, 1) | |
end_date = datetime(2023, 12, 31) | |
dates = [(start_date + timedelta(days=x)).strftime('%Y-%m-%d') | |
for x in range((end_date - start_date).days + 1)] | |
trending_data = {} | |
target_space_ranks = {space: [] for space in target_spaces.keys()} | |
with st.spinner('λ°μ΄ν°λ₯Ό λΆλ¬μ€λ μ€...'): | |
for date in dates: | |
spaces = get_trending_spaces(date) | |
if spaces: | |
trending_data[date] = spaces | |
for space_id in target_spaces.keys(): | |
rank = get_space_rank(spaces, space_id) | |
target_space_ranks[space_id].append(rank) | |
return trending_data, target_space_ranks, dates | |
trending_data, target_space_ranks, dates = fetch_trending_data() | |
# μκ°ν | |
st.header("π Trending Rank Changes") | |
# Plotlyλ₯Ό μ¬μ©ν μΈν°λν°λΈ κ·Έλν | |
fig = go.Figure() | |
for space_id, ranks in target_space_ranks.items(): | |
fig.add_trace(go.Scatter( | |
x=dates, | |
y=ranks, | |
name=space_id, | |
mode='lines+markers', | |
hovertemplate= | |
'<b>Date</b>: %{x}<br>' + | |
'<b>Rank</b>: %{y}<br>' + | |
'<b>Space</b>: ' + space_id | |
)) | |
fig.update_layout( | |
title='Trending Ranks Over Time', | |
xaxis_title='Date', | |
yaxis_title='Rank', | |
yaxis_autorange='reversed', | |
height=800, | |
template='plotly_white', | |
hovermode='x unified' | |
) | |
st.plotly_chart(fig, use_container_width=True) | |
# μ΅μ μμ μ 보 μΆλ ₯ | |
st.header("π Latest Rankings") | |
latest_date = max(trending_data.keys()) | |
latest_spaces = trending_data[latest_date] | |
cols = st.columns(3) | |
col_idx = 0 | |
for space_id, url in target_spaces.items(): | |
rank = get_space_rank(latest_spaces, space_id) | |
if rank: | |
space_info = next((s for s in latest_spaces if s['id'] == space_id), None) | |
if space_info: | |
with cols[col_idx % 3]: | |
with st.container(): | |
st.markdown(f""" | |
<div class="trending-card"> | |
<h3>#{rank} - {space_id}</h3> | |
<p>π Likes: {space_info.get('likes', 'N/A')}</p> | |
<p>π {space_info.get('title', 'N/A')}</p> | |
<p>{space_info.get('description', 'N/A')[:100]}...</p> | |
<a href="{url}" target="_blank">Visit Space π</a> | |
</div> | |
""", unsafe_allow_html=True) | |
col_idx += 1 | |
# λ€μ΄λ‘λ κΈ°λ₯ | |
st.header("π Download Data") | |
# DataFrame μμ± | |
df_data = [] | |
for date in dates: | |
spaces = trending_data.get(date, []) | |
for space_id in target_spaces.keys(): | |
rank = get_space_rank(spaces, space_id) | |
if rank: | |
space_info = next((s for s in spaces if s['id'] == space_id), None) | |
if space_info: | |
df_data.append({ | |
'Date': date, | |
'Space ID': space_id, | |
'Rank': rank, | |
'Likes': space_info.get('likes', 'N/A'), | |
'Title': space_info.get('title', 'N/A'), | |
'URL': target_spaces[space_id] | |
}) | |
df = pd.DataFrame(df_data) | |
# CSV λ€μ΄λ‘λ λ²νΌ | |
csv = df.to_csv(index=False) | |
b64 = base64.b64encode(csv.encode()).decode() | |
href = f'<a href="data:file/csv;base64,{b64}" download="trending_data.csv">Download CSV File</a>' | |
st.markdown(href, unsafe_allow_html=True) | |
# νΈν° | |
st.markdown(""" | |
--- | |
Made with β€οΈ using Streamlit and HuggingFace API | |
""") |