예제 #1
0
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
예제 #2
0
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_
예제 #4
0
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
예제 #6
0
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
예제 #7
0
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
예제 #9
0
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