如何高效地跳转数据帧转换

问题描述:

我有60个我正在分析的日志文件。从这些文件中我创建了数据帧state_n_ev_mat。其尺寸为[2083656 rows x 8 columns]。在下面你可以看到state_n_ev_mat的前50行。如何高效地跳转数据帧转换

其中,block标识每个文件,ts是当前时隙,n_ts是当前ts未来24个开放时隙。 n_cpts发生的清算价格为n_ts,c_cp以前的清算价格tsn_ts。目前不考虑其余的列。

我想要做的是填充c_cp以前的ts的清算价格。除了最初的24次,因为之前没有任何活动。

例如,row 24(即27.9)的c_cp值是n_cprow 1中的值。这基本上是一个变化到第23个值,因为第24个n_ts在前面的ts中没有打开,而是丢弃了最初的n_cp值,因为在接下来的tsts不再打开。

我的意思是后者是在ts=361n_ts=361不再可用。

简而言之,c_cpn_cp的前23个数据点填充,而将第24个作为NaN

这有道理吗?

我的尝试是:

for m in range(60): 
    last_current = last_ts[m]-24 
    for n in range(360,last_current): 
     state_n_ev_mat.c_cp.loc[(state_n_ev_mat.block==m) & (state_n_ev_mat.ts==n+1)] = \ 
      state_n_ev_mat.n_cp.loc[(state_n_ev_mat.block==m) & (state_n_ev_mat.ts==n)].shift(-1).values 

这种方法是服用大量的时间来完成。 到目前为止,它正在计算第56块,运行时间为18小时。

有没有更好的方法来做到这一点?谢谢

state_n_ev_mat的第一个50行之下,在内部for的一个循环之后。

block ts n_ts n_cp c_cp c_w f_w p_w 
0  0 360 361.0 27.5 NaN NaN NaN NaN 
1  0 360 362.0 27.9 NaN NaN NaN NaN 
2  0 360 363.0 27.9 NaN NaN NaN NaN 
3  0 360 364.0 27.7 NaN NaN NaN NaN 
4  0 360 365.0 34.0 NaN NaN NaN NaN 
5  0 360 366.0 33.9 NaN NaN NaN NaN 
6  0 360 367.0 34.1 NaN NaN NaN NaN 
7  0 360 368.0 33.7 NaN NaN NaN NaN 
8  0 360 369.0 40.3 NaN NaN NaN NaN 
9  0 360 370.0 40.1 NaN NaN NaN NaN 
10  0 360 371.0 50.1 NaN NaN NaN NaN 
11  0 360 372.0 40.1 NaN NaN NaN NaN 
12  0 360 373.0 44.4 NaN NaN NaN NaN 
13  0 360 374.0 106.0 NaN NaN NaN NaN 
14  0 360 375.0 74.9 NaN NaN NaN NaN 
15  0 360 376.0 95.4 NaN NaN NaN NaN 
16  0 360 377.0 125.0 NaN NaN NaN NaN 
17  0 360 378.0 139.1 NaN NaN NaN NaN 
18  0 360 379.0 133.3 NaN NaN NaN NaN 
19  0 360 380.0 124.0 NaN NaN NaN NaN 
20  0 360 381.0 139.1 NaN NaN NaN NaN 
21  0 360 382.0 53.1 NaN NaN NaN NaN 
22  0 360 383.0 45.1 NaN NaN NaN NaN 
23  0 360 384.0 46.0 NaN NaN NaN NaN 
24  0 361 362.0 36.4 27.9 NaN NaN NaN 
25  0 361 363.0 31.8 27.9 NaN NaN NaN 
26  0 361 364.0 31.2 27.7 NaN NaN NaN 
27  0 361 365.0 33.4 34.0 NaN NaN NaN 
28  0 361 366.0 34.2 33.9 NaN NaN NaN 
29  0 361 367.0 0.0 34.1 NaN NaN NaN 
30  0 361 368.0 0.0 33.7 NaN NaN NaN 
31  0 361 369.0 0.0 40.3 NaN NaN NaN 
32  0 361 370.0 0.0 40.1 NaN NaN NaN 
33  0 361 371.0 0.0 50.1 NaN NaN NaN 
34  0 361 372.0 0.0 40.1 NaN NaN NaN 
35  0 361 373.0 0.0 44.4 NaN NaN NaN 
36  0 361 374.0 0.0 106.0 NaN NaN NaN 
37  0 361 375.0 0.0 74.9 NaN NaN NaN 
38  0 361 376.0 0.0 95.4 NaN NaN NaN 
39  0 361 377.0 0.0 125.0 NaN NaN NaN 
40  0 361 378.0 0.0 139.1 NaN NaN NaN 
41  0 361 379.0 0.0 133.3 NaN NaN NaN 
42  0 361 380.0 0.0 124.0 NaN NaN NaN 
43  0 361 381.0 0.0 139.1 NaN NaN NaN 
44  0 361 382.0 0.0 53.1 NaN NaN NaN 
45  0 361 383.0 0.0 45.1 NaN NaN NaN 
46  0 361 384.0 0.0 46.0 NaN NaN NaN 
47  0 361 385.0 46.2 NaN NaN NaN NaN 
48  0 362 363.0 39.0 NaN NaN NaN NaN 
49  0 362 364.0 33.1 NaN NaN NaN NaN 

有了更好的理解..

#get number of chunks 
chunks = -(-len(frame) // 24) 
#create chunks 
groups = [frame.iloc[x*24:x*24+24,:].copy() for x in range(0,chunks)] 

for i in range(0,len(groups)): 
    if i == 0: 
     groups[i]['c_cp'] = np.nan 
    else: 
     if len(groups[i]) < 24: 
      groups[i]['c_cp'] = np.nan 
     else: 
      data = groups[i-1]['n_cp'].tolist() 
      data = data[1:] 
      data.append(np.nan) 
      groups[i]['c_cp'] = data 

print pd.concat(groups) 
+0

这是否解决问题了吗? – DJK

+0

它不能解决问题。因为总会有一种跳跃。请多多包涵。假设我们将整个数据帧'state_n_ev_mat'的每一行分成24行。然后,新col'c_cp'的每个块都填入'n_cp'前面块的23行。这里发生了两件事情:首先,'c_cp'块的最后一个元素仍未填充,即'NaN'。其次,因为我们只考虑前面的23行,'n_cp'块的第一个元素被丢弃。这有道理吗? – Arraval

+0

@Arraval我已经更新了代码以包含跳转,最后一个块是一个神秘的tho,所以在代码中如果块的长度小于24个元素,它将获得所有的NaN值,如果这是错误的,我可以更新,但它是你如何在你的例子中展示它。此外,我测试了一个10000行的数据帧,并且它完成了很快的 – DJK