2018 国际AIOps挑战赛单指标数据集分析

news2025/1/13 7:30:22

在这里插入图片描述

关于数据集

2018年国际AIOps 由中国建设银行、清华大学以及必示科技公司联合举办,尽管已经过去了这么长时间,其提供的比赛数据依然被用于智能运维相关算法的研究。这里我们对此数据集做简单的分析,把一些常用的数据分析方法在这里进行略微地概述。

数据集下载地址:https://smileyan.lanzoul.com/ixpcU03lp97g

内容概述

接下来的部分我按照自己的习惯,使用python代码对数据进行简单的处理分析,不牵扯到具体论文的复现。

1. 加载数据

下载解压后,可以得到两个文件,即

  • phase2_train.csv
  • phase2_ground_truth.hdf

对于两种类型文件读取方法不同,代码如下:

import pandas as pd

df_train = pd.read_csv("data/phase2_train.csv")
print(df_train.head(5))

df_test = pd.read_hdf("data/phase2_ground_truth.hdf")
df_test["KPI ID"] = df_test["KPI ID"].astype(str)
print(df_test.head(5))

如下图所示:
在这里插入图片描述

2. 使用 pd.groupby 拆分成多个 kpi

以训练集为例,这里先将整个df拆分成多个 DataFrame,以便于分别对不同的KPI进行分析。

首先统计一下总共多少种 KPI

df_train["KPI ID"].unique()

在这里插入图片描述
接着使用groupby收集每个指标,组成数组,并分析一下每个DataFrame 的shape。

name_dfs = df_train.groupby("KPI ID")
for name, df in name_dfs:
    print(f"{name}:{df.shape}")

在这里插入图片描述

3. 其他基本特征

包括最大值最小值等等。

name_dfs = df_train.groupby("KPI ID")
names, v_mean, v_max, v_min, v_std, v_sum, v_size = [], [], [], [], [], [], []
for name, df in name_dfs:
    names.append(name)
    v_mean.append(df["value"].mean())
    v_max.append(df["value"].max())    
    v_min.append(df["value"].min())    
    v_std.append(df["value"].std())
    v_sum.append(df["value"].sum())
    v_size.append(df.shape[0])

basic_analysis_df = pd.DataFrame({"name": names, "size": v_size, "mean": v_mean, 
                                  "max": v_max, "min": v_min, "std": v_std, "sum": v_sum})
basic_analysis_df

在这里插入图片描述

4. 分析采样间隔

不同的指标可能存在不同的缺失情况,但是一般情况下我们认为在所有的间隔中,占比最大的间隔为期望的采样间隔。比如说总共101个采样点,排序后计算它们的采样间隔,得到 1 分钟采样间隔共 80次,2分钟采样间隔20次,所以我们认为1分钟的采样间隔为最接近真实情况的采样间隔。
在这里插入图片描述

import numpy as np


def calc_interval(timestamps):
    """根据所有的采样时间计算采样间隔"""
    diff = np.diff(timestamps)
    intervals, counts = np.unique(diff, return_counts=True)
    tmp = np.hstack((intervals.reshape(-1, 1), counts.reshape(-1, 1)))
    return tmp[np.argmax(tmp[:, 1])][0]

name_dfs = df_train.groupby("KPI ID")
names, intervals = [], []
for name, df in name_dfs:
    df = df.sort_values(by="timestamp")
    names.append(name)
    intervals.append(calc_interval(df["timestamp"].values))
    

interval_df = pd.DataFrame({"name": names, "interval": intervals})
interval_df

5. 缺失情况分析

计算得到采样间隔以后,即可分析数据缺失情况,方法也非常简单。
在这里插入图片描述

import numpy as np


def calc_interval(timestamps):
    """根据所有的采样时间计算采样间隔"""
    diff = np.diff(timestamps)
    intervals, counts = np.unique(diff, return_counts=True)
    tmp = np.hstack((intervals.reshape(-1, 1), counts.reshape(-1, 1)))
    return tmp[np.argmax(tmp[:, 1])][0]

name_dfs = df_train.groupby("KPI ID")
names, intervals, missing_rate = [], [], []
for name, df in name_dfs:
    df = df.sort_values(by="timestamp")
    names.append(name)
    interval = calc_interval(df["timestamp"].values)
    intervals.append(interval)
    target_points = int((df["timestamp"].values[-1] - df["timestamp"].values[0]) / interval) + 1
    missing_rate.append((target_points - df.shape[0]) / target_points)

missing_df = pd.DataFrame({"name": names, "interval": intervals, "missing_rate": missing_rate})
missing_df

6. 填充缺失值

为了接下来的分析工作需要,我们可能需要填充缺失值。这里采样最简单可靠的 “线性插值填充” 方法。不同情况下需要进行调整而进行填充,一般情况下如果不存在连续大段缺失的话,线性插值填充是可靠的。

总体过程可以概述为:

  1. 通过时间戳和采样间隔计算下一个点的时间戳;
  2. 判断下一个点的时间戳是否缺失,如果缺失则填充 np.nan;
  3. 使用 pandas 的工具进行线性填充。
