使用Python中的多变量时间序列从数据帧创建数组数组
我需要从数据帧创建一个数组:使用Python中的多变量时间序列从数据帧创建数组数组,python,pandas,numpy,time-series,Python,Pandas,Numpy,Time Series,我需要从数据帧创建一个数组: 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 9
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
其中,每个区块是一个多变量时间序列,以HR、sBP、dBP和T°为变量,ID
变量是来自每个患者的每个数据子集的标签。每个患者的区块长度不同。
我需要得到这样一个数组:
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]]])
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.shape=(唯一ID的数量、数组的长度、维度的数量)
我的代码如下所示:
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]]])
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中的行数、维度数)
。使用或不使用重塑
以及使用挤压
的结果是相同的。
我需要上述格式的数组,这样我就可以在多元时间序列聚类的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'
s具有相同的行数,则可以将上面的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. ]]]
谢谢,但是我从代码的
.apply(pd.DataFrame.to numpy)
部分得到错误TypeError:“deep”是copy()的无效关键字参数。请记住,ID的长度可能不同。@JuanWeber在我发布输出时,它适用于您在问题中提供的数据帧示例。你的熊猫和numpy版本是最新的吗?如果没有,请尝试更新它们。如果没有工作,请提供更多的错误信息,以便我们可以更好地帮助。非常感谢。对于不同长度的ID,代码会处理它。这就是为什么该行向您提供了所解释的数组。谢谢,更新pandas和numpy修复了错误。生成的数组具有shape=(唯一ID的数量,)
,并且该数组被tslearn接受。但我不确定这是否是预期的行为。你认为有可能得到我刚开始发布的形状吗<代码>形状=(n°唯一ID,?,n°尺寸)
?我不知道数组长度的大小。如果每个ID的行数不同,Numpy无法将数组列表/数组转换为所需形状的单个数组。(如果它们相同,请使用发布的np.stack(arr)
将其转换为单个数组)。换句话说,数组必须是矩形的。至于tslearn,我没有这方面的专业知识(也许你可以发布一个关于它的新问题)。请检查如何接受答案,并欢迎访问SO。