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
Проблема в том, что мне нужно обработать около 4 миллионов записей, и это займет примерно 60 часов.
Кто-нибудь знает, как получить то же самое результаты быстро и эффективно, пожалуйста?
df = pd.DataFrame(data=ds) [/code] Кадр данных выглядит следующим образом: [code]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 [/code] Я сохранил фрейм данных в файл .csv с именем df.csv: [code]df.to_csv("df.csv", index = False) [/code] Затем я создал функцию, которая рассчитывает индекс относительной силы (RSI – см.: https://www.investopedia.com/terms/r/rsi.asp): [code]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 [/code] Мне нужно создать новое поле под названием RSI, которое: [list] [*]обходит каждую запись кадра данных [*]вычисляет RSI, учитывая цену, наблюдаемую на каждой итерации, и последние цены (длина RSI в этом примере равна 3), наблюдаемые в предыдущей тренды. [/list] Например: [list] [*]Я повторяю запись 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).[*]и так далее..... [/list] Затем я написал этот код: [code]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'})
df['RSI'] = rsi [/code] Набор данных выглядит правильно: [code]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 [/code] Проблема в том, что мне нужно обработать около 4 миллионов записей, и это займет примерно 60 часов. Кто-нибудь знает, как получить то же самое результаты быстро и эффективно, пожалуйста?
Кто-нибудь знает, как talib, библиотека для финансового технического анализа на Python, рассчитывает индекс относительной силы (RSI)?
Существуют разные способы расчета RSI, в зависимости от от того, используете ли вы простое усреднение или...
Я пытаюсь рассчитать индекс относительной силы RSI для финансового инструмента. Когда я сравниваю свои расчеты с расчетами, выполненными с помощью коммерческого программного обеспечения, они не совпадают. Я не могу понять, что я делаю не так....
Я пытаюсь рассчитать индекс относительной силы RSI для финансового инструмента. Когда я сравниваю свои расчеты с расчетами, выполненными с помощью коммерческого программного обеспечения, они не совпадают. Я не могу понять, что я делаю не так....