gpt4 book ai didi

python - 如何将时间序列数据分割成3列和3 channel ?

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:48 26 4
gpt4 key购买 nike

我有一个时间序列数据(1000 个数据点),其列名称如下:

X、Y、Z、A、B。

我想生成 10 个段,每个段包含 3 个 channel 的 100 个数据点,其中第一个 channel 包含列 X,A,B ,第二个 channel Y,A,B 和第三个 channel Z,A,B?

如何在 python 中完成此任务?

最佳答案

Numpy

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

形状示例数据(XYZAB,时间点):

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

reshape 为十个片段,得到(XYZAB,片段,时间点):

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

此时,创建所谓的“ channel ”可能并不理想,因为您会将数据的部分(A 和 B)复制三次,而实际上并没有让访问该数据变得更加容易。您可以访问例如XAB 就像这样:

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

如果您绝对需要将 channel 作为单独的副本,您可以像这样简单地获取它们:

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) 对于 channel 0)。

Pandas

刚刚看到您问题上的 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 列的每段平均值。

当然,您可以创建例如如果您确实需要的话,可以通过这种方式获得“ channel ”列表或字典。

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

你可以将其制作成 pandas Panel:

pnl = pd.Panel(channels)

要使用的最佳数据结构取决于您的特定用例,但一般来说,我会避免使用面板并坚持使用 2D df 或 3D 数组(即 b)。

关于python - 如何将时间序列数据分割成3列和3 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45382739/

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