#28 和歌山県の廃棄物発生量を最適化手法により推計
#27で 、最適化計算を実行しました。
今回は、最適化計算によって得られた重量単価を用いて、和歌山県の廃棄物発生量を推計していきます。
最適化後の重量単価一覧表を取得
まずは、最適化した重量単価の一覧表を取得します。
新規データフレームdf_sol_price_per_tonに、最適化後の重量単価(変数の値)を格納します。
# 最適化後の重量単価をデータフレームに格納
df_sol_price_per_ton = df_price_per_ton.copy()
for i in range(len(df_sol_price_per_ton.index)):
df_sol_price_per_ton.iat[i, 0] = int(model.u[model.ITEMS[i]].value)
df_sol_price_per_ton
最適化後の各部門の廃棄物発生量を推計
先述の最適化後の重量単価一覧表を用いて、部門(sector)ごとの廃棄物発生量を推計します。
# 最適化後の廃棄物発生量を推計
df_sol_estimate = df_estimate.copy()
for x in range(len(df_sol_price_per_ton.index)):
# 投入量を計算
input = 0 # 投入分
output = 0 # 産出分
fuel = 0 # 燃料使用分
waste = 0 # 廃棄物発生量
for i in range(187):
for k in range(len(df_sol_price_per_ton.index)):
if df_sol_price_per_ton.index[k] == '0131': # 0131(農業サービス)からの投入は考慮しない
continue
if df_sol_price_per_ton.index[k] == df_iotable.index[i]:
input += df_iotable.iat[i, x] * 1000000 // df_sol_price_per_ton.iat[k, 0]
# 燃料使用分を計算
if df_sol_price_per_ton.index[k] == '2121': # 石炭製品の燃料使用分
fuel += df_iotable.iat[i, x] * 1000000 // df_sol_price_per_ton.iat[k, 0]
# 石油化学系基礎製品への石油製品の投入ではない場合
if df_sol_price_per_ton.index[k] == '2111':
if df_iotable.columns[x] != '2031':
fuel += df_iotable.iat[i, x] * 1000000 // df_sol_price_per_ton.iat[k, 0] # 石油製品の燃料使用分
# 産出量を計算
for i in range(187):
if i == x:
continue
if df_sol_price_per_ton.index[x] == '0131': # 0131(農業サービス)の産出は考慮しない
output = 0
else:
output += df_iotable.iat[x, i] * 1000000 // df_sol_price_per_ton.iat[x, 0]
# 廃棄物発生量を計算
waste = input - output - fuel
# 計算結果をdf_sol_estimateに格納
df_sol_estimate.iat[x, 0] = waste
df_sol_estimate.iat[x, 1] = input
df_sol_estimate.iat[x, 2] = output
df_sol_estimate.iat[x, 3] = fuel
for sector, group in df_sol_estimate.groupby('sector'):
print(sector + ':' + str(group['Wx'].sum()))
最適化後の廃棄物発生量の推計値と統計値を比較
最適化手法によって推計した和歌山県の廃棄物発生量(推計値;Ey)と実態調査報告書の値(統計値;Sy)を部門ごとに比較した表を作成しました。
# 最適化後の推計値と統計値の比較表をデータフレームに格納
df_sol_statistics = df_statistics.copy()
df_sol_statistics['Ey'] = 0
df_sol_statistics = df_sol_statistics[['Ey', 'Sy']]
for i in range(len(df_sol_statistics)):
for sector, group in df_sol_estimate.groupby('sector'):
if sector == df_sol_statistics.index[i]:
df_sol_statistics.iat[i, 0] = group['Wx'].sum()
df_sol_statistics
推計値(Ey)にマイナスが多いのが気になりますね。
いいなと思ったら応援しよう!
サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