def model_train_done_rnn(model_id, lag_dates, pcas, file_path_list,
                         sub_model_names, outputs_list, events_set, model_dir):
    """
    更新t_event_model_file、t_event_model_detail、t_event_model_tran表的数据。

    :param model_id: string. 模型编号
    :param file_path_list: array. 模型地址
    """
    db = DatabaseWrapper(dbname=event_dbname)
    try:
        db.begin_transaction()

        sql = "INSERT INTO t_event_model_file(file_id, file_url, model_id) VALUES (%s, %s, %s) "
        params = []
        for model_fp in file_path_list:
            param = (UuidHelper.guid(), model_fp, model_id)
            params.append(param)
        db.executemany(sql, params)

        # 子模型信息入库
        detail_ids = []
        sql = "INSERT INTO t_event_model_detail(detail_id, model_name, status, model_id, lag_date, pca, create_date, " \
              "create_time) values (%s, %s, %s, %s, %s, %s, %s, %s)"
        params = []
        for sub_model_name, lag_date, pca in zip(sub_model_names, lag_dates,
                                                 pcas):
            detail_id = UuidHelper.guid()
            detail_ids.append(detail_id)
            params.append(
                (detail_id, sub_model_name, DataStatus.SUCCESS.value, model_id,
                 int(lag_date), int(pca), sys_date(sys_date_formatter),
                 sys_time(sys_time_formatter)))
        db.executemany(sql, params)

        # 分事件模型信息入库
        sql = "INSERT INTO t_event_model_tran(tran_id, event_name, num, detail_id, status, create_date, create_time) " \
              "values (%s, %s, %s, %s, %s, %s, %s)"
        params = []
        for detail_id, outputs in zip(detail_ids, outputs_list):
            events_num = pp.get_event_num(outputs, events_set)
            for e in events_set:
                tran_id = UuidHelper.guid()
                event_num = events_num[e]
                param = (tran_id, e, event_num,
                         detail_id, DataStatus.SUCCESS.value,
                         sys_date(sys_date_formatter),
                         sys_time(sys_time_formatter))
                params.append(param)
        db.executemany(sql, params)

        sql = "UPDATE t_event_model SET model_dir = %s WHERE model_id = %s"
        db.execute(sql, (model_dir, model_id))

        db.commit()
        return detail_ids
    except Exception as e:
        db.rollback()
        raise RuntimeError(e)
    finally:
        db.close()
def insert_pred_result(probs, probs_all_days, dates, dates_pred_all,
                       dates_data, detail_ids, events_set, task_id):
    """向数据库插入预测结果
    Args:
      probs: 预测结果
      probs_all_days: 多天预测结果
      dates:
      dates_pred_all: 多天预测日期
      dates_data: 数据日期
      detail_ids:
      events_set:
      task_id:
    """
    sql_task_rs = "insert into t_event_task_rs(rs_id, event_name, probability, forecast_date, status, " \
                  "detail_id, task_id, create_date, create_time, predict_end_date) " \
                  "values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
    sql_task_rs_his = "insert into t_event_task_rs_his(rs_id, event_name, probability, forecast_date," \
                      "detail_id, task_id, create_date, create_time, predict_end_date) values " \
                      "(%s, %s, %s, %s, %s, %s, %s, %s, %s)"
    sql_task_rs_params = []
    sql_task_rs_his_params_hist = []
    db = DatabaseWrapper(dbname=event_dbname)
    try:
        db.begin_transaction()
        for p, pa, ds, da, did, dd in zip(probs, probs_all_days, dates,
                                          dates_pred_all, detail_ids,
                                          dates_data):
            for i, e in enumerate(events_set):
                for j, d in enumerate(ds):
                    param = (UuidHelper.guid(), str(e), f'{p[j][i]:.4f}',
                             str(d), DataStatus.SUCCESS.value, did, task_id,
                             sys_date(sys_date_formatter),
                             sys_time(sys_time_formatter), str(dd[j]))
                    sql_task_rs_params.append(param)
                for j, d in enumerate(da):
                    pd = pa[j]
                    for k, d_ in enumerate(d):
                        pd_ = pd[k]
                        param_hist = (UuidHelper.guid(), str(e),
                                      f'{pd_[i]:.4f}', str(d_), did, task_id,
                                      sys_date(sys_date_formatter),
                                      sys_time(sys_time_formatter), str(dd[j]))
                        sql_task_rs_his_params_hist.append(param_hist)
            db.executemany(sql_task_rs, sql_task_rs_params)
            sql_task_rs_params = []
            db.executemany(sql_task_rs_his, sql_task_rs_his_params_hist)
            sql_task_rs_his_params_hist = []
        db.commit()  # 配置文件中设置不自动提交,所以手动提交
    except Exception as e:
        db.rollback()
        raise RuntimeError(e)
    finally:
        db.close()
