Это что-то вроде широкого 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
для каждой ячейки ?
Любые общие комментарии о том, что здесь происходит, или о том, следует ли поощрять или препятствовать этому шаблону, также были бы признательны. Спасибо!