# ============================== # Imports # ============================== import requests import zipfile from io import BytesIO, StringIO from datetime import datetime as dt from typing import Dict, Union import pandas as pd # persist helpers from .persist import exists, load, save # ============================== # Raw CSV Loader (NO parsing) # ============================== def load_csv(url: str) -> Union[str, Dict[str, str]]: """ Pure transport loader - .csv -> raw CSV text (str) - .zip -> {filename: raw CSV text} NO parsing NO cleaning NO assumptions """ r = requests.get(url) r.raise_for_status() if url.lower().endswith(".zip"): z = zipfile.ZipFile(BytesIO(r.content)) out: Dict[str, str] = {} for name in z.namelist(): if name.lower().endswith(".csv"): with z.open(name) as f: out[name] = f.read().decode("utf-8", errors="ignore") return out return r.text # ============================== # NSE High-Low HTML Formatter # ============================== def _highlow_html_formatter(df: pd.DataFrame, date_str: str) -> str: metric = "PERCENT_CHANGE" df_html = df.copy() top_up = df[metric].nlargest(3).index if metric in df else [] top_dn = df[metric].nsmallest(3).index if metric in df else [] for idx, row in df_html.iterrows(): for col in df_html.columns: val = row[col] style = "" if isinstance(val, (int, float)): txt = f"{val:.2f}" if val > 0: style = "pos" elif val < 0: style = "neg" if col == metric: if idx in top_up: style += " top-up" elif idx in top_dn: style += " top-down" df_html.at[idx, col] = f'{txt}' else: df_html.at[idx, col] = str(val) return f"""