今私は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')
インデントがなくコードが読めません(実行できません)。以下を参考に修正ください。
https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif
また、valueの「5.9037」は具体的にどのような日付になりますか?
ご指摘ありがとうございます。
修正いたしました。
日付(時刻?)が一列目、その時刻に対するvalueが二列目に書いてあります。
今私は、日付としてではなく時刻として読み込みたいと考えております。
p.s. 教えていただいたurlですが、なぜか接続エラーが出てしまいます…
・リンクは「リンクの挿入」で記入してください。
・コードは「コードの挿入」で記入してください。
ご指摘ありがとうございます。
質問形式につて修正いたしました。
timeは小数点数に見えますが、どのような形式の日付データに変換したいのでしょうか?
※日付形式の書式変換は下記回答が参考になります。
https://teratail.com/questions/287731
ご返信ありがとうございます。
ただいま、教えていただいた回答に書かれていたサイトを拝見しております。
そうすると、datetime.tim or datetime.timedelta を
用いれば良いのかなと考えていますが、まだうまく行きません。
日付データとしてではなく、単に時刻[second]として取り扱いたいと考えています(?)
おっしゃる通り、時刻は小数点を含んだ状態でファイルに記述されています。
時刻t=0[sec]のとき、value=5.9037
t=0.2[sec]のとき、value=5.07742
… …
という意味です。
質問の答えになっていますでしょうか…
> 日付データとしてではなく、単に時刻[second]として取り扱いたいと考えています(?)
ということはtimeの”単位”ば秒ですか?
スタート時刻があって、それに対して+0.2秒、+0.4秒・・・ってことでしょうか? であれば日付データに変換出来るでしょう。日時が不明であるなら仮の日時を設定する必要があるかもしれません。
> スタート時刻があって、それに対して+0.2秒、+0.4秒・・・ってことでしょうか?
おっしゃる通りです!
> 日時が不明であるなら仮の日時を設定する必要があるかもしれません。
日時が不明というか、あまり重要ではありません。
(実際不明なのですが…)
一見ランダムに思われる時系列データが、どの様なパターンを持っているのか
ということを調べようと思っています。
ですので、重要なのは時間間隔0.2[sec]とvalueだと考えています。
> あまり重要ではありません。
質問者さんにとって重要かどうかではなく、pandasで処理するに当たって必要なのでは?ということです。
なるほど、失礼いたしました。
回答2件
あなたの回答
tips
プレビュー