Как ускорить процесс при применении функции в Python - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть функция peak_value, которая берет две области iuputs и данные и возвращает новый столбец данных с потенциальными пиками в качестве вывода. Я на самом деле хочу применить эту функцию пикового значения к списку фреймов данных, например data = [df1, df2, df3 ... dfn2], каждый фрейм данных имеет соответствующее значение area, например 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)

1 Ответ

0 голосов
/ 07 апреля 2020

Если возможно запустить ваше решение параллельно, тогда я думаю 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]

Если это решение не работает для вас, пожалуйста, поделитесь еще подробности о ваших проблемах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...