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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

2回答

1954閲覧

Python 時系列データを1日ずつずらしながら読み込みたい

SuzuAya

総合スコア71

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

0クリップ

投稿2020/08/22 07:46

編集2020/08/22 08:51

前提・実現したいこと

2020/1/20~2020/6/30までのデータを,「過去20日分のデータを入力し,将来20日分のデータを出力する」ような形で読み込むにはどうしたらいいかアドバイスをいただけますと幸いです.
(例:2020/1/20~2020/2/8までのデータを入力し,2020/2/9~2020/2/28までのデータを出力する)

データの詳細:2020/1/20~2020/6/30までの韓国における新型コロナ感染者のデータです.
感染日,性別,年齢,居住地などの情報が含まれています.
これらの情報をXGBOOSTの回帰モデルに入力し,予測感染者数を出力させたいと考えております.

該当のソースコード

データの前処理部分は割愛させていただきます.

Python

1import pandas as pd 2import numpy as np 3import xgboost as xgb 4from sklearn.model_selection import GridSearchCV 5from sklearn.metrics import mean_squared_error 6import matplotlib.pyplot as plt 7from sklearn.externals import joblib 8 9df = pd.read_csv("data.csv") 10#print(df.head) 11 12# データを特徴量と目的変数に分ける 13df_x = df 14df_y = df[['感染者数']] 15 16#print(df_x.head()) 17#print(df_y.head()) 18 19# xgboostモデルの作成 20reg = xgb.XGBRegressor() 21 22# ハイパーパラメータ探索 23reg_cv = GridSearchCV(reg, {'learning_rate':[0.01,0.03,0.05,0.1,0.3],'min_child_weight': [1,2,3,4,5], 'max_depth': [2,4,6,8,10], 'n_estimators': [50,100,200,300,400,500]}, verbose=1) 24 25train_x = df_x[5:29]# この部分をどう修正したらよいか分かりません 26train_y = df_y[29:53]# この部分をどう修正したらよいか分かりません 27 28reg_cv.fit(train_x, train_y) 29print(reg_cv.best_params_, reg_cv.best_score_) 30 31# 改めて最適パラメータで学習 32reg = xgb.XGBRegressor(**reg_cv.best_params_) 33reg.fit(train_x, train_y) 34

試したこと

こちらのサイトを参考に,データの前処理を試みたのですが,うまく今回のケースに適用することができませんでした.

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

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

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

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

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

can110

2020/08/22 08:08 編集

「データを入力」と「データを出力」の意味が分かりません。 どのようなデータ(データフレーム?)を入力、出力されたいのかを過去3日分なりで具体的なデータ例で提示ください。
SuzuAya

2020/08/22 08:49

>can110様 ご確認ありがとうございます.説明が不足しており,貴重なお時間を不当に頂いてしまい申し訳ございません.質問を編集し,データの詳細を追記いたしました.ご確認頂けますと幸いです.
can110

2020/08/22 09:07 編集

質問を変えます。 コード中のdf_xは過去(=入力?), df_yは将来(=出力?)データを表しており 「この部分をどう修正したらよいか分かりません」という部分での行の抽出方法が分からないといった感じでしょうか?
SuzuAya

2020/08/22 09:47

>can110様 たびたびお手数をお掛けしており申し訳ございません. >コード中のdf_xは過去(=入力?), df_yは将来(=出力?)データを表しており ご理解の通りです.説明不足で申し訳ございません. >「この部分をどう修正したらよいか分かりません」という部分での行の抽出方法が分からないといった感じでしょうか? ご理解の通りです.現在のコードですと,df_xで「2020/1/25~2020/2/17の感染者の情報(感染者数以外)」を入力し,df_yで「2020/2/18~2020/3/12の感染者数」を出力するモデルになっております. このモデルを,例えば,以下のように修正したいと考えております. ・df_xで「2020/1/20~2020/2/8までの感染者の情報(感染者数以外)」を入力し,df_yで「2020/2/9~2020/2/29の感染者数」を出力する ・次に,df_xで「2020/1/21~2020/2/9までの感染者の情報(感染者数以外)」を入力し,df_yで「2020/2/10~2020/3/1の感染者数」を出力する ・最終的にdf_xで「2020/5/21~2020/6/10までの感染者の情報(感染者数以外)」を入力し,df_yで「2020/6/11~2020/6/30の感染者数」を出力するまで繰り返したいと考えております. 伝わっておりますでしょうか….説明が分かりにくく申し訳ございません.情報が不足しておりましたら大変お手数ですがお知らせ頂けますと幸いです.
can110

