Pandas - 在多列上使用 `.rolling()`
Pandas - Using `.rolling()` on multiple columns
考虑一个 pandas DataFrame
看起来像下面的那个
A B C
0 0.63 1.12 1.73
1 2.20 -2.16 -0.13
2 0.97 -0.68 1.09
3 -0.78 -1.22 0.96
4 -0.06 -0.02 2.18
我想使用函数 .rolling()
为 t = 0,1,2
执行以下计算:
- Select 从
t
到 t+2
的行
- 从所有列中取出这 3 行中包含的 9 个值。调用此集合
S
- 计算
S
的第 75 个百分位数(或关于 S
的其他汇总统计数据)
例如,对于 t = 1
我们有
S = { 2.2 , -2.16, -0.13, 0.97, -0.68, 1.09, -0.78, -1.22, 0.96 } 并且第 75 个百分位数是 0.97。
我找不到使它与 .rolling()
一起工作的方法,因为它显然需要单独处理每一列。我现在依赖于 for 循环,但它真的很慢。
您对更有效的方法有什么建议吗?
一种解决方案是 stack
数据,然后将 window 大小乘以列数,然后将结果除以列数。此外,由于您想要前瞻性 window,因此请反转堆叠的顺序 DataFrame
wsize = 3
cols = len(df.columns)
df.stack(dropna=False)[::-1].rolling(window=wsize*cols).quantile(0.75)[cols-1::cols].reset_index(-1, drop=True).sort_index()
输出:
0 1.12
1 0.97
2 0.97
3 NaN
4 NaN
dtype: float64
列多而小的情况window:
import pandas as pd
import numpy as np
wsize = 3
df2 = pd.concat([df.shift(-x) for x in range(wsize)], 1)
s_quant = df2.quantile(0.75, 1)
# Only necessary if you need to enforce sufficient data.
s_quant[df2.isnull().any(1)] = np.NaN
输出:s_quant
0 1.12
1 0.97
2 0.97
3 NaN
4 NaN
Name: 0.75, dtype: float64
你可以使用 numpy ravel。您可能仍然需要使用 for 循环。
for i in range(0,3):
print(df.iloc[i:i+3].values.ravel())
如果您的 t
步进 3 秒,您可以使用 numpy reshape
函数创建一个 n*9
数据框。
考虑一个 pandas DataFrame
看起来像下面的那个
A B C
0 0.63 1.12 1.73
1 2.20 -2.16 -0.13
2 0.97 -0.68 1.09
3 -0.78 -1.22 0.96
4 -0.06 -0.02 2.18
我想使用函数 .rolling()
为 t = 0,1,2
执行以下计算:
- Select 从
t
到t+2
的行
- 从所有列中取出这 3 行中包含的 9 个值。调用此集合
S
- 计算
S
的第 75 个百分位数(或关于S
的其他汇总统计数据)
例如,对于 t = 1
我们有
S = { 2.2 , -2.16, -0.13, 0.97, -0.68, 1.09, -0.78, -1.22, 0.96 } 并且第 75 个百分位数是 0.97。
我找不到使它与 .rolling()
一起工作的方法,因为它显然需要单独处理每一列。我现在依赖于 for 循环,但它真的很慢。
您对更有效的方法有什么建议吗?
一种解决方案是 stack
数据,然后将 window 大小乘以列数,然后将结果除以列数。此外,由于您想要前瞻性 window,因此请反转堆叠的顺序 DataFrame
wsize = 3
cols = len(df.columns)
df.stack(dropna=False)[::-1].rolling(window=wsize*cols).quantile(0.75)[cols-1::cols].reset_index(-1, drop=True).sort_index()
输出:
0 1.12
1 0.97
2 0.97
3 NaN
4 NaN
dtype: float64
列多而小的情况window:
import pandas as pd
import numpy as np
wsize = 3
df2 = pd.concat([df.shift(-x) for x in range(wsize)], 1)
s_quant = df2.quantile(0.75, 1)
# Only necessary if you need to enforce sufficient data.
s_quant[df2.isnull().any(1)] = np.NaN
输出:s_quant
0 1.12
1 0.97
2 0.97
3 NaN
4 NaN
Name: 0.75, dtype: float64
你可以使用 numpy ravel。您可能仍然需要使用 for 循环。
for i in range(0,3):
print(df.iloc[i:i+3].values.ravel())
如果您的 t
步进 3 秒,您可以使用 numpy reshape
函数创建一个 n*9
数据框。