Provision

[2]:
from blocksnet import City, Provision, ProvisionMethod

city = City.from_pickle('../data/model.pickle')
[3]:
provision = Provision(city_model=city)
service_type = city['school']
result = provision.calculate(service_type, method=ProvisionMethod.GRAVITATIONAL)
2025-02-06 00:09:30.219 | INFO     | blocksnet.method.provision:_lp_provision:321 - Setting an LP problem for accessibility = 15 : 4591x565
2025-02-06 00:09:53.532 | INFO     | blocksnet.method.provision:_lp_provision:355 - Solving the problem
2025-02-06 00:09:54.224 | INFO     | blocksnet.method.provision:_lp_provision:359 - Restoring values from variables
2025-02-06 00:09:55.738 | INFO     | blocksnet.method.provision:_lp_provision:321 - Setting an LP problem for accessibility = 30 : 2839x67
2025-02-06 00:09:57.591 | INFO     | blocksnet.method.provision:_lp_provision:355 - Solving the problem
2025-02-06 00:09:57.689 | INFO     | blocksnet.method.provision:_lp_provision:359 - Restoring values from variables
2025-02-06 00:09:57.907 | INFO     | blocksnet.method.provision:_lp_provision:321 - Setting an LP problem for accessibility = 45 : 2540x10
2025-02-06 00:09:58.171 | INFO     | blocksnet.method.provision:_lp_provision:355 - Solving the problem
2025-02-06 00:09:58.211 | INFO     | blocksnet.method.provision:_lp_provision:359 - Restoring values from variables
2025-02-06 00:09:58.266 | SUCCESS  | blocksnet.method.provision:calculate:272 - Provision assessment finished
[4]:
provision.plot(result, figsize=(10,10))
../../_images/examples_methods_provision_3_0.png

Update scenario (negative)

[8]:
import pandas as pd

update = {
  5519: {
    'population': 10_000
  }
}

update_df = pd.DataFrame.from_dict(update, 'index')
update_df
[8]:
population
5519 10000
[5]:
upd_result = provision.calculate(service_type, update_df)
2025-02-06 00:08:07.966 | INFO     | blocksnet.method.provision:_lp_provision:321 - Setting an LP problem for accessibility = 15 : 4591x565
2025-02-06 00:08:30.348 | INFO     | blocksnet.method.provision:_lp_provision:355 - Solving the problem
2025-02-06 00:08:31.109 | INFO     | blocksnet.method.provision:_lp_provision:359 - Restoring values from variables
2025-02-06 00:08:32.514 | INFO     | blocksnet.method.provision:_lp_provision:321 - Setting an LP problem for accessibility = 30 : 2854x67
2025-02-06 00:08:34.273 | INFO     | blocksnet.method.provision:_lp_provision:355 - Solving the problem
2025-02-06 00:08:34.383 | INFO     | blocksnet.method.provision:_lp_provision:359 - Restoring values from variables
2025-02-06 00:08:34.605 | INFO     | blocksnet.method.provision:_lp_provision:321 - Setting an LP problem for accessibility = 45 : 2548x10
2025-02-06 00:08:34.866 | INFO     | blocksnet.method.provision:_lp_provision:355 - Solving the problem
2025-02-06 00:08:34.908 | INFO     | blocksnet.method.provision:_lp_provision:359 - Restoring values from variables
2025-02-06 00:08:34.967 | SUCCESS  | blocksnet.method.provision:calculate:272 - Provision assessment finished
[6]:
provision.plot(upd_result, figsize=(10,10))
../../_images/examples_methods_provision_7_0.png
[7]:
delta_result = upd_result.copy()
delta_result['provision'] -= result['provision']
delta_result.plot(
  column='provision',
  vmin=-1,
  vmax=1,
  legend=True,
  linewidth=0.1,
  figsize=(10,10),
  cmap="PuOr"
).set_axis_off()
../../_images/examples_methods_provision_8_0.png

Update scenario (positive)

[13]:
update = {
  1186: {
    'school': 2_000
  }
}

update_df = pd.DataFrame.from_dict(update, 'index')
update_df
[13]:
school
1186 2000
[14]:
upd_result = provision.calculate(service_type, update_df)
2025-02-06 00:13:00.319 | INFO     | blocksnet.method.provision:_lp_provision:321 - Setting an LP problem for accessibility = 15 : 4591x565
2025-02-06 00:13:23.129 | INFO     | blocksnet.method.provision:_lp_provision:355 - Solving the problem
2025-02-06 00:13:23.819 | INFO     | blocksnet.method.provision:_lp_provision:359 - Restoring values from variables
2025-02-06 00:13:25.258 | INFO     | blocksnet.method.provision:_lp_provision:321 - Setting an LP problem for accessibility = 30 : 2838x67
2025-02-06 00:13:27.003 | INFO     | blocksnet.method.provision:_lp_provision:355 - Solving the problem
2025-02-06 00:13:27.102 | INFO     | blocksnet.method.provision:_lp_provision:359 - Restoring values from variables
2025-02-06 00:13:27.322 | INFO     | blocksnet.method.provision:_lp_provision:321 - Setting an LP problem for accessibility = 45 : 2539x10
2025-02-06 00:13:27.586 | INFO     | blocksnet.method.provision:_lp_provision:355 - Solving the problem
2025-02-06 00:13:27.626 | INFO     | blocksnet.method.provision:_lp_provision:359 - Restoring values from variables
2025-02-06 00:13:27.683 | SUCCESS  | blocksnet.method.provision:calculate:272 - Provision assessment finished
[15]:
provision.plot(upd_result, figsize=(10,10))
../../_images/examples_methods_provision_12_0.png
[16]:
delta_result = upd_result.copy()
delta_result['provision'] -= result['provision']
delta_result.plot(
  column='provision',
  vmin=-1,
  vmax=1,
  legend=True,
  linewidth=0.1,
  figsize=(10,10),
  cmap="PuOr"
).set_axis_off()
../../_images/examples_methods_provision_13_0.png

Some utilities

Statistics to help user understand the results

[9]:
provision.stat(result)
[9]:
{'mean': 0.4047230817176672, 'median': 0.0, 'min': 0.0, 'max': 1.0}

Overall provision assessment

[10]:
provision.total(result)
[10]:
0.6416307100358951

Lower and upper bounds of possible provision assessment based on blocks capacities and demands

[11]:
provision.get_bounds(service_type)
[11]:
(0.3889247430791169, 0.6996023258100998)