如何为Pandas DataFrame实现重叠连续交易信号的均值过滤?
问题
我有如下结构的Pandas DataFrame:
time price buy sell 1 1 0 0 2 1 buy 0 3 1 buy 0 4 1 buy 0 5 1 0 sell 6 1 0 sell
需要实现重叠连续信号的均值过滤(比如连续出现的buy信号),最终得到包含signal列的目标DataFrame:
time price buy sell signal 1 1 0 0 0 2 1 buy 0 buy 3 1 buy 0 0 4 1 buy 0 0 5 1 0 sell sell 6 1 0 sell 0
请问具体该如何实现?
解决方案
核心思路是只保留连续相同信号的第一个出现值,后续连续重复的信号替换为0,具体实现步骤如下:
- 先构造示例DataFrame(已有数据可跳过此步):
import pandas as pd df = pd.DataFrame({ 'time': [1,2,3,4,5,6], 'price': [1,1,1,1,1,1], 'buy': ['0', 'buy', 'buy', 'buy', '0', '0'], 'sell': ['0', '0', '0', '0', 'sell', 'sell'] })
- 生成初始信号列:优先取
buy列的有效信号,若无则取sell列,都无则为0
df['signal'] = df.apply(lambda x: x['buy'] if x['buy'] != '0' else x['sell'], axis=1)
- 过滤连续重复信号:对比当前行与上一行的信号,若相同且为有效信号,则替换为0
df['signal'] = df.apply( lambda x: '0' if (x['signal'] == df['signal'].shift(1)) and (x['signal'] != '0') else x['signal'], axis=1 ) # 若需要将字符串'0'转为数字0,执行以下代码 df['signal'] = df['signal'].replace('0', 0)
执行后得到的结果就是目标DataFrame:
time price buy sell signal 0 1 1 0 0 0 1 2 1 buy 0 buy 2 3 1 buy 0 0 3 4 1 buy 0 0 4 5 1 0 sell sell 5 6 1 0 sell 0
适配说明
- 如果原始数据中
buy/sell列的0是数字类型,只需把判断条件中的x['buy'] != '0'改为x['buy'] != 0即可。 - 该方法通过去重连续重复信号实现“均值过滤”的效果,连续相同信号仅保留首次触发值,等价于对连续信号做了单次触发的简化处理。
内容的提问来源于stack exchange,提问作者SARVAGYA
相关产品推荐
相关产品推荐

