Расчет среднего числа каждого месяца в Python - PullRequest
0 голосов
/ 25 мая 2018

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

          ds       y
1256 2000-01-03  1.8050
1257 2000-01-04  1.8405
1258 2000-01-05  1.8560
1259 2000-01-06  1.8400
1260 2000-01-07  1.8310
1261 2000-01-10  1.8190
1262 2000-01-11  1.8225
1263 2000-01-12  1.8350
...         ...     ...
5844 2018-04-09  3.3950
5845 2018-04-10  3.4146
5846 2018-04-11  3.3955
5847 2018-04-12  3.3902
5848 2018-04-13  3.4088
5849 2018-04-16  3.4282
5850 2018-04-17  3.4022
5851 2018-04-18  3.3844
5852 2018-04-19  3.4028
5853 2018-04-20  3.4121
5854 2018-04-23  3.4463
5855 2018-04-24  3.4685
5856 2018-04-25  3.5090
5857 2018-04-26  3.4992

Я пытался использовать это:

results.groupby(results['ds'].dt.strftime('%B'))['y'].sum().sort_values()

Но результатбыло агрегированным значением всех лет, а не каждого года:

ds
November      873.4324
February      889.8996
September     898.4053
July          900.0330
June          918.0984
January       937.3191
October       947.2213
December      949.5291
May           949.8178
August        959.7570
April         969.8364
March        1026.8202
Name: y, dtype: float64

Кажется, может работать следующая функция, но я не смог ее правильно использовать:

DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start', kind=None, loffset=None, limit=None, base=0, on=None, level=None

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

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

print(df)

              ds    y
1256    2000-01-03  1.8050
1257    2000-01-04  1.8405
1258    2000-01-05  1.8560
1259    2000-01-06  1.8400
1260    2000-01-07  1.8310
1261    2000-01-10  1.8190
1262    2000-01-11  1.8225
1263    2000-01-12  1.8350
5844    2018-04-09  3.3950
5845    2018-04-10  3.4146
5846    2018-04-11  3.3955
5847    2018-04-12  3.3902
5848    2018-04-13  3.4088
5849    2018-04-16  3.4282
5850    2018-04-17  3.4022
5851    2018-04-18  3.3844
5852    2018-04-19  3.4028
5853    2018-04-20  3.4121
5854    2018-04-23  3.4463
5855    2018-04-24  3.4685
5856    2018-04-25  3.5090
5857    2018-04-26  3.4992

df['ds'] = pd.to_datetime(df['ds'])
df.groupby([df['ds'].dt.strftime('%Y'),df['ds'].dt.strftime('%B')]).mean()

Вывод:

                   y
ds  ds  
2000    January 1.831125
2018    April   3.425486
0 голосов
/ 25 мая 2018

Вы можете передать умноженные вещи в groupby в виде списка.В этом случае вы хотите группировать по году и месяцу, поэтому вы должны сделать что-то вроде:

import pandas as pd
results['ds'] = pd.to_datetime(results.ds)

gp = results.groupby([results.ds.dt.year, results['ds'].dt.strftime('%B')]).y.mean()
gp.index.names=['year', 'month']

#year  month  
#2000  January    1.831125
#2018  April      3.425486
#Name: y, dtype: float64
0 голосов
/ 25 мая 2018

IIUC, вы можете использовать pd.Grouper.Я позволил себе добавить несколько строк в ваш фрейм данных (с разными месяцами), чтобы показать:

>>> df
              ds       y
1256  2000-01-03  1.8050
1257  2000-01-04  1.8405
1258  2000-01-05  1.8560
1259  2000-01-06  1.8400
1260  2000-01-07  1.8310
1261  2000-01-10  1.8190
1262  2000-01-11  1.8225
1263  2000-01-12  1.8350
1263  2000-02-12  1.8350
1263  2000-02-15  2.9450
5844  2018-04-09  3.3950
5845  2018-04-10  3.4146
5846  2018-04-11  3.3955
5847  2018-04-12  3.3902
5848  2018-04-13  3.4088
5849  2018-04-16  3.4282
5850  2018-04-17  3.4022
5851  2018-04-18  3.3844
5852  2018-04-19  3.4028
5853  2018-04-20  3.4121
5854  2018-04-23  3.4463
5855  2018-04-24  3.4685
5856  2018-04-25  3.5090
5857  2018-04-26  3.4992

# first cast ds to datetime
df['ds'] = pd.to_datetime(df['ds'])
# then group by month, and get the mean:
df.groupby(pd.Grouper(key='ds', freq='M')).mean().dropna()

                       y
    ds                  
    2000-01-31  1.831125
    2000-02-29  2.390000
    2018-04-30  3.425486

В полученном ряду показано среднее значение y для каждого месяца с указанием даты окончательногодень этого месяца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...