yfinance / app.py
DevaMalla's picture
Update app.py
2b39752 verified
Raw History Blame Contribute Delete
3.24 kB
import gradio as gr
from pathlib import Path
import os
import yfinance as yf
def get_stock_price(symbol: str) -> float:
"""
Retrieve the current stock price for the given ticker symbol.
Returns the latest closing price as a float.
"""
try:
ticker = yf.Ticker(symbol)
# Get today's historical data; may return empty if market is closed or symbol is invalid.
data = ticker.history(period="1d")
if not data.empty:
# Use the last closing price from today's data
price = data['Close'].iloc[-1]
return float(price)
else:
# As a fallback, try using the regular market price from the ticker info
info = ticker.info
price = info.get("regularMarketPrice", None)
if price is not None:
return float(price)
else:
return -1.0 # Indicate failure
except Exception:
# Return -1.0 to indicate an error occurred when fetching the stock price
return -1.0
def get_stock_history(symbol: str, period: str = "1mo") -> str:
"""
Retrieve historical data for a stock given a ticker symbol and a period.
Returns the historical data as a CSV formatted string.
Parameters:
symbol: The stock ticker symbol.
period: The period over which to retrieve historical data (e.g., '1mo', '3mo', '1y').
"""
try:
ticker = yf.Ticker(symbol)
data = ticker.history(period=period)
if data.empty:
return f"No historical data found for symbol '{symbol}' with period '{period}'."
# Convert the DataFrame to a CSV formatted string
csv_data = data.to_csv()
return csv_data
except Exception as e:
return f"Error fetching historical data: {str(e)}"
def compare_stocks(symbol1: str, symbol2: str) -> str:
"""
Compare the current stock prices of two ticker symbols.
Returns a formatted message comparing the two stock prices.
Parameters:
symbol1: The first stock ticker symbol.
symbol2: The second stock ticker symbol.
"""
price1 = get_stock_price(symbol1)
price2 = get_stock_price(symbol2)
if price1 < 0 or price2 < 0:
return f"Error: Could not retrieve data for comparison of '{symbol1}' and '{symbol2}'."
if price1 > price2:
result = f"{symbol1} (${price1:.2f}) is higher than {symbol2} (${price2:.2f})."
elif price1 < price2:
result = f"{symbol1} (${price1:.2f}) is lower than {symbol2} (${price2:.2f})."
else:
result = f"Both {symbol1} and {symbol2} have the same price (${price1:.2f})."
return result
demo = gr.TabbedInterface(
[
gr.Interface(get_stock_price, gr.Textbox(), gr.Textbox(), api_name="get_stock_price"),
gr.Interface(fn=get_stock_history, inputs=[gr.Textbox(), gr.Textbox()], outputs=[gr.Textbox()], api_name="get_stock_history"),
gr.Interface(fn=compare_stocks, inputs=[gr.Textbox(), gr.Textbox()], outputs=[gr.Textbox()], api_name="compare_stocks"),
],
[
"Stock Price",
"Stock History",
"compare_stocks"
]
)
if __name__ == "__main__":
demo.launch(mcp_server=True)