File size: 3,776 Bytes
e241711 571ccad 74b4e8d 4c808ae e241711 2356bd1 e241711 4c808ae 20827ae e241711 2eea86b 4c808ae 2eea86b 4c808ae e241711 4c808ae c0e2035 4c808ae c0e2035 a87dedf 4c808ae e241711 a87dedf 4c808ae a87dedf 4c808ae e241711 c02feb4 4c808ae 2eea86b 4c808ae e241711 2eea86b fddb978 2356bd1 e241711 fddb978 4c808ae e241711 4c808ae e241711 fddb978 e241711 4c808ae e241711 4c808ae e241711 4c808ae e241711 1dfab65 fddb978 1dfab65 c0e2035 2356bd1 c0e2035 |
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
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 "<h3>Invalid date format. Use DD-MM-YYYY.</h3>"
# -------------------------------------------------------
# 2) Fetch Bhavcopy
# -------------------------------------------------------
try:
df = nse_bhavcopy(date_str)
df.columns = df.columns.str.strip()
except:
return f"<h3>No Bhavcopy found for {date_str}.</h3>"
# -------------------------------------------------------
# 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"""
<div class="main-table-container">
{df.to_html(index=False, escape=False)}
</div>
"""
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"""
<div class="col">
<h4>{m}</h4>
{temp.to_html(index=False, escape=False)}
</div>
"""
)
grid_html = f"""
<div class="grid">
{''.join(col_html)}
</div>
"""
css = """
<style>
.grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; }
.col, .main-table-container {
max-height: 480px; overflow-y: auto;
border: 1px solid #ccc; padding: 4px;
}
table { font-size: 12px; width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ddd; padding: 4px; }
th {
background: #2E7D32; color: white;
position: sticky; top: 0;
}
</style>
"""
return (
css +
"<h2>Main Bhavcopy Table</h2>" +
main_html +
"<h2>Matrix/Grid Table</h2>" +
grid_html
)
|