2016-08-01 2 views
3

Я буду шокирован, если для этой функции не существует какой-либо стандартной библиотечной функции, особенно в numpy или scipy, но никакое количество Googling не дает достойного ответа.Python - Интерполяция удержания нулевого ордера (ближайший сосед)

Я получаю данные от обмена Poloniex - криптовалюта. Подумайте о том, как получить цены на акции - купить и продать заказы - подтолкнули к вашему компьютеру. Так что у меня есть временные цены на любой конкретный рынок. Один рынок может получать обновление 10 раз в день, а другой обновляется 10 раз в минуту - все зависит от того, сколько людей покупает и продает на рынке.

Так что мои данные TimeSeries будет в конечном итоге что-то вроде:

[1 0.0003234, 
1.01 0.0003233, 
10.0004 0.00033, 
124.23 0.0003334, 
...] 

Если первый столбец является значение времени (я использую Unix временные метки микросекунды, но не думаю, что было необходимо в примере. Вторая колонка будет одной из цен - либо цена покупки, либо продажа.

Я хочу преобразовать ее в матрицу, где данные «отбираются» в обычном временном интервале. Таким образом, интерполяция (нуль- порядок удержания):

[1 0.0003234, 
2 0.0003233, 
3 0.0003233, 
... 
10 0.0003233, 
11 0.00033, 
12 0.00033, 
13 0.00033, 
... 
120 0.00033, 
125 0.0003334, 
...] 

Я хочу сделать это с любого разумного шага времени. Прямо сейчас я использую np.linspace(start_time, end_time, time_step), чтобы создать новый вектор времени.

Написание собственного, по общему признанию, грубого интерполятора удержания нулевого порядка не будет таким сложным. Я прокручу исходный вектор времени и использую np.nonzero, чтобы найти все индексы в новом временном векторе, которые соответствуют между одной меткой времени (t0) и следующей (t1), а затем заполняют эти индексы значением из времени t0.

На данный момент сырой метод будет работать. Матрица цен не такая уж большая. Но я должен думать, что существует более быстрый метод с использованием одной из встроенных библиотек. Я просто не могу его найти.

Кроме того, для примера выше я использую только матрицу Nx2 (столбец 1: раз, столбец 2: цена), но в конечном итоге на рынке есть 6 или 8 различных параметров, которые могут быть обновлены. Функция метода/библиотеки, которая могла бы обрабатывать несколько цен и таковых в разных столбцах, была бы большой.

Python 3.5 через Anaconda на Windows 7 (надеюсь, не имеет значения).

ТИА

ответ

4

Для вашей проблемы вы можете использовать scipy.interpolate.interp1d. Кажется, он способен делать все, что вы хотите. Он может выполнить интерполяцию удержания нулевого порядка, если вы укажете kind="zero". Он также может одновременно интерполировать несколько столбцов матрицы. Вам просто нужно указать соответствующий axis. f = interp1d(xData, yDataColumns, kind='zero', axis=0) затем вернет функцию, которую вы можете оценить в любой точке интерполяционного диапазона. Затем вы можете получить нормализованные данные, вызвав f(np.linspace(start_time, end_time, time_step).

+0

Поскольку я хранил данные в виде матрицы numpy, мне нужно немного подправить вам код. В частности - 'f = interpolate.interp1d (np.asarray (a [:, 0]) [:, 0], a [:, 1], kind = 'zero', axis = 0)' где a будет образцом данные выше. Единственная проблема, с которой я столкнулся, заключалась в том, что linspace выставляет вектор строки, поэтому мне нужно было предоставить его f как «new_y = f (new_x.T)», где new_x - это выход linspace. –

+0

Также спасибо за пример на interp1d. Я много видел в своем Googling, но я никогда не видел никаких ссылок или примеров на параметр 'kind'. –

+0

@ gabe Рад, что я мог бы помочь! – jotasi

Смежные вопросы