見出し画像

#25 目的関数を作成

投稿#24にて、産業連関表の金額フローを物質フローに変換し、各産業の廃棄物発生量Wxを推計することができました。

次に、以下の目的関数を用いて、産業連関表の187分類の廃棄物発生量Wxを、廃棄物実態調査の28分類Eyに対応させて、最適化計算を行うことになります。

画像1

各産業の統計値による廃棄物発生量Syをデータフレームに格納

Syについては、和歌山県廃棄物実態調査のデータを、データフレームdf_statisticsに格納しています。

# 廃棄物実態調査の廃棄物発生量(統計値)をデータフレーム形式で読み込む
df_statistics = pd.read_csv('H27和歌山県廃棄物発生量統計値.csv', index_col=0)
df_statistics.head()

画像2

目的関数を作成してみた

先述の目的関数をコードにしてみました。
関数の引数に何を指定すればいいか、よくわかっていませんが^^;

# 目的関数の作成
def objectivefunction(df_price_per_ton, df_iotable):
   z = 0
   for x in range(len(df_price_per_ton.index)):
       # 投入量を計算
       input = 0 # 投入分
       output = 0 # 産出分
       fuel = 0 # 燃料使用分
       waste = 0 # 廃棄物発生量
       for i in range(187):
           for k in range(len(df_price_per_ton.index)):
               if df_price_per_ton.iat[k, 0] == 0:
                   continue
               if df_price_per_ton.index[k] == df_iotable.index[i]:
                   input += df_iotable.iat[i, x] * 1000000 // df_price_per_ton.iat[k, 0]
                   # 燃料使用分を計算
                   if df_price_per_ton.index[k] == '2121': # 石炭製品の燃料使用分
                       fuel += df_iotable.iat[i, x] * 1000000 // df_price_per_ton.iat[k, 0]
                   # 石油化学系基礎製品への石油製品の投入ではない場合
                   if df_price_per_ton.index[k] == '2111':
                       if df_iotable.columns[x] != '2031':
                           fuel += df_iotable.iat[i, x] * 1000000 // df_price_per_ton.iat[k, 0] # 石油製品の燃料使用分

       # 産出量を計算
       for i in range(187):
           if i == x:
               continue
           if df_price_per_ton.iat[x, 0] == 0:
               output = 0
           else:
               output += df_iotable.iat[x, i] * 1000000 // df_price_per_ton.iat[x, 0]
       
       # 廃棄物発生量を計算
       waste = input - output - fuel
       
       # 計算結果をdf_estimateに格納
       df_estimate.iat[x, 0] = waste
       df_estimate.iat[x, 1] = input
       df_estimate.iat[x, 2] = output
       df_estimate.iat[x, 3] = fuel
       
   for sector, group in df_estimate.groupby('sector'):
       z += (group['Wx'].sum() - df_statistics.loc[sector, 'Sy']) ** 2
   return z

print('z:' + str(z))

画像3


サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