【问题标题】:Pandas with rpy2 and multiprocessing带有 rpy2 和多处理的 Pandas
【发布时间】:2015-04-20 18:37:03
【问题描述】:

我正在尝试使用 Pandas 和 R 加速进程。

假设我有以下数据框:

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 预定义函数。在不使用多处理库的情况下,可能有一些解决方法,但我看不到。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 您的 CPU 利用率如何?您的代码实际上是否使用了所有 4 个内核?
  • 不,一点也不,它仍然只使用 1 个核心。
  • This 可能是相关的,那么
  • 谢谢。我要测试它是否有效。

标签: python pandas multiprocessing rpy2


【解决方案1】:

您是否尝试过使用 StatsModels?

Fitting models using R-style formulas 从 0.5.0 版开始,statsmodels 允许用户使用 R 风格的公式拟合统计模型。 在内部,statsmodels 使用 patsy 包来转换公式和 数据到模型拟合中使用的矩阵。公式 框架相当强大;本教程只涉及表面。 可以在 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])

【讨论】:

  • 是的,我知道 statsmodels,但实际上我需要使用我认为尚未在 statsmodels 中实现的 gam(广义加法模型)。
  • 正确。这是他们的“沙盒”的一部分statsmodels.sourceforge.net/devel/sandbox.html
  • 哇!我不知道!测试完我会反馈的!谢谢。
  • statsmodels 沙箱中的 GAM 未处于可用状态。 (在年底之前可能会有一些有用的东西。)但是,statsmodels 使用的公式包 patsy 可以创建可用于任何模型的带有样条的设计矩阵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
相关资源
最近更新 更多