amount_cols = [f"amount_{k}" for k in labels]
dtm_cols = [f"days_to_maturity_{k}" for k in labels]
trx_cols = [f"num_trx_{k}" for k in labels]
pct_cols = [f"amount_pct_{k}" for k in labels]
amt_arr = pivoted[amount_cols].values
dtm_arr = pivoted[dtm_cols].values
trx_arr = pivoted[trx_cols].values
pct_arr = pivoted[pct_cols].values
total_amt = amt_arr.sum(axis=1)
total_trx = trx_arr.sum(axis=1)
safe_amt = np.where(total_amt == 0, np.nan, total_amt)
safe_trx = np.where(total_trx == 0, np.nan, total_trx)
pivoted["feat_total_amount"] = total_amt
pivoted["feat_total_trx"] = total_trx
pivoted["feat_avg_trx_amount"] = total_amt / safe_trx
pivoted["feat_wtd_avg_days"] = (amt_arr * dtm_arr).sum(axis=1) / safe_amt
pivoted["feat_amount_duration"] = (amt_arr * dtm_arr).sum(axis=1)
short_idx = [labels.index(k) for k in SHORT_TERM_BUCKETS]
pivoted["feat_pct_short_term"] = pct_arr[:, short_idx].sum(axis=1)
pivoted["feat_pct_long_term"] = 1.0 - pivoted["feat_pct_short_term"]
pivoted["feat_maturity_entropy"] = -(pct_arr * np.log(pct_arr + 1e-9)).sum(axis=1)
