我有这个:
columns_dict = {'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum'}
daily_data = hourly_data.resample('1D').agg(columns_dict)
我得到这个警告:
FutureWarning:不建议将dict与重命名一起使用,并且会 在将来的版本中删除。
对于特定于列的分组重命名,请使用命名的聚合
>>> df.groupby(...).agg(name=('column', aggfunc))
但是我不太明白语法。它期望这样吗?
daily_data = hourly_data.resample('1D').agg(name=('open', first)).agg(name=('high', max))
编辑:
在BallpointBen(位于https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html#aggregation)所指向的文档之后,我想到了以下内容:
daily_data = hourly_data.resample('1D').agg(
open=pd.NamedAgg(column='open', aggfunc='first'),
high=pd.NamedAgg(column='high', aggfunc='max'),
low=pd.NamedAgg(column='low', aggfunc='min'),
close=pd.NamedAgg(column='close', aggfunc='last'),
volume=pd.NamedAgg(column='volume', aggfunc='sum'))
但是这将不起作用:
aggregate() missing 1 required positional argument: 'func'
所以,我回到文档中,寻找汇总,并发现了这一点:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.agg.html#pandas.DataFrame.agg
所以我做了以下事情:
daily_data = hourly_data.resample('1D').agg(
{
'open': ['open', 'first'],
'high': ['high', 'max'],
'low': ['low', 'min'],
'close': ['close', 'last'],
'volume': ['volume', 'sum']
})
但随后崩溃:
<class 'tuple'>: (<class 'KeyError'>, KeyError("Column 'open' does not exist!"), <traceback object at 0x110143820>)
所以,我不理解错误消息,因为它们看起来像是为已经非常了解熊猫的人编写的,并且我当然也不了解有关聚合的文档。第一部分是groupby文档,不确定其适用范围以及聚合是否具有相同的语法。但是groupby聚合文档显示的语法与专用于聚合的页面的语法不同...
编辑:
这也不起作用:
daily_data = hourly_data.resample('1D').agg(
('open', 'first'),
('high', 'max'),
('low', 'min'),
('close', 'last'),
('volume', 'sum')
)
也不这样做:
daily_data = hourly_data.resample('1D').agg(
open=('open', 'first'),
high=('high', 'max'),
low=('low', 'min'),
close=('close', 'last'),
volume=('volume', 'sum')
)
我在网络上找到的所有示例都具有旧语法,包括SO上的所有语法。
pandas文档中有reasample示例:
以及那里的聚合样本:
并且它们都没有显示新语法的示例。
SIA建议传递名称元组,这很有意义..但是我在文档中找不到该字段名称的任何地方。 并且,在查看警告文字时:
df.groupby(...)。agg(name =('column',aggfunc))
整个元组都被命名了...仍然不知道这个名字应该代表什么..列名?一些操作名称?再次,没有清晰的文档。
但是然后,查看警告的测试结果
FutureWarning:不建议将dict与重命名一起使用,并且在以后的版本中将会删除。
对于特定于列的分组重命名,请使用命名的聚合
重命名在哪里起作用?我正在重采样,我不想重命名任何东西,所以我也不明白这里的消息。
试图发挥创造力,我什至为此:
daily_data = hourly_data.resample('1D').agg(
[
namedtuple('open', pd.NamedAgg(column='open', aggfunc='first')),
namedtuple('high', pd.NamedAgg(column='high', aggfunc='max')),
namedtuple('low', pd.NamedAgg(column='low', aggfunc='min')),
namedtuple('close', pd.NamedAgg(column='close', aggfunc='last')),
namedtuple('volume', pd.NamedAgg(column='volume', aggfunc='sum'))
])
具有相同的结果。