当开始是列指定的时,计算窗口的平均向量

2024-04-25 23:54:16 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下数据:

In [79]:

df = pd.DataFrame( data=nr.randn(8,4), index=pd.date_range( '2014-01-01', periods=8 ), columns=string.split( 'z a o p' ) )
df
Out[79]:
z   a   o   p
2014-01-01   0.737081    0.409902    0.077970    1.710260
2014-01-02  -0.686835   -1.588592    0.652161   -1.196529
2014-01-03  -1.217688   -1.156016    1.448976    0.415068
2014-01-04   0.336256   -0.559507    0.917721    0.106411
2014-01-05   0.043473   -1.221673   -0.598708    1.489676
2014-01-06  -0.858759    0.508017   -1.611998    0.581115
2014-01-07  -0.672269   -0.247206   -0.312354    0.493086
2014-01-08   1.346462   -1.805292    2.807642    0.365685
8 rows × 4 columns

对于每一列,我都有一个开始日期:

In [83]:
start = pd.Series( data=pd.to_datetime( [ '2014-01-05', '2014-01-06', '2014-01-06', '2014-01-03' ] ), index=string.split( 'z a o p' ) )
start
Out[83]:
z   2014-01-05
a   2014-01-06
o   2014-01-06
p   2014-01-03
dtype: datetime64[ns]
In [94]:

期望输出是4个红色向量的平均向量,其中每个红色向量以相应的开始日期为中心:

Desired output

我目前的解决方案非常简单。我只是循环,加和除:

res = pd.Series( data=[0.] * 3 )
for name, dt in start.iteritems() :
    res += df.loc[ dt - datetime.timedelta( days=1 ): dt + datetime.timedelta( days=1 ), name ].values
res /= 4
res
Out[94]:
0   -0.670163
1   -0.161360
2   -0.327977
dtype: float64

我想知道是否有一个巧妙的解决方案使用内置函数。你知道吗


Tags: columnsindfdatadatetimestringindexdt
2条回答

计算3个窗口的滚动平均列

In [42]: x = pd.rolling_mean(df,window=3)

In [43]: x
Out[43]: 
                   z         a         o         p
2014-01-01       NaN       NaN       NaN       NaN
2014-01-02       NaN       NaN       NaN       NaN
2014-01-03 -0.052058  0.236828  0.458659 -0.945181
2014-01-04 -0.171851  0.522897  0.677144  0.136008
2014-01-05 -0.538397  0.737885  0.257929  0.765763
2014-01-06 -0.809379 -0.117525  0.605199  0.422414
2014-01-07 -0.931384  0.346631  1.000791  0.428991
2014-01-08 -0.484385  0.034858  1.042445  0.362800

选择我们想要的列/索引对(unstack使用这些对创建一个多索引)

In [44]: x.unstack().loc[list(start.iteritems())]
Out[44]: 
z  2014-01-05   -0.538397
a  2014-01-06   -0.117525
o  2014-01-06    0.605199
p  2014-01-03   -0.945181
dtype: float64

最后的平均数,如果你需要它是一个简单的平均数系列从44

In [45]: x.unstack().loc[list(start.iteritems())].mean()
Out[45]: -0.24897596517522122

我认为可以通过以下方法来实现:

np.array([np.diagonal(df.shift(i).loc[start]) for i in [-1, 0, 1]]).mean(1)

基本上,df.shift(0).loc[start]给出一个4x4,我们只需要对角线元素。然后我们将4x4上下移动,得到我们想要的每列的另外两个值。把所有的都放到一个array中,得到.mean()。你知道吗

相关问题 更多 >