我有一个包含以下列名的时间序列数据(1000个数据点):
X,Y,Z,A,B。
我想生成10个具有3个通道的100个数据点的段,其中第一个通道包含X,A,B列,第二个通道Y,A,B和第三个通道Z,A,B?< / p>
如何在python中完成此操作?
答案 0 :(得分:1)
要将时间序列重新排列为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>