#25 目的関数を作成
投稿#24にて、産業連関表の金額フローを物質フローに変換し、各産業の廃棄物発生量Wxを推計することができました。
次に、以下の目的関数を用いて、産業連関表の187分類の廃棄物発生量Wxを、廃棄物実態調査の28分類Eyに対応させて、最適化計算を行うことになります。
各産業の統計値による廃棄物発生量Syをデータフレームに格納
Syについては、和歌山県廃棄物実態調査のデータを、データフレームdf_statisticsに格納しています。
# 廃棄物実態調査の廃棄物発生量(統計値)をデータフレーム形式で読み込む
df_statistics = pd.read_csv('H27和歌山県廃棄物発生量統計値.csv', index_col=0)
df_statistics.head()
目的関数を作成してみた
先述の目的関数をコードにしてみました。
関数の引数に何を指定すればいいか、よくわかっていませんが^^;
# 目的関数の作成
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))
サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