我有一个1,000,000 x 2的DataFrame对象,该对象包含要尝试以视觉方式理解的数据。它基本上是对1,000,000个事件的模拟,其中根据缓冲区的大小,将沿着网络传输的数据包排队或丢弃。因此,两个列的值是“队列中的数据包”和“丢弃的数据包”。
我正在尝试使用Python,Matplotlib和Jupyter Notebooks绘制线图,其在x轴上具有事件的ID,在y轴上具有特定ID点的队列中的数据包数量。应该有两行,第一行代表队列中的数据包数量,第二行代表丢弃的数据包数量。但是,考虑到有超过1,000,000个模拟,该图并不清晰。这些值太挤在一起了。是否可以制作具有1,000,000个事件实例的可读图,还是我需要大幅减少事件数量?
答案 0 :(得分:1)
尝试直方图
from matplotlib.pyplot import hist
import pandas as pd
df = pd.DataFrame()
df['x'] = np.random.rand(1000000)
hist(df.index, weights=df.x, bins=1000)
plt.show()
df['x'] = np.random.rand(1000000)
df['y'] = np.random.rand(1000000)
w = 1000
v1 = df['x'].rolling(min_periods=1, window=w).sum()[[i*w for i in range(1, int(len(df)/w))]]/w
v2 = df['y'].rolling(min_periods=1, window=w).sum()[[i*w for i in range(1, int(len(df)/w))]]/w
plt.plot(np.arange(len(v1)),v1, c='b')
plt.plot(np.arange(len(v1)),v2, c='r')
plt.show()
我们正在计算w = 1000点的平均值,即将w值平均在一起并绘制它们。
每隔1000个间隔反击1000000点时,如下图所示
答案 1 :(得分:1)
拥有一百万个数据点,将需要大量的精力并进行放大以查看它们的细节。 Plotly有一些不错的工具,可用于放大和缩小绘图以及沿x轴滑动数据窗口。
如果您可以进行一些平均值计算,则可以绘制移动平均数并接近十万点。您可以彼此堆叠两个子图,以合理详细地查看两列数据。您当然可以对它们进行平均,但是您将失去查看精细细节的能力。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def moving_avg(x, N=30):
return np.convolve(x, np.ones((N,))/N, mode='valid')
plt.figure(figsize = (16,12))
plt.subplot(3,1,1)
x = np.random.random(1000)
plt.plot(x, linewidth = 1, alpha = 0.5, label = 'linewidth = 1')
plt.plot(moving_avg(x, 10), 'C0', label = 'moving average, N = 10')
plt.xlim(0,len(x))
plt.legend(loc=2)
plt.subplot(3,1,2)
x = np.random.random(10000)
plt.plot(x, linewidth = 0.2, alpha = 0.5, label = 'linewidth = 0.2')
plt.plot(moving_avg(x, 100), 'C0', label = 'moving average, N = 100')
plt.xlim(0,len(x))
plt.legend(loc=2)
plt.subplot(3,1,3)
x = np.random.random(100000)
plt.plot(x, linewidth = 0.05, alpha = 0.5, label = 'linewidth = 0.05')
plt.plot(moving_avg(x, 500), 'C0', label = 'moving average, N = 500')
plt.xlim(0,len(x))
plt.legend(loc=2)
plt.tight_layout()