如何将时间序列数据分为3列和3个通道?

时间:2017-07-28 21:34:15

标签: python pandas numpy convolution

我有一个包含以下列名的时间序列数据(1000个数据点):

X,Y,Z,A,B。

我想生成10个具有3个通道的100个数据点的段,其中第一个通道包含X,A,B列,第二个通道Y,A,B和第三个通道Z,A,B?< / p>

如何在python中完成此操作?

1 个答案:

答案 0 :(得分:1)

numpy的

要将时间序列重新排列为10个细分,您只需使用np.reshape

形状(XYZAB, timepoints)的示例数据:

a = np.random.randint(0,10,(5,1000))
print a.shape
>> (5L, 1000L)

重塑为十个细分,产生(XYZAB, segments, timepoints)

b = np.reshape(a,(5,10,100))
print b.shape
>> (5L, 10L, 100L)

此时,可能不希望创建您调用的频道&#39;频道,因为您可能会将数据的一部分(A和B)重复三部分而不会更容易访问该数据。你可以访问,例如XAB就像这样:

xab = b[(0,3,4),:,:]

如果你绝对需要将频道作为单独的副本,你可以简单地得到它们:

c = np.array([b[(0,3,4),:,:],
              b[(1,3,4),:,:],
              b[(2,3,4),:,:]])
print c.shape
>> (3L, 3L, 10L, 100L)

其中包含一个形状为(channel,column,segment,timepoints)的数组,其中column表示原始列名称(例如(X,A,B)0}。

熊猫

刚刚看到问题的pandas标记,所以......

df = pd.DataFrame(a.T, columns=list('XYZAB'))

分为100个时间点的片段作为dfs列表:

segments = []
for group, segment in df.groupby(np.arange(len(df)) // 100):
    segments.append(segment)

或者,更好的是,只需创建一个新列,指示每行属于哪个段:

df['segment'] = df.apply(lambda x : x.name // 100, axis=1)

此时,最好不要将数据重复三次,而是使用df。您可以使用df.groupby(['segment'])轻松地按时间段应用操作,同时通过标准列选择选择感兴趣的列,例如

df.groupby(['segment'])['X','A','B'].mean()

获取列X,A和B的每段的平均值。

当然你可以创建例如“频道”的列表或词典&#39;这样,如果你真的需要它。

channels = {'XAB':df[['segment','X','A','B']],
            'YAB':df[['segment','Y','A','B']],
            'ZAB':df[['segment','Z','A','B']]}

你可以把它变成一只熊猫Panel

pnl = pd.Panel(channels)

使用的最佳数据结构取决于您的特定用例,但一般情况下我会避免使用Panel并坚持使用2D df或3D数组(即b)。< / p>