如何高效地跳转数据帧转换
问题描述:
我有60个我正在分析的日志文件。从这些文件中我创建了数据帧state_n_ev_mat
。其尺寸为[2083656 rows x 8 columns]
。在下面你可以看到state_n_ev_mat
的前50行。如何高效地跳转数据帧转换
其中,block
标识每个文件,ts
是当前时隙,n_ts
是当前ts
未来24个开放时隙。 n_cp
是ts
发生的清算价格为n_ts
,c_cp
以前的清算价格ts
为n_ts
。目前不考虑其余的列。
我想要做的是填充c_cp
以前的ts
的清算价格。除了最初的24次,因为之前没有任何活动。
例如,row 24
(即27.9)的c_cp
值是n_cp
在row 1
中的值。这基本上是一个变化到第23个值,因为第24个n_ts
在前面的ts
中没有打开,而是丢弃了最初的n_cp
值,因为在接下来的ts
中ts
不再打开。
我的意思是后者是在ts=361
n_ts=361
不再可用。
简而言之,c_cp
从n_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)
这是否解决问题了吗? – DJK
它不能解决问题。因为总会有一种跳跃。请多多包涵。假设我们将整个数据帧'state_n_ev_mat'的每一行分成24行。然后,新col'c_cp'的每个块都填入'n_cp'前面块的23行。这里发生了两件事情:首先,'c_cp'块的最后一个元素仍未填充,即'NaN'。其次,因为我们只考虑前面的23行,'n_cp'块的第一个元素被丢弃。这有道理吗? – Arraval
@Arraval我已经更新了代码以包含跳转,最后一个块是一个神秘的tho,所以在代码中如果块的长度小于24个元素,它将获得所有的NaN值,如果这是错误的,我可以更新,但它是你如何在你的例子中展示它。此外,我测试了一个10000行的数据帧,并且它完成了很快的 – DJK