Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 索引及;将func应用于具有日期偏移量的数据帧_Python_Python 3.x_Pandas_Datetime_Time Series - Fatal编程技术网

Python 索引及;将func应用于具有日期偏移量的数据帧

Python 索引及;将func应用于具有日期偏移量的数据帧,python,python-3.x,pandas,datetime,time-series,Python,Python 3.x,Pandas,Datetime,Time Series,取以下具有小漂移的正态分布项的数据帧: 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')) 并定义将应用于列的函数汇总: def rollup(r): return r.add(1.).prod() -1. 例如,调用整个df可以

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

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'))
并定义将应用于列的函数
汇总

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
这最后一段代码可以压缩吗?是否有其他方法不需要我指定
结束
,应用
日期偏移量
,然后在两者之间建立索引
df


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

首先,我认为您的代码非常简洁。我将提出以下观察和建议:

您的索引是以
'M'
的频率创建的,它会传递到每个
时间戳
。这意味着这些对象现在知道如何处理整数的加法和减法。
pandas
所做的是假设整数采用频率表示的偏移量

示例

df.index[-1]

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

我们可以用它来实现您的目标

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


额外学分

这个数学也适用于整个索引

df.index + 2

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

谢谢。实际上,我选择使用特定对象,而不是通用的
DateOffset
。而且可能会保持代码不变,因为我有时使用不同的频率工作。很公平。。。正如我所说,您的代码一开始看起来很好:-)
rollup(df[df.index[-1] - 24:])  # last 2 years
df.index + 2