<p>我有一个在熊猫身上实现并行化的方法。我将数据帧分成块,将每个块放入列表元素中,然后使用ipython的并行位对数据帧列表执行并行应用。然后我使用pandas<code>concat</code>函数将列表重新组合在一起。</p>
<p>然而,这通常并不适用。它对我有效,因为我要应用到数据帧的每个块的函数大约需要一分钟。把我的数据拆开放在一起不会花那么长时间。所以这显然是个骗局。尽管如此,这里有一个例子。我正在使用Ipython笔记本,所以您将在我的代码中看到<code>%%time</code>魔力:</p>
<pre><code>## make some example data
import pandas as pd
np.random.seed(1)
n=10000
df = pd.DataFrame({'mygroup' : np.random.randint(1000, size=n),
'data' : np.random.rand(n)})
grouped = df.groupby('mygroup')
</code></pre>
<p>在这个例子中,我将基于上面的groupby生成“chunks”,但这不一定是数据的分块方式。虽然这是一个很常见的模式。</p>
<pre><code>dflist = []
for name, group in grouped:
dflist.append(group)
</code></pre>
<p>设置并行位</p>
<pre><code>from IPython.parallel import Client
rc = Client()
lview = rc.load_balanced_view()
lview.block = True
</code></pre>
<p>编写一个愚蠢的函数来应用于我们的数据</p>
<pre><code>def myFunc(inDf):
inDf['newCol'] = inDf.data ** 10
return inDf
</code></pre>
<p>现在让我们先串行运行代码,然后并行运行代码。
序列号第一:</p>
<pre><code>%%time
serial_list = map(myFunc, dflist)
CPU times: user 14 s, sys: 19.9 ms, total: 14 s
Wall time: 14 s
</code></pre>
<p>现在平行</p>
<pre><code>%%time
parallel_list = lview.map(myFunc, dflist)
CPU times: user 1.46 s, sys: 86.9 ms, total: 1.54 s
Wall time: 1.56 s
</code></pre>
<p>然后只需几毫秒就可以将它们合并回一个数据帧</p>
<pre><code>%%time
combinedDf = pd.concat(parallel_list)
CPU times: user 296 ms, sys: 5.27 ms, total: 301 ms
Wall time: 300 ms
</code></pre>
<p>我在我的MacBook上运行6个IPython引擎,但是你可以看到它将执行时间从14秒减少到2秒</p>
<p>对于真正长时间运行的随机模拟,我可以通过使用<a href="http://star.mit.edu/cluster/" rel="noreferrer">StarCluster</a>启动集群来使用AWS后端。然而,大多数时候,我在MBP上只并行8个cpu。</p>