Pandas, как векторизовать расчет, основанный на предыдущих строкахPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pandas, как векторизовать расчет, основанный на предыдущих строках

Сообщение Anonymous »

Я новичок в pandas и пытаюсь перенести индикатор из сценария pine в Python. У меня есть расчет, основанный на значениях предыдущей строки, которые динамически вычисляются для получения значений текущей строки. Я смог сделать это только с помощью цикла for и не нашел хорошего способа сделать это с помощью numpy или dataframe.apply. Проблема в том, что этот расчет выполняется очень медленно, слишком медленно, чтобы его можно было использовать в моих целях. 14 секунд только для 21951 строки.
Кто-нибудь знает, как сделать это более эффективно в пандах? Выяснение этого определенно поможет мне при создании других индикаторов, поскольку большинство из них в той или иной степени зависят от значений предыдущих строк.
Кадр данных выглядит так:
Изображение

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

"""
//
// @author LazyBear
// List of all my indicators:
// https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing
//
study(title="Coral Trend Indicator [LazyBear]", shorttitle="CTI_LB", overlay=true)
src=close
sm =input(21, title="Smoothing Period")
cd = input(0.4, title="Constant D")
ebc=input(false, title="Color Bars")
ribm=input(false, title="Ribbon Mode")
"""

# @jit(nopython=True) -- Tried this but was getting an error ==> argument 0: Cannot determine Numba type of 
def coral_trend_filter(df, sm = 21, cd = 0.4):
new_df = df.copy()

di = (sm - 1.0) / 2.0 + 1.0
c1 = 2 / (di + 1.0)
c2 = 1 - c1
c3 = 3.0 * (cd * cd + cd * cd * cd)
c4 = -3.0 * (2.0 * cd * cd + cd + cd * cd * cd)
c5 = 3.0 * cd + 1.0 + cd * cd * cd + 3.0 * cd * cd

new_df['i1'] = 0
new_df['i2'] = 0
new_df['i3'] = 0
new_df['i4'] = 0
new_df['i5'] = 0
new_df['i6'] = 0

for i in range(1, len(new_df)):
new_df.loc[i, 'i1'] = c1*new_df.loc[i, 'close'] + c2*new_df.loc[i - 1, 'i1']
new_df.loc[i, 'i2'] = c1*new_df.loc[i, 'i1'] + c2*new_df.loc[i - 1, 'i2']
new_df.loc[i, 'i3'] = c1*new_df.loc[i, 'i2'] + c2*new_df.loc[i - 1, 'i3']
new_df.loc[i, 'i4'] = c1*new_df.loc[i, 'i3'] + c2*new_df.loc[i - 1, 'i4']
new_df.loc[i, 'i5'] = c1*new_df.loc[i, 'i4'] + c2*new_df.loc[i - 1, 'i5']
new_df.loc[i, 'i6'] = c1*new_df.loc[i, 'i5'] + c2*new_df.loc[i - 1, 'i6']

new_df['cif'] = -cd*cd*cd*new_df['i6'] + c3*new_df['i5'] + c4*new_df['i4'] + c5*new_df['i3']
new_df.dropna(inplace=True)

# trend direction
new_df['cifd'] = 0

# trend direction color
new_df['cifd'] = 'blue'

new_df['cifd'] = np.where(new_df['cif'] < new_df['cif'].shift(-1), 1, -1)
new_df['cifc'] = np.where(new_df['cifd'] == 1, 'green', 'red')

new_df.drop(columns=['i1', 'i2', 'i3', 'i4', 'i5', 'i6'], inplace=True)

return new_df

df = coral_trend_filter(data_frame)
Ответ на комментарий:
Одно из предложений заключалось в использовании сдвига. Это не работает, поскольку расчет каждой строки обновляется на каждой итерации. При сдвиге сохраняются начальные значения и не обновляются сдвинутые столбцы, поэтому вычисленные значения неверны. Посмотрите этот снимок экрана, который не соответствует оригиналу в столбце cif. Также обратите внимание, что я оставил сдвиг_i1, чтобы показать, что столбцы остаются равными 0, что неверно для вычислений.
[img]https:// i.sstatic.net/cbDCz.png[/img]

Обновление:
Перейдя на использование .at вместо .loc Моя производительность значительно улучшилась. Возможно, моя проблема заключалась в том, что я использовал неправильный метод доступа для этого типа обработки.

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Найдите дубликаты в столбце pandas вложенных списков в предыдущих строках с несколькими условиями.
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Панды: как мне векторизовать этот расчет цикла?
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как векторизовать операции в кадре данных pandas?
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как векторизовать Pandas DateTimeIndex
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Pandas — накопительная сумма значений предыдущих строк.
    Anonymous » » в форуме Python
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous

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