考虑以下数据:
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个红色矢量的平均矢量,其中每个红色矢量以相应的开始日期为中心:
我目前的解决方案非常简单。我只是循环,添加和划分:
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内置函数的更流畅的解决方案。
答案 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