Team Ai
Apppublic

ever-flow/visualization_modules

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
aggregation.py59 linesDownload Raw Back to src
1import pandas as pd2import numpy as np3 4def compute_aggregate(sub_df, metric, agg_func, year_sel, group_sel, metric_main, metric_mode, base_col):5    """Exact logic from standalone Heatmap (v3.6)."""6    if group_sel == "기업":7        if metric_main == "기업수":8            total = sub_df['Company'].nunique()9            if total == 0:10                return 0 if metric_mode != "결측 비율" else np.nan11            if metric_mode == "결측 포함":12                return total13            elif metric_mode == "결측 미포함":14                return sub_df.loc[~sub_df['has_missing_financials'], 'Company'].nunique()15            elif metric_mode == "결측 비율":16                missing = sub_df.loc[sub_df['has_missing_financials'], 'Company'].nunique()17                return missing / total if total else np.nan18        elif metric_main == "0이하비율":19            arr = pd.to_numeric(sub_df[base_col], errors="coerce")20            if metric_mode == "결측 제외":21                arr = arr.dropna()22            return (arr <= 0).sum() / len(arr) if len(arr) else np.nan23 24    else:  # 멀티플·재무비율25        if agg_func == "AGG":26            mc_col = 'Market Cap (2024-12-31)_USD'27            if mc_col not in sub_df.columns or sub_df[mc_col].isna().all():28                return np.nan29            mc = sub_df[mc_col]30            q1, q3 = mc.quantile(0.25), mc.quantile(0.75)31            iqr = q3 - q132            lower, upper = q1 - 2*iqr, q3 + 2*iqr33            filt = sub_df[(mc >= lower) & (mc <= upper)]34            if filt.empty:35                return np.nan36            if metric in ['PER', 'PBR', 'EV_EBITDA']:37                if metric == 'PER':38                    num, den = filt[mc_col].sum(), filt['Net_Income'].sum()39                elif metric == 'PBR':40                    num, den = filt[mc_col].sum(), filt['Book'].sum()41                else:  # EV_EBITDA42                    num, den = filt['Enterprise Value (FQ0)_USD'].sum(), filt['EBITDA'].sum()43                return num / den if den else np.nan44            arr = filt[metric].dropna()45            return arr.sum() if len(arr) else np.nan46        else:  # AVG / MED / HRM47            arr = sub_df[metric].dropna()48            if not len(arr):49                return np.nan50            if agg_func == 'AVG':51                return arr.mean()52            elif agg_func == 'MED':53                return arr.median()54            else:  # HRM55                arr = arr[arr > 0]56                return len(arr) / (1/arr).sum() if len(arr) else np.nan57 58# ---------------------------------------------------------------------------59