import gradio as gr import pandas as pd import plotly.express as px from datetime import datetime, timedelta import requests from io import BytesIO def load_and_process_data(): # Hugging Face 데이터셋에서 parquet 파일 다운로드 url = "https://huggingface.co/datasets/cfahlgren1/hub-stats/resolve/main/spaces.parquet" response = requests.get(url) df = pd.read_parquet(BytesIO(response.content)) # 30일 전 날짜 계산 thirty_days_ago = datetime.now() - timedelta(days=30) # SQL 쿼리와 동일한 처리 df['createdAt'] = pd.to_datetime(df['createdAt']) filtered_df = df[df['createdAt'] >= thirty_days_ago].copy() filtered_df['created'] = filtered_df['createdAt'].dt.date filtered_df = filtered_df.sort_values('trendingScore', ascending=False) return filtered_df.head(100) def create_trend_chart(selected_id, df): if not selected_id: return None space_data = df[df['id'] == selected_id] if space_data.empty: return None # 선택된 space의 트렌드 차트 생성 fig = px.line( space_data, x='created', y='trendingScore', title=f'Trending Score for {selected_id}', labels={'created': 'Date', 'trendingScore': 'Trending Score'} ) fig.update_layout( xaxis_title="Date", yaxis_title="Trending Score", hovermode='x unified', plot_bgcolor='white', paper_bgcolor='white' ) return fig def update_display(selected_id, df): if selected_id is None: return None, "" space_data = df[df['id'] == selected_id].iloc[0] info_text = f"""ID: {space_data['id']} Created At: {space_data['createdAt'].strftime('%Y-%m-%d')} Trending Score: {space_data['trendingScore']:.2f}""" chart = create_trend_chart(selected_id, df) return chart, info_text # 데이터 로드 df = load_and_process_data() # Gradio 인터페이스 생성 with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown("# Trending Spaces Dashboard") with gr.Row(): # 왼쪽 패널 - 스페이스 리스트 with gr.Column(scale=1): space_list = gr.Dropdown( choices=[(row['id'], f"{row['id']} (Score: {row['trendingScore']:.2f})") for _, row in df.iterrows()], label="Select a Space", info="Click to select a space and view its trend", value=df['id'].iloc[0] if not df.empty else None ) # 스페이스 정보 표시 info_box = gr.Textbox( label="Space Details", value="", interactive=False, lines=3 ) # 오른쪽 패널 - 트렌드 차트 with gr.Column(scale=2): trend_plot = gr.Plot( label="Trending Score Over Time" ) # 이벤트 핸들러 space_list.change( fn=update_display, inputs=[space_list], outputs=[trend_plot, info_box] ) # 대시보드 실행 if __name__ == "__main__": demo.launch()