[英]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.