¿Podría alguien señalarme en la dirección correcta con respecto a la conversión de marco de tiempo de datos de OHLC con Pandas? Lo que trato de hacer es construir un Dataframe con datos para plazos más largos, dados los datos con un marco de tiempo más bajo.Conversión de datos de stock de OHLC en un marco de tiempo diferente con python y pandas
Por ejemplo, dado que tengo la (M1) siguientes datos de un minuto:
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
que tiene valores de volumen abierto, alto, bajo, Close (OHLC) y por cada minuto me gustaría construir un conjunto de lecturas de 5 minutos (M5), que se vería así:
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
lo tanto, el flujo de trabajo es que:
- abierto es el Abierto de t por primera fila de la timewindow
- alta es la más alta de alta en el timewindow
- baja es la más baja baja
- Close es el último Cerrar
- volumen es simplemente una suma de volúmenes
Hay son algunos problemas sin embargo:
- los datos han huecos (nota no hay ninguna fila 10:30:00)
- los intervalos de 5 minutos tienen que comenzar en el tiempo de ronda, p. M5 comienza a las 10:25:00 No 10:22:00
- primer set, incompleta puede omitirse como en este ejemplo, o incluido (para que pudiéramos tener 10:20:00 entrada 5 minutos)
El Pandas documentation on up-down sampling da un ejemplo, pero usan el valor medio como el valor de la fila muestreada arriba, que no funcionará aquí. He intentado usar groupby
y agg
, pero fue en vano. Para obtener el más alto, el más bajo y el más bajo, puede que no sea tan difícil, pero no tengo idea de cómo obtener el primer cierre y el último cierre.
Lo que intenté decir algo en la línea de:
grouped = slice.groupby(dr5minute.asof).agg(
{ 'Low': lambda x : x.min()[ 'Low' ], 'High': lambda x : x.max()[ 'High' ] }
)
pero da lugar a error de seguimiento, lo que no entiendo:
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.
Así que cualquier ayuda en hacer eso sería apreciado enormemente. Si el camino que elegí no va a funcionar, sugiera otro enfoque relativamente eficiente (tengo millones de filas). Algunos recursos sobre el uso de Pandas para el procesamiento financiero también serían buenos.
¿Qué versión de pandas estás usando? Estamos trabajando en una serie de series de tiempo renovadas que simplificarán enormemente este proceso, pero es probable que no se lance hasta fines de abril. Sin embargo, también puede haber un error que reparar aquí –
Hola Wes, estoy usando 0.7.2. Supongo que esperar a que se publique una nueva versión es una opción factible ya que no tengo una fecha límite para esta transformación (necesito los datos para la investigación privada). Sin embargo, ¡déjame aprovechar la ocasión para agradecerte por esforzarte en desarrollar pandas! :) – kgr
Y en cuanto al posible error, tenga en cuenta que no especifiqué valores para todas las columnas en el Dataframe (solo 2 de 5), si eso es lo que quería decir. – kgr