【问题标题】:How to speed up process when apply a function in Python在 Python 中应用函数时如何加快处理速度
【发布时间】:2020-07-20 03:53:47
【问题描述】:

我有一个函数 peak_value,它接受两个输入区域和数据,并在数据中返回一个新列,并将潜在峰值作为输出。我实际上想在数据帧列表上应用这个峰值函数,例如 data = [df1, df2, df3...dfn2] 每个数据帧都有各自的面积值,例如 area = [a1, a2, a3.....an] .我已经应用了 argrelextrema 函数来加快处理速度,但到目前为止还没有成功。有什么办法让它快点?

def peak_value(data,area):
    lag = np.round(5 + np.log10(area))

    data_tmp = data.loc[data['loc_max']==1]  


    data_sorted = data_tmp.sort_values(by='value',ascending=False) 
    data_sorted['idx'] = data_sorted.index  
    data_sorted = data_sorted.reset_index(drop = True) 

    flag = 0
    i = 0

    updated = len(data_sorted)

    while i < updated and flag == 0:
        lag_pre = np.arange(data_sorted['date'][i]-lag,data_sorted['date'][i])
        lag_post = np.arange(data_sorted['date'][i]+1,data_sorted['date'][i]+lag+1)
        lag_interval = np.concatenate((lag_pre,lag_post))
        ind_del = data_sorted.iloc[np.isin(data_sorted['date'],lag_interval)].index
        data_sorted = data_sorted.drop(data_sorted.index[ind_del])
        data_sorted = data_sorted.reset_index(drop=True)
        updated = len(data_sorted)
        if i < updated:
            flag = 0
        else:
            flag = 1

        i = i+1

    #adds a column that says which are the potential peaks

    data['Potential_peaks'] = np.zeros(len(data))
    data['Potential_peaks'].loc[data_sorted['idx']] = 1               
    return data 


def max_new(data):
    loc_opt_ind = argrelextrema(df, np.greater)
    Potential_peaks = np.zeros(len(data))
    Potential_peaks[loc_opt_ind] = 1
    data['Potential_peaks']= Potential_peaks
    return data

new_max= []
for index, df in enumerate(data):  
    max_values = max_new(df).Potential_peaks
    new_max.append(max_values)

【问题讨论】:

标签: python python-3.x pandas python-2.7 scipy


【解决方案1】:

如果可以并行运行您的解决方案,那么我认为Joblib 是一个可行的解决方案。

我自己试过了,我很喜欢。使其工作所需的修改量非常低。

这是一个关于它如何工作的例子:

from joblib import Parallel, delayed

numbers = list(range(10))

def square(x):
    return x ** 2
result = Parallel(n_jobs=3)(delayed(square)(number) for number in numbers)

print(result) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

如果此解决方案不适合您,请分享有关您的问题的更多详细信息。

【讨论】:

  • 这是要求澄清的评论,不是有效答案。请照此张贴
  • 为什么会这样?我已经根据问题中的信息提供了解决方案。那是 Joblib
  • SO范围内的问题中没有有意义的信息。要求图书馆是题外话。除非您可以展示如何使用 joblib 来解决 OP 的问题,而不仅仅是把名字扔在那里,否则我认为这是一个评论。
猜你喜欢
  • 2021-11-06
  • 2020-04-15
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
相关资源
最近更新 更多