Source code for swolfpy_processmodels.Distance

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd


[docs] class Distance: """ Python class for importing the distances between the process models. Transport modes include: * Heavy Duty Truck * Medium Duty Truck * Rail * Barge * Cargo Ship :param data: `Dictionary` that includes `Pandas DataFrame` for the distances between the process models as `value` and transport modes as `key`. `DataFrame` should use the name of processes as both `column` and row `index`. :type Data: dict :Example: >>> from swolfpy_processmodels import Distance >>> data = Distance.create_distance_table(['LF','WTE','AD'], ['Heavy Duty Truck'], default_dist=20) >>> data {'Heavy Duty Truck': LF WTE AD LF NaN 20.0 20.0 WTE NaN NaN 20.0 AD NaN NaN NaN} >>> distance = Distance(data) >>> distance.Distance[('LF','WTE')] {'Heavy Duty Truck': 20.0} >>> distance.Distance[('LF','WTE')]['Heavy Duty Truck'] 20.0 """ def __init__(self, data=None): """ Create Distance object. """ self.data = data self.Distance = {} self.transport_modes = list(self.data.keys()) for mode in self.transport_modes: for i in self.data[mode].columns: for j in self.data[mode].index: if (i, j) not in self.Distance.keys(): self.Distance[(i, j)] = {} if (j, i) not in self.Distance.keys(): self.Distance[(j, i)] = {} if not pd.isna(self.data[mode][i][j]) and self.data[mode][i][j] != "": self.Distance[(i, j)][mode] = self.data[mode][i][j] self.Distance[(j, i)][mode] = self.data[mode][i][j] if ( not pd.isna(self.data[mode][j][i]) and self.data[mode][j][i] != "" and self.data[mode][j][i] != self.data[mode][i][j] ): raise ValueError( f"Distance from {i} to {j} is not equal to distance from {j} to {i} in transport mode of {mode}" )
[docs] @staticmethod def create_distance_table(process_names, transport_modes, default_dist=np.nan): """ Static method for creating the data structure for distances and transport modes. :param process_names: `List` of process names (e.g., ``['LF', 'WTE']``) :param transport_modes: `List` of transport modes (i.e., Heavy Duty Truck, Medium Duty Truck, Rail, Barge, Cargo Ship). Example: ``['Heavy Duty Truck', 'Medium Duty Truck']`` :param default_dist: Default distance that is used to fill the `DataFrame`. """ dist_dict = {} dist_array = np.full((len(process_names), len(process_names)), np.nan, dtype="float") dist_array[np.triu_indices_from(dist_array, k=1)] = default_dist for mode in transport_modes: dist_dict[mode] = pd.DataFrame( data=dist_array, columns=process_names, index=process_names ) return dist_dict