使用DataFrame的嵌套if循环非常非常慢

时间:2015-05-24 18:11:35

标签: python if-statement nested dataframe

我要经历1000万行,处理需要花费数小时,我必须做错事

为了方便输入

,我转换了df变量的名称
Close=df['Close']
eqId=df['eqId']
date=df['date']
IntDate=df['IntDate']
expiry=df['expiry']
delta=df['delta']
ivMid=df['ivMid']
conf=df['conf']

下面的代码运行正常,只是不合时宜地提出任何建议吗?

print(datetime.datetime.now().time())
for i in range(2,1000):
if delta[i]==90:
    if delta[i-1]==50:
        if delta[i-2]==10:
            if expiry[i]==expiry[i-2]:
                df.Skew[i]=ivMid[i]-ivMid[i-2]

print(datetime.datetime.now().time())


14:02:11.014396
14:02:13.834275


df.head(100)
Close   eqId    date    IntDate expiry  delta   ivMid   conf    Skew
0   37.380005   7   2008-01-02  39447   1   50  0.3850  0.8663  
1   37.380005   7   2008-01-02  39447   1   90  0.5053  0.7876  
2   36.960007   7   2008-01-03  39448   1   50  0.3915  0.8597  
3   36.960007   7   2008-01-03  39448   1   90  0.5119  0.7438  
4   35.179993   7   2008-01-04  39449   1   50  0.4055  0.8454  
5   35.179993   7   2008-01-04  39449   1   90  0.5183  0.7736  
6   33.899994   7   2008-01-07  39452   1   50  0.4464  0.8400  
7   33.899994   7   2008-01-07  39452   1   90  0.5230  0.7514  
8   31.250000   7   2008-01-08  39453   1   10  0.4453  0.7086  
9   31.250000   7   2008-01-08  39453   1   50  0.4826  0.8246  
10  31.250000   7   2008-01-08  39453   1   90  0.5668  0.6474  0.1215
11  30.830002   7   2008-01-09  39454   1   10  0.4716  0.7186  
12  30.830002   7   2008-01-09  39454   1   50  0.4963  0.8479  
13  30.830002   7   2008-01-09  39454   1   90  0.5735  0.6704  0.1019
14  31.460007   7   2008-01-10  39455   1   10  0.4254  0.6737  
15  31.460007   7   2008-01-10  39455   1   50  0.4929  0.8218  
16  31.460007   7   2008-01-10  39455   1   90  0.5902  0.6411  0.1648
17  30.699997   7   2008-01-11  39456   1   10  0.4868  0.7183  
18  30.699997   7   2008-01-11  39456   1   50  0.4965  0.8411  
19  30.639999   7   2008-01-14  39459   1   10  0.5117  0.7620  
20  30.639999   7   2008-01-14  39459   1   50  0.4989  0.8804  
21  30.639999   7   2008-01-14  39459   1   90  0.5887  0.6845  0.077
22  29.309998   7   2008-01-15  39460   1   10  0.4956  0.7363  
23  29.309998   7   2008-01-15  39460   1   50  0.5054  0.8643  
24  30.080002   7   2008-01-16  39461   1   10  0.4983  0.6646  

按此速率处理需要7.77小时

1 个答案:

答案 0 :(得分:1)

基本上,numpy& pandas是为了避免瘟疫之类的循环,并以矢量方式做事。正如你所注意到的那样,没有它,速度就消失了。

让我们将您的问题分解为步骤。

条件

在这里,您的第一个条件可以这样写:

df.delta == 90

(注意这会一次比较整个列。这比你的循环要快得多!)。

,第二个可以这样写(使用shift):

df.delta.shift(1) == 50

其他条件相似。

请注意,要组合条件,您需要使用括号。所以,前两个条件应该写成:

(df.delta == 90)& (df.delta.shift(1)== 50)

您现在应该能够编写一个结合所有条件的表达式。我们称之为cond,即

cond = (df.delta == 90) & (df.delta.shift(1) == 50) & ...

作业

要将内容分配给新列,请使用

df['skew'] = ...

我们只需要弄清楚右手牌上的内容

右手边

由于我们有cond,我们可以将右侧写为

np.where(cond, df.ivMid - df.ivMid.shift(2), 0)

这说的是:当条件成立时,采取第二个任期;如果不是,那就选择第三个学期(在这种情况下,我使用0,但做任何你喜欢的事。)

通过组合所有这些,您应该能够编写非常有效的代码版本。