简体   繁体   中英

Create a “directional” pandas pct_change function

I want to create a directional pandas pct_change function, so a negative number in a prior row, followed by a larger negative number in a subsequent row will result in a negative pct_change (instead of positive).

I have created the following function: ```

ef pct_change_directional(x):
    if x.shift() > 0.0:
        return x.pct_change() #compute normally if prior number > 0

elif x.shift() < 0.0 and x > x.shift:
    return abs(x.pct_change()) # make positive

elif x.shift() <0.0 and x < x.shift():
    return -x.pct_change() #make negative
else:
    return 0

```

However when I apply it to my pandas dataframe column like so: df['col_pct_change'] = pct_change_directional(df[col1]) I get the following error: ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

any ideas how I can make this work?

Thanks! CWE

As @Wen said multiple where, not unlikely np.select

mask1 = df[col].shift() > 0.0
mask2 = ((df[col].shift() < 0.0) & (df[col] > df[col].shift())
mask3 = ((df[col].shift() < 0.0) & (df[col] < df[col].shift())

np.select([mask1, mask2, mask3],
          [df[col].pct_change(), abs(df[col].pct_change()),
           -df[col].pct_change()],
           0)

Much detail about select and where you can see here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM