首页 > 解决方案 > 熊猫矢量化循环并根据单元格值动态选择列标签

问题描述

我正在使用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'

任何帮助表示赞赏。谢谢

标签: pythonpandasnumpyvectorization

解决方案


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)

推荐阅读