Spaces:
Sleeping
Sleeping
import gradio as gr | |
import yfinance as yf | |
import pandas as pd | |
import plotly.graph_objects as go | |
from typing import Tuple, Optional | |
import logging | |
# Set up logging | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
# Mapping company names to their ticker symbols | |
COMPANY_DICT = { | |
"Apple": "AAPL", | |
"Google": "GOOGL", | |
"Microsoft": "MSFT", | |
"Amazon": "AMZN", | |
"Tesla": "TSLA", | |
"Meta": "META", | |
"NVIDIA": "NVDA", | |
"Netflix": "NFLX" | |
} | |
def fetch_esg_data(company_name: str) -> Tuple[pd.DataFrame, Optional[str], dict, dict, dict]: | |
""" | |
Fetch and process ESG data for the selected company. | |
Args: | |
company_name (str): Name of the company to fetch ESG data for | |
Returns: | |
Tuple containing: | |
- DataFrame with ESG scores | |
- Path to saved CSV file | |
- Three plotly figures for different visualizations | |
""" | |
try: | |
# Get the ticker symbol | |
ticker = COMPANY_DICT[company_name] | |
logger.info(f"Fetching ESG data for {company_name} ({ticker})") | |
# Fetch ESG data | |
stock = yf.Ticker(ticker) | |
esg_data = stock.sustainability | |
if esg_data is None: | |
raise ValueError(f"No ESG data available for {company_name}") | |
# Process ESG data | |
esg_df = pd.DataFrame(esg_data) | |
esg_scores = esg_df.loc[["environmentScore", "socialScore", "governanceScore"], :].dropna().astype(float) | |
# Create plotting DataFrame | |
plot_df = pd.DataFrame({ | |
"ESG Category": ["Environment", "Social", "Governance"], | |
"Score": esg_scores.squeeze().values | |
}) | |
# Save to CSV | |
csv_filename = f"{ticker}_esg_data.csv" | |
esg_df.to_csv(csv_filename) | |
# Create different plot types using plotly | |
line_fig = create_line_plot(plot_df) | |
scatter_fig = create_scatter_plot(plot_df) | |
bar_fig = create_bar_plot(plot_df) | |
return plot_df, csv_filename, line_fig, scatter_fig, bar_fig | |
except Exception as e: | |
logger.error(f"Error fetching ESG data: {str(e)}") | |
return pd.DataFrame(), None, {}, {}, {} | |
def create_line_plot(df: pd.DataFrame) -> dict: | |
"""Create a line plot using plotly""" | |
fig = go.Figure() | |
fig.add_trace(go.Scatter( | |
x=df["ESG Category"], | |
y=df["Score"], | |
mode='lines+markers', | |
name='ESG Score' | |
)) | |
fig.update_layout( | |
title="ESG Scores Trend", | |
xaxis_title="ESG Category", | |
yaxis_title="Score", | |
yaxis_range=[0, 100] | |
) | |
return fig.to_dict() | |
def create_scatter_plot(df: pd.DataFrame) -> dict: | |
"""Create a scatter plot using plotly""" | |
fig = go.Figure() | |
fig.add_trace(go.Scatter( | |
x=df["ESG Category"], | |
y=df["Score"], | |
mode='markers', | |
marker=dict(size=12), | |
name='ESG Score' | |
)) | |
fig.update_layout( | |
title="ESG Scores Distribution", | |
xaxis_title="ESG Category", | |
yaxis_title="Score", | |
yaxis_range=[0, 100] | |
) | |
return fig.to_dict() | |
def create_bar_plot(df: pd.DataFrame) -> dict: | |
"""Create a bar plot using plotly""" | |
fig = go.Figure() | |
fig.add_trace(go.Bar( | |
x=df["ESG Category"], | |
y=df["Score"], | |
name='ESG Score' | |
)) | |
fig.update_layout( | |
title="ESG Scores Comparison", | |
xaxis_title="ESG Category", | |
yaxis_title="Score", | |
yaxis_range=[0, 100] | |
) | |
return fig.to_dict() | |
def create_interface() -> gr.Blocks: | |
"""Create the Gradio interface""" | |
with gr.Blocks(theme=gr.themes.Soft()) as app: | |
gr.Markdown("# ESG Data Visualization Dashboard") | |
gr.Markdown("Analyze Environmental, Social, and Governance scores for major tech companies.") | |
with gr.Tab("ESG Analysis"): | |
with gr.Row(): | |
with gr.Column(): | |
company = gr.Dropdown( | |
label="Select Company", | |
choices=list(COMPANY_DICT.keys()), | |
value="Apple" | |
) | |
plot_button = gr.Button("Generate ESG Analysis", variant="primary") | |
with gr.Row(): | |
csv_output = gr.File(label="Download Full ESG Data") | |
with gr.Row(): | |
with gr.Column(): | |
line_plot = gr.Plot(label="ESG Scores Trend") | |
with gr.Row(): | |
with gr.Column(): | |
scatter_plot = gr.Plot(label="ESG Score Distribution") | |
with gr.Column(): | |
bar_plot = gr.Plot(label="ESG Score Comparison") | |
# Error message display | |
error_message = gr.Markdown(visible=False) | |
def handle_error(error): | |
return gr.Markdown.update(visible=True, value=f"⚠️ Error: {error}") | |
# Connect the button click to the fetch function | |
plot_button.click( | |
fn=fetch_esg_data, | |
inputs=company, | |
outputs=[ | |
error_message, | |
csv_output, | |
line_plot, | |
scatter_plot, | |
bar_plot | |
], | |
api_name="generate_esg_analysis" | |
) | |
with gr.Tab("About"): | |
gr.Markdown(""" | |
## About This Dashboard | |
This dashboard provides ESG (Environmental, Social, and Governance) data visualization for major technology companies. The data is sourced from Yahoo Finance and updated regularly. | |
### How to Use | |
1. Select a company from the dropdown menu | |
2. Click 'Generate ESG Analysis' to view the visualizations | |
3. Download the full ESG data as CSV for detailed analysis | |
### Metrics Explained | |
- **Environmental Score**: Measures company's environmental impact and sustainability initiatives | |
- **Social Score**: Evaluates company's relationships with employees, suppliers, customers, and communities | |
- **Governance Score**: Assesses company's leadership, executive pay, audits, internal controls, and shareholder rights | |
""") | |
return app | |
if __name__ == "__main__": | |
app = create_interface() | |
app.launch(share=True, debug=True) | |