с использованием itertools grouper
рецепт и pandas.DataFrame.groupby
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
Мы будем использовать это для группировки данных за 200
Затем нам нужен метод для добавления группы данных к оси ax
def add_to_axes(ax, data, context_id=None):
data.plot(
x="Time_Elapsed",
y="BacksGas_Flow_sccm",
label=context_id,
# color="blue",
ax=ax,
)
outlier = data["y_ocsvm1"] == -1
data[~outlier].plot.scatter(
x="Time_Elapsed",
y="BacksGas_Flow_sccm",
color="green",
label="Normal",
ax=ax,
)
data[outlier].plot.scatter(
x="Time_Elapsed",
y="BacksGas_Flow_sccm",
color="red",
label="outlier",
ax=ax,
)
и метод группировки данных в подгруппах, создания нового рисунка для каждой подгруппы и добавления различных context_id
s к графику.
def group_plots(df, group_size=200):
for group in grouper(df.groupby("ContextID"), n=group_size):
fig, ax = plt.subplots()
# group = list(filter(None, group))
# print(group)
for context_id, data in filter(None, group):
# print(context_id, data.head())
add_to_axes(ax, data, context_id)
yield fig
Это можно назвать так, чтобы получить графики:
if __name__ == "__main__":
filename = Path("data/test2.csv")
data = pd.read_csv(filename, delimiter="\s+", decimal=",") # my dummy data
for i, fig in enumerate(group_plots(data)):
fig.savefig(f"data/output{i}.png") # or do whathever you need with the fig
Я не знаю plot.ly
, так что это тоже можно сделать. Основные компоненты остаются прежними:
метод группировки данных, метод создания новой фигуры для каждой подгруппы данных и метод добавления 1 серии к существующему графику