考虑以下数据:
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
我想知道是否有一个巧妙的解决方案使用内置函数。你知道吗
计算3个窗口的滚动平均列
选择我们想要的列/索引对(unstack使用这些对创建一个多索引)
最后的平均数,如果你需要它是一个简单的平均数系列从44
我认为可以通过以下方法来实现:
基本上,
df.shift(0).loc[start]
给出一个4x4,我们只需要对角线元素。然后我们将4x4上下移动,得到我们想要的每列的另外两个值。把所有的都放到一个array
中,得到.mean()
。你知道吗相关问题 更多 >
编程相关推荐