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

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

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

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

Q&A

解決済

2回答

965閲覧

Python 時系列解析 ファイル読み込み

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2020/08/28 01:00

編集2020/08/28 01:57

今私はpythonを用いて時系列解析を行おうと思っています。

様々な本やサイトで調べてまして、この方のコードを参考にしようと思っています。

リンク内容

このコードを実行するにあたって、日付情報を読み込む際に
passengers.index = pd.to_datetime(df['Month']) #日付インデックス

としているのですが、私が持っているファイルにある時間のデータは次の様な
ただの数字の羅列になっています↓↓

   time value

0 5.9037 0.2 5.07742 0.4 4.33765 …    …

(これが500行あり、次の10行ほどを予測したいと考えています)

この様な場合、具体的にどの様にコードを変更すれば良いのか、
詳しい方にご教授いただきたく質問いたしました。

よろしくお願いします。

Python

1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4%matplotlib inline 5plt.style.use('ggplot') 6plt.xkcd() 7import statsmodels.api as sm # version 0.8.0以上 8 9df = pd.read_csv('AirPassengers.csv') 10 11passengers = pd.Series(df['#Passengers'], dtype='float') # 乗客数 12passengers.index = pd.to_datetime(df['Month']) # 日付インデックス 13 14passengers_train2 = passengers['1949-01':'1959-12'] # 訓練データ(モデル作成用) 15passengers_test2 = passengers['1960-01':'1960-12'] # テストデータ1年分(検証用) 16 17sarimax_train = sm.tsa.SARIMAX(passengers_train2, 18 order=(3, 1, 3), 19 seasonal_order=(0, 1, 1, 12), 20 enforce_stationarity = False, 21 enforce_invertibility = False 22 ).fit() 23 24 25predict2_dy = sarimax_train.get_prediction(start ='1959-12', end='1961-12') # 2年分の未来予測 26predict2_dy_ci = predict2_dy.conf_int() # 信頼区間取得 27 28plt.figure(figsize=(12, 4)) 29plt.plot(passengers['1959-01':], label="actual") # 実データプロット 30plt.plot(predict2_dy.predicted_mean, c="b", linestyle='--', label="model-pred", alpha=0.7) # 予測プロット 31 32 33plt.fill_between(predict2_dy_ci.index, predict2_dy_ci.iloc[:, 0], predict2_dy_ci.iloc[:, 1], color='g', alpha=0.2) 34 35plt.legend(loc='upper left')

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/08/28 01:45

ご指摘ありがとうございます。 修正いたしました。 日付(時刻?)が一列目、その時刻に対するvalueが二列目に書いてあります。 今私は、日付としてではなく時刻として読み込みたいと考えております。 p.s. 教えていただいたurlですが、なぜか接続エラーが出てしまいます…
meg_

2020/08/28 01:47

・リンクは「リンクの挿入」で記入してください。 ・コードは「コードの挿入」で記入してください。
退会済みユーザー

退会済みユーザー

2020/08/28 01:58

ご指摘ありがとうございます。 質問形式につて修正いたしました。
meg_

2020/08/28 02:51

timeは小数点数に見えますが、どのような形式の日付データに変換したいのでしょうか? ※日付形式の書式変換は下記回答が参考になります。 https://teratail.com/questions/287731
退会済みユーザー

退会済みユーザー

2020/08/28 03:45

ご返信ありがとうございます。 ただいま、教えていただいた回答に書かれていたサイトを拝見しております。 そうすると、datetime.tim or datetime.timedelta を 用いれば良いのかなと考えていますが、まだうまく行きません。 日付データとしてではなく、単に時刻[second]として取り扱いたいと考えています(?) おっしゃる通り、時刻は小数点を含んだ状態でファイルに記述されています。 時刻t=0[sec]のとき、value=5.9037 t=0.2[sec]のとき、value=5.07742 … … という意味です。 質問の答えになっていますでしょうか…
meg_

2020/08/28 03:51

> 日付データとしてではなく、単に時刻[second]として取り扱いたいと考えています(?) ということはtimeの”単位”ば秒ですか? スタート時刻があって、それに対して+0.2秒、+0.4秒・・・ってことでしょうか? であれば日付データに変換出来るでしょう。日時が不明であるなら仮の日時を設定する必要があるかもしれません。
退会済みユーザー

退会済みユーザー

2020/08/28 04:49

> スタート時刻があって、それに対して+0.2秒、+0.4秒・・・ってことでしょうか? おっしゃる通りです! > 日時が不明であるなら仮の日時を設定する必要があるかもしれません。 日時が不明というか、あまり重要ではありません。 (実際不明なのですが…) 一見ランダムに思われる時系列データが、どの様なパターンを持っているのか ということを調べようと思っています。 ですので、重要なのは時間間隔0.2[sec]とvalueだと考えています。
meg_

2020/08/28 05:52

> あまり重要ではありません。 質問者さんにとって重要かどうかではなく、pandasで処理するに当たって必要なのでは?ということです。
退会済みユーザー

退会済みユーザー

2020/08/28 07:38

なるほど、失礼いたしました。
guest

回答2

0

ベストアンサー

Rだと auto.arima というパラメータを自動で調整する(中でグリッドサーチしているだけですが)関数があるのですがPythonではないようなので自作が必要でしょう。

