Эффективный способ обработки таймсерий DataFrame панд с помощью Numba

У меня есть DataFrame с 1 500 000 строк. Это одноминутные данные фондового рынка, которые я купил на QuantQuote.com. (Открытие, Максимум, Минимум, Закрытие, Объем). Я пытаюсь провести несколько самодельных тестов торговых стратегий на фондовом рынке. Прямой код Python для обработки транзакций слишком медленный, и я хотел попробовать использовать numba, чтобы ускорить процесс. Проблема в том, что numba, похоже, не работает с функциями pandas.

Поисковые запросы в Google обнаруживают удивительную нехватку информации об использовании numba с пандами. Что заставляет меня задуматься, не ошибаюсь ли я, размышляя над этим.

Моя установка: Numba 0.13.0-1, Pandas 0.13.1-1. Windows 7, MS VS2013 с PTVS, Python 2.7, Enthought Canopy

Моя существующая внутренняя петля Python + Pandas имеет следующую общую структуру

  • Вычислить «индикаторные» столбцы (с помощью pd.ewma, pd.rolling_max, pd.rolling_min и т. Д.)
  • Вычислите столбцы «событий» для заранее определенных событий, таких как пересечения скользящих средних, новые максимумы и т. Д.

Затем я использую DataFrame.iterrows для обработки DataFrame.

Я пробовал разные оптимизации, но все еще не так быстро, как хотелось бы. И оптимизации вызывают ошибки.

Я хочу использовать numba для обработки строк. Есть ли какие-нибудь предпочтительные методы решения этой проблемы?

Поскольку мой DataFrame на самом деле представляет собой прямоугольник с плавающей запятой, я рассматривал возможность использования чего-то вроде DataFrame.values ​​для получения доступа к данным, а затем написать серию функций, которые используют numba для доступа к строкам. Но при этом удаляются все временные метки, и я не думаю, что это обратимая операция. Я не уверен, что матрица значений, которую я получаю из DataFrame.values, гарантированно не будет копией данных.

Любая помощь приветствуется.


person JasonEdinburgh    schedule 13.05.2014    source источник
comment
вы должны опубликовать свой код как отдельный вопрос и посмотреть, могут ли люди здесь помочь вам в векторизации. IMHO не так уж и много причин для использования numba, поскольку pandas может намного больше с векторизацией (без циклов). pandas использует cython под капотом, поэтому большинство операций оптимизировано. получите правильный код, а затем оптимизируйте. Чтобы ответить на ваш вопрос, вы можете использовать df.values для получения базового массива numpy и обработки, если хотите, но тогда вы будете ответственны за перевод обратно в DataFrame (если хотите).   -  person Jeff    schedule 13.05.2014
comment
Полностью векторизованная обработка данных невозможна. И для анализа своих результатов я создаю очень большие файлы PNG, которые выглядят так: dropbox.com /s/p66mvp54dymi7hv/TABLE_AAPL.TXT.png. Я быстро замышляю это, мучая себя с Чако. Как видите, для хранения промежуточных результатов создано МНОГО столбцов. Обработка одной сделки теперь представляет собой функцию длиной 80 строк. Моя типичная внутренняя петля для стратегии сейчас составляет около 350 строк неповторяющихся python + pandas. В этой ситуации сложно избежать ошибок. Его раздуты оптимизацией. Я загружу копию   -  person JasonEdinburgh    schedule 13.05.2014
comment
@Jeff pastebin.com/AaifFYnk   -  person JasonEdinburgh    schedule 13.05.2014
comment
хорошо, все выглядит векторизуемым (в общем, только рекуррентные отношения НЕ векторизуемы напрямую, хотя иногда они возможны, например, через shift / diff), но я понимаю вашу загадку. Вы не можете смешивать numba с пандами; попробуйте использовать df.values.   -  person Jeff    schedule 13.05.2014
comment
@Jeff, к сожалению, его нельзя векторизовать. По крайней мере, не в том смысле, который я понимаю под этим словом. Как только вы устанавливаете стоп-лоссы с фиксированной ценой, которые устанавливаются во время выполнения, векторизация падает. Вы не можете заранее знать, какая цена будет у стоп-лосса или что она у вас может быть. Кроме того, существует текущее состояние (учет), которое необходимо поддерживать по мере выполнения алгоритма. Я забыл термин «цепь Маркова»? Я не математик. чтение вики о повторяющихся отношениях звучит как то, что я пытаюсь описать.   -  person JasonEdinburgh    schedule 13.05.2014
comment
хорошо ... тогда numba может быть для вас хорошим вариантом. (или просто написать на cython), см. здесь: pandas.pydata.org/ pandas-docs / stable / enhancingperf.html.   -  person Jeff    schedule 13.05.2014


Ответы (1)


Numba - это JIT-компилятор с поддержкой NumPy. Вы можете передавать массивы NumPy в качестве параметров вашим функциям, скомпилированным с помощью Numba, но не сериям Pandas.

Ваш единственный вариант, все еще по состоянию на 27.06.2017, - использовать значения серии Pandas, которые на самом деле являются массивами NumPy.

Кроме того, вы спрашиваете, являются ли значения «гарантированно не копией данных». Это не копия, вы можете убедиться, что:

import pandas


df = pandas.DataFrame([0, 1, 2, 3])
df.values[2] = 8
print(df)  # Should show you the value `8`

На мой взгляд, Numba - отличный (если не лучший) подход к обработке рыночных данных, и вы хотите придерживаться только Python. Если вы хотите добиться значительного прироста производительности, обязательно используйте @numba.jit(nopython=True) (обратите внимание, что это не позволит вам использовать словари и другие типы Python внутри JIT-скомпилированных функций, но заставит код работать намного быстрее).

Обратите внимание, что некоторые из этих индикаторов, с которыми вы работаете, могут уже иметь эффективную реализацию в Pandas, поэтому подумайте о предварительном вычислении их с помощью Pandas, а затем передайте значения (массив NumPy) вашей функции тестирования на истории Numba.

person Peque    schedule 27.06.2017
comment
Последние сведения о совместимости панд с numba можно найти здесь: pandas. pydata.org/pandas-docs/stable/ - person feetwet; 10.03.2018