Python:カテゴリ変数のローリングアワータイムカウント

Oct 04 2020

列のあるパンダデータフレームがあり、それぞれの過去1時間の['DateTime', 'Variable']ローリングカウントを取得しようとしています。思考ピボットはどういうわけか使用できます。Variable

サンプルデータ

DateTime             Variable
8/24/19 3:30PM       A
8/24/19 3:32PM       A
8/24/19 3:36PM       B
8/24/19 3:50PM       C
8/25/19 2:50PM       A

期待される出力

DateTime          A    B    C
8/24/19 3:30PM    1    0    0 
8/24/19 3:32PM    2    0    0  
8/24/19 3:36PM    2    1    0 
8/24/19 3:50PM    2    1    1
8/25/19 2:50PM    1    0    0

新しい変数が追加または削除される可能性があるため、動的なソリューションが必要です。

回答

RichieV Oct 04 2020 at 02:47

実際には、で開始することも、pivotを使用して手動で実行することもできgroupby.unstackます。

次に、多くの関数で集約できるローリングウィンドウdf.rollingを作成することを探しています。タイムデルタ(この場合は1時間)でウィンドウを作成するには、インデックスがタイプであることを確認する必要があります。datetime

df['DateTime'] = pd.to_datetime(df['DateTime'])

out = (
    df
    .groupby(['DateTime', 'Variable']) # set the columns as index
    .size() # aggregate by row count
    .unstack(fill_value=0) # move 'Variable' index level to columns
    .sort_index()
)

out = out.rolling('1h').sum()

出力

Variable               A    B    C
DateTime
2019-08-24 15:30:00  1.0  0.0  0.0
2019-08-24 15:32:00  2.0  0.0  0.0
2019-08-24 15:36:00  2.0  1.0  0.0
2019-08-24 15:50:00  2.0  1.0  1.0
2019-08-25 14:50:00  1.0  0.0  0.0
PrakritiShaurya Oct 04 2020 at 02:01

dfがデータセットであると考える:new_df = df [df ['Variable'] == 'A']。resample( 'H')。count()

次のように新しいデータフレームを作成できます。final_df= pd.DataFrame({'DateTime':new_df.index、 'A':new_df.values})

同様に、Variable列の各カテゴリのカウントを取得し、ループを使用してfinal_dfに連結してみます。

私はそれを試していませんが、うまくいけばうまくいくでしょう。