[小ネタ] 気になるあの時系列データをpandasで可視化してみた

最近継続的に測定している「ある時系列データ」が先月の連休を挟んでどのように変化したのか気になったのでpandasで可視化してみました。
2022.05.18

はじめに

最近時系列データの扱いについて学んでいるので、手動で測定したある身近な時系列データをpandasで可視化してみました

データの読み込み

データはCSV形式で与えられています。タイムスタンプはmm/ddの形式なので読み込み時にパースします。またここでは年の置き換えも行っています。

import pandas as pd
import numpy as np

# 日付をパース
ts_data = pd.read_csv('/data/notebook_files/data.csv', parse_dates=True, index_col='ts', date_parser=lambda x: pd.to_datetime(x, format='%m/%d'))
# カラム名が適当なのでリネームする
ts_data = ts_data[['value.1']]
ts_data.rename(columns={'value.1': 'value'}, inplace=True)
# 年=1900年になっているので置換
ts_data.index = ts_data.index.map(lambda t: t.replace(year=2022))

何はともあれプロットしてみます。

ts_data.plot()
print(ts_data.head())

ts           value
2022-04-02   78.3
2022-04-05   77.7
2022-04-06   77.4
2022-04-07   77.3
2022-04-08   77.1

欠損データの補完

欠損データがあるので一応補完してみます。ここで行うのは次の2つです。

  1. データの期間の開始と終了にあわせてインデックスを振り直す
  2. 1.で追加された日付のデータがNAになっているので前日の測定値を補完する
# 日付の最大最小をとってレコードを補完する
dates = pd.date_range(ts_data.index.min(), ts_data.index.max())

ts_data = ts_data.reindex(dates).reset_index().reindex(columns=ts_data.columns)
ts_data.index = dates
ts_data = ts_data.fillna(method='ffill')
ts_data.head()
            value
2022-04-02   78.3
2022-04-03   78.3
2022-04-04   78.3
2022-04-05   77.7
2022-04-06   77.4

改めてプロットすると……

トレンド抽出

移動平均によるトレンド抽出を試みます。ウィンドウは3日と7日を試します。

import matplotlib.pyplot as plt

# 移動平均でトレンドをみる
plt.figure(figsize=(12,8))
plt.plot(ts_data, label='original', linestyle='dotted')
plt.plot(ts_data.rolling(3).mean(), label='3days rolling')
plt.plot(ts_data.rolling(7).mean(), label='7days rolling')
plt.legend()

4月末の連休に気の緩みが見えますが全体としては減少トレンドと言えると思います。

増減の分布

最後に1日ごとの増減の分布を見てみます。

plt.hist(ts_data.diff(1))

左側に偏っていますが右端の+1がすべてを台無しにしています。

まとめ

気を緩めずに(欠損値が多いので)測定もしっかりやっていきたいです。