.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "_auto_examples/plot_trip_distribution.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr__auto_examples_plot_trip_distribution.py: Trip Distribution ================= On this example we calibrate a Synthetic Gravity Model that same model plus IPF (Fratar/Furness). .. GENERATED FROM PYTHON SOURCE LINES 7-16 .. code-block:: python ## Imports from uuid import uuid4 from tempfile import gettempdir from os.path import join from aequilibrae.utils.create_example import create_example import pandas as pd import numpy as np .. GENERATED FROM PYTHON SOURCE LINES 17-18 We create the example project inside our temp folder .. GENERATED FROM PYTHON SOURCE LINES 18-22 .. code-block:: python fldr = join(gettempdir(), uuid4().hex) project = create_example(fldr) .. GENERATED FROM PYTHON SOURCE LINES 23-29 .. code-block:: python # We get the demand matrix directly from the project record # so let's inspect what we have in the project proj_matrices = project.matrices proj_matrices.list() .. raw:: html
name file_name cores procedure procedure_id timestamp description status
0 demand_omx demand.omx 1 None None 2020-11-24 08:47:18 Original data imported to OMX format
1 demand_mc demand_mc.omx 3 None None 2021-02-24 00:51:35 None
2 skims skims.omx 2 None None None Example skim
3 demand_aem demand.aem 1 None None 2020-11-24 08:46:42 Original data imported to AEM format


.. GENERATED FROM PYTHON SOURCE LINES 30-39 .. code-block:: python # We get the demand matrix demand = proj_matrices.get_matrix("demand_omx") demand.computational_view(["matrix"]) # And the impedance impedance = proj_matrices.get_matrix("skims") impedance.computational_view(["time_final"]) .. GENERATED FROM PYTHON SOURCE LINES 40-41 Let's have a function to plot the Trip Length Frequency Distribution .. GENERATED FROM PYTHON SOURCE LINES 41-64 .. code-block:: python from math import log10, floor import matplotlib.pyplot as plt def plot_tlfd(demand, skim, name): plt.clf() b = floor(log10(skim.shape[0]) * 10) n, bins, patches = plt.hist( np.nan_to_num(skim.flatten(), 0), bins=b, weights=np.nan_to_num(demand.flatten()), density=False, facecolor="g", alpha=0.75, ) plt.xlabel("Trip length") plt.ylabel("Probability") plt.title("Trip-length frequency distribution") plt.savefig(name, format="png") return plt .. GENERATED FROM PYTHON SOURCE LINES 65-67 .. code-block:: python from aequilibrae.distribution import GravityCalibration .. GENERATED FROM PYTHON SOURCE LINES 68-85 .. code-block:: python for function in ["power", "expo"]: gc = GravityCalibration(matrix=demand, impedance=impedance, function=function, nan_as_zero=True) gc.calibrate() model = gc.model # we save the model model.save(join(fldr, f"{function}_model.mod")) # We can save an image for the resulting model _ = plot_tlfd(gc.result_matrix.matrix_view, impedance.matrix_view, join(fldr, f"{function}_tfld.png")) # We can save the result of applying the model as well # we can also save the calibration report with open(join(fldr, f"{function}_convergence.log"), "w") as otp: for r in gc.report: otp.write(r + "\n") .. image-sg:: /_auto_examples/images/sphx_glr_plot_trip_distribution_001.png :alt: Trip-length frequency distribution :srcset: /_auto_examples/images/sphx_glr_plot_trip_distribution_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out Out: .. code-block:: none /home/runner/work/aequilibrae/aequilibrae/aequilibrae/distribution/gravity_application.py:315: RuntimeWarning: divide by zero encountered in power self.output.matrix_view[i, :] = (np.power(self.impedance.matrix_view[i, :], -self.model.alpha) * p /home/runner/work/aequilibrae/aequilibrae/aequilibrae/distribution/gravity_application.py:326: RuntimeWarning: invalid value encountered in multiply self.output.matrix_view[:, :] = self.output.matrix_view[:, :] * non_inf .. GENERATED FROM PYTHON SOURCE LINES 86-87 We save a trip length frequency distribution for the demand itself .. GENERATED FROM PYTHON SOURCE LINES 87-90 .. code-block:: python plt = plot_tlfd(demand.matrix_view, impedance.matrix_view, join(fldr, "demand_tfld.png")) plt.show() .. image-sg:: /_auto_examples/images/sphx_glr_plot_trip_distribution_002.png :alt: Trip-length frequency distribution :srcset: /_auto_examples/images/sphx_glr_plot_trip_distribution_002.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 91-96 .. code-block:: python ## Forecast # * We create a set of * 'future' * vectors by applying some models # * We apply the model for both deterrence functions .. GENERATED FROM PYTHON SOURCE LINES 97-102 .. code-block:: python from aequilibrae.distribution import Ipf, GravityApplication, SyntheticGravityModel from aequilibrae.matrix import AequilibraeData import numpy as np .. GENERATED FROM PYTHON SOURCE LINES 103-126 .. code-block:: python zonal_data = pd.read_sql("Select zone_id, population, employment from zones order by zone_id", project.conn) # We compute the vectors from our matrix args = { "file_path": join(fldr, "synthetic_future_vector.aed"), "entries": demand.zones, "field_names": ["origins", "destinations"], "data_types": [np.float64, np.float64], "memory_mode": True, } vectors = AequilibraeData() vectors.create_empty(**args) vectors.index[:] = zonal_data.zone_id[:] # We apply a trivial regression-based model and balance the vectors vectors.origins[:] = zonal_data.population[:] * 2.32 vectors.destinations[:] = zonal_data.employment[:] * 1.87 vectors.destinations *= vectors.origins.sum() / vectors.destinations.sum() .. GENERATED FROM PYTHON SOURCE LINES 127-151 .. code-block:: python # We simply apply the models to the same impedance matrix now for function in ["power", "expo"]: model = SyntheticGravityModel() model.load(join(fldr, f"{function}_model.mod")) outmatrix = join(proj_matrices.fldr, f"demand_{function}_model.aem") apply = GravityApplication() args = { "impedance": impedance, "rows": vectors, "row_field": "origins", "model": model, "columns": vectors, "column_field": "destinations", "nan_as_zero": True, } gravity = GravityApplication(**args) gravity.apply() # We get the output matrix and save it to OMX too, gravity.save_to_project(name=f"demand_{function}_model_omx", file_name=f"demand_{function}_model.omx") .. rst-class:: sphx-glr-script-out Out: .. code-block:: none /home/runner/work/aequilibrae/aequilibrae/aequilibrae/distribution/gravity_application.py:315: RuntimeWarning: divide by zero encountered in power self.output.matrix_view[i, :] = (np.power(self.impedance.matrix_view[i, :], -self.model.alpha) * p /home/runner/work/aequilibrae/aequilibrae/aequilibrae/distribution/gravity_application.py:326: RuntimeWarning: invalid value encountered in multiply self.output.matrix_view[:, :] = self.output.matrix_view[:, :] * non_inf .. GENERATED FROM PYTHON SOURCE LINES 152-157 .. code-block:: python # We update the matrices table/records and verify that the new matrices are indeed there proj_matrices.update_database() proj_matrices.list() .. raw:: html
name file_name cores procedure procedure_id timestamp description status
0 demand_omx demand.omx 1 None None 2020-11-24 08:47:18 Original data imported to OMX format
1 demand_mc demand_mc.omx 3 None None 2021-02-24 00:51:35 None
2 skims skims.omx 2 None None None Example skim
3 demand_aem demand.aem 1 None None 2020-11-24 08:46:42 Original data imported to AEM format
4 demand_power_model_omx demand_power_model.omx 1 Synthetic gravity trip distribution 74464fe2ad4c4c8cb2b6c0c4c38d5cef 2022-03-30 06:34:51.130324 Synthetic gravity trip distribution. POWER
5 demand_expo_model_omx demand_expo_model.omx 1 Synthetic gravity trip distribution 012f1ca2c6ad42cb903e4bfaf470a120 2022-03-30 06:34:51.464701 Synthetic gravity trip distribution. EXPO


