pandas.resample() 重构后无法找到复制原始代码的有效方法

Can't find efficient way to replicate original code after refactoring of pandas .resample()

我正在将 pandas 数据帧(或 pandas 面板)的字典传递到下面的函数中,以便将每日数据转换为每月数据。每个 DataFrame 代表日期时间 v 股票代码 space 中的一个字段(例如开盘价、最高价、最低价或收盘价)。该功能工作正常,但我收到弃用警告。不过,我找不到使用新重构的 resample() 的有效实现。我能找到的大多数示例都使用 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 文档似乎并不总是提供给定字段或用法下的所有选项。我看到其他人也有类似的问题。

如有任何帮助,我们将不胜感激

谢谢

您可以使用 Resampler.aggregate 并将列名称的字典作为键传递,并将其各自的预期操作作为值。

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()

deprecation warnings you get is due to the fact that API breaking change to the .resample method to make it more .groupby like.[source: Resample API]