Source code for libadalina_analytics.clustering.algorithms.zoning_algorithm
from libadalina_analytics.utils import GeometryFormats
from .zoning_model_simple import AdalinaZoningModelSimple
from libadalina_core.sedona_utils import DataFrame, EPSGFormats
from ..models.adalina_zoning_data import AdalinaZoningData
from ..models.adalina_zoning_distance import ClusteringDistance
from ..models.adalina_zoning_solution import AdalinaZoningSolution
[docs]
def clustering_algorithm(data: DataFrame,
epsg: EPSGFormats,
geometry_column: str = 'geometry',
geometry_format: GeometryFormats = GeometryFormats.WKT,
weight_column: str | None = None,
k_min: int | None = None,
k_max: int | None = None,
f_min: float | None = None,
distances: list[ClusteringDistance] | None = None,
timelimit: int = 60) -> AdalinaZoningSolution | None:
"""
Create clusters of similar areas minimizing their internal distance.
Distances are given as a list of ClusteringDistance objects, each containing:
- name: the name of the column in the input data
- weight: the weight of the distance in the overall distance calculation
- function: the distance function to use
Parameters
----------
data : pandas.DataFrame or geopandas.GeoDataFrame or pyspark.sql.DataFrame
The input data containing the geometries and attributes to be clustered.
epsg : EPSGFormats
The EPSG format of the input geometries.
geometry_column : str
The name of the column containing the geometries. Default is 'geometry'.
geometry_format : GeometryFormats
The format of the geometries in the geometry column. Default is GeometryFormats.WKT.
weight_column : str | None
The name of the column to use as the optional weight of an area. Default is None.
k_min : int | None
The minimum number of clusters to create. If None, defaults to 1.
k_max : int | None
The maximum number of clusters to create. Default is None.
f_min : float | None
The minimum total weight of a cluster. If None, defaults to 1.
distances : list[ClusteringDistance] | None
List of distances to use for clustering. If None, no only distance between area centroids will be used.
Each distance is represented as a ClusteringDistance object that includes the name of the column,
the weight of the distance, and the distance function to use.
timelimit : int
The maximum time (in seconds) to run the algorithm. Default is 60 seconds.
Returns
-------
AdalinaZoningSolution
"""
user_input: dict = {
"epsg": epsg,
"geometry_type": geometry_format,
"geometry": geometry_column,
"timelimit": timelimit
}
if weight_column is not None:
user_input["weight"] = weight_column
if k_min is not None:
user_input["Kmin"] = k_min
if k_max is not None:
user_input["Kmax"] = k_max
if f_min is not None:
user_input["Fmin"] = f_min
if distances is not None:
user_input["distances"] = [{
'name': distance.name,
'weight': distance.weight,
'func': distance.function
} for distance in distances]
data = AdalinaZoningData.from_Amelia(amelia_file=data, user_input=user_input)
model = AdalinaZoningModelSimple(data)
_ = model.run(timelimit=timelimit)
sol = model.get_solution(False)
return sol