【发布时间】:2015-10-18 13:43:15
【问题描述】:
假设我有按 x 值排序的 x-y 数据样本。我将使用 Pandas 作为示例,但当然,我会对仅 Numpy/Scipy 的解决方案感到非常满意。
In [24]: pd.set_option('display.max_rows', 10)
In [25]: df = pd.DataFrame(np.random.randn(100, 2), columns=['x', 'y'])
In [26]: df = df.sort('x')
In [27]: df
Out[27]:
x y
13 -3.403818 0.717744
49 -2.688876 1.936267
74 -2.388332 -0.121599
52 -2.185848 0.617896
90 -2.155343 -1.132673
.. ... ...
65 1.736506 -0.170502
0 1.770901 0.520490
60 1.878376 0.206113
63 2.263602 1.112115
33 2.384195 -1.877502
[100 rows x 2 columns]
现在,我想对它进行“窗口化”或“离散化”并获取每个窗口的统计信息。但我不想做熊猫moving-window functions,因为它们按行定义窗口。我想通过 x 值的范围来定义窗口,因此是“x 值窗口”。具体来说,让我们用 2 个参数定义每个 x-value-window:
- 每个窗口的中心 x 值
- 在本例中,假设我希望 x = 0.0 + 0.4 * k 用于所有正或负 k
- 因此 -3.2, -2.8, -2.4, ..., 1.6, 2.0, 2.4
- 每个窗口的宽度
- 在这个例子中,假设我想要 W = 0.5
- 因此,示例窗口将为 [-3.2-0.25, -3.2+0.25], [-2.8-0.25, -2.8+0.25], ..., [2.4-0.25, 2.4+0.25]
- 注意窗口重叠,这是有意的
如此定义了窗口,我想问一下是否有一个函数会产生以下数据框(或 numpy 数组):
x y
-3.2 mean of y-values in x-value-window centered at -3.2
-2.8 mean of y-values in x-value-window centered at -2.8
-2.4 mean of y-values in x-value-window centered at -2.4
... ...
1.6 mean of y-values in x-value-window centered at 1.6
2.0 mean of y-values in x-value-window centered at 2.0
2.4 mean of y-values in x-value-window centered at 2.4
有什么可以为我做这件事的吗?还是我必须完全自己动手(可能是在一个非常慢的 python 循环中,而不是快速的 numpy 或 pandas 代码)?
额外1:如果支持加权窗口会更好(例如由Pandas的@987654322@支持),但当然在这种情况下的权重不会基于多远样本的行距窗口的中心行,而是样本的 x 值距 x 值窗口中心的距离。
额外 2: 如果在 x-value-windows 上支持除均值以外的统计数据,例如(a) 每个 x 值窗口中 y 值的方差或 (b) 每个 x 值窗口内的样本数。
【问题讨论】: