Преобразование биржевых данных OHLC в другой таймфрейм с помощью Python и Pandas

Может ли кто-нибудь указать мне правильное направление в отношении преобразования таймфреймов данных OHLC с Pandas ? То, что я пытаюсь сделать, это построить Dataframe с данными для более высоких таймфреймов, учитывая данные с более низкими таймфреймами.

Например, учитывая, что у меня есть следующие -минутные (M1)данные :

                       Open    High     Low   Close  Volume
Date                                                       
1999-01-04 10:22:00  1.1801  1.1819  1.1801  1.1817       4
1999-01-04 10:23:00  1.1817  1.1818  1.1804  1.1814      18
1999-01-04 10:24:00  1.1817  1.1817  1.1802  1.1806      12
1999-01-04 10:25:00  1.1807  1.1815  1.1795  1.1808      26
1999-01-04 10:26:00  1.1803  1.1806  1.1790  1.1806       4
1999-01-04 10:27:00  1.1801  1.1801  1.1779  1.1786      23
1999-01-04 10:28:00  1.1795  1.1801  1.1776  1.1788      28
1999-01-04 10:29:00  1.1793  1.1795  1.1782  1.1789      10
1999-01-04 10:31:00  1.1780  1.1792  1.1776  1.1792      12
1999-01-04 10:32:00  1.1788  1.1792  1.1788  1.1791       4

, в которых есть значения Open, High, Low, Close (OHLC)и объемов за каждую минуту I хотел бы создать набор из 5-минутных показаний (M5), который будет выглядеть следующим образом:

                       Open    High     Low   Close  Volume
Date                                                       
1999-01-04 10:25:00  1.1807  1.1815  1.1776  1.1789      91
1999-01-04 10:30:00  1.1780  1.1792  1.1776  1.1791      16

Итак, рабочий процесс таков::

  • Open — это Open первой строки во временном окне
  • Максимум — это самый высокий максимум во временном окне
  • Минимум — это самый низкий минимум
  • Закрытие — это последнее закрытие
  • Объем — это просто сумма объемов

Есть несколько проблем, хотя:

  • в данных есть пробелы (обратите внимание, что нет строки 10:30:00)
  • 5-минутные интервалы должны начинаться в круглое время, например M5 начинается с 10:25:00, а не 10:22:00
  • , во-первых, неполный набор можно опустить, как в этом примере, или включить (, поэтому у нас может быть 10:20:00 5-минутная запись)

Документация Pandas по выборке вверх-вниз дает пример, но они используют среднее значение в качестве значения строки -выборки вверх, что здесь не сработает. Я пробовал использовать groupbyи agg, но безрезультатно. Для одного получить самый высокий максимум и самый низкий минимум может быть не так сложно, но я понятия не имею, как получить первое открытие и последнее закрытие.

То, что я пробовал, похоже на :

grouped = slice.groupby( dr5minute.asof ).agg( 
    { 'Low': lambda x : x.min()[ 'Low' ], 'High': lambda x : x.max()[ 'High' ] } 
)

, но это приводит к следующей ошибке, которую я не понимаю.:

In [27]: grouped = slice.groupby( dr5minute.asof ).agg( { 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] } )
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
/work/python/fxcruncher/ in ()
----> 1 grouped = slice.groupby( dr5minute.asof ).agg( { 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] } )

/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in agg(self, func, *args, **kwargs)
    242         See docstring for aggregate
    243         """
--> 244         return self.aggregate(func, *args, **kwargs)
    245 
    246     def _iterate_slices(self):

/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, arg, *args, **kwargs)
   1153                     colg = SeriesGroupBy(obj[col], column=col,
   1154                                          grouper=self.grouper)
-> 1155                     result[col] = colg.aggregate(func)
   1156 
   1157             result = DataFrame(result)

/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, func_or_funcs, *args, **kwargs)
    906                 return self._python_agg_general(func_or_funcs, *args, **kwargs)
    907             except Exception:
--> 908                 result = self._aggregate_named(func_or_funcs, *args, **kwargs)
    909 
    910             index = Index(sorted(result), name=self.grouper.names[0])

/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in _aggregate_named(self, func, *args, **kwargs)
    976             grp = self.get_group(name)
    977             grp.name = name
--> 978             output = func(grp, *args, **kwargs)
    979             if isinstance(output, np.ndarray):
    980                 raise Exception('Must produce aggregated value')

/work/python/fxcruncher/ in (x)
----> 1 grouped = slice.groupby( dr5minute.asof ).agg( { 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] } )

IndexError: invalid index to scalar variable.

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

15
задан piRSquared 4 January 2017 в 22:04
поделиться