You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DataFrame中按日期聚合并生成基于涨跌均值的二元交易标签变量

按日期聚合生成二元分类变量的实现方案

需求说明

给DataFrame新增Expected二元分类列,取值为buy或sell:

  • 按Date分组,计算该日期下Outcome为up和dn的Share Price均值
  • 若up的均值高于dn的均值,标记为buy,否则标记为sell

示例数据构造

import pandas as pd

data = {
    'timestamp': ['10/05/2022 08:04', '10/05/2022 08:04', '10/05/2022 08:04', '10/05/2022 08:04', '11/05/2022 00:54', '11/05/2022 00:54'],
    'IFPID': ['SP3K4K5']*6,
    'Outcome': ['dn', 'up', 'up', 'dn', 'up', 'dn'],
    'Share Price': [36, 64, 65, 35, 57, 43],
    'Trade Qty': [100, 100, 100, 100, 64, 64],
    'Date': ['2022-10-05']*4 + ['2022-11-05']*2
}
df = pd.DataFrame(data)

实现步骤

1. 计算日期-结果维度的均值

先按Date和Outcome分组计算Share Price的均值,再转成宽表方便后续比较:

# 分组计算均值并转置为宽表
mean_price_df = df.groupby(['Date', 'Outcome'])['Share Price'].mean().unstack()
# 重命名列便于识别
mean_price_df.columns = ['dn_avg', 'up_avg']

2. 生成日期到标签的映射

对每个日期比较up_avg和dn_avg,生成buy/sell的映射字典:

date_label_map = mean_price_df.apply(
    lambda row: 'buy' if row['up_avg'] > row['dn_avg'] else 'sell',
    axis=1
).to_dict()

3. 给原表添加标签列

用map方法将映射应用到原DataFrame的Date列,生成Expected列:

df['Expected'] = df['Date'].map(date_label_map)

最终结果

执行上述代码后,原DataFrame会新增Expected列:

timestamp   IFPID Outcome  Share Price  Trade Qty        Date Expected
0  10/05/2022 08:04  SP3K4K5      dn           36        100  2022-10-05      buy
1  10/05/2022 08:04  SP3K4K5      up           64        100  2022-10-05      buy
2  10/05/2022 08:04  SP3K4K5      up           65        100  2022-10-05      buy
3  10/05/2022 08:04  SP3K4K5      dn           35        100  2022-10-05      buy
4  11/05/2022 00:54  SP3K4K5      up           57         64  2022-11-05      buy
5  11/05/2022 00:54  SP3K4K5      dn           43         64  2022-11-05      buy

简化实现(合并一步)

也可以用merge直接将均值表合并到原表,再生成标签:

# 计算均值并合并到原表
mean_price_df = df.groupby(['Date', 'Outcome'])['Share Price'].mean().unstack().reset_index()
df = df.merge(mean_price_df, on='Date')
# 生成标签并清理临时列
df['Expected'] = df.apply(lambda row: 'buy' if row['up'] > row['dn'] else 'sell', axis=1)
df.drop(columns=['up', 'dn'], inplace=True)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:31:12