1
votes

Obtenez des moyennes pour les périodes DateTimeIndex, puis redistribuez-les dans la colonne de dataframe d'origine

J'ai un joli code qui fait une liste des moyennes de toutes les entrées sur une période timeindex donnée. Par exemple, sur un dataframe avec dix ans de données, il renverra les valeurs moyennes pour chaque jour de la semaine. Ce que je veux faire est de propager ces valeurs moyennes à l'ensemble du dataframe en aussi peu de lignes que possible.

Je suis raisonnablement fier du code pour faire les moyennes. Par exemple, prenez un dataframe qui contient ces données (j'énumère "jour de la semaine" pour votre commodité car cette valeur est implicite dans l'index datetime et cette colonne n'existe pas dans mes propres données):

result.loc[result.groupby(by=val)] = time_series.groupby(by=val).mean().values

Mon code est le suivant:

result = time_series.groupby (time_series.index.weekday) .mean ()

Cela me fournit un vecteur len (7) de moyennes pour chaque jour de la semaine qui ressemble à ceci:

Datetimeindex   value
2019-01-01      53.8
2019-01-02      32.8
2019-01-03      71.2
2019-01-04      41.8
2019-01-05      48.8
2019-01-06      63.4
2019-01-07      63
2019-01-08      52.56
2019-01-09      30.16
2019-01-10      71.04
2019-01-11      46.96
2019-01-12      39.76
2019-01-13      63.4
2019-01-14      63
2019-01-15      52.56
2019-01-16      30.16
2019-01-17      71.04
2019-01-18      46.96
2019-01-19      39.76
2019-01-20      63.4
2019-01-21      63
2019-01-22      52.56
2019-01-23      30.16
2019-01-24      71.04
2019-01-25      46.96
2019-01-26      39.76
2019-01-27      63.4
2019-01-28      63
2019-01-29      52.56
2019-01-30      30.16
2019-01-31      71.04
2019-02-01      46.96
2019-02-02      39.76
2019-02-03      63.4
2019-02-04      63

Ce que je voudrais simplement faire, c'est inverser la formule et collez les moyennes dans la trame de données source d'origine. En prenant l'exemple ci-dessus, le résultat souhaité serait:

day of week mean
1           63.4
2           63
3           53.8
4           32.8
5           71.2
6           41.8
7           48.8

Il semble qu'il devrait être possible d'inverser simplement la formule originale et de dire: time_series.groupby (time_series.index.weekday) = result

Mais cela ne fonctionne clairement pas. Ou même s'il était possible d'exécuter le processus mean () sur place, tel que:

result = time_series.groupby (time_series.index.weekday) .mean (inplace = True) code>

ou

Datetimeindex   day of week value
2019-01-01      3            60
2019-01-02      4            46
2019-01-03      5            72
2019-01-04      6            16
2019-01-05      7            94
2019-01-06      1            100
2019-01-07      2            41
2019-01-08      3            63
2019-01-09      4            3
2019-01-10      5            52
2019-01-11      6            38
2019-01-12      7            43
2019-01-13      1            22
2019-01-14      2            73
2019-01-15      3            72
2019-01-16      4            30
2019-01-17      5            52
2019-01-18      6            25
2019-01-19      7            28
2019-01-20      1            83
2019-01-21      2            98
2019-01-22      3            9
2019-01-23      4            61
2019-01-24      5            88
2019-01-25      6            54
2019-01-26      7            32
2019-01-27      1            32
2019-01-28      2            41
2019-01-29      3            65
2019-01-30      4            24
2019-01-31      5            92
2019-02-01      6            76
2019-02-02      7            47
2019-02-03      1            80
2019-02-04      2            62

mais aucun ne fonctionne. J'adorerais faire cela en une seule ligne et je me sens si proche, mais je ne peux tout simplement pas le faire fonctionner. Avez-vous des idées?


2 commentaires

il suffit de faire une moyenne transformée time_series.groupby (time_series.index.weekday) ['value']. ​​tran‌ sform ('mean')


Merci @ anky_91 pouvez-vous envoyer votre code comme réponse pour que je puisse le sélectionner?


3 Réponses :


2
votes

IIUC, cela devrait fonctionner

result = time_series.groupby('day of week')['value'].transform('mean')


5 commentaires

Salut, j'ai du mal à l'implémenter car «moyenne» est une série dans une variable différente. Doit-il être remplacé par time_series.groupby (time_series.index.weekday) .mean () ?


Utilisez ceci directement. Cela devrait donner le résultat que vous avez montré. Mon hypothèse ici est que le nom de votre dataframe est 'time_series' et qu'il contient 'day of week' & 'value' comme colonnes


Merci, mais je pense qu'il peut y avoir un malentendu - la variable ci-dessus n'existe pas. Voulez-vous dire que le code doit être le suivant: result = time_series.groupby (time_series.index.weekday) .mean () result = time_series.groupby ('day of week') [ 'value']. ​​transform ('mean') Parce que tel qu'il est écrit, il n'y a pas encore de colonnes nommées jour de la semaine, valeur ou moyenne: si la première ligne de ce code n'est pas exécutée, ces nombres n'existent pas .


Oh! Vous n'avez pas la colonne jour de la semaine. Ensuite, je pense que vous pouvez utiliser ce que @ anky_91 a mis (dans le commentaire de votre question).


Merci pour votre clarté, je demanderai à Anky de poster leur réponse afin que je puisse la sélectionner!



1
votes

appelant df à votre dataframe:

               value
Datetimeindex       
2019-01-01      53.8
2019-01-02      32.8
2019-01-03      71.2
2019-01-04      41.8
2019-01-05      48.8
2019-01-06      63.4
2019-01-07      63.0
2019-01-08      53.8
2019-01-09      32.8
2019-01-10      71.2
2019-01-11      41.8
2019-01-12      48.8
2019-01-13      63.4
2019-01-14      63.0
2019-01-15      53.8
2019-01-16      32.8
2019-01-17      71.2
2019-01-18      41.8
2019-01-19      48.8
2019-01-20      63.4
2019-01-21      63.0
2019-01-22      53.8
2019-01-23      32.8
2019-01-24      71.2
2019-01-25      41.8
2019-01-26      48.8
2019-01-27      63.4
2019-01-28      63.0
2019-01-29      53.8
2019-01-30      32.8
2019-01-31      71.2
2019-02-01      41.8
2019-02-02      48.8
2019-02-03      63.4
2019-02-04      63.0

Utilisation:

print(df2)

Résultat:

df2=df.replace(df.groupby('day_of_week')['value'].mean())['day_of_week'].to_frame().rename(columns={'day_of_week':'value'})

Datetimeindex   day_of_week value
2019-01-01      3            60
2019-01-02      4            46
2019-01-03      5            72
2019-01-04      6            16
2019-01-05      7            94
2019-01-06      1            100
2019-01-07      2            41
2019-01-08      3            63
2019-01-09      4            3
2019-01-10      5            52
2019-01-11      6            38
2019-01-12      7            43
2019-01-13      1            22
2019-01-14      2            73
2019-01-15      3            72
2019-01-16      4            30
2019-01-17      5            52
2019-01-18      6            25
2019-01-19      7            28
2019-01-20      1            83
2019-01-21      2            98
2019-01-22      3            9
2019-01-23      4            61
2019-01-24      5            88
2019-01-25      6            54
2019-01-26      7            32
2019-01-27      1            32
2019-01-28      2            41
2019-01-29      3            65
2019-01-30      4            24
2019-01-31      5            92
2019-02-01      6            76
2019-02-02      7            47
2019-02-03      1            80
2019-02-04      2            62


0 commentaires

1
votes

Utilisez transform dans ce cas avec un groupby:

2019-01-01    53.8
2019-01-02    32.8
2019-01-03    71.2
2019-01-04    41.8
2019-01-05    48.8
2019-01-06    63.4
2019-01-07    63.0
2019-01-08    53.8
2019-01-09    32.8
2019-01-10    71.2
2019-01-11    41.8
2019-01-12    48.8
2019-01-13    63.4
2019-01-14    63.0
......
.....

time_series.groupby(time_series.index.weekday)['value'].transform('mean')


0 commentaires