multiple groupby examples example columns agg group-by dataframe pandas

group by - groupby - TimeGrouper, pandas



pandas order by (2)

Uso TimeGrouper de pandas.tseries.resample para sumar el retorno mensual a 6M de la siguiente manera:

6m_return = monthly_return.groupby(TimeGrouper(freq=''6M'')).aggregate(numpy.sum)

donde monthly_return es como:

2008-07-01 0.003626 2008-08-01 0.001373 2008-09-01 0.040192 2008-10-01 0.027794 2008-11-01 0.012590 2008-12-01 0.026394 2009-01-01 0.008564 2009-02-01 0.007714 2009-03-01 -0.019727 2009-04-01 0.008888 2009-05-01 0.039801 2009-06-01 0.010042 2009-07-01 0.020971 2009-08-01 0.011926 2009-09-01 0.024998 2009-10-01 0.005213 2009-11-01 0.016804 2009-12-01 0.020724 2010-01-01 0.006322 2010-02-01 0.008971 2010-03-01 0.003911 2010-04-01 0.013928 2010-05-01 0.004640 2010-06-01 0.000744 2010-07-01 0.004697 2010-08-01 0.002553 2010-09-01 0.002770 2010-10-01 0.002834 2010-11-01 0.002157 2010-12-01 0.001034

El 6m_return es como:

2008-07-31 0.003626 2009-01-31 0.116907 2009-07-31 0.067688 2010-01-31 0.085986 2010-07-31 0.036890 2011-01-31 0.015283

Sin embargo, quiero obtener el 6m_return comenzando 6m desde 7/2008 como el siguiente:

2008-12-31 ... 2009-06-31 ... 2009-12-31 ... 2010-06-31 ... 2010-12-31 ...

Intentó las diferentes opciones de entrada (es decir, loffset) en TimeGrouper pero no funciona. ¡Cualquier sugerencia será realmente apreciada!


Esta es una solución para lo que parece un error, pero pruébalo y mira si funciona para ti.

In [121]: ts = pandas.date_range(''7/1/2008'', periods=30, freq=''MS'') In [122]: df = pandas.DataFrame(pandas.Series(range(len(ts)), index=ts)) In [124]: df[0] += 1 In [125]: df Out[125]: 0 2008-07-01 1 2008-08-01 2 2008-09-01 3 2008-10-01 4 2008-11-01 5 2008-12-01 6 2009-01-01 7 2009-02-01 8 2009-03-01 9 2009-04-01 10 2009-05-01 11 2009-06-01 12 2009-07-01 13 2009-08-01 14 2009-09-01 15 2009-10-01 16 2009-11-01 17 2009-12-01 18 2010-01-01 19 2010-02-01 20 2010-03-01 21 2010-04-01 22 2010-05-01 23 2010-06-01 24 2010-07-01 25 2010-08-01 26 2010-09-01 27 2010-10-01 28 2010-11-01 29 2010-12-01 30

He usado números enteros para ayudar a confirmar que las sumas son correctas. La solución que parece funcionar es agregar un mes al frente del marco de datos para engañar al TimeGrouper y hacer lo que necesita.

In [127]: df2 = pandas.DataFrame([0], index = [df.index.shift(-1, freq=''MS'')[0]]) In [129]: df2.append(df).groupby(pandas.TimeGrouper(freq=''6M'')).aggregate(numpy.sum)[1:] Out[129]: 0 2008-12-31 21 2009-06-30 57 2009-12-31 93 2010-06-30 129 2010-12-31 165

Tenga en cuenta que el final [1:] está ahí para recortar el primer grupo.


El problema puede resolverse agregando closed = ''left''

df.groupby(pd.TimeGrouper(''6M'', closed = ''left'')).aggregate(numpy.sum)