对特征计算的行进行迭代

2024-04-19 05:44:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据框,我想基于一些short_windowlong_windowbins值来计算一些特性。更具体地说,对于每一行,我想计算一些特征。为了做到这一点,我将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])以降低计算成本?我想知道有没有什么办法熊猫。滚动但我不知道如何在这种情况下使用它。你知道吗

任何帮助都将不胜感激! 谢谢


Tags: 数据importdataframedfdatadatetimewindow
1条回答
网友
1楼 · 发布于 2024-04-19 05:44:20

这是第一次尝试加速计算。我检查了前100行,发现binning变量总是相同的。所以我设法用固定的箱子做了一个有效的算法。但是当我检查整个数据的函数时,我发现在1489行中有大约100行,它们有不同的binning变量,所以下面的解决方案在100行中偏离了最初的答案。你知道吗

基准测试:
我的快速功能:28毫秒
我的精确功能:388毫秒
原始功能:12200 ms
所以快速功能的速度提高了500倍,精确功能的速度提高了20倍

快速功能代码:

def feature_extraction2(data, short_window, long_window, bins):
    ls = [f"feature{row + 1}" for row in range(bins)]
    binning = pd.cut([2,19], bins, retbins=True)[1]
    bin_group = np.digitize(data['value'], binning, right=True)
    l_sum = []
    for i in range(1, bins+1):
        sum1 = ((bin_group == i)*data['amount']).rolling(short_window).sum()
        l_sum.append(sum1)

    ar_sum = np.array(l_sum).T
    ar_shifted = np.empty_like(ar_sum)
    ar_shifted[:long_window+1,:] = np.nan
    ar_shifted[long_window+1:,:] = ar_sum[long_window:-1,:]    
    temp = pd.DataFrame(ar_shifted, columns = ls)
    data = pd.concat([data,temp], axis = 1, sort = False)
    return data

精确功能:

data = price.copy()
# Vap feature extraction
ls = [f"feature{row + 1}" for row in range(bins)]
data.shape[0] - long_window - 1)))
norm_volume = []
date = []
for i in range(0, data.shape[0] - long_window - 1):
    row = i
    df = data
    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 = df_short['amount'].groupby(pd.cut(df_short['value'], binning)).sum().values

    x,y = group_months,  df.loc[long_window + row + 1, 'DATE_TIME']
    norm_volume.append(x)
    date.append(y)

temp = pd.DataFrame(date, columns=['DATE_TIME'])
temp[ls] = pd.DataFrame(norm_volume, index=temp.index)
data = data.merge(temp, on='DATE_TIME', how='outer')

相关问题 更多 >