FTZ / utils.py
asrulharunismail's picture
Upload 8 files
a6dfdbe verified
Raw
History Blame Contribute Delete
2.81 kB
"""
Utility functions for data processing and conversion
"""
import numpy as np
import pandas as pd
import re
def local_to_numeric_matrix(cell_mat):
"""Convert cell array/DataFrame to numeric matrix"""
if isinstance(cell_mat, np.ndarray):
if len(cell_mat) == 0:
return np.array([])
if np.issubdtype(cell_mat.dtype, np.number):
return cell_mat.astype(float)
# Convert to DataFrame if not already
if not isinstance(cell_mat, pd.DataFrame):
cell_mat = pd.DataFrame(cell_mat)
mat = np.zeros(cell_mat.shape)
for i in range(cell_mat.shape[0]):
for j in range(cell_mat.shape[1]):
mat[i, j] = _coerce_to_double(cell_mat.iloc[i, j])
return mat
def local_to_numeric_vector(col):
"""Convert column/row of labels to numeric vector"""
if isinstance(col, (list, np.ndarray, pd.Series)):
if len(col) == 0:
return np.array([])
vec = np.zeros(len(col))
for i, val in enumerate(col):
vec[i] = _coerce_to_double(val)
return vec
return np.array([_coerce_to_double(col)])
def local_parse_route(route_str):
"""Parse route string to list of integers"""
if isinstance(route_str, (list, np.ndarray)):
return list(route_str)
if isinstance(route_str, (int, float)):
return [int(route_str)]
if isinstance(route_str, str):
# Extract all numbers from string
numbers = re.findall(r'\d+', route_str)
return [int(n) for n in numbers]
return []
def local_find_coord_columns(T):
"""Find longitude, latitude, and id column indices"""
cols = [c.lower() for c in T.columns]
lonIdx = next((i for i, c in enumerate(cols) if any(x in c for x in ['lon', 'x', 'longitude'])), 0)
latIdx = next((i for i, c in enumerate(cols) if any(x in c for x in ['lat', 'y', 'latitude'])), 1)
idIdx = next((i for i, c in enumerate(cols) if any(x in c for x in ['id', 'node'])), 2)
return lonIdx, latIdx, idIdx
def _coerce_to_double(x):
"""Convert single value to float with safe rules"""
if isinstance(x, (int, float, np.number)):
return float(x)
if isinstance(x, str):
s = x.strip()
if s == "" or s == "-" or s == "—" or s.upper() in ["NA", "N/A"]:
return np.nan
# Extract numeric part
s = re.sub(r'[^\d\.\-eE]', '', s)
try:
return float(s)
except ValueError:
return np.nan
if pd.isna(x):
return np.nan
return np.nan
def Cost_tsp(tour, D):
"""Calculate TSP tour cost"""
n = len(tour)
cost = 0.0
for i in range(n - 1):
cost += D[tour[i], tour[i + 1]]
cost += D[tour[n - 1], tour[0]]
return cost