def fill_missing_points(tv_df, interval):
    """填充缺失值"""
    timestamps, values = tv_df["timestamp"].values, tv_df["value"].values
    start = timestamps[0]
    f_t, f_v = [], []
    index = 0
    while start <= timestamps[-1]:
        if start == timestamps[index]:
            f_t.append(start)
            f_v.append(values[index])
            index += 1
        else:
            f_t.append(start)
            f_v.append(np.nan)
        start += interval
    
    r_df = pd.DataFrame({"timestamp": f_t, "value": f_v})
    r_df["value"] = r_df["value"].interpolate()
    return r_df

7. 使用 3-sigma 方法去除可能存在的异常值

3-sigma 也是一种光滑处理的方法,即计算原数据的标准差 σ \sigma σ 以及均值 μ \mu μ,对于原数据中每一个点 x x x 进行考察:

  • 如果 x ∈ [ μ − 3 ∗ σ , μ + 3 ∗ σ ] x \in [\mu - 3 * \sigma, \mu + 3 * \sigma] x[μ3σ,μ+3σ],则保留该点数据 x x x
  • 其他情况,去除这个点,以 μ − 3 ∗ σ \mu - 3 * \sigma μ3σ 或者 μ + 3 ∗ σ \mu + 3*\sigma μ+3σ 进行填充。
def smooth_values(values, p=3):
    """平滑处理"""
    mean, std = np.mean(values), np.std(values)
    lower, upper = mean - p * std, mean + p * std
    results = []
    for value in values:
        if lower <= value <= upper:
            results.append(value)
        else:
            if value < lower:
                results.append(lower)
            elif value > upper:
                results.append(upper)
    
    return results

8. 周期类型分析

周期类型分析需要根据实际偏好进行调整,比如在特定场景中,只存在 “天周期” 、“周周期” 以及 “无周期” 三种情况,但是其他场景中可能存在 “月周期” 的情况等等。

这里我们使用 “相关系数” 来计算数据的周期类型,基本的原理是:分别对数据进行切块,分割成N个时间片段,然后计算相邻两个时间片段之间的相关系数,最终以所有的相关系数的均值作为最终的结果。

周期类型判断建立在需要推断采样间隔、完成缺失值填充、完成光滑处理的基础上。

def extract_seasonality(values, interval, t_w = 1.0, t_d = 1.0, t_season = 0.6):
    """提取周期类型
    其中 t_w, t_d 分别代表周周期可能性系数、天周期可能性系数
    t_season 表示具有周期性的最低相关系数
    """
    s_values = smooth_values(values)
    points_per_day = int(60 * 60 * 24 / interval)
    points_per_week = points_per_day * 7
    
    if len(values) < points_per_day:
        return "NON"

    p_w = calc_spearmanr(s_values, points_per_week)
    p_d = calc_spearmanr(s_values, points_per_day)

    if p_w < t_season and p_d < t_season:
        return "NON"
    
    if p_w * t_w >= p_d * t_d:
        return "WEEK"
    
    if p_w * t_w < p_d * t_d:
        return "DAY"
    
    return "NON"

有待补充

以上内容为常见的一些特征提取方法,在实际应用中一般会根据业务逻辑、实际数据场景进行调整。但总体而言大体如此,还有更多内容今后还会补充发布。

Smileyan
2023.09.24 19:00

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring面试题13:Spring中ApplicationContext实现有哪些?Bean工厂和Applicationcontext有什么区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring中ApplicationContext实现有哪些? 在Spring框架中,有以下几种ApplicationContext的实现: ClassPathXmlApplicationContext:从类路径下的…

基于springboot消防员招录系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

​Segment-and-Track Anything——通用智能视频分割、跟踪、编辑算法解读与源码部署

一、 万物分割 随着Meta发布的Segment Anything Model (万物分割)的论文并开源了相关的算法&#xff0c;我们可以从中看到&#xff0c;SAM与GPT-4类似&#xff0c;这篇论文的目标是&#xff08;零样本&#xff09;分割一切&#xff0c;将自然语言处理&#xff08;NLP&#xff…

【数据结构】二叉排序树;平衡二叉树的知识点学习总结

目录 1、二叉排序树 1.1 定义 1.2 查找操作 1.3 插入操作 1.4 删除操作 1.5 C语言实现二叉排序树的基本操作 2、平衡二叉树的知识点总结 2.1 定义 2.2 插入操作 2.3 调整“不平衡” 2.4 删除操作 1、二叉排序树 1.1 定义 二叉排序树&#xff08;Binary Search …

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细!)

