Мой алгоритм увеличил время выполнения с 35 секунд до 15 минут при реализации этой функции в течение дневного периода. Al go извлекает ежедневную историю в большом количестве и выполняет итерацию по подмножеству кадра данных (от t0 до tX, где tX - текущая строка итерации). Это делает это, чтобы эмулировать то, что произошло бы во время операций в реальном времени al go. Я знаю, что есть способы улучшить его, используя память между вычислениями кадров, но мне было интересно, есть ли более реализация pandas -i sh, которая принесет немедленную выгоду.
Предположим, что self.Step
что-то вроде 0.00001
и self.Precision
есть 5
; они используются для разбивки информации о барах ohl c на отдельные шаги для нахождения po c. _frame
является подмножеством строк всего информационного кадра, и _low
/ _high
соответствуют этому. Следующий блок кода выполняется для всего _frame
, который может превышать ~ 250 строк каждый раз, когда новая строка добавляется с помощью al go (при расчете годового периода на ежедневных данных). Я полагаю, что именно iterrows вызывает основное замедление. Кадр данных имеет столбцы, такие как high
, low
, open
, close
, volume
. Я рассчитываю время, цену, возможность и объем контроля.
# Set the complete index of prices +/- 1 step due to weird floating point precision issues
volume_prices = pd.Series(0, index=np.around(np.arange(_low - self.Step, _high + self.Step, self.Step), decimals=self.Precision))
time_prices = volume_prices.copy()
for index, state in _frame.iterrows():
_prices = np.around(np.arange(state.low, state.high, self.Step), decimals=self.Precision)
# Evenly distribute the bar's volume over its range
volume_prices[_prices] += state.volume / _prices.size
# Increment time at price
time_prices[_prices] += 1
# Pandas only returns the 1st row of the max value,
# so we need to reverse the series to find the other side
# and then find the average price between those two extremes
volume_poc = (volume_prices.idxmax() + volume_prices.iloc[::-1].idxmax()) / 2)
time_poc = (time_prices.idxmax() + time_prices.iloc[::-1].idxmax()) / 2)