Код: Выделить всё
import pandas as pd
import numpy as np
ds = { 'trend' : [1,1,1,1,2,2,3,3,3,3,3,3,4,4,4,4,4], 'price' : [23,43,56,21,43,55,54,32,9,12,11,12,23,3,2,1,1]}
df = pd.DataFrame(data=ds)
Код: Выделить всё
display(df)
trend price
0 1 23
1 1 43
2 1 56
3 1 21
4 2 43
5 2 55
6 3 54
7 3 32
8 3 9
9 3 12
10 3 11
11 3 12
12 4 23
13 4 3
14 4 2
15 4 1
16 4 1
Код: Выделить всё
df.to_csv("df.csv", index = False)
Код: Выделить всё
def get_RSI(df, column, time_window):
"""Return the RSI indicator for the specified time window."""
diff = df[column].diff(1)
# This preservers dimensions off diff values.
up_chg = 0 * diff
down_chg = 0 * diff
# Up change is equal to the positive difference, otherwise equal to zero.
up_chg[diff > 0] = diff[diff > 0]
# Down change is equal to negative deifference, otherwise equal to zero.
down_chg[diff < 0] = diff[diff < 0]
# We set com = time_window-1 so we get decay alpha=1/time_window.
up_chg_avg = up_chg.ewm(com=time_window - 1,
min_periods=time_window).mean()
down_chg_avg = down_chg.ewm(com=time_window - 1,
min_periods=time_window).mean()
RS = abs(up_chg_avg / down_chg_avg)
df['RSI'] = 100 - 100 / (1 + RS)
df = df[['RSI']]
return df
- обходит каждую запись кадра данных
- вычисляет RSI, учитывая цену, наблюдаемую на каждой итерации, и последние
цены (длина RSI в этом примере равна 3), наблюдаемые в предыдущей тренды.
- Я повторяю запись 0 и RSI имеет значение NaN (отсутствует).
- Я выполняю итерацию по записи 1, а RSI по-прежнему равен NaN (отсутствует).
- Я выполняю итерацию по записи 12 и RSI равно 47,667343 (учитывается цена записи 3, цена записи 5 и цена записи 12).
- Я повторяю запись 13, а RSI равен 28,631579 (учитывается цена записи 3, цена запись 5 и цена записи 13.
- Я повторяю запись 15, и RSI равен 27,586207 (он учитывает цену записи 3, цену записи 5 и цену записи 15).
- и так далее.....
Код: Выделить всё
rsi = []
for i in range(len(df)):
ds = pd.read_csv("df.csv", nrows=i+1)
print(ds.info())
d = ds.groupby(['trend'], as_index=False).agg(
{'price':'last'})
get_RSI(d,'price',3)
rsi.append(d['RSI'].iloc[-1])
df['RSI'] = rsi
Код: Выделить всё
display(df)
trend price RSI
0 1 23 NaN
1 1 43 NaN
2 1 56 NaN
3 1 21 NaN
4 2 43 NaN
5 2 55 NaN
6 3 54 NaN
7 3 32 NaN
8 3 9 NaN
9 3 12 NaN
10 3 11 NaN
11 3 12 NaN
12 4 23 47.667343
13 4 3 28.631579
14 4 2 28.099174
15 4 1 27.586207
16 4 1 27.586207
Кто-нибудь знает, как получить то же самое результаты быстро и эффективно, пожалуйста?
Подробнее здесь: https://stackoverflow.com/questions/787 ... rations-in