Как рассчитать индекс относительной силы (RSI) с помощью итераций записи в кадре данных pandasPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как рассчитать индекс относительной силы (RSI) с помощью итераций записи в кадре данных pandas

Сообщение Anonymous »

Я создал кадр данных pandas следующим образом:

Код: Выделить всё

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
Я сохранил фрейм данных в файл .csv с именем df.csv:

Код: Выделить всё

df.to_csv("df.csv", index = False)
Затем я создал функцию, которая рассчитывает индекс относительной силы (RSI – см.: https://www.investopedia.com/terms/r/rsi.asp):

Код: Выделить всё

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, учитывая цену, наблюдаемую на каждой итерации, и последние
    цены (длина 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
Проблема в том, что мне нужно обработать около 4 миллионов записей, и это займет примерно 60 часов.
Кто-нибудь знает, как получить то же самое результаты быстро и эффективно, пожалуйста?

Подробнее здесь: https://stackoverflow.com/questions/787 ... rations-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как Талиб рассчитывает RSI (индекс относительной силы)?
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как рассчитать экспоненциальное скользящее среднее (EMA) посредством итераций записи в кадре данных pandas
    Anonymous » » в форуме Python
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • RSI против проблем расчета RSI Уайлдера
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Индекс относительной силы
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Индекс относительной силы
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»