В чем разница между бинами при использовании groupby apply vs resample apply? - PullRequest
0 голосов
/ 14 июля 2020

Это что-то вроде широкого c, но я постараюсь сократить его до некоторых конкретных c вопросов.

Я заметил разницу между resample и groupby, которую я любопытно узнать об этом. Вот некоторые почасовые данные временных рядов:

In[]:
import pandas as pd

dr = pd.date_range('01-01-2020 8:00', periods=10, freq='H')
df = pd.DataFrame({'A':range(10),
                   'B':range(10,20),
                   'C':range(20,30)}, index=dr)
df

Out[]:
                     A   B   C
2020-01-01 08:00:00  0  10  20
2020-01-01 09:00:00  1  11  21
2020-01-01 10:00:00  2  12  22
2020-01-01 11:00:00  3  13  23
2020-01-01 12:00:00  4  14  24
2020-01-01 13:00:00  5  15  25
2020-01-01 14:00:00  6  16  26
2020-01-01 15:00:00  7  17  27
2020-01-01 16:00:00  8  18  28
2020-01-01 17:00:00  9  19  29

Я могу уменьшить выборку данных, используя groupby с freq pandas.Grouper или resample (что кажется более типичным):

g = df.groupby(pd.Grouper(freq='2H'))
r = df.resample(rule='2H')

У меня сложилось впечатление, что эти два по сути одно и то же (поправьте меня, если я ошибаюсь, но resample - это ребрендинг groupby)? Но я обнаружил, что при использовании метода apply каждого сгруппированного объекта вы можете индексировать определенные c столбцы в объекте «DataFrameGroupBy» g, но не в объекте «Resampler» r:

def foo(d):
    return(d['A'] - d['B'] + 2*d['C'])

In[]:
g.apply(foo)

Out[]:
2020-01-01 08:00:00  2020-01-01 08:00:00    30
                     2020-01-01 09:00:00    32
2020-01-01 10:00:00  2020-01-01 10:00:00    34
                     2020-01-01 11:00:00    36
2020-01-01 12:00:00  2020-01-01 12:00:00    38
                     2020-01-01 13:00:00    40
2020-01-01 14:00:00  2020-01-01 14:00:00    42
                     2020-01-01 15:00:00    44
2020-01-01 16:00:00  2020-01-01 16:00:00    46
                     2020-01-01 17:00:00    48
dtype: int64

In[]:
r.apply(foo)

Out[]:
#long multi-Exception error stack ending in:
KeyError: 'A'

Похоже, что данные d, которые «видит» apply, в каждом случае различны, как показано:

def bar(d):
    print(d)

In[]:
g.apply(bar)

Out[]:
                     A   B   C
2020-01-01 08:00:00  0  10  20
2020-01-01 09:00:00  1  11  21
... #more DataFrames corresponding to each bin

In[]:
r.apply(bar)

Out[]:
2020-01-01 08:00:00    0
2020-01-01 09:00:00    1
Name: A, dtype: int64
2020-01-01 10:00:00    2
2020-01-01 11:00:00    3
Name: A, dtype: int64
... #more Series, first the bins for column "A", then "B", then "C" 

Однако, если вы просто перебираете объект Resampler, вы получаете ячейки как DataFrames, что похоже на groupby:

In[]:
for i, d in r:
    print(d)

Out[]:
                    A   B   C
2020-01-01 08:00:00  0  10  20
2020-01-01 09:00:00  1  11  21
                     A   B   C
2020-01-01 10:00:00  2  12  22
2020-01-01 11:00:00  3  13  23
                     A   B   C
2020-01-01 12:00:00  4  14  24
2020-01-01 13:00:00  5  15  25
                     A   B   C
2020-01-01 14:00:00  6  16  26
2020-01-01 15:00:00  7  17  27
                     A   B   C
2020-01-01 16:00:00  8  18  28
2020-01-01 17:00:00  9  19  29

Распечатка такая же при итерации по объекту DataFrameGroupBy.

Мои вопросы, основанные на выше?

  • Можно ли получить доступ к определенным столбцам c, используя resample и apply? Я думал, что у меня есть код, в котором я это сделал, но теперь я думаю, что ошибаюсь.
  • Почему resample apply работает с серией для каждого столбца для каждой ячейки, а не DataFrames для каждой ячейки ?

Любые общие комментарии о том, что здесь происходит, или о том, следует ли поощрять или препятствовать этому шаблону, также были бы признательны. Спасибо!

...