plc_base.py 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. import pandas as pd
  2. from .block_pushrod import block_extend_time
  3. from .block_pushrod import block_retracted_time
  4. from .block_pushrod import pushrod_extend_time
  5. from .block_pushrod import pushrod_retracted_time
  6. from .fun_base import press_z_delta,smooth,cosine_sim_result,lift_onplace_delta,seat_onplace_delta
  7. ##构建函数通过机器人日志数据加工基础指标
  8. def plc_base(data,para_base):
  9. ##数据转换
  10. col_index=["发生时间",
  11. "机器人标识",
  12. "换电步骤",
  13. "机器人状态",
  14. "x轴速度",
  15. "y轴速度",
  16. "z轴速度",
  17. "r轴速度",
  18. "暂停",
  19. "x位移",
  20. "y位移",
  21. "z位移",
  22. "r位移",
  23. "x扭矩1",
  24. "x扭矩2",
  25. "y扭矩",
  26. "z扭矩",
  27. "r扭矩",
  28. "拉力传感器1",
  29. "拉力传感器2",
  30. "拉力传感器3",
  31. "拉力传感器4",
  32. "车辆粗定位位置",
  33. "急停",
  34. "车辆精定位位置",
  35. "车辆精定位高度",
  36. "车辆精定位偏转",
  37. "亏电电池位置",
  38. "亏电电池高度",
  39. "亏电电池离座高度",
  40. "中转仓位置",
  41. "中转仓高度",
  42. "中转仓角度",
  43. "亏电电池中转仓位置",
  44. "亏电电池落座中转仓高度",
  45. "满电电池仓位置",
  46. "满电电池位置",
  47. "满电电池高度",
  48. "满电电池在车辆位置",
  49. "中转仓吊具脱离高度",
  50. "到位传感器",
  51. "满电仓位",
  52. "转锁全部伸出",
  53. "转锁全部收回",
  54. "落座全部到位",
  55. "落座全部未到位",
  56. "光栅传感器",
  57. "当前换电模式",
  58. "亏电仓位",
  59. "换电编号",
  60. "站控取电池仓位",
  61. "架载机落座传感器1",
  62. "架载机落座传感器2",
  63. "架载机落座传感器3",
  64. "架载机落座传感器4",
  65. "架载机落座传感器5",
  66. "架载机落座传感器6",
  67. "架载机落座传感器7",
  68. "架载机落座传感器8",
  69. "红绿灯",
  70. "排风扇1",
  71. "排风扇2",
  72. "排风扇3",
  73. "排风扇4",
  74. "plc控制站控断电",
  75. "控制整站断电",
  76. "错误码1",
  77. "错误码2",
  78. "错误码3",
  79. "错误码4",
  80. "错误码5",
  81. "错误码6",
  82. "错误码7",
  83. "错误码8",
  84. "错误码9",
  85. "错误码10",
  86. "横移轴原点",
  87. "转锁1缩回",
  88. "推杆1伸出",
  89. "推杆1收回",
  90. "推杆2伸出",
  91. "推杆2收回",
  92. "推杆3伸出",
  93. "推杆3收回",
  94. "推杆4伸出",
  95. "推杆4收回",
  96. "转锁3缩回",
  97. "转锁1伸出",
  98. "吊具到位1",
  99. "转锁3伸出",
  100. "吊具到位2",
  101. "吊具到位3",
  102. "吊具到位4",
  103. "转锁4缩回",
  104. "转锁4伸出",
  105. "转锁2缩回",
  106. "转锁2伸出",
  107. "像素x",
  108. "像素y",
  109. "实时测距",
  110. "过程测距值1",
  111. "过程测距值2",
  112. "吊具到码心x距离",
  113. "偏转计算点2位置缓存",
  114. "推杆2伸出时间",
  115. "推杆3伸出时间",
  116. "推杆2缩回时间",
  117. "推杆3缩回时间",
  118. "推杆1伸出时间",
  119. "推杆4伸出时间",
  120. "推杆1缩回时间",
  121. "推杆4缩回时间"]
  122. data=data[col_index]
  123. data.columns=["time",
  124. "sn",
  125. "steps",
  126. "status",
  127. "x_v",
  128. "y_v",
  129. "z_v",
  130. "r_v",
  131. "pause",
  132. "x_s",
  133. "y_s",
  134. "z_s",
  135. "r_s",
  136. "x1_toque",
  137. "x2_toque",
  138. "y_toque",
  139. "z_toque",
  140. "r_toque",
  141. "pressure_1",
  142. "pressure_2",
  143. "pressure_3",
  144. "pressure_4",
  145. "veh_coarse_position",
  146. "emer_stop",
  147. "veh_precise_position",
  148. "veh_precise_h",
  149. "veh_precise_deflect",
  150. "low_bat_local",
  151. "low_bat_h",
  152. "low_bat_seat_h",
  153. "trans_house_loc",
  154. "trans_house_h",
  155. "trans_house_angle",
  156. "low_bat_trans_house_loc",
  157. "low_bat_add_seat_h",
  158. "full_bat_house_loc",
  159. "full_bat_local",
  160. "full_bat_h",
  161. "full_bat_oncar_loc",
  162. "lift_from_th_h",
  163. "position_sense",
  164. "full_house_id",
  165. "lock_full_extended",
  166. "lock_full_retracted",
  167. "seat_all_in",
  168. "seat_all_notin",
  169. "grating_sensor",
  170. "power_exchange_mode",
  171. "low_bat_house_id",
  172. "change_num",
  173. "control_house_id",
  174. "base_sensor1",
  175. "base_sensor2",
  176. "base_sensor3",
  177. "base_sensor4",
  178. "base_sensor5",
  179. "base_sensor6",
  180. "base_sensor7",
  181. "base_sensor8",
  182. "light",
  183. "fan1",
  184. "fan2",
  185. "fan3",
  186. "fan4",
  187. "station_control_break",
  188. "entire_station_break",
  189. "error_code1",
  190. "error_code2",
  191. "error_code3",
  192. "error_code4",
  193. "error_code5",
  194. "error_code6",
  195. "error_code7",
  196. "error_code8",
  197. "error_code9",
  198. "error_code10",
  199. "h_axis_origin",
  200. "lock1_retracted",
  201. "pushrod1_extended",
  202. "pushrod1_retracted",
  203. "pushrod2_extended",
  204. "pushrod2_retracted",
  205. "pushrod3_extended",
  206. "pushrod3_retracted",
  207. "pushrod4_extended",
  208. "pushrod4_retracted",
  209. "lock3_retracted",
  210. "lock1_extended",
  211. "lift1_inplace",
  212. "lock3_extended",
  213. "lift2_inplace",
  214. "lift3_inplace",
  215. "lift4_inplace",
  216. "lock4_retracted",
  217. "lock4_extended",
  218. "lock2_retracted",
  219. "lock2_extended",
  220. "pixel_x",
  221. "pixel_y",
  222. "dis_ontime",
  223. "dis1_process",
  224. "dis2_process",
  225. "lift_code_dist",
  226. "deflect2",
  227. "pushrod2_out_time",
  228. "pushrod3_out_time",
  229. "pushrod2_in_time",
  230. "pushrod3_in_time",
  231. "pushrod1_out_time",
  232. "pushrod4_out_time",
  233. "pushrod1_in_time",
  234. "pushrod4_in_time"]
  235. ##数据清洗
  236. data["steps_up"]=data["steps"].shift(-1)
  237. data["steps_down"]=data["steps"].shift(1)
  238. data=data[(data["steps"]==data["steps_up"])|(data["steps"]==data["steps_down"])]
  239. data.drop(["steps_up","steps_down"], axis=1, inplace=True)
  240. ##数据分段
  241. data["change_status"]=0
  242. data["change_status"][data["steps"]!=0]=1
  243. data["change_flag"]=(data["change_status"] != data["change_status"].shift(1)).astype(int).cumsum()
  244. data = data.drop('change_status', axis=1)
  245. #准备状态的情况
  246. data0=data[data["steps"]==0]
  247. data_in=data[data["steps"]!=0]
  248. ####换电过程的个数
  249. groups=set(data_in["change_flag"])
  250. ##每个换电过程的换电步骤数
  251. ##排除换电为50的步骤
  252. data_in=data_in[data_in["steps"]!=50]
  253. change_steps= data_in.groupby('change_flag')['steps'].nunique()
  254. change_steps=change_steps.reset_index()
  255. ##增加一个字段来区分是否是完整的换电过程,完成的是44
  256. change_steps["full_steps"]=1
  257. change_steps["full_steps"][change_steps["steps"]!=44]=0
  258. ##换电过程的耗时统计
  259. change_time=data_in.groupby("change_flag").apply(lambda x: pd.concat([x.head(1), x.tail(1)]))
  260. change_time_group=change_time.reset_index(drop=True)
  261. change_time_group=change_time_group[['time','steps','change_flag']]
  262. change_time_group["time2"]=change_time_group["time"].shift(1)
  263. change_time_group=change_time_group.groupby('change_flag').tail(1)
  264. change_time_group["time_delta"]=pd.to_timedelta(pd.to_datetime(change_time_group["time"])-pd.to_datetime(change_time_group["time2"])).dt.total_seconds()
  265. ##增加是否超时的标识
  266. change_time_group['timeout']=0
  267. change_time_group['timeout'][change_time_group['time_delta']>310]=1
  268. ##按照换电过程和换电步骤统计##后面换电过程和分步骤的以这个为基础表
  269. change_steps_time=data_in.groupby(["change_flag","steps"]).apply(lambda x: pd.concat([x.head(1), x.tail(1)]))
  270. change_time_steps=change_steps_time.reset_index(drop=True)
  271. change_time_steps["time2"]=change_time_steps["time"].shift(1)
  272. time_group_steps=change_time_steps.groupby(['change_flag','steps']).tail(1)
  273. time_group_steps["time_delta"]=pd.to_timedelta(pd.to_datetime(time_group_steps["time"])-pd.to_datetime(time_group_steps["time2"])).dt.total_seconds()
  274. ##统计有暂停的过程和步骤
  275. data_pause=data_in[["change_flag","steps"]][data_in["pause"]==1]
  276. pause_result = data_pause.drop_duplicates(['change_flag', 'steps'])
  277. pause_result_steps = pause_result.copy()
  278. pause_result_steps["pause_flag"]=1
  279. ##获取步骤的列表
  280. pause_result_l=pause_result.groupby('change_flag')['steps'].apply(tuple).reset_index()
  281. pause_result_l.columns=["change_flag","pause_steps"]
  282. pause_result_group=pause_result.groupby('change_flag').count()
  283. pause_result_group=pause_result_group.reset_index()
  284. pause_result_group.columns=["change_flag","pause_steps_num"]
  285. ##统计有急停的过程和步骤
  286. data_stop=data_in[["change_flag","steps"]][data_in["emer_stop"]==1]
  287. stop_result = data_stop.drop_duplicates(['change_flag', 'steps'])
  288. stop_result_steps=stop_result.copy()
  289. stop_result_steps["stop_flag"]=1
  290. stop_result_l=stop_result.groupby('change_flag')['steps'].apply(tuple).reset_index()
  291. stop_result_l.columns=["change_flag","stop_steps"]
  292. stop_result_group=stop_result.groupby('change_flag').count()
  293. stop_result_group=stop_result_group.reset_index()
  294. stop_result_group.columns=["change_flag","stop_steps_num"]
  295. ##统计有故障的过程和步骤
  296. data_fault=data_in[["change_flag","steps"]][data_in["status"]==4]
  297. fault_result = data_fault.drop_duplicates(['change_flag', 'steps'])
  298. error_code1=data_in[["change_flag","steps","error_code1"]][(data_in["status"]==4)&(data_in["error_code1"]!=0)]
  299. error_code1.columns=["change_flag","steps","error_code"]
  300. error_code2=data_in[["change_flag","steps","error_code2"]][(data_in["status"]==4)&(data_in["error_code2"]!=0)]
  301. error_code2.columns=["change_flag","steps","error_code"]
  302. error_code3=data_in[["change_flag","steps","error_code3"]][(data_in["status"]==4)&(data_in["error_code3"]!=0)]
  303. error_code3.columns=["change_flag","steps","error_code"]
  304. error_code4=data_in[["change_flag","steps","error_code4"]][(data_in["status"]==4)&(data_in["error_code4"]!=0)]
  305. error_code4.columns=["change_flag","steps","error_code"]
  306. error_code5=data_in[["change_flag","steps","error_code5"]][(data_in["status"]==4)&(data_in["error_code5"]!=0)]
  307. error_code5.columns=["change_flag","steps","error_code"]
  308. error_code6=data_in[["change_flag","steps","error_code6"]][(data_in["status"]==4)&(data_in["error_code6"]!=0)]
  309. error_code6.columns=["change_flag","steps","error_code"]
  310. error_code7=data_in[["change_flag","steps","error_code7"]][(data_in["status"]==4)&(data_in["error_code7"]!=0)]
  311. error_code7.columns=["change_flag","steps","error_code"]
  312. error_code8=data_in[["change_flag","steps","error_code8"]][(data_in["status"]==4)&(data_in["error_code8"]!=0)]
  313. error_code8.columns=["change_flag","steps","error_code"]
  314. error_code9=data_in[["change_flag","steps","error_code9"]][(data_in["status"]==4)&(data_in["error_code9"]!=0)]
  315. error_code9.columns=["change_flag","steps","error_code"]
  316. error_code10=data_in[["change_flag","steps","error_code10"]][(data_in["status"]==4)&(data_in["error_code10"]!=0)]
  317. error_code10.columns=["change_flag","steps","error_code"]
  318. error_code=pd.concat([error_code1,error_code2,error_code3,error_code4,error_code5,error_code6,error_code7,error_code8,error_code9,error_code10])
  319. error_code["error_code"]=error_code["error_code"].astype('int')
  320. error_code = error_code.drop_duplicates(['change_flag', 'steps','error_code'])
  321. error_code=error_code[error_code["error_code"]!=7000]
  322. error_code=error_code.groupby(['change_flag','steps'])['error_code'].apply(tuple).reset_index()
  323. ##后面换电过程和分步骤按这个关联
  324. fault_result_l=fault_result.groupby('change_flag')['steps'].apply(tuple).reset_index()
  325. fault_result_l.columns=["change_flag","fault_steps"]
  326. error_code_group=error_code[["change_flag","error_code"]].drop_duplicates(['change_flag', 'error_code'])
  327. error_code_group_l=error_code_group.groupby('change_flag')['error_code'].apply(tuple).reset_index()
  328. error_code_group_l.columns=["change_flag","error_code"]
  329. fault_result_group=fault_result.groupby('change_flag').count()
  330. fault_result_group=fault_result_group.reset_index()
  331. fault_result_group.columns=["change_flag","fault_steps_num"]
  332. ####基于换电过程的指标汇总加工
  333. ###换电过程的基表 change_time_group
  334. change_time_group=change_time_group[["time2","time","time_delta","timeout","change_flag"]]
  335. change_time_group.columns=["c_time_b","c_time_e","c_time_delta","c_time_out","change_flag"]
  336. ###关联换电步骤数和换电步骤是否完整
  337. group_base=pd.merge(change_time_group,change_steps,on='change_flag',how='left')
  338. group_base.rename(columns={'steps': 'steps_num'}, inplace=True)
  339. ##关联暂停的信息
  340. group_base=pd.merge(group_base,pause_result_l,on='change_flag',how='left')
  341. group_base=pd.merge(group_base,pause_result_group,on='change_flag',how='left')
  342. ##关联急停信息
  343. group_base=pd.merge(group_base,stop_result_l,on='change_flag',how='left')
  344. group_base=pd.merge(group_base,stop_result_group,on='change_flag',how='left')
  345. ##关联故障信息error_code_group_l
  346. group_base=pd.merge(group_base,fault_result_l,on='change_flag',how='left')
  347. group_base=pd.merge(group_base,error_code_group_l,on='change_flag',how='left')
  348. group_base=pd.merge(group_base,fault_result_group,on='change_flag',how='left')
  349. ##按照换电过程和步骤加工其他指标
  350. ##4个转锁的分析,转锁相关的步骤
  351. ##第5步,转锁伸出,一共4个转锁,加工反应时间和运动时间
  352. ##取数[4,5,6]
  353. block_step_5=[4,5,6]
  354. data_step_5=data_in[data_in["steps"].isin(block_step_5)]
  355. data_step_5_block1=data_step_5[["time","change_flag","steps","lock1_retracted","lock1_extended"]]
  356. data_step_5_block2=data_step_5[["time","change_flag","steps","lock2_retracted","lock2_extended"]]
  357. data_step_5_block3=data_step_5[["time","change_flag","steps","lock3_retracted","lock3_extended"]]
  358. data_step_5_block4=data_step_5[["time","change_flag","steps","lock4_retracted","lock4_extended"]]
  359. result_f51,result_r51=block_extend_time(data_step_5_block1)
  360. result_f52,result_r52=block_extend_time(data_step_5_block2)
  361. result_f53,result_r53=block_extend_time(data_step_5_block3)
  362. result_f54,result_r54=block_extend_time(data_step_5_block4)
  363. ##13步解锁
  364. block_step_13=[12,13,14]
  365. data_step_13=data_in[data_in["steps"].isin(block_step_13)]
  366. data_step_13_block1=data_step_13[["time","change_flag","steps","lock1_retracted","lock1_extended"]]
  367. data_step_13_block2=data_step_13[["time","change_flag","steps","lock2_retracted","lock2_extended"]]
  368. data_step_13_block3=data_step_13[["time","change_flag","steps","lock3_retracted","lock3_extended"]]
  369. data_step_13_block4=data_step_13[["time","change_flag","steps","lock4_retracted","lock4_extended"]]
  370. result_f131,result_r131=block_retracted_time(data_step_13_block1)
  371. result_f132,result_r132=block_retracted_time(data_step_13_block2)
  372. result_f133,result_r133=block_retracted_time(data_step_13_block3)
  373. result_f134,result_r134=block_retracted_time(data_step_13_block4)
  374. ##19步上锁,27解锁,33 上锁 ,41解锁
  375. ##19步上锁
  376. block_step_19=[18,19,20]
  377. data_step_19=data_in[data_in["steps"].isin(block_step_19)]
  378. data_step_19_block1=data_step_19[["time","change_flag","steps","lock1_retracted","lock1_extended"]]
  379. data_step_19_block2=data_step_19[["time","change_flag","steps","lock2_retracted","lock2_extended"]]
  380. data_step_19_block3=data_step_19[["time","change_flag","steps","lock3_retracted","lock3_extended"]]
  381. data_step_19_block4=data_step_19[["time","change_flag","steps","lock4_retracted","lock4_extended"]]
  382. result_f191,result_r191=block_extend_time(data_step_19_block1,upd=18,cored=19,downd=20)
  383. result_f192,result_r192=block_extend_time(data_step_19_block2,upd=18,cored=19,downd=20)
  384. result_f193,result_r193=block_extend_time(data_step_19_block3,upd=18,cored=19,downd=20)
  385. result_f194,result_r194=block_extend_time(data_step_19_block4,upd=18,cored=19,downd=20)
  386. block_step_27=[26,27,28]
  387. data_step_27=data_in[data_in["steps"].isin(block_step_27)]
  388. data_step_27_block1=data_step_27[["time","change_flag","steps","lock1_retracted","lock1_extended"]]
  389. data_step_27_block2=data_step_27[["time","change_flag","steps","lock2_retracted","lock2_extended"]]
  390. data_step_27_block3=data_step_27[["time","change_flag","steps","lock3_retracted","lock3_extended"]]
  391. data_step_27_block4=data_step_27[["time","change_flag","steps","lock4_retracted","lock4_extended"]]
  392. result_f271,result_r271=block_retracted_time(data_step_27_block1,upd=26,cored=27,downd=28)
  393. result_f272,result_r272=block_retracted_time(data_step_27_block2,upd=26,cored=27,downd=28)
  394. result_f273,result_r273=block_retracted_time(data_step_27_block3,upd=26,cored=27,downd=28)
  395. result_f274,result_r274=block_retracted_time(data_step_27_block4,upd=26,cored=27,downd=28)
  396. block_step_33=[32,33,34]
  397. data_step_33=data_in[data_in["steps"].isin(block_step_33)]
  398. data_step_33_block1=data_step_33[["time","change_flag","steps","lock1_retracted","lock1_extended"]]
  399. data_step_33_block2=data_step_33[["time","change_flag","steps","lock2_retracted","lock2_extended"]]
  400. data_step_33_block3=data_step_33[["time","change_flag","steps","lock3_retracted","lock3_extended"]]
  401. data_step_33_block4=data_step_33[["time","change_flag","steps","lock4_retracted","lock4_extended"]]
  402. result_f331,result_r331=block_extend_time(data_step_33_block1,upd=32,cored=33,downd=34)
  403. result_f332,result_r332=block_extend_time(data_step_33_block2,upd=32,cored=33,downd=34)
  404. result_f333,result_r333=block_extend_time(data_step_33_block3,upd=32,cored=33,downd=34)
  405. result_f334,result_r334=block_extend_time(data_step_33_block4,upd=32,cored=33,downd=34)
  406. block_step_41=[40,41,42]
  407. data_step_41=data_in[data_in["steps"].isin(block_step_41)]
  408. data_step_41_block1=data_step_41[["time","change_flag","steps","lock1_retracted","lock1_extended"]]
  409. data_step_41_block2=data_step_41[["time","change_flag","steps","lock2_retracted","lock2_extended"]]
  410. data_step_41_block3=data_step_41[["time","change_flag","steps","lock3_retracted","lock3_extended"]]
  411. data_step_41_block4=data_step_41[["time","change_flag","steps","lock4_retracted","lock4_extended"]]
  412. result_f411,result_r411=block_retracted_time(data_step_41_block1,upd=40,cored=41,downd=42)
  413. result_f412,result_r412=block_retracted_time(data_step_41_block2,upd=40,cored=41,downd=42)
  414. result_f413,result_r413=block_retracted_time(data_step_41_block3,upd=40,cored=41,downd=42)
  415. result_f414,result_r414=block_retracted_time(data_step_41_block4,upd=40,cored=41,downd=42)
  416. ###推杆的指标,共两个推杆 ,推杆2和推杆3
  417. ###推杆伸出
  418. ###第7步伸出,相关数据
  419. block_step_7=[6,7,8]
  420. data_step_7=data_in[data_in["steps"].isin(block_step_7)]
  421. data_step_7_pushrod2=data_step_7[["time","change_flag","steps","pushrod2_retracted","pushrod2_extended"]]
  422. data_step_7_pushrod3=data_step_7[["time","change_flag","steps","pushrod3_retracted","pushrod3_extended"]]
  423. ##构建推杆伸出函数
  424. result_f72,result_r72=pushrod_extend_time(data_step_7_pushrod2)
  425. result_f73,result_r73=pushrod_extend_time(data_step_7_pushrod3)
  426. ###伸出的步骤还有21,35
  427. block_step_21=[20,21,22]
  428. data_step_21=data_in[data_in["steps"].isin(block_step_21)]
  429. data_step_21_pushrod2=data_step_21[["time","change_flag","steps","pushrod2_retracted","pushrod2_extended"]]
  430. data_step_21_pushrod3=data_step_21[["time","change_flag","steps","pushrod3_retracted","pushrod3_extended"]]
  431. result_f212,result_r212=pushrod_extend_time(data_step_21_pushrod2,upd=20,cored=21,downd=22)
  432. result_f213,result_r213=pushrod_extend_time(data_step_21_pushrod3,upd=20,cored=21,downd=22)
  433. block_step_35=[34,35,36]
  434. data_step_35=data_in[data_in["steps"].isin(block_step_35)]
  435. data_step_35_pushrod2=data_step_35[["time","change_flag","steps","pushrod2_retracted","pushrod2_extended"]]
  436. data_step_35_pushrod3=data_step_35[["time","change_flag","steps","pushrod3_retracted","pushrod3_extended"]]
  437. result_f352,result_r352=pushrod_extend_time(data_step_35_pushrod2,upd=34,cored=35,downd=36)
  438. result_f353,result_r353=pushrod_extend_time(data_step_35_pushrod3,upd=34,cored=35,downd=36)
  439. ##构建推杆收回函数,11步为收回
  440. block_step_11=[10,11,12]
  441. ##推杆收回的步骤还有25,39
  442. block_step_11=[10,11,12]
  443. data_step_11=data_in[data_in["steps"].isin(block_step_11)]
  444. data_step_11_pushrod2=data_step_11[["time","change_flag","steps","pushrod2_retracted","pushrod2_extended"]]
  445. data_step_11_pushrod3=data_step_11[["time","change_flag","steps","pushrod3_retracted","pushrod3_extended"]]
  446. result_f112,result_r112=pushrod_retracted_time(data_step_11_pushrod2,upd=10,cored=11,downd=12)
  447. result_f113,result_r113=pushrod_retracted_time(data_step_11_pushrod3,upd=10,cored=11,downd=12)
  448. block_step_25=[24,25,26]
  449. data_step_25=data_in[data_in["steps"].isin(block_step_25)]
  450. data_step_25_pushrod2=data_step_25[["time","change_flag","steps","pushrod2_retracted","pushrod2_extended"]]
  451. data_step_25_pushrod3=data_step_25[["time","change_flag","steps","pushrod3_retracted","pushrod3_extended"]]
  452. result_f252,result_r252=pushrod_retracted_time(data_step_25_pushrod2,upd=24,cored=25,downd=26)
  453. result_f253,result_r253=pushrod_retracted_time(data_step_25_pushrod3,upd=24,cored=25,downd=26)
  454. block_step_39=[38,39,40]
  455. data_step_39=data_in[data_in["steps"].isin(block_step_39)]
  456. data_step_39_pushrod2=data_step_39[["time","change_flag","steps","pushrod2_retracted","pushrod2_extended"]]
  457. data_step_39_pushrod3=data_step_39[["time","change_flag","steps","pushrod3_retracted","pushrod3_extended"]]
  458. result_f392,result_r392=pushrod_retracted_time(data_step_39_pushrod2,upd=38,cored=39,downd=40)
  459. result_f393,result_r393=pushrod_retracted_time(data_step_39_pushrod3,upd=38,cored=39,downd=40)
  460. ###扭矩、位移、拉力按换电过程和换电步骤汇总,汇总对象为data_in
  461. data_describe=data_in.groupby(['change_flag','steps']).agg({'x_v':['mean','min','max'],
  462. 'y_v':['mean','min','max'],
  463. 'z_v':['mean','min','max'],
  464. 'r_v':['mean','min','max'],
  465. 'x_s':['mean','min','max'],
  466. 'y_s':['mean','min','max'],
  467. 'z_s':['mean','min','max'],
  468. 'r_s':['mean','min','max'],
  469. 'x1_toque':['mean','min','max'],
  470. 'x2_toque':['mean','min','max'],
  471. 'y_toque':['mean','min','max'],
  472. 'z_toque':['mean','min','max'],
  473. 'r_toque':['mean','min','max'],
  474. 'pressure_1':['mean','min','max'],
  475. 'pressure_2':['mean','min','max'],
  476. 'pressure_3':['mean','min','max'],
  477. 'pressure_4':['mean','min','max'],
  478. 'dis1_process':['mean','min','max'],
  479. 'dis2_process':['mean','min','max'],
  480. 'lift_code_dist':['mean','min','max']
  481. })
  482. data_describe=data_describe.reset_index()
  483. columns_names=["change_flag",
  484. "steps",
  485. "x_v_mean",
  486. "x_v_min",
  487. "x_v_max",
  488. "y_v_mean",
  489. "y_v_min",
  490. "y_v_max",
  491. "z_v_mean",
  492. "z_v_min",
  493. "z_v_max",
  494. "r_v_mean",
  495. "r_v_min",
  496. "r_v_max",
  497. "x_s_mean",
  498. "x_s_min",
  499. "x_s_max",
  500. "y_s_mean",
  501. "y_s_min",
  502. "y_s_max",
  503. "z_s_mean",
  504. "z_s_min",
  505. "z_s_max",
  506. "r_s_mean",
  507. "r_s_min",
  508. "r_s_max",
  509. "x1_tq_mean",
  510. "x1_tq_min",
  511. "x1_tq_max",
  512. "x2_tq_mean",
  513. "x2_tq_min",
  514. "x2_tq_max",
  515. "y_tq_mean",
  516. "y_tq_min",
  517. "y_tq_max",
  518. "z_tq_mean",
  519. "z_tq_min",
  520. "z_tq_max",
  521. "r_tq_mean",
  522. "r_tq_min",
  523. "r_tq_max",
  524. "pres_1_mean",
  525. "pres_1_min",
  526. "pres_1_max",
  527. "pres_2_mean",
  528. "pres_2_min",
  529. "pres_2_max",
  530. "pres_3_mean",
  531. "pres_3_min",
  532. "pres_3_max",
  533. "pres_4_mean",
  534. "pres_4_min",
  535. "pres_4_max",
  536. "dis1_process_mean",
  537. "dis1_process_min",
  538. "dis1_process_max",
  539. "dis2_process_mean",
  540. "dis2_process_min",
  541. "dis2_process_max",
  542. "lift_code_dist_mean",
  543. "lift_code_dist_min",
  544. "lift_code_dist_max"]
  545. data_describe.columns=columns_names
  546. ##挠度指标
  547. data_z_delta=press_z_delta(data_in,step_list=[6,34])
  548. ###平滑度指标
  549. ##z轴平滑度
  550. ##z轴扭矩
  551. data_z_smooth=data_in[["change_flag","steps","z_toque","z_v"]]
  552. data_z_smooth=data_z_smooth[data_z_smooth["steps"].isin([6,20,34])]
  553. data_z_smooth_tq_max=data_z_smooth.groupby(["change_flag","steps"])["z_toque"].apply(lambda x:smooth(x,100,"max"))
  554. data_z_smooth_tq_max=data_z_smooth_tq_max.reset_index()
  555. data_z_smooth_tq_max.columns=["change_flag","steps","z_toque_smoo_max"]
  556. data_z_smooth_tq_mode=data_z_smooth.groupby(["change_flag","steps"])["z_toque"].apply(lambda x:smooth(x,100,"mode"))
  557. data_z_smooth_tq_mode=data_z_smooth_tq_mode.reset_index()
  558. data_z_smooth_tq_mode.columns=["change_flag","steps","z_toque_smoo_mode"]
  559. data_z_smooth_zv_max=data_z_smooth.groupby(["change_flag","steps"])["z_v"].apply(lambda x:smooth(x,100,"max"))
  560. data_z_smooth_zv_max=data_z_smooth_zv_max.reset_index()
  561. data_z_smooth_zv_max.columns=["change_flag","steps","z_v_smoo_max"]
  562. data_z_smooth_zv_mode=data_z_smooth.groupby(["change_flag","steps"])["z_v"].apply(lambda x:smooth(x,100,"mode"))
  563. data_z_smooth_zv_mode=data_z_smooth_zv_mode.reset_index()
  564. data_z_smooth_zv_mode.columns=["change_flag","steps","z_v_smoo_mode"]
  565. data_y_smooth=data_in[["change_flag","steps","y_toque","y_v"]]
  566. data_y_smooth=data_y_smooth[data_y_smooth["steps"].isin([8,10,38,22,24,36])]
  567. data_y_smooth_tq_max=data_y_smooth.groupby(["change_flag","steps"])["y_toque"].apply(lambda x:smooth(x,100,"max"))
  568. data_y_smooth_tq_max=data_y_smooth_tq_max.reset_index()
  569. data_y_smooth_tq_max.columns=["change_flag","steps","y_toque_smoo_max"]
  570. data_y_smooth_tq_mode=data_y_smooth.groupby(["change_flag","steps"])["y_toque"].apply(lambda x:smooth(x,100,"mode"))
  571. data_y_smooth_tq_mode=data_y_smooth_tq_mode.reset_index()
  572. data_y_smooth_tq_mode.columns=["change_flag","steps","y_toque_smoo_mode"]
  573. data_y_smooth_yv_max=data_y_smooth.groupby(["change_flag","steps"])["y_v"].apply(lambda x:smooth(x,100,"max"))
  574. data_y_smooth_yv_max=data_y_smooth_yv_max.reset_index()
  575. data_y_smooth_yv_max.columns=["change_flag","steps","y_v_smoo_max"]
  576. data_y_smooth_yv_mode=data_y_smooth.groupby(["change_flag","steps"])["y_v"].apply(lambda x:smooth(x,100,"mode"))
  577. data_y_smooth_yv_mode=data_y_smooth_yv_mode.reset_index()
  578. data_y_smooth_yv_mode.columns=["change_flag","steps","y_v_smoo_mode"]
  579. data_x_smooth=data_in[["change_flag","steps","x1_toque","x2_toque","x_v"]]
  580. data_x_smooth=data_x_smooth[data_x_smooth["steps"].isin([1,9,16,23,30,37])]
  581. data_x1_smooth_tq_max=data_x_smooth.groupby(["change_flag","steps"])["x1_toque"].apply(lambda x:smooth(x,100,"max"))
  582. data_x1_smooth_tq_max=data_x1_smooth_tq_max.reset_index()
  583. data_x1_smooth_tq_max.columns=["change_flag","steps","x1_toque_smoo_max"]
  584. data_x1_smooth_tq_mode=data_x_smooth.groupby(["change_flag","steps"])["x1_toque"].apply(lambda x:smooth(x,100,"mode"))
  585. data_x1_smooth_tq_mode=data_x1_smooth_tq_mode.reset_index()
  586. data_x1_smooth_tq_mode.columns=["change_flag","steps","x1_toque_smoo_mode"]
  587. data_x2_smooth_tq_max=data_x_smooth.groupby(["change_flag","steps"])["x2_toque"].apply(lambda x:smooth(x,100,"max"))
  588. data_x2_smooth_tq_max=data_x2_smooth_tq_max.reset_index()
  589. data_x2_smooth_tq_max.columns=["change_flag","steps","x2_toque_smoo_max"]
  590. data_x2_smooth_tq_mode=data_x_smooth.groupby(["change_flag","steps"])["x2_toque"].apply(lambda x:smooth(x,100,"mode"))
  591. data_x2_smooth_tq_mode=data_x2_smooth_tq_mode.reset_index()
  592. data_x2_smooth_tq_mode.columns=["change_flag","steps","x2_toque_smoo_mode"]
  593. data_x_smooth_xv_max=data_x_smooth.groupby(["change_flag","steps"])["x_v"].apply(lambda x:smooth(x,100,"max"))
  594. data_x_smooth_xv_max=data_x_smooth_xv_max.reset_index()
  595. data_x_smooth_xv_max.columns=["change_flag","steps","x_v_smoo_max"]
  596. data_x_smooth_xv_mode=data_x_smooth.groupby(["change_flag","steps"])["x_v"].apply(lambda x:smooth(x,100,"mode"))
  597. data_x_smooth_xv_mode=data_x_smooth_xv_mode.reset_index()
  598. data_x_smooth_xv_mode.columns=["change_flag","steps","x_v_smoo_mode"]
  599. ###相似度指标
  600. ##z轴的相似度指标
  601. ##z轴扭矩的相似度
  602. var_list=["change_flag","steps","z_toque"]
  603. var_rename_list=["change_flag","steps","z_toque_cosine"]
  604. step_list=[6,20,34]
  605. para_std_list=para_base["z_toque_para"]
  606. z_tq_cosine=cosine_sim_result(data_in,var_list,var_rename_list,step_list,para_std_list)
  607. var_list=["change_flag","steps","z_v"]
  608. var_rename_list=["change_flag","steps","z_v_cosine"]
  609. step_list=[6,20,34]
  610. para_std_list=para_base["z_v_para"]
  611. z_v_cosine=cosine_sim_result(data_in,var_list,var_rename_list,step_list,para_std_list)
  612. var_list=["change_flag","steps","y_toque"]
  613. var_rename_list=["change_flag","steps","y_toque_cosine"]
  614. step_list=[8,10,38,22,24,36]
  615. para_std_list=para_base["y_toque_para"]
  616. y_tq_cosine=cosine_sim_result(data_in,var_list,var_rename_list,step_list,para_std_list)
  617. var_list=["change_flag","steps","y_v"]
  618. var_rename_list=["change_flag","steps","y_v_cosine"]
  619. step_list=[8,10,38,22,24,36]
  620. para_std_list=para_base["y_v_para"]
  621. y_v_cosine=cosine_sim_result(data_in,var_list,var_rename_list,step_list,para_std_list)
  622. var_list=["change_flag","steps","x1_toque"]
  623. var_rename_list=["change_flag","steps","x1_toque_cosine"]
  624. step_list=[9]
  625. para_std_list=para_base["x1_toque_para"]
  626. x1_tq_cosine=cosine_sim_result(data_in,var_list,var_rename_list,step_list,para_std_list)
  627. var_list=["change_flag","steps","x2_toque"]
  628. var_rename_list=["change_flag","steps","x2_toque_cosine"]
  629. step_list=[9]
  630. para_std_list=para_base["x2_toque_para"]
  631. x2_tq_cosine=cosine_sim_result(data_in,var_list,var_rename_list,step_list,para_std_list)
  632. var_list=["change_flag","steps","x_v"]
  633. var_rename_list=["change_flag","steps","x_v_cosine"]
  634. step_list=[9]
  635. para_std_list=para_base["x_v_para"]
  636. x_v_cosine=cosine_sim_result(data_in,var_list,var_rename_list,step_list,para_std_list)
  637. ###吊具到位时间差的计算
  638. data_lift_onplace_delta=lift_onplace_delta(data_in,step_list=[4,18,32])
  639. data_seat_onplace_delta=seat_onplace_delta(data_in,step_list=[12,26,40])
  640. ###基于换电过程和换电步骤的汇总
  641. ##基表time_group_steps
  642. group_steps_base=time_group_steps[["time2","time","time_delta","change_flag","steps"]]
  643. group_steps_base.columns=["step_time_b","step_time_e","step_time","change_flag","steps"]
  644. ##关联转锁
  645. ##将转锁的数据合并
  646. ##转锁的反应时间
  647. block1_f_union=pd.concat([result_f51,result_f131,result_f191,result_f271,result_f331,result_f411])
  648. block1_f_union.columns=['change_flag','steps','block1_f_time']
  649. block2_f_union=pd.concat([result_f52,result_f132,result_f192,result_f272,result_f332,result_f412])
  650. block2_f_union.columns=['change_flag','steps','block2_f_time']
  651. block3_f_union=pd.concat([result_f53,result_f133,result_f193,result_f273,result_f333,result_f413])
  652. block3_f_union.columns=['change_flag','steps','block3_f_time']
  653. block4_f_union=pd.concat([result_f54,result_f134,result_f194,result_f274,result_f334,result_f414])
  654. block4_f_union.columns=['change_flag','steps','block4_f_time']
  655. block1_r_union=pd.concat([result_r51,result_r131,result_r191,result_r271,result_r331,result_r411])
  656. block1_r_union.columns=['change_flag','steps','block1_r_time']
  657. block2_r_union=pd.concat([result_r52,result_r132,result_r192,result_r272,result_r332,result_r412])
  658. block2_r_union.columns=['change_flag','steps','block2_r_time']
  659. block3_r_union=pd.concat([result_r53,result_r133,result_r193,result_r273,result_r333,result_r413])
  660. block3_r_union.columns=['change_flag','steps','block3_r_time']
  661. block4_r_union=pd.concat([result_r54,result_r134,result_r194,result_r274,result_r334,result_r414])
  662. block4_r_union.columns=['change_flag','steps','block4_r_time']
  663. ###关联转锁的反应时间
  664. group_steps_base=pd.merge(group_steps_base,block1_f_union,on=['change_flag','steps'],how='left')
  665. group_steps_base=pd.merge(group_steps_base,block2_f_union,on=['change_flag','steps'],how='left')
  666. group_steps_base=pd.merge(group_steps_base,block3_f_union,on=['change_flag','steps'],how='left')
  667. group_steps_base=pd.merge(group_steps_base,block4_f_union,on=['change_flag','steps'],how='left')
  668. ##关联运动时间
  669. group_steps_base=pd.merge(group_steps_base,block1_r_union,on=['change_flag','steps'],how='left')
  670. group_steps_base=pd.merge(group_steps_base,block2_r_union,on=['change_flag','steps'],how='left')
  671. group_steps_base=pd.merge(group_steps_base,block3_r_union,on=['change_flag','steps'],how='left')
  672. group_steps_base=pd.merge(group_steps_base,block4_r_union,on=['change_flag','steps'],how='left')
  673. ###关联推杆
  674. pushrod2_f_union=pd.concat([result_f72,result_f112,result_f212,result_f252,result_f352,result_f392])
  675. pushrod2_f_union.columns=['change_flag','steps','pushrod2_f_time']
  676. pushrod3_f_union=pd.concat([result_f73,result_f113,result_f213,result_f253,result_f353,result_f393])
  677. pushrod3_f_union.columns=['change_flag','steps','pushrod3_f_time']
  678. pushrod2_r_union=pd.concat([result_r72,result_r112,result_r212,result_r252,result_r352,result_r392])
  679. pushrod2_r_union.columns=['change_flag','steps','pushrod2_r_time']
  680. pushrod3_r_union=pd.concat([result_r73,result_r113,result_r213,result_r253,result_r353,result_r393])
  681. pushrod3_r_union.columns=['change_flag','steps','pushrod3_r_time']
  682. ##关联推杆反应时间
  683. group_steps_base=pd.merge(group_steps_base,pushrod2_f_union,on=['change_flag','steps'],how='left')
  684. group_steps_base=pd.merge(group_steps_base,pushrod3_f_union,on=['change_flag','steps'],how='left')
  685. group_steps_base=pd.merge(group_steps_base,pushrod2_r_union,on=['change_flag','steps'],how='left')
  686. group_steps_base=pd.merge(group_steps_base,pushrod3_r_union,on=['change_flag','steps'],how='left')
  687. ##关联故障码
  688. group_steps_base=pd.merge(group_steps_base,error_code,on=['change_flag','steps'],how='left')
  689. ##关联暂停
  690. group_steps_base=pd.merge(group_steps_base,pause_result_steps,on=['change_flag','steps'],how='left')
  691. ##关联急停
  692. group_steps_base=pd.merge(group_steps_base,stop_result_steps,on=['change_flag','steps'],how='left')
  693. ##关联其他指标
  694. group_steps_base=pd.merge(group_steps_base,data_describe,on=['change_flag','steps'],how='left')
  695. ##关联挠度相关指标
  696. group_steps_base=pd.merge(group_steps_base,data_z_delta,on=['change_flag','steps'],how='left')
  697. ##关联平滑度指标
  698. group_steps_base=pd.merge(group_steps_base,data_z_smooth_tq_max,on=['change_flag','steps'],how='left')
  699. group_steps_base=pd.merge(group_steps_base,data_z_smooth_tq_mode,on=['change_flag','steps'],how='left')
  700. group_steps_base=pd.merge(group_steps_base,data_z_smooth_zv_max,on=['change_flag','steps'],how='left')
  701. group_steps_base=pd.merge(group_steps_base,data_z_smooth_zv_mode,on=['change_flag','steps'],how='left')
  702. group_steps_base=pd.merge(group_steps_base,data_y_smooth_tq_max,on=['change_flag','steps'],how='left')
  703. group_steps_base=pd.merge(group_steps_base,data_y_smooth_tq_mode,on=['change_flag','steps'],how='left')
  704. group_steps_base=pd.merge(group_steps_base,data_y_smooth_yv_max,on=['change_flag','steps'],how='left')
  705. group_steps_base=pd.merge(group_steps_base,data_y_smooth_yv_mode,on=['change_flag','steps'],how='left')
  706. group_steps_base=pd.merge(group_steps_base,data_x1_smooth_tq_max,on=['change_flag','steps'],how='left')
  707. group_steps_base=pd.merge(group_steps_base,data_x1_smooth_tq_mode,on=['change_flag','steps'],how='left')
  708. group_steps_base=pd.merge(group_steps_base,data_x2_smooth_tq_max,on=['change_flag','steps'],how='left')
  709. group_steps_base=pd.merge(group_steps_base,data_x2_smooth_tq_mode,on=['change_flag','steps'],how='left')
  710. group_steps_base=pd.merge(group_steps_base,data_x_smooth_xv_max,on=['change_flag','steps'],how='left')
  711. group_steps_base=pd.merge(group_steps_base,data_x_smooth_xv_mode,on=['change_flag','steps'],how='left')
  712. ###关联相似度
  713. group_steps_base=pd.merge(group_steps_base,z_tq_cosine,on=['change_flag','steps'],how='left')
  714. group_steps_base=pd.merge(group_steps_base,z_v_cosine,on=['change_flag','steps'],how='left')
  715. group_steps_base=pd.merge(group_steps_base,y_tq_cosine,on=['change_flag','steps'],how='left')
  716. group_steps_base=pd.merge(group_steps_base,y_v_cosine,on=['change_flag','steps'],how='left')
  717. group_steps_base=pd.merge(group_steps_base,x1_tq_cosine,on=['change_flag','steps'],how='left')
  718. group_steps_base=pd.merge(group_steps_base,x2_tq_cosine,on=['change_flag','steps'],how='left')
  719. group_steps_base=pd.merge(group_steps_base,x_v_cosine,on=['change_flag','steps'],how='left')
  720. ##关联吊具到位时间差
  721. group_steps_base=pd.merge(group_steps_base,data_lift_onplace_delta,on=['change_flag','steps'],how='left')
  722. ##关联落座到位时间差
  723. group_steps_base=pd.merge(group_steps_base,data_seat_onplace_delta,on=['change_flag','steps'],how='left')
  724. group_steps_base=group_steps_base.round(3)
  725. return group_steps_base,group_base