質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

0回答

591閲覧

平日・休日ごとの3日間・2日間の移動平均を計算したい

ttt_

総合スコア6

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/11/30 09:08

東京電力の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])

平均で使う日にちが分かりにくいと思ったため例を示します。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/11/30 10:44

> 19行目でtuple index out of rangeのエラーが出てしまします。 エラーメッセージ全文を掲載された方が分かりやすいと思います。
ttt_

2020/11/30 10:58

ご指摘ありがとうございます。以下が全文になります。 IndexError: tuple index out of range tupleの範囲外にアクセスした結果だと思うのですが、該当箇所が分かりませんでした。 説明足らずですみません。
meg_

2020/11/30 13:15 編集

エラー発生箇所はどこでしょうか?そのときのiの値を確認すればエラーの原因が分かるのではないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問