File size: 2,637 Bytes
bd24fca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import pandas as pd
import numpy as np

def compute_aggregate(sub_df, metric, agg_func, year_sel, group_sel, metric_main, metric_mode, base_col):
    """Exact logic from standalone Heatmap (v3.6)."""
    if group_sel == "기업":
        if metric_main == "기업수":
            total = sub_df['Company'].nunique()
            if total == 0:
                return 0 if metric_mode != "결측 비율" else np.nan
            if metric_mode == "결측 포함":
                return total
            elif metric_mode == "결측 미포함":
                return sub_df.loc[~sub_df['has_missing_financials'], 'Company'].nunique()
            elif metric_mode == "결측 비율":
                missing = sub_df.loc[sub_df['has_missing_financials'], 'Company'].nunique()
                return missing / total if total else np.nan
        elif metric_main == "0이하비율":
            arr = pd.to_numeric(sub_df[base_col], errors="coerce")
            if metric_mode == "결측 제외":
                arr = arr.dropna()
            return (arr <= 0).sum() / len(arr) if len(arr) else np.nan

    else:  # 멀티플·재무비율
        if agg_func == "AGG":
            mc_col = 'Market Cap (2024-12-31)_USD'
            if mc_col not in sub_df.columns or sub_df[mc_col].isna().all():
                return np.nan
            mc = sub_df[mc_col]
            q1, q3 = mc.quantile(0.25), mc.quantile(0.75)
            iqr = q3 - q1
            lower, upper = q1 - 2*iqr, q3 + 2*iqr
            filt = sub_df[(mc >= lower) & (mc <= upper)]
            if filt.empty:
                return np.nan
            if metric in ['PER', 'PBR', 'EV_EBITDA']:
                if metric == 'PER':
                    num, den = filt[mc_col].sum(), filt['Net_Income'].sum()
                elif metric == 'PBR':
                    num, den = filt[mc_col].sum(), filt['Book'].sum()
                else:  # EV_EBITDA
                    num, den = filt['Enterprise Value (FQ0)_USD'].sum(), filt['EBITDA'].sum()
                return num / den if den else np.nan
            arr = filt[metric].dropna()
            return arr.sum() if len(arr) else np.nan
        else:  # AVG / MED / HRM
            arr = sub_df[metric].dropna()
            if not len(arr):
                return np.nan
            if agg_func == 'AVG':
                return arr.mean()
            elif agg_func == 'MED':
                return arr.median()
            else:  # HRM
                arr = arr[arr > 0]
                return len(arr) / (1/arr).sum() if len(arr) else np.nan

# ---------------------------------------------------------------------------