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()