こんな方におすすめ
- ログファイルから必要情報を抜き出したい
- テキストファイルの情報を解析しやすいように処理したい
- ログファイルからヒストグラムを作りたい
エンジニアの開発や生産現場では、なんらかのログファイルを作成してデータ解析をすることが多々あると思います。今回は、ログファイルから必要情報を抜き出し、ヒストグラムにする方法について説明します。
ログの形式がどのような形であれ、データ解析しやすいように変換しヒストグラムが作れるようになると思います。
データ解析の前処理の方法として参考になればと思います。
今回のゴールと手順
データ解析をするためには、ログファイルなどからデータ解析したい情報を抜き出し、データフレーム に正しく格納することが重要です。そのようにすることで、データ解析の様々な関数が使用できるようになり、簡単に解析できるようになります。
今回は、初めにログファイルから、必要な情報を抜き出しcsvファイルを作成します。作成したcsvファイルを読み出し、データフレーム に格納しヒストグラムを作成していきます。
ログデータ(log_blog)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/////////////////////////////////////////////////////////////////////////////////////// >>> Conditions >>> TestNo.: 800, TestName: DWaveShm >>> VIL=0.000[V], VIH=1.800[V] >>> START VOH=0.000[V], END VOH=1.800[V], STEP:0.010[V] >>> START TIME=0.000[ns], END TIME=3.334[ns], STEP TIME=0.020[ns], RATE=3.334[ns] /////////////////////////////////////////////////////////////////////////////////////// Rate = 3.334000 [ns] Progress|<------------------------------------------------------------------------------------------------>| 01/02 **************************************************************************************************** 02/02 ********************************************************************...Done!! <<< VOH/VOL Checking >>> Check the VOH/VOL !! Limit Mesure Limit ------ DUT PinName Pin VOH/VOL Result MIN[V] Value[V] MAX[V] ----- ----------------------------------------------------------------------------------- 1, Combi_01F , a_1 : VOH : <COLOR=Green>PASS</COLOR> : 1.260, 1.470, 1.800 1, Combi_01F , a_1 : VOL : <COLOR=Green>PASS</COLOR> : 0.000, 0.210, 0.540 1, Combi_01R , a_2 : VOH : <COLOR=Green>PASS</COLOR> : 1.260, 1.430, 1.800 1, Combi_01R , a_2 : VOL : <COLOR=Green>PASS</COLOR> : 0.000, 0.200, 0.540 1, Combi_03F , a_5 : VOH : <COLOR=Green>PASS</COLOR> : 1.260, 1.440, 1.800 1, Combi_03F , a_5 : VOL : <COLOR=Green>PASS</COLOR> : 0.000, 0.220, 0.540 1, Combi_03R , a_6 : VOH : <COLOR=Green>PASS</COLOR> : 1.260, 1.390, 1.800 1, Combi_03R , a_6 : VOL : <COLOR=Green>PASS</COLOR> : 0.000, 0.220, 0.540 1, Combi_05F , a_9 : VOH : <COLOR=Green>PASS</COLOR> : 1.260, 1.460, 1.800 |
csvファイル
ログデータから必要な情報のみを抜き出し、以下のようなcsvファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Site,Combi,Pin,Unit,Result,Limit_Min,Meas_Value,Limit_Max 1, Combi_01F , a_1 , VOH , <COLOR=Green>PASS , 1.260, 1.470, 1.800 1, Combi_01R , a_2 , VOH , <COLOR=Green>PASS , 1.260, 1.430, 1.800 1, Combi_03F , a_5 , VOH , <COLOR=Green>PASS , 1.260, 1.440, 1.800 1, Combi_03R , a_6 , VOH , <COLOR=Green>PASS , 1.260, 1.390, 1.800 1, Combi_05F , a_9 , VOH , <COLOR=Green>PASS , 1.260, 1.460, 1.800 1, Combi_05R , a_10 , VOH , <COLOR=Green>PASS , 1.260, 1.430, 1.800 1, Combi_07F , a_13 , VOH , <COLOR=Green>PASS , 1.260, 1.450, 1.800 1, Combi_07R , a_14 , VOH , <COLOR=Green>PASS , 1.260, 1.310, 1.800 1, Combi_09F , a_33 , VOH , <COLOR=Green>PASS , 1.260, 1.400, 1.800 1, Combi_09R , a_34 , VOH , <COLOR=Green>PASS , 1.260, 1.410, 1.800 1, Combi_11F , a_37 , VOH , <COLOR=Green>PASS , 1.260, 1.390, 1.800 1, Combi_11R , a_38 , VOH , <COLOR=Green>PASS , 1.260, 1.400, 1.800 1, Combi_13F , a_39 , VOH , <COLOR=Green>PASS , 1.260, 1.420, 1.800 1, Combi_13R , a_40 , VOH , <COLOR=Green>PASS , 1.260, 1.400, 1.800 2, Combi_01F , b_1 , VOH , <COLOR=Green>PASS , 1.260, 1.410, 1.800 2, Combi_01R , b_2 , VOH , <COLOR=Green>PASS , 1.260, 1.430, 1.800 2, Combi_03F , b_5 , VOH , <COLOR=Green>PASS , 1.260, 1.400, 1.800 2, Combi_03R , b_6 , VOH , <COLOR=Green>PASS , 1.260, 1.380, 1.800 |
ヒストグラム
csvファイルを読み出しヒストグラムを作成します。ヒストグラムにタイトルやラベル要約統計量、リミット値を記載します。
プログラムの内容
必要なモジュールをインポートします。
1 2 3 4 5 6 |
import pandas as pd import re import csv from matplotlib import pyplot as plt from glob import glob %matplotlib inline |
必要な情報を抜き出しVHO_ALL_800.csvを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#ログファイルの置いてあるディレクトリを指定 dir_name='./' #作成するファイル名を指定 tnumcnt=800 name='VOH_ALL_'+str(tnumcnt)+'.csv' #ヘッダーファイル作成 with open(name, 'w') as wfa: wfa.writelines('Site,Combi,Pin,Unit,Result,Limit_Min,Meas_Value,Limit_Max\n') #複数のログファイルから情報を抜き出したい場合、以下のようにループを回す。(今回は1つのファイル) for file in glob(dir_name+'log_blog*.txt'): #ここでファイルの中身を1行ずつリスト形式でlineListに入れる。 with open(file,'r') as f: lineList = f.readlines() #lineListを一つずつ解析し、必要な情報を取り込む for line in lineList: #Combiの文字が含まれているか if re.search('Combi',line): #VOHの文字が含まれているか if re.search('VOH',line): #該当行の編集。文字の置換処理をしてcsv形式にする line=line.replace(':',',') line=re.sub('<'+'COLOR=Green'+'>','',line) line=re.sub('<'+'COLOR=Red'+'>','',line) line=re.sub('<'+'/COLOR'+'>','',line) #ここで編集した内容を書き込む with open(name, 'a') as wfh: wfh.writelines(line) |
作成したファイルをpandasのread_csv関数で読み出し、ヒストグラムを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#読み出すファイル名 tnumcnt=800 name='VOH_ALL_'+str(tnumcnt)+'.csv' #読み出してデータフレーム に格納 df_voh_all=pd.read_csv(name) #PASSのみの場合 #df_voh_mod=df_voh_all[(df_voh_all.Result=="PASS")] df_voh_all_mod=df_voh_all fig = plt.figure() #リミットラインの表示 plt.vlines([df_voh_all_mod.describe()["Limit_Max"]["mean"]], 0, df_voh_all_mod['Meas_Value'].value_counts().max(), "red", linestyles='dashed') plt.vlines([df_voh_all_mod.describe()["Limit_Min"]["mean"]], 0, df_voh_all_mod['Meas_Value'].value_counts().max(), "red", linestyles='dashed') #要約統計量を計算する summary_count=df_voh_all_mod.describe()['Meas_Value']['count'] summary_mean=df_voh_all_mod.describe()['Meas_Value']['mean'] summary_std=df_voh_all_mod.describe()['Meas_Value']['std'] summary_max=df_voh_all_mod.describe()['Meas_Value']['max'] summary_min=df_voh_all_mod.describe()['Meas_Value']['min'] summary_hlimit=df_voh_all_mod.describe()['Limit_Max']['mean'] summary_llimit=df_voh_all_mod.describe()['Limit_Min']['mean'] #要約統計量をグラフ内に表示する plt.text(0.5,0.89,'count=' + str(int(summary_count)),horizontalalignment='left', verticalalignment='top', family='monospace', transform=ax.transAxes) plt.text(0.5,0.82,'mean =' + '{:.3f}'.format(summary_mean),horizontalalignment='left', verticalalignment='top', family='monospace', transform=ax.transAxes) plt.text(0.5,0.75,'std =' + '{:.3f}'.format(summary_std),horizontalalignment='left', verticalalignment='top', family='monospace', transform=ax.transAxes) plt.text(0.5,0.68,'max =' + '{:.3f}'.format(summary_max),horizontalalignment='left', verticalalignment='top', family='monospace', transform=ax.transAxes) plt.text(0.5,0.61,'min =' + '{:.3f}'.format(summary_min),horizontalalignment='left', verticalalignment='top', family='monospace', transform=ax.transAxes) plt.text(0.5,0.47,'H_limit =' + '{:.3f}'.format(summary_hlimit),horizontalalignment='left', verticalalignment='top', family='monospace', transform=ax.transAxes) plt.text(0.5,0.40,'L_limit =' + '{:.3f}'.format(summary_llimit),horizontalalignment='left', verticalalignment='top', family='monospace', transform=ax.transAxes) #ヒストグラムを作成する ax = fig.add_subplot(1,1,1) ax.hist(df_voh_all_mod['Meas_Value'], bins=60) #グラフのタイトルを入れる ax.set_title('TEST' + str(tnumcnt)+'_VOH') #グラフの軸にラベルを入れる ax.set_xlabel('(V)') ax.set_ylabel('FREQUENCY') #作成したヒストグラムをファイルにセーブ fig.savefig('TEST'+str(tnumcnt)+"_VOH_img.png") |
まとめ
今回は、ログファイルから必要な情報をCSVファイルに落とし、データフレーム として取り込みヒストグラムを作成しました。
開発現場では、同様のファイルを何個も解析することがあります。今回紹介した以下のループを活用することで可能です。
for file in glob(dir_name+'log_blog*.txt'):
ぜひお試しください。