【问题标题】:the ValueError: cannot reindex a non-unique index with a method or limit appears for just cryptocurrencyValueError: cannot reindex a non-unique index with a method or limit仅针对加密货币出现
【发布时间】:2021-09-23 17:57:56
【问题描述】:

当我收到错误时,请告诉我以下内容有什么问题:

ValueError: 无法使用方法或限制重新索引非唯一索引

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import pandas_datareader as web



data= web.get_data_yahoo("BTC-USD",
                        start = "2015-01-01 ",
                        end = "2021-01-01   ")



btc_dailly_return= data['Adj Close'].pct_change()
btc_monthly_returns = data['Adj Close'].resample('M').ffill().pct_change()

【问题讨论】:

    标签: python return-value cryptocurrency


    【解决方案1】:

    当您使用重新采样时,您必须告诉它您希望如何在您选择的时间范围内合并所有条目。在您的示例中,您将一个月内的所有值组合在一起,您可以通过将它们加在一起、取平均值、标准偏差、最大值等来组合它们。所以您必须告诉熊猫您想要什么通过提供额外的方法来做到这一点:

    data['col'].resample('M').sum()
    data['col'].resample('M').max()
    data['col'].resample('M').mean()
    

    在你的情况下,last() 可能是最合理的,所以只需将你的最后一行更改为:

    btc_monthly_returns = data['Adj Close'].resample('M').last().ffill().pct_change()
    

    至于为什么只在 BTC-USD 时出现错误:该特定表有重复的日期条目,导致 ffill() 抛出错误。 last()(或任何其他缩减类型聚合器)不关心重复。

    一般来说,resample('<method>').ffill() 应该用于上采样数据,即将月份列表转换为日期列表。在这种情况下,ffill() 将使用前一个有效时间戳的值填充所有新生成的时间戳。您的示例 downsamples,因此应该调用像 lastsummean 这样的缩减聚合器。

    【讨论】:

    • 谢谢。但是,我想知道为什么这也有效: GOOG_monthly_returns = GOOG['Adj Close'].resample('M').ffill().pct_change()
    • 看多了,首先,总和根本不是你想要的,对此感到抱歉。如果您想每个月更改,它应该是最后一个。至于为什么 GOOG 工作,似乎是因为 btc 数据有一些重复的日期(尝试运行 any(pd.Index.duplicated(data.index))ffill() 显然无法处理,我不完全确定为什么要诚实。我不得不深入了解重复项的位置
    • 仍然不完全确定为什么重复数据会通过此处的错误生成ffill()(我已经在其他情况下尝试过,它工作正常)。不过,更一般地说,应该在上采样时使用ffill(),即添加比以前更多的时间点。 ffill() 用于填补空白。在您的情况下,您正在下采样,使 ffill() 不适合作为第一个聚合函数。我将更新答案以包含更多内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2020-02-29
    • 2022-12-01
    • 2022-12-01
    • 2021-07-02
    相关资源
    最近更新 更多