云计算与大数据——部署Hadoop集群并运行MapReduce集群(超级详细&#xff01;) Linux搭建Hadoop集群(CentOS7hadoop3.2.0JDK1.8Mapreduce完全分布式集群) 本文章所用到的版本号&#xff1a; CentOS7 Hadoop3.2.0 JDK1.8 基本概念及重要性 很多小伙伴部署集群用hadoop用mapr…

C++设计模式_06_Decorator 装饰模式

本篇将会介绍Decorator 装饰模式&#xff0c;它是属于一个新的类别&#xff0c;按照C设计模式_03_模板方法Template Method中介绍的划分为“单一职责”模式。 “单一职责”模式讲的是在软件组件的设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随…

HT for Web (Hightopo) 使用心得(2)- 2D 图纸、节点、连线 与基本动画

概括来说&#xff0c;用 HT for Web 做可视化主要分为两部分&#xff0c;也就是 2D 和 3D。这两部分需要单独创建。在它们被创建完成后&#xff0c;我们再把它们集成到一起。 HT for Web 的 2D 部分主要是指 ht.graph.GraphView (简称 GraphView&#xff0c;也就是 2D 图纸)。…

Java项目:SSM的食堂点餐系统

作者主页&#xff1a;Java毕设网 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 一、相关文档 系统中的核心用户是系统管理员&#xff0c;管理员登录后&#xff0c;通过管理员菜单来管理后台系统。主要功能有&#xff1a;个人中心、用户管理…

自动发现、zabbix_proxy代理

自动发现&#xff1a;自己去发现被监控的主机 它能够根据用户事先定义的规则自动添加监控的主机或服务等。 优点 加快Zabbix部署&#xff08;agent&#xff09; 简化管理 在快速变化的环境中使用Zabbix&#xff0c;而不需要过度管理 部署自动发现(新机子) rpm -Uvh https://re…

OSI 七层网络协议最全的图

OSI 七层网络协议最全的图 文章出处&#xff1a;https://www.shuzhiduo.com/A/RnJWawowdq/

DINO(ICLR 2023)

DINO&#xff08;ICLR 2023&#xff09; DETR with Improved deNoising anchOr box DINO发展&#xff1a; Conditional DETR->DAB-DETR&#xff08;4D,WH修正&#xff09; DN-DETR&#xff08;去噪训练&#xff0c;deNoising 稳定匹配过程&#xff09; Deformable DETR&…

后端大厂面试-16道面试题

1 java集合类有哪些&#xff1f; List是有序的Collection&#xff0c;使用此接口能够精确的控制每个元素的插入位置&#xff0c;用户能根据索引访问List中元素。常用的实现List的类有LinkedList&#xff0c;ArrayList&#xff0c;Vector&#xff0c;Stack。 ArrayList是容量…

基于同名面片的TLS测站点云配准

1、原理介绍 2、代码介绍 基于C++编写的程序代码如下,其依赖eigen矩阵运算库,在创建工程时包含库目录中使用了相对路径,因此其下载下来直接可以运行,不用单独在设置环境,非常方便。

Java项目:SpringBoot高校宿舍管理系统

作者主页&#xff1a;Java毕设网 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 一、相关文档 宿舍是大学生学习与生活的主要场所之一&#xff0c;宿舍管理是高校学工管理事务中尤为重要的一项。随着我国高校招生规模的进一步扩大&#xff0…

异步回调

Future 设计的初衷&#xff1a;对将来的某个事件的结果进行建模 package com.kuang.future;import com.kuang.pc.C;import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.uti…

ubuntu | 安装NVIDIA套件:驱动、CUDA、cuDNN

CUDA 查看支持最高的cuda版本 nvidia-smiCUDA Version:12.2 区官网下在12.2.x最新的版本即可CUDA Toolkit Archive | NVIDIA Developer 下载安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo…

《开发实战》16 | 缓存设计:缓存可以锦上添花也可以落井下石

不要把 Redis 当作数据库 Redis 的确具有数据持久化功能&#xff0c;可以实现服务重启后数据不丢失。这一点&#xff0c;很容易让我们误认为 Redis 可以作为高性能的 KV 数据库。Redis 的特点是&#xff0c;处理请求很快&#xff0c;但无法保存超过内存大小的数据。第一&#…

leetcode 22. 括号生成

2023.9.24 看到组合两个字&#xff0c;想到了回溯。 大致思路是将所有可能的组合列出来&#xff0c;通过中止条件筛选掉无效的括号。 第一个中止条件&#xff1a;如果右括号数量大于左括号&#xff0c;那括号肯定无效。 第二个中止条件&#xff1a;当左右括号数量相等&#x…

swiper使用

介绍 Swiper&#xff08;swiper master&#xff09;是一个第三方的库&#xff0c;可以用来实现移动端、pc端的滑动操作。&#xff0c;swiper应用广泛&#xff0c;使用频率仅次于jquery, 轮播图类排名第一&#xff0c;是网页设计师必备技能&#xff0c;众多耳熟能详的品牌在使用…

Keil 无法烧写程序

问题描述&#xff1a; Keil MDK V5.38 按 F8 键无法烧录程序&#xff0c;提示: Error: Flash Download failed - "Cortex-M7", No Algorithm found for: 08000000H - 080013D3H 解决办法&#xff1a; Debug 工具改为&#xff1a;ST-Link Debugger Debug 的 Conne…