Сюжет очень разной продолжительности временных рядов - PullRequest
0 голосов
/ 27 января 2019

Я изо всех сил пытаюсь найти оптимальные настройки для построения временных рядов, которые могут сильно отличаться по длине. Чтобы дать вам больше контекста, входные данные генерируются FIO, поэтому они поступают в микросекундах на оси «время» и всех других измерениях на оси «значение» (например, IOPS, пропускная способность, задержка завершения, задержка отправки и т. Д. .)

Проблема: тест, генерирующий данные, может выполняться в течение часа, или десяти минут, или десяти часов. Кроме того, точки данных IOPS намного меньше, чем задержка отправки (вы не можете измерить что-то в секунду чаще, чем раз в секунду, но задержка отправки обычно составляет 1-2 микросекунды).

Когда я не изменяю xticks, шкала на оси X (время) обычно ничего не стоит (то есть она либо слишком разрежена, либо слишком плотна). Для каждого отдельного случая я могу найти «достаточно хорошее» значение для xticks, но я не могу придумать, как это выяснить автоматически.

Вот некоторые из моих упражнений, извините, они немного вне контекста, но должны хотя бы проиллюстрировать направление, которое я пробовал.

def plot_one(self, args):
    file_name, file, plot_histogram = args
    logging.info('plotting: {}'.format(file_name))
    if type(file) is bytes:
        file = BytesIO(file)
    df = pd.read_csv(file, header=None, usecols=(0, 1))
    df.columns = ['offset', 'nsec']
    df = df.groupby(['offset']).mean()
    df['offset'] = df.index
    if plot_histogram:
        ax = df['nsec'].plot.hist(title=os.path.basename(file_name))
        figure = ax.get_figure()
        figure.savefig(file_name + '_hist.png', bbox_inches='tight')
    max_offset = df['offset'].iloc[-1]
    ratio = max(1, min(max_offset // 4000, 40))
    height = 5
    width = int(height * ratio)
    xticks, step = None, None
    if max_offset > 10000:
        xticks = pd.Series(data=range(0, max_offset // 1000)) * 1000
        step = 1000
    else:
        xticks = pd.Series(data=range(0, max_offset))
        step = 1
    ax = df.plot(
        title=os.path.basename(file_name),
        x='offset',
        y='nsec',
        grid=True,
        figsize=(width, height),
        xticks=xticks,
        rot=90,
    )
    ax.set_xticklabels(xticks // step)
    ax.set_xlim(0, df['offset'].iloc[-1])
    figure = ax.get_figure()
    figure.savefig(file_name + '.png', bbox_inches='tight')
    logging.info('saving figure: {}.png'.format(file_name))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...