ever-flow/visualization_modules
0
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 