3.8.3. pandas を用いた csv データの読み込み

本項では,データ解析分野で表操作によく使われる pandas モジュールを利用して, csv 形式で保持しているデータを PySIMPLE オブジェクトとして読み込む方法を紹介します.

添字が 1 つのデータ value, size を考えます.以下では knapsack.csv があるとします.:

i,value,size
缶コーヒー,120,10
水入りペットボトル,130,12
バナナ,80,7
りんご,100,9
おにぎり,250,21
パン,185,16

これを pandas を用いて読み込み,Parameter にするには次のようにします.:

import pandas as pd
# 1D, 1 index, 複数データ
data = pd.read_csv('knapsack.csv', index_col='i')  # この index_col は明示しなくてもよい
i = Element(value=data['value'].keys())  # 品物
value = Parameter(index=i, value=data['value'].to_dict())
size = Parameter(index=i, value=data['size'].to_dict())

添字が 2 つの場合も同様です.以下では assign.csv があるとします.:

i,j,gain,cost
1,A,31,13
1,B,12,60
1,C,19,76
2,A,76,32
2,B,75,120
2,C,15,6

これを読み込むには次のようにします.:

# 1D, 2 index, 複数データ
data = pd.read_csv('assign.csv', index_col=['i', 'j'])
ij = Element(value=data['gain'].keys())
gain = Parameter(index=ij, value=data['gain'].to_dict())  # 割当利益
cost = Parameter(index=ij, value=data['cost'].to_dict())  # 割当コスト

PySIMPLE で添字が複数次元のデータを与えるには key がタプルの辞書に変換する必要がありますが, これは DataFrame の MultiIndex を使うことで簡単に実現できます. read_csv 関数で読み込む場合,index_col キーワードで MultiIndex を指定することができます.

表形式の場合は少し加工が必要です.以下では product2.csv があるとします.:

i,A,B
0,60,40
1,10,60

これを読み込むには次のようにします.:

# 1D, 2 index
#data = pd.read_csv('product1.csv', index_col=['i', 'j'])

# 2D, 2 index
data = pd.read_csv('product2.csv')
data = data.melt(id_vars='i', var_name='j', value_name='product')
data = data.set_index(['i', 'j'])
ij = Element(value=data['product'].keys())
product = Parameter(index=ij, value=data['product'].to_dict())

表形式の場合,read_csv 関数で読み込んだ後,melt 関数で整形し,set_index 関数を用いることで MultiIndex を指定することができます.

表形式で添字が 3 つの場合も同様です.以下では demand2.csv があるとします.:

i,j,X,Y
0,A,300,200
0,B,180,150
1,A,240,180
1,B,150,120

これを読み込むには次のようにします.:

# 1D, 3 index
#data = pd.read_csv('demand1.csv', index_col=['i', 'j', 'k'])

# 2D, 3 index
data = pd.read_csv('demand2.csv')
data = data.melt(id_vars=['i', 'j'], var_name='k', value_name='demand')
data = data.set_index(['i', 'j', 'k'])
ijk = Element(value=data['demand'].keys())
demand = Parameter(index=ijk, value=data['demand'].to_dict())