Spaces:
Sleeping
Sleeping
File size: 3,422 Bytes
61b4af1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | import pandas as pd
import requests
from io import StringIO
import difflib
import logging
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def resolve_coordinates():
# 1. Download Master List
url = "https://raw.githubusercontent.com/recurze/IndianCities/master/india_places.csv"
logger.info(f"Downloading master list from {url}...")
try:
response = requests.get(url)
response.raise_for_status()
master_df = pd.read_csv(StringIO(response.text))
except Exception as e:
logger.error(f"Failed to download master list: {e}")
return
# Normalize master list
master_df.columns = [c.lower() for c in master_df.columns]
# Ensure lat/lon are numeric
master_df['latitude'] = pd.to_numeric(master_df['latitude'], errors='coerce')
master_df['longitude'] = pd.to_numeric(master_df['longitude'], errors='coerce')
master_df = master_df.dropna(subset=['latitude', 'longitude'])
# Create lookup map (lowercase name -> row)
# Priority: District -> City -> State (if name matches)
# We'll just collect all unique names (district, city, etc)
place_map = {}
# Helper to add to map
def add_to_map(name, row):
if not isinstance(name, str): return
n = name.strip().lower()
if n not in place_map:
place_map[n] = {'lat': row['latitude'], 'lon': row['longitude']}
for _, row in master_df.iterrows():
if 'district' in row: add_to_map(row['district'], row)
if 'city' in row: add_to_map(row['city'], row)
if 'state' in row: add_to_map(row['state'], row) # Less likely but possible fallback
possible_names = list(place_map.keys())
logger.info(f"Loaded {len(place_map)} unique place names from master list.")
# 2. Read Missing Districts
missing_file = 'missing_districts.txt'
with open(missing_file, 'r') as f:
# Skip header if present
lines = [l.strip() for l in f if l.strip()]
if lines and lines[0].lower() == 'district_name':
targets = lines[1:]
else:
targets = lines
resolved = []
for district in targets:
d_lower = district.lower()
# Exact match
if d_lower in place_map:
match = place_map[d_lower]
logger.info(f"Exact match: {district} -> {match}")
resolved.append({'district': district, 'lat': match['lat'], 'lon': match['lon']})
continue
# Fuzzy match
matches = difflib.get_close_matches(d_lower, possible_names, n=1, cutoff=0.6)
if matches:
best_match = matches[0]
match_data = place_map[best_match]
logger.info(f"Fuzzy match: {district} -> {best_match} ({match_data})")
resolved.append({'district': district, 'lat': match_data['lat'], 'lon': match_data['lon']})
else:
logger.warning(f"No match found for: {district}")
# 3. Save Resolved
if resolved:
out_df = pd.DataFrame(resolved)
out_df.to_csv('resolved_coords.csv', index=False)
logger.info(f"Saved {len(resolved)} resolved districts to resolved_coords.csv")
else:
logger.warning("No districts resolved.")
if __name__ == "__main__":
resolve_coordinates()
|