7

パンダは初めてですが、すでに行単位の適用操作を並列化したいと思っています。これまでのところ、 pandas groupby の後に Parallelize が適用されることがわかりました。ただし、それはグループ化されたデータ フレームに対してのみ機能するようです。

私の使用例は異なります。休日のリストがあり、現在の行/日付について、この日の前後から次の休日までの日数を見つけたいと考えています。

これは、apply を介して呼び出す関数です。

def get_nearest_holiday(x, pivot):
    nearestHoliday = min(x, key=lambda x: abs(x- pivot))
    difference = abs(nearesHoliday - pivot)
    return difference / np.timedelta64(1, 'D')

どうすれば高速化できますか?

編集

私は pythons プールで少し実験しましたが、それは良いコードではなく、計算結果も得られませんでした。

4

3 に答える 3

4

並列アプローチの場合、これはParallelize apply after pandas groupby に基づく答えです:

from joblib import Parallel, delayed
import multiprocessing

def get_nearest_dateParallel(df):
    df['daysBeforeHoliday'] = df.myDates.apply(lambda x: get_nearest_date(holidays.day[holidays.day < x], x))
    df['daysAfterHoliday']  =  df.myDates.apply(lambda x: get_nearest_date(holidays.day[holidays.day > x], x))
    return df

def applyParallel(dfGrouped, func):
    retLst = Parallel(n_jobs=multiprocessing.cpu_count())(delayed(func)(group) for name, group in dfGrouped)
    return pd.concat(retLst)

print ('parallel version: ')
# 4 min 30 seconds
%time result = applyParallel(datesFrame.groupby(datesFrame.index), get_nearest_dateParallel)

しかし、O(n * number_of_holidays) を必要としないため、@NinjaPuppy のアプローチを好みます。

于 2016-09-04T11:59:45.117 に答える