東京電力の2017-2019年の1時間ごと電力需要量を使用しています。
対象日の2日前からの値を使用して平日は3日間の移動平均、休日は2日間移動平均を計算し、dfに列として追加したいです。
また、過去の値を使用するため最初の何日かの行は計算できないので、その行は空白で処理したいです。
自分でも2個目のコードで試したのですが、エラーがでて計算することができませんでした。
どなたかエラーを修正できる方かもっと効率的に計算できる方がいましたら教えてください。
長い質問となっておりますが、お願いいたします。
理想の出力
||実績(万kW)|DATETIME|weekday|holiday|ele_3daysmean|
|:--|:--:|--:|
|0|2783|2017-01-01 00:00:00|6|1|None|
|1|2634|2017-01-01 00:00:00|6|1|None|
||||
|8759|3029|2019-12-31 23:00:00|1|0|3日間平均値|
python
1import pandas as pd 2import datetime as dt 3import numpy as np 4import jpholiday 5#東京電力からデータを取得 6ur1 = 'http://www.tepco.co.jp/forecast/html/images/juyo-2019.csv' 7df1 = pd.read_csv(ur1, encoding='shift_jis', skiprows=2) 8ur2 = 'http://www.tepco.co.jp/forecast/html/images/juyo-2018.csv' 9df2 = pd.read_csv(ur2, encoding='shift_jis', skiprows=2) 10ur3 = 'http://www.tepco.co.jp/forecast/html/images/juyo-2017.csv' 11df3 = pd.read_csv(ur3, encoding='shift_jis', skiprows=2) 12 13#3年のデータを結合し、日時の古い順にソート 14df = pd.concat([df1, df2, df3], axis=0) 15df['DATE'] = pd.to_datetime(df['DATE'], format='%Y/%m/%d') 16df['TIME'] = pd.to_datetime(df['TIME']) 17df['DATETIME'] = pd.to_datetime(df['DATE'].dt.strftime('%x ') + df['TIME'].dt.strftime('%X')) 18df = df.sort_values(['DATETIME']) 19 20#平日と土日・祝日のダミー変数を列に追加 21df["weekday"] = df['DATE'].dt.weekday 22df['holiday'] = 0 23for i in range(len(df)): 24 if df['weekday'].iloc[i] >= 5 or jpholiday.is_holiday(df['DATE'].iloc[i]) == True: 25 df['holiday'].iloc[i] = 1 26
下記のように条件を全て書き出してfor文で計算しようとしたのですが19行目でtuple index out of rangeのエラーが出てしまします。
python
1df['ele_3daymean1'] = 0 2for i in range(len(df)): 3 if i < 8 * 24: 4 df['ele_3daymean1'][i] = 0 5 6 else: 7 8 if df['weekday'].iloc[i] ==4: 9 df['ele_3daymean1'].iloc[i] = np.mean(df['実績(万kW)'].iloc[i - 24*2], 10 df['実績(万kW)'].iloc[i - 24*3], 11 df['実績(万kW)'].iloc[i - 24*4]) 12 elif df['weekday'].iloc[i] ==3: 13 df['ele_3daymean1'].iloc[i] = np.mean(df['実績(万kW)'].iloc[i - 24*2], 14 df['実績(万kW)'].iloc[i - 24*3], 15 df['実績(万kW)'].iloc[i - 24*6]) 16 elif df['weekday'].iloc[i] ==0: 17 df['ele_3daymean1'].iloc[i] = np.mean(df['実績(万kW)'].iloc[i - 24*5], 18 df['実績(万kW)'].iloc[i - 24*3], 19 df['実績(万kW)'].iloc[i - 24*4]) #エラー箇所 20 21 elif df['weekday'].iloc[i] ==1: 22 df['ele_3daymean1'].iloc[i] = np.mean(df['実績(万kW)'].iloc[i - 24*5], 23 df['実績(万kW)'].iloc[i - 24*6], 24 df['実績(万kW)'].iloc[i - 24*4]) 25 elif df['weekday'].iloc[i] ==2: 26 df['ele_3daymean1'].iloc[i] = np.mean(df['実績(万kW)'].iloc[i - 24*5], 27 df['実績(万kW)'].iloc[i - 24*2], 28 df['実績(万kW)'].iloc[i - 24*6]) 29 elif df['weekday'].iloc[i] ==5: 30 df['ele_3daymean1'].iloc[i] = np.mean(df['実績(万kW)'].iloc[i - 24*7], 31 df['実績(万kW)'].iloc[i - 24*6]) 32 elif df['weekday'].iloc[i] ==6: 33 df['ele_3daymean1'].iloc[i] = np.mean(df['実績(万kW)'].iloc[i - 24*7], 34 df['実績(万kW)'].iloc[i - 24*8])
あなたの回答
tips
プレビュー