Assignment API¶
Assign geographic points to closest workers, centers, or service locations.
Main Functions¶
Core Assignment Module¶
Modern distance-based assignment API for allocator package.
- allocator.api.distance.assign_to_closest(points: str | DataFrame | ndarray | list, workers: str | DataFrame | ndarray | list, distance: str = 'euclidean', **kwargs) SortResult[source]¶
Assign each point to its closest worker.
- Parameters:
points – Geographic points to assign
workers – Worker/centroid locations
distance – Distance metric
**kwargs – Additional distance-specific arguments
- Returns:
SortResult with point assignments
- allocator.api.distance.distance_assignment(points: str | DataFrame | ndarray | list, workers: str | DataFrame | ndarray | list, distance: str = 'euclidean', **kwargs) SortResult[source]¶
Assign each point to its closest worker (alias for assign_to_closest).
- Parameters:
points – Geographic points to assign
workers – Worker/centroid locations
distance – Distance metric
**kwargs – Additional distance-specific arguments
- Returns:
SortResult with point assignments
- allocator.api.distance.sort_by_distance(points: str | DataFrame | ndarray | list, workers: str | DataFrame | ndarray | list, by_worker: bool = False, distance: str = 'euclidean', **kwargs) SortResult[source]¶
Sort points by distance to workers or vice versa.
- Parameters:
points – Geographic points to assign (file path, DataFrame, numpy array, or list)
workers – Worker/centroid locations (file path, DataFrame, numpy array, or list)
by_worker – If True, sort points by worker; if False, sort workers by point
distance – Distance metric (‘euclidean’, ‘haversine’, ‘osrm’, ‘google’)
**kwargs – Additional distance-specific arguments
- Returns:
SortResult with assignments and distance information
Example
>>> result = sort_by_distance('points.csv', 'workers.csv') >>> print(result.data) # Points with worker assignments
Usage Examples¶
Basic Point Assignment¶
import pandas as pd
import allocator
# Customer locations
customers = pd.DataFrame({
'longitude': [100.5, 100.6, 100.7, 100.8],
'latitude': [13.7, 13.8, 13.9, 14.0],
'customer_id': ['C1', 'C2', 'C3', 'C4']
})
# Service centers
centers = pd.DataFrame({
'longitude': [100.55, 100.75],
'latitude': [13.75, 13.85],
'center_id': ['North', 'South']
})
# Assign customers to closest centers
assignments = allocator.assign(
points=customers,
workers=centers,
distance='haversine'
)
print("Assignment results:")
for _, row in assignments.iterrows():
print(f"{row['customer_id']} → {row['center_id']} ({row['distance']:.2f}km)")
Assignment with Capacity Constraints¶
# Centers with capacity limits
centers_with_capacity = pd.DataFrame({
'longitude': [100.55, 100.75],
'latitude': [13.75, 13.85],
'center_id': ['North', 'South'],
'capacity': [2, 2] # Maximum assignments per center
})
# Assign with capacity constraints
assignments = allocator.assign(
points=customers,
workers=centers_with_capacity,
distance='haversine',
capacity_column='capacity'
)
# Check capacity utilization
for center in centers_with_capacity['center_id']:
assigned = assignments[assignments['center_id'] == center]
capacity = centers_with_capacity[
centers_with_capacity['center_id'] == center
]['capacity'].iloc[0]
print(f"{center}: {len(assigned)}/{capacity} capacity used")
Assignment Options¶
Distance Methods¶
haversine: Geographic distance (recommended)
euclidean: Straight-line distance (fast)
osrm: Driving distance via OSRM API
googlemaps: Driving distance via Google Maps API
Capacity Handling¶
Simple assignment: Each point assigned to closest worker
Capacity constraints: Respect maximum assignments per worker
Load balancing: Distribute assignments evenly
Data Requirements¶
Points (customers/tasks)¶
Required columns:
longitude: Point longitudelatitude: Point latitude
Optional columns:
point_id: Unique identifier (auto-generated if missing)
Workers (centers/service locations)¶
Required columns:
longitude: Worker/center longitudelatitude: Worker/center latitude
Optional columns:
worker_id: Unique identifier (auto-generated if missing)capacity: Maximum assignments (unlimited if not specified)
Return Format¶
The assign function returns a DataFrame with:
All original point columns
All original worker columns (prefixed with
worker_)worker_id: Assigned worker identifierdistance: Distance to assigned workerassignment_rank: Rank of this assignment (1 = closest)
Performance¶
Assignment operations scale well:
Small datasets (≤100 points): Instant results
Medium datasets (100-1000 points): Sub-second performance
Large datasets (1000+ points): Linear scaling
For very large datasets, consider:
Using euclidean distance for speed
Pre-filtering points by geographic region
Batch processing in smaller chunks
Business Applications¶
Service Territory Planning¶
# Assign customers to sales representatives
territories = allocator.assign(customers, sales_reps)
Emergency Services¶
# Assign incidents to closest fire stations
assignments = allocator.assign(incidents, fire_stations)
Logistics Optimization¶
# Assign deliveries to distribution centers
logistics = allocator.assign(deliveries, warehouses, capacity_column='daily_capacity')