我要经历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小时
答案 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,但做任何你喜欢的事。)
通过组合所有这些,您应该能够编写非常有效的代码版本。