Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python中的多变量时间序列从数据帧创建数组数组_Python_Pandas_Numpy_Time Series - Fatal编程技术网

使用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。