Python 水準表を作成して、csvファイルに保存する

'22/06/10更新:オプションとして、同じ値の列を別名で追加する場合の雛形コードを追記しました。
 本記事では、PythonでDOE(実験計画法)を作成する雛形コードを載せました。
使用方法は、本コード中にある「param_dict」と名付けた辞書に、作成したい水準の各パラメータを設定するだけです。例えば、下記例では入力因子にLength, Weight, Young_modulus, CTE, Testerの5つを設定し、各々のパラメータ(媒介変数)数は、4, 2, 3, 3, 2個を設定した場合です。

# パラメータを辞書型で設定する。数はいくらでも良い。
param_dict = {
'Length1': (1, 2, 3, 4),
#'Length2': (2, 4, 6, 8),
'Weight': (10, 50),
'Young_modulus': (100, 150, 200),
'CTE':(8e-6, 17e-6, 20e-6),
'Tester':('A', 'B')
}

 上記の設定で本コードを実行すると、下図のような144水準(=4×2×3×3×2)の水準表をcsvファイルで作成することができます。

f:id:HK29:20200804230658p:plain

■本プログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import itertools
import pandas as pd

# 作成する水準表のファイル名
file_path = 'doe.csv'

# パラメータを辞書型で設定する。数はいくらでも良い。
param_dict = {
'Length1': (1, 2, 3, 4),
#'Length2': (2, 4, 6, 8),
'Weight': (10, 50),
'Young_modulus': (100, 150, 200),
'CTE':(8e-6, 17e-6, 20e-6),
'Tester':('A', 'B')
}

# 設定した辞書から、キーと値を取り出して、リスト化する
key_list = []
value_list = []
for key, value in param_dict.items():
    key_list.append(key)
    value_list.append(value)

# 総あたりの組み合わせを抽出して、csvファイルへ書き出す
with open(file_path, 'w', encoding = 'utf-8') as f:
    # *value_listのアスタリスク*はアンパック代入の意
    # enumerateの引数start=1は、カウント開始を1にする意(defaultは0)
    for i, data in enumerate(itertools.product(*value_list), start=1):
        print(i, data)
        if i == 1:
            # リストの要素間にカンマ,を挿入して文字列へ変換する
            buf = ','.join(key_list)
            f.write(buf + '\n')
        # リスト内の型を文字列型へ変換
        str_list = list(map(str, data))
        row = ','.join(str_list)
        f.write(row + '\n')


### オプション(以下は、必要でない場合はコメントアウト)
# 作成したcsvファイルを読み込む
df = pd.read_csv(file_path)

# 列をコピペ(Length2の因子がLength1と等しい値で良い場合)
df['Length2'] = df['Length1']

# 列の並び替え
df = df.loc[:, ('Length1', 'Length2', 'Weight', 'Young_modulus', 'CTE', 'Tester')]

# ファイルへ出力(上書き)
df.to_csv(file_path, index = False, encoding = 'utf-8')
print(df)

(参考)下記リンクは、ExcelVBAで同様のことをする場合の雛形コードです。 

hk29.hatenablog.jp

以上

<広告>