У меня есть эта функция ниже, которая выполняет итерацию по каждой строке фрейма данных (с использованием 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)