Может ли кто-нибудь указать мне правильное направление в отношении преобразования таймфрейма данных 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 of theпервая строка во временном окне
- Максимум - самый высокий Максимум в временном окне
- Низкий - самый низкий Минимум
- Закрытие - это последнее Закрытие
- Громкость простосумма томов
Существует несколько проблем:
- в данных есть пробелы (обратите внимание, что в строке 10:30:00 нет)
- 5-минутные интервалы должны начинаться во время раунда, например, M5 начинается в 10:25:00, а не в 10: 22: 00
- ; во-первых, неполный набор может быть опущен, как в этом примере, или включен (поэтому мыможет иметь 10:20:00 5-минутный ввод)
В документации Pandas по выборке вверх-вниз приводится пример, но они используют среднее значение as значение строки с передискретизацией, которая здесь не сработает.Я пытался использовать groupby
и agg
, но безрезультатно.Для того, чтобы получить наивысший максимум и наименьший минимум, может быть не так сложно, но я понятия не имею, как получить первый Open и последний Close.
То, что я пробовал, выглядит примерно так:
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/<ipython-input-27-df50f9522a2f> in <module>()
----> 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/<ipython-input-27-df50f9522a2f> in <lambda>(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 для финансовой обработки также подойдут.