python - 关于为股票市场算法循环遍历 Pandas 数据框的问题
问题描述
我想用 python pandas 分析历史股票市场数据的交易算法。但我了解到循环使用大型数据集并不是很快 - 数百万行是不可能的。
所以我从布尔索引开始。但我无法让它工作。有人有线索吗?我的示例有 5 行,但实际上我有 200 万行。
我了解了 SHIFT 函数以考虑上一行的值。但这只能解决一排的问题。
## data set
timehourminute=['15:25','15:30','15:35','15:40','15:45']
close=[21.02,21.05,21.10,21.22, 21.17]
signal=[False,True,True,True,False]
position=[0,0,0,0,0]
data={'timehourminute':timehourminute,'close':close, 'signal':signal,'position':position}
df=pd.DataFrame.from_dict(data)
## if time = 15:30 and signal = True, buy $1000 worth of stocks
subset = (df.timehourminute=='15:30') & (df.signal==True)
df.loc[subset,'position']=(1000/df.close)
## if previous row has position, keep the position if the signal is still True
df['positionprev']=df.position.shift(1)
df.position = df.signal * df[['position','positionprev']].max(axis=1)
df.position = df.position.astype(int)
输出是这样的:
timehourminute close signal position positionprev
0 15:25 21.02 False 0 NaN
1 15:30 21.05 True 47 0.000000
2 15:35 21.10 True 47 47.505938
3 15:40 21.22 True 0 0.000000
4 15:45 21.17 False 0 0.000000
问题是我想保持位置直到信号变为假。在此示例中,信号持续 3 行,但实际上它可以持续 1000 行。我如何让 47 的值也留在第 3 行?
解决方案
我相信您需要Series.mask
按条件查找缺失值并向前填充缺失值:
df['new'] = df.position.mask(df.signal & (df.position == 0)).ffill()
print (df)
timehourminute close signal position new
0 15:25 21.02 False 0.000000 0.000000
1 15:30 21.05 True 47.505938 47.505938
2 15:35 21.10 True 0.000000 47.505938
3 15:40 21.22 True 0.000000 47.505938
4 15:45 21.17 False 0.000000 0.000000
推荐阅读
- asp.net-core - 跨多个 Web 应用程序使用的作业调度程序
- django - django 测试 - 如何避免 ForeignKeyViolation
- spring-boot - 同一页面中有多个相似的表单
- javascript - socket.io 服务器不断收到连接事件,但客户端从不连接
- python - 使用保留索引重塑 Numpy 数组
- html - 为什么滚动快照类型不起作用
- azure - 如何在 PowerShell 中使用 AzModule 命令创建 AzureProfile.json 文件?
- spring-mvc - 使用 GPC 部署 Spring MVC 应用程序:Cloud SQL、Kubernetes(服务和入口)和带有 Google 托管证书的 HTTP(S) 负载均衡器
- intellij-idea - IntelliJ IDEA 的 JVM 调试器内存视图
- rust - `UnsafeCell` 是 Rust 中的编译器优化障碍吗?