【Python】Pandasでの時系列データの処理とMatplotlibでのグラフ化

この記事では、Pandasを使用して時系列データを処理し、そのデータをMatplotlibで可視化する方法について解説します。複数の列を持つ時系列データを扱い、データの操作方法やグラフ化の技術を紹介します。

## 目次
1. [データの準備](#1-データの準備)
2. [Pandasでの時系列データの読み込みと処理](#2-pandasでの時系列データの読み込みと処理)
3. [Matplotlibでのグラフ化](#3-matplotlibでのグラフ化)
4. [まとめ](#4-まとめ)

---

### 1. データの準備

まず、0.1秒単位の時系列データを模擬的に生成します。データの例として、温度、湿度、圧力を含む3列の時系列データを扱います。以下のコードでデータを生成します。

```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 時系列データの生成 (0.1秒単位)
time_index = pd.date_range(start='2024-01-01', periods=10000, freq='0.1S')  # 0.1秒単位、10000の長さのindexを作成
temperature = np.random.normal(loc=22, scale=2, size=len(time_index))  # 温度 (平均22℃、標準偏差2)
humidity = np.random.normal(loc=60, scale=10, size=len(time_index))    # 湿度 (平均60%、標準偏差10)
pressure = np.random.normal(loc=1013, scale=5, size=len(time_index))    # 圧力 (平均1013 hPa、標準偏差5)

# DataFrameの作成
df = pd.DataFrame({
    'Temperature': temperature,
    'Humidity': humidity,
    'Pressure': pressure
}, index=time_index)

# 最初の5行を表示
print(df.head())
```

このコードでは、Pandasの`date_range`を使って、0.1秒間隔の時系列インデックスを作成し、`numpy`でランダムなデータを生成しています。生成したデータはPandasの`DataFrame`に格納されます。

出力例（最初の5行）：
```
                         Temperature  Humidity  Pressure
2024-01-01 00:00:00.000    24.2342     59.341      1012.5
2024-01-01 00:00:00.100    21.7389     65.243      1015.2
2024-01-01 00:00:00.200    22.0458     61.567      1011.9
2024-01-01 00:00:00.300    19.6372     63.409      1013.1
2024-01-01 00:00:00.400    23.4367     58.923      1014.4
```

### 2. Pandasでの時系列データの読み込みと処理

時系列データは、よく特定の処理を施す必要があります。例えば、欠損値の補完、データのリサンプリング、指定した期間での集計などです。いくつかの基本的な操作を見ていきましょう。

#### 欠損値の補完

ランダムに欠損値を挿入して、その補完方法を見てみましょう。

```python
# 5%の確率で欠損値を挿入
df_missing = df.mask(np.random.rand(len(df), len(df.columns)) < 0.05)

# 欠損値を線形補完
df_filled = df_missing.interpolate(method='linear')

# 欠損値を表示
print(df_missing.isna().sum())

# 欠損値の補完後
print(df_filled.isna().sum())
```

このコードでは、`mask`を使ってランダムに5%の欠損値を挿入し、`interpolate`メソッドで線形補完しています。

#### リサンプリング

時系列データは、頻度を変更してリサンプリングすることができます。例えば、0.1秒単位のデータを1秒単位にリサンプリングする場合は以下のようにします。

```python
# 1秒単位にリサンプリング（平均を取る）
df_resampled = df.resample('1s').mean()

# リサンプリング結果を表示
print(df_resampled.head())
```

このコードでは、`resample('1s')`を使ってデータを1秒間隔でリサンプリングし、`mean()`で各1秒間の平均値を計算しています。

#### 時間帯別の集計

例えば、1分ごとの平均値を計算する場合は、次のようにします。

```python
# 1分単位で平均を計算
df_1min_avg = df.resample('1min').mean()

# 集計結果を表示
print(df_1min_avg.head())
```

このコードでは、`resample('1T')`を使って1分単位で平均値を計算してリサンプリングしています。

### 3. Matplotlibでのグラフ化

次に、PandasのデータをMatplotlibで可視化する方法を見ていきましょう。ここでは、温度、湿度、圧力の3つの列を同じグラフに描画します。

```python
import matplotlib.pyplot as plt

# グラフの設定
plt.figure(figsize=(10, 6))

# 各列をプロット
plt.plot(df.index, df['Temperature'], label='Temperature (°C)', color='tab:red', alpha=0.7)
plt.plot(df.index, df['Humidity'], label='Humidity (%)', color='tab:blue', alpha=0.7)
plt.plot(df.index, df['Pressure'], label='Pressure (hPa)', color='tab:green', alpha=0.7)

# グラフの装飾
plt.title('Time Series Data')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend(loc='upper right')
plt.grid(True)

# グラフの表示
plt.tight_layout()
plt.show()
```

このコードでは、`plt.plot()`で各列（温度、湿度、圧力）を描画し、`plt.legend()`で凡例を表示、`plt.grid()`でグリッドを追加しています。結果として、以下のようなグラフが表示されます。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674933/ffded543-b0db-1cd5-a7fa-add0e69262d0.png)


### 4. まとめ

今回は、Pandasを使って時系列データを扱い、Matplotlibでそのデータを可視化する方法を紹介しました。このような時系列データの処理や可視化は、実データ分析の現場でも非常に役立ちます。是非、試してみてください！