ただ、時系列分析の学習がてらとのことでしたら最適なパラメータを力技で出してしまうと
なぜそうなるのかが理解しづらいので、少々泥臭く

  • 時系列プロットで傾向を知る
  • コレログラム(自己相関プロット)で自己相関の様子を見る、、、
  • ARIMA等のモデルで試して、残差をプロットし、周期性があるかないかをみる
  • 周期性があるならばそれに対応してパラメータを調整する

を繰り返すのがよいかと思います。ただ、「リンク内容」でご自身が示されているところにすべて書いてあるようです。

まずは、そのとおり試されてはいかがでしょうか。

より詳しく学ぶにはPythonですと時系列分析の本が少ないのですが
時系列解析: 自己回帰型モデル・状態空間モデル・異常検知 (Advanced Python)
がコード例が豊富で分かりやすいです。Passengersデータをベースにしているので取り組みやすいかと。

また、time列が日付型かどうかは関係ないです。時系列モデルは値のみを見て、ラグや周期性はモデルに与えたパラメータから判断しているので。日付や時刻型が必要かどうかはプロットしたときの横軸を日付や時刻にしたいかどうかの人間の都合のみです。ので、元データが0, 0.2, ...のような等間隔のデータならばそのまま扱えばよいです(等間隔でないならまた別の処理が必要ですが)

例えばPassengersデータの日付をあなたのデータ例と同じく0, 0.2, 0.4 とし、valuesをPassengersデータのままとした hoge.csv があった場合下記で動きます。

Python

1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4%matplotlib inline 5plt.style.use('ggplot') 6plt.xkcd() 7import statsmodels.api as sm # version 0.8.0以上 8 9df = pd.read_csv('hoge.csv') 10 11value = pd.Series(df['value'], dtype='float') # value 12#passengers.index = pd.to_datetime(df['Month']) # 日付インデックスは不要 13 14value_train2 = value[0:131] # 訓練データ インデックスの範囲を与えればよいです 15value_test2 = value[131:] # テストデータ インデックスの範囲を与えればよいです 16 17sarimax_train = sm.tsa.SARIMAX(value_train2, order=(3, 1, 3), 18 seasonal_order=(0, 1, 1, 12), 19 enforce_stationarity = False, 20 enforce_invertibility = False 21 ).fit() 22 23predict2_dy = sarimax_train.get_prediction(start =131, end=143) # 未来予測 インデックスの範囲を与えればよいです 24predict2_dy_ci = predict2_dy.conf_int() # 信頼区間取得 25 26plt.figure(figsize=(12, 4)) 27plt.plot(value[0:], label="actual") # 実データプロット 28plt.plot(predict2_dy.predicted_mean, c="b", linestyle='--', label="model-pred", alpha=0.7) # 予測プロット 29 30 31plt.fill_between(predict2_dy_ci.index, predict2_dy_ci.iloc[:, 0], predict2_dy_ci.iloc[:, 1], color='g', alpha=0.2) 32 33plt.legend(loc='upper left')

投稿2020/08/30 02:54

aokikenichi

総合スコア2240

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

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

退会済みユーザー

退会済みユーザー

2020/08/31 03:58

ご回答ありがとうございます!! いただいたコードで動きました。 ありがとうございます! ご指摘の通り、 時系列プロットで傾向を知る →コレログラムで自己相関をグラフかする →ARIMAモデルで試して、残差をプロットし、周期性をみる を行なってみまして、SARIMAモデルではなく、ARIMAモデルで いいのではないかと思う様になりました。 ご紹介していただいた本ですが、早速購入しました。 とりあえずコードを動かしてみるところから初めまして、 コードをみながら時系列解析の理論を学んでいこうと思っています。
aokikenichi

2020/08/31 08:59

最近時系列データの質問も増えてきておりますし、書籍も増えている感じがします。 一緒にがんばりましょう
guest

0

時系列解析やったことありませんので的を外した回答でしたらすみません。

まず提示コードは特定の事例AirPassengersにあったパラメータorder=(3, 1, 3)およびseasonal_order=(0, 1, 1, 12)を与えています。
この(ハイパー)パラメータは入力データによって最適な値は異なります。
よってまずは入力データをもとにパラメータの決定から行う必要があります。
その決定方法はグリッドサーチを用いるのが一般的でしょう。

定常時系列の解析に使われるARMAモデル・SARIMAモデルとは?
に同じ事例(AirPassengers)でパラメータ決定~訓練、予測およびその評価まで記載されているので参考になるかと思います。

あるいは、そもそもSARIMAモデルに適したデータかどうかも評価、検討したほうがよいかもしれません。

投稿2020/08/28 08:39

can110

総合スコア38341

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

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

退会済みユーザー

退会済みユーザー

2020/08/28 09:38

回答ありがとうございます。 私が解析したいデータはもしかしたらSARIMAモデルで表されるのに適切な データではないのかもしれないと思う様になりました。 データが入ったファイルはあるので、とりあえず練習がてらコードを動かしてしてみようと思っていました。 もう少し時系列解析についても勉強しなければなりません… ただ作業をひとつひとつ追っていったところ、データの読み込みの部分が 分かっていなかったので、質問いたしました。
can110

2020/08/30 01:25

0.2→2020-08-30 00:00:00.200000 0.4→2020-08-30 00:00:00.400000 : のように、仮の日時に変換して読み込めばよいと思いますが、その方法が分からないということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問