データ処理のコード例です。
有限要素法解析のポストプロセッサJ-visionから吐き出される応力データを評価使用とすると、自分でデータをこねくり回す必要があります。エクセルではやってられないのでpythonで自動化しました。
私の使い方は、csvからデータフレームとして取り込む>不要なデータを削除してデータフレームを整形する。>欲しいデータになるように演算する>結果を可視化する。という流れが多いです。
一度作ったら、クラス化しておけば後々改造するのが楽ちんになりますので、積極的にやっています。
やっていきましょう。モジュール群をインポートします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#python3 """ 当該プログラムはLS-Dyna ポストプロセッサ J-Visionによる第1主応力、ミーゼス相当応力などのcsv出力データを取り込み 時系列最大値(場所は問わず)のグラフを出力するスクリプトです。Keita_Nakamori """ %matplotlib inline import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.ticker as tick # 目盛り操作 import matplotlib.patches as patches # グラフ内へ図形を追加 |
クラスとメソドです。
csvファイルを読み込んでDataFrameを作成。整理します。
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
class jvision(): def __init__(self): pass def show_graph(self,file_addr, save=True): """csvデータを読み込んで データフレームとして整形し グラフを出力する args: file_addr : csvファイルのアドレス.拡張子 save : 出力したグラフを file_addr.png としてカレントディレクトリに保存する return : なし attribute : self.df :整形したデータフレーム self.array_max : 選択した全要素のうち、最大の応力を時系列に並べたリストを表示 self.max : 全時刻 選択した全要素の応力の最大値を算出 self.array_impulse : 選択した全要素の応力の総和を時系列に並べたリスト self.impulse : 全時刻 選択した全要素の力積の総和 """ # ======== データの整形======== #csvデータの1行目に空白があるのでデータフレームを作成する際に予め定義してエラーを回避する col_names = [ 'c{0:02d}'.format(i) for i in range(1000) ] #csvデータの1,2行目に日本語があるのでエンコーディングをshift-jisとしてエラーを回避する encoding="shift-jis" #データフレームを作成する df=pd.read_csv(file_addr,names=col_names, encoding="shift-jis") #不要なcolumnを削除する del df["c00"] #不要なindexを削除する df = df.drop(range(2)) #timeをindexとして定義し、不要となったc0を削除する time = np.array(df["c01"]) df.index = time del df["c01"] # データフレーム内の NAN を含むcolumを削除 .dropna df.shape #削除前のシェイプ(102, 999) df = df.dropna(axis=1, how ="all") df = df.astype(float) #データフレームのあ中はすべて文字列になっているので数値化する df.shape #削除後のシェイプ(102, 321) # ======== データの解析======== # 各時刻ごとの最大値を算出 df_max = df.max(axis=1) # kgf/mm2 df_max =df_max *9.8 # MPa #全時刻の最大値を算出 print(" Max stress in the data : {:.3f} MPa".format(df_max.max(axis=0))) # MPa # Figureを設定 #最大値を算出 df_max = df.max(axis=1) # kgf/mm2 df_max =df_max *9.8 # MPa array_max =np.array(df_max) #np.arrayとして抽出 fig = plt.figure(figsize=(10, 5)) # グラフ描画領域を追加 ax = fig.add_subplot(111) # Axesのタイトルを設定 ax.set_title(file_addr, fontsize = 20) # 時間timeを表すdf.indexは文字列なのでfloatに変換する li=[] for i in df.index: li.append(float(i)) time = li # 全時刻 選択した全要素の力積の総和 array_impulse = df.sum(axis=1)*(li[1]-li[0]) # 時系列の力積リスト impulse = array_impulse.sum(axis=0) # 力積の最大値 #アトリビュートを生成する self.df = df self.time = time self.array_max = array_max self.max = df_max.max(axis=0) self.array_impulse = array_impulse self.impulse =impulse # ======== データの可視化======== # データをプロット ax.plot(time, array_max,label="stress",color="red",marker="",linestyle="solid" ,linewidth=2 ) ax.legend(fontsize=20,loc=1) plt.xlabel("time / sec",fontsize=20) plt.ylabel("Stress / MPa",fontsize=20) plt.tick_params(labelsize = 18) # x軸の目盛設定 #ax.set_xticks( np.arange(0, 0.0010, 0.0002) ) # y軸の目盛設定 #ax.set_yticks(np.arange(0,1000,10)) #ax.tick_params(direction = "inout", length = 5, colors = "black") #plt.gca().xaxis.set_minor_locator(tick.MultipleLocator(5)) #plt.gca().yaxis.set_minor_locator(tick.MultipleLocator(0.1)) # グリッド表示をONにする plt.grid(which='minor') ax.grid(True) #x,yのリミット範囲を定義する ax.set_xlim(0,0.001) ax.set_ylim(0,10000) #保存と表示 if save==True: plt.savefig(file_addr+".png") return |
クラスのインスタンスを作成して、メソドを実行します。
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 |
# インスタンスの作成 data = jvision() # 読み込むファイルのアドレスを定義する file_addr_li =[] file_addr_li.append("case1_n0_principal_stress.csv") file_addr_li.append("case1_n1_principal_stress.csv") file_addr_li.append("case1_n2_principal_stress.csv") file_addr_li.append("case2_n0_principal_stress.csv") file_addr_li.append("case2_n1_principal_stress.csv") file_addr_li.append("case2_n2_principal_stress.csv") file_addr_li.append("case3_n0_principal_stress.csv") file_addr_li.append("case3_n1_principal_stress.csv") file_addr_li.append("case3_n2_principal_stress.csv") # グラフ作成・保存・アトリビュートのメソド jvision.make_graph()を実行する stress_dict={} impulse_dict ={} for file_addr in file_addr_li: data.show_graph(file_addr,save=True) # 応力の最大値をディクショナリで取得 stress_dict[file_addr] = data.max # MPa # 力積の総和をディクショナリで取得 impulse_dict[file_addr] = data.impulse # MPa・s |
結果整理1
1 2 3 4 5 |
#del stress_dict["case3_n0_principal_stress.csv"] y=stress_dict.values() x=range(len(y)) plt.bar(x,y) plt.show() |
結果整理2
1 2 3 4 5 |
#del impulse_dict["case3_n0_principal_stress.csv"] y=impulse_dict.values() x=range(len(y)) plt.bar(x,y) plt.show() |
以上、参考まで。