Skip to content

Instantly share code, notes, and snippets.

@lnksz
Created September 1, 2017 07:47
Show Gist options
  • Save lnksz/3aa05253e50d5e63a1e8cbcd25a97d18 to your computer and use it in GitHub Desktop.
Save lnksz/3aa05253e50d5e63a1e8cbcd25a97d18 to your computer and use it in GitHub Desktop.
Analyze rivus process and hub handling
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analyze whether a hub is applied in a vertex\n",
"On a branch in sync with tum-ens/rivus/master but adopted the one-liner change from lnksz/rivus/linelength-bug"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import os\n",
"from rivus.main import rivus\n",
"import pyomo.environ # although is not used direktly, is needee by pyomo\n",
"from pyomo.opt.base import SolverFactory\n",
"from rivus.utils.prerun import setup_solver\n",
"# =========================================================\n",
"# Constants - Inputs\n",
"import json\n",
"config = []\n",
"with open('./config.json') as conf:\n",
" config = json.load(conf)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load problem from archive\n",
"\n",
"**Data**:\n",
" - non-spatial: similar to haag15 but with\n",
" - Commodity.Heat.cost-fix and Commodity.Heat.cost-var changed\n",
" - Process.Elec_heating_domestic.cost-fix changed\n",
" - There is Waste incernation plant and its dependencies (commodity, ratio...)\n",
" - spatial: gridder generated 6x6 rectangle grid (25m x 50m edges)\n",
" - edges have homogenously 1000 m^2 as demand and are only residential (not striving for real-world accuracy here)\n",
" - Elec and Gas sources at the two corners of one longer edge"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"arch_dir = os.path.join('result', 'chessboard-170831T0932') # With process\n",
"arch_path = os.path.join(arch_dir, 'prob.pgz')\n",
"prob = rivus.load(arch_path)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Solve again"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'Solver': [{'Termination message': 'Model was solved to optimality (subject to tolerances), and an optimal solution is available.', 'Time': 25.154046297073364, 'Return code': '0', 'Status': 'ok', 'User time': '0.0', 'Message': 'Model was solved to optimality (subject to tolerances), and an optimal solution is available.', 'System time': '0.0', 'Termination condition': 'optimal', 'Error rc': 0}], 'Problem': [{'Lower bound': 8325548.7214, 'Number of binary variables': 2268, 'Number of continuous variables': 12772, 'Number of constraints': 17860, 'Number of integer variables': 2268, 'Number of nonzeros': 50980, 'Sense': 'minimize', 'Name': 'x25300', 'Number of variables': 15040, 'Number of objectives': 1, 'Upper bound': 8329602.27234}], 'Solution': [OrderedDict([('number of solutions', 0), ('number of solutions displayed', 0)])]}"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"solver = SolverFactory(config['solver'])\n",
"solver = setup_solver(solver, log_to_console=False)\n",
"solver.solve(prob, tee=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get the results"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"costs, pmax, kappa_hub, kappa_process = rivus.get_constants(prob)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>process</th>\n",
" <th>District heating plant</th>\n",
" <th>Gas heating domestic</th>\n",
" <th>Gas power plant</th>\n",
" <th>Heat pump domestic</th>\n",
" </tr>\n",
" <tr>\n",
" <th>vertex</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0</td>\n",
" <td>146</td>\n",
" <td>6084</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"process District heating plant Gas heating domestic Gas power plant \\\n",
"vertex \n",
"5 0 146 6084 \n",
"26 0 0 0 \n",
"27 0 0 0 \n",
"32 0 0 0 \n",
"33 0 0 0 \n",
"\n",
"process Heat pump domestic \n",
"vertex \n",
"5 0 \n",
"26 0 \n",
"27 0 \n",
"32 0 \n",
"33 0 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"kappa_process"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Because of this hub-process in the vertex, a short district heating is built out around it."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>commodity</th>\n",
" <th>Elec</th>\n",
" <th>Gas</th>\n",
" <th>Heat</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Vertex1</th>\n",
" <th>Vertex2</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>5</th>\n",
" <th>11</th>\n",
" <td>608</td>\n",
" <td>0</td>\n",
" <td>139</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <th>17</th>\n",
" <td>492</td>\n",
" <td>0</td>\n",
" <td>92</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <th>23</th>\n",
" <td>377</td>\n",
" <td>0</td>\n",
" <td>46</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"commodity Elec Gas Heat\n",
"Vertex1 Vertex2 \n",
"5 11 608 0 139\n",
"11 17 492 0 92\n",
"17 23 377 0 46"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pmax[pmax['Heat'] > 0].dropna()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This would make totally sense if it would be a hub-process, as there is a Gas power plant in vertex 5, and through 'Gas heating domestic' there is a way to convert Gas2Heat with a rather good efficiency."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>ratio</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Commodity</th>\n",
" <th>Direction</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Gas</th>\n",
" <th>In</th>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CO2</th>\n",
" <th>Out</th>\n",
" <td>0.03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat</th>\n",
" <th>Out</th>\n",
" <td>0.95</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ratio\n",
"Commodity Direction \n",
"Gas In 1.00\n",
"CO2 Out 0.03\n",
"Heat Out 0.95"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prob.params['process_commodity'].loc['Gas heating domestic'].sort_index(level=\"Direction\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Peek into and compare the data set with haag15"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data_hg15 = rivus.read_excel('./data/haag15/data.xlsx')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Spatial"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0xebd8940>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0xee6d0f0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"prob.params['edge'].plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Edge demand input"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>geometry</th>\n",
" <th>Edge</th>\n",
" <th>residential</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Vertex1</th>\n",
" <th>Vertex2</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">0</th>\n",
" <th>1</th>\n",
" <td>LINESTRING (11.66842 48.26739, 11.669093500657...</td>\n",
" <td>0</td>\n",
" <td>1000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>LINESTRING (11.66842 48.26739, 11.66842 48.267...</td>\n",
" <td>30</td>\n",
" <td>1000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <td>LINESTRING (11.6690935006573 48.2673899980278,...</td>\n",
" <td>1</td>\n",
" <td>1000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" geometry Edge \\\n",
"Vertex1 Vertex2 \n",
"0 1 LINESTRING (11.66842 48.26739, 11.669093500657... 0 \n",
" 6 LINESTRING (11.66842 48.26739, 11.66842 48.267... 30 \n",
"1 2 LINESTRING (11.6690935006573 48.2673899980278,... 1 \n",
"\n",
" residential \n",
"Vertex1 Vertex2 \n",
"0 1 1000 \n",
" 6 1000 \n",
"1 2 1000 "
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prob.params['edge'].head(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vertex source input"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>geometry</th>\n",
" <th>Elec</th>\n",
" <th>Gas</th>\n",
" <th>Heat</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Vertex</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>POINT (11.66842 48.26739)</td>\n",
" <td>160000</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>POINT (11.6717875032861 48.2673899901389)</td>\n",
" <td>0</td>\n",
" <td>500000</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" geometry Elec Gas Heat\n",
"Vertex \n",
"0 POINT (11.66842 48.26739) 160000 0 0\n",
"5 POINT (11.6717875032861 48.2673899901389) 0 500000 0"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vertex =prob.params['vertex']\n",
"vertex[(vertex['Elec'] > 0) | (vertex['Heat'] > 0) | (vertex['Gas'] > 0)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Commodity (drop waste + sort)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"differences are at `Heat.cost-fix` and `Heat.cost-var`"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unit</th>\n",
" <th>cost-inv-fix</th>\n",
" <th>cost-inv-var</th>\n",
" <th>cost-fix</th>\n",
" <th>cost-var</th>\n",
" <th>loss-fix</th>\n",
" <th>loss-var</th>\n",
" <th>cap-max</th>\n",
" <th>allowed-max</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Commodity</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Waste</th>\n",
" <td>kWh</td>\n",
" <td>0.0</td>\n",
" <td>0.00000</td>\n",
" <td>0.0</td>\n",
" <td>0.01</td>\n",
" <td>0.00000</td>\n",
" <td>0.00000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CO2</th>\n",
" <td>kg</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>inf</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat</th>\n",
" <td>kWh</td>\n",
" <td>350.0</td>\n",
" <td>0.00010</td>\n",
" <td>4.0</td>\n",
" <td>0.07</td>\n",
" <td>0.00020</td>\n",
" <td>0.00002</td>\n",
" <td>160000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Elec</th>\n",
" <td>kWh</td>\n",
" <td>275.0</td>\n",
" <td>0.00001</td>\n",
" <td>5.0</td>\n",
" <td>0.30</td>\n",
" <td>0.00001</td>\n",
" <td>0.00000</td>\n",
" <td>500000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gas</th>\n",
" <td>kWh</td>\n",
" <td>300.0</td>\n",
" <td>0.00002</td>\n",
" <td>7.0</td>\n",
" <td>0.01</td>\n",
" <td>0.00001</td>\n",
" <td>0.00000</td>\n",
" <td>750000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unit cost-inv-fix cost-inv-var cost-fix cost-var loss-fix \\\n",
"Commodity \n",
"Waste kWh 0.0 0.00000 0.0 0.01 0.00000 \n",
"CO2 kg NaN NaN NaN NaN NaN \n",
"Heat kWh 350.0 0.00010 4.0 0.07 0.00020 \n",
"Elec kWh 275.0 0.00001 5.0 0.30 0.00001 \n",
"Gas kWh 300.0 0.00002 7.0 0.01 0.00001 \n",
"\n",
" loss-var cap-max allowed-max \n",
"Commodity \n",
"Waste 0.00000 NaN NaN \n",
"CO2 NaN NaN inf \n",
"Heat 0.00002 160000.0 NaN \n",
"Elec 0.00000 500000.0 NaN \n",
"Gas 0.00000 750000.0 NaN "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prob.params['commodity']"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unit</th>\n",
" <th>cost-inv-fix</th>\n",
" <th>cost-inv-var</th>\n",
" <th>cost-fix</th>\n",
" <th>cost-var</th>\n",
" <th>loss-fix</th>\n",
" <th>loss-var</th>\n",
" <th>cap-max</th>\n",
" <th>allowed-max</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Commodity</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Gas</th>\n",
" <td>kWh</td>\n",
" <td>300.0</td>\n",
" <td>0.00002</td>\n",
" <td>7.0</td>\n",
" <td>0.01</td>\n",
" <td>0.00001</td>\n",
" <td>0.00000</td>\n",
" <td>750000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Elec</th>\n",
" <td>kWh</td>\n",
" <td>275.0</td>\n",
" <td>0.00001</td>\n",
" <td>5.0</td>\n",
" <td>0.30</td>\n",
" <td>0.00001</td>\n",
" <td>0.00000</td>\n",
" <td>500000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat</th>\n",
" <td>kWh</td>\n",
" <td>350.0</td>\n",
" <td>0.00010</td>\n",
" <td>8.0</td>\n",
" <td>NaN</td>\n",
" <td>0.00020</td>\n",
" <td>0.00002</td>\n",
" <td>160000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CO2</th>\n",
" <td>kg</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>inf</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unit cost-inv-fix cost-inv-var cost-fix cost-var loss-fix \\\n",
"Commodity \n",
"Gas kWh 300.0 0.00002 7.0 0.01 0.00001 \n",
"Elec kWh 275.0 0.00001 5.0 0.30 0.00001 \n",
"Heat kWh 350.0 0.00010 8.0 NaN 0.00020 \n",
"CO2 kg NaN NaN NaN NaN NaN \n",
"\n",
" loss-var cap-max allowed-max \n",
"Commodity \n",
"Gas 0.00000 750000.0 NaN \n",
"Elec 0.00000 500000.0 NaN \n",
"Heat 0.00002 160000.0 NaN \n",
"CO2 NaN NaN inf "
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_hg15['commodity']"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unit</th>\n",
" <th>cost-inv-fix</th>\n",
" <th>cost-inv-var</th>\n",
" <th>cost-fix</th>\n",
" <th>cost-var</th>\n",
" <th>loss-fix</th>\n",
" <th>loss-var</th>\n",
" <th>cap-max</th>\n",
" <th>allowed-max</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Commodity</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Gas</th>\n",
" <td>kWh</td>\n",
" <td>300.0</td>\n",
" <td>0.00002</td>\n",
" <td>7.0</td>\n",
" <td>0.01</td>\n",
" <td>0.00001</td>\n",
" <td>0.00000</td>\n",
" <td>750000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Elec</th>\n",
" <td>kWh</td>\n",
" <td>275.0</td>\n",
" <td>0.00001</td>\n",
" <td>5.0</td>\n",
" <td>0.30</td>\n",
" <td>0.00001</td>\n",
" <td>0.00000</td>\n",
" <td>500000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat</th>\n",
" <td>kWh</td>\n",
" <td>350.0</td>\n",
" <td>0.00010</td>\n",
" <td>4.0</td>\n",
" <td>0.07</td>\n",
" <td>0.00020</td>\n",
" <td>0.00002</td>\n",
" <td>160000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CO2</th>\n",
" <td>kg</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>inf</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unit cost-inv-fix cost-inv-var cost-fix cost-var loss-fix \\\n",
"Commodity \n",
"Gas kWh 300.0 0.00002 7.0 0.01 0.00001 \n",
"Elec kWh 275.0 0.00001 5.0 0.30 0.00001 \n",
"Heat kWh 350.0 0.00010 4.0 0.07 0.00020 \n",
"CO2 kg NaN NaN NaN NaN NaN \n",
"\n",
" loss-var cap-max allowed-max \n",
"Commodity \n",
"Gas 0.00000 750000.0 NaN \n",
"Elec 0.00000 500000.0 NaN \n",
"Heat 0.00002 160000.0 NaN \n",
"CO2 NaN NaN inf "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prob.params['commodity'].reindex(data_hg15['commodity'].index)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Process (drop waste + sort)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`Elec_Heating_domestic.cost-fix` is increased. \n",
"But still **hub requirements for *Gas heating domestic* from the Process sheet are met**. \n",
"When we checked the results, we could see that that **input related conditions are also true***.\n",
"\n",
"<form action=\"\">\n",
" <input type=\"checkbox\" name=\"cost-inv-fix0\" checked> fixed investment costs == 0<br>\n",
" <input type=\"checkbox\" name=\"cap-min0\" checked> minimum capacity == 0<br>\n",
" <input type=\"checkbox\" name=\"num_rin1\" checked> has only one input commodity<br>\n",
" <input type=\"checkbox\" name=\"cap-min0\" checked> the input commodity ratio has value 1<br>\n",
"</form>"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cost-inv-fix</th>\n",
" <th>cost-inv-var</th>\n",
" <th>cost-fix</th>\n",
" <th>cost-var</th>\n",
" <th>cap-min</th>\n",
" <th>cap-max</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Process</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>District heating plant</th>\n",
" <td>20000</td>\n",
" <td>100</td>\n",
" <td>50.0</td>\n",
" <td>0.025</td>\n",
" <td>10000</td>\n",
" <td>600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Elec heating domestic</th>\n",
" <td>0</td>\n",
" <td>250</td>\n",
" <td>100.0</td>\n",
" <td>0.100</td>\n",
" <td>0</td>\n",
" <td>50000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat pump plant</th>\n",
" <td>25000</td>\n",
" <td>180</td>\n",
" <td>75.0</td>\n",
" <td>0.075</td>\n",
" <td>10000</td>\n",
" <td>150000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat pump domestic</th>\n",
" <td>0</td>\n",
" <td>250</td>\n",
" <td>100.0</td>\n",
" <td>0.100</td>\n",
" <td>0</td>\n",
" <td>50000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gas power plant</th>\n",
" <td>30000</td>\n",
" <td>60</td>\n",
" <td>60.0</td>\n",
" <td>0.045</td>\n",
" <td>1000</td>\n",
" <td>500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gas heating plant</th>\n",
" <td>25000</td>\n",
" <td>150</td>\n",
" <td>50.0</td>\n",
" <td>0.027</td>\n",
" <td>500</td>\n",
" <td>350000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gas heating domestic</th>\n",
" <td>0</td>\n",
" <td>40</td>\n",
" <td>40.0</td>\n",
" <td>0.023</td>\n",
" <td>0</td>\n",
" <td>50000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cost-inv-fix cost-inv-var cost-fix cost-var \\\n",
"Process \n",
"District heating plant 20000 100 50.0 0.025 \n",
"Elec heating domestic 0 250 100.0 0.100 \n",
"Heat pump plant 25000 180 75.0 0.075 \n",
"Heat pump domestic 0 250 100.0 0.100 \n",
"Gas power plant 30000 60 60.0 0.045 \n",
"Gas heating plant 25000 150 50.0 0.027 \n",
"Gas heating domestic 0 40 40.0 0.023 \n",
"\n",
" cap-min cap-max \n",
"Process \n",
"District heating plant 10000 600000 \n",
"Elec heating domestic 0 50000 \n",
"Heat pump plant 10000 150000 \n",
"Heat pump domestic 0 50000 \n",
"Gas power plant 1000 500000 \n",
"Gas heating plant 500 350000 \n",
"Gas heating domestic 0 50000 "
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prob.params['process'].reindex(data_hg15['process'].index)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cost-inv-fix</th>\n",
" <th>cost-inv-var</th>\n",
" <th>cost-fix</th>\n",
" <th>cost-var</th>\n",
" <th>cap-min</th>\n",
" <th>cap-max</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Process</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>District heating plant</th>\n",
" <td>20000</td>\n",
" <td>100</td>\n",
" <td>50</td>\n",
" <td>0.025</td>\n",
" <td>10000</td>\n",
" <td>600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Elec heating domestic</th>\n",
" <td>0</td>\n",
" <td>250</td>\n",
" <td>30</td>\n",
" <td>0.100</td>\n",
" <td>0</td>\n",
" <td>50000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat pump plant</th>\n",
" <td>25000</td>\n",
" <td>180</td>\n",
" <td>75</td>\n",
" <td>0.075</td>\n",
" <td>10000</td>\n",
" <td>150000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat pump domestic</th>\n",
" <td>0</td>\n",
" <td>250</td>\n",
" <td>100</td>\n",
" <td>0.100</td>\n",
" <td>0</td>\n",
" <td>50000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gas power plant</th>\n",
" <td>30000</td>\n",
" <td>60</td>\n",
" <td>60</td>\n",
" <td>0.045</td>\n",
" <td>1000</td>\n",
" <td>500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gas heating plant</th>\n",
" <td>25000</td>\n",
" <td>150</td>\n",
" <td>50</td>\n",
" <td>0.027</td>\n",
" <td>500</td>\n",
" <td>350000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gas heating domestic</th>\n",
" <td>0</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>0.023</td>\n",
" <td>0</td>\n",
" <td>50000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cost-inv-fix cost-inv-var cost-fix cost-var \\\n",
"Process \n",
"District heating plant 20000 100 50 0.025 \n",
"Elec heating domestic 0 250 30 0.100 \n",
"Heat pump plant 25000 180 75 0.075 \n",
"Heat pump domestic 0 250 100 0.100 \n",
"Gas power plant 30000 60 60 0.045 \n",
"Gas heating plant 25000 150 50 0.027 \n",
"Gas heating domestic 0 40 40 0.023 \n",
"\n",
" cap-min cap-max \n",
"Process \n",
"District heating plant 10000 600000 \n",
"Elec heating domestic 0 50000 \n",
"Heat pump plant 10000 150000 \n",
"Heat pump domestic 0 50000 \n",
"Gas power plant 1000 500000 \n",
"Gas heating plant 500 350000 \n",
"Gas heating domestic 0 50000 "
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_hg15['process']"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>ratio</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Commodity</th>\n",
" <th>Direction</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Gas</th>\n",
" <th>In</th>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CO2</th>\n",
" <th>Out</th>\n",
" <td>0.03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat</th>\n",
" <th>Out</th>\n",
" <td>0.95</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ratio\n",
"Commodity Direction \n",
"Gas In 1.00\n",
"CO2 Out 0.03\n",
"Heat Out 0.95"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prob.params['process_commodity'].loc['Gas heating domestic'].sort_index(level=\"Direction\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<br><br><br><hr>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Other differences in the data set"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Process-Commodity"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th>ratio</th>\n",
" <th>ratio_hg</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Process</th>\n",
" <th>Commodity</th>\n",
" <th>Direction</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Elec heating domestic</th>\n",
" <th>CO2</th>\n",
" <th>Out</th>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat pump domestic</th>\n",
" <th>CO2</th>\n",
" <th>Out</th>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat pump plant</th>\n",
" <th>CO2</th>\n",
" <th>Out</th>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">Waste incineration plant</th>\n",
" <th>CO2</th>\n",
" <th>Out</th>\n",
" <td>0.55</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Elec</th>\n",
" <th>Out</th>\n",
" <td>0.22</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat</th>\n",
" <th>Out</th>\n",
" <td>0.75</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Waste</th>\n",
" <th>In</th>\n",
" <td>1.00</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" ratio ratio_hg\n",
"Process Commodity Direction \n",
"Elec heating domestic CO2 Out NaN 0.0\n",
"Heat pump domestic CO2 Out NaN 0.0\n",
"Heat pump plant CO2 Out NaN 0.0\n",
"Waste incineration plant CO2 Out 0.55 NaN\n",
" Elec Out 0.22 NaN\n",
" Heat Out 0.75 NaN\n",
" Waste In 1.00 NaN"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = 'process_commodity'\n",
"comp_pc = prob.params[df].join(data_hg15[df], rsuffix='_hg', how='outer')\n",
"comp_pc[comp_pc['ratio'] != comp_pc['ratio_hg']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Waste added and zero ratio outputs were removed**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Time"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Identical** apart from float-integer format differences. \n",
"(one is after create_model, other is directly read from excel)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of different rows: 0\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>weight</th>\n",
" <th>Elec</th>\n",
" <th>Heat</th>\n",
" <th>weight_hg</th>\n",
" <th>Elec_hg</th>\n",
" <th>Heat_hg</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>cold</th>\n",
" <td>3055.0</td>\n",
" <td>0.41</td>\n",
" <td>0.42</td>\n",
" <td>3055</td>\n",
" <td>0.41</td>\n",
" <td>0.42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>dark</th>\n",
" <td>1339.0</td>\n",
" <td>0.63</td>\n",
" <td>0.10</td>\n",
" <td>1339</td>\n",
" <td>0.63</td>\n",
" <td>0.10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>peak elec</th>\n",
" <td>508.0</td>\n",
" <td>1.00</td>\n",
" <td>0.42</td>\n",
" <td>508</td>\n",
" <td>1.00</td>\n",
" <td>0.42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>peak heat</th>\n",
" <td>150.0</td>\n",
" <td>0.46</td>\n",
" <td>1.00</td>\n",
" <td>150</td>\n",
" <td>0.46</td>\n",
" <td>1.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>summer</th>\n",
" <td>3708.0</td>\n",
" <td>0.32</td>\n",
" <td>0.07</td>\n",
" <td>3708</td>\n",
" <td>0.32</td>\n",
" <td>0.07</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" weight Elec Heat weight_hg Elec_hg Heat_hg\n",
"Time \n",
"cold 3055.0 0.41 0.42 3055 0.41 0.42\n",
"dark 1339.0 0.63 0.10 1339 0.63 0.10\n",
"peak elec 508.0 1.00 0.42 508 1.00 0.42\n",
"peak heat 150.0 0.46 1.00 150 0.46 1.00\n",
"summer 3708.0 0.32 0.07 3708 0.32 0.07"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = 'time'\n",
"diff_time = prob.params[df].reindex(data_hg15[df].index) != data_hg15[df]\n",
"print('Number of different rows: {}'.format(len(data_hg15[df][diff_time].dropna())))\n",
"\n",
"prob.params[df].join(data_hg15[df], rsuffix='_hg', how='outer')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Area-Demand"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Identical** (regarding residential because only residential is used in this example)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>peak</th>\n",
" <th>peak_hg</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Commodity</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Elec</th>\n",
" <td>0.05</td>\n",
" <td>0.05</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Heat</th>\n",
" <td>0.11</td>\n",
" <td>0.11</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" peak peak_hg\n",
"Commodity \n",
"Elec 0.05 0.05\n",
"Heat 0.11 0.11"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = 'area_demand'\n",
"prob.params[df].join(data_hg15[df], rsuffix='_hg', how='inner').loc['residential']"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>geometry</th>\n",
" <th>Edge</th>\n",
" <th>residential</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Vertex1</th>\n",
" <th>Vertex2</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">0</th>\n",
" <th>1</th>\n",
" <td>LINESTRING (11.66842 48.26739, 11.669093500657...</td>\n",
" <td>0</td>\n",
" <td>1000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>LINESTRING (11.66842 48.26739, 11.66842 48.267...</td>\n",
" <td>30</td>\n",
" <td>1000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">1</th>\n",
" <th>2</th>\n",
" <td>LINESTRING (11.6690935006573 48.2673899980278,...</td>\n",
" <td>1</td>\n",
" <td>1000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>LINESTRING (11.6690935006573 48.2673899980278,...</td>\n",
" <td>35</td>\n",
" <td>1000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" geometry Edge \\\n",
"Vertex1 Vertex2 \n",
"0 1 LINESTRING (11.66842 48.26739, 11.669093500657... 0 \n",
" 6 LINESTRING (11.66842 48.26739, 11.66842 48.267... 30 \n",
"1 2 LINESTRING (11.6690935006573 48.2673899980278,... 1 \n",
" 7 LINESTRING (11.6690935006573 48.2673899980278,... 35 \n",
"\n",
" residential \n",
"Vertex1 Vertex2 \n",
"0 1 1000 \n",
" 6 1000 \n",
"1 2 1000 \n",
" 7 1000 "
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prob.params['edge'].head(4)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:fion]",
"language": "python",
"name": "conda-env-fion-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@lnksz
Copy link
Author

lnksz commented Sep 1, 2017

for arch_dir you should use where the prob.pgz file is located.

zip with prob.pgz and a html plot

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment