Кто-нибудь знает, как сделать это более эффективно в пандах? Выяснение этого определенно поможет мне при создании других индикаторов, поскольку большинство из них в той или иной степени зависят от значений предыдущих строк.
Кадр данных выглядит так:

Код: Выделить всё
"""
//
// @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