在第一行使用不同计算的熊猫的相对强度指数

问题描述 投票:2回答:1

我正在尝试使用正确的计算(如下)基于.csv文件在熊猫中实现相对强度计算。

我看过之前的问题,这些事情与我想要的事情类似,但是如前所述,计算略有不同,我无法弄清楚如何从当前CSV文件中完成一个问题。我遇到的问题是,当迭代次数等于窗口(.csv中的黄色单元格)时,当前计算将使用先前up值的平均值,但随后将先前avg_up值用于迭代编号之后的所有行均超过窗口(.csv中的绿色单元格)。这似乎使其成为圆形。

以下是具有正确实现的csv的屏幕截图:enter image description here

这是到目前为止的代码:

import pandas as pd

data = [46.125,47.125,46.4375,46.9375,44.9375,44.25,
        44.625,45.75,47.8125,47.5625,47,44.5625,46.3125,
        47.6875,46.6875,45.6875,43.0625,43.5625,44.875,43.6875]
# Inputs
x = data
window = 14

df = pd.DataFrame(x, columns=['price'])

df['delta'] = df['price'].diff()

df = df.iloc[1:]
df['up'], df['down'] = df['delta'].copy(), df['delta'].copy()
df.loc[df['delta'] < 0, 'up'] = 0
df.loc[df['delta'] > 0, 'down'] = 0
df['down'] = df['down'].abs()

df['avg_up'], df['avg_down'] = np.nan, np.nan
df['rs'], df['rsi'] = np.nan, np.nan

if df.shape[0] < window:
    print('not enough data.')
    pass
elif df.shape[0] == window:
    print("Now we calculate")
    df['avg_up'].loc[window] = df['up'].loc[-window:window].mean()
    df['avg_down'].loc[window] = df['down'].loc[-window:window].mean()
    df['rs'].loc[window] = df['avg_up'].loc[window] / df['avg_down'].loc[window]
    df['rsi'].loc[window] = 100 - (100 / (1 + df['rs'].loc[window]))
elif df.shape[0] > window:
    # Calculate the values for t=window
    df['avg_up'].loc[window] = df['up'].loc[-window:window].mean()
    df['avg_down'].loc[window] = df['down'].loc[-window:window].mean()
    df['rs'].loc[window] = df['avg_up'].loc[window] / df['avg_down'].loc[window]
    df['rsi'].loc[window] = 100 - (100 / (1 + df['rs'].loc[window]))

在elif语句之后,我现在只需要使用窗口后的那些行的公式来计算其余数据帧的RSI:

enter image description here

但是这是我遇到麻烦的地方。例如,当我将公式应用于avg_up列时,它显然会覆盖其中已经存在的值。有什么想法吗?

python pandas
1个回答
0
投票

只需使用滚动

df['avg_up'] = df.rolling(window).mean()['up']
df['avg_down'] = df.rolling(window).mean()['down']
df['rs'] = df['avg_up'] / df['avg_down']
df['rsi'] = 100 - (100 / (1 + df['rs']))

这应该可以,但是我现在不能测试。

© www.soinside.com 2019 - 2024. All rights reserved.