File size: 3,148 Bytes
76ba4f4
2086e56
 
a8a3333
76ba4f4
 
a8a3333
 
76ba4f4
a8a3333
 
 
 
ac0650f
 
8e4352d
76ba4f4
8e4352d
 
76ba4f4
 
8e4352d
 
 
76ba4f4
090fb84
8e4352d
ac0650f
8e4352d
 
ac0650f
 
 
 
8e4352d
0919ad9
 
 
090fb84
76ba4f4
090fb84
 
76ba4f4
9302e83
76ba4f4
 
9302e83
 
090fb84
 
 
 
 
 
9302e83
 
73fc605
090fb84
 
 
452da62
090fb84
452da62
e03238f
9302e83
 
090fb84
9302e83
090fb84
 
9302e83
 
090fb84
9302e83
 
090fb84
9302e83
 
090fb84
76ba4f4
 
 
 
090fb84
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import gradio as gr
import yfinance as yf
import pandas as pd

# Mapping company names to their ticker symbols
company_dict = {
    "Apple": "AAPL",
    "Google": "GOOGL",
    "Microsoft": "MSFT",
    "Amazon": "AMZN",
    "Tesla": "TSLA"
}

# Function to fetch ESG data for the selected company
def fetch_esg_data(company_name):
    # Get the ticker symbol from the company name
    ticker = company_dict[company_name]
    
    # Fetch ESG data from Yahoo Finance
    stock = yf.Ticker(ticker)
    esg_data = stock.sustainability
    
    # If ESG data is available, process it into a DataFrame
    if esg_data is not None:
        esg_df = pd.DataFrame(esg_data)
        
        # Extract only the relevant ESG scores and convert to a DataFrame
        esg_scores = esg_df.loc[["environmentScore", "socialScore", "governanceScore"], :].dropna().astype(float)
        
        # Prepare a DataFrame for plotting
        plot_df = pd.DataFrame({
            "ESG Category": ["Environment", "Social", "Governance"],
            "Score": esg_scores.squeeze().values
        })
        
        # Save the ESG data to a CSV file
        csv_filename = f"{ticker}_esg_data.csv"
        esg_df.to_csv(csv_filename)
        return plot_df, csv_filename, plot_df, plot_df
    else:
        # Return empty DataFrames and None if no data is available
        return pd.DataFrame(), None, pd.DataFrame(), pd.DataFrame()

# Gradio interface with multiple tabs
def app_interface():
    with gr.Blocks() as app:
        with gr.Tab("ESG Data Analysis"):
            # Dropdown to select company name
            company = gr.Dropdown(
                label="Select Company",
                choices=list(company_dict.keys()),
                value="Apple"
            )
            
            # Button to fetch and plot ESG data
            plot_button = gr.Button("Generate ESG Plot")
            
            # LinePlot component for displaying the ESG data
            line_plot = gr.LinePlot(label="ESG Scores Line Plot", x="ESG Category", y="Score", overlay_point=True)
            # ScatterPlot component for displaying the ESG data
            scatter_plot = gr.ScatterPlot(plot_df, x="ESG Category", y="Score", overlay_point=True)
            # BarPlot component for displaying the ESG data
            bar_plot = gr.BarPlot(plot_df x="ESG Category", y="Score")
            
            # File output for CSV download
            csv_output = gr.File(label="Download CSV")
            
            # Define the action when the "Generate ESG Plot" button is clicked
            plot_button.click(fn=fetch_esg_data, inputs=company, outputs=[line_plot, csv_output, scatter_plot, bar_plot])
        
        with gr.Tab("Tab 2"):
            gr.Markdown("This is Tab 2. You can add more content here.")
        
        with gr.Tab("Tab 3"):
            gr.Markdown("This is Tab 3. Add your custom functionality here.")
        
        with gr.Tab("Tab 4"):
            gr.Markdown("This is Tab 4. Add more features or visualization here.")
    
    return app

# Launch the Gradio app
app = app_interface()
if __name__ == "__main__":
    app.launch()