.. -*- coding: utf-8 -*- 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())