TimeSeries con un groupby en Pandas

Me gustaría ver los datos de TimeSeries para cada cliente durante varios períodos de tiempo en Pandas .

 import pandas as pd import numpy as np import random clients = np.random.randint(1, 11, size=100) dates = pd.date_range('20130101',periods=365) OrderDates = random.sample(dates,100) Values = np.random.randint(10, 250, size=100) df = pd.DataFrame({ 'Client' : clients,'OrderDate' : OrderDates, 'Value' : Values}) df = df.sort(['OrderDate', 'Client'], ascending=['True', 'True']) df.head() 

Lo que estoy tratando de lograr es obtener el recuento y la sum de la columna ‘Valor’, agrupados por ‘Cliente’ para varios períodos de tiempo (Mensual, Trimestral, Anual: es probable que compile 3 marcos de datos diferentes para estos datos, luego los marcos de datos ‘amplia’).

Para Quarterly, esperaría algo como esto:

 Client OrderDate NumberofEntries SumofValues 1 2013-03-31 7 28 1 2013-06-30 2 7 1 2013-09-30 6 20 1 2013-12-31 1 3 2 2013-03-31 1 4 2 2013-06-30 2 8 2 2013-09-30 3 17 2 2013-12-31 4 24 

Podría añadir ese dataframe obteniendo el trimestre para cada entrada (o Mes o Año), luego usar la función groupby , pero parece que es un trabajo extra cuando debería usar TimeSeries .

He leído la documentación y revisado una demostración de TimeSeries realizada por Wes, pero no veo la forma de hacer un groupby para el Cliente, luego realizar el TimeSeries durante los períodos de tiempo que estoy tratando de construir (Alternativamente, podría ejecutar un for loop crear un for loop y construir el dataframe de esa manera, pero de nuevo, parece que eso es más trabajo del que debería haber).

¿Hay alguna manera de combinar un proceso TimeSeries con TimeSeries ?

Una ligera alternativa es set_index antes de hacer el grupo por:

 In [11]: df.set_index('OrderDate', inplace=True) In [12]: g = df.groupby('Client') In [13]: g['Value'].resample('Q', how=[np.sum, len]) Out[13]: sum len Client OrderDate 1 2013-03-31 239 1 2013-06-30 83 1 2013-09-30 249 2 2013-12-31 506 3 2 2013-03-31 581 4 2013-06-30 569 4 2013-09-30 316 4 2013-12-31 465 5 ... 

Nota: no es necesario hacer el ordenamiento antes de hacer esto.

¿Algo como esto? Primero hago un groupby, y luego aplico un resample en cada grupo.

 In [11]: grouped = df.groupby('Client') In [12]: result = grouped.apply(lambda x: x.set_index('OrderDate').resample('Q', how=[np.sum, len])) In [13]: result['Value'] Out[13]: sum len Client OrderDate 1 2013-03-31 227 4 2013-06-30 344 2 2013-09-30 234 1 2 2013-03-31 299 2 2013-06-30 538 4 2013-09-30 236 2 2013-12-31 1124 7 3 2013-03-31 496 4 2013-06-30 NaN 0 2013-09-30 167 2 2013-12-31 218 1 

Actualización: con la sugerencia de @AndyHayden en su respuesta, esto se convierte en un código mucho más limpio:

 df = df.set_index('OrderDate') grouped = df.groupby('Client') grouped['Value'].resample('Q', how=[np.sum, len])