5分ごとに計測する機器が1か月間計測したデータがあり、そのデータの欠損している時刻の値を補完するプログラムを組みました。
補完の方法は、全データから、その欠損しているデータの時間帯と曜日が一致しているデータをすべて抽出し、その平均値を欠損値とするという方法です。
作成したプログラムを実行してみたのですが、実行速度がとても遅く実行できませんでした。
追記:実行したところ以下のようなエラーが発生しました。
PYTHON
1File "pandas\_libs\lib.pyx", line 2279, in pandas._libs.lib.to_object_array 2numpy.core._exceptions.MemoryError: Unable to allocate array with shape (3440828, 10) and data type object 3
pandasにfor文に適用すると処理速度が遅くなるようなので、for文を使わずにこの処理を行う方法があればご指摘いただきたいです。
PYTHON
1import pandas as pd 2 3df = pd.read_csv("aaa.csv",encoding="shift-jis",engine = "python") 4 5df['時刻'] = pd.to_datetime(df['時刻']) 6 7#欠損している時刻の補完 8date_df = pd.DataFrame(pd.date_range('2018/09/01 00:00:00', '2018/09/30 23:55:00', freq='5T'), columns=['時刻']) 9id_df = pd.DataFrame(df['計測地点番号'].unique(), columns=['計測地点番号']) 10 11date_df['key'] = 0 12id_df['key'] = 0 13tmp_df = date_df.merge(id_df, on='key').drop('key', axis=1) 14 15sum_df = pd.DataFrame(df.groupby(['計測地点番号', '時刻']).sum()['断面交通量']).reset_index() 16sum_df = tmp_df.merge(sum_df, on=['時刻', '計測地点番号'], how='left') 17sum_df.fillna(0) 18 19#欠損している時刻の、ある値の補完 20for index, row in sum_df.iterrows(): 21 if row['断面交通量'] ==0: 22 dt1= dt[dt['時刻'].dt.dayofweek == row['時刻'].dt.dayofweek] 23 dt2= dt1[dt1['時刻'].strftime('%H:%M') == row['時刻'].strftime('%H:%M')] 24 sum_df.at[index,'断面交通量']=dt2['断面交通量'].mean() 25 26print(sum_df) 27
下に示すリンクの「一般道路の「断面交通量情報」 (2019年8月分)」がほぼ同じ形式のデータになります。
同じ形式のデータ
プログラムでは2018年9月ですが,用意できたデータは2019年8月のみでした。
回答1件
あなたの回答
tips
プレビュー