2017-04-04 63 views
1

我有一个数据帧,其中我的索引是datetime dtype,但日期不是按任何顺序排列。我正在计算我的数据集的5年和10年移动平均值。通过使用.rolling_mean,我可以根据我设置窗口的平均值来计算平均值,但是,由于日期不是顺序的,所以这不起作用。熊猫5年&10年移动平均值

Dataframe: 
    Date   Count 
    1981-01-08 10 
    1981-05-12 65 
    1982-03-17 96 
    1982-09-15 33 
    1982-12-01 85 
    1983-02-03 14 
    . 
    . 
    . 
    2017-01-28 56 

Code: 
counts_df = pd.DataFrame(df.groupby('DATE').size().rename('counts')) 
start_date_periods = counts_df.loc[counts_df.index > '1981-01-01'] 
start_date_periods['5yrMA'] = pd.rolling_mean(start_date_periods, window=5) 
start_date_periods['10yrMA'] = pd.rolling_mean(start_date_periods, window=10) 

回答

2

这是滚动功能的其中一种广告模式,但并未按照您希望的方式进行操作。

滚动功能的设计与任何数据进行工作,而不仅仅是时间序列:在熊猫的最新版本,因为它是有利于rolling被弃用所以为了说明,我将使用rolling你应该使用rolling_mean时得到一个警告。所以它'回顾'x个单位。回头参数设置为window。它根据数据帧的排序顺序进行回顾。所以,即使你正确地排序你的数据,rolling不知道你的意思是你给它一个5窗口的时间......它只能看到“回看5个单元格”

所以如果你想回头看看5针对缺少值的数据,您需要用这些值填充这些值。您可以使用NaN或者您可以使用Pandas提供的众多插值方法之一。我要说明的NaN方法:

因为你没有提供一些易于使用的合成数据,我设置一些了:

np.random.seed(1) 
ts_data = pd.DataFrame(np.random.randn(6210), 
         index = pd.date_range('2000-01-01', '2016-12-31', freq='D'), 
         columns=['data']) # index of every day for 7 years 

ts_sample = ts_data.sample(n=10).sort_index() ## sample then sort 
print ts_sample 

返回一个很好的例子分类与DF 10个值和日期指数:

   data 
2001-07-21 0.107343 
2003-07-12 0.658537 
2004-08-21 -0.463338 
2006-07-13 -0.866955 
2011-12-14 0.020956 
2012-05-14 -2.685125 
2012-12-27 0.494037 
2013-06-09 -1.299026 
2013-12-12 0.371309 
2015-06-17 0.201656 
为了填补这些缺失值,让我们创建一个新的DF与只是一个完整的索引与所有天

这样:

full_period = pd.DataFrame(index = pd.date_range('2000-01-01', '2016-12-31', freq='D')) 

因为熊猫如何使用索引的,如果你弹出我们的例子中数据转换成一列,大熊猫将在遗漏值填充NaN

full_period['data'] = ts_sample.data 
print full_period['2015-06-16':'2015-06-18'] 

,我只打印3天,以便我们可以看到它是如何弹出数据:

   data 
2015-06-16  NaN 
2015-06-17 0.201656 
2015-06-18  NaN 

所以现在我们有全套用充满NaN丢失数据的日常数据。现在,我们可以做的滚动平均值:

rolling = full_period.rolling(min_periods=1, window=365*5,center=False).mean() # daily data so using 5 years of days 
print rolling['2015-06-16':'2015-06-18'] 

,并再次,打印相同的3个值:

   data 
2015-06-16 -0.619570 
2015-06-17 -0.482699 
2015-06-18 -0.482699 

,如果你想选择回来只为您的原始日期的滚动平均值,可以用一个小班轮来做这件事:

print rolling.ix[ts_sample.index.tolist()] 

       data 
2001-07-21 0.107343 
2003-07-12 0.382940 
2004-08-21 0.100847 
2006-07-13 -0.141103 
2011-12-14 0.020956 
2012-05-14 -1.332085 
2012-12-27 -0.723377 
2013-06-09 -0.867290 
2013-12-12 -0.619570 
2015-06-17 -0.482699 
+0

这是超级有用的,我很欣赏你花在这个答案上的时间。只是为了确认,如果我想计算滚动10年移动平均值,我会设置窗口= 365 * 10是否正确? – spacedinosaur10

+1

如果您将df中的每个单元格设置为一天,那么一年365年......所以,365 * 10 –

0

在计算滚动数据之前,将您的数据框与索引进行排序。