有没有办法只为 python 中的混合数据中的常量数据绘制图形?
is there way to plot graph only for constant data out of mixed data in python?
我正在使用 SIPp 工具进行 sip 呼叫,它给我一个 csv 统计文件(我配置为每 5 秒生成一次新行),其中包含当前呼叫的列(整数),例如 0,5,12 ,25,45,60,60,60,59,60,60,45,32,25,15,5,0.
以上是每秒 5 次调用,最大调用限制为 60(请忽略两者之间的缺失值)。所以,这将是我的 y 轴值。
对于 x 轴(这是我的另一个挑战 :( ..)因为通话时间可以是 30 秒甚至 2 小时。csv 文件给我这种格式的时间戳“2021-12-14 01:11:41.574282 1639424501.574282”。为此(尽我所能,我将所有这些时间戳转换为连续值差异列表,即 5,使用以下:
T=[]
for t in time:
tvalue= t.split("\t")[2]
T.append(int(float(tvalue)))
t_interval = [j-i for i, j in zip(T[:-1], T[1:])]
t_interval 给我 [5, 5, 5, 5, 5...等等]
如果我画一个线性图,那将是一个曲线图(从 0 开始,平线,以 0 结束),我想画类似“当第一次达到最大呼叫限制时(即 60)并且在我的总通话时间之后说 120 秒(也可以变化)当通话开始结束时即最后 60(直到这一点)
注意:- 有时可能会有 58/59 之类的值。
在 metaplot 或任何 python 绘图模块中有没有办法轻松做到这一点?
综上所述,我能够使用以下方法绘制捕获所有值但不捕获线的内容(对于最大调用而言应该是平坦的,仅针对时间):
calls_tup = tuple(zip(list(calls),list(failedcalls)))
x= np.linspace(0,sum(t_interval),len(calls))
y= np.array(calls_tup)
fig, ax = plt.subplots()
ax.plot(x,y)
- Failedcalls 是我图表中要显示的另一条线。那不是问题。 :)
这是一种搜索具有相等连续值的数组位置的方法。然后从该位置画一条长度为1的水平线。
import matplotlib.pyplot as plt
import numpy as np
values = [0, 5, 12, 25, 45, 60, 60, 60, 59, 60, 60, 45, 32, 25, 15, 5, 0]
values = np.array(values)
pos_equal = np.argwhere(values[:-1] == values[1:]).squeeze()
x = np.vstack([pos_equal, pos_equal + 1, np.full_like(pos_equal, np.nan, dtype=float)]).T.ravel()
y = np.repeat(values[pos_equal], 3)
plt.plot(x, y, ls='-', lw=3, color='r')
plt.plot(values, ls=':', lw=0.5, color='b')
plt.show()
x 和 y 数组如下所示:
x: [ 5., 6., nan, 6., 7., nan, 9., 10., nan]
y: [ 60, 60, 60, 60, 60, 60, 60, 60, 60]
nan
值会导致线路中断。
我正在使用 SIPp 工具进行 sip 呼叫,它给我一个 csv 统计文件(我配置为每 5 秒生成一次新行),其中包含当前呼叫的列(整数),例如 0,5,12 ,25,45,60,60,60,59,60,60,45,32,25,15,5,0.
以上是每秒 5 次调用,最大调用限制为 60(请忽略两者之间的缺失值)。所以,这将是我的 y 轴值。
对于 x 轴(这是我的另一个挑战 :( ..)因为通话时间可以是 30 秒甚至 2 小时。csv 文件给我这种格式的时间戳“2021-12-14 01:11:41.574282 1639424501.574282”。为此(尽我所能,我将所有这些时间戳转换为连续值差异列表,即 5,使用以下:
T=[] for t in time: tvalue= t.split("\t")[2] T.append(int(float(tvalue))) t_interval = [j-i for i, j in zip(T[:-1], T[1:])]
t_interval 给我 [5, 5, 5, 5, 5...等等]
如果我画一个线性图,那将是一个曲线图(从 0 开始,平线,以 0 结束),我想画类似“当第一次达到最大呼叫限制时(即 60)并且在我的总通话时间之后说 120 秒(也可以变化)当通话开始结束时即最后 60(直到这一点) 注意:- 有时可能会有 58/59 之类的值。 在 metaplot 或任何 python 绘图模块中有没有办法轻松做到这一点?
综上所述,我能够使用以下方法绘制捕获所有值但不捕获线的内容(对于最大调用而言应该是平坦的,仅针对时间):
calls_tup = tuple(zip(list(calls),list(failedcalls)))
x= np.linspace(0,sum(t_interval),len(calls))
y= np.array(calls_tup)
fig, ax = plt.subplots()
ax.plot(x,y)
- Failedcalls 是我图表中要显示的另一条线。那不是问题。 :)
这是一种搜索具有相等连续值的数组位置的方法。然后从该位置画一条长度为1的水平线。
import matplotlib.pyplot as plt
import numpy as np
values = [0, 5, 12, 25, 45, 60, 60, 60, 59, 60, 60, 45, 32, 25, 15, 5, 0]
values = np.array(values)
pos_equal = np.argwhere(values[:-1] == values[1:]).squeeze()
x = np.vstack([pos_equal, pos_equal + 1, np.full_like(pos_equal, np.nan, dtype=float)]).T.ravel()
y = np.repeat(values[pos_equal], 3)
plt.plot(x, y, ls='-', lw=3, color='r')
plt.plot(values, ls=':', lw=0.5, color='b')
plt.show()
x 和 y 数组如下所示:
x: [ 5., 6., nan, 6., 7., nan, 9., 10., nan]
y: [ 60, 60, 60, 60, 60, 60, 60, 60, 60]
nan
值会导致线路中断。