【Python/Pandas】移動平均で信号データのノイズを低減

PythonモジュールPandasで移動平均を計算し、信号データのノイズを低減する方法についてソースコード付きでまとめました。

【例1】近似直線を回帰分析で計算

Pandasで信号データ(CSV)を読み込み、DataFrame.rolling(N).mean()で移動平均を計算してノイズの影響を低減します。

種別 回読み込んだCSVデータはこちら
CSV current.csv

サンプルコード

# -*- coding: utf-8 -*-
import os
import ntpath
import joblib
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal

# 読み込むCSVファイルのパス
csv_path = "C:/prog/python/auto/current.csv"

# グラフ画像の保存先パス
save_path = "C:/prog/python/auto/"

# 空のデータフレームを作成
df = pd.DataFrame({})

# CSVファイルのロードし、データフレームへ格納
df = pd.read_csv(csv_path, encoding="UTF-8", skiprows=0)

# 電流値の列データを取り出し
Its = df.loc[:, "current"]

# 経過時間の列データを取り出し
times = df.loc[:, "time"]

Its_rm = Its.rolling(10).mean()

# 保存先パスが存在しなければ作成
if not os.path.exists(save_path):
     os.mkdir(save_path)

# グラフ化
ax = plt.axes()
plt.rcParams['font.family'] = 'Times New Roman'  # 全体のフォント
plt.rcParams['axes.linewidth'] = 1.0  # 軸の太さ

# 電流値をプロット
plt.plot(times, Its, lw=1, c="r", alpha=0.7, ms=2, label="I(t)")

# 電流値をプロット
plt.plot(times, Its_rm, lw=1, c="b", alpha=0.7, ms=2, label="Rm(t)")

# グラフの保存
plt.legend(loc="best")     # 凡例の表示(2:位置は第二象限)
plt.xlabel('Time[msec]', fontsize=12)  # x軸ラベル
plt.ylabel('Current[A]', fontsize=12)  # y軸ラベル
plt.grid()  # グリッドの表示
plt.legend(loc="best")  # 凡例の表示
plt.savefig(save_path + "current.png")
plt.clf()

関連記事
1 【Python】Pandasで信号処理入門
2 【Pandas入門】データ分析のサンプル集
3 【Python入門】サンプル集・使い方

コメント