Панды с rpy2 и многопроцессорностью

Я пытаюсь ускорить процесс, используя Панд и Р.

Предположим, что у меня есть следующий фрейм данных:

import pandas as pd
from random import randint
df = pd.DataFrame({'mpg': [randint(1, 9) for x in xrange(10)],
                   'wt': [randint(1, 9)*10 for x in xrange(10)],
                   'cyl': [randint(1, 9)*100 for x in xrange(10)]})
df
  mpg wt  cyl
0  3  40  100
1  6  30  200
2  7  70  800
3  3  50  200
4  7  50  400
5  4  10  400
6  3  70  500
7  8  30  200
8  3  40  800
9  6  60  200

Затем я использую rpy2 для моделирования некоторых данных:

import rpy2.robjects.packages as rpackages
import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()

base = rpackages.importr('base')
stats = rpackages.importr('stats')

formula = 'mpg ~ wt + cyl'
fit_full = stats.lm(formula, data=df)

после этого я делаю некоторые прогнозы:

rfits = stats.predict(fit_full, newdata=df)

Этот код работает без проблем для небольшого информационного кадра, но на самом деле у меня есть большой информационный кадр с миллионами строк, и я пытаюсь ускорить прогнозирование, используя другие модели rpy2, но, к сожалению, для этого требуется много времени.

Я впервые попытался использовать многопроцессорную библиотеку для этой задачи, но безуспешно:

import multiprocessing as mp

pool = mp.Pool(processes=4)
rfits = pool.map(predict(fit_full, newdata=df))

но, вероятно, я делаю что-то не так, так как не вижу улучшения скорости.

Я думаю, что главная проблема здесь в том, что я пытаюсь применить pool.map в rpy2 функция, а не предопределенная функция Python. Вероятно, есть какое-то обходное решение для этого без использования многопроцессорной библиотеки, но я не вижу ничего.

Любая помощь будет принята с благодарностью. Заранее спасибо.

1 ответ

Вы пробовали использовать StatsModels?

Подгонка моделей с использованием формул в стиле R Начиная с версии 0.5.0, statsmodels позволяет пользователям подбирать статистические модели с использованием формул в стиле R. Внутренне statsmodels использует пакет patsy для преобразования формул и данных в матрицы, которые используются при подгонке модели. Структура формулы довольно мощная; этот урок только царапает поверхность. Полное описание языка формул можно найти в документах.

import statsmodels.formula.api as smf

formula = 'mpg ~ wt + cyl'
model = smf.ols(formula=formula, data=df)
params = model.fit().params

>>> params
params
Intercept    5.752803
wt           0.037770
cyl         -0.004112

>>> model.predict(params, exog=df)
array([ 1725.83759267,  2876.50148582,   575.25352613,  1150.6605447 ,
        1150.51281171,  3451.54178359,   575.53800931,   575.4146529 ,
        2876.58372342,  5177.46831077])
Другие вопросы по тегам