def get_data(params_, data_id): """ 获取数据 铁次时间表 :param params_: :param data_id: :return: """ if isinstance(data_id, int): print("只使用了数据批次编码值为%d的数据" % data_id) df_ = get_df(params_[0], data_id) df_iron_time = get_time_table(data_id) elif isinstance(data_id, str): if data_id == 'all': # 导入所以数据 df19_ = get_df(params_[0], 19) df20_ = get_df(params_[0], 20) df201_ = get_df(params_[0], 201) df_ = pd.concat([df19_, df20_, df201_]) time_table19 = get_time_table(19) time_table20 = get_time_table(20) time_table201 = get_time_table(201) df_iron_time = pd.concat( [time_table19, time_table20, time_table201]) else: raise UserWarning("参数data_id输入错误") else: raise UserWarning("参数data_id输入错误") return df_, df_iron_time
def process_time_data(params): """ 数据必须 有 有效的!! 业务处理时间!! 收入指标名称 输出 整理好的一分钟频率采集的数据表 在同一个pkl文件的处理 """ res = pd.DataFrame() # 19 20 年的数据都读取进来 df19 = get_df(params[0], 19) df20 = get_df(params[0], 20) df = pd.concat([df19, df20]) df['采集项值'] = pd.to_numeric(df['采集项值']) # 格式化 df['业务处理时间'] = pd.to_datetime(df['业务处理时间']) # 格式化 df['采集项值'][df['采集项值'] > 1e7] = None # 去除 99999 for param in params: grouped = df.groupby('采集项名称').get_group(param) grouped = grouped.set_index('业务处理时间') resampled = grouped.resample('1T').agg(np.mean).rename( columns={'采集项值': param}) # 重采样1min temp = resampled.interpolate() # 线性插值 res = pd.merge(res, temp, how="outer", left_index=True, right_index=True) return res
def get_df_format(self, input_param): """ 获取指标含有指标数据表时 处理好格式 :param input_table: :param input_param: :return: """ df_ = get_df(input_param, self.table) if '业务处理时间' in df_.columns: # df_['业务处理时间'] = df_['业务处理时间'].apply(pd.to_datetime) df_['业务处理时间'] = pd.to_datetime(df_['业务处理时间']) df_['业务处理时间'] = df_['业务处理时间'].dt.floor('d') # 时间对天取整数 if '采集项值' in df_.columns: # df_['采集项值'] = df_['采集项值'].apply(pd.to_numeric) 此代码处理费时 df_['采集项值'] = pd.to_numeric(df_['采集项值']) # 在这进行 去除999的操作 # df_['采集项值'][df_['采集项值'] > 1e7] = np.nan df_['采集项值'].where(df_['采集项值'] < 1e7, inplace=True) if '铁次号' in df_.columns and df_['铁次号'][0] != ' ': df_['铁次号'] = pd.to_numeric(df_['铁次号']) # 速度提升 # 提取出#2高炉的数据 df_ = df_[df_['铁次号'] >= 20000000] df_ = df_[df_['铁次号'] < 30000000] df_.sort_values('铁次号', inplace=True) return df_
def get_iron_speed(table): """ 通过出铁速率 计算 每小时高炉利用系数 :param table: 19 or 20 :return: """ df_iron_speed = get_df("出铁速率", table) df_iron_speed = df_iron_speed.groupby("采集项名称").get_group("出铁速率") # 格式化 df_iron_speed['采集项值'] = pd.to_numeric(df_iron_speed['采集项值']) df_iron_speed["业务处理时间"] = pd.to_datetime(df_iron_speed["业务处理时间"]) df_iron_speed["业务处理时间"][df_iron_speed['采集项值'] > 1e7] = np.nan df_iron_speed.dropna(inplace=True) df_time_indexed = df_iron_speed.set_index("业务处理时间").sort_index() # df_time_indexed['采集项值'].plot() # plt.show() time_table = get_time_table(table) res = time_table.apply(lambda x: df_time_indexed.loc[x['受铁开始时间']:x['受铁结束时间'], '采集项值'].mean(), axis=1) res = res * 60 / 1750 # plt.scatter(res.index, res.values) # plt.show() return res, df_time_indexed
def get_df(self, param): """ 给出 dataframe 数据 :param param: 指标名 :return: """ # 如果SQL数据库中一个该指标都没有。 return get_df(param, self.table) # df
def process_iron_order_data(params): """ 处理铁次号型的数据. 把受铁开始时间当业务处理时间 之间的间隙使用线性插值填充 """ res = pd.DataFrame() df_iorn_time = pd.concat([get_time_table(19), get_time_table(20)]) df = pd.concat([get_df(params[0], 19), get_df(params[0], 20)]) df['铁次号'] = pd.to_numeric(df['铁次号']) df['采集项值'] = pd.to_numeric(df['采集项值']) # 格式化 df = df[df['铁次号'] >= 20000000] # 提取出#2高炉的数据 df = df[df['铁次号'] < 30000000] for param in params: # param = params[0] grouped = df.groupby("采集项名称").get_group(param) grouped = grouped.groupby("铁次号").mean() # grouped_idx = grouped.set_index('铁次号').sort_index() merged = pd.merge(df_iorn_time['受铁开始时间'], grouped, how='outer', left_index=True, right_index=True) merged = merged.rename(columns={ '受铁开始时间': '业务处理时间' }).set_index('业务处理时间') resampled = merged.resample('1T').agg(np.mean).rename( columns={'采集项值': param}) # 重采样1min temp = resampled.interpolate() # 线性插值 res = pd.merge(res, temp, how="outer", left_index=True, right_index=True) # temp=process_time_data(params) return res
def get_df_format(input_param, input_table): """ 获取指标含有指标数据表时 处理好格式 :param input_table: :param input_param: :return: """ df_ = get_df(input_param, input_table) if '业务处理时间' in df_.columns: df_['业务处理时间'] = df_['业务处理时间'].astype('datetime64') if '采集项值' in df_.columns: df_['采集项值'] = df_['采集项值'].apply(pd.to_numeric) if '铁次号' in df_.columns: df_['铁次号'] = df_['铁次号'].astype('int64') # 提取出#2高炉的数据 df_ = df_[df_['铁次号'] >= 20000000] df_ = df_[df_['铁次号'] < 30000000] df_.sort_values('铁次号', inplace=True) return df_
def get_rule(self): """ '探尺差' 探尺 东 南 西 的悬料 :return: """ res = pd.DataFrame() df = get_df('探尺(南)', self.table) # 格式化 df['采集项值'] = pd.to_numeric(df['采集项值']) df['业务处理时间'] = pd.to_datetime(df['业务处理时间']) # 把三个探尺高度筛选出来 brothel = ['探尺(南)', '探尺(东)', '探尺(西)'] hookers = [] for hooker_name in brothel: hooker = df.groupby('采集项名称').get_group(hooker_name).set_index( '业务处理时间') # 筛选 hooker.drop(columns=['采集项编码', '采集项名称'], inplace=True) hooker.rename(columns={'采集项值': hooker_name}, inplace=True) hooker[hooker_name][hooker[hooker_name] > 1e7] = None # 去除1e7 的异常值 hooker[hooker_name].drop_duplicates( keep=False, inplace=True) # 去除数据源中同一时刻的重复采样 # 计算有没有悬料: xuan = hooker.sort_index() xuan['diff'] = xuan.diff() temp = xuan.where(xuan['diff'] == 0).dropna() xuan_res = temp.where(temp[hooker_name] > 1.5).dropna() # 悬料的计算结果 # xuan_time_table = self.time_table # xuan_time_table['next_start'] = xuan_time_table['受铁开始时间'].shift(-1) res[hooker_name + '悬料'] = xuan_res.resample('1d').count()[hooker_name] # 数出日悬料次数 hookers.append(hooker) self.res = pd.merge(self.res, res, how="outer", left_index=True, right_index=True) # 找出 所有 在同一时刻 三个探尺高度数据都不缺失的样本 temp = pd.merge(hookers[0], hookers[1], how="inner", left_index=True, right_index=True) blondie = pd.merge(temp, hookers[2], how="inner", left_index=True, right_index=True) # 计算极差 wife = pd.DataFrame() wife['探尺差'] = blondie.max(axis=1) - blondie.min(axis=1) temp = wife.resample('1d').mean() # 日重采样 self.res = pd.merge(self.res, temp, how="outer", left_index=True, right_index=True) return res
def get_datas(): ## 测试代码: 查验各个指标是在哪个表里 集中处理更有效率 # param_list = "热风温度 送风风量 热风压力 富氧量\ # 焦炭负荷 炉顶压力1 炉顶压力2\ # 炉腹煤气发生量 炉顶温度1 炉喉温度1 炉顶煤气CO 炉顶煤气CO2 \ # 喷吹速率 \ # 理论燃烧温度 鼓风动能\ # [铁水温度] \ # [Si] [Ti] [S] \ # (CaO) (SiO2) ".split() # # for item in param_list: # print(find_table(item, 19)) res = pd.DataFrame() #################################################################################################################### # 热风温度 送风风量 热风压力 富氧量 params = "热风温度 送风风量 热风压力 富氧量 ".split() temp = process_time_data(params) res = pd.merge(res, temp, how="outer", left_index=True, right_index=True) #################################################################################################################### # 焦炭负荷 炉顶压力 params = "焦炭负荷 炉顶压力1 炉顶压力2 ".split() temp = process_time_data(params) res = pd.merge(res, temp, how="outer", left_index=True, right_index=True) luding_mean = res[['炉顶压力1', '炉顶压力2']].mean(axis=1) # 透气性指数 = 送风风量/(热风压力-炉顶压力1-2) *100 res['透气性指数'] = res['送风风量'] / (res['热风压力'] - luding_mean) * 100 #################################################################################################################### # 炉腹煤气发生量 炉顶温度 炉喉温度 煤气利用率 # params = "炉腹煤气发生量 炉顶温度1 炉喉温度1 炉顶煤气CO 炉顶煤气CO2 \ 炉顶温度2 炉顶温度3 炉顶温度4 炉喉温度2 炉喉温度3 炉喉温度4 炉喉温度5\ 炉喉温度6 炉喉温度7 炉喉温度8".split() temp = process_time_data(params) res = pd.merge(res, temp, how="outer", left_index=True, right_index=True) res['煤气利用率'] = res['炉顶煤气CO2'] / (res['炉顶煤气CO'] + res['炉顶煤气CO2']) res['炉顶温度(极差)'] = (res[['炉顶温度1', '炉顶温度2', '炉顶温度3', '炉顶温度4']].max(axis=1) - res[['炉顶温度1', '炉顶温度2', '炉顶温度3', '炉顶温度4']].min(axis=1)) res['炉喉温度(极差)'] = (res[[ '炉喉温度1', '炉喉温度2', '炉喉温度3', '炉喉温度4', '炉喉温度5', '炉喉温度6', '炉喉温度7', '炉喉温度8' ]].max(axis=1) - res[[ '炉喉温度1', '炉喉温度2', '炉喉温度3', '炉喉温度4', '炉喉温度5', '炉喉温度6', '炉喉温度7', '炉喉温度8' ]].min(axis=1)) #################################################################################################################### # 理论燃烧温度 鼓风动能 # #################### params = "理论燃烧温度 鼓风动能".split() temp = process_time_data(params) res = pd.merge(res, temp, how="outer", left_index=True, right_index=True) #################################################################################################################### # 计算喷吹速率 # temp = process_time_data(['喷吹速率']) res = pd.merge(res, temp, how="outer", left_index=True, right_index=True) #################################################################################################################### # 计算[Si] [Ti] [S] # params = "[Si] [Ti] [S]".split() temp = process_iron_order_data(params) res = pd.merge(res, temp, how="outer", left_index=True, right_index=True) res['[Si]+[Ti]'] = res['[Si]'] + res['[Ti]'] res['[铁水温度]'] = process_iron_order_data(['[铁水温度]']) #################################################################################################################### # 计算R2 # params = "(CaO) (SiO2)".split() temp = process_iron_order_data(params) res = pd.merge(res, temp, how="outer", left_index=True, right_index=True) res['R2'] = res['(CaO)'] / res['(SiO2)'] #################################################################################################################### # 计算矿石比例 # """ 对各个矿石每隔2小时做累加, 并且 这两个小时的所有分钟时刻 都是这个矿石比例 处理前: 矿A 矿B 2020-01-01 00:01:00 1 4 2020-01-01 00:02:00 2 8 2020-01-01 00:03:00 3 2 2020-01-01 00:04:00 4 6 处理后: 矿A 矿B 2020-01-01 00:01:00 0.2 0.8 2020-01-01 00:02:00 0.2 0.8 2020-01-01 00:03:00 0.47 0.53 2020-01-01 00:04:00 0.47 0.53 """ # param_list = "40赤块 冶金焦(自产) 南非块矿 小块焦 烧结矿 白马球团 酸性烧结矿".split() param_list = "40赤块 南非块矿 烧结矿 酸性烧结矿 白马球团".split() # temp = process_time_data(param_list) # param = param_list[0] df19 = get_df(param_list[0], 19) df20 = get_df(param_list[0], 20) df = pd.concat([df19, df20]) df['采集项值'] = pd.to_numeric(df['采集项值']) # 格式化 df['业务处理时间'] = pd.to_datetime(df['业务处理时间']) # 格式化 df['采集项值'][df['采集项值'] > 1e7] = None # 去除 99999 res_tmp = pd.DataFrame() for param in param_list: grouped = df.groupby('采集项名称').get_group(param) grouped = grouped.set_index('业务处理时间') resampled = grouped.resample('2h').agg(np.sum).rename( columns={'采集项值': param}) # 重采样1min res_tmp = pd.merge(res_tmp, resampled, how="outer", left_index=True, right_index=True) res_tmp['块矿比例'] = res_tmp['40赤块'] + res_tmp['南非块矿'] res_tmp['烧结比例'] = res_tmp['烧结矿'] + res_tmp['酸性烧结矿'] res_tmp['球团比例'] = res_tmp['白马球团'] res_tmp = res_tmp.loc[:, ['块矿比例', '烧结比例', '球团比例']] # 计算比例 res_sum = res_tmp.sum(axis=1) for param in ['块矿比例', '烧结比例', '球团比例']: res_tmp[param] = res_tmp[param] / res_sum res = pd.merge(res, res_tmp, how="outer", left_index=True, right_index=True) # nan值填充 for param in ['块矿比例', '烧结比例', '球团比例']: # res[param] = res[param].ffill() res[param] = res[param].interpolate(method='quadratic') return res