import os import shutil import yfinance as yf import gradio as gr from GoogleNews import GoogleNews download_folder = "downloads" if not os.path.exists(download_folder): os.makedirs(download_folder) def fetch_stock_data(ticker="GOOGL", period="1mo"): stock = yf.Ticker(ticker) data = stock.history(period=period) if data.empty: raise ValueError(f"No data found for ticker: {ticker}") data.reset_index(inplace=True) data['Ticker'] = ticker return data def fetch_news(ticker): googlenews = GoogleNews() googlenews.search(f"{ticker} stock news") news_items = googlenews.result() news_cards = [] clean_news_link = lambda link: link[:link.find("&ved")] for item in news_items: news_cards.append(f"**[{item['title']}]({clean_news_link(item['link'])})** \n*{item['date']}*") half = len(news_cards) // 2 news_column_1 = "\n\n".join(news_cards[:half]) news_column_2 = "\n\n".join(news_cards[half:]) return news_column_1, news_column_2 def update_graph(ticker="GOOGL", duration="1mo"): try: new_data = fetch_stock_data(ticker=ticker, period=duration) company_name = new_data['Ticker'][0] news_col1, news_col2 = fetch_news(ticker) return new_data, news_col1, news_col2, f"{company_name} Stock Price" except ValueError as ve: raise gr.Error(str(ve)) except Exception as e: raise gr.Error(f"An error occurred: {str(e)}") def download_data(ticker, duration): data = fetch_stock_data(ticker=ticker, period=duration) csv_file = os.path.join(download_folder, f"{ticker}_{duration}.csv") data.to_csv(csv_file, index=False) return csv_file def cleanup(): shutil.rmtree(download_folder) with gr.Blocks() as stock_app: gr.Markdown("# Stock Market Dashboard") with gr.Row(): ticker = gr.Textbox(label="Stock Ticker:", value="GOOGL") duration = gr.Radio(["1mo", "3mo", "6mo", "1y"], label="Duration", value="1mo") apply_btn = gr.Button("Apply", scale=0) gr.Examples(["NVDA", "INFY", "MSFT", "TSLA", "GOOGL", "TCS"], inputs=[ticker], label="Other Companies : ") initial_data = fetch_stock_data(ticker="GOOGL", period="1mo") stock_plot = gr.LinePlot(initial_data, x="Date", y="Close", label="Stock Price") default_news_col1, default_news_col2 = fetch_news("GOOGL") gr.Markdown("## Recent News") with gr.Row(): news_display_col1 = gr.Markdown(default_news_col1) news_display_col2 = gr.Markdown(default_news_col2) apply_btn.click(fn=update_graph, inputs=[ticker, duration], outputs=[stock_plot, news_display_col1, news_display_col2]) download_btn = gr.Button("Download Data") download_file = gr.File(label="Download Historical Data (CSV)") download_btn.click(fn=download_data, inputs=[ticker, duration], outputs=download_file) stock_app.title = "Stock Market Dashboard" stock_app.launch(share=True) cleanup()