繁体   English   中英

如何加快此Python函数的速度?

[英]How to speed up this Python function?

我希望可以问这类问题。

我有一个get_lags函数,该函数采用一个数据帧,并且对于每列,将列n_lags中的每n移位n_lags 因此,如果n_lags = [1, 2] ,该函数将每列一次移动1个位置,并一次移动2个位置,以这种方式创建新的滞后列。

def get_lags (df, n_lags):
    data =df.copy()
    data_with_lags = pd.DataFrame()
    for column in data.columns:
        for i in range(n_lags[0], n_lags[-1]+1):
            new_column_name = str(column) + '_Lag' + str(i)
            data_with_lags[new_column_name] = data[column].shift(-i) 
    data_with_lags.fillna(method = 'ffill', limit = max(n_lags), inplace = True)
    return data_with_lags

因此,如果:

df.columns
ColumnA
ColumnB

然后, get_lags(df, [1 , 2]).columns将是:

ColumnA_Lag1
ColumnA_Lag2
ColumnB_Lag1
ColumnB_Lag2

问题:使用具有约100,000行和20,000列的数据帧,这将永远运行。 在16 GB RAM的i7核心Windows机器上,一旦我等待了15分钟才能运行代码,然后再停止它。 无论如何,我可以调整此功能使其更快吗?

这可能不适用于您的情况(我希望我能理解您要正确执行的操作),但是您可以通过首先不进行处理来大幅度提高处理速度。 您可以像对待环形缓冲区那样对待列吗?

不要跟踪之后的列,而要跟踪:

  • 您可以使用多少列(每个条目多少个滞后项)
  • 最后使用的滞后列是什么
  • (可选)您“旋转”了多少次

因此,您无需执行以下操作即可移动数据:

current_column = (current_column + 1) % total_columns

然后写入该列。

您需要shift + concat 这是简洁的版本-

def get_lags(df, n_lags):
    return pd.concat(
       [df] + [df.shift(i).add_suffix('_Lag{}'.format(i)) for i in n_lags],
       axis=1
    )

这是一个更加内存友好的版本,使用for循环-

def get_lags(df, n_lags):
    df_list = [df]
    for i in n_lags:
        v = df.shift(i)
        v.columns = v.columns + '_Lag{}'.format(i)    
        df_list.append(v)

    return pd.concat(df_list, axis=1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM