前回のおさらい:プログラムの統合とバグ修正
前回は温度・湿度ロガーのデータ分析のプログラムの統合とバグ修正を行なっています。

今回はその続きです。
ということで前回までのプログラムのおさらい。
まずインポートするライブラリをまとめました。
#Import libraries
import os
import shutil
import csv
import datetime
from matplotlib import pyplot as plt
次に自分で作成した関数をまとめました。
#Definition
def dir_check(dirname, dirlist):
if dirname not in dirlist:
os.mkdir(dirname)
def is_float(val):
try:
float(val)
except:
return False
else:
return True
フォルダ確認・作成のプログラムとCSVファイルの読み込みのプログラムでかぶっているところを省略し、見つかったバグに対応しました。
#Check&make directories
path = os.getcwd()
print(path)
dirnames = []
for f in os.listdir(path):
if os.path.isdir(f) == True:
dirnames.append(f)
print(dirnames)
dir_check("Data", dirnames)
dir_check("Graph", dirnames)
#Read CSV files
data_path = path + "//Data//"
for f in os.listdir(path):
if f[-4:] == ".csv":
shutil.move(f, data_path + f)
time = []; temperature = []; humidity = []
for f in os.listdir(data_path):
if f[-4:] == ".csv":
file = open(data_path + f, "r")
reader = csv.reader(file)
for row in reader:
if row != [] and is_float(row[1]) == True and is_float(row[2]) == True:
time.append(datetime.datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S"))
temperature.append(float(row[1]))
humidity.append(float(row[2]))
file.close()
print(time)
print(temperature)
print(humidity)
次に最後のステップであるグラフ表示を次のセルにつなげてみましょう。
今回もバグ修正も目的としているので、前に読み込んだデータや変数に格納したデータが残らないようにこまめにカーネルの再起動をすることをお勧めします。

グラフ表示
グラフ表示のプログラムでかぶっているのはライブラリのインポートだけです。
from matplotlib import pyplot as plt
ここを削除して、あとはそのまま次のセルにいれて、実行してみます。

実行してみるとグラフが表示され、また同時にGraphフォルダに保存されていました。

ということでここではバグもなく、グラフを表示することができました。
Settings
今回はさらにプログラムを一般化していきましょう。
プログラムの中には文字型(str型)で設定している値が何カ所かあります。
例えばフォルダ構造を整えるこの部分の一番最後。
#Check&make directories
path = os.getcwd()
print(path)
dirnames = []
for f in os.listdir(path):
if os.path.isdir(f) == True:
dirnames.append(f)
print(dirnames)
dir_check("Data", dirnames)
dir_check("Graph", dirnames)
この部分。
dir_check("Data", dirnames)
この”Data”のところは人によっては違うフォルダ名にしたい可能性もあります。
またこの名前は次のCSVファイルを読み込むプログラムのDataフォルダのパスにも使われています。
data_path = path + "//Data//"
もし違うフォルダ名に変える場合は、これらをプログラムの中から探し出し、全て書き換える必要ができてきます。
そこで最初にSetteings(つまり設定)という項目を作り、他の部分は同じ変数を使うことにより、Setttingsに書かれた値を変えることで、プログラムの内部の値を変える必要がなくなります。
ということでDataフォルダを変数datadirnameに、Graphフォルダを変数graphdirnameにします。
datadirname = "Data"
graphdirname = "Graph"
またついでにCSVファイル以外にもTSVファイルなんかを使う可能性があるので、データファイルの拡張子を変数fileextにします。
fileext = ".csv"
次にグラフの名前、グラフの軸の名前をリストdatanameとaxisnameに格納しておきます。
dataname = ["Temperature", "Humidity"]
axisname = ["Time", "Temperature(Degrees)", "Humidity(%)"]
最後にここでdata_pathとgraph_pathの設定と確認もしてしまいましょう。
path = os.getcwd()
data_path = path + "/" + datadirname +"/"
graph_path = path + "/" + graphdirname + "/"
print(path)
print(data_path)
print(graph_path)
ということでSetteingsの項目はこうなります。
#Settings
dataname = ["Temperature", "Humidity"]
axisname = ["Time", "Temperature(Degrees)", "Humidity(%)"]
datadirname = "Data"
graphdirname = "Graph"
fileext = ".csv"
path = os.getcwd()
data_path = path + "/" + datadirname +"/"
graph_path = path + "/" + graphdirname + "/"
print(path)
print(data_path)
print(graph_path)
実行結果
/Users/username/Desktop/Python/test
/Users/username/Desktop/Python/test/Data/
/Users/username/Desktop/Python/test/Graph/
ここでdatadirnameとgraphdirnameを”testdata”と”testgraph”に変えて実行してみましょう。
#Settings
dataname = ["Temperature", "Humidity"]
axisname = ["Time", "Temperature(Degrees)", "Humidity(%)"]
datadirname = "testdata"
graphdirname = "testgraph"
fileext = ".csv"
path = os.getcwd()
data_path = path + "/" + datadirname +"/"
graph_path = path + "/" + graphdirname + "/"
print(path)
print(data_path)
print(graph_path)
実行結果
/Users/username/Desktop/Python/test
/Users/username/Desktop/Python/test/testdata/
/Users/username/Desktop/Python/test/testgraph/
確かにパスが変わっています。
パスがdatadirname、graphdiranameに合わせて変わるのが確認できたので、元の”Data”、”Graph”に戻しておきます。
ではこのSettingsに合わせて、各項目を書き換えていきましょう。
フォルダの確認と作成
フォルダの確認と作成をするプログラムを再度確認します。
#Check&make directories
dirnames = []
for f in os.listdir(path):
if os.path.isdir(f) == True:
dirnames.append(f)
print(dirnames)
dir_check("Data", dirnames)
dir_check("Graph", dirnames)
ここでSettingsに合わせる場所は最後の二行です。
dir_check("Data", dirnames)
dir_check("Graph", dirnames)
ここで必要なのはパスではなくフォルダ名なので、datadirname、graphdirnameをそのまま入れます。
#Check&make directories
dirnames = []
for f in os.listdir(path):
if os.path.isdir(f) == True:
dirnames.append(f)
print(dirnames)
dir_check(datadirname, dirnames)
dir_check(graphdirname, dirnames)
これで一度、前にできたDataフォルダとGraphフォルダを削除し、このプログラムを実行したらちゃんと作成されるか確認します。

実行してみると確かに「Dataフォルダ」と「Graphフォルダ」が作成されました。

CSVファイルの読み込みとデータの格納
この部分でSettingsに合わせる箇所は、”.csv”と書かれているところになります。
#Read CSV files
for f in os.listdir(path):
if f[-4:] == ".csv":
shutil.move(f, data_path + f)
time = []; temperature = []; humidity = []
for f in os.listdir(data_path):
if f[-4:] == ".csv":
file = open(data_path + f, "r")
reader = csv.reader(file)
for row in reader:
if row != [] and is_float(row[1]) == True and is_float(row[2]) == True:
time.append(datetime.datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S"))
temperature.append(float(row[1]))
humidity.append(float(row[2]))
file.close()
print(time)
print(temperature)
print(humidity)
つまりこの2カ所です。
for f in os.listdir(path):
if f[-4:] == ".csv":
shutil.move(f, data_path + f)
for f in os.listdir(data_path):
if f[-4:] == ".csv":
file = open(data_path + f, "r")
reader = csv.reader(file)
この”.csv”をfileextに変更します。
#Read CSV files
for f in os.listdir(path):
if f[-4:] == fileext:
shutil.move(f, data_path + f)
time = []; temperature = []; humidity = []
for f in os.listdir(data_path):
if f[-4:] == fileext:
file = open(data_path + f, "r")
reader = csv.reader(file)
for row in reader:
if row != [] and is_float(row[1]) == True and is_float(row[2]) == True:
time.append(datetime.datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S"))
temperature.append(float(row[1]))
humidity.append(float(row[2]))
file.close()
print(time)
print(temperature)
print(humidity)
実行結果
[datetime.datetime(2019, 12, 29, 18, 53, 36), datetime.datetime(2019, 12, 29, 19, 23, 36), datetime.datetime(2019, 12, 29, 19, 53, 36), datetime.datetime(2019, 12, 29, 20, 23, 36), datetime.datetime(2019, 12, 29, 20, 53, 36), datetime.datetime(2019, 12, 29, 21, 23, 36), datetime.datetime(2019, 12, 29, 21, 53, 36), datetime.datetime(2019, 12, 29, 22, 23, 36), datetime.datetime(2019, 12, 29, 22, 53, 36), datetime.datetime(2019, 12, 29, 23, 23, 36),
(以下省略)
ここも問題なく置き換わりました。
グラフ表示と保存
グラフ表示と保存のプログラムで変更するのは、各プロットのラベル名とX軸、Y軸名です。
fig = plt.figure(figsize=(8,8))
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.plot(time, temperature, color="red", label="Temperature")
ax2.plot(time, humidity, color="blue", label="Humidity")
ax1.set_ylabel("Temperature(degrees)")
ax2.set_ylabel("Relative humidity(%)")
ax1.set_xlabel("Time")
ax1.tick_params(axis="x", rotation=90)
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1 + h2, l1 + l2, loc="lower right")
plt.savefig(graph_path + "graph.png")
plt.show()
ということで、この2カ所です。
ax1.plot(time, temperature, color="red", label="Temperature")
ax2.plot(time, humidity, color="blue", label="Humidity")
ax1.set_ylabel("Temperature(degrees)")
ax2.set_ylabel("Relative humidity(%)")
ax1.set_xlabel("Time")
それぞれdataname、axisnameというリストに格納してあるので、順番に気をつけ、変更していきます。
fig = plt.figure(figsize=(8,8))
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.plot(time, temperature, color="red", label=dataname[0])
ax2.plot(time, humidity, color="blue", label=dataname[1])
ax1.set_ylabel(axisname[1])
ax2.set_ylabel(axisname[2])
ax1.set_xlabel(axisname[0])
ax1.tick_params(axis="x", rotation=90)
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1 + h2, l1 + l2, loc="lower right")
plt.savefig(graph_path + "graph.png")
plt.show()
実行結果

これも問題なく変更できました。
これでAnaconda用のプログラムはとりあえずは完成です。
こちらにアップロードしておきますので、ダウンロードはご自由に。
またちょこちょこ使ってみて、何か変えたいところがあれば、少しずつ改変してくのがこういったプログラムの醍醐味でしょう。
ということでまた何かあれば改変して、記事にしていきたいと思います。
ではでは今回はこんな感じで。
コメント