2016-03-24 9 views
0

Diese Frage ist eine Fortsetzung der pandas re-indexing with missing datesPandas, in Scheiben schneiden Multi-Index df mit mehreren Bedingungen

Ich möchte die Summe der Werte für die letzten 3 Monate berechnen (2015-12, 2015-11, 2015- 10). Wenn eine Aktie nicht genügend Daten hat, d. H. Keine, 1 oder 2 der 3 Monate, dann möchte ich, dass der Wert dieser Summe NaN ist.

Ich kann Slice und führen Sie eine Gruppe durch und summieren, aber das gibt mir nicht, was ich will, da es Aktien ausgeschlossen haben könnte, die keine Daten in diesem Zeitraum von drei Monaten hatte und dann keine Bestände berücksichtigt haben 1 oder 2 Monate.

Ich stelle mir vor, ich brauche eine Multi-Loc-Anweisung, aber ich habe herumgebastelt und konnte nicht die Ergebnisse erzielen, die ich will.

df2.loc[idx[:,datetime.date(2015,10,1):datetime.date(2015,12,1)],:].groupby(level=0).sum() 
+1

Vielleicht post ein Stück des Datenrahmens, so dass wir eine Vorstellung davon bekommen können, wie es strukturiert ist. – pbreach

Antwort

0

-Update :

Verwenden Sie den folgenden Datenrahmen:

df = pd.DataFrame({ 
'value' : [4,2,5,6,7,8,6,5,4,1,2,4], 
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 12, 1)), 
'stock': ['amzn']*12 
},columns=[ 
'value', 'date', 'stock']) 

df2 = pd.DataFrame({ 
'value' : [1]*11, 
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 11, 1)), 
'stock': ['msft']*11 
},columns=[ 
'value', 'date', 'stock']) 

df = df.append(df2) 

df.set_index(['stock', 'date'], inplace=True) 

Ich habe die folgenden:

In [1]: idx = pd.IndexSlice 
​In [2]: criterion = df.loc[idx[:,'2015-10-01':'2015-12-01'],:].\ 
groupby(level=0).agg(['count']) > 2 
In [3]: criterion = criterion['value']['count'] 
In [4]: df2 = df.loc[idx[:,'2015-10-01':'2015-12-01'],:].groupby(level=0).sum() 
​In [5]: df3 = pd.DataFrame(columns=['value'], index=criterion[criterion==False].index) 
In [6]: df2[criterion].append(df3, ignore_index=False) 

Out[6]: 
value 
stock 
amzn 7 
msft NaN 

In diesem Beispiel MSFT keine Daten für 2015-12 hatte (es nur 2 von den 3 Monaten hatte), so wurde ihr Wert auf NaN gesetzt, wie pro meine Anforderung .

0

versuchen, diesen:

In [142]: df 
Out[142]: 
    value  date stock 
0  4 2015-01-01 amzn 
1  2 2015-02-01 amzn 
2  5 2015-03-01 amzn 
3  6 2015-04-01 amzn 
4  7 2015-05-01 amzn 
5  8 2015-06-01 amzn 
6  6 2015-07-01 amzn 
7  5 2015-08-01 amzn 
8  4 2015-09-01 amzn 
9  1 2015-10-01 amzn 
10  2 2015-11-01 amzn 
11  4 2015-12-01 amzn 
12  7 2015-12-02 amzn 

In [143]: df[(df['date'] >= pd.to_datetime('2015-10-01'))].groupby(df['date'].dt.month).sum() 
Out[143]: 
     value 
date 
10  1 
11  2 
12  11 

Hinweis: Ich habe absichtlich hinzugefügt eine Zeile zu Ihrer DF, um mit mehr als einer Zeile mindestens einen Monat zu haben

In [141]: df.loc[12] = [7, pd.to_datetime('2015-12-02'), 'amzn'] 
+0

Vielen Dank für Ihre Hilfe @MaxU. Wie setze ich die Bedingung um, dass, wenn eine Aktie 1 oder 2 Monate lang fehlt, ihre Summe auf NaN gesetzt wird? – codingknob