我正在尝试使用正确的计算(如下)基于.csv文件在熊猫中实现相对强度计算。
我看过之前的问题,这些事情与我想要的事情类似,但是如前所述,计算略有不同,我无法弄清楚如何从当前CSV文件中完成一个问题。我遇到的问题是,当迭代次数等于窗口(.csv中的黄色单元格)时,当前计算将使用先前up
值的平均值,但随后将先前avg_up
值用于迭代编号之后的所有行均超过窗口(.csv中的绿色单元格)。这似乎使其成为圆形。
这是到目前为止的代码:
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:
但是这是我遇到麻烦的地方。例如,当我将公式应用于avg_up
列时,它显然会覆盖其中已经存在的值。有什么想法吗?
只需使用滚动
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']))
这应该可以,但是我现在不能测试。