2020/08/22 09:51

理解できた範囲で回答したいと思います。
guest

回答2

0

やりたいことを理解できているか分かりませんが、指定した日を基準として過去と将来のデータフレームを得る例を示します。

Python

1import pandas as pd 2from datetime import timedelta 3 4# テストデータ 5dr = pd.date_range(start='2020-01-20', end='2020-06-30') 6df = pd.DataFrame({'date':dr, 'val':[i+1 for i in range(len(dr))]}) 7 8DAYS = 3 9BASE = '2020-02-09' 10 11base = pd.to_datetime([BASE])[0] 12 13pas_ed = base - timedelta(days=1) 14pas_st = pas_ed - timedelta(days=DAYS-1) 15 16fet_st = base 17fet_ed = base + timedelta(days=DAYS-1) 18 19df_pas = df[ (df['date'] >= pas_st) & (df['date'] <= pas_ed)] 20df_fet = df[ (df['date'] >= fet_st) & (df['date'] <= fet_ed)] 21 22print(df_pas) 23# date val 24#17 2020-02-06 18 25#18 2020-02-07 19 26#19 2020-02-08 20 27 28print(df_fet) 29# date val 30#20 2020-02-09 21 31#21 2020-02-10 22 32#22 2020-02-11 23

投稿2020/08/22 09:56

can110

総合スコア38341

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

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

SuzuAya

2020/08/23 03:42

>can110様 とても分かりやすくご回答くださり,本当にありがとうございます. お返事が遅くなりまして申し訳ございません. いただいたご回答を基に,今一度自分がやりたいことを整理し色々調べた結果,自己解決方法の欄に記入したコードで,やりたいことを(おそらく)実現することができました. 初心者の,的を射ない分かりにくい質問に対して根気強く丁寧に向き合ってくださり本当にありがとうございました.今後ともどうぞよろしくお願いいたします.
guest

0

自己解決

Python

1# カウンター初期化 2 3import pandas as pd 4import numpy as np 5import xgboost as xgb 6from sklearn.model_selection import GridSearchCV 7from sklearn.metrics import mean_squared_error 8import matplotlib.pyplot as plt 9from sklearn.externals import joblib 10 11df = pd.read_csv("data.csv") 12#print(df.head) 13 14# データを特徴量と目的変数に分ける 15df_x = df 16df_y = df[['感染者数']] 17 18counter = 1 19 20# 学習データの開始行番号 21train_x_start = 0 22train_y_start = 20 23 24# 学習データの終了行番号 25train_x_end = 20 26train_y_end = 40 27 28# スライドするデータ件数 29slide_rows = 1 30 31while True: 32 33 # 行番号を指定して、元データから学習データを抽出 34 train_x = df_x[train_x_start : train_x_end] 35 train_y = df_y[train_y_start : train_y_end] 36 print('train : ' + str(counter)) 37 print(train_x) 38 print('') 39 40 # xgboostモデルの作成 41 reg = xgb.XGBRegressor() 42 43 # ハイパーパラメータ 44 params={'learning_rate': 0.1, 45 'objective':'reg:squarederror', 46 'tree_method':'auto', 47 'gamma': 1, 48 'reg_alpha': 1, 49 'verbose': 1, 50 'max_depth': 6, 51 'min_child_weight': 1, 52 # 一定ラウンド回しても改善が見込めない場合は学習を打ち切る 53 'early_stopping_rounds':10 54 } 55 reg = xgb.XGBRegressor(**params) 56 57 reg.fit(train_x, train_y) 58 59 60 # データをスライドさせる 61 train_x_start += slide_rows 62 train_y_start += slide_rows 63 train_x_end += slide_rows 64 train_y_end += slide_rows 65 print ('current train_x_start is', train_x_start) 66 67 # カウンター加算 68 counter += 1 69 70 if train_x_start > 83: 71 break 72 73# 学習モデルの評価 74pred_train = reg.predict(df_x[83:103]) 75print('RMSE for pred_train:', np.sqrt(mean_squared_error(train_y, pred_train))) 76 77# モデルを保存 78filename = 'Corona_Korea_0630_model1_Provonce No.1.sav' 79joblib.dump(reg, filename) 80 81# feature importance のプロット 82#importances = pd.Series(reg.feature_importances_, index = boston.feature_names) 83#importances = importances.sort_values() 84#importances.plot(kind = "barh") 85xgb.plot_importance(reg) 86plt.title("importance in the xgboost Model") 87plt.show()

投稿2020/08/23 03:39

SuzuAya

総合スコア71

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問