Многострочная диаграмма из фрейма данных с циклическими образцами

#python #pandas

#python #pandas

Вопрос:

У меня есть большой фрейм данных, который включает в себя 30 образцов, измеряемых по одному каждые 6 секунд в течение нескольких дней. Это выглядит примерно так:

DATE_TIME ПРИМЕР ЗНАЧЕНИЕ
2020-12-10 10:52:48 1 3.22
2020-12-10 10:52:54 2 2.93
2020-12-10 10:53:00 3 2.27
2020-12-10 16:27:13 1 1.66
2020-12-10 16:27:19 2 1.15
2020-12-10 16:27:25 3 1.23

Я хочу построить временные ряды для каждого отдельного образца (многострочная диаграмма). Я пытался:

 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
all_data = pd.read_csv("data.csv")

time_df=pd.DataFrame({'x':all_data['DATE_TIME'],'y1':all_data['SAMPLE']==1,'y2':all_data['SAMPLE']==2})
plt.plot('x','y1', data=time_df, marker= 'o',markerfacecolor='blue', markersize=1, color='skyblue', linewidth=4)
plt.plot('x','y2', data=time_df, marker= 'o',markerfacecolor='green', markersize=1, color='skyblue', linewidth=4)
plt.show()
 

Но это не работает, я получаю странную цифру:
плохая цифра

Я также пытался создавать отдельные фреймы данных для образцов, и это работает, но я уверен, что должен быть более эффективный способ сделать это.

 SAMPLE1_df=all_data.loc[all_data["SAMPLE"] == 1]
SAMPLE2_df_df=all_data.loc[all_data["SAMPLE"] == 2]

fig = go.Figure()
fig.add_trace(go.Scatter(x=SAMPLE1_df_df["DATE_TIME"], y=SAMPLE1_df["VALUE"], mode='lines', name= "SAMPLE1"))
fig.add_trace(go.Scatter(x=SAMPLE2_df_df["DATE_TIME"], y=SAMPLE2_df["VALUE"], mode='lines', name= "SAMPLE2"))
fig.show()
 

идея фигуры, которую я хочу

Ответ №1:

Если вы построили фрейм данных с несколькими столбцами, вы получите желаемый результат. Вы можете преобразовать свой фрейм данных в такой с помощью groupby или set_index :

 all_data.groupby(["DATE_TIME", "SAMPLE"])["VALUE"].mean().unstack("SAMPLE").interpolate(method='linear').plot() 
 

или, если у вас нет дубликатов

 all_data.set_index(["DATE_TIME", "SAMPLE"])["VALUE"].unstack("SAMPLE").interpolate(method='linear').plot()