索引和func在带有DateOffs的数据帧中的应用

2024-05-16 23:21:14 发布

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

取以下正态分布项的数据帧,有一个小漂移:

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索引?你知道吗

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


Tags: 方法代码dfindexnprandomstartend
1条回答
网友
1楼 · 发布于 2024-05-16 23:21:14

首先,我要说你的代码相当简洁。我将提出以下意见和建议:

您的索引是以'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

以及

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

额外学分

这个数学也适用于整个索引。你知道吗

df.index + 2

每个索引值加两个月。你知道吗

相关问题 更多 >