前言:

上周学长和我说如果论文读的差不多了可以把数据集上的数据用matplotlib画出来。想着操纵一下真实的数据想必能对项目有更深的理解,于是开始学习。

matplotlib是Python的第三方库,确实很重要。

学习本身我也就是相当于学会怎么用”锤子“,所以也没什么值得分享和记录的。

读者有需要的可以去看莫凡Python的网课,链接如下:

【莫烦Python】Matplotlib Python 画图教程_哔哩哔哩_bilibili

正文:

本次操作数据集其实需要的matplotlib知识并不多。

1.先了解csv文件里面数据存储的形式

有四列属性,第一列是时间戳,第二列是节点名称,第三列是KPI名称(一个文件当中都相同),第四列是具体数值。大致如下图所示。

一个文件基本上有四十个节点,每个节点对应一个KPI序列,因此KPI序列的x轴是timestamp,y轴是value。

2.画出第一个时间序列

对于每个节点,都有timestamp和value两个list,直接采用折线图(plot)的形式,即可画出序列,但是注意调整figsize(宽高比例)。

3.利用subplot画出多个子图

subplot就是让一个figure(一张图片)里面有多个子图(时间序列)

4.画出多个csv文件

编写程序,遍历整个文件夹下所有csv文件,每个csv文件创建一个文件夹,每个文件夹存储该csv文件中所有时间序列。主要就是python的文件输出流了。

大抵是完成任务了。

(感觉需要记录一下,但是又不想细写,也没什么值得写的,就这样吧)

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import matplotlib.pyplot as plt
import numpy as np
import csv
import os
from os import path

# 每个节点都有自己的名字和时间序列(timestamp&value)
class Node:
def __init__(self, name):
self.name = name
self.time_stamp = []
self.value = []


url = "D:\MTSAD\data\初赛评分数据\\2022-05-01\cloudbed\metric\container"
file = os.listdir(url)
# 这一步是因为我已经手动画过这几个文件了,所以remove
file.remove(".DS_Store")
file.remove("kpi_container_cpu_cfs_periods.csv")
file.remove("kpi_container_cpu_cfs_throttled_periods.csv")
file.remove("kpi_container_cpu_cfs_throttled_seconds.csv")
file.remove("kpi_container_cpu_load_average_10s.csv")
file.remove("kpi_container_cpu_system_seconds.csv")

for F in file:
# 处理单个csv文件
# 每个csv文件对应一系列节点
node_list = []
temp = url + "\\" + F
with open(temp, mode="r", encoding="utf-8-sig") as f:
reader = csv.reader(f)
header = next(reader)
for row in reader:
flag = False
time = int(row[0]) - 1651334400
value = float(row[3])
for node in node_list:
if node.name == row[1]: # 已经找到所属节点
node.time_stamp.append(time)
node.value.append(value)
flag = True
break
if not flag:
temp_node = Node(row[1])
temp_node.time_stamp.append(time)
temp_node.value.append(value)
node_list.append(temp_node)

tmp = F[:-4]
save_path = "D:\MTSAD\data\img\\2022-5-01\container\\" + tmp
os.mkdir(save_path) # 创建所属文件夹

# 画图
index = 0
for j in range(10):
fig = plt.figure(figsize=(24, 6))
for i in range(4):
node = node_list[index]
fig.add_subplot(4, 1, i + 1)
plt.plot(node.time_stamp, node.value)
plt.title(node.name, loc='left')
plt.subplots_adjust(wspace=0, hspace=0.6) # 调整子图间距
index += 1
# 存储
plt.savefig(save_path + "\\" + f"0{j}.png")
# plt.show()