DX(デジタルトランスフォーメーション)
前回、PythonではじめるなんちゃってDXとして、グラフ作成プログラムで読み込めるようにデータを変換するプログラムを紹介しました。

今回はその際に用いたヘッダーをもつデータを作成するプログラムを紹介します。
前回使用したデータはこんな感じでした。
(CSVファイルなのでテキストエディタで開くとカンマ区切りです)

最初の行の「Measurement time」、「Mode」、「Condition0」などは例えば測定器などではその測定条件を最初に記載されていたりするので、それを模した形になります。
ただこのヘッダーファイルが一定条件だとすると、変換用プログラムもそれに合わせて作成してしまうこともあります。
そこで今回のプログラムでは「Condition」に関してはランダムに複数回挿入されるようにしてみました。
プログラム全体
まずはプログラム全体をみてみましょう。
import os
import random
import datetime
import numpy as np
time_list = np.arange(0, random.randint(30, 60), 0.1)
value1 = [0, 1, 5]
timenow = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
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
val_list1 = valrange(len(time_list), value)
header_list = [f'Measurement time,{timenow}', f'Mode,{random.randint(0, 10)}']
for i in range(random.randint(0, 10)):
header_list.append(f'Condition{i},{random.randint(0, 100)}')
with open('./dx-4_Data1.csv', 'w', encoding='utf-8') as f_out:
for header_row in header_list:
f_out.write(f'{header_row}\n')
f_out.write('Time,Value1\n')
for t, v1 in zip(time_list, val_list1):
row = f'{t},{v1}\n'
f_out.write(row)
このプログラムはあくまでも一時的に利用できればいいと思い、綺麗にまとめたり、自動化したりはしていません。
ということでダミーデータが必要な時とか、勉強用に使用してもらえればいいかなと思います。
また自作の「valrange関数」は前に作成したものをそのまま使っていますので、今回は解説をスキップします。

ライブラリのインポートと設定
まずはライブラリのインポートと設定の部分からです。
import os
import random
import datetime
import numpy as np
time_list = np.arange(0, random.randint(30, 60), 0.1)
value1 = [0, 1, 5]
timenow = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
今回使用するライブラリは「os」、「random」、「datetime」、「numpy」です。
「numpy」は標準ライブラリではないので、使用前にインストールしておいてください。
pip install numpy
「time_list」はX軸用の値で、np.arange関数を使って0.1刻みの値のリストを作成しています。
またこれまでは「np.arange(0, 60, 0.1)」と0から60までと最大の秒数が決まっていました。
今回は「random.randint(30, 60)」とすることで、30から60までのうちのどれかという形でランダムに決定するようにしました。
次の「value1 = [0, 1, 5]」は値の設定で、この場合は0から1に変化するグラフでそれぞれの値に±5%以内のノイズがランダムに入るという意味です。
また今回は「Measurement time」として測定日時を記載するため、datetimeモジュールを使って日時を取得し、strftime関数でStr型への変換を行なっています(datetime.datetime.now().strftime(“%Y/%m/%d %H:%M:%S”))
データの出力
次はデータの出力部分です。
val_list1 = valrange(len(time_list), value)
header_list = [f'Measurement time,{timenow}', f'Mode,{random.randint(0, 10)}']
for i in range(random.randint(0, 10)):
header_list.append(f'Condition{i},{random.randint(0, 100)}')
with open('./dx-4_Data1.csv', 'w', encoding='utf-8') as f_out:
for header_row in header_list:
f_out.write(f'{header_row}\n')
f_out.write('Time,Value1\n')
for t, v1 in zip(time_list, val_list1):
row = f'{t},{v1}\n'
f_out.write(row)
まず自作のvalrange関数を使って数値データのリストを作成しています(val_list1 = valrange(len(time_list), value))。
次にヘッダーで1つずつ出力する「Measurement time」と「Mode」をヘッダー用のリストheader_listに格納します(header_list = [f’Measurement time,{timenow}’, f’Mode,{random.randint(0, 10)}’])。
そしてfor文とrandom関数を使って繰り返し処理をすることで(for i in range(random.randint(0, 10)):)、「Condition」をランダムな回数出力しています(header_list.append(f’Condition{i},{random.randint(0, 100)}’))。
あとはそれぞれ順番にファイルに書き込んでいっています。
with open('./dx-4_Data1.csv', 'w', encoding='utf-8') as f_out:
for header_row in header_list:
f_out.write(f'{header_row}\n')
f_out.write('Time,Value1\n')
for t, v1 in zip(time_list, val_list1):
row = f'{t},{v1}\n'
f_out.write(row)
Y軸用のデータを複数にしたい場合
上記の例ではX軸の値が1つ、Y軸の値が1つのデータが出力されます。
ですが、Y軸の値を2つ以上出したいという場合もあるでしょう。
その場合は、まず「ライブラリのインポートと設定」部分の「value1 = [0, 1, 5]」のリスト名を変えて、複数準備します。
例えばこんな感じです。
value1 = [0, 1, 5]
value2 = [0, 10, 5]
次にvalrange関数を使って、値のリストを作る部分を増やします。
val_list1 = valrange(len(time_list), value)
val_list2 = valrange(len(time_list), value)
最後に値の出力部分を2つ目(もしくはそれ以上)のデータを書き込むように変更します。
for t, v1, v2 in zip(time_list, val_list1, val_list2):
row = f'{t},{v1},{v2}\n'
f_out.write(row)
これで実行するとこのように2つ目のY値を出力してくれます。

プログラムをいじらなければいけないので少し手間ですが、色々試せて面白いかなと思います。
次回はそれぞれの行がタグづけされているデータを変換するプログラムを紹介します。

ではでは今回はこんな感じで。
コメント