Pandas Upsample Повторная выборка многоиндексных ежемесячных данных для многоиндексных еженедельных данных? - PullRequest
1 голос
/ 04 мая 2020

У меня есть данные за два года в DataFrame, который выглядит следующим образом:

In[117]: df
Out[117]: 
                               Str%      Val%      Vol%
State Location Date                                    
NSW   Country  2018-01-01  0.043152  0.052147  0.052867
               2018-02-01  0.043233  0.050797  0.050907
               2018-03-01  0.045113  0.052550  0.052213
               2018-04-01  0.045113  0.052237  0.052195
               2018-05-01  0.045198  0.050020  0.049767
                             ...       ...       ...
WA    Metro    2019-09-01  0.028958  0.025970  0.027752
               2019-10-01  0.029070  0.025906  0.028062
               2019-11-01  0.029126  0.024388  0.026421
               2019-12-01  0.029126  0.021167  0.023982
               2020-01-01  0.029412  0.027437  0.029197

[300 rows x 3 columns]

У данных есть три мультииндекса ['State', 'Location', 'Date']. Для каждого состояния и местоположения эти данные доступны на ежемесячном уровне. Тем не менее, я хочу преобразовать его в еженедельный уровень и для каждого штата и местоположения. Что-то вроде следующего:

In[119]: df
Out[119]: 
                               Str%      Val%      Vol%
State Location Date                                    
NSW   Country  2018-01-07  0.043152  0.052147  0.052867
               2018-01-14  0.043152  0.052147  0.052867
               2018-01-21  0.043152  0.052147  0.052867
               2018-01-28  0.043152  0.052147  0.052867
               2018-02-04  0.043233  0.050797  0.050907

До сих пор я пытался использовать функцию resample () из pandas, но она отказывается работать с многоиндексными объектами. Более того, если я удаляю State и Location из индекса, тогда в моем индексе Date есть дублированные записи, что снова нарушает функцию resample () . Я также пытался использовать «Grouper» в функции groupby () следующим образом:

df= df.reset_index()
Weekly = pd.Grouper(key='Date', freq='W-SUN', closed='left', label='right')
df.groupby(['State', 'Location', Weekly]).first()

Это приводит к следующему выводу,

Out[121]: 
                               Str%      Val%      Vol%
State Location Date                                    
NSW   Country  2018-01-07  0.043152  0.052147  0.052867
               2018-02-04  0.043233  0.050797  0.050907
               2018-03-04  0.045113  0.052550  0.052213
               2018-04-08  0.045113  0.052237  0.052195
               2018-05-06  0.045198  0.050020  0.049767

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

Любая помощь в этом?

1 Ответ

1 голос
/ 04 мая 2020

Он видит, что есть ежемесячные данные. Решение меняется на DataFrameGroupBy.resample для объединенной группировки и повторной выборки:

df1 = (df.reset_index(level=[0,1])
         .groupby(['State', 'Location'])
         .resample('W-SUN', closed='left', label='right')
         .first())

print (df1)

                          State Location      Str%      Val%      Vol%
State Location Date                                                   
NSW   Country  2018-01-07   NSW  Country  0.043152  0.052147  0.052867
               2018-01-14   NaN      NaN       NaN       NaN       NaN
               2018-01-21   NaN      NaN       NaN       NaN       NaN
               2018-01-28   NaN      NaN       NaN       NaN       NaN
               2018-02-04   NSW  Country  0.043233  0.050797  0.050907
               2018-02-11   NaN      NaN       NaN       NaN       NaN
               2018-02-18   NaN      NaN       NaN       NaN       NaN
               2018-02-25   NaN      NaN       NaN       NaN       NaN
               2018-03-04   NSW  Country  0.045113  0.052550  0.052213
               2018-03-11   NaN      NaN       NaN       NaN       NaN
               2018-03-18   NaN      NaN       NaN       NaN       NaN
               2018-03-25   NaN      NaN       NaN       NaN       NaN
               2018-04-01   NaN      NaN       NaN       NaN       NaN
               2018-04-08   NSW  Country  0.045113  0.052237  0.052195
               2018-04-15   NaN      NaN       NaN       NaN       NaN
               2018-04-22   NaN      NaN       NaN       NaN       NaN
               2018-04-29   NaN      NaN       NaN       NaN       NaN
               2018-05-06   NSW  Country  0.045198  0.050020  0.049767
WA    Metro    2019-09-08    WA    Metro  0.028958  0.025970  0.027752
               2019-09-15   NaN      NaN       NaN       NaN       NaN
               2019-09-22   NaN      NaN       NaN       NaN       NaN
               2019-09-29   NaN      NaN       NaN       NaN       NaN
               2019-10-06    WA    Metro  0.029070  0.025906  0.028062
               2019-10-13   NaN      NaN       NaN       NaN       NaN
               2019-10-20   NaN      NaN       NaN       NaN       NaN
               2019-10-27   NaN      NaN       NaN       NaN       NaN
               2019-11-03    WA    Metro  0.029126  0.024388  0.026421
               2019-11-10   NaN      NaN       NaN       NaN       NaN
               2019-11-17   NaN      NaN       NaN       NaN       NaN
               2019-11-24   NaN      NaN       NaN       NaN       NaN
               2019-12-01   NaN      NaN       NaN       NaN       NaN
               2019-12-08    WA    Metro  0.029126  0.021167  0.023982
               2019-12-15   NaN      NaN       NaN       NaN       NaN
               2019-12-22   NaN      NaN       NaN       NaN       NaN
               2019-12-29   NaN      NaN       NaN       NaN       NaN
               2020-01-05    WA    Metro  0.029412  0.027437  0.029197
...