Как сделать расчет медианы быстрее в Python - PullRequest
1 голос
/ 26 марта 2019

Я бы хотел посчитать срединную строку за строкой в ​​кадре данных, содержащем более 500 000 строк.На данный момент я использую np.median, потому что numpy оптимизирован для работы на одном ядре.Это все еще очень медленно, и я хотел бы найти способ параллельного вычисления

В частности, у меня есть N таблицы размера 13 x 500,000, и для каждой таблицы я хочу добавить столбцы Q1, Q3 имедиана, так что для каждого ряда медианный столбец содержит медиану ряда.Поэтому я должен вычислить N * 500,000 медианные значения.

Я пытался с numexpr, но это не представляется возможным.

РЕДАКТИРОВАТЬ: На самом деле мне также нужноQ1 и Q3, поэтому я не могу использовать модуль статистики, который не позволяет рассчитывать квартили.Вот как я вычисляю медиану для момента

    q = np.transpose(np.percentile(data[row_array], [25,50,75], axis = 1))
    data['Q1_' + family] = q[:,0]
    data['MEDIAN_' + family] = q[:,1]
    data['Q3_' + family] = q[:,2]

РЕДАКТИРОВАТЬ 2 Я решил свою проблему, используя алгоритм медианы медианы, как предложено ниже

Ответы [ 3 ]

1 голос
/ 26 марта 2019

Если (близкое) приближение медианы подходит для ваших целей, вам следует подумать о том, чтобы вычислить медиану медиан , которая является стратегией «разделяй и властвуй», которая может выполняться параллельно. В принципе, MoM имеет сложность O(n) для последовательного выполнения, приближаясь к O(1) для параллельного выполнения в массивно-параллельных системах.

См. эту запись в вики для описания и псевдокода. См. Также этот вопрос о переполнении стека и обсуждение кода, а также эту статью ArXiv для реализации на GPU.

0 голосов
/ 26 марта 2019

Из того, что я понял, вы хотите вычислять квантили построчно.Вы можете просто транспонировать свой фрейм данных и затем применить pandas.DataFrame.quantile Не уверен, что это оптимально.

q=data.quantile([0.25,0.50,0.75],axis=0)

Если у вас активен IPython, вы можете использовать магию строки: %time перед строкой, чтобы проверить запусквремя.

%time
q=data.quantile([0.25,0.50,0.75],axis=0)

Это возвращает: Wall time: 0 ns мне.

0 голосов
/ 26 марта 2019

Предоставлено @ dahhiya_boy

Вы можете использовать median() из statistics модуля

import statistics

statistics.median(items)

Вы можете рассчитать Q1, взяв медиану median() и min(), и вы можете рассчитать Q3, взяв медиану median() и max(). Если вы находите этот беспорядок, просто определите функцию quartile_median(), которая возвращает Q1, Q2, Q3

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