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
    )