Как усреднить и уменьшить список точек для графика
Алгоритм формирует список значений в среднем от 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()
Вообще сэмплирование - очень мощная техника. Когда у вас много данных, с которыми ваше оборудование физически не справляется, бывает полезно взять какой-то сэмпл данных и экспериментировать с ним - так всё гораздо быстрее можно проверить.