import pandas as pd
import datetime
from nsepython import *
def build_bhavcopy_html(date_str):
# -------------------------------------------------------
# 1) Validate Date
# -------------------------------------------------------
try:
datetime.datetime.strptime(date_str, "%d-%m-%Y")
except:
return "
Invalid date format. Use DD-MM-YYYY.
"
# -------------------------------------------------------
# 2) Fetch Bhavcopy
# -------------------------------------------------------
try:
df = nse_bhavcopy(date_str)
df.columns = df.columns.str.strip()
except:
return f"No Bhavcopy found for {date_str}.
"
# -------------------------------------------------------
# 3) Drop unwanted columns
# -------------------------------------------------------
remove = ["DATE1", "LAST_PRICE", "AVG_PRICE"]
df.drop(columns=[c for c in remove if c in df.columns], inplace=True)
# -------------------------------------------------------
# 4) Convert numeric columns
# -------------------------------------------------------
numeric_cols = [
"PREV_CLOSE", "OPEN_PRICE", "HIGH_PRICE", "LOW_PRICE",
"CLOSE_PRICE", "TTL_TRD_QNTY", "TURNOVER_LACS",
"NO_OF_TRADES", "DELIV_QTY", "DELIV_PER"
]
for col in numeric_cols:
if col in df.columns:
df[col] = (
df[col]
.astype(str)
.str.replace(",", "", regex=False)
.str.strip()
)
df[col] = pd.to_numeric(df[col], errors="coerce").fillna(0)
# -------------------------------------------------------
# 5) Filter & sort
# -------------------------------------------------------
df = df[df["TURNOVER_LACS"] > 1000]
df = df.sort_values("TURNOVER_LACS", ascending=False)
# -------------------------------------------------------
# 6) Computed columns
# -------------------------------------------------------
df["change"] = df["CLOSE_PRICE"] - df["PREV_CLOSE"]
df["perchange"] = (df["change"] / df["PREV_CLOSE"].replace(0, 1)) * 100
df["pergap"] = (
(df["OPEN_PRICE"] - df["PREV_CLOSE"]) /
df["PREV_CLOSE"].replace(0, 1)
) * 100
# -------------------------------------------------------
# 8) HTML Output
# -------------------------------------------------------
main_html = f"""
{df.to_html(index=False, escape=False)}
"""
metrics = ["perchange", "pergap", "TURNOVER_LACS", "NO_OF_TRADES", "DELIV_PER"]
col_html = []
for m in metrics:
if m in df.columns:
temp = df[["SYMBOL", m]].sort_values(m, ascending=False)
col_html.append(
f"""
{m}
{temp.to_html(index=False, escape=False)}
"""
)
grid_html = f"""
{''.join(col_html)}
"""
css = """
"""
return (
css +
"Main Bhavcopy Table
" +
main_html +
"Matrix/Grid Table
" +
grid_html
)