【Python】なんちゃってDX:ノイズが入ったかのようなデータを作成するプログラム

  • URLをコピーしました!
目次

DX(デジタルトランスフォーメーション)

前回、Pythonで始めるなんちゃってDXとして、グラフを作成するプログラムを紹介しました。

その際にはこんなデータを使用しました。

(CSVファイルなので、テキストエディタで開くとカンマ区切りです)

前回のプログラムでグラフ化してみるとこんな感じでした。

直線的に変化しつつ、ランダムなノイズが入っているデータというわけです。

ということでこちらもせっかく作ったプログラムなので、今回紹介していこうと思います。

プログラム全体

まずはプログラム全体を見てみましょう。

import os
import pandas as pd
import numpy as np
import random

time = np.arange(0, 60, 0.1)

value_1 = [0, 1, 5]
value_2 = [0, 5, 5]
value_3 = [0, 10, 10]

def valrange(len_x, y_list):
    error = (y_list[1] - y_list[0])*y_list[2]/100
    val_list = []
    for val in np.linspace(y_list[0], y_list[1], len_x):
        random_error = random.uniform(-error, error)
        val_list.append(val+random_error)
        
    return val_list

val1_list = valrange(len(time), value_1)
val2_list = valrange(len(time), value_2)
val3_list = valrange(len(time), value_3)

df = pd.DataFrame()
df['時間'] = time
df['値1'] = val1_list
df['値2'] = val2_list
df['値3'] = val3_list

df.to_csv('dx-2_Data1.csv')

このプログラムはあくまでも一時的に利用できればいいと思い、綺麗にまとめたり、自動化したりはしていません。

ということでダミーデータが必要な時とか、勉強用に使用してもらえればいいかなと思います。

ライブラリのインポートと設定

まずはライブラリのインポートと設定の部分からです。

import os
import pandas as pd
import numpy as np
import random

time = np.arange(0, 60, 0.1)

value_1 = [0, 1, 5]
value_2 = [0, 5, 5]
value_3 = [0, 10, 10]

今回使用しているライブラリは「os」、「pandas」、「numpy」、「random」です。

「pandas」と「numpy」は標準ライブラリでないため、別途インストールが必要ですので、使用前にこちらのコマンドを実行してインストールしてください。

pip install pandas
pip install numpy

「time」はX軸を時間軸にしようと思い作成した変数で、np.range関数を使って、0秒から60秒まで0.1秒刻みのリストを格納しています。

「value_1」、「value_2」、「value_3」はそれぞれ出力するY値の設定です。

[開始値, 終了値, ノイズ値(%)]になっています。

つまり[0, 1, 5]は0から5に変化するグラフでそれぞれの値に±5%以内のノイズがランダムに入るという意味です。

valrange関数

次はY値のリストを作成するvalrange関数です。

def valrange(len_x, y_list):
    error = (y_list[1] - y_list[0])*y_list[2]/100
    val_list = []
    for val in np.linspace(y_list[0], y_list[1], len_x):
        random_error = random.uniform(-error, error)
        val_list.append(val+random_error)
        
    return val_list

「def valrange(len_x, y_list):」ということで、X値の数、Y値の設定リスト(先ほどのvalue_1など)を受け取り、ノイズを乗せたY値のリスト「val_list」を返します。

この関数ではまず「error = (y_list[1] – y_list[0])*y_list[2]/100」でY値の開始値、終了値、つまり最小値、最大値からノイズの値を計算します。

「for val in np.linspace(y_list[0], y_list[1], len_x):」でY値の最小値から最大値をX値の数で分割し(np.linspace(y_list[0], y_list[1], len_x))、その値を一つずつ繰り返し取得します。

「random_error = random.uniform(-error, error)」で先ほど計算したノイズの値を最大値、最小値として、その中の値をランダムに取得します。

「val_list.append(val+random_error)」取得したY値に対し、ノイズを加え、「val_list」に加えることで、各点がノイズを持った値に変換されるというわけです。

データの出力

最後にデータの出力です。

val1_list = valrange(len(time), value_1)
val2_list = valrange(len(time), value_2)
val3_list = valrange(len(time), value_3)

df = pd.DataFrame()
df['時間'] = time
df['値1'] = val1_list
df['値2'] = val2_list
df['値3'] = val3_list

df.to_csv('dx-2_Data1.csv', encoding='utf-8')

「val1_list = valrange(len(time), value_1)」、「val2_list = valrange(len(time), value_2)」、「val3_list = valrange(len(time), value_3)」でそれぞれ「value_1」、「value_2」、「value_3」に対するY値を取得します。

そして「df = pd.DataFrame()」で新しいPandasのデータフレームを作成し、「df[‘時間’] = time」、「df[‘値1’] = val1_list」、「df[‘値2’] = val2_list」、「df[‘値3’] = val3_list」でそれぞれの値を格納します。

最後に「df.to_csv(‘dx-2_Data1.csv’, encoding=’utf-8′)」でCSVファイルとして出力しています。

これで最初のグラフのようなデータを出力するプログラムの完成です。

今回はランダムなノイズが乗りつつも直線的に変化するグラフですが、もう少し工夫すれば直線以外のデータも作成できることでしょう。

次回はY軸が2軸のグラフを簡単に作れるプログラムを紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次