Pythonでのデータファイルの使用
データセットをpandasに読み込んで、簡単なグラフを作成するところまでを紹介します。
データセットのダウンロード方法は「データセットのダウンロード」を参照してください。
Python 3.10.12、pandas 2.0.2にて実行しています。
1. csvファイルを読み込む
import pandas as pd
df = pd.read_csv("/all_dataset_230908-0000/all_curves.csv", engine='python')
2. 文字列として登録されているXY値をlist形式に変換する
# 文字列をリストに変換するための関数を定義
def convert_string_to_list(string_value):
try:
return eval(string_value) # 文字列を評価してリストに変換
except Exception as e:
print(string_value) # 変換に失敗した場合、エラーメッセージとともに文字列を出力
print(e)
# 'y' 列と 'x' 列の各要素に対して文字列をリストに変換する
df['y'] = df['y'].apply(convert_string_to_list)
df['x'] = df['x'].apply(convert_string_to_list)
3. XY値を1行1カーブから1行1点に展開する
df = df.explode(['x', 'y']).reset_index(drop=True)
4. XY値を物理量毎に列に展開する
# データフレームの 'prop_x' 列の値をカウントし、各値を数値に変換するループ
for prop, count in df['prop_x'].value_counts(normalize=False).items():
# 'prop_x' 列の値が prop と等しい行を数値に変換
df.loc[df['prop_x'] == prop, prop] = pd.to_numeric(df['x'])
# データフレームの 'prop_y' 列の値をカウントし、各値を数値に変換するループ
for prop, count in df['prop_y'].value_counts(normalize=False).items():
# 'prop_y' 列の値が prop と等しい行を数値に変換
df.loc[df['prop_y'] == prop, prop] = pd.to_numeric(df['y'])
5. 物理量の統計データを出力する
df.describe()
6. X軸に温度、Y軸にZTでログスケールでグラフを出力する
# 必要なライブラリをインポート
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, HoverTool
# 使用するデータプロパティと単位を設定
prop_x = "Temperature" # x軸のプロパティ: 温度
prop_y = "ZT" # y軸のプロパティ: ZT
unit_x = "K" # x軸の単位: ケルビン
unit_y = "-" # y軸の単位: なし
label_x = f'{prop_x} ({unit_x})' # x軸ラベル
label_y = f'{prop_y} ({unit_y})' # y軸ラベル
# データを選択(nullでない行のみ)
selected_df = df[(df[prop_x].notnull()) & (df[prop_y].notnull())]
# データソースを作成
source = ColumnDataSource(data=dict(
x=selected_df[prop_x].values, # x軸データ
y=selected_df[prop_y].values, # y軸データ
SID=selected_df['SID'], # SIDデータ
figure_id=selected_df['figure_id'], # フィギュアIDデータ
sample_id=selected_df['sample_id'], # サンプルIDデータ
composition=selected_df['composition'] # 組成データ
))
# プロットを作成
p = figure(title=f'{prop_x} vs. {prop_y}', x_axis_label=label_x, y_axis_label=label_y, x_axis_type='log', y_axis_type='log')
# 散布図を描画
p.scatter('x', 'y', source=source, alpha=0.2)
# ツールチップを設定
hover = HoverTool(tooltips=[('SID', '@SID'), ('Figure ID', '@figure_id'), ('Sample ID', '@sample_id'), ('composition', '@composition')])
p.add_tools(hover)
# プロットを表示
show(p)