You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于训练集日均余额计算测试集预期余额的Pandas实现问询

解决方案:用Pandas分组聚合+合并实现预期余额计算

不用循环遍历账户(这种方法在数据量大时效率极低),我们可以利用Pandas的向量化操作快速完成需求,步骤如下:

1. 准备训练集的日期均值数据

首先从训练集的日期中提取日期标识(比如一年中的第几天,或者月-日组合,确保不同年份的同一日期能被匹配),然后按账户和日期标识分组计算余额均值:

# 假设你的余额列名为`balance`,如果不是请替换为实际列名
# 提取日期标识:这里用年中的第几天,也可以用df_train['fdate'].dt.strftime('%m-%d')获取月-日组合
df_train['day_identifier'] = df_train['fdate'].dt.dayofyear

# 按账户+日期标识分组,计算余额均值
train_daily_means = df_train.groupby(['account', 'day_identifier'])['balance'].mean().reset_index(name='exp_bal')

2. 将均值匹配到测试集

给测试集添加同样的日期标识,然后通过merge操作将训练集的均值匹配到对应账户和日期的测试数据行:

# 测试集添加相同的日期标识
df_test['day_identifier'] = df_test['fdate'].dt.dayofyear

# 合并测试集与训练集的均值数据,确保所有测试行都被保留(left join)
df_test = df_test.merge(train_daily_means, on=['account', 'day_identifier'], how='left')

3. 处理可能的缺失值(可选)

如果测试集中存在某个account+日期标识的组合在训练集中没有记录,对应的exp_bal会是NaN。你可以用该账户在训练集的整体均值填充这些缺失值:

# 计算每个账户在训练集的整体余额均值
account_overall_means = df_train.groupby('account')['balance'].mean().reset_index(name='account_mean')

# 合并到测试集并填充缺失值
df_test = df_test.merge(account_overall_means, on='account', how='left')
df_test['exp_bal'] = df_test['exp_bal'].fillna(df_test['account_mean'])

# 清理临时列(可选)
df_test.drop(['day_identifier', 'account_mean'], axis=1, inplace=True)

为什么不用循环?

Pandas的向量化分组和合并操作是基于底层优化的,比Python循环快几个数量级——尤其是当你的账户数量多、数据量大时,循环会导致严重的性能问题,而这种方法能高效完成计算。

内容的提问来源于stack exchange,提问作者Celius Stingher

火山引擎 最新活动