IndianStockAnalyzer / ticker_utils.py
saadnadimkhan111's picture
Upload 7 files
8261631 verified
"""
ticker_utils.py
Final Version — uses your files:
- NSE_Equity.csv
- BSE_Equity.csv
Provides:
- find_ticker(user_text, exchange_preference="NSE")
- suggest(text, n=5)
"""
import pandas as pd
import difflib
# Load CSVs (must exist in your Colab files)
df_nse = pd.read_csv("NSE_Equity.csv")
df_bse = pd.read_csv("BSE_Equity.csv")
# normalize column names to lower for robust lookups
df_nse.columns = df_nse.columns.str.lower()
df_bse.columns = df_bse.columns.str.lower()
# expected column names (adjusted to your CSV structure)
if "symbol" in df_nse.columns:
nse_symbol = "symbol"
else:
raise ValueError("NSE CSV missing 'Symbol' column")
if "name of company" in df_nse.columns:
nse_name = "name of company"
else:
raise ValueError("NSE CSV missing 'Name of Company' column")
if "security code" in df_bse.columns:
bse_symbol = "security code"
else:
raise ValueError("BSE CSV missing 'Security Code' column")
if "issuer name" in df_bse.columns:
bse_name = "issuer name"
else:
raise ValueError("BSE CSV missing 'Issuer Name' column")
# create cleaned fields for fuzzy matching
df_nse["clean_name"] = df_nse[nse_name].astype(str).str.lower().str.strip()
df_bse["clean_name"] = df_bse[bse_name].astype(str).str.lower().str.strip()
df_nse["clean_symbol"] = df_nse[nse_symbol].astype(str).str.lower().str.strip()
df_bse["clean_symbol"] = df_bse[bse_symbol].astype(str).str.lower().str.strip()
# yahoo-style tickers
df_nse["ticker"] = df_nse[nse_symbol].astype(str).str.upper() + ".NS"
df_bse["ticker"] = df_bse[bse_symbol].astype(str).str.upper() + ".BO"
def suggest(text, n=5):
"""Return close company name matches (lowercase input)."""
text = text.lower().strip()
all_names = list(df_nse["clean_name"]) + list(df_bse["clean_name"])
return difflib.get_close_matches(text, all_names, n=n, cutoff=0.6)
def find_ticker(text: str, exchange_preference: str = "NSE"):
"""
Resolve user text to a Yahoo-style ticker string.
exchange_preference: "NSE" or "BSE" (case-insensitive). Defaults to NSE.
"""
text = text.lower().strip()
# 1) exact match against NSE
if exchange_preference and exchange_preference.upper() == "NSE":
m_name = df_nse[df_nse["clean_name"] == text]
m_sym = df_nse[df_nse["clean_symbol"] == text]
if not m_name.empty:
return m_name["ticker"].iloc[0]
if not m_sym.empty:
return m_sym["ticker"].iloc[0]
# 2) exact match against BSE
if exchange_preference and exchange_preference.upper() == "BSE":
m_name = df_bse[df_bse["clean_name"] == text]
m_sym = df_bse[df_bse["clean_symbol"] == text]
if not m_name.empty:
return m_name["ticker"].iloc[0]
if not m_sym.empty:
return m_sym["ticker"].iloc[0]
# 3) fuzzy match (search both)
close = suggest(text, n=1)
if close:
c = close[0]
m1 = df_nse[df_nse["clean_name"] == c]
if not m1.empty:
return m1["ticker"].iloc[0]
m2 = df_bse[df_bse["clean_name"] == c]
if not m2.empty:
return m2["ticker"].iloc[0]
# 4) fallback: assume user provided symbol — append .NS
return text.upper() + ".NS"