有没有办法用布尔函数实现Pandas系列中的动作函数?

2024-09-21 01:17:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现股票市场收盘价的作用函数。逻辑是

Action [ i ] = 1 if Close[ i+1 ] > Close[ i ]
Action [ i ] = (-1) if Close[ i+1 ] < Close[ i ]

这需要为调整了收盘价的数据帧实现。你知道吗

数据帧如下所示

Adj Close
1144.973755
1133.032471
1130.913696
1133.176880
1135.295532
1127.495117

我希望在一个新的dataframe操作中使用输出

1 if df['Adj close'][0] < df['Adj Close'][1]
-1 if df['Adj close'][0] > df['Adj Close'][1]

Adj Close   Action
1144.973755  1
1133.032471 -1
1130.913696 -1
1133.176880  1
1135.295532  1
1127.495117 -1

如果我想实现这个函数,我应该如何写一个条件语句?你知道吗


Tags: 数据函数dataframedfcloseifaction语句
2条回答
df['Action'] = np.where(df['Adj Close'].diff()>0, 1,-1)

或者np.选择如果差异=0时采取特殊措施

比较^{}ed值与原始值,并通过^{}设置新值:

df['Action'] = np.where(df['Adj Close'].shift() > df['Adj Close'], -1, 1)
print (df)
     Adj Close  Action
0  1144.973755       1
1  1133.032471      -1
2  1130.913696      -1
3  1133.176880       1
4  1135.295532       1
5  1127.495117      -1

细节

print (df['Adj Close'].shift())
0            NaN
1    1144.973755
2    1133.032471
3    1130.913696
4    1133.176880
5    1135.295532
Name: Adj Close, dtype: float64

print (df['Adj Close'].shift() > df['Adj Close'])
0    False
1     True
2     True
3    False
4    False
5     True
Name: Adj Close, dtype: bool

自定义函数:

def action(df):
    df['Action'] = np.where(df['Adj Close'].shift() > df['Adj Close'], -1, 1)
    return df
print (action(df))
     Adj Close  Action
0  1144.973755       1
1  1133.032471      -1
2  1130.913696      -1
3  1133.176880       1
4  1135.295532       1
5  1127.495117      -1

第一个值与nothing比较,所以如果使用diff函数,则输出缺少值。如果需要自定义值,这里有另一个带有^{}的解决方案:

diff = df['Adj Close'].diff()
df['Action'] = np.select([diff.isna(), diff > 0], [0, 1], -1)

或:

shifted = df['Adj Close'].shift()
df['Action'] = np.select([shifted > df['Adj Close'], shifted < df['Adj Close']], [-1, 1], 0)

print (df)
     Adj Close  Action
0  1144.973755       0
1  1133.032471      -1
2  1130.913696      -1
3  1133.176880       1
4  1135.295532       1
5  1127.495117      -1

上面的解决方案来自预期的输出,似乎需要通过公式来解决:

df['Action'] = np.where(df['Adj Close'].shift(-1) > df['Adj Close'], 1, -1)
print (df)
     Adj Close  Action
0  1144.973755      -1
1  1133.032471      -1
2  1130.913696       1
3  1133.176880       1
4  1135.295532      -1
5  1127.495117      -1

相关问题 更多 >

    热门问题