Karthik Reddy
added crop recommendation system and restructured files
e2cc26b
Raw
History Blame Contribute Delete
3.42 kB
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()