如何通过跳跃有效地进行数据帧移位
how to efficienlty do dataframe shift with a jump
我正在分析 60 个日志文件。从这些文件中,我创建了数据框 state_n_ev_mat
。它的大小是[2083656 rows x 8 columns]
。您可以在下方看到 state_n_ev_mat
.
的前 50 行
其中,block
标识每个文件,ts
为当前时间段,n_ts
为当前ts
的下24个开放时间段。 n_cp
是n_ts
在ts
的清算价,c_cp
是n_ts
前ts
的清算价。暂时不考虑其余的列。
我想做的是用之前 ts
的清算价格填充 c_cp
。除了最开始的 24 个,因为在那之前没有 activity。
例如row 24
的c_cp
值(即27.9)是row 1
中n_cp
的值。它基本上是向上移动到第 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)
我正在分析 60 个日志文件。从这些文件中,我创建了数据框 state_n_ev_mat
。它的大小是[2083656 rows x 8 columns]
。您可以在下方看到 state_n_ev_mat
.
其中,block
标识每个文件,ts
为当前时间段,n_ts
为当前ts
的下24个开放时间段。 n_cp
是n_ts
在ts
的清算价,c_cp
是n_ts
前ts
的清算价。暂时不考虑其余的列。
我想做的是用之前 ts
的清算价格填充 c_cp
。除了最开始的 24 个,因为在那之前没有 activity。
例如row 24
的c_cp
值(即27.9)是row 1
中n_cp
的值。它基本上是向上移动到第 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)