2016-03-24 2 views
0

Этот вопрос является продолжением pandas re-indexing with missing datesпанды, ломтик многоиндексных ДФ с несколькими условиями

Я хочу, чтобы вычислить сумму значений для самых последних 3-х месяцев (2015-12, 2015-11, 2015- 10). Если в запасе недостаточно данных, то есть нет, 1 или 2 из 3 месяцев, тогда я хочу, чтобы значение этой суммы было NaN.

Я могу нарезать и выполнять группу по сумме, но это не дает мне то, что я хочу, поскольку она может исключить акции, у которых не было данных за этот трехмесячный период, а затем не учитывает запасы, которые имеют 1 или 2 месяца.

Я предполагаю, что мне нужно заявление с несколькими локациями, но я возился и не смог получить результаты, которые я хочу.

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

Возможно, разместите кусок блока данных, чтобы мы могли понять, как он структурирован. – pbreach

ответ

0

Update :

Использование следующих структур данных:

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) 

я сделал следующее:

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 

В этом примере MSFT не имеют данных для 2015-12 (это было только 2 из 3-х месяцев), поэтому его значение было установлено значение NaN согласно моему требованию ,

0

попробовать это:

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 

Примечание: Я намеренно добавил одну строку к вашему DF, чтобы иметь по крайней мере, один месяц с более чем одной строки

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

Благодарим за помощь @MaxU. Как реализовать условие, в котором, если у запаса есть 1 или 2 месяца, нет, что их сумма должна быть установлена ​​в NaN. – codingknob