measurepoint2405.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. # -*- coding: utf-8 -*-
  2. """
  3. Spyder 编辑器
  4. 这是一个临时脚本文件。
  5. """
  6. import os
  7. import pandas as pd
  8. pd.set_option('chained_assignment', None)
  9. select_cols = ['遥测ID号', '风场', '风场几期', '风机号', '测点', '标准化中文', '转发顺序号', 'en_name']
  10. origin_col_map = {
  11. 'wind_turbine_number': '风机编号', 'wind_turbine_name': '风机原始名称', 'time_stamp': '时间戳',
  12. 'active_power': '有功功率', 'rotor_speed': '风轮转速', 'generator_speed': '发电机转速', 'wind_velocity': '风速',
  13. 'pitch_angle_blade_1': '桨距角1', 'pitch_angle_blade_2': '桨距角2', 'pitch_angle_blade_3': '桨距角3',
  14. 'cabin_position': '机舱位置', 'true_wind_direction': '绝对风向', 'yaw_error1': '对风角度',
  15. 'set_value_of_active_power': '有功功率设定值', 'gearbox_oil_temperature': '齿轮箱油温',
  16. 'generatordrive_end_bearing_temperature': '发电机驱动端轴承温度',
  17. 'generatornon_drive_end_bearing_temperature': '发电机非驱动端轴承温度', 'cabin_temperature': '机舱内温度',
  18. 'twisted_cable_angle': '扭缆角度', 'front_back_vibration_of_the_cabin': '机舱前后振动',
  19. 'side_to_side_vibration_of_the_cabin': '机舱左右振动', 'actual_torque': '实际力矩', 'given_torque': '给定力矩',
  20. 'clockwise_yaw_count': '顺时针偏航次数', 'counterclockwise_yaw_count': '逆时针偏航次数', 'unusable': '不可利用',
  21. 'power_curve_available': '功率曲线可用', 'required_gearbox_speed': '齿轮箱转速',
  22. 'inverter_speed_master_control': '变频器转速(主控)', 'outside_cabin_temperature': '环境温度',
  23. 'main_bearing_temperature': '主轴承轴承温度',
  24. 'gearbox_high_speed_shaft_bearing_temperature': '齿轮箱高速轴轴承温度',
  25. 'gearboxmedium_speed_shaftbearing_temperature': '齿轮箱中速轴轴承温度',
  26. 'gearbox_low_speed_shaft_bearing_temperature': '齿轮箱低速轴轴承温度',
  27. 'generator_winding1_temperature': '发电机绕组1温度', 'generator_winding2_temperature': '发电机绕组2温度',
  28. 'generator_winding3_temperature': '发电机绕组3温度', 'wind_turbine_status': '风机状态1',
  29. 'wind_turbine_status2': '风机状态2', 'turbulence_intensity': '湍流强度'
  30. }
  31. table_exists_cols = ['wind_turbine_number', 'wind_turbine_name', 'time_stamp', 'active_power', 'rotor_speed',
  32. 'generator_speed', 'wind_velocity', 'pitch_angle_blade_1', 'pitch_angle_blade_2',
  33. 'pitch_angle_blade_3', 'cabin_position', 'true_wind_direction', 'yaw_error1',
  34. 'set_value_of_active_power', 'gearbox_oil_temperature', 'generatordrive_end_bearing_temperature',
  35. 'generatornon_drive_end_bearing_temperature', 'cabin_temperature', 'twisted_cable_angle',
  36. 'front_back_vibration_of_the_cabin', 'side_to_side_vibration_of_the_cabin', 'actual_torque',
  37. 'given_torque', 'clockwise_yaw_count', 'counterclockwise_yaw_count', 'unusable',
  38. 'power_curve_available', 'required_gearbox_speed', 'inverter_speed_master_control',
  39. 'outside_cabin_temperature', 'main_bearing_temperature',
  40. 'gearbox_high_speed_shaft_bearing_temperature', 'gearboxmedium_speed_shaftbearing_temperature',
  41. 'gearbox_low_speed_shaft_bearing_temperature', 'generator_winding1_temperature',
  42. 'generator_winding2_temperature', 'generator_winding3_temperature', 'wind_turbine_status',
  43. 'wind_turbine_status2', 'turbulence_intensi']
  44. def yangqu_measurepoint(df):
  45. df['风场几期'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('_')[1].split('-')[0][0:4])
  46. df['风场'] = df['风场几期'].apply(lambda x: x[0:2])
  47. df['风机号'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('_')[1].split('-')[1][0:3])
  48. df['测点'] = df['遥测ID号'].apply(
  49. lambda x: ''.join(x.replace('遥测值', '').strip().split(' ')[1:]).split('_')[1].split('-')[1][3:])
  50. show_measurepoint(df, '阳曲测点')
  51. col_mapping = {
  52. "机舱中轴线与风向夹角": "yaw_error1",
  53. "风向": "true_wind_direction",
  54. "舱外温度": "outside_cabin_temperature",
  55. "扭揽角度": "twisted_cable_angle",
  56. "1#桨叶片角度": "pitch_angle_blade_1",
  57. "2#桨叶片角度": "pitch_angle_blade_2",
  58. "3#桨叶片角度": "pitch_angle_blade_3",
  59. "发电机转速": "generator_speed",
  60. "发电机有功功率": "active_power",
  61. "机舱侧向振动(已滤波)": "side_to_side_vibration_of_the_cabin",
  62. "机舱轴向振动(已滤波)": "front_back_vibration_of_the_cabin",
  63. "舱内温度": "cabin_temperature",
  64. "风速": "wind_velocity",
  65. "发电机前轴承温度1": "generatordrive_end_bearing_temperature", # 根据规则,发电机前轴承对应驱动端轴承
  66. "发电机后轴承温度1": "generatornon_drive_end_bearing_temperature", # 根据规则,发电机后轴承对应非驱动端轴承
  67. }
  68. df['en_name'] = df['测点'].map(col_mapping)
  69. print(df.groupby('en_name').count())
  70. df.sort_values(by='转发顺序号', inplace=True)
  71. save_df(df, '阳曲测点')
  72. return df
  73. def xipan_measurepoint(df):
  74. df['风场几期'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('_')[1][0:4])
  75. df['风场'] = df['风场几期'].apply(lambda x: x[0:2])
  76. df['风机号'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('_')[1][6:])
  77. df['测点'] = df['遥测ID号'].apply(
  78. lambda x: ''.join(x.replace('遥测值', '').strip().split(' ')[2]))
  79. show_measurepoint(df, '西潘测点')
  80. col_mapping = {
  81. "风速": "wind_velocity",
  82. "机舱与风向夹角": "yaw_error1",
  83. "风向": "true_wind_direction",
  84. "舱外温度": "outside_cabin_temperature",
  85. "偏航角度(扭缆角度)": "twisted_cable_angle",
  86. "1#桨叶片角度(桨距角)": "pitch_angle_blade_1",
  87. "2#桨叶片角度(桨距角)": "pitch_angle_blade_2",
  88. "3#桨叶片角度(桨距角)": "pitch_angle_blade_3",
  89. "发电机有功功率": "active_power",
  90. "舱内温度": "cabin_temperature",
  91. "发电机转速": "generator_speed",
  92. "桨叶1位置给定": "pitch_angle_blade_1", # 假设为桨叶1的位置给定值
  93. "桨叶2位置给定": "pitch_angle_blade_2", # 假设为桨叶2的位置给定值
  94. "桨叶3位置给定": "pitch_angle_blade_3", # 假设为桨叶3的位置给定值
  95. "机舱位置": "cabin_position",
  96. "齿轮箱油温": "gearbox_oil_temperature",
  97. "发电机定子L1绕组温度": "generator_winding1_temperature", # 假设L1对应U相
  98. "发电机定子L2绕组温度": "generator_winding2_temperature", # 假设L2对应V相
  99. "发电机定子L3绕组温度": "generator_winding3_temperature", # 假设L3对应W相
  100. "发电机驱动端轴承温度": "generatordrive_end_bearing_temperature",
  101. "发电机非驱动端轴承温度": "generatornon_drive_end_bearing_temperature",
  102. "电网有功功率": "active_power", # 假设为电网有功功率
  103. "实时风速": "wind_velocity", # 假设为实时风速
  104. "3s风向(0-360度)": "true_wind_direction", # 假设为3秒平均风向
  105. "主轴温度": "main_bearing_temperature", # 假设为主轴温度
  106. }
  107. df['en_name'] = df['测点'].map(col_mapping)
  108. print(df.groupby('en_name').count())
  109. df.sort_values(by='转发顺序号', inplace=True)
  110. save_df(df, '西潘测点')
  111. return df
  112. def majialiang_measurepoint(df, name):
  113. # 根据马家梁数据格式调整字段提取逻辑
  114. df['风场几期'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('_')[1][0:5])
  115. df['风场'] = df['风场几期'].apply(lambda x: x[0:len(name)])
  116. # 假设风机号在第三个分割段中
  117. df['风机号'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('-')[1][0:3])
  118. # 测点提取可能需要调整切片位置
  119. df['测点'] = df['遥测ID号'].apply(
  120. lambda x: ''.join(x.replace('遥测值', '').strip().split(' ')[1:]).split('_')[1].split('-')[1][3:])
  121. show_measurepoint(df, name + '测点')
  122. col_mapping = {
  123. "风速": "wind_velocity",
  124. "机舱与风向夹角": "yaw_error1",
  125. "风向": "true_wind_direction",
  126. "偏航角度(扭缆角度)": "twisted_cable_angle",
  127. "1#桨叶片角度(桨距角)": "pitch_angle_blade_1",
  128. "2#桨叶片角度(桨距角)": "pitch_angle_blade_2",
  129. "3#桨叶片角度(桨距角)": "pitch_angle_blade_3",
  130. "发电机有功功率": "active_power",
  131. "发电机前轴承温度1": "generatordrive_end_bearing_temperature", # 前轴承对应驱动端
  132. "发电机后轴承温度1": "generatornon_drive_end_bearing_temperature", # 后轴承对应非驱动端
  133. "有功功率": "active_power", # 与“发电机有功功率”相同
  134. "瞬时风速": "wind_velocity", # 假设为瞬时风速
  135. "风向角": "yaw_error1", # 与“风向”相同
  136. "桨距角1": "pitch_angle_blade_1", # 与“1#桨叶片角度(桨距角)”相同
  137. "桨距角2": "pitch_angle_blade_2", # 与“2#桨叶片角度(桨距角)”相同
  138. "桨距角3": "pitch_angle_blade_3", # 与“3#桨叶片角度(桨距角)”相同
  139. "发电机转速": "generator_speed",
  140. "发电机定子U温度": "generator_winding1_temperature", # U相温度
  141. "发电机定子V温度": "generator_winding2_temperature", # V相温度
  142. "发电机定子W温度": "generator_winding3_temperature", # W相温度
  143. "驱动端轴承温度": "generatordrive_end_bearing_temperature", # 与“发电机前轴承温度1”相同
  144. "高速轴承温度": "gearbox_high_speed_shaft_bearing_temperature", # 假设为齿轮箱高速轴轴承温度
  145. "舱外温度": "outside_cabin_temperature",
  146. "舱内温度": "cabin_temperature",
  147. }
  148. df['en_name'] = df['测点'].map(col_mapping)
  149. print(df.groupby('en_name').count())
  150. df.sort_values(by='转发顺序号', inplace=True)
  151. save_df(df, name + '测点')
  152. return df
  153. def fufeng_measurepoint(df):
  154. # 根据孟县数据格式调整字段提取逻辑
  155. df['风场几期'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('_')[0])
  156. df['风场'] = df['风场几期'].apply(lambda x: x[0:2])
  157. # 假设风机号在第三个分割段中
  158. df['风机号'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('-')[1])
  159. # 测点提取可能需要调整切片位置
  160. df['测点'] = df['遥测ID号'].apply(
  161. lambda x: ''.join(x.replace('遥测值', '').strip().split(' ')[2:]))
  162. show_measurepoint(df, '富风测点')
  163. col_mapping = {
  164. "机组有功功率": "active_power",
  165. "机组1#叶片变桨角度": "pitch_angle_blade_1",
  166. "机组2#叶片变桨角度": "pitch_angle_blade_2",
  167. "机组3#叶片变桨角度": "pitch_angle_blade_3",
  168. "机组主轴前轴承温度": "main_bearing_temperature", # 假设为主轴前轴承温度
  169. "机组齿轮箱油池温度": "gearbox_oil_temperature",
  170. "机组发电机转速": "generator_speed",
  171. "机组发电机绕组u1温度": "generator_winding1_temperature", # 假设u1对应U相
  172. "机组发电机绕组v1温度": "generator_winding2_temperature", # 假设v1对应V相
  173. "机组发电机绕组w1温度": "generator_winding3_temperature", # 假设w1对应W相
  174. "机组发电机前轴承温度": "generatordrive_end_bearing_temperature", # 前轴承对应驱动端
  175. "机组发电机后轴承温度": "generatornon_drive_end_bearing_temperature", # 后轴承对应非驱动端
  176. "机组瞬时风速": "wind_velocity", # 假设为瞬时风速
  177. "机组瞬时风向": "true_wind_direction", # 假设为瞬时风向
  178. "机组环境温度": "outside_cabin_temperature", # 假设环境温度为舱外温度
  179. "机组机舱温度": "cabin_temperature",
  180. "机组机舱X方向振动": "side_to_side_vibration_of_the_cabin", # 假设X方向为侧向振动
  181. "机组机舱Y方向振动": "front_back_vibration_of_the_cabin", # 假设Y方向为轴向振动
  182. }
  183. df['en_name'] = df['测点'].map(col_mapping)
  184. print(df.groupby('en_name').count())
  185. df.sort_values(by='转发顺序号', inplace=True)
  186. save_df(df, '富风测点')
  187. return df
  188. def podi_measurepoint(df):
  189. # 坡底数据格式处理
  190. df['风场几期'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1][0:4])
  191. df['风场'] = df['风场几期'].apply(lambda x: x[0:2])
  192. # 假设风机号在第三个分割段中
  193. df['风机号'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('-')[1][0:2])
  194. # 测点提取可能需要调整切片位置
  195. df['测点'] = df['遥测ID号'].apply(
  196. lambda x: ''.join(x.replace('遥测值', '').strip().split(' ')[2:]))
  197. show_measurepoint(df, '坡底测点')
  198. col_mapping = {
  199. "主轴转速": "rotor_speed",
  200. "发电机转速": "generator_speed",
  201. "风向": "true_wind_direction",
  202. "风速": "wind_velocity",
  203. "机舱温度": "cabin_temperature",
  204. "室外温度": "outside_cabin_temperature",
  205. "主轴轴承温度": "main_bearing_temperature", # 假设主轴轴承温度对应主轴承温度
  206. "齿轮箱高速轴承端温度": "gearbox_high_speed_shaft_bearing_temperature", # 假设为齿轮箱高速轴轴承温度
  207. "发电机驱动端温度": "generatordrive_end_bearing_temperature", # 驱动端轴承温度
  208. "发电机非驱动端温度": "generatornon_drive_end_bearing_temperature", # 非驱动端轴承温度
  209. "扭缆角度": "twisted_cable_angle",
  210. "轴1桨叶实际角度": "pitch_angle_blade_1", # 假设轴1对应1#桨叶
  211. "轴2桨叶实际角度": "pitch_angle_blade_2", # 假设轴2对应2#桨叶
  212. "轴3桨叶实际角度": "pitch_angle_blade_3", # 假设轴3对应3#桨叶
  213. "机舱Y方向振动值": "front_back_vibration_of_the_cabin", # 假设Y方向为轴向振动
  214. "机舱X方向振动值": "side_to_side_vibration_of_the_cabin", # 假设X方向为侧向振动
  215. "有功功率": "active_power",
  216. }
  217. df['en_name'] = df['测点'].map(col_mapping)
  218. print(df.groupby('en_name').count())
  219. df.sort_values(by='转发顺序号', inplace=True)
  220. save_df(df, '坡底测点')
  221. return df
  222. def hejiagou_measurepoint(df):
  223. # 贺家沟数据格式处理
  224. df['风场几期'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('_')[1][0:5])
  225. df['风场'] = df['风场几期'].apply(lambda x: x[0:3])
  226. # 假设风机号在第三个分割段中
  227. df['风机号'] = df['遥测ID号'].apply(lambda x: x.split(' ')[1].split('-')[1])
  228. # 测点提取可能需要调整切片位置
  229. df['测点'] = df['遥测ID号'].apply(
  230. lambda x: ''.join(x.replace('遥测值', '').strip().split(' ')[2]))
  231. show_measurepoint(df, '贺家沟测点')
  232. col_mapping = {
  233. "环境温度": "outside_cabin_temperature", # 假设环境温度为舱外温度
  234. "风速1s": "wind_velocity", # 假设为1秒平均风速
  235. "绝对风向": "true_wind_direction", # 假设为绝对风向
  236. "桨角1": "pitch_angle_blade_1", # 1#桨叶角度
  237. "桨角2": "pitch_angle_blade_2", # 2#桨叶角度
  238. "桨角3": "pitch_angle_blade_3", # 3#桨叶角度
  239. "发电机转速": "generator_speed",
  240. # "齿轮箱转速": "generator_speed", # 假设为齿轮箱转速
  241. "发电机U相温度": "generator_winding1_temperature", # U相温度
  242. "发电机V相温度": "generator_winding2_temperature", # V相温度
  243. "发电机W相温度": "generator_winding3_temperature", # W相温度
  244. "发电机轴承温度": "generatordrive_end_bearing_temperature", # 假设为发电机轴承温度(未区分驱动端和非驱动端)
  245. "齿轮箱高速轴前轴承温度": "gearbox_high_speed_shaft_bearing_temperature", # 假设为齿轮箱高速轴前轴承温度
  246. "机舱内温度": "cabin_temperature",
  247. "变流器有功功率": "active_power", # 假设为变流器有功功率
  248. "塔筒左右振动": "side_to_side_vibration_of_the_cabin", # 假设为塔筒左右振动
  249. "塔筒前后振动": "front_back_vibration_of_the_cabin", # 假设为塔筒前后振动
  250. }
  251. df['en_name'] = df['测点'].map(col_mapping)
  252. print(df.groupby('en_name').count())
  253. df.sort_values(by='转发顺序号', inplace=True)
  254. save_df(df, '贺家沟测点')
  255. return df
  256. def not_in_exists_col(df):
  257. print("jinrule")
  258. tuple_datas = set()
  259. for feichang, fengji, cedian, col in zip(df['风场'], df['风机号'], df['测点'], df['en_name']):
  260. if col not in table_exists_cols:
  261. tuple_datas.add((feichang, cedian, col))
  262. # print(feichang, cedian, col)
  263. for col in tuple_datas:
  264. print(col)
  265. print('-----------------')
  266. def show_measurepoint(df, name):
  267. print(f'--------{name}-----------')
  268. for cn_name in df['测点'].unique():
  269. print(f"{cn_name}:'',")
  270. print('-------------------')
  271. def save_df(df, name):
  272. df['遥测ID号'] = df['遥测ID号'].apply(lambda x: x.replace('遥测定义表 ', '').replace('遥测值', '').strip())
  273. df['标准化中文'] = df['en_name'].map(origin_col_map)
  274. df.to_csv(r'C:\Users\wzl\Desktop\中广核104测点\2405' + os.sep + str(name) + '.csv',
  275. columns=select_cols,
  276. index=False, encoding='utf8')
  277. if __name__ == '__main__':
  278. # df = pd.read_csv(r"D:\data\tmp\2405ZF.csv", encoding='gbk')
  279. df = pd.read_csv(r"D:\data\tmp\2405ZF.csv", encoding='utf8')
  280. # 添加阳曲处理
  281. yangqu_df = yangqu_measurepoint(df[df['遥测ID号'].str.contains('阳曲')])
  282. # 添加西潘处理
  283. xipan_df = xipan_measurepoint(df[df['遥测ID号'].str.contains('西潘')])
  284. # 添加马家梁处理
  285. majialiang_df = majialiang_measurepoint(df[df['遥测ID号'].str.contains('马家梁')], '马家梁')
  286. # 添加富风处理
  287. fufeng_df = fufeng_measurepoint(df[df['遥测ID号'].str.contains('富风')])
  288. # 添加坡底处理
  289. podi_df = podi_measurepoint(df[df['遥测ID号'].str.contains('坡底')])
  290. # 添加贺家沟处理
  291. hejiagou_df = hejiagou_measurepoint(df[df['遥测ID号'].str.contains('贺家沟')])
  292. result_df = pd.concat([yangqu_df, xipan_df, majialiang_df, fufeng_df, podi_df, hejiagou_df])
  293. not_in_exists_col(result_df)
  294. save_df(result_df, '2405测点')