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