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)