どうも!こんにちは!まろんです。今までフリードの話をしてきました。Freed HYBRID(GB7)燃費向上のためにOBDからCarScannerを使って実際のECUのデータや自動車運転情報を取得してきました。
具体的に取得しているデータは、自動車速度や加速、燃費、EVのバッテリー残量やエンジンオイル温度、水温…などなど。実際の自動車運転データがあるのでグラフ化すれば比較できてどこで燃費悪くしているのか、逆にどこで燃費がいいのか具体的な走行指針ができるかなと思いデータを収集してました。
ある程度データが集まったのでCarScannerアプリでグラフ化して比較もしていたのですがいまいち画面も小さいし見にくいのでPCに入れてExcelに落とし込みグラフや図にしてわかりやすくなるかなーなんて甘い考えをしていたわけです。
しかし、結果的にいうとExcelではうまく処理できず、このサイトに出会うまでは途方に暮れていました。
話は長くなりましたが、CSVにデータは入っていますので上記のサイトを参考にいざ、グラフ化していきましょう!
データの整形とグラフ化
必要なもの
- PC(Windows or Mac)
- Python(JupyterLab,Pandas,plotly_express,Dassh)
- OBD(On Bord Diagnosis)とCarScannerProで記録したCSVファイル
- プログラミング知識
ほとんどこちらのサイトで解説されているものを使用しています。
以上になります。
準備
まずは、お手元にPCを用意します。最新のOSをインストールしたのちにPythonをググって利用規約等々に目を通し内容に同意できれば同意。無理ならその時点で今回の作業は終了となります。
同意いただけた皆様は、PCにPythonをインストールします。Pythonをインストールした後は、Anacondaをググってこちらも利用規約等々に目を通し同意できれば同意。同意無理ならその時点で(ry
さて、AnacondaはPandasやJupyter Labが入ったパッケージであり、今後もPythonを勉強するのであれば入れておいても損ではないと思われます。
今回はjupyter labで操作しますので起動の際は「ターミナル」から「jupyter lab」と打ち込み実行するとjupyter labが起動します。起動後はnotebook pythonを選択し、コードを記載しながら実行していけば経過を追いながら編集作業ができます!
OBDから取り出したデータの整理
さて、上記サイト参考にまずはpandasでデタラメにCSVに保存されたデータを整然データに整えていきます。整える際にPandasのDataFrameを使用し整形していきます。
「Seconds」というfloat値で記載されたデータはUnix時間で変換をすると日付はデタラメですが、時間(H)があっていることに気がつくと思います。
そのため、「Seconds」列のデータをfloat値からint64値に変えてUnix時間に変換してあげました。変換した後のデータは「1970-01-01 hh:mm:ss」(hh=時,mm=分,ss=秒…記録された時間と一致してるはず)となるはずです。
このままだと1970-01-01というタイムスリップしたデータになるので1970-01-01を記録した日付に置換してあげます。
後は各PIDがColumnsになれば綺麗な表になります。ちなみにコードはかなり調べるのに時間がかかりましたが、途中でChatGTPを介入させたおかげで想定より早く終わりました。
ちなみに使用したコードはこんな感じです。
#Pandasのインポート
import pandas as pd
# OBDから取得したcsvファイルを読み取る( df_car_dataとしてますが、dfでもいいと思います。)
df_car_data = pd.read_csv('読み込むcsvファイルが保存されている場所のパス',sep = ';')
#[SECONDS]が時刻データになってないので変換させる処理
df_car_data['SECONDS']=df_car_data['SECONDS'].round(0).astype('int64')
df_car_data['時間']= pd.to_datetime(df_car_data['SECONDS'],unit = 's')
time={'datetime_str':df_car_data['時間']}
df=pd.DataFrame(time)
df['datetime']=pd.to_datetime(time['datetime_str'])
# このままだと1970-01-01なのでcsv作成時の年月日に置換(yyyy=年 mm=月 dd=日)
new_time=pd.to_datetime('yyyy-mm-dd')
df['datetime']=df['datetime'].apply(lambda x:x.replace(year=new_time.year,month=new_time.month,day=new_time.day))
df_car_data['日付']=df['datetime']
# 不要な列を削除
del df_car_data['SECONDS']
del df_car_data['Unnamed: 4']
del df_car_data['UNITS']
del df_car_data['時間']
#上記で整えた「日付」列と「PID」列の各値を列に取るDataFrameを作成
df_pivot = df_car_data.pivot_table(index='日付', columns='PID', values='VALUE')
#「日付」に対して1s毎の平均値にする
df_pivot = df_pivot.resample('1S').mean()
# データの結合
merged_df = df_pivot[df_pivot.columns[0]].to_frame()
for col in df_pivot.columns[1:]:
merged_df = merged_df.join(df_pivot[col], how='inner', rsuffix=f'_{col}')
#NaN値を0に置き換える
df_filled = merged_df.fillna(0)
#編集が終わったcsvの保存
df_filled.to_csv('保存先のパス')
前半戦のまとめ
以上、ChatGTPと独学でプログラミングした結果となります。無駄の多いコードかもしれませんがMacBookAirでも処理に問題なくPCが落ちることもないのでこちらで採用しております。
まぁ参考にする人はいないと思いますが。こんなコードが3週間程度で完成です…時間がかかりました。
さて、ここまではCSV を整形すること、でしたので今度はグラフ化です。
グラフ化で使用したコードは一番最初で紹介したサイトの元をそのまま使いました。
まとめ
今回の記事は超絶初心者が独学で作成したコードになりますので意味のわからないコードになっていると思いますが実用性に問題はありません。あくまで使用するのは自己責任でお願いします。
さていよいよデータを分析する準備が整いました。カーライフとは遠のいたテーマでしたが、今後も良いカーライフを皆さまと共有できたら幸いです。
コメント