def insert_model_test(event, event_num, false_rate, recall_rate,
                      false_alarm_rate, tier_precision, tier_recall, bleu,
                      detail_id):
    """
    记录模型评估信息
    Args:
        event: 事件名称
        event_num: 事件在测试(评估)数据集中出现的次数
        false_rate: 误报率
        recall_rate: 召回率
        false_alarm_rate: 虚警率
        tier_precision: 头部精确率, 即将预测值降序排序后, 头部(前n个)预测值中预测正确的结果数所占的比例
        tier_recall: 头部召回率, 即将预测值降序排序后, 头部(前n个)预测值中预测正确的结果数与真实正例个数的比值
        bleu: bleu指标
        detail_id: 子模型对应的id
    """
    test_id = UuidHelper.guid()
    sql = "insert into t_event_model_test(test_id, event_name, num, false_rate, recall_rate, false_alarm_rate, " \
          "tier_precision, tier_recall, bleu, status, detail_id, create_date, create_time) " \
          "values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
    param = (test_id, event, event_num, false_rate, recall_rate,
             false_alarm_rate, tier_precision, tier_recall, bleu,
             DataStatus.SUCCESS.value, detail_id, sys_date(sys_date_formatter),
             sys_time(sys_time_formatter))

    __modify(sql, param, '插入子模型评估结果失败')
def model_eval_done(top_scores, events_num):
    """
    更新t_event_model表的模型状态、训练开始日期、训练结束日期。

    :param top_scores:
    :param events_num:
    """
    db = DatabaseWrapper(dbname=event_dbname)
    try:
        sql = "insert into t_event_model_tot(tot_id, num, false_rate, recall_rate, false_alarm_rate, " \
              "tier_precision, tier_recall, bleu, score, status, detail_id, create_date, create_time) values " \
              "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
        params = []
        for score, bleu_summary, tier_precision_summary, tier_recall_summary, fr_summary, rc_summary, \
                fa_summary, detail_id in top_scores:
            num_events = np.sum(
                [v for k, v in events_num.items() if str(k) != '0'])
            param = (UuidHelper.guid(), str(num_events), str(fr_summary),
                     str(rc_summary), str(fa_summary),
                     str(tier_precision_summary), str(tier_recall_summary),
                     str(bleu_summary), str(score), DataStatus.SUCCESS.value,
                     detail_id, sys_date(sys_date_formatter),
                     sys_time(sys_time_formatter))
            params.append(param)
        db.executemany(sql, params)
        db.commit()
    except Exception as e:
        raise RuntimeError(e)
    finally:
        db.close()
def model_train_finish(model_id, status):
    """
    更新t_event_model表的模型状态。

    :param model_id: string. 模型编号
    :param status: string. 模型状态
    """
    sql = "UPDATE t_event_model SET status = %s, tran_finish_date = %s, tran_finish_time = %s WHERE model_id = %s"

    __modify(sql, (status, sys_date(sys_date_formatter),
                   sys_time(sys_time_formatter), model_id))
def predict_task_finish(task_id, date_data_pred, status):
    """
    修改t_event_task表的运行状态、任务结束日期、预测结束日期、任务结束事件。
    :param task_id: string. 任务编号
    :param date_data_pred: string. 预测结束日期
    :param status: string. 任务运行状态
    """
    sql = "UPDATE t_event_task SET status = %s, task_finish_date = %s, predict_end_date = %s, task_finish_time = %s " \
          "WHERE task_id = %s"
    param = (status, sys_date(sys_date_formatter), str(date_data_pred),
             sys_time(sys_time_formatter), task_id)
    __modify(sql, param)
