pandas 获取并绘制时间序列 Dataframe 的阶梯图

enyaitl3  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(223)

我有下面的 Dataframe ,其中包含了作为时间序列的阶段信息:

import pandas as pd
d = {'Stages': ['Stage 1', 'Stage 2', 'Stage 2', 'Stage 2', 'Stage 3', 'Stage 1'], 'Start(s)': [0, 630, 780, 840, 900, 930], 'End(s)': [630, 780, 840, 900, 930, 960]}
df = pd.DataFrame(data=d)

    Stages         Start(s) End(s)
0   Stage 1          0      630
1   Stage 2         630     780
2   Stage 2         780     840
3   Stage 2         840     900
4   Stage 3         900     930
5   Stage 1         930     960

我想获得如here所示的阶跃图,所以我这样做:

#Replacing the string stages
mapping = {'Stage 1': 1, 'Stage 2': 2,'Stage 3': 3}
DF = df.replace({'Stages': mapping})

这给了我

Stages     Start(s) End(s)
0   1            0      630
1   2            630    780
2   2            780    840
3   2            840    900
4   3            900    930
5   1            930    960

有人能告诉我如何获得像this这样的图吗?

qnzebej0

qnzebej01#

IIUC,您可以使用yasa.plot_hypnogram
试试这个:

import pandas as pd
import yasa #pip install yasa

d = {'Stages': ['Stage 1', 'Stage 2', 'Stage 2', 'Stage 2', 'Stage 3', 'Stage 1'],
     'Start(s)': [0, 630, 780, 840, 900, 930], 'End(s)': [630, 780, 840, 900, 930, 960]}

ser = (
        pd.DataFrame(data=d)
            .replace({"Stages": {"Stage ": ""}}, regex=True)
            .astype({"Stages": int})
            .assign(Time= lambda x: [list(range(i, j+1)) for i, j in x[["Start(s)", "End(s)"]].values])
            .explode("Time")
            .loc[:, "Stages"]
      )

yasa.plot_hypnogram(ser)
#输出:

-2 =未评分-1 =伪影/运动0 =唤醒1 = N1睡眠2 = N2睡眠3 = N3睡眠4 = REM睡眠
注意:您可能需要使用Python版本(>=3.7<3.11)来安装所有的yasa依赖项。Python版本(3.11.0)似乎还不受支持。

nnsrf1az

nnsrf1az2#

我的第一个想法是使用"steps" drawstyle provided by matploltib,如果你使用它,你几乎可以只在“End(s)”列中绘制值--问题是你需要将第一个开始时间/阶段前置到要绘制的值列表中:

x = [df['Start(s)'].iloc[0], *df['End(s)']]
y = [df['Stages'].iloc[0], *df['Stages']]

plt.plot(x, y, drawstyle='steps')

这大概是最低限度;它忽略了特定于睡眠周期的特定格式,相反,它希望向您展示如何“从头开始”绘制所需的曲线。
补充说明:

  • 如果需要反转y轴,可以将级数转换为负整数而不是正整数。
  • 如果需要重命名y标签,可以使用plt.yticks([1, 2, 3], ['a', 'b', 'c'])对其进行重命名。
  • 一般来说,这种方法依赖于“stages”被解释为整数,如果你有额外的stages不是数字,你需要将它们重新编码为数字,然后像上面那样使用plt.yticks更改它们的名称。

相关问题