.. GENERATED FROM PYTHON SOURCE LINES 158-161 .. code-block:: python ### We now run IPF for the future vectors .. GENERATED FROM PYTHON SOURCE LINES 162-177 .. code-block:: python args = { "matrix": demand, "rows": vectors, "columns": vectors, "column_field": "destinations", "row_field": "origins", "nan_as_zero": True, } ipf = Ipf(**args) ipf.fit() ipf.save_to_project(name="demand_ipf", file_name="demand_ipf.aem") ipf.save_to_project(name="demand_ipf_omx", file_name="demand_ipf.omx") .. rst-class:: sphx-glr-script-out Out: .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 178-181 .. code-block:: python proj_matrices.list() .. raw:: html
name file_name cores procedure procedure_id timestamp description status
0 demand_omx demand.omx 1 None None 2020-11-24 08:47:18 Original data imported to OMX format
1 demand_mc demand_mc.omx 3 None None 2021-02-24 00:51:35 None
2 skims skims.omx 2 None None None Example skim
3 demand_aem demand.aem 1 None None 2020-11-24 08:46:42 Original data imported to AEM format
4 demand_power_model_omx demand_power_model.omx 1 Synthetic gravity trip distribution 74464fe2ad4c4c8cb2b6c0c4c38d5cef 2022-03-30 06:34:51.130324 Synthetic gravity trip distribution. POWER
5 demand_expo_model_omx demand_expo_model.omx 1 Synthetic gravity trip distribution 012f1ca2c6ad42cb903e4bfaf470a120 2022-03-30 06:34:51.464701 Synthetic gravity trip distribution. EXPO
6 demand_ipf demand_ipf.aem 1 Iterative Proportional fitting d0f4537fc7ce4884ad338239b575bcc4 2022-03-30 06:34:51.718792 None
7 demand_ipf_omx demand_ipf.omx 1 Iterative Proportional fitting d0f4537fc7ce4884ad338239b575bcc4 2022-03-30 06:34:51.718792 None


.. GENERATED FROM PYTHON SOURCE LINES 182-184 .. code-block:: python project.close() .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 2.867 seconds) .. _sphx_glr_download__auto_examples_plot_trip_distribution.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_trip_distribution.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_trip_distribution.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_