数据处理必须看到:如何将你的熊猫周期加快71803倍

雷·艾丰的开发人员强调,如果你使用蟒蛇和熊猫进行数据分析,你很快就会第一次使用循环。

然而,即使对于小数据集,使用标准循环也很耗时,您很快就会意识到大数据帧可能需要很长时间。

当我第一次等了半个多小时才执行代码时,我找到了一个可供选择的方法,接下来我想和大家分享。

标准的圆形数据框是一个有行和列的熊猫对象。

如果使用循环,将遍历整个对象。

Python不能使用任何内置函数,速度非常慢。

在我们的例子中,我们得到了一个65列1140行的数据帧,其中包含了2016-2019赛季的足球比赛结果。

我们将创建一个新的列来指示某个特定的团队是否已经绘制。

我们可以从以下几个方面开始:[足球联盟‘平局’]= 99999 for Lowinrange(0,Len(联盟DF)): IF((联盟DF [队‘主场’)。ILOC[街] = =团队)& AMP(leaguedf[‘FTR’]。iloc行]= = = ‘ D ‘)| \((league df[‘ away Team ‘]。iloc行]==TEAM)和;(leaguedf[‘FTR’]。iloc行]= = ‘ D ‘):league df[‘ Draws ‘]。iloc行]=“抽签”([‘主场球队’)。iloc行]==TEAM)和;(leaguedf[‘FTR’]。iloc街]!= ‘ D ‘)| \(([的团队成员)。iloc行]==TEAM)和;(leaguedf[‘FTR’]。iloc街]!= ‘ D ‘):[联盟’抽签’]。[街]= ‘不_画’其他:[‘画’]。iloc行]= ‘ No _ Game ‘ defsoc _ loop(leaguedf,TEAM,):leaguedf[‘ Draws ‘]= 99999 orrowinrange(0,len(leaguedf)):if((leaguedf[‘ HomeTeam ‘)。iloc行]==TEAM)和;(leaguedf[‘FTR’]。iloc行]= = = ‘ D ‘)| \((league df[‘ away Team ‘]。iloc行]==TEAM)和;(leaguedf[‘FTR’]。iloc行]= = ‘ D ‘):league df[‘ Draws ‘]。iloc行]=“抽签”([‘主场球队’)。iloc行]==TEAM)和;(leaguedf[‘FTR’]。iloc街]!= ‘ D ‘)| \(([的团队成员)。iloc行]==TEAM)和;(leaguedf[‘FTR’]。iloc街]!= ‘ d ‘):[民主力量联盟’ DRAWS’]。ILOC·[·罗] = ‘不_ DRAW ‘其他:[足球联盟’ DRAWS’]。ILOC[路] =’ NO _ GAME’ DEF足球_ LOOP(联赛DF,球队),因为我们的数据框架包括英超的每场比赛,所以我们必须检查我们感兴趣的球队(阿森纳)是否参加过比赛,它们是否适用,以及它们是主场球队还是客队。

如您所见,这个周期非常慢,需要207秒来执行。

让我们看看如何提高效率。

熊猫内置函数:iterrow-在第一个例子中,我们遍历了整个数据帧,速度快了321倍。

Iterrows为每行返回一个序列,因此它以一对索引的形式迭代数据帧,而感兴趣的列以序列的形式迭代。

这使得它比标准周期更快:如果[((主场==球队)和(客场==’D’))|((客场= =球队),那么defsoc _ iter(球队,主场,客场,ftr): #球队,排[‘主场’],排[‘客场’],排[‘ ftr ‘];结果= ‘画’出[((主场==球队)& amp(ftr!= ‘ D ‘)|((离开= = TEAM)& amp;(ftr!= ‘ D ‘)]:如果[((主场= =球队),结果= ‘无平局’其他:结果= ‘无比赛’返回结果定义赛:#球队,排[‘主场’],排[‘客场’],排[‘ FTR ‘];(ftr = = ‘ D ‘)|((away = = TEAM)& amp;结果= ‘画’出[((主场==球队)& amp(ftr!= ‘ D ‘)|((离开= = TEAM)& amp;(ftr!= ‘ d ‘)]:result = ‘ no _ draw ‘ else:result = ‘ no _ game ‘ return result代码运行时间为68毫秒,比标准周期快321倍。

然而,许多人建议不要使用它,因为还有更快的方法,iterrows不保留跨行数据类型。

这意味着,如果iterrow用于数据帧,数据类型可以改变,这将导致许多问题。

为了保留数据类型,还可以使用三元组。

我们不会在这里详细讨论它,因为我们必须关注效率。

你可以在这里找到官方文件:http://panands . pydata . org/panands-docs/stable/reference/API/panands . data frame . ITER tuples . html?source = post _ page-80503 df 4f 06-apply method-811倍快速应用本身并不令人不快,但与数据帧结合使用时,它具有优势。

这取决于应用程序表达式的内容。

如果可以在Cython空之间执行,速度会更快(这里就是这种情况)。

我们可以将apply与Lambda函数一起使用。

我们所要做的就是指定轴。

在这种情况下,我们必须使用axis=1,因为我们必须执行一个列操作:这个代码比以前的方法更快,并且只需要27毫秒就可以完成。

熊猫矢量化-速度快了9280倍,现在我们可以讨论一个新话题了。

我们利用矢量化的优点来创建真正快速的数据处理必须看到:如何将你的熊猫周期加快71803倍代码。我们利用矢量化来创建非常快速的代码。

重点是避免像前面的例子[1]中那样的Python级循环,并使用优化的C代码,这样可以更有效地使用内存。

我们只需要稍微修改一下这个函数:[‘平局’] = ‘没有比赛'[((主场==球队)&(客场= =球队)|((客场= =球队)& amp(==’D ‘),’ Draws ‘]= ‘ Draw ‘ df . loc[((home = = TEAM)& amp;(ftr!= ‘ D ‘)|((离开= = TEAM)& amp;(ftr!=’D ‘),’ Draws ‘]= ‘ No _ Draw ‘ defsoc _ ITER(TEAM,home,away,ftr):df[‘ Draws ‘]= ‘ No _ Game ‘ df . loc[((home = = TEAM)& amp;(ftr = = ‘ D ‘)|((away = = TEAM)& amp;(==’D ‘),’ Draws ‘]= ‘ Draw ‘ df . loc[((home = = TEAM)& amp;(ftr!= ‘ D ‘)|((离开= = TEAM)& amp;(ftr!=’ d ‘),’ draw’] =’ no _ draw’ defsoc _ iter(团队,主场,客场,ftr):现在我们可以使用pandasseries作为输入来创建一个新列:在这种情况下,我们甚至不需要循环。

我们所要做的就是调整函数的内容。

现在,我们可以直接将pandasseries传递给我们的函数,这将带来巨大的速度增益。

Numpy矢量化-速度快71.803倍在前面的示例中,我们将pandasseries传递给函数。

通过添加。值,我们收到了Numpy数组:Numpy数组非常快,我们的代码运行时间是0305毫秒,比我们开始使用的标准循环快71803倍。

结论如果你使用蟒蛇、熊猫和Numpy进行数据分析,总会有一些改进空。

我们比较了五种不同的方法,并根据计算结果在数据框中添加了一个新列。

未经允许不得转载:澳门新威尼斯官方网站 » 数据处理必须看到:如何将你的熊猫周期加快71803倍
分享到:
赞(0)

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址