【问题标题】:Indexing & applying func to pandas DataFrame with a DateOffset使用 DateOffset 对 pandas DataFrame 进行索引和应用 func
【发布时间】:2017-12-27 16:06:09
【问题描述】:

采用以下具有小漂移的正态分布术语的DataFrame:

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

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

【问题讨论】:

    标签: python python-3.x pandas datetime time-series


    【解决方案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
    

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

    额外积分

    这个数学运算也适用于整个索引。

    df.index + 2
    

    为每个索引值添加两个月。

    【讨论】:

    • 谢谢。我实际上选择使用特定的DateOffset 对象而不是通用的DateOffset。并且可能会保持代码不变,因为我有时会使用不同的频率。
    • 很公平......正如我所说,你的代码看起来不错:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2019-04-22
    • 1970-01-01
    • 2017-06-11
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多