2017-04-04 2 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

これは、広告機能として動作するローリング機能のケースの1つですが、実行したいことはしません。

ローリング機能は、任意のデータを使用するように設計されて

だけではなく、時系列:rolling_meanを使用した場合、そのように説明のために、私はrollingを使用しますrollingの賛成で廃止される予定だとパンダの最新バージョンでは、警告を取得する必要があります。それで、x個のユニットを振り返ってみます。ルックバックは、windowパラメータで設定します。また、データフレームのソート順に基づいてルックバックを行います。あなたがデータを正しくソートしたとしても、rollingは、5のウィンドウを与えた年を意味するのか分かりません... "5つのセルを振り返ってみる"

あなたはそれらの値を何かで埋める必要がある欠損値を持つデータと比較します。 NaNを使用するか、Pandasが提供する多くの補間方法のいずれかを使用できます。きれいに10点の値と日付dfを例にソート返し

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 

:あなたは、合成データを使用するためにいくつかの簡単なを提供しなかったので、私はいくつかのセットアップを設定

:私はNaN方法を説明しますインデックス:

   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で満たさ欠落データと毎日のデータの完全なセットを持っています。あなたは、元の日付のバックのみローリング平均を選択したい場合はあなたができる、

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

:同じ3つの値を印刷し、もう一度、

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'] 

と:今、私たちは、ローリング平均を行うことができますちょっと一本のライナーでそれをしてください:

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の各セルを1日に設定すると、1年は365 ... so yup、365 * 10 –

0

ローリングデータを計算する前に、インデックスに対してデータフレームをソートしてください。