Python Pandas:为多个用户的多个属性存储多个可变长度的时间序列
Python Pandas: Store multiple time series of variable length for multiple attributes for multiple users
我一直在进行一项实验,其中多个调查参与者使用可穿戴技术听多首音乐来跟踪多条信息,两个例子是 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
文件的长度可能不同。例如,即使对于同一首歌曲,BPM
和 T
的时间序列也可以是不同的长度。
我已经编写了 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 中?
我认为使用数据框的字典会更容易。在单元格中列出列表需要付出很多额外的努力,这在您的情况下是可以避免的。
我想对你的情况最有用的数据结构是每个 song_id 有一个 DataFrame。即使每个用户的数据略有不同,您仍然可以通过使用一些 NaN 来解决。
您的数据是一个 TimeSeries,因此您应该以时间为轴。您很可能不想知道确切的时间,而是歌曲开始后的秒数。
示例结构:
TimeStamp BPM_user1 BPM_user2
1 65 34
2 64 35
3 66 39
4 69 40
或者,您可以使用多列索引(Metric 在级别 0,userid 在级别 1)
示例:
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
相比,此工作流程通常更容易且不易出错
我一直在进行一项实验,其中多个调查参与者使用可穿戴技术听多首音乐来跟踪多条信息,两个例子是 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
文件的长度可能不同。例如,即使对于同一首歌曲,BPM
和 T
的时间序列也可以是不同的长度。
我已经编写了 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 中?
我认为使用数据框的字典会更容易。在单元格中列出列表需要付出很多额外的努力,这在您的情况下是可以避免的。
我想对你的情况最有用的数据结构是每个 song_id 有一个 DataFrame。即使每个用户的数据略有不同,您仍然可以通过使用一些 NaN 来解决。 您的数据是一个 TimeSeries,因此您应该以时间为轴。您很可能不想知道确切的时间,而是歌曲开始后的秒数。
示例结构:
TimeStamp BPM_user1 BPM_user2
1 65 34
2 64 35
3 66 39
4 69 40
或者,您可以使用多列索引(Metric 在级别 0,userid 在级别 1)
示例:
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
相比,此工作流程通常更容易且不易出错