File size: 4,206 Bytes
0c02b78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import os
import json
import imdlib as imd
import numpy as np
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

CITIES = {
    "Mumbai": {"lat": 18.9878, "lon": 72.8364},
    "Pune": {"lat": 18.5204, "lon": 73.8567},
    "Nagpur": {"lat": 21.1458, "lon": 79.0882},
    "Nashik": {"lat": 19.9975, "lon": 73.7898},
    "Chhatrapati Sambhajinagar": {"lat": 19.8762, "lon": 75.3433},
    "Panaji": {"lat": 15.4909, "lon": 73.8278},
    "Margao": {"lat": 15.2736, "lon": 73.9580},
    "Vasco da Gama": {"lat": 15.3973, "lon": 73.8122},
    "Mapusa": {"lat": 15.5937, "lon": 73.8105},
    "Ponda": {"lat": 15.4026, "lon": 74.0156},
    "Bicholim": {"lat": 15.5908, "lon": 73.9525},
    "Curchorem": {"lat": 15.2530, "lon": 74.1165},
    "Sanguem": {"lat": 15.2289, "lon": 74.1539},
    "Canacona": {"lat": 15.0118, "lon": 74.0223},
    "Pernem": {"lat": 15.7187, "lon": 73.7997},
    "Bengaluru": {"lat": 12.9716, "lon": 77.5946},
    "Mysuru": {"lat": 12.2958, "lon": 76.6394},
    "Hubballi": {"lat": 15.3647, "lon": 75.1240},
    "Mangaluru": {"lat": 12.9141, "lon": 74.8560},
    "Belagavi": {"lat": 15.8497, "lon": 74.4977},
    "Kalaburagi": {"lat": 17.3297, "lon": 76.8343},
    "Davanagere": {"lat": 14.4644, "lon": 75.9218},
    "Ballari": {"lat": 15.1394, "lon": 76.9214},
    "Vijayapura": {"lat": 16.8302, "lon": 75.7100},
    "Shivamogga": {"lat": 13.9299, "lon": 75.5681},
    "Tumakuru": {"lat": 13.3392, "lon": 77.1010},
    "Raichur": {"lat": 16.2076, "lon": 77.3463},
    "Bidar": {"lat": 17.9104, "lon": 77.5199},
    "Hosapete": {"lat": 15.2711, "lon": 76.3908},
    "Gadag": {"lat": 15.4297, "lon": 75.6322},
    "Hassan": {"lat": 13.0033, "lon": 76.1004},
    "Udupi": {"lat": 13.3409, "lon": 74.7421},
    "Chitradurga": {"lat": 14.2251, "lon": 76.3980},
    "Kolar": {"lat": 13.1367, "lon": 78.1291},
    "Mandya": {"lat": 12.5218, "lon": 76.8951}
}

def fetch_and_process():
    # 2014 to 2023 (10 complete years)
    start_yr = 2014
    end_yr = 2023
    file_dir = './imd_raw_data'
    os.makedirs(file_dir, exist_ok=True)
    
    variables = ['tmax', 'tmin', 'rain']
    datasets = {}
    
    for var in variables:
        print(f"Downloading {var} from {start_yr} to {end_yr}...")
        try:
            imd.get_data(var, start_yr, end_yr, fn_format='yearwise', file_dir=file_dir)
            data = imd.open_data(var, start_yr, end_yr, 'yearwise', file_dir)
            datasets[var] = data.get_xarray()
            print(f"Successfully loaded {var} dataset.")
        except Exception as e:
            print(f"Error processing {var}: {e}")
            return

    # Extract historical extremes for each city
    results = {}
    
    print("Processing historical data for cities...")
    for city_name, coords in CITIES.items():
        lat = coords['lat']
        lon = coords['lon']
        
        city_data = {}
        try:
            for var in variables:
                ds = datasets[var]
                # Nearest grid point
                ts = ds[var].sel(lat=lat, lon=lon, method='nearest')
                
                # We replace 99.9 (IMD nodata) with NaN
                ts = ts.where(ts < 99.9)
                
                if var == 'tmax':
                    city_data['all_time_max'] = float(ts.max().values)
                    city_data['avg_max'] = float(ts.mean().values)
                elif var == 'tmin':
                    city_data['all_time_min'] = float(ts.min().values)
                elif var == 'rain':
                    city_data['max_daily_rain'] = float(ts.max().values)
                    
        except Exception as e:
            print(f"Error calculating stats for {city_name}: {e}")
            
        results[city_name] = city_data

    # Save to frontend data directory
    out_dir = os.path.join(os.path.dirname(__file__), '..', 'frontend', 'src', 'data')
    os.makedirs(out_dir, exist_ok=True)
    out_file = os.path.join(out_dir, 'imd_historical_baseline.json')
    
    with open(out_file, 'w') as f:
        json.dump(results, f, indent=2)
        
    print(f"Successfully saved IMD Historical Baseline to {out_file}")

if __name__ == "__main__":
    fetch_and_process()