首页 > 解决方案 > 根据另一列在 pandas 中创建一个特征

问题描述

我有以下数据集:

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_signal01

ROC_9positive到 时negative,我想改变ROC9_signal0-1

查看数据,我想ROC9_signal从 更改0-1,因为值已从0.16( positive) 变为-0.006( negative)。

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

查看数据,我想ROC9_signal从 更改0-1,因为该值已从0.20(正)变为 - 0.008negative)。

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

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

在此先感谢您的帮助。

这是完整数据的样子:

完整数据

标签: pythonpandastechnical-indicatorzerocrossing

解决方案


数据

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]

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

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)))

在此处输入图像描述


推荐阅读