如何在Pandas中创建BSI计算列?附分组求和逻辑
需求:为DataFrame新增BSI计算列
计算公式
BSI = ln((1+nPd)/(1+nNd))
其中:
- d:日期(对应
date列) - nP:单日期内正向预测值(
pred_rate=1)的总和 - nN:单日期内负向预测值(
pred_rate=0)的总和
具体要求
- 按
date列对pred_rate列分组 - 统计每组中
pred_rate=1(正向)和pred_rate=0(负向)的数量 - 在原DataFrame中新增
BSI列并完成计算
解决方案代码
import pandas as pd import numpy as np # 假设数据集存储在名为df的DataFrame中 # 1. 按日期分组统计正负预测值数量 daily_counts = df.groupby('date')['pred_rate'].agg( nP=lambda x: (x == 1).sum(), nN=lambda x: (x == 0).sum() ).reset_index() # 2. 计算BSI列 daily_counts['BSI'] = np.log((1 + daily_counts['nP']) / (1 + daily_counts['nN'])) # 3. 将结果合并回原DataFrame df = df.merge(daily_counts[['date', 'BSI']], on='date', how='left')
代码说明
groupby('date')['pred_rate'].agg(...):按日期分组后,分别统计每组中正向和负向预测值的总数np.log(...):调用numpy自然对数函数计算BSI,分子分母加1可避免出现除以0的异常情况merge(...):将按日期计算的BSI值匹配到原DataFrame的每一行,确保所有数据都对应正确的BSI值
内容的提问来源于stack exchange,提问作者Christian Divinefavour
相关产品推荐
相关产品推荐

