未来警告:frame.append方法已弃用,请使用pandas.concat替代。

4

这是我的代码:

def gettrigger(self):
    dfx = pd.DataFrame()
    for i in range(self.lags + 1):
        mask = (self.df['%K'].shift(i) < 20 ) & (self.df['%D'].shift(i) < 20)
        dfx = dfx.append(mask, ignore_index=True)
    return dfx.sum(axis=0)

执行完这个操作后,我收到了以下警告提示:
The frame.append method is deprecated and will be removed from pandas
in a future version. Use pandas.concat instead.
  dfx = dfx.append(mask, ignore_index=True)

有人能帮我吗?

4个回答

3

所以你有一个循环:

dfx = pd.DataFrame()
for i in range(self.lags + 1):
    mask = (self.df["%K"].shift(i) < 20 ) & (self.df["%D"].shift(i) < 20)
    dfx = dfx.append(mask, ignore_index=True)

通过追加调用逐渐构建数据框是低效的!它必须一次又一次地构建数据框,这是一个昂贵的过程。而且.append即将被弃用。

你应该在循环中构建一个数据框列表,并在最后将它们连接起来:

frames = []                    # <- switch to building a list
for i in range(self.lags + 1):
   mask = (self.df["%K"].shift(i) < 20 ) & (self.df["%D"].shift(i) < 20)
   frames.append(mask)        # <- save the new frames in that list

dfx = pd.concat(frames)       # <- at the end, concatanate them

注意,连接逻辑是在循环之后进行的;直接在循环内部用 .append 替换成 pd.concat 也是低效的,因为会再次重建问题。
您可以使用列表推导式或生成器表达式来达到相同的效果,具体取决于您的循环体有多复杂。
例如,上面的代码可以写成:
dfx = pd.concat((self.df["%K"].shift(i) < 20 ) & (self.df["%D"].shift(i) < 20)
                for i in range(self.lags + 1))

0

您正在使用append()方法将两个数据框添加在一起。警告提示该方法已被弃用。您仍然可以使用它并忽略错误,或者改用新的concat()方法。

只需将单词append替换为concat即可。


那不完全是这样的:\ - Mustafa Aydın
concat()pandas库中的一个函数,而不是DataFrame实例上的函数,就像append()一样。 - undefined

0

pandas简单地提示您使用pd.concat()函数而不是df.append()。您可以在此处查看警告信息。这是pd.concat文档


0

这个警告是告诉你 pandas 已经弃用了 .append 方法(请参见doc)。

在编程中,“弃用”是指将旧代码标记为不再有用于代码库的过程,通常是因为它已被新代码取代。弃用的代码不会立即从代码库中删除,因为这样做可能会导致回归错误(source)。

这个警告很有帮助,因为它给出了一个替代函数 concat 的建议(请参见doc)。

您可以按照以下方式修改您的代码:


def __init__(self,df, lags):
    self.df = df
    self.lags = lags

def gettrigger(self):
    dfx = pd.DataFrame()
    for i in range(self.lags + 1):
        mask = (self.df['%K'].shift(i) < 20 ) & (self.df['%D'].shift(i) < 20)
        dfx = pd.concat(objs=[dfx, mask], ignore_index=True)
    return dfx.sum(axis=0)

def decide(self):
    self.df['trigger'] = np.where(self.gettrigger(), 1, 0)
    self.df['Buy'] = np.where((self.df.trigger) &
(self.df['%K'].between(20,80)) &  (self.df['%D'].between(20,80)) & (self.df.rsi > 50) & (self.df.macd > 0), 1, 0)


在循环中重复调用pd.concat会导致成本增加,请参见此处的最后一条注释。 - Mustafa Aydın

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接