根据另一列在熊猫中创建特征

时间:2020-06-01 16:53:34

标签: python pandas technical-indicator zerocrossing

我有以下数据集:

data = {'ROC_9':  [0.006250, 0.087230, 0.045028, 0.165738, -0.006993, -0.432736, -0.11162, 0.057466, 0.203138, -0.008234]}

price_data = pd.DataFrame (data)

它是有关股价(即变化率)的指标。

我想编写一个代码,当熊猫数据帧上的当前特征从正变为负时,在熊猫数据帧上创建一个新特征(列)。

通过示例更容易解释:让我们使用功能ROC9

我创建了一个名为ROC9_signal的新变量,并将其设置为等于0

`price_data['ROC9_signal'] = 0`

ROC_9negative变为positive时,我想将ROC9_signal0更改为1

ROC_9positive变为negative时,我想将ROC9_signal0更改为-1

查看数据,我希望ROC9_signal0更改为-1,因为该值已从0.16positive)变为-0.006negative)。

查看数据,我希望ROC_9信号从0变为1,因为该值已从-0.11negative )到0.05positive)。

查看数据,我希望ROC9_signal0更改为-1,因为该值已从0.20(正值)变为-{{1 }}(0.008)。

我要从0更改为1或从0更改为-1的只是发生更改的行,其他行必须保持为0。

然后,我将应用相同的逻辑来创建negative列和momentum10_signal列。因此,我想要一个可以应用于不同列而不是手动的解决方案。

预先感谢您的帮助。

这是完整数据的样子:

Full Data

2 个答案:

答案 0 :(得分:0)

尝试使用np.where:

首先使用shift创建“ ROC9_prev”列:

price_data['ROC9_prev'] = price_data['ROC9'].shift(1)

您可能需要在转移之前按一列进行分组,以确保获取的是每只股票的先前ROC9,而不是另一只股票的当前ROC9。

然后创建信号列,如下所示:

price_data['ROC9_Signal'] = np.where(price_data['ROC9'] > 0 & price_data['ROC9_prev'] < 0, 1, 0)
price_data['ROC9_Signal'] = np.where(price_data['ROC9'] < 0 & price_data['ROC9_prev'] > 0, -1, 0)

希望这会有所帮助。

答案 1 :(得分:0)

数据

data = {'ROC_9':  [0.006250, 0.087230, 0.045028, 0.165738, -0.006993, -0.432736, -0.11162, 0.057466, 0.203138, -0.008234]}

price_data = pd.DataFrame (data)
price_data['ROC9_signal'] = 0
price_data

使用布尔选择来找到两个不同的交点:

 ZeroCrossing1=price_data.ROC_9.ge(0)&price_data.ROC_9.shift(1).le(0)#from 0 to 1
 ZeroCrossing2=price_data.ROC_9.ge(0)&price_data.ROC_9.shift(-1).le(0)# from 0 to -1.

将“零交叉”可能的结果放入列表

 ZeroCrossingOutcomes=[1,-1]

有条件地使用np.where计算price_data['ROC9_signal']

price_data['ROC9_signal']=np.select([ZeroCrossing1,ZeroCrossing2],ZeroCrossingOutcomes,0)
print(price_data)

或者使用嵌套的np.where(if condition, ye, else no)

price_data['ROC9_signal']=np.where(ZeroCrossing1,1,np.where(ZeroCrossing2,-1,0)))

enter image description here