somme maximale de n jours consécutifs utilisant des pandas
J'ai vu des solutions dans différents langages (c'est-à-dire SQL, fortran ou C++) qui font principalement des boucles for.
J'espère que quelqu'un pourra m'aider à résoudre cette tâche en utilisant plutôt des pandas.
Si j'ai un bloc de données qui ressemble à ceci.
date pcp sum_count sumcum
7/13/2013 0.1 3.0 48.7
7/14/2013 48.5
7/15/2013 0.1
7/16/2013
8/1/2013 1.5 1.0 1.5
8/2/2013
8/3/2013
8/4/2013 0.1 2.0 3.6
8/5/2013 3.5
9/22/2013 0.3 3.0 26.3
9/23/2013 14.0
9/24/2013 12.0
9/25/2013
9/26/2013
10/1/2014 0.1 11.0
10/2/2014 96.0 135.5
10/3/2014 2.5
10/4/2014 37.0
10/5/2014 9.5
10/6/2014 26.5
10/7/2014 0.5
10/8/2014 25.5
10/9/2014 2.0
10/10/2014 5.5
10/11/2014 5.5
Et j'espérais pouvoir faire les choses suivantes :
ÉTAPE 1 : créez la colonne sum_count en déterminant le nombre total de non-zéros consécutifs dans la colonne 'pcp'.
ÉTAPE 2 : créez la colonne sumcum et calculez la somme des 'pcp' non consécutifs.
ÉTAPE 3 : créez un tableau croisé dynamique qui ressemblera à ceci :
year max_sum_count
2013 48.7
2014 135.5
MAIS!! le max_sum_count est basé sur la condition lorsque sum_count = 3
J'apprécierais toute aide! Merci!
QUESTION MISE À JOUR :
J'ai déjà souligné que le sum_count ne devrait renvoyer que le maximum de 3 pcps consécutifs. Mais j'ai donné par erreur le mauvais bloc de données, j'ai dû le modifier. Désolé.
La somme de 135,5 est venue de 96,0 + 2,5 + 37,0. C'est le maximum de 3 pcps consécutifs dans le sum_count 11.
Merci
Utilisation:
#filtering + rolling by days
N = 3
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
#test NaNs
m = df['pcp'].isna()
#groups by consecutive non NaNs
df['g'] = m.cumsum()[~m]
#extract years
df['year'] = df.index.year
#filter no NaNs rows
df = df[~m].copy()
#filter rows greater like N
df['sum_count1'] = df.groupby(['g','year'])['g'].transform('size')
df = df[df['sum_count1'].ge(N)].copy()
#get rolling sum per groups per N days
df['sumcum1'] = (df.groupby(['g','year'])
.rolling(f'{N}D')['pcp']
.sum()
.reset_index(level=[0, 1], drop=True))
#get only maximal counts non NaN and consecutive datetimes
#add missing years
r = range(df['year'].min(), df['year'].max() + 1)
df1 = df.groupby('year')['sumcum1'].max().reindex(r).reset_index(name='max_sum_count')
print (df1)
year max_sum_count
0 2013 48.7
1 2014 135.5