我有一个pandas数据框,我想基于一些short_window
、long_window
和bins
值来计算一些特性。更具体地说,对于每一行,我想计算一些特征。为了做到这一点,我将df_long = df.loc[row:long_window+row]
向前移动一行,比如在第一次迭代中,row=0
的pandas数据帧将是df_long = df.loc[0:50+0]
,一些特征将基于这个数据帧计算,因为row=1
将是df_long = df.loc[1:50+1]
,一些其他特征将被计算并继续。你知道吗
from numpy.random import seed
from numpy.random import randint
import pandas as pd
from joblib import Parallel, delayed
bins = 12
short_window = 10
long_window = 50
# seed random number generator
seed(1)
price = pd.DataFrame({
'DATE_TIME': pd.date_range('2012-01-01', '2012-02-01', freq='30min'),
'value': randint(2, 20, 1489),
'amount': randint(50, 200, 1489)
})
def vap(row, df, short_window, long_window, bins):
df_long = df.loc[row:long_window+row]
df_short = df_long.tail(short_window)
binning = pd.cut(df_long['value'], bins, retbins=True)[1]
group_months = pd.DataFrame(df_short['amount'].groupby(pd.cut(df_short['value'], binning)).sum())
return group_months['amount'].tolist(), df.loc[long_window + row + 1, 'DATE_TIME']
def feature_extraction(data, short_window, long_window, bins):
# Vap feature extraction
ls = [f"feature{row + 1}" for row in range(bins)]
amount, date = zip(*Parallel(n_jobs=4)(delayed(vap)(i, data, short_window, long_window, bins)
for i in range(0, data.shape[0] - long_window - 1)))
temp = pd.DataFrame(date, columns=['DATE_TIME'])
temp[ls] = pd.DataFrame(amount, index=temp.index)
data = data.merge(temp, on='DATE_TIME', how='outer')
return data
df = feature_extraction(price, short_window, long_window, bins)
为了节省时间,我尝试并行运行它,但是由于数据的规模,它需要很长时间才能完成。你知道吗
有没有办法改变这个迭代过程(df_long = df.loc[row:long_window+row])
以降低计算成本?我想知道有没有什么办法熊猫。滚动但我不知道如何在这种情况下使用它。你知道吗
任何帮助都将不胜感激! 谢谢
这是第一次尝试加速计算。我检查了前100行,发现binning变量总是相同的。所以我设法用固定的箱子做了一个有效的算法。但是当我检查整个数据的函数时,我发现在1489行中有大约100行,它们有不同的binning变量,所以下面的解决方案在100行中偏离了最初的答案。你知道吗
基准测试:
我的快速功能:28毫秒
我的精确功能:388毫秒
原始功能:12200 ms
所以快速功能的速度提高了500倍,精确功能的速度提高了20倍
快速功能代码:
精确功能:
相关问题 更多 >
编程相关推荐