def insert_into_model_detail(sub_model_names, model_id):
    """
    将子模型信息入库
    Args:
      sub_model_names: 子模型名称, 形如 model_name-input_len-output_len-n_pca
      model_id: 模型编号

    Returns:
        array,detail_id
    """
    detail_ids = []
    sql = "INSERT INTO t_event_model_detail(detail_id, model_name, status, model_id, create_date, create_time) " \
          "values (%s, %s, %s, %s, %s, %s)"
    params = []
    for sub_model_name in sub_model_names:
        detail_id = UuidHelper.guid()
        detail_ids.append(detail_id)
        params.append(
            (detail_id, sub_model_name, DataStatus.SUCCESS.value, model_id,
             sys_date(sys_date_formatter), sys_time(sys_time_formatter)))

    __modify_many(sql, params)

    return detail_ids
def model_train_done_cnn(model_id, kernel_size_array, pool_size_array,
                         lag_date_array, file_path_array, sub_model_name_array,
                         output_array, event_set_array, model_dir):
    """
    更新t_event_model_file、t_event_model_detail、t_event_model_tran表的数据。

    :param model_id: string. 模型编号
    :param kernel_size_array: array. 卷积核列表
    :param pool_size_array: array. 过滤器列表
    :param lag_date_array: array. 滞后期列表
    :param file_path_array: array. 模型文件地址列表
    :param sub_model_name_array: array. 模型文件名列表
    :param output_array: array.事件样本列表(事件表数据)
    :param event_set_array: array.事件类别列表
    :param model_dir: str.模型存放地址
    :return array, 子模型编号列表
    """
    db = DatabaseWrapper(dbname=event_dbname)
    try:
        db.begin_transaction()

        sql = "INSERT INTO t_event_model_file(file_id, file_url, model_id) VALUES (%s, %s, %s) "
        params = []
        for model_fp in file_path_array:
            param = (UuidHelper.guid(), model_fp, model_id)
            params.append(param)
        db.executemany(sql, params)

        # 子模型信息入库
        detail_ids = []
        sql = "INSERT INTO t_event_model_detail(detail_id, model_name, status, model_id, lag_date, kernel_size, " \
              "pool_size, create_date, create_time) values (%s, %s, %s, %s, %s, %s, %s, %s, %s)"
        params = []
        for sub_model_name, lag_date, kernel_size, pool_size in zip(
                sub_model_name_array, lag_date_array, kernel_size_array,
                pool_size_array):
            detail_id = UuidHelper.guid()
            detail_ids.append(detail_id)
            params.append(
                (detail_id, sub_model_name, DataStatus.SUCCESS.value, model_id,
                 int(lag_date), int(kernel_size), int(pool_size),
                 sys_date(sys_date_formatter), sys_time(sys_time_formatter)))
        db.executemany(sql, params)

        # 分事件模型信息入库
        sql = "INSERT INTO t_event_model_tran(tran_id, event_name, num, detail_id, status, create_date, create_time) " \
              "values (%s, %s, %s, %s, %s, %s, %s)"
        params = []
        for detail_id, outputs in zip(detail_ids, output_array):
            events_num = pp.get_event_num(outputs, event_set_array)
            for event in event_set_array:
                tran_id = UuidHelper.guid()
                event_num = events_num[event]
                param = (tran_id, event, event_num,
                         detail_id, DataStatus.SUCCESS.value,
                         sys_date(sys_date_formatter),
                         sys_time(sys_time_formatter))
                params.append(param)
        db.executemany(sql, params)

        sql = "UPDATE t_event_model SET model_dir = %s WHERE model_id = %s"
        db.execute(sql, (model_dir, model_id))

        db.commit()
        return detail_ids
    except Exception as e:
        db.rollback()
        raise RuntimeError(e)
    finally:
        db.close()