Лучший способ распараллелить многостоловую функцию в Python (используя Pandas) - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть эта функция ниже, которая выполняет итерацию по каждой строке фрейма данных (с использованием pandas apply) и определяет, какие значения действительны из матрицы вероятности предсказания (L2), ссылаясь на другой фрейм данных (GST), чтобы получить действительные значениядля данного ряда.Функция просто возвращает строку с максимально допустимой вероятностью, назначенной ранее пустому значению для этой строки (прогнозируемый уровень 2) во фрейме данных, переданном функции (test_x2)

Не очень сложная функция, и онаотлично работает на небольших наборах данных, но когда я масштабируюсь до 3-5 миллионов записей, это начинает занимать слишком много времени.Я попытался использовать модуль многопроцессорной обработки, а также dask / numba, но ничто не смогло улучшить время выполнения (не уверен, что это только из-за того факта, что функция не векторизована).

У меня вопрос в два раза:

1) Есть ли лучший способ написать это?(Я предполагаю, что есть)

2) Если нет, какие стратегии параллельных вычислений могли бы работать с этим типом функции?Я уже пробовал несколько различных вариантов Python, но сейчас я больше склоняюсь к запуску больших наборов данных на совершенно разных машинах.Не стесняйтесь предоставлять любой предлагаемый код для распараллеливания чего-то подобного.Заранее благодарим за предоставленное руководство.

l2 = MNB.predict_proba(test_x)
l2_classes = MNB.classes_
L2 = pd.DataFrame(l2, columns = MNB.classes_)
test_x2["Predicted Level 2"] = ""

def predict_2(row):
    s = row["Predicted Level 1"]
    s = GST.loc[s,:]
    s.reset_index(inplace = True)
    Valid_Level2s = s["GST Level 2"].tolist()
    p2 = L2.ix[row.name, Valid_Level2s]
    max2 = p2.idxmax(axis = 1)
    output = row["Predicted Level 2"] = max2
    return row

test_x2 = test_x2.apply(predict_2, axis = 1)
...