2017-07-21 53 views
1

采取正态分布术语的下列数据帧用小漂移:索引&施加FUNC到大熊猫数据帧与DateOffset

np.random.seed(123) 
df = pd.DataFrame(np.random.randn(60,3)/100 + 0.005, 
        index=pd.date_range(end='2017-06-30', periods=60, freq='M')) 

和定义一个函数rollup将被施加到列:

def rollup(r): 
    return r.add(1.).prod() -1. 

例如,号召整个df给我:

print(rollup(df)) 
0 0.17411 
1 0.35658 
2 0.24944 
dtype: float64 

但是我想要做的是从df索引中的最后日期开始计算日期偏移量,并将rollup应用于该子帧。我正确地做到了这一点,如下所示,但是想知道是否有另外一种方法使用更少的线。

from pandas.tseries.offsets import DateOffset 
end = df.index[-1] 

start = end - DateOffset(years=2)  
print(df[start:end].apply(rollup)) 
0 0.07905 
1 0.18037 
2 0.09656 
dtype: float64 

# example 2 
start = end - DateOffset(months=6)  
print(df[start:end].apply(rollup)) 
0 0.01656 
1 0.06585 
2 0.01463 
dtype: float64 

这段最后一段代码能被压缩吗? Time Series/Date functionality内是否有另一种方法,不需要我指定end,应用DateOffset,然后在两者之间索引df

如果这是需要最少代码的最直接的方法,那对我来说本身就是一个答案。

回答

1

首先,我会说你的代码非常简洁。我将提出以下观察和建议:

您的索引创建频率为'M',并转交给每个人Timestamp。这意味着这些对象现在知道如何处理整数的加法和减法。 pandas所做的是假定整数取决于频率表示的偏移量。

df.index[-1] 

Timestamp('2017-06-30 00:00:00', freq='M') 

而且

df.index[-1] - 2 

Timestamp('2017-04-30 00:00:00', freq='M') 

我们可以利用这个与

rollup(df[df.index[-1] - 2:]) # last 2 months 

而且

,以实现自己的目标

加分

这样算算也适用于整个索引。

df.index + 2 

为每个指标值添加两个月。

+0

谢谢。我实际上选择使用特定的[DateOffset'](https://pandas.pydata.org/pandas-docs/stable/timeseries.html#dateoffset-objects)对象,而不是通用的'DateOffset'。并且可能会保持代码原样,因为我有时使用不同的频率。 –

+0

足够公平......正如我所说,你的代码看起来很好,开始于:-) – piRSquared