2016-09-12 10 views
4

私は(現在の観測含むない)最後の5日間にわたりXパンダ:過去数日間の変数のローリング合計はどのように計算されますか?

  • sumを含む変数を作成したいと思います

    df = pd.DataFrame({ 'X' : np.random.randn(50000)}, index=pd.date_range('1/1/2000', periods=50000, freq='T')) 
    
    df.head(10) 
    Out[37]: 
              X 
    2000-01-01 00:00:00 -0.699565 
    2000-01-01 00:01:00 -0.646129 
    2000-01-01 00:02:00 1.339314 
    2000-01-01 00:03:00 0.559563 
    2000-01-01 00:04:00 1.529063 
    2000-01-01 00:05:00 0.131740 
    2000-01-01 00:06:00 1.282263 
    2000-01-01 00:07:00 -1.003991 
    2000-01-01 00:08:00 -1.594918 
    2000-01-01 00:09:00 -0.775230 
    

    を次のように私は、データフレームを持っている

  • は、現在の観測とまったく同じ時刻に観測される観測値のみを考慮します。すなわち

:インデックス2000-01-01 00:00:00

  1. df['rolling_sum_same_hour']は、Xの値が(もちろん2000-01-01含まない)データの最後の5日間00:00:00で観察された和を含んでいます。
  2. インデックス2000-01-01 00:01:00において、df['rolling_sum_same_hour']は、最後の5日間の00:00:01に観察されるXの合計を含み、以下同様である。

直感的なアイデアは、日中の価格が日中の季節性を持っていることです。私はそのように取り除きたいと思います。

ノー成功を収めてdf['rolling_sum_same_hour']=df.at_time(df.index.minute).rolling(window=5).sum()

を使用しようとしました。 アイデア

多くの感謝!

+1

あなたはブールインデックス試みることができる: 'DF [ 'rolling_sum_same_hour'] = DFを[df.index.hour == 16] .rolling(window = 10).sum() 'あなたは分、秒などを考慮に入れてフィルタを任意に細かくすることができますが、冗長になります... meh – StarFox

+1

それははっきりしません。 'rolling_sum_same_hour'カラムの値は何時から何時まで(例えば' 00:00'と '01:00' - ' ['00:01 '、'00:02'、。 ..、'00:59 ']))? – MaxU

+1

@Noobie:あなたの提案に問題がないという事実はもちろん! – StarFox

答えて

3

力を見てくださいgroupby

df = # as you defined above 
df['rolling_sum_by_time'] = df.groupby(df.index.time)['X'].apply(lambda x: x.shift(1).rolling(10).sum()) 

それが飲み込む大きな錠剤ですが、我々は(Pythonのdatetime.timeのと同様に)時間によってグループ化され、その後、我々は(他に気に列が適用され得ることが列で動作します - それは今で動作します時間グループ)を作成し、必要な機能を適用します。

+0

@starfoxに感謝しますが、私は元のデータフレームに含めるためにrollingsumカラムが必要です! –

+1

@Noobie:私は狂っていない限り、ちょうど私が作ったその編集と同じくらい単純なはずです – StarFox

+0

thatsは現在の観測を考慮すべきではないという要件を除いてかなり良いかもしれません。 'x.rolling(10).shift(1).sum()'は現在のobsを除外するように働くでしょうか? –

2

IIUC、あなたが望むのは、正確な同じ時刻でグループ分けされた観測でのみ、ローリング合計を実行することです。これは、例えば、(5と10の期間の間にあなたの質問を交互いることに注意してください)

df.X.groupby([df.index.hour, df.index.minute]).apply(lambda g: g.rolling(window=5).sum()) 

によって行うことができます。

In [43]: df.X.groupby([df.index.hour, df.index.minute]).apply(lambda g: g.rolling(window=5).sum()).tail() 
Out[43]: 
2000-02-04 17:15:00 -2.135887 
2000-02-04 17:16:00 -3.056707 
2000-02-04 17:17:00 0.813798 
2000-02-04 17:18:00 -1.092548 
2000-02-04 17:19:00 -0.997104 
Freq: T, Name: X, dtype: float64 
+0

あなたの助けに@amitavoryに感謝します! –

+1

@noobieよろしくお願いします。がんばろう。 –

関連する問題