Как усреднить и уменьшить список точек для графика

Рейтинг: 0Ответов: 1Опубликовано: 15.02.2023

Алгоритм формирует список значений в среднем от 300к до 1М точек (зависит от того достигается ли сходимость и в какой момент). Отрисовка графика по всем этим точкам занимает много времени, а при сохранении ноутбука с графиком на диск - ноутбук занимает много места.

Поэтому хотелось бы уменьшить число точек до 100. Т.е. разделить получаемый список точек на 100 сэмплов и в каждом семпле получить усреднённое значение после чего сформировать уже список из 100 полученных значений. Вопрос в том как это лучше и эффективнее сделать, есть ли эффективные алгоритмы для этого?

Ответы

▲ 1Принят

Ну вот так, например, с использованием Pandas для аггрегации. Работает моментально:

import numpy as np
import pandas as pd
import matplotlib.pylab as plt

df = pd.DataFrame({'data': np.random.randint(100, size=1_000_000)})
df['bin'] = df.index // 10_000
df_avg = df.groupby('bin').mean()

df_avg[['data']].plot()

Картинку не могу сейчас приложить, к сожалению.

А вообще в случае, если данные у вас слабо меняются со временем, то, возможно, аггрегация не нужна и достаточно сэмплирования. Попробуйте, сравните:

df.sample(100)[['data']].sort_index().plot()

Вообще сэмплирование - очень мощная техника. Когда у вас много данных, с которыми ваше оборудование физически не справляется, бывает полезно взять какой-то сэмпл данных и экспериментировать с ним - так всё гораздо быстрее можно проверить.