Python Pandas:为多个用户存储多个可变长度的时间序列,用于多个属性

时间:2016-03-25 19:48:45

标签: python pandas storage dataframe multi-index

我一直在进行一项实验,其中多名调查参与者使用可穿戴技术收听多段音乐以跟踪多条信息,两个例子是BPM(心率)和T(体温)。

目标是衡量每首音乐(以用户反馈为特征)对人类情感的影响。

目前,所有数据都存储在.txt个文件中(文本文件中的每一行都有一个条目)在多个目录中,具有以下结构:

/user_1
    /BPM
        song_1.txt
           76
           78
        song_2.txt
           76
           78
           85
    /T
        song_1.txt
           35.7
           35.3
           35.3
           35.3
           35.3
        song_2.txt
           32.2
           32.4
           37.8
           32.4
           37.8

由于诸如歌曲长度之类的变量以及可穿戴设备传输的时间段不一致,每个.txt文件可能具有不同的长度。例如,即使是同一首歌,BPMT的时间序列也可能不同。

我已编写Python代码来遍历并读取所有文件中的值。

目前,我正在考虑创建一个如下所示的DataFrame:

User_ID Song_ID BPM       T
1       1       [65,...]  [36,...]
1       2       [65,...]  [36,...]
2       1       [65,...]  [36,...]
2       2       [65,...]  [36,...]

但我担心在每个单元格中存储一个数组可能会使数据标准化等任务变得困难 - 我现在想知道是否有更好的方法可以利用MultiIndex将其存储在Pandas中?

1 个答案:

答案 0 :(得分:1)

我认为使用数据帧的dicts更容易。在单元格中列出需要相当多的额外工作,在您的情况下可以避免。

我猜你的案例最有用的数据结构是每个 song_id 都有一个 DataFrame 。即使您为每个用户提供的数据略有不同,您仍然可以通过使用 NaN 来解决这些问题。 您的数据是TimeSeries,因此您应该将Time作为轴。很可能你不会想要确切的时间,但是自歌曲开始以来的秒数。

示例结构:

TimeStamp BPM_user1 BPM_user2
1       65      34
2       64      35
3       66      39
4       69      40

或者,您可以使用多列索引(在级别0具有度量标准,在级别1具有用户ID

示例:

          BPM         T
TimeStamp user1 user2 user1 user2
1       65      80     34     38
2       64      78     35     37
3       66      77     39     37
4       69      76     40     37

如果您有许多特定于指标的转换,则第二种方法更好

然后,您使用dict来保存所有数据框:

df_dict = {
     'song1': read_df(song_id=1),
     'song2': read_df(song_id=2),
}

然后您可以轻松地迭代以执行分析:

for songid, df in df_dict.items():
       *do analysis*

与使用pd.Panel

相比,此工作流程通常更容易且更不容易出错