|
|
import gradio as gr
|
|
|
from urllib.request import urlopen
|
|
|
import certifi
|
|
|
import json
|
|
|
import pandas as pd
|
|
|
import os
|
|
|
import warnings
|
|
|
warnings.filterwarnings("ignore")
|
|
|
|
|
|
from langchain.document_loaders import CSVLoader
|
|
|
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
|
from langchain.vectorstores import Chroma
|
|
|
from langchain_community.embeddings import HuggingFaceEmbeddings
|
|
|
from langchain.chains import RetrievalQA
|
|
|
from langchain.prompts import PromptTemplate
|
|
|
from langchain_community.llms import HuggingFacePipeline
|
|
|
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
|
|
|
|
|
|
|
|
|
os.environ["HUGGINGFACEHUB_API_TOKEN"] = ""
|
|
|
|
|
|
|
|
|
model_id = "tiiuae/falcon-7b-instruct"
|
|
|
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
|
|
model = AutoModelForCausalLM.from_pretrained(model_id)
|
|
|
|
|
|
pipe = pipeline(
|
|
|
"text-generation",
|
|
|
model=model,
|
|
|
tokenizer=tokenizer,
|
|
|
max_new_tokens=512,
|
|
|
do_sample=True,
|
|
|
temperature=0.1,
|
|
|
top_k=50,
|
|
|
top_p=0.95,
|
|
|
eos_token_id=tokenizer.eos_token_id,
|
|
|
)
|
|
|
|
|
|
llm = HuggingFacePipeline(pipeline=pipe)
|
|
|
|
|
|
|
|
|
template = """
|
|
|
You are a Financial Market Expert. Get the Market Economic Data and Market News about Company and Build the Financial Report.
|
|
|
Understand this Market Information: {context}
|
|
|
Answer the Query: {question}
|
|
|
Output must be in tabular form.
|
|
|
"""
|
|
|
PROMPT = PromptTemplate(input_variables=["context", "question"], template=template)
|
|
|
|
|
|
|
|
|
|
|
|
def generate_report(ticker: str, exchange: str):
|
|
|
api_key = "C1HRSweTniWdBuLmTTse9w8KpkoiouM5"
|
|
|
try:
|
|
|
|
|
|
if exchange == "NSE":
|
|
|
url = f"https://financialmodelingprep.com/api/v3/search?query={ticker}&exchange=NSE&apikey={api_key}"
|
|
|
else:
|
|
|
url = f"https://financialmodelingprep.com/api/v3/quote/{ticker}?apikey={api_key}"
|
|
|
|
|
|
response = urlopen(url, cafile=certifi.where())
|
|
|
data = json.loads(response.read().decode("utf-8"))
|
|
|
|
|
|
|
|
|
df = pd.DataFrame(data)
|
|
|
if 'timestamp' in df.columns:
|
|
|
df['timestamp'] = pd.to_datetime(df['timestamp'], errors='coerce')
|
|
|
if 'earningsAnnouncement' in df.columns:
|
|
|
df['earningsAnnouncement'] = pd.to_datetime(df['earningsAnnouncement'], errors='coerce')
|
|
|
df.to_csv("eco_ind.csv", index=False)
|
|
|
|
|
|
|
|
|
loader = CSVLoader("eco_ind.csv")
|
|
|
documents = loader.load()
|
|
|
splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=10)
|
|
|
texts = splitter.split_documents(documents)
|
|
|
embeddings = HuggingFaceEmbeddings()
|
|
|
|
|
|
chroma = Chroma.from_documents(
|
|
|
documents=texts,
|
|
|
collection_name="economic_data",
|
|
|
embedding=embeddings,
|
|
|
persist_directory="docs/chroma_rag"
|
|
|
)
|
|
|
|
|
|
retriever = chroma.as_retriever(search_kwargs={"k": 2})
|
|
|
qa = RetrievalQA.from_chain_type(
|
|
|
llm=llm,
|
|
|
chain_type="stuff",
|
|
|
chain_type_kwargs={"prompt": PROMPT},
|
|
|
retriever=retriever,
|
|
|
return_source_documents=False
|
|
|
)
|
|
|
|
|
|
|
|
|
query = f"{ticker} Financial Report"
|
|
|
result = qa({"query": query})
|
|
|
return result["result"]
|
|
|
|
|
|
except Exception as e:
|
|
|
return f"β Error occurred: {e}"
|
|
|
|
|
|
|
|
|
|
|
|
iface = gr.Interface(
|
|
|
fn=generate_report,
|
|
|
inputs=[
|
|
|
gr.Textbox(label="Enter Ticker (e.g., MSFT)"),
|
|
|
gr.Radio(choices=["US", "NSE"], label="Select Exchange")
|
|
|
],
|
|
|
outputs=gr.Textbox(label="Generated Financial Report"),
|
|
|
title="π Financial Report Generator using Falcon + Chroma + LangChain",
|
|
|
description="Enter a stock ticker and choose an exchange to get an LLM-generated tabular financial report."
|
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
iface.launch(share=True)
|
|
|
|