基于DataFrame股票价格列多条件行值比较及投票机制实现求助
解决方案:基于Pandas实现股票涨跌幅的阈值判断与多数投票逻辑
以下是完整的可运行代码,完全匹配你描述的需求逻辑:
import pandas as pd import numpy as np # 1. 构造示例数据(匹配你提供的样例) np.random.seed(0) df = pd.DataFrame({'Close': np.random.uniform(0, 100, size=5)}) # 手动设置change列,模拟实际数据 df['change'] = [np.nan, 16.637586, -11.242599, -5.788019, -12.122838] # 2. 设置阈值(0-1范围,这里以0.5为例,可根据需求调整) threshold = 0.5 # 3. 步骤1:计算相邻change的差值并生成判断值 # 计算后一个change与前一个的差值(对应1&2、2&3、3&4的索引对) diff_change = df['change'].diff() # 处理NaN值(第一个差值无前置数据,设为0) diff_change = diff_change.fillna(0) # 根据阈值生成1/-1/0的判断列 judge = np.where( diff_change > threshold, 1, np.where(diff_change < -threshold, -1, 0) ) # 4. 步骤2:实现多数投票逻辑(含特殊规则) def vote(window): # 统计-1、0、1的出现次数 count_neg1 = (window == -1).sum() count_0 = (window == 0).sum() count_1 = (window == 1).sum() # 特殊规则:若三个值分别为1、0、-1,直接返回0 if count_neg1 == 1 and count_0 == 1 and count_1 == 1: return 0 # 多数投票逻辑 max_count = max(count_neg1, count_0, count_1) if count_1 == max_count: return 1 elif count_neg1 == max_count: return -1 else: return 0 # 5. 步骤3:滑动窗口应用投票,生成Result列 # 将判断值转为Series,使用滑动窗口(窗口大小3) judge_series = pd.Series(judge) # 对每个连续3组判断值应用投票函数 result_rolling = judge_series.rolling(window=3).apply(vote, raw=True) # 填充NaN值(前两行无法形成完整窗口,设为0)并转为整数 df['Result'] = result_rolling.fillna(0).astype(int) # 输出结果 print(df)
分步解释:
- 数据构造:模拟你提供的股票收盘价和涨跌幅数据,确保测试环境与需求一致。
- 阈值设置:可根据实际需求调整
threshold的值(范围0-1)。 - 差值计算与判断:
- 用
diff()计算相邻涨跌幅的差值(后值减前值),对应你要求的1&2、2&3等索引对。 - 用
np.where()嵌套实现三分支判断:差值>阈值返回1,<-阈值返回-1,否则返回0。
- 用
- 投票逻辑实现:
- 自定义
vote()函数,先检查特殊规则(1、0、-1各出现一次时返回0)。 - 统计各值出现次数,返回出现次数最多的结果;若次数相同(除特殊规则外),返回0。
- 自定义
- 滑动窗口生成结果:
- 使用
rolling(window=3)创建连续3组的滑动窗口,对每个窗口应用投票函数。 - 前两行无法形成完整窗口,用
fillna(0)填充,最终得到与原数据行数一致的Result列。
- 使用
内容的提问来源于stack exchange,提问作者Raagib khan
相关产品推荐
相关产品推荐

