#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()