eshan6704 commited on
Commit
fddb978
·
verified ·
1 Parent(s): 1dfab65

Update bhavcopy_html.py

Browse files
Files changed (1) hide show
  1. bhavcopy_html.py +99 -93
bhavcopy_html.py CHANGED
@@ -1,107 +1,113 @@
1
- import datetime
2
- from nsepython import *
3
- import pandas as pd
4
-
5
- def build_bhavcopy_html(date_str):
6
-
7
- # --- Validate ---
8
- try:
9
- datetime.datetime.strptime(date_str, "%d-%m-%Y")
10
- except:
11
- return "<h3>Invalid date. Use DD-MM-YYYY.</h3>"
12
-
13
- # --- Fetch ---
14
- try:
15
- df = nse_bhavcopy(date_str)
16
- except Exception as e:
17
- return f"<h3>Error fetching bhavcopy: {e}</h3>"
18
-
19
- # --- Rename Columns ---
20
- rename_map = {
21
- "SYMBOL": "symbol",
22
- "SERIES": "series",
23
- "PREV_CLOSE": "preclose",
24
- "OPEN_PRICE": "open",
25
- "HIGH_PRICE": "high",
26
- "LOW_PRICE": "low",
27
- "CLOSE_PRICE": "close",
28
- "TTL_TRD_QNTY": "volume",
29
- "TURNOVER_LACS": "turnover",
30
- "NO_OF_TRADES": "order",
31
- "DELIV_PER": "perdel"
32
- }
33
-
34
- # rename only existing
35
- df = df.rename(columns={k:v for k,v in rename_map.items() if k in df.columns})
36
-
37
- # --- Filter Only Required Columns ---
38
  required = [
39
- "symbol","series","preclose","open","high",
40
- "low","close","volume","turnover","order","perdel"
41
  ]
42
-
43
- # fill missing columns safely
44
- for col in required:
45
- if col not in df.columns:
46
- df[col] = 0
47
-
48
- df = df[required]
49
-
50
- # --- Add Computed Columns ---
51
- df["change"] = df["close"] - df["preclose"]
52
- df["perchange"] = (df["change"] / df["preclose"].replace(0, 1)) * 100
53
- df["pergap"] = ((df["open"] - df["preclose"]) / df["preclose"].replace(0, 1)) * 100
54
-
55
- # --- Prepare for Grid ---
56
- df_sorted = df.sort_values("perchange", ascending=False)[["symbol", "perchange"]]
57
-
58
- n = len(df_sorted)
59
- chunk_size = (n + 4)//5 # divide into 5 equal parts
60
-
61
- chunks = [df_sorted.iloc[i:i+chunk_size] for i in range(0, n, chunk_size)]
62
-
63
- # --- Build HTML ---
64
- css = """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  <style>
66
- .grid5 {
 
 
 
 
 
 
 
 
 
 
 
 
67
  display: grid;
68
  grid-template-columns: repeat(5, 1fr);
69
- gap: 15px;
70
- margin-top: 20px;
71
- }
72
- .colbox {
73
- max-height: 500px;
74
- overflow-y: scroll;
75
  border: 1px solid #ccc;
76
  padding: 6px;
77
- background: #fff;
78
- }
79
- table {
 
 
 
 
 
 
80
  width: 100%;
81
  border-collapse: collapse;
82
- font-size: 14px;
83
- }
84
- th, td {
85
  border: 1px solid #ddd;
86
- padding: 4px;
87
- text-align: left;
88
- }
89
- th {
90
- background: #f4f4f4;
91
- }
92
  </style>
93
- """
94
 
95
- html = f"<h2>Bhavcopy Grid – {date_str}</h2>{css}"
96
- html += "<div class='grid5'>"
97
 
98
- for chunk in chunks:
99
- html += "<div class='colbox'><table>"
100
- html += "<tr><th>Symbol</th><th>% Chg</th></tr>"
101
- for _, row in chunk.iterrows():
102
- html += f"<tr><td>{row['symbol']}</td><td>{row['perchange']:.2f}</td></tr>"
103
- html += "</table></div>"
104
-
105
- html += "</div>"
106
 
107
- return html
 
1
+ def build_bhav_html(df):
2
+ if df is None or df.empty:
3
+ return "<h3>No Bhavcopy Found</h3>"
4
+
5
+ # ------------------------------
6
+ # 1) RENAME + FILTER REQUIRED COLS
7
+ # ------------------------------
8
+ df = df.rename(columns={
9
+ "CH_PREV_CLOSE": "preclose",
10
+ "CH_OPENING_PRICE": "open",
11
+ "CH_CLOSING_PRICE": "close",
12
+ "CH_TOT_TRADED_QTY": "volume",
13
+ "CH_TOT_TRADED_VAL": "turnover",
14
+ "CH_LAST_TRADED_PRICE": "ltp",
15
+ "CH_TRADED_ORDERS": "order",
16
+ "CH_DELIV_QTY": "delqty",
17
+ "CH_DELIV_PER": "perdel"
18
+ })
19
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  required = [
21
+ "symbol","series","preclose","open","high","low",
22
+ "close","volume","turnover","order","perdel"
23
  ]
24
+ df = df[required].copy()
25
+
26
+ # ------------------------------
27
+ # 2) ADD NEW COLUMNS
28
+ # ------------------------------
29
+ df["change"] = df["close"] - df["preclose"]
30
+ df["perchange"] = (df["change"] / df["preclose"] * 100).round(2)
31
+ df["pergap"] = ((df["open"] - df["preclose"]) / df["preclose"] * 100).round(2)
32
+
33
+ # Sorting for grid tables
34
+ df_sorted = df.sort_values("perchange", ascending=False)
35
+
36
+ # ------------------------------
37
+ # 3) MAIN TABLE (top)
38
+ # ------------------------------
39
+ main_table_html = df.to_html(index=False, classes="main-table")
40
+
41
+ # ------------------------------
42
+ # 4) 5-COLUMN GRID (each column scrollable)
43
+ # ------------------------------
44
+
45
+ col_names = ["perchange", "turnover", "order", "volume", "perdel"]
46
+ tables_html = ""
47
+
48
+ for col in col_names:
49
+ sub = df_sorted[["symbol", col]].copy()
50
+ sub = sub.sort_values(col, ascending=False)
51
+ tables_html += f"""
52
+ <div class="grid-col">
53
+ <h4>{col.upper()}</h4>
54
+ <div class="grid-scroll">
55
+ {sub.to_html(index=False, classes='sub-table')}
56
+ </div>
57
+ </div>
58
+ """
59
+
60
+ full_html = f"""
61
  <style>
62
+ .main-table {{
63
+ width: 100%;
64
+ border-collapse: collapse;
65
+ background: white;
66
+ margin-bottom: 18px;
67
+ }}
68
+ .main-table th, .main-table td {{
69
+ padding: 6px 8px;
70
+ border: 1px solid #ddd;
71
+ }}
72
+
73
+ /* GRID */
74
+ .grid-container {{
75
  display: grid;
76
  grid-template-columns: repeat(5, 1fr);
77
+ gap: 12px;
78
+ width: 100%;
79
+ }}
80
+
81
+ .grid-col {{
82
+ background: white;
83
  border: 1px solid #ccc;
84
  padding: 6px;
85
+ border-radius: 4px;
86
+ }}
87
+
88
+ .grid-scroll {{
89
+ max-height: 420px;
90
+ overflow-y: scroll;
91
+ }}
92
+
93
+ .sub-table {{
94
  width: 100%;
95
  border-collapse: collapse;
96
+ }}
97
+ .sub-table th, .sub-table td {{
 
98
  border: 1px solid #ddd;
99
+ padding: 4px 6px;
100
+ font-size: 13px;
101
+ }}
 
 
 
102
  </style>
 
103
 
104
+ <h3>Bhavcopy Table</h3>
105
+ {main_table_html}
106
 
107
+ <h3>Matrix Grid</h3>
108
+ <div class="grid-container">
109
+ {tables_html}
110
+ </div>
111
+ """
 
 
 
112
 
113
+ return full_html