Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

calcul de moyenne mobile

0 votes

Bonjour j'ai un tableau comme suit:

Date valeur somme
01/01/2019 10:10 1 1+2+3
01/01/2019 11:10 2 2+3
07/01/2019 11:10 3 3+4+5+6
08/01/2019 11:10 4 3+5+6+7
09/01/2019 11:10 5 NA
12/01/2019 11:10 6 NA
15/01/2019 11:10 7 NA

et je souhaiterai calculer les moyennes mobile (futur) sur 7 jours (donc en gros la colonne somme )

Je n'arrete pas de tourner autour des fonctions pandas comme ".rolling('7d').mean()" etc etc mais fait la chose dans le sens inverse : au lieu de prendre la période futur mais la période passé
j'ai bien croisé shift mais ça demande une fenêtre fixe

Bref comment feriez vous pour résoudre ce problème

comme le temps de chacun est précieux je vous mets un morceau de code pour obtenir le jeu de test de l'exemple

import pandas as pd
d = {'Date': ['01/01/2019 10:10','01/01/2019 11:10','07/01/2019 11:10','08/01/2019 11:10','09/01/2019 11:10','12/01/2019 11:10','15/01/2019 11:10'], 'Valeur': [1, 2,3,4,5,6,7]}
df = pd.DataFrame(data=d)
df.sort_values('Date',inplace=True)
df.reset_index(drop=True,inplace=True)
df.set_index('Date',inplace=True)
print(df);`

edit: en attendant la validation de mon message
j'ai écrit ceci ... ça fait le job

local_df= pd.DataFrame()
last_add=0
for index, row in df.iterrows():
    print(index)
    #on supprime les valeur inferieur a la date courante
    local_df.drop(local_df.loc[(pd.to_datetime(local_df.index,dayfirst=True) < pd.to_datetime(index,dayfirst=True))].index, inplace=True)
    #local_df=local_df.append(row)
    print('last add:',last_add)
    while ((last_add+1<=df.index.size) and ( pd.to_datetime(df.index[last_add],dayfirst=True) < pd.to_datetime(index,dayfirst=True )+ timedelta(7) )) :
        local_df=local_df.append(df.loc[df.index[last_add]])
        last_add+=1
    print(local_df)
    df.loc[index,'moy']=local_df.Valeur.mean()
    df.loc[index,'median']=local_df.Valeur.median()

Mais avec un dataset de 20 000 lignes je m'aperçois que ce n'est pas la méthode la plus optimisée :
un test rapide ça mets 5 minutes à mouliner

demandé 20-Dec-2019 par beginner (118 points)

Se connecter ou S'inscrire pour répondre à cette question.

...