2012-07-12 18 views
5

Necesito almacenar los valores de tipo de decimal de Python en un objeto pandas TimeSeries/DataFrame. Pandas me da un error cuando uso el "groupby" y "mean" en el TimeSeries/DataFrame. El siguiente código basado en flotadores funciona bien:¿Cómo se usa el método de la media en una serie temporal de pandas con valores de tipo Decimal?

[0]: by = lambda x: lambda y: getattr(y, x) 

[1]: rng = date_range('1/1/2000', periods=40, freq='4h') 

[2]: rnd = np.random.randn(len(rng)) 

[3]: ts = TimeSeries(rnd, index=rng) 

[4]: ts.groupby([by('year'), by('month'), by('day')]).mean() 
2000 1 1 0.512422 
     2 0.447235 
     3 0.290151 
     4 -0.227240 
     5 0.078815 
     6 0.396150 
     7 -0.507316 

pero me da un error si hacer las mismas utilizando valores decimales en lugar de flotadores:

[5]: rnd = [Decimal(x) for x in rnd]  

[6]: ts = TimeSeries(rnd, index=rng, dtype=Decimal) 

[7]: ts.groupby([by('year'), by('month'), by('day')]).mean() #Crash! 

Traceback (most recent call last): 
File "C:\Users\TM\Documents\Python\tm.py", line 100, in <module> 
print ts.groupby([by('year'), by('month'), by('day')]).mean() 
File "C:\Python27\lib\site-packages\pandas\core\groupby.py", line 293, in mean 
return self._cython_agg_general('mean') 
File "C:\Python27\lib\site-packages\pandas\core\groupby.py", line 365, in _cython_agg_general 
raise GroupByError('No numeric types to aggregate') 
pandas.core.groupby.GroupByError: No numeric types to aggregate 

El mensaje de error es "GroupByError ('No hay tipos numéricos agregar')". ¿Hay alguna posibilidad de utilizar las agregaciones estándar como suma, media y cuantileon en TimeSeries o DataFrame que contienen valores decimales?

¿Por qué no funciona y existe la posibilidad de tener una alternativa igualmente rápida si no es posible?

EDIT: Me acabo de dar cuenta que la mayoría de las otras funciones (mínimo, máximo, mediana, etc.) funcionan bien, pero no la función significa que yo necesito desesperadamente :-(

+1

no lo soy. Claro, pero también me encontré con ese problema recientemente. Acabo de refundir los valores Decimal() en flotantes y luego crear el marco de datos con los valores float. – reptilicus

Respuesta

11
import numpy as np 
ts.groupby([by('year'), by('month'), by('day')]).apply(np.mean) 
+0

¡Funciona bien! Gracias, ¡EMS! – THM

+0

@ThomasM también alienta a los usuarios a ayudar usted, debe devolver las respuestas (haciendo clic en la flecha hacia arriba encima del número que queda de la respuesta). Si una respuesta realmente resolvió su problema, debe aceptarlo también. Para aceptar una pregunta, debe hacer clic en la marca de verificación a continuación el número. – kay

+3

Además, realmente no necesitas la lambda aquí, solo alimentar 'np.mean' también funcionaría, pero dejé la lambda para ilustrar cómo resolverías esto cuando las funciones más generales que quieres aplicar no funcionan en sus formas predeterminadas. La función '.apply' es muy poderosa en Pandas. – ely

Cuestiones relacionadas