2016-12-09 6 views
0

データは、現在の4時間ブロックではなく1時間ごとのレートに再サンプリングする方法を理解する上で課題に固執しています。ここに何が求められているのですか?リサンプリングと補間

差異 ENTRIESおよびEXITSフィールドは、毎週ゼロにリセットされない生カウントを保持します。私たちは、4時間の期間にいくつのエントリーと出口があるか知りたいと思っています。これを計算するには、同じ(UNIT、C/A、SCP)キーを持つ隣接する行の間の差を計算する必要があります。これらの数値を格納するNUM_ENTRIES列とNUM_EXITS列を作成します。

ヒント:

シフト方法が便利です。 サブユニット間の境界を尊重するので、シフトを行うときにgroupbyを使用する方が簡単になります。レベル引数は、サブユニットの定義に役立ちます。 カウンタのほとんどはカウントアップしますが、カウントダウンするカウンタもあります。あなたはそのようなケースをどのように扱うべきですか?余分なクレジットのためにこれを修正します。

前の質問の数字の1つの問題は、それらが異なる時にサンプリングされることです。 ENTRIES列とEXITS列を時間単位のレートに再サンプリングし、補間して欠損値を記入します。単調性を保つように、 "pchip"補間法を使用してください。この場合も、groupbyを使用してグループで実行する必要がありますが、apply関数では任意の補間メソッドを使用できます。ここで、パート2のNUM_ENTRIES列とNUM_EXITS列を再計算してください。 ヒント: reset_indexを使用して、索引のUNIT、C/AおよびSCPレベルをクリアします。これにより、apply関数で使用されるリサンプルおよび補間メソッドがより簡単になります。 set_indexを使用して内挿を実行した後でインデックスを追加します。ここ

は、私は

df = pd.read_csv("turnstile_161126.txt") 
timestamp =pd.to_datetime(df['DATE'] + ' ' + df['TIME']) 
df.insert(3, 'TIMESTAMP', timestamp) 
df.columns = df.columns.str.strip() 
df = df.set_index(['UNIT','C/A','SCP','TIMESTAMP']) 
df['NUM_ENTRIES'] = df.ENTRIES - df.ENTRIES.shift(1) 
df['NUM_EXITS'] = df.EXITS - df.EXITS.shift(1) 

       STATION LINENAME DIVISION DATE TIME DESC ENTRIES EXITS NUM_ENTRIES NUM_EXITS 
UNIT C/A SCP TIMESTAMP          
R051 A002 02-00-00 2016-11-19 03:00:00 59 ST NQR456W BMT 11/19/2016 03:00:00 REGULAR 5924658 2007780 NaN NaN 
2016-11-19 07:00:00 59 ST NQR456W BMT 11/19/2016 07:00:00 REGULAR 5924672 2007802 14.0 22.0 
2016-11-19 11:00:00 59 ST NQR456W BMT 11/19/2016 11:00:00 REGULAR 5924738 2007908 66.0 106.0 
2016-11-19 15:00:00 59 ST NQR456W BMT 11/19/2016 15:00:00 REGULAR 5924979 2007980 241.0 72.0 
2016-11-19 19:00:00 59 ST NQR456W BMT 11/19/2016 19:00:00 REGULAR 5925389 2008056 410.0 76.0 
2016-11-19 23:00:00 59 ST NQR456W BMT 11/19/2016 23:00:00 REGULAR 5925614 2008081 225.0 25.0 
2016-11-20 03:00:00 59 ST NQR456W BMT 11/20/2016 03:00:00 REGULAR 5925684 2008096 70.0 15.0 
2016-11-20 07:00:00 59 ST NQR456W BMT 11/20/2016 07:00:00 REGULAR 5925688 2008113 4.0 17.0 
2016-11-20 11:00:00 59 ST NQR456W BMT 11/20/2016 11:00:00 REGULAR 5925755 2008191 67.0 78.0 
2016-11-20 15:00:00 59 ST NQR456W BMT 11/20/2016 15:00:00 REGULAR 5925937 2008260 182.0 69.0 
2016-11-20 19:00:00 59 ST NQR456W BMT 11/20/2016 19:00:00 REGULAR 5926232 2008332 295.0 72.0 
2016-11-20 23:00:00 59 ST NQR456W BMT 11/20/2016 23:00:00 REGULAR 5926394 2008367 162.0 35.0 
2016-11-21 03:00:00 59 ST NQR456W BMT 11/21/2016 03:00:00 REGULAR 5926425 2008378 31.0 11.0 
2016-11-21 07:00:00 59 ST NQR456W BMT 11/21/2016 07:00:00 REGULAR 5926440 2008420 15.0 42.0 
2016-11-21 11:00:00 59 ST NQR456W BMT 11/21/2016 11:00:00 REGULAR 5926622 2008741 182.0 321.0 
2016-11-21 15:00:00 59 ST NQR456W BMT 11/21/2016 15:00:00 REGULAR 5926872 2008851 250.0 110.0 
2016-11-21 19:00:00 59 ST NQR456W BMT 11/21/2016 19:00:00 REGULAR 5927775 2008927 903.0 76.0 

https://i.stack.imgur.com/M0595.png

full data set

+0

「UNIT」で何をグループ化していますか? – NickBraunagel

+0

持っているデータフレームを画像サンプルとして投稿できますか?あなたが持っているカラム/インデックスを確認するのは難しいです。 – NickBraunagel

+0

投稿の最後に画像が追加された@NickBraunagel。助けてくれてありがとう。私はあなたのコードを実行しようとしてみましたが、それを使って遊んでいましたが、あなたがやろうとしたこととは違う何かをしたと思います。 –

答えて

0

を再サンプリングするように要求された部分にまで持っていたコードですUPDATED ANSWER:

import pandas as pd 
import random 
from random import randint 
from dateutil.relativedelta import relativedelta 
import datetime 

start = datetime.datetime(2016,1,1) 
r = range(0,2000) 
units = ['UnitA','UnitB','UnitC'] 
CA = ['A002','B002','C002'] 
CSP = ['02-00-00','03-00-00','04-00-00'] 

DF = pd.DataFrame() 

# create dummy dataframe  
for unit in units: 

    date = [start + relativedelta(hours=4*i) for i in r] 
    Entries = [random.uniform(5000000, 6000000) for i in r] 
    Exits = [random.uniform(1000000, 2000000) for i in r] 

    df = pd.DataFrame(data={ 
      'date': date, 
      'unit': unit, 
      'Entries': Entries, 
      'Exits': Exits, 
      'CA': CA[randint(0,2)], 
      'CSP': CSP[randint(0,2)], 
     }) 

    DF = pd.concat([DF,df]) 

# set index based upon desired groupby PLUS date column 
DF.set_index(keys=['unit','CA','CSP','date'], inplace=True) 

# show results 
print DF[['Entries','Exits']].unstack(['unit','CA','CSP']).resample('1H').interpolate(method='pchip')  # <--if desired, add .unstack() at end to re-arrange DF 

が生成する:

enter image description here

+0

私は実際に "UNIT"、 "C/A"、 "SCP"、 "TIMESTAMP"をグループ化する必要があります。 –