gpt4 book ai didi

python - 在 Python 中从具有多个多元时间序列的数据帧创建数组数组

转载 作者:行者123 更新时间:2023-12-04 15:25:44 24 4
gpt4 key购买 nike

我需要从数据框创建一个数组数组:

HR    sBP   dBP  T     ID
101 51 81 37.1 P1.1
102 52 82 37.2 P1.1
103 53 83 37.3 P1.1
104 54 84 37.4 P1.1
105 55 85 37.5 P1.1
210 65 90 36.1 P1.2
210 65 90 36.2 P1.2
210 65 90 36.3 P1.2
210 65 90 36.4 P1.2
210 65 90 36.5 P1.2
...
100 50 75 37 Pm.n
100 50 75 37 Pm.n
...
100 50 60 37.0 P1500.6
100 50 60 37.0 P1500.6
100 50 60 37.0 P1500.6
100 50 60 37.0 P1500.6
100 50 60 37.0 P1500.6

其中每个 block 都是一个多变量时间序列,以 HR、sBP、dBP 和 T° 为变量,ID 变量是每个患者的每个数据子系列的标签。每个患者的数据 block 长度可变。我需要以这样的数组结尾:

array([[[101,    51,    81,    37.1],
[102, 52, 82, 37.2],
[103, 53, 83, 37.2],
[104, 54, 84, 37.2],
[105, 55, 85, 37.2]],

[[210, 65, 90, 36.1],
[210, 65, 90, 36.2],
[210, 65, 90, 36.3],
[210, 65, 90, 36.4],
[210, 65, 90, 36.5]],

...

[[100, 50, 60, 37.0],
[100, 50, 60, 37.0],
[100, 50, 60, 37.0],
[100, 50, 60, 37.0],
[100, 50, 60, 37.0]]])

使用array.shape =(唯一ID的数量,数组的长度,维度的数量)

我的代码是这样的:

df_grp = df.groupby('ID')

for name, gp in df_grp:
if name == 'P1.1':
arr = gp.drop(columns = ['ID']).to_numpy().reshape(-1,4)

else:
temp_arr = gp.drop(columns = ['ID']).to_numpy().reshape(-1,4)
arr = np.append(arr, temp_arr, axis=0)

但是它给了我一个这样的数组

array ([[101,    51,    81,    37.1],
[102, 52, 82, 37.2],
[103, 53, 83, 37.2],
[104, 54, 84, 37.2],
[105, 55, 85, 37.2],
[210, 65, 90, 36.1],
[210, 65, 90, 36.2],
[210, 65, 90, 36.3],
[210, 65, 90, 36.4],
[210, 65, 90, 36.5]],

...

[100, 50, 60, 37.0],
[100, 50, 60, 37.0],
[100, 50, 60, 37.0],
[100, 50, 60, 37.0],
[100, 50, 60, 37.0]])

使用 array.shape =(df 中的行数,维数)。使用或不使用 reshape 结果都是一样的,使用 squeeze 也是一样。我需要上述格式的数组,以便我可以在 tslearn 包中使用它进行多变量时间序列聚类。非常感谢任何帮助。

最佳答案

我想你正在寻找这个:

arr = df.set_index('ID').groupby('ID').apply(pd.DataFrame.to_numpy).to_numpy()

与您的解决方案类似,首先 groupby 然后使用 to_numpy 将它们转换为数组。请注意,如果您的数组具有不同的形状(即不同的 ID 长度),则不能使用非矩形 numpy 数组。因此,此代码返回您要查找的数组。

输出:

[array([[101. ,  51. ,  81. ,  37.1],
[102. , 52. , 82. , 37.2],
[103. , 53. , 83. , 37.3],
[104. , 54. , 84. , 37.4],
[105. , 55. , 85. , 37.5]])
array([[210. , 65. , 90. , 36.1],
[210. , 65. , 90. , 36.2],
[210. , 65. , 90. , 36.3],
[210. , 65. , 90. , 36.4],
[210. , 65. , 90. , 36.5]])
...
array([[100., 50., 75., 37.],
[100., 50., 75., 37.]])
...
array([[100., 50., 60., 37.],
[100., 50., 60., 37.],
[100., 50., 60., 37.],
[100., 50., 60., 37.],
[100., 50., 60., 37.]])]

如果所有 'ID' 的行数相同,您可以堆叠上面的 numpy 数组 arr 以获得单个数组:

np.stack(arr)

[[[101. 51. 81. 37.1]
[102. 52. 82. 37.2]
[103. 53. 83. 37.3]
[104. 54. 84. 37.4]
[105. 55. 85. 37.5]]

[[210. 65. 90. 36.1]
[210. 65. 90. 36.2]
[210. 65. 90. 36.3]
[210. 65. 90. 36.4]
[210. 65. 90. 36.5]]
...
[[100. 50. 60. 37. ]
[100. 50. 60. 37. ]
[100. 50. 60. 37. ]
[100. 50. 60. 37. ]
[100. 50. 60. 37. ]]]

关于python - 在 Python 中从具有多个多元时间序列的数据帧创建数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62293842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com