【问题标题】:How to deal with SettingWithCopyWarning in this case在这种情况下如何处理 SettingWithCopyWarning
【发布时间】:2014-05-17 21:21:55
【问题描述】:

我已经阅读了How to deal with this Pandas warning? 中的答案,但我不知道是否应该忽略 SettingWithCopyWarning 警告,或者我做错了什么。

我有这个函数可以将一些数据重新采样到特定的时间范围(例如 1 小时),然后相应地填充 NaN 值。

def resample_data(raw_data, time_frame):
    # resamples the ticker data in ohlc
    ohlc_dict = {
        'open': 'first',
        'high': 'max',
        'low': 'min',
        'close': 'last',
        'price': 'mean'
    }

    volume_dict = {'volume': 'sum', 'volume_quote': 'sum'}

    resampled_data = raw_data.resample(time_frame, how={'price': ohlc_dict, 'amount': volume_dict})
    resampled_data['amount'] = resampled_data['amount']['volume'].fillna(0.0)
    resampled_data['amount']['volume_quote'] = resampled_data['amount']['volume']
    resampled_data['price']['close'] = resampled_data['price']['close'].fillna(method='pad')
    resampled_data['price']['open'] = resampled_data['price']['open'].fillna(resampled_data['price']['close'])
    resampled_data['price']['high'] = resampled_data['price']['high'].fillna(resampled_data['price']['close'])
    resampled_data['price']['low'] = resampled_data['price']['low'].fillna(resampled_data['price']['close'])
    resampled_data['price']['price'] = resampled_data['price']['price'].fillna(resampled_data['price']['close'])

    # ugly hack to remove multi index, must be better way
    output_data = resampled_data['price']
    output_data['volume'] = resampled_data['amount']['volume']
    output_data['volume_quote'] = resampled_data['amount']['volume_quote']

    return output_data

这是正确的做法吗?我应该忽略警告吗?

编辑:如果我尝试按照警告中的建议使用 .loc:

resampled_data = raw_data.resample(time_frame, how={'price': ohlc_dict, 'amount': volume_dict})
resampled_data.loc['amount'] = resampled_data['amount']['volume'].fillna(0.0)
resampled_data.loc['amount']['volume_quote'] = resampled_data['amount']['volume']
resampled_data.loc['price']['close'] = resampled_data['price']['close'].fillna(method='pad')
resampled_data.loc['price']['open'] = resampled_data['price']['open'].fillna(resampled_data['price']['close'])
resampled_data.loc['price']['high'] = resampled_data['price']['high'].fillna(resampled_data['price']['close'])
resampled_data.loc['price']['low'] = resampled_data['price']['low'].fillna(resampled_data['price']['close'])
resampled_data.loc['price']['price'] = resampled_data['price']['price'].fillna(resampled_data['price']['close'])

我在引用resampled_data.loc['price']['close'] = resampled_data['price']['close'].fillna(method='pad') 行时收到以下错误

KeyError: '标签 [price] 不在 [index] 中'

【问题讨论】:

  • 您正在使用多索引,因此您需要使用元组(因为文档非常清楚)。使用resampled_data[('price','close')] = value。发布一个实际上可以直接复制粘贴的示例会更有用。
  • 但是你对从贸易数据到 ohlcv 有什么建议吗?我想知道是否应该将其添加到 cython。
  • @Jeff 知道了,现在可以正常工作了。我在强调复制警告,但毕竟与它没有任何关系。
  • @MichaelWS 但在什么意义上?当然,如果有一个现成的函数可以做到这一点,那就太好了。
  • 在pandas中,有how='ohlc',我猜应该是用户自己决定的。

标签: python pandas resampling


【解决方案1】:

正如 Jeff 指出的,由于这是一个 MulitIndex 列,您应该使用一个元组来访问它:

resampled_data['price']['close']

resampled_data[('price', 'close')]
resampled_data.loc[:, ('price', 'close')]  # equivalent

这也消除了它与列和行的歧义:

resampled_data.loc['close', 'price']

(这是 pandas 在给出 KeyError 时试图做的事情。)

如果您在代码中使用连续的 [],通常会看到 SettingWithCopy 警告,最好将它们组合成一个 [],例如使用位置:

resampled_data.loc['price']['close'] = ... # this *may* set to a copy

如果你确实设置了一个副本(有时上面可能实际上不是一个副本,但 pandas 在这里不做任何保证),该副本将正确更新,但随后会立即被垃圾收集。

除此之外:正如 cmets resample 提供 how='ohlc' 中所述,因此您最好这样做,填充、填充,然后加入重新采样的体积。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多