【问题标题】:Create a feature in pandas based on another column根据另一列在 pandas 中创建一个特征
【发布时间】:2020-09-20 00:54:21
【问题描述】:

我有以下数据集:

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_9 从negative 变为positive 时,我想将ROC9_signal 从0 更改为1。

当ROC_9 从positive 变为negative 时,我想将ROC9_signal 从0 更改为-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.008(negative)。

只有发生变化的那一行我要从0改为1或0改为-1,其他行必须保持为0。

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

提前感谢您的帮助。

这是完整数据的样子:

Full Data

【问题讨论】:

  • 请以文本形式提供一小部分示例数据,我们可以复制和粘贴。包括相应的期望结果。查看how to make good reproducible pandas examples 上的指南。
  • 抱歉。我现在提供了一些示例数据。谢谢@timgeb

标签: python pandas technical-indicator zerocrossing


【解决方案1】:

尝试使用 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)

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    数据

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

    【讨论】:

    • 感谢您的帮助!这非常有效。欣赏!
    猜你喜欢
    • 2022-10-15
    • 2023-01-04
    • 2020-04-16
    • 2021-03-02
    • 2021-05-02
    • 1970-01-01
    • 2018-11-27
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多