データを集める・使う

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)

temperature-zt.png
Starrydata
Copyright © Starrydata. All rights reserved.