Как сделать читабельный линейный график, используя DataFrame с большим количеством строк - PullRequest
1 голос
/ 14 марта 2019

У меня есть объект DataFrame размером 1 000 000 x 2, состоящий из данных, которые я пытаюсь понять визуально.Это в основном симуляция 1 000 000 событий, когда пакет, путешествующий по сети, ставится в очередь или отбрасывается в зависимости от размера буфера.Итак, значениями двух столбцов являются «Пакеты в очереди» и «Пакеты отброшены».

Я пытаюсь построить линейный график, используя записные книжки Python, Matplotlib и Jupyter, у которых есть идентификатор события на оси x и количество пакетов в очереди в определенной точке идентификатора на y-ось.Должно быть две строки, первая из которых представляет количество пакетов в очереди, а вторая - количество отброшенных пакетов.Однако, учитывая, что существует более 1 000 000 симуляций, график не понятен.Значения слишком сжаты вместе.Можно ли создать удобочитаемый график с 1 000 000 экземпляров событий или мне нужно резко сократить количество событий?

Ответы [ 2 ]

1 голос
/ 14 марта 2019

С миллионами точек данных потребуется много усилий и увеличение, чтобы увидеть их в мельчайших деталях. 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()

enter image description here

1 голос
/ 14 марта 2019

Попробуйте гистограмму

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()

Метод 2 линейных графика

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 вместе и строим их график.

Выглядит как ниже, когда 1000000 точек противодействуют через каждые 1000 интервалов

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...