python - 熊猫矢量化循环并根据单元格值动态选择列标签
问题描述
我正在使用np.where
对财务数据进行算法交易回测。假设我有这个简单的数据框,按日期和一天中的几分钟作为单元格中具有任意值的列,用于特征 A 和特征 B 用作测试条件。column_df
300 310 320 330 340 A B pred_min1 pred_min2
2010-04-28 9 10 11 12 13 5 2 330 300
2010-04-29 19 20 21 22 23 5 2 330 300
2010-04-30 29 30 31 32 33 1 7 340 330
2010-04-31 39 40 41 42 43 1 7 340 330
我可以通过执行以下操作根据 A 和 B 列的特定条件计算一天的回报:
import pandas as pd
import numpy as np
column_df['return'] = np.where(column_df['A']<column_df['B'],
column_df['320']-column_df['310'],
column_df['320']-column_df['300'])
这将创建一个新的返回列:
300 310 320 330 340 A B pred_min1 pred_min2 return
2010-04-28 9 10 11 12 13 5 2 330 300 2
2010-04-29 19 20 21 22 23 5 2 330 300 2
2010-04-30 29 30 31 32 33 1 7 340 330 1
2010-04-31 39 40 41 42 43 1 7 340 330 1
现在,如果我添加两列我想每天交易的预测分钟,pred_min1 和 pred_min2。
如何测试特定条件 A 和 B,但动态使用存储在 pred_min1 和 pred_min2 中的列标签,使用存储在这些单元格值代表当天的列中的值计算当天的回报?本质上,我想要一种灵活的方法来选择列以根据 pred_min1 和 pred_min2 中找到的标签进行计算,每行的元素方式,以向量化的方式,而不使用循环。
我试过了:
column_df['return'] = np.where(column_df['A']<column_df['B'],
column_df['320']-column_df['310'],
column_df[str(column_df.loc[:,'pred_min1'].values)]-column_df['300'])
有错误:
KeyError: '[330 330 340 340]'
我也试过:
column_df['return'] = np.where(column_df['A']<column_df['B'], column_df['320']-column_df['310'], column_df[str(column_df.loc[:,'pred_min1'])]-column_df['300'])
有错误:
KeyError: '2019-04-28 330\n2019-04-29 330\n2019-04-30 340\n2019-04-31 340\nName: pred_min1, dtype: int64'
和
column_df['return'] = np.where(column_df['A']<column_df['B'], column_df['320']-column_df['310'], column_df[str(column_df.pred_min1)]-column_df['300'])
有错误:
KeyError: '2019-04-28 330\n2019-04-29 330\n2019-04-30 340\n2019-04-31 340\nName: pred_min1, dtype: int64'
任何帮助表示赞赏。谢谢
解决方案
apply
您应该尝试在方法中定义用户定义的函数
def func(r):
if r['A'] < r['B']:
r['return']= r['320']-r['310']
else:
r['return'] = r[str(r['pred_min1'])] - r['300']
return r
df = df.apply(func, axis=1)
推荐阅读
- java - 如果列表是另一个列表的子集,则 Ebean 返回记录
- ruby-on-rails - 如果用户之前选择了单选按钮,如何在 Rails App 中将单选按钮添加回表单
- python - 确定树中叶节点与非叶节点的数量
- javascript - Flask API 在邮递员和浏览器中工作,但在 JavaScript 代码中抛出错误
- java - 使用 @Parameter 注释时未记录 @BeanParam
- java - 如何向用户询问 4 个数字并将它们排序(升序/降序)打印出来?
- python - 检查鼠标是否在pygame窗口之外
- github-actions - 从另一个工作流程触发新工作流程?
- java - Amazon S3 在 EC2 实例上运行时不返回响应或抛出错误
- dataframe - 整个数据帧上的 Pyspark Window 函数