- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个时间序列数据(1000 个数据点),其列名称如下:
X、Y、Z、A、B。
我想生成 10 个段,每个段包含 3 个 channel 的 100 个数据点,其中第一个 channel 包含列 X,A,B ,第二个 channel Y,A,B 和第三个 channel Z,A,B?
如何在 python 中完成此任务?
最佳答案
要将时间序列重新排列为 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
标签,所以...
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/
我是一名优秀的程序员,十分优秀!