Python Can';在重构pandas.resample()之后,我们找不到有效的方法来复制原始代码

Python Can';在重构pandas.resample()之后,我们找不到有效的方法来复制原始代码,python,pandas,resampling,deprecation-warning,Python,Pandas,Resampling,Deprecation Warning,我正在将pandas数据帧字典(或pandas面板)传递到下面的函数中,以便将每日数据转换为每月数据。每个数据帧表示datetime v股票代码空间中的一个字段(例如打开、高、低或关闭)。该函数工作正常,但我收到了弃用警告。但是,我找不到使用新重构的重采样()的有效实现。我能找到的大多数示例都使用agg()函数将不同的方法应用于单个数据帧的不同列。我的面板每个字段都有一个单独的框架,所以这不太合适。我试过使用apply(lambda),它可以工作,但是速度太慢了。我相信有一个有效的实现。我注意到

我正在将pandas数据帧字典(或pandas面板)传递到下面的函数中,以便将每日数据转换为每月数据。每个数据帧表示datetime v股票代码空间中的一个字段(例如打开、高、低或关闭)。该函数工作正常,但我收到了弃用警告。但是,我找不到使用新重构的重采样()的有效实现。我能找到的大多数示例都使用agg()函数将不同的方法应用于单个数据帧的不同列。我的面板每个字段都有一个单独的框架,所以这不太合适。我试过使用apply(lambda),它可以工作,但是速度太慢了。我相信有一个有效的实现。我注意到,基于不推荐的实现,已经回答了几个问题,还有一个与我类似的问题尚未回答

以下是我的原始功能:

# function to convert daily data to monthly and return dictionary or panel
def to_monthly(fields, data_d, create_panel=True):

    how_dict={'Open':'first', 'High':'max', 'Low':'min', 'Close':'last'}

    data_m={}
    for field in fields:
        data_m[field]=data_d[field].resample(rule='M', how=how_dict[field]).ffill()
    if create_panel:
        data_m = pd.Panel(data_m)

    return data_m
这运行正常,但我收到了弃用警告。我试图解决这个问题:

# alternative function to handle refactoring of .resample()
def to_monthly(fields, data_d, create_panel=True):

    how_dict={
        'Open': (lambda x: x[0]),
        'High': (lambda x: x.max()),
        'Low': (lambda x: x.min()),
        'Close': (lambda x: x[-1]),
        'Volume': lambda x: x.sum()
        }

    data_m={}
    for field in fields:
        data_m[field]=data_d[field].resample('M').apply(how_dict[field]).ffill()
    if create_panel:
        data_m = pd.Panel(data_m)

    return data_m
我发现很难找到所有旧“how”选项的替换语法。在此方面提供一些帮助也将不胜感激。Pandas文档似乎并不总是提供给定字段或用法下的所有选项。我见过其他人也有类似的问题

任何帮助都将不胜感激

谢谢

您可以使用和传递列名的dict作为键,并将其各自的预期操作作为值

dict_ohlcv = {'Open':'first', 'High':'max', 'Low':'min', 'Close':'last', 'Volume':'sum'}
data_m[field]=data_d[field].resample('M')
                           .agg(dict_ohlcv[field])
                           .ffill()
这是因为API破坏性地更改了
.resample
方法,使其更像
.groupby
一样。[来源:

您可以使用和传递列名的dict作为键,并将其各自的预期操作作为值

dict_ohlcv = {'Open':'first', 'High':'max', 'Low':'min', 'Close':'last', 'Volume':'sum'}
data_m[field]=data_d[field].resample('M')
                           .agg(dict_ohlcv[field])
                           .ffill()

这是因为API破坏性地更改了
.resample
方法,使其更像
.groupby
方法。[来源:

谢谢。解决我的问题。我真的以为我已经试过了,尽管我可能被文档搞糊涂了,文档只提供了关于单个数据帧中不同列字段的此类示例,而不是跨多个数据帧的不同字段。幸运的是,我太快了,无法判断这是一个解决方案。为了澄清这一点,传递给data_d的输入是一个数据帧字典,每个数据帧代表股票列表v datetime索引的单个字段(例如Close)。因此,如果我传递一个只包含两个数据帧(例如打开和关闭)和每日数据的字典,我希望它返回一个包含两个数据帧和每月数据的字典。在这里应用您的方法会给每个数据帧OHLCV划分,因此将每个数据帧中的列数乘以5。谢谢。解决我的问题。我真的以为我已经试过了,尽管我可能被文档搞糊涂了,文档只提供了关于单个数据帧中不同列字段的此类示例,而不是跨多个数据帧的不同字段。幸运的是,我太快了,无法判断这是一个解决方案。为了澄清这一点,传递给data_d的输入是一个数据帧字典,每个数据帧代表股票列表v datetime索引的单个字段(例如Close)。因此,如果我传递一个只包含两个数据帧(例如打开和关闭)和每日数据的字典,我希望它返回一个包含两个数据帧和每月数据的字典。在这里应用您的方法为每个数据帧提供OHLCV分区,因此将每个数据帧中的列数乘以5。