File size: 2,963 Bytes
a0586fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
88
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()