Pandas - 当开始是特定于列时计算窗口的平均向量

时间:2014-06-12 14:26:01

标签: python pandas

考虑以下数据:

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

我想知道是否有使用pandas内置函数的更流畅的解决方案。

2 个答案:

答案 0 :(得分:0)

我认为可以通过以下方式完成:

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()

答案 1 :(得分:0)

为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