iPurushottam commited on
Commit
5fd9d71
Β·
verified Β·
1 Parent(s): b84af67

Upload folder using huggingface_hub

Browse files
.gitignore CHANGED
@@ -2,21 +2,21 @@ __pycache__/
2
  *.py[cod]
3
  *$py.class
4
  climai.log
5
- *.json
6
  *.txt
7
  !requirements.txt
8
  .git/
9
  .venv/
10
  .vscode/
11
-
12
- *.ttf
13
- *.woff
14
- *.woff2
15
- *.png
16
- *.jpg
17
- *.jpeg
18
- *.gif
19
- *.svg
20
- __pycache__/
21
- *.pyc
22
  web/
 
2
  *.py[cod]
3
  *$py.class
4
  climai.log
5
+
6
  *.txt
7
  !requirements.txt
8
  .git/
9
  .venv/
10
  .vscode/
11
+
12
+ *.ttf
13
+ *.woff
14
+ *.woff2
15
+ *.png
16
+ *.jpg
17
+ *.jpeg
18
+ *.gif
19
+ *.svg
20
+ __pycache__/
21
+ *.pyc
22
  web/
Dockerfile CHANGED
@@ -1,28 +1,28 @@
1
- # Use an official Python runtime as a parent image
2
- FROM python:3.10-slim
3
-
4
- # Set the working directory
5
- WORKDIR /app
6
-
7
- # Install system dependencies (needed for AI/ML libraries)
8
- # libgomp1 is required for XGBoost and LightGBM
9
- RUN apt-get update && apt-get install -y \
10
- build-essential \
11
- curl \
12
- cmake \
13
- libgomp1 \
14
- && rm -rf /var/lib/apt/lists/*
15
-
16
- # Copy requirements and install them
17
- COPY requirements.txt .
18
- RUN pip install --no-cache-dir --upgrade pip && \
19
- pip install --no-cache-dir -r requirements.txt
20
-
21
- # Copy the rest of the backend code
22
- COPY . .
23
-
24
- # Expose the port FastAPI runs on
25
- EXPOSE 7860
26
-
27
- # Command to run the app (Hugging Face uses port 7860)
28
- CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
 
1
+ # Use an official Python runtime as a parent image
2
+ FROM python:3.10-slim
3
+
4
+ # Set the working directory
5
+ WORKDIR /app
6
+
7
+ # Install system dependencies (needed for AI/ML libraries)
8
+ # libgomp1 is required for XGBoost and LightGBM
9
+ RUN apt-get update && apt-get install -y \
10
+ build-essential \
11
+ curl \
12
+ cmake \
13
+ libgomp1 \
14
+ && rm -rf /var/lib/apt/lists/*
15
+
16
+ # Copy requirements and install them
17
+ COPY requirements.txt .
18
+ RUN pip install --no-cache-dir --upgrade pip && \
19
+ pip install --no-cache-dir -r requirements.txt
20
+
21
+ # Copy the rest of the backend code
22
+ COPY . .
23
+
24
+ # Expose the port FastAPI runs on
25
+ EXPOSE 7860
26
+
27
+ # Command to run the app (Hugging Face uses port 7860)
28
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
data/aqi_history.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"location": "Chennai, India", "period_start": "2025-03-19", "period_end": "2026-03-19", "total_days": 366, "daily": [{"date": "2025-03-19", "avg_pm25": 10.3, "avg_pm10": 13.8, "avg_aqi": 20.2, "avg_no2": 5.5, "avg_o3": 49.1}, {"date": "2025-03-20", "avg_pm25": 10.1, "avg_pm10": 13.3, "avg_aqi": 24.0, "avg_no2": 5.4, "avg_o3": 56.2}, {"date": "2025-03-21", "avg_pm25": 11.8, "avg_pm10": 15.6, "avg_aqi": 29.2, "avg_no2": 4.5, "avg_o3": 73.1}, {"date": "2025-03-22", "avg_pm25": 16.5, "avg_pm10": 20.9, "avg_aqi": 30.7, "avg_no2": 5.4, "avg_o3": 74.2}, {"date": "2025-03-23", "avg_pm25": 15.7, "avg_pm10": 19.8, "avg_aqi": 35.0, "avg_no2": 4.7, "avg_o3": 86.1}, {"date": "2025-03-24", "avg_pm25": 21.7, "avg_pm10": 28.3, "avg_aqi": 40.6, "avg_no2": 6.2, "avg_o3": 80.7}, {"date": "2025-03-25", "avg_pm25": 25.1, "avg_pm10": 32.2, "avg_aqi": 52.0, "avg_no2": 7.5, "avg_o3": 81.5}, {"date": "2025-03-26", "avg_pm25": 29.8, "avg_pm10": 35.0, "avg_aqi": 61.5, "avg_no2": 8.0, "avg_o3": 90.5}, {"date": "2025-03-27", "avg_pm25": 32.5, "avg_pm10": 37.7, "avg_aqi": 65.6, "avg_no2": 7.8, "avg_o3": 104.2}, {"date": "2025-03-28", "avg_pm25": 31.2, "avg_pm10": 36.7, "avg_aqi": 65.5, "avg_no2": 7.2, "avg_o3": 119.7}, {"date": "2025-03-29", "avg_pm25": 27.4, "avg_pm10": 34.8, "avg_aqi": 63.8, "avg_no2": 7.5, "avg_o3": 110.5}, {"date": "2025-03-30", "avg_pm25": 27.6, "avg_pm10": 37.5, "avg_aqi": 62.0, "avg_no2": 6.2, "avg_o3": 93.6}, {"date": "2025-03-31", "avg_pm25": 36.3, "avg_pm10": 49.2, "avg_aqi": 65.3, "avg_no2": 5.5, "avg_o3": 97.0}, {"date": "2025-04-01", "avg_pm25": 30.6, "avg_pm10": 39.2, "avg_aqi": 67.3, "avg_no2": 5.8, "avg_o3": 91.0}, {"date": "2025-04-02", "avg_pm25": 21.9, "avg_pm10": 30.7, "avg_aqi": 60.9, "avg_no2": 4.7, "avg_o3": 80.6}, {"date": "2025-04-03", "avg_pm25": 11.7, "avg_pm10": 16.1, "avg_aqi": 33.2, "avg_no2": 7.0, "avg_o3": 59.7}, {"date": "2025-04-04", "avg_pm25": 12.5, "avg_pm10": 15.6, "avg_aqi": 27.2, "avg_no2": 11.4, "avg_o3": 54.7}, {"date": "2025-04-05", "avg_pm25": 13.9, "avg_pm10": 17.2, "avg_aqi": 29.0, "avg_no2": 8.2, "avg_o3": 56.9}, {"date": "2025-04-06", "avg_pm25": 11.5, "avg_pm10": 14.1, "avg_aqi": 27.8, "avg_no2": 8.4, "avg_o3": 54.2}, {"date": "2025-04-07", "avg_pm25": 9.1, "avg_pm10": 11.8, "avg_aqi": 23.1, "avg_no2": 6.2, "avg_o3": 52.4}, {"date": "2025-04-08", "avg_pm25": 8.1, "avg_pm10": 11.7, "avg_aqi": 23.1, "avg_no2": 5.0, "avg_o3": 56.4}, {"date": "2025-04-09", "avg_pm25": 7.0, "avg_pm10": 10.4, "avg_aqi": 21.0, "avg_no2": 4.3, "avg_o3": 52.6}, {"date": "2025-04-10", "avg_pm25": 21.6, "avg_pm10": 26.3, "avg_aqi": 41.8, "avg_no2": 9.9, "avg_o3": 96.8}, {"date": "2025-04-11", "avg_pm25": 31.1, "avg_pm10": 37.9, "avg_aqi": 63.8, "avg_no2": 6.1, "avg_o3": 149.0}, {"date": "2025-04-12", "avg_pm25": 34.5, "avg_pm10": 41.2, "avg_aqi": 70.5, "avg_no2": 7.8, "avg_o3": 162.4}, {"date": "2025-04-13", "avg_pm25": 18.7, "avg_pm10": 23.7, "avg_aqi": 56.7, "avg_no2": 7.7, "avg_o3": 110.7}, {"date": "2025-04-14", "avg_pm25": 17.9, "avg_pm10": 24.5, "avg_aqi": 41.2, "avg_no2": 6.2, "avg_o3": 90.7}, {"date": "2025-04-15", "avg_pm25": 19.4, "avg_pm10": 31.6, "avg_aqi": 40.4, "avg_no2": 4.9, "avg_o3": 85.5}, {"date": "2025-04-16", "avg_pm25": 19.1, "avg_pm10": 35.4, "avg_aqi": 37.8, "avg_no2": 4.2, "avg_o3": 77.0}, {"date": "2025-04-17", "avg_pm25": 21.0, "avg_pm10": 36.7, "avg_aqi": 42.5, "avg_no2": 4.5, "avg_o3": 75.2}, {"date": "2025-04-18", "avg_pm25": 19.7, "avg_pm10": 29.5, "avg_aqi": 45.7, "avg_no2": 4.7, "avg_o3": 92.3}, {"date": "2025-04-19", "avg_pm25": 25.6, "avg_pm10": 35.3, "avg_aqi": 52.5, "avg_no2": 6.1, "avg_o3": 104.7}, {"date": "2025-04-20", "avg_pm25": 25.1, "avg_pm10": 34.8, "avg_aqi": 61.4, "avg_no2": 5.3, "avg_o3": 106.0}, {"date": "2025-04-21", "avg_pm25": 21.6, "avg_pm10": 32.0, "avg_aqi": 55.0, "avg_no2": 4.6, "avg_o3": 95.4}, {"date": "2025-04-22", "avg_pm25": 17.6, "avg_pm10": 25.9, "avg_aqi": 43.8, "avg_no2": 5.2, "avg_o3": 92.2}, {"date": "2025-04-23", "avg_pm25": 13.2, "avg_pm10": 18.0, "avg_aqi": 41.7, "avg_no2": 5.4, "avg_o3": 98.0}, {"date": "2025-04-24", "avg_pm25": 15.2, "avg_pm10": 20.8, "avg_aqi": 38.2, "avg_no2": 4.8, "avg_o3": 91.4}, {"date": "2025-04-25", "avg_pm25": 16.2, "avg_pm10": 22.6, "avg_aqi": 36.7, "avg_no2": 4.1, "avg_o3": 88.8}, {"date": "2025-04-26", "avg_pm25": 13.5, "avg_pm10": 18.2, "avg_aqi": 38.5, "avg_no2": 4.2, "avg_o3": 94.7}, {"date": "2025-04-27", "avg_pm25": 10.2, "avg_pm10": 14.0, "avg_aqi": 30.2, "avg_no2": 4.4, "avg_o3": 75.4}, {"date": "2025-04-28", "avg_pm25": 7.8, "avg_pm10": 10.9, "avg_aqi": 25.6, "avg_no2": 5.1, "avg_o3": 64.2}, {"date": "2025-04-29", "avg_pm25": 7.1, "avg_pm10": 9.8, "avg_aqi": 27.1, "avg_no2": 4.3, "avg_o3": 68.0}, {"date": "2025-04-30", "avg_pm25": 13.0, "avg_pm10": 16.8, "avg_aqi": 38.8, "avg_no2": 4.9, "avg_o3": 92.0}, {"date": "2025-05-01", "avg_pm25": 15.3, "avg_pm10": 20.9, "avg_aqi": 37.9, "avg_no2": 6.6, "avg_o3": 83.2}, {"date": "2025-05-02", "avg_pm25": 13.8, "avg_pm10": 20.9, "avg_aqi": 33.5, "avg_no2": 4.7, "avg_o3": 66.9}, {"date": "2025-05-03", "avg_pm25": 13.4, "avg_pm10": 20.2, "avg_aqi": 37.6, "avg_no2": 6.2, "avg_o3": 83.0}, {"date": "2025-05-04", "avg_pm25": 12.0, "avg_pm10": 17.9, "avg_aqi": 37.6, "avg_no2": 5.0, "avg_o3": 87.4}, {"date": "2025-05-05", "avg_pm25": 23.5, "avg_pm10": 29.8, "avg_aqi": 52.6, "avg_no2": 6.5, "avg_o3": 129.8}, {"date": "2025-05-06", "avg_pm25": 18.7, "avg_pm10": 24.2, "avg_aqi": 56.8, "avg_no2": 5.6, "avg_o3": 122.2}, {"date": "2025-05-07", "avg_pm25": 23.0, "avg_pm10": 28.8, "avg_aqi": 50.8, "avg_no2": 6.1, "avg_o3": 112.7}, {"date": "2025-05-08", "avg_pm25": 25.6, "avg_pm10": 32.0, "avg_aqi": 60.8, "avg_no2": 7.9, "avg_o3": 137.2}, {"date": "2025-05-09", "avg_pm25": 21.9, "avg_pm10": 29.1, "avg_aqi": 62.2, "avg_no2": 8.1, "avg_o3": 136.8}, {"date": "2025-05-10", "avg_pm25": 25.6, "avg_pm10": 31.1, "avg_aqi": 57.6, "avg_no2": 6.3, "avg_o3": 128.2}, {"date": "2025-05-11", "avg_pm25": 29.0, "avg_pm10": 37.0, "avg_aqi": 63.7, "avg_no2": 6.6, "avg_o3": 126.1}, {"date": "2025-05-12", "avg_pm25": 29.5, "avg_pm10": 36.9, "avg_aqi": 66.8, "avg_no2": 8.1, "avg_o3": 136.0}, {"date": "2025-05-13", "avg_pm25": 33.1, "avg_pm10": 41.0, "avg_aqi": 67.2, "avg_no2": 8.2, "avg_o3": 138.2}, {"date": "2025-05-14", "avg_pm25": 22.3, "avg_pm10": 28.0, "avg_aqi": 62.1, "avg_no2": 6.4, "avg_o3": 118.1}, {"date": "2025-05-15", "avg_pm25": 27.5, "avg_pm10": 32.1, "avg_aqi": 59.2, "avg_no2": 7.0, "avg_o3": 123.8}, {"date": "2025-05-16", "avg_pm25": 28.8, "avg_pm10": 31.9, "avg_aqi": 64.8, "avg_no2": 6.2, "avg_o3": 136.6}, {"date": "2025-05-17", "avg_pm25": 36.8, "avg_pm10": 38.4, "avg_aqi": 65.5, "avg_no2": 10.4, "avg_o3": 133.4}, {"date": "2025-05-18", "avg_pm25": 26.3, "avg_pm10": 28.2, "avg_aqi": 68.5, "avg_no2": 10.2, "avg_o3": 104.3}, {"date": "2025-05-19", "avg_pm25": 7.2, "avg_pm10": 8.1, "avg_aqi": 31.6, "avg_no2": 11.3, "avg_o3": 53.8}, {"date": "2025-05-20", "avg_pm25": 20.6, "avg_pm10": 21.1, "avg_aqi": 46.2, "avg_no2": 14.2, "avg_o3": 116.5}, {"date": "2025-05-21", "avg_pm25": 18.2, "avg_pm10": 19.4, "avg_aqi": 52.0, "avg_no2": 14.6, "avg_o3": 104.0}, {"date": "2025-05-22", "avg_pm25": 21.7, "avg_pm10": 37.0, "avg_aqi": 47.1, "avg_no2": 13.7, "avg_o3": 100.2}, {"date": "2025-05-23", "avg_pm25": 25.1, "avg_pm10": 46.2, "avg_aqi": 58.5, "avg_no2": 9.4, "avg_o3": 111.8}, {"date": "2025-05-24", "avg_pm25": 14.5, "avg_pm10": 18.3, "avg_aqi": 46.0, "avg_no2": 14.4, "avg_o3": 75.7}, {"date": "2025-05-25", "avg_pm25": 11.3, "avg_pm10": 13.1, "avg_aqi": 31.4, "avg_no2": 14.1, "avg_o3": 60.8}, {"date": "2025-05-26", "avg_pm25": 10.4, "avg_pm10": 11.3, "avg_aqi": 28.6, "avg_no2": 13.0, "avg_o3": 63.5}, {"date": "2025-05-27", "avg_pm25": 8.8, "avg_pm10": 9.9, "avg_aqi": 28.3, "avg_no2": 12.1, "avg_o3": 67.2}, {"date": "2025-05-28", "avg_pm25": 8.6, "avg_pm10": 10.2, "avg_aqi": 25.9, "avg_no2": 13.7, "avg_o3": 61.5}, {"date": "2025-05-29", "avg_pm25": 9.2, "avg_pm10": 10.2, "avg_aqi": 28.8, "avg_no2": 10.8, "avg_o3": 69.6}, {"date": "2025-05-30", "avg_pm25": 15.5, "avg_pm10": 22.1, "avg_aqi": 32.5, "avg_no2": 15.6, "avg_o3": 67.2}, {"date": "2025-05-31", "avg_pm25": 21.7, "avg_pm10": 38.6, "avg_aqi": 42.6, "avg_no2": 16.2, "avg_o3": 80.4}, {"date": "2025-06-01", "avg_pm25": 23.2, "avg_pm10": 38.5, "avg_aqi": 58.9, "avg_no2": 14.2, "avg_o3": 95.9}, {"date": "2025-06-02", "avg_pm25": 22.1, "avg_pm10": 32.7, "avg_aqi": 52.6, "avg_no2": 11.4, "avg_o3": 96.5}, {"date": "2025-06-03", "avg_pm25": 17.3, "avg_pm10": 24.0, "avg_aqi": 49.7, "avg_no2": 10.9, "avg_o3": 93.6}, {"date": "2025-06-04", "avg_pm25": 17.5, "avg_pm10": 26.3, "avg_aqi": 45.7, "avg_no2": 9.4, "avg_o3": 102.8}, {"date": "2025-06-05", "avg_pm25": 21.5, "avg_pm10": 45.5, "avg_aqi": 43.8, "avg_no2": 8.1, "avg_o3": 92.7}, {"date": "2025-06-06", "avg_pm25": 27.1, "avg_pm10": 52.2, "avg_aqi": 61.0, "avg_no2": 7.0, "avg_o3": 110.0}, {"date": "2025-06-07", "avg_pm25": 31.9, "avg_pm10": 58.3, "avg_aqi": 64.3, "avg_no2": 11.8, "avg_o3": 112.2}, {"date": "2025-06-08", "avg_pm25": 27.5, "avg_pm10": 39.4, "avg_aqi": 66.0, "avg_no2": 12.3, "avg_o3": 119.3}, {"date": "2025-06-09", "avg_pm25": 21.8, "avg_pm10": 28.8, "avg_aqi": 59.5, "avg_no2": 13.2, "avg_o3": 107.0}, {"date": "2025-06-10", "avg_pm25": 23.7, "avg_pm10": 33.6, "avg_aqi": 51.8, "avg_no2": 13.7, "avg_o3": 102.0}, {"date": "2025-06-11", "avg_pm25": 33.1, "avg_pm10": 53.2, "avg_aqi": 62.1, "avg_no2": 16.1, "avg_o3": 100.6}, {"date": "2025-06-12", "avg_pm25": 24.3, "avg_pm10": 33.8, "avg_aqi": 65.0, "avg_no2": 11.5, "avg_o3": 108.7}, {"date": "2025-06-13", "avg_pm25": 18.6, "avg_pm10": 22.4, "avg_aqi": 53.9, "avg_no2": 10.6, "avg_o3": 99.2}, {"date": "2025-06-14", "avg_pm25": 13.3, "avg_pm10": 14.9, "avg_aqi": 39.4, "avg_no2": 11.7, "avg_o3": 80.2}, {"date": "2025-06-15", "avg_pm25": 11.2, "avg_pm10": 12.6, "avg_aqi": 33.0, "avg_no2": 10.9, "avg_o3": 70.3}, {"date": "2025-06-16", "avg_pm25": 11.6, "avg_pm10": 13.7, "avg_aqi": 29.9, "avg_no2": 13.2, "avg_o3": 66.5}, {"date": "2025-06-17", "avg_pm25": 12.0, "avg_pm10": 13.9, "avg_aqi": 34.5, "avg_no2": 14.2, "avg_o3": 73.4}, {"date": "2025-06-18", "avg_pm25": 12.6, "avg_pm10": 16.7, "avg_aqi": 33.9, "avg_no2": 10.7, "avg_o3": 76.1}, {"date": "2025-06-19", "avg_pm25": 12.9, "avg_pm10": 17.3, "avg_aqi": 36.1, "avg_no2": 10.5, "avg_o3": 77.8}, {"date": "2025-06-20", "avg_pm25": 15.2, "avg_pm10": 22.9, "avg_aqi": 39.0, "avg_no2": 10.1, "avg_o3": 86.1}, {"date": "2025-06-21", "avg_pm25": 17.9, "avg_pm10": 28.4, "avg_aqi": 40.0, "avg_no2": 12.6, "avg_o3": 82.5}, {"date": "2025-06-22", "avg_pm25": 13.4, "avg_pm10": 19.3, "avg_aqi": 34.9, "avg_no2": 13.8, "avg_o3": 63.6}, {"date": "2025-06-23", "avg_pm25": 9.3, "avg_pm10": 12.0, "avg_aqi": 25.7, "avg_no2": 13.8, "avg_o3": 53.8}, {"date": "2025-06-24", "avg_pm25": 12.7, "avg_pm10": 18.2, "avg_aqi": 26.1, "avg_no2": 15.3, "avg_o3": 53.3}, {"date": "2025-06-25", "avg_pm25": 12.1, "avg_pm10": 18.7, "avg_aqi": 27.2, "avg_no2": 13.1, "avg_o3": 52.8}, {"date": "2025-06-26", "avg_pm25": 15.0, "avg_pm10": 22.0, "avg_aqi": 33.5, "avg_no2": 12.0, "avg_o3": 67.1}, {"date": "2025-06-27", "avg_pm25": 13.9, "avg_pm10": 22.6, "avg_aqi": 35.8, "avg_no2": 9.8, "avg_o3": 72.3}, {"date": "2025-06-28", "avg_pm25": 14.5, "avg_pm10": 23.1, "avg_aqi": 37.7, "avg_no2": 10.0, "avg_o3": 77.9}, {"date": "2025-06-29", "avg_pm25": 14.3, "avg_pm10": 24.8, "avg_aqi": 36.2, "avg_no2": 9.0, "avg_o3": 77.2}, {"date": "2025-06-30", "avg_pm25": 16.9, "avg_pm10": 33.3, "avg_aqi": 35.6, "avg_no2": 14.3, "avg_o3": 64.4}, {"date": "2025-07-01", "avg_pm25": 18.4, "avg_pm10": 34.1, "avg_aqi": 38.0, "avg_no2": 16.1, "avg_o3": 61.8}, {"date": "2025-07-02", "avg_pm25": 13.3, "avg_pm10": 20.1, "avg_aqi": 34.9, "avg_no2": 13.5, "avg_o3": 63.8}, {"date": "2025-07-03", "avg_pm25": 12.8, "avg_pm10": 17.1, "avg_aqi": 26.8, "avg_no2": 16.8, "avg_o3": 52.0}, {"date": "2025-07-04", "avg_pm25": 15.7, "avg_pm10": 23.9, "avg_aqi": 34.4, "avg_no2": 14.3, "avg_o3": 65.1}, {"date": "2025-07-05", "avg_pm25": 12.1, "avg_pm10": 17.8, "avg_aqi": 33.7, "avg_no2": 14.1, "avg_o3": 61.3}, {"date": "2025-07-06", "avg_pm25": 9.6, "avg_pm10": 16.4, "avg_aqi": 29.1, "avg_no2": 12.2, "avg_o3": 61.6}, {"date": "2025-07-07", "avg_pm25": 13.6, "avg_pm10": 27.4, "avg_aqi": 28.7, "avg_no2": 12.8, "avg_o3": 62.8}, {"date": "2025-07-08", "avg_pm25": 16.2, "avg_pm10": 31.8, "avg_aqi": 36.5, "avg_no2": 10.9, "avg_o3": 72.1}, {"date": "2025-07-09", "avg_pm25": 25.2, "avg_pm10": 51.6, "avg_aqi": 53.9, "avg_no2": 14.4, "avg_o3": 72.7}, {"date": "2025-07-10", "avg_pm25": 15.7, "avg_pm10": 30.0, "avg_aqi": 44.8, "avg_no2": 10.2, "avg_o3": 70.3}, {"date": "2025-07-11", "avg_pm25": 15.8, "avg_pm10": 28.1, "avg_aqi": 38.2, "avg_no2": 8.3, "avg_o3": 80.9}, {"date": "2025-07-12", "avg_pm25": 12.4, "avg_pm10": 19.0, "avg_aqi": 37.9, "avg_no2": 12.2, "avg_o3": 72.4}, {"date": "2025-07-13", "avg_pm25": 16.0, "avg_pm10": 25.5, "avg_aqi": 36.6, "avg_no2": 11.7, "avg_o3": 76.1}, {"date": "2025-07-14", "avg_pm25": 16.1, "avg_pm10": 27.9, "avg_aqi": 38.0, "avg_no2": 12.0, "avg_o3": 73.0}, {"date": "2025-07-15", "avg_pm25": 12.4, "avg_pm10": 17.7, "avg_aqi": 33.5, "avg_no2": 12.2, "avg_o3": 64.2}, {"date": "2025-07-16", "avg_pm25": 13.5, "avg_pm10": 19.0, "avg_aqi": 34.5, "avg_no2": 11.6, "avg_o3": 74.0}, {"date": "2025-07-17", "avg_pm25": 12.7, "avg_pm10": 16.7, "avg_aqi": 35.7, "avg_no2": 10.5, "avg_o3": 76.7}, {"date": "2025-07-18", "avg_pm25": 13.6, "avg_pm10": 16.7, "avg_aqi": 37.2, "avg_no2": 12.2, "avg_o3": 80.2}, {"date": "2025-07-19", "avg_pm25": 13.8, "avg_pm10": 16.5, "avg_aqi": 34.1, "avg_no2": 14.6, "avg_o3": 66.5}, {"date": "2025-07-20", "avg_pm25": 10.3, "avg_pm10": 13.9, "avg_aqi": 27.7, "avg_no2": 15.7, "avg_o3": 54.0}, {"date": "2025-07-21", "avg_pm25": 10.1, "avg_pm10": 12.7, "avg_aqi": 23.3, "avg_no2": 16.5, "avg_o3": 48.7}, {"date": "2025-07-22", "avg_pm25": 9.5, "avg_pm10": 12.6, "avg_aqi": 28.6, "avg_no2": 12.2, "avg_o3": 65.5}, {"date": "2025-07-23", "avg_pm25": 9.7, "avg_pm10": 10.8, "avg_aqi": 24.4, "avg_no2": 13.7, "avg_o3": 58.5}, {"date": "2025-07-24", "avg_pm25": 10.0, "avg_pm10": 11.2, "avg_aqi": 24.6, "avg_no2": 16.1, "avg_o3": 53.4}, {"date": "2025-07-25", "avg_pm25": 10.9, "avg_pm10": 14.1, "avg_aqi": 25.5, "avg_no2": 13.6, "avg_o3": 54.5}, {"date": "2025-07-26", "avg_pm25": 12.1, "avg_pm10": 19.8, "avg_aqi": 26.1, "avg_no2": 11.2, "avg_o3": 56.1}, {"date": "2025-07-27", "avg_pm25": 11.0, "avg_pm10": 16.3, "avg_aqi": 27.5, "avg_no2": 14.6, "avg_o3": 54.1}, {"date": "2025-07-28", "avg_pm25": 14.0, "avg_pm10": 23.1, "avg_aqi": 30.6, "avg_no2": 12.8, "avg_o3": 59.4}, {"date": "2025-07-29", "avg_pm25": 11.2, "avg_pm10": 20.6, "avg_aqi": 27.8, "avg_no2": 12.5, "avg_o3": 51.8}, {"date": "2025-07-30", "avg_pm25": 13.8, "avg_pm10": 24.4, "avg_aqi": 31.5, "avg_no2": 10.7, "avg_o3": 69.6}, {"date": "2025-07-31", "avg_pm25": 23.4, "avg_pm10": 46.9, "avg_aqi": 43.1, "avg_no2": 12.7, "avg_o3": 76.5}, {"date": "2025-08-01", "avg_pm25": 26.7, "avg_pm10": 48.4, "avg_aqi": 59.8, "avg_no2": 9.0, "avg_o3": 105.5}, {"date": "2025-08-02", "avg_pm25": 27.2, "avg_pm10": 52.3, "avg_aqi": 62.3, "avg_no2": 7.6, "avg_o3": 103.3}, {"date": "2025-08-03", "avg_pm25": 25.6, "avg_pm10": 39.3, "avg_aqi": 60.6, "avg_no2": 9.5, "avg_o3": 107.0}, {"date": "2025-08-04", "avg_pm25": 23.4, "avg_pm10": 31.9, "avg_aqi": 59.3, "avg_no2": 11.9, "avg_o3": 90.5}, {"date": "2025-08-05", "avg_pm25": 24.6, "avg_pm10": 31.0, "avg_aqi": 59.7, "avg_no2": 10.6, "avg_o3": 110.0}, {"date": "2025-08-06", "avg_pm25": 21.7, "avg_pm10": 25.1, "avg_aqi": 57.8, "avg_no2": 11.1, "avg_o3": 116.2}, {"date": "2025-08-07", "avg_pm25": 16.9, "avg_pm10": 18.7, "avg_aqi": 48.5, "avg_no2": 10.4, "avg_o3": 109.3}, {"date": "2025-08-08", "avg_pm25": 15.3, "avg_pm10": 16.0, "avg_aqi": 46.0, "avg_no2": 10.6, "avg_o3": 104.9}, {"date": "2025-08-09", "avg_pm25": 20.3, "avg_pm10": 21.1, "avg_aqi": 44.5, "avg_no2": 14.5, "avg_o3": 101.4}, {"date": "2025-08-10", "avg_pm25": 21.0, "avg_pm10": 23.4, "avg_aqi": 51.2, "avg_no2": 13.6, "avg_o3": 92.0}, {"date": "2025-08-11", "avg_pm25": 14.9, "avg_pm10": 19.2, "avg_aqi": 36.7, "avg_no2": 16.0, "avg_o3": 60.1}, {"date": "2025-08-12", "avg_pm25": 13.0, "avg_pm10": 17.3, "avg_aqi": 30.4, "avg_no2": 16.4, "avg_o3": 46.0}, {"date": "2025-08-13", "avg_pm25": 11.0, "avg_pm10": 13.0, "avg_aqi": 23.7, "avg_no2": 16.8, "avg_o3": 37.4}, {"date": "2025-08-14", "avg_pm25": 15.8, "avg_pm10": 17.5, "avg_aqi": 35.7, "avg_no2": 15.6, "avg_o3": 73.1}, {"date": "2025-08-15", "avg_pm25": 16.3, "avg_pm10": 18.7, "avg_aqi": 38.7, "avg_no2": 14.0, "avg_o3": 72.6}, {"date": "2025-08-16", "avg_pm25": 12.6, "avg_pm10": 16.7, "avg_aqi": 29.8, "avg_no2": 15.8, "avg_o3": 48.5}, {"date": "2025-08-17", "avg_pm25": 13.0, "avg_pm10": 15.9, "avg_aqi": 27.6, "avg_no2": 20.1, "avg_o3": 41.3}, {"date": "2025-08-18", "avg_pm25": 10.0, "avg_pm10": 11.3, "avg_aqi": 26.2, "avg_no2": 15.5, "avg_o3": 50.8}, {"date": "2025-08-19", "avg_pm25": 13.4, "avg_pm10": 17.2, "avg_aqi": 28.0, "avg_no2": 15.5, "avg_o3": 55.1}, {"date": "2025-08-20", "avg_pm25": 16.0, "avg_pm10": 20.6, "avg_aqi": 37.8, "avg_no2": 14.2, "avg_o3": 76.6}, {"date": "2025-08-21", "avg_pm25": 19.6, "avg_pm10": 28.0, "avg_aqi": 42.8, "avg_no2": 13.3, "avg_o3": 83.2}, {"date": "2025-08-22", "avg_pm25": 20.4, "avg_pm10": 27.1, "avg_aqi": 45.9, "avg_no2": 10.2, "avg_o3": 97.2}, {"date": "2025-08-23", "avg_pm25": 16.7, "avg_pm10": 24.1, "avg_aqi": 41.7, "avg_no2": 13.2, "avg_o3": 78.8}, {"date": "2025-08-24", "avg_pm25": 20.4, "avg_pm10": 26.2, "avg_aqi": 50.8, "avg_no2": 11.4, "avg_o3": 110.0}, {"date": "2025-08-25", "avg_pm25": 19.1, "avg_pm10": 23.1, "avg_aqi": 44.8, "avg_no2": 11.7, "avg_o3": 100.6}, {"date": "2025-08-26", "avg_pm25": 24.6, "avg_pm10": 28.5, "avg_aqi": 49.5, "avg_no2": 19.4, "avg_o3": 100.9}, {"date": "2025-08-27", "avg_pm25": 12.0, "avg_pm10": 13.2, "avg_aqi": 45.5, "avg_no2": 20.1, "avg_o3": 44.5}, {"date": "2025-08-28", "avg_pm25": 12.9, "avg_pm10": 14.4, "avg_aqi": 27.5, "avg_no2": 12.3, "avg_o3": 65.8}, {"date": "2025-08-29", "avg_pm25": 12.6, "avg_pm10": 14.5, "avg_aqi": 34.7, "avg_no2": 11.6, "avg_o3": 73.4}, {"date": "2025-08-30", "avg_pm25": 15.2, "avg_pm10": 18.6, "avg_aqi": 39.5, "avg_no2": 13.8, "avg_o3": 87.7}, {"date": "2025-08-31", "avg_pm25": 18.6, "avg_pm10": 26.2, "avg_aqi": 36.3, "avg_no2": 15.8, "avg_o3": 65.0}, {"date": "2025-09-01", "avg_pm25": 14.9, "avg_pm10": 21.8, "avg_aqi": 33.2, "avg_no2": 18.8, "avg_o3": 48.2}, {"date": "2025-09-02", "avg_pm25": 14.7, "avg_pm10": 23.4, "avg_aqi": 31.9, "avg_no2": 15.9, "avg_o3": 53.0}, {"date": "2025-09-03", "avg_pm25": 11.9, "avg_pm10": 16.7, "avg_aqi": 32.6, "avg_no2": 12.4, "avg_o3": 64.0}, {"date": "2025-09-04", "avg_pm25": 16.6, "avg_pm10": 22.1, "avg_aqi": 34.7, "avg_no2": 13.4, "avg_o3": 77.8}, {"date": "2025-09-05", "avg_pm25": 19.0, "avg_pm10": 27.0, "avg_aqi": 47.6, "avg_no2": 11.6, "avg_o3": 97.1}, {"date": "2025-09-06", "avg_pm25": 24.3, "avg_pm10": 34.1, "avg_aqi": 52.0, "avg_no2": 8.6, "avg_o3": 118.7}, {"date": "2025-09-07", "avg_pm25": 22.1, "avg_pm10": 28.4, "avg_aqi": 59.8, "avg_no2": 8.6, "avg_o3": 116.5}, {"date": "2025-09-08", "avg_pm25": 20.4, "avg_pm10": 25.9, "avg_aqi": 53.0, "avg_no2": 9.9, "avg_o3": 102.0}, {"date": "2025-09-09", "avg_pm25": 22.6, "avg_pm10": 26.8, "avg_aqi": 50.4, "avg_no2": 8.6, "avg_o3": 111.0}, {"date": "2025-09-10", "avg_pm25": 18.5, "avg_pm10": 20.8, "avg_aqi": 52.0, "avg_no2": 8.9, "avg_o3": 111.0}, {"date": "2025-09-11", "avg_pm25": 17.2, "avg_pm10": 18.3, "avg_aqi": 43.9, "avg_no2": 14.0, "avg_o3": 99.2}, {"date": "2025-09-12", "avg_pm25": 24.1, "avg_pm10": 26.2, "avg_aqi": 47.7, "avg_no2": 17.6, "avg_o3": 89.7}, {"date": "2025-09-13", "avg_pm25": 28.4, "avg_pm10": 32.2, "avg_aqi": 61.5, "avg_no2": 19.6, "avg_o3": 98.0}, {"date": "2025-09-14", "avg_pm25": 26.5, "avg_pm10": 33.3, "avg_aqi": 62.6, "avg_no2": 8.9, "avg_o3": 113.7}, {"date": "2025-09-15", "avg_pm25": 24.7, "avg_pm10": 30.2, "avg_aqi": 63.5, "avg_no2": 8.3, "avg_o3": 132.7}, {"date": "2025-09-16", "avg_pm25": 18.6, "avg_pm10": 22.2, "avg_aqi": 52.9, "avg_no2": 11.0, "avg_o3": 102.6}, {"date": "2025-09-17", "avg_pm25": 15.3, "avg_pm10": 17.5, "avg_aqi": 42.9, "avg_no2": 9.7, "avg_o3": 94.5}, {"date": "2025-09-18", "avg_pm25": 19.6, "avg_pm10": 20.4, "avg_aqi": 47.2, "avg_no2": 11.3, "avg_o3": 109.0}, {"date": "2025-09-19", "avg_pm25": 15.5, "avg_pm10": 16.8, "avg_aqi": 42.5, "avg_no2": 12.7, "avg_o3": 83.4}, {"date": "2025-09-20", "avg_pm25": 13.7, "avg_pm10": 17.4, "avg_aqi": 34.7, "avg_no2": 16.3, "avg_o3": 67.6}, {"date": "2025-09-21", "avg_pm25": 16.0, "avg_pm10": 21.0, "avg_aqi": 37.7, "avg_no2": 15.7, "avg_o3": 77.8}, {"date": "2025-09-22", "avg_pm25": 14.4, "avg_pm10": 17.9, "avg_aqi": 38.4, "avg_no2": 13.1, "avg_o3": 83.5}, {"date": "2025-09-23", "avg_pm25": 12.0, "avg_pm10": 14.1, "avg_aqi": 30.6, "avg_no2": 11.9, "avg_o3": 61.8}, {"date": "2025-09-24", "avg_pm25": 12.1, "avg_pm10": 14.6, "avg_aqi": 27.4, "avg_no2": 14.3, "avg_o3": 52.5}, {"date": "2025-09-25", "avg_pm25": 14.2, "avg_pm10": 16.7, "avg_aqi": 35.1, "avg_no2": 13.4, "avg_o3": 70.0}, {"date": "2025-09-26", "avg_pm25": 11.2, "avg_pm10": 12.6, "avg_aqi": 29.2, "avg_no2": 15.4, "avg_o3": 54.6}, {"date": "2025-09-27", "avg_pm25": 12.4, "avg_pm10": 13.7, "avg_aqi": 32.1, "avg_no2": 14.0, "avg_o3": 59.2}, {"date": "2025-09-28", "avg_pm25": 15.2, "avg_pm10": 17.9, "avg_aqi": 35.7, "avg_no2": 13.5, "avg_o3": 71.2}, {"date": "2025-09-29", "avg_pm25": 15.3, "avg_pm10": 19.9, "avg_aqi": 34.2, "avg_no2": 16.5, "avg_o3": 64.2}, {"date": "2025-09-30", "avg_pm25": 21.8, "avg_pm10": 33.4, "avg_aqi": 38.5, "avg_no2": 22.4, "avg_o3": 54.4}, {"date": "2025-10-01", "avg_pm25": 17.6, "avg_pm10": 22.8, "avg_aqi": 45.2, "avg_no2": 25.2, "avg_o3": 38.5}, {"date": "2025-10-02", "avg_pm25": 18.1, "avg_pm10": 21.8, "avg_aqi": 41.8, "avg_no2": 17.6, "avg_o3": 84.5}, {"date": "2025-10-03", "avg_pm25": 17.6, "avg_pm10": 21.8, "avg_aqi": 41.4, "avg_no2": 13.6, "avg_o3": 81.4}, {"date": "2025-10-04", "avg_pm25": 15.4, "avg_pm10": 17.5, "avg_aqi": 44.1, "avg_no2": 12.4, "avg_o3": 98.8}, {"date": "2025-10-05", "avg_pm25": 19.9, "avg_pm10": 22.8, "avg_aqi": 45.3, "avg_no2": 15.9, "avg_o3": 98.6}, {"date": "2025-10-06", "avg_pm25": 19.5, "avg_pm10": 21.3, "avg_aqi": 52.9, "avg_no2": 12.1, "avg_o3": 113.3}, {"date": "2025-10-07", "avg_pm25": 19.7, "avg_pm10": 22.9, "avg_aqi": 49.6, "avg_no2": 12.0, "avg_o3": 119.7}, {"date": "2025-10-08", "avg_pm25": 22.3, "avg_pm10": 25.6, "avg_aqi": 53.8, "avg_no2": 10.8, "avg_o3": 112.0}, {"date": "2025-10-09", "avg_pm25": 22.8, "avg_pm10": 25.4, "avg_aqi": 52.9, "avg_no2": 10.6, "avg_o3": 113.4}, {"date": "2025-10-10", "avg_pm25": 21.9, "avg_pm10": 26.0, "avg_aqi": 54.3, "avg_no2": 11.7, "avg_o3": 94.6}, {"date": "2025-10-11", "avg_pm25": 28.6, "avg_pm10": 31.5, "avg_aqi": 60.1, "avg_no2": 11.8, "avg_o3": 119.2}, {"date": "2025-10-12", "avg_pm25": 18.8, "avg_pm10": 20.2, "avg_aqi": 51.2, "avg_no2": 12.3, "avg_o3": 93.3}, {"date": "2025-10-13", "avg_pm25": 13.8, "avg_pm10": 14.8, "avg_aqi": 42.0, "avg_no2": 9.6, "avg_o3": 95.6}, {"date": "2025-10-14", "avg_pm25": 9.5, "avg_pm10": 12.1, "avg_aqi": 23.7, "avg_no2": 5.5, "avg_o3": 53.7}, {"date": "2025-10-15", "avg_pm25": 4.7, "avg_pm10": 6.1, "avg_aqi": 17.2, "avg_no2": 4.9, "avg_o3": 41.5}, {"date": "2025-10-16", "avg_pm25": 5.0, "avg_pm10": 6.7, "avg_aqi": 16.9, "avg_no2": 4.7, "avg_o3": 42.1}, {"date": "2025-10-17", "avg_pm25": 4.3, "avg_pm10": 5.6, "avg_aqi": 11.3, "avg_no2": 5.2, "avg_o3": 28.5}, {"date": "2025-10-18", "avg_pm25": 6.1, "avg_pm10": 7.8, "avg_aqi": 12.7, "avg_no2": 6.0, "avg_o3": 31.9}, {"date": "2025-10-19", "avg_pm25": 6.7, "avg_pm10": 8.2, "avg_aqi": 16.1, "avg_no2": 7.2, "avg_o3": 39.6}, {"date": "2025-10-20", "avg_pm25": 5.5, "avg_pm10": 7.4, "avg_aqi": 17.0, "avg_no2": 5.2, "avg_o3": 42.5}, {"date": "2025-10-21", "avg_pm25": 4.7, "avg_pm10": 6.7, "avg_aqi": 22.9, "avg_no2": 3.9, "avg_o3": 57.4}, {"date": "2025-10-22", "avg_pm25": 5.8, "avg_pm10": 8.0, "avg_aqi": 21.7, "avg_no2": 6.0, "avg_o3": 54.5}, {"date": "2025-10-23", "avg_pm25": 18.7, "avg_pm10": 19.9, "avg_aqi": 31.4, "avg_no2": 15.1, "avg_o3": 76.6}, {"date": "2025-10-24", "avg_pm25": 20.4, "avg_pm10": 20.6, "avg_aqi": 48.2, "avg_no2": 21.3, "avg_o3": 61.7}, {"date": "2025-10-25", "avg_pm25": 12.1, "avg_pm10": 12.8, "avg_aqi": 36.0, "avg_no2": 16.7, "avg_o3": 61.9}, {"date": "2025-10-26", "avg_pm25": 7.8, "avg_pm10": 9.7, "avg_aqi": 25.2, "avg_no2": 8.2, "avg_o3": 63.3}, {"date": "2025-10-27", "avg_pm25": 8.0, "avg_pm10": 8.7, "avg_aqi": 26.3, "avg_no2": 10.6, "avg_o3": 65.7}, {"date": "2025-10-28", "avg_pm25": 10.8, "avg_pm10": 11.0, "avg_aqi": 19.0, "avg_no2": 14.4, "avg_o3": 45.2}, {"date": "2025-10-29", "avg_pm25": 15.7, "avg_pm10": 17.6, "avg_aqi": 40.0, "avg_no2": 11.0, "avg_o3": 86.3}, {"date": "2025-10-30", "avg_pm25": 17.6, "avg_pm10": 20.4, "avg_aqi": 41.9, "avg_no2": 9.7, "avg_o3": 93.4}, {"date": "2025-10-31", "avg_pm25": 20.5, "avg_pm10": 24.5, "avg_aqi": 49.7, "avg_no2": 11.8, "avg_o3": 108.2}, {"date": "2025-11-01", "avg_pm25": 23.6, "avg_pm10": 27.6, "avg_aqi": 55.1, "avg_no2": 11.1, "avg_o3": 115.0}, {"date": "2025-11-02", "avg_pm25": 27.7, "avg_pm10": 30.3, "avg_aqi": 58.9, "avg_no2": 13.5, "avg_o3": 125.7}, {"date": "2025-11-03", "avg_pm25": 36.8, "avg_pm10": 38.5, "avg_aqi": 67.5, "avg_no2": 19.7, "avg_o3": 119.1}, {"date": "2025-11-04", "avg_pm25": 23.8, "avg_pm10": 24.5, "avg_aqi": 63.8, "avg_no2": 15.5, "avg_o3": 98.2}, {"date": "2025-11-05", "avg_pm25": 20.8, "avg_pm10": 21.0, "avg_aqi": 53.3, "avg_no2": 10.3, "avg_o3": 98.5}, {"date": "2025-11-06", "avg_pm25": 13.8, "avg_pm10": 14.1, "avg_aqi": 42.5, "avg_no2": 10.4, "avg_o3": 95.4}, {"date": "2025-11-07", "avg_pm25": 26.9, "avg_pm10": 27.9, "avg_aqi": 47.2, "avg_no2": 13.4, "avg_o3": 101.5}, {"date": "2025-11-08", "avg_pm25": 37.3, "avg_pm10": 39.5, "avg_aqi": 66.5, "avg_no2": 9.5, "avg_o3": 117.8}, {"date": "2025-11-09", "avg_pm25": 45.6, "avg_pm10": 48.9, "avg_aqi": 74.4, "avg_no2": 5.6, "avg_o3": 127.8}, {"date": "2025-11-10", "avg_pm25": 42.1, "avg_pm10": 45.3, "avg_aqi": 72.2, "avg_no2": 5.6, "avg_o3": 132.0}, {"date": "2025-11-11", "avg_pm25": 44.8, "avg_pm10": 49.4, "avg_aqi": 76.1, "avg_no2": 4.7, "avg_o3": 119.7}, {"date": "2025-11-12", "avg_pm25": 39.8, "avg_pm10": 45.0, "avg_aqi": 75.3, "avg_no2": 4.8, "avg_o3": 117.4}, {"date": "2025-11-13", "avg_pm25": 40.3, "avg_pm10": 45.4, "avg_aqi": 71.0, "avg_no2": 4.9, "avg_o3": 126.5}, {"date": "2025-11-14", "avg_pm25": 38.9, "avg_pm10": 47.1, "avg_aqi": 71.3, "avg_no2": 3.8, "avg_o3": 127.8}, {"date": "2025-11-15", "avg_pm25": 44.4, "avg_pm10": 53.5, "avg_aqi": 72.9, "avg_no2": 4.4, "avg_o3": 117.9}, {"date": "2025-11-16", "avg_pm25": 42.5, "avg_pm10": 50.3, "avg_aqi": 75.4, "avg_no2": 3.1, "avg_o3": 124.8}, {"date": "2025-11-17", "avg_pm25": 28.6, "avg_pm10": 33.1, "avg_aqi": 70.7, "avg_no2": 4.1, "avg_o3": 117.8}, {"date": "2025-11-18", "avg_pm25": 12.4, "avg_pm10": 15.9, "avg_aqi": 41.0, "avg_no2": 4.1, "avg_o3": 89.5}, {"date": "2025-11-19", "avg_pm25": 22.3, "avg_pm10": 26.6, "avg_aqi": 48.6, "avg_no2": 3.6, "avg_o3": 111.5}, {"date": "2025-11-20", "avg_pm25": 15.5, "avg_pm10": 19.4, "avg_aqi": 45.6, "avg_no2": 3.8, "avg_o3": 102.7}, {"date": "2025-11-21", "avg_pm25": 5.5, "avg_pm10": 8.0, "avg_aqi": 26.5, "avg_no2": 3.8, "avg_o3": 65.8}, {"date": "2025-11-22", "avg_pm25": 7.0, "avg_pm10": 10.2, "avg_aqi": 28.7, "avg_no2": 3.8, "avg_o3": 71.5}, {"date": "2025-11-23", "avg_pm25": 7.9, "avg_pm10": 11.4, "avg_aqi": 29.0, "avg_no2": 3.8, "avg_o3": 72.6}, {"date": "2025-11-24", "avg_pm25": 24.0, "avg_pm10": 29.7, "avg_aqi": 40.6, "avg_no2": 4.4, "avg_o3": 97.4}, {"date": "2025-11-25", "avg_pm25": 36.1, "avg_pm10": 42.5, "avg_aqi": 65.9, "avg_no2": 3.2, "avg_o3": 123.8}, {"date": "2025-11-26", "avg_pm25": 42.5, "avg_pm10": 49.9, "avg_aqi": 71.5, "avg_no2": 3.4, "avg_o3": 119.3}, {"date": "2025-11-27", "avg_pm25": 43.9, "avg_pm10": 49.8, "avg_aqi": 74.5, "avg_no2": 2.8, "avg_o3": 133.1}, {"date": "2025-11-28", "avg_pm25": 30.2, "avg_pm10": 35.4, "avg_aqi": 70.8, "avg_no2": 2.9, "avg_o3": 123.0}, {"date": "2025-11-29", "avg_pm25": 8.6, "avg_pm10": 12.5, "avg_aqi": 46.3, "avg_no2": 2.8, "avg_o3": 92.8}, {"date": "2025-11-30", "avg_pm25": 6.8, "avg_pm10": 9.5, "avg_aqi": 36.8, "avg_no2": 2.6, "avg_o3": 91.7}, {"date": "2025-12-01", "avg_pm25": 8.1, "avg_pm10": 10.0, "avg_aqi": 37.6, "avg_no2": 2.9, "avg_o3": 94.0}, {"date": "2025-12-02", "avg_pm25": 9.2, "avg_pm10": 12.1, "avg_aqi": 37.4, "avg_no2": 3.1, "avg_o3": 93.4}, {"date": "2025-12-03", "avg_pm25": 10.9, "avg_pm10": 13.0, "avg_aqi": 35.0, "avg_no2": 6.2, "avg_o3": 87.4}, {"date": "2025-12-04", "avg_pm25": 10.8, "avg_pm10": 13.5, "avg_aqi": 29.0, "avg_no2": 5.0, "avg_o3": 72.1}, {"date": "2025-12-05", "avg_pm25": 44.3, "avg_pm10": 49.2, "avg_aqi": 57.6, "avg_no2": 3.0, "avg_o3": 120.1}, {"date": "2025-12-06", "avg_pm25": 45.9, "avg_pm10": 50.6, "avg_aqi": 79.4, "avg_no2": 3.4, "avg_o3": 113.8}, {"date": "2025-12-07", "avg_pm25": 40.2, "avg_pm10": 45.3, "avg_aqi": 73.7, "avg_no2": 3.5, "avg_o3": 116.2}, {"date": "2025-12-08", "avg_pm25": 34.4, "avg_pm10": 39.6, "avg_aqi": 68.4, "avg_no2": 3.2, "avg_o3": 124.7}, {"date": "2025-12-09", "avg_pm25": 36.8, "avg_pm10": 42.4, "avg_aqi": 69.0, "avg_no2": 3.1, "avg_o3": 136.9}, {"date": "2025-12-10", "avg_pm25": 54.4, "avg_pm10": 61.8, "avg_aqi": 74.8, "avg_no2": 3.4, "avg_o3": 136.6}, {"date": "2025-12-11", "avg_pm25": 59.4, "avg_pm10": 66.4, "avg_aqi": 89.0, "avg_no2": 3.4, "avg_o3": 141.2}, {"date": "2025-12-12", "avg_pm25": 41.8, "avg_pm10": 48.1, "avg_aqi": 79.5, "avg_no2": 3.9, "avg_o3": 136.5}, {"date": "2025-12-13", "avg_pm25": 30.2, "avg_pm10": 36.5, "avg_aqi": 69.0, "avg_no2": 4.6, "avg_o3": 123.6}, {"date": "2025-12-14", "avg_pm25": 34.0, "avg_pm10": 40.2, "avg_aqi": 64.2, "avg_no2": 4.8, "avg_o3": 123.7}, {"date": "2025-12-15", "avg_pm25": 47.3, "avg_pm10": 54.5, "avg_aqi": 72.0, "avg_no2": 4.2, "avg_o3": 127.4}, {"date": "2025-12-16", "avg_pm25": 19.1, "avg_pm10": 24.4, "avg_aqi": 70.4, "avg_no2": 3.2, "avg_o3": 89.4}, {"date": "2025-12-17", "avg_pm25": 18.8, "avg_pm10": 23.6, "avg_aqi": 41.7, "avg_no2": 2.9, "avg_o3": 97.9}, {"date": "2025-12-18", "avg_pm25": 48.1, "avg_pm10": 54.2, "avg_aqi": 67.5, "avg_no2": 4.3, "avg_o3": 126.8}, {"date": "2025-12-19", "avg_pm25": 56.7, "avg_pm10": 61.8, "avg_aqi": 83.0, "avg_no2": 6.5, "avg_o3": 124.7}, {"date": "2025-12-20", "avg_pm25": 73.5, "avg_pm10": 80.6, "avg_aqi": 90.5, "avg_no2": 8.4, "avg_o3": 117.5}, {"date": "2025-12-21", "avg_pm25": 53.0, "avg_pm10": 61.4, "avg_aqi": 96.6, "avg_no2": 6.1, "avg_o3": 110.4}, {"date": "2025-12-22", "avg_pm25": 27.0, "avg_pm10": 33.3, "avg_aqi": 67.1, "avg_no2": 5.5, "avg_o3": 89.5}, {"date": "2025-12-23", "avg_pm25": 38.1, "avg_pm10": 42.6, "avg_aqi": 65.9, "avg_no2": 5.0, "avg_o3": 106.0}, {"date": "2025-12-24", "avg_pm25": 34.8, "avg_pm10": 39.5, "avg_aqi": 71.2, "avg_no2": 5.4, "avg_o3": 99.9}, {"date": "2025-12-25", "avg_pm25": 31.4, "avg_pm10": 36.1, "avg_aqi": 66.2, "avg_no2": 4.9, "avg_o3": 103.6}, {"date": "2025-12-26", "avg_pm25": 37.1, "avg_pm10": 41.9, "avg_aqi": 66.0, "avg_no2": 4.3, "avg_o3": 115.8}, {"date": "2025-12-27", "avg_pm25": 33.0, "avg_pm10": 37.4, "avg_aqi": 69.4, "avg_no2": 4.7, "avg_o3": 111.5}, {"date": "2025-12-28", "avg_pm25": 42.6, "avg_pm10": 46.0, "avg_aqi": 68.0, "avg_no2": 5.1, "avg_o3": 113.0}, {"date": "2025-12-29", "avg_pm25": 50.5, "avg_pm10": 54.3, "avg_aqi": 79.0, "avg_no2": 4.6, "avg_o3": 116.4}, {"date": "2025-12-30", "avg_pm25": 54.5, "avg_pm10": 58.2, "avg_aqi": 80.5, "avg_no2": 5.2, "avg_o3": 109.8}, {"date": "2025-12-31", "avg_pm25": 36.4, "avg_pm10": 39.8, "avg_aqi": 78.6, "avg_no2": 4.9, "avg_o3": 101.0}, {"date": "2026-01-01", "avg_pm25": 41.0, "avg_pm10": 45.7, "avg_aqi": 68.2, "avg_no2": 6.3, "avg_o3": 105.0}, {"date": "2026-01-02", "avg_pm25": 51.1, "avg_pm10": 55.5, "avg_aqi": 77.7, "avg_no2": 4.9, "avg_o3": 123.1}, {"date": "2026-01-03", "avg_pm25": 41.2, "avg_pm10": 46.2, "avg_aqi": 79.0, "avg_no2": 4.3, "avg_o3": 135.8}, {"date": "2026-01-04", "avg_pm25": 34.6, "avg_pm10": 40.0, "avg_aqi": 69.0, "avg_no2": 4.8, "avg_o3": 115.0}, {"date": "2026-01-05", "avg_pm25": 43.7, "avg_pm10": 49.1, "avg_aqi": 69.3, "avg_no2": 3.9, "avg_o3": 111.9}, {"date": "2026-01-06", "avg_pm25": 49.5, "avg_pm10": 53.6, "avg_aqi": 79.2, "avg_no2": 3.3, "avg_o3": 119.6}, {"date": "2026-01-07", "avg_pm25": 51.1, "avg_pm10": 59.0, "avg_aqi": 81.2, "avg_no2": 3.1, "avg_o3": 120.2}, {"date": "2026-01-08", "avg_pm25": 29.1, "avg_pm10": 35.1, "avg_aqi": 72.3, "avg_no2": 2.8, "avg_o3": 112.0}, {"date": "2026-01-09", "avg_pm25": 24.9, "avg_pm10": 31.4, "avg_aqi": 60.5, "avg_no2": 2.9, "avg_o3": 117.4}, {"date": "2026-01-10", "avg_pm25": 24.0, "avg_pm10": 28.7, "avg_aqi": 59.7, "avg_no2": 2.8, "avg_o3": 130.7}, {"date": "2026-01-11", "avg_pm25": 18.3, "avg_pm10": 22.7, "avg_aqi": 52.6, "avg_no2": 3.6, "avg_o3": 118.2}, {"date": "2026-01-12", "avg_pm25": 25.5, "avg_pm10": 31.3, "avg_aqi": 56.8, "avg_no2": 3.6, "avg_o3": 117.8}, {"date": "2026-01-13", "avg_pm25": 24.8, "avg_pm10": 29.9, "avg_aqi": 61.1, "avg_no2": 4.3, "avg_o3": 118.4}, {"date": "2026-01-14", "avg_pm25": 26.1, "avg_pm10": 30.4, "avg_aqi": 55.5, "avg_no2": 7.5, "avg_o3": 110.5}, {"date": "2026-01-15", "avg_pm25": 37.9, "avg_pm10": 41.0, "avg_aqi": 66.3, "avg_no2": 10.0, "avg_o3": 113.5}, {"date": "2026-01-16", "avg_pm25": 41.8, "avg_pm10": 44.9, "avg_aqi": 71.0, "avg_no2": 8.0, "avg_o3": 116.8}, {"date": "2026-01-17", "avg_pm25": 54.1, "avg_pm10": 57.6, "avg_aqi": 79.9, "avg_no2": 8.0, "avg_o3": 117.4}, {"date": "2026-01-18", "avg_pm25": 47.7, "avg_pm10": 50.8, "avg_aqi": 81.5, "avg_no2": 10.2, "avg_o3": 115.8}, {"date": "2026-01-19", "avg_pm25": 41.2, "avg_pm10": 44.4, "avg_aqi": 74.3, "avg_no2": 10.6, "avg_o3": 118.5}, {"date": "2026-01-20", "avg_pm25": 45.2, "avg_pm10": 48.5, "avg_aqi": 74.0, "avg_no2": 8.4, "avg_o3": 123.4}, {"date": "2026-01-21", "avg_pm25": 26.7, "avg_pm10": 32.1, "avg_aqi": 71.0, "avg_no2": 5.3, "avg_o3": 98.8}, {"date": "2026-01-22", "avg_pm25": 27.7, "avg_pm10": 33.1, "avg_aqi": 54.8, "avg_no2": 5.0, "avg_o3": 101.8}, {"date": "2026-01-23", "avg_pm25": 38.6, "avg_pm10": 43.8, "avg_aqi": 66.3, "avg_no2": 4.2, "avg_o3": 124.4}, {"date": "2026-01-24", "avg_pm25": 34.6, "avg_pm10": 39.5, "avg_aqi": 71.6, "avg_no2": 3.7, "avg_o3": 109.9}, {"date": "2026-01-25", "avg_pm25": 26.1, "avg_pm10": 30.7, "avg_aqi": 62.8, "avg_no2": 6.4, "avg_o3": 99.2}, {"date": "2026-01-26", "avg_pm25": 19.6, "avg_pm10": 24.6, "avg_aqi": 52.4, "avg_no2": 5.0, "avg_o3": 95.9}, {"date": "2026-01-27", "avg_pm25": 47.8, "avg_pm10": 54.9, "avg_aqi": 63.7, "avg_no2": 5.9, "avg_o3": 118.4}, {"date": "2026-01-28", "avg_pm25": 51.5, "avg_pm10": 57.2, "avg_aqi": 82.7, "avg_no2": 7.2, "avg_o3": 115.9}, {"date": "2026-01-29", "avg_pm25": 51.8, "avg_pm10": 59.0, "avg_aqi": 79.4, "avg_no2": 5.8, "avg_o3": 110.8}, {"date": "2026-01-30", "avg_pm25": 33.6, "avg_pm10": 42.0, "avg_aqi": 76.5, "avg_no2": 4.9, "avg_o3": 99.3}, {"date": "2026-01-31", "avg_pm25": 16.0, "avg_pm10": 22.2, "avg_aqi": 48.5, "avg_no2": 4.7, "avg_o3": 87.3}, {"date": "2026-02-01", "avg_pm25": 42.0, "avg_pm10": 47.8, "avg_aqi": 60.6, "avg_no2": 4.2, "avg_o3": 112.4}, {"date": "2026-02-02", "avg_pm25": 56.1, "avg_pm10": 61.4, "avg_aqi": 79.3, "avg_no2": 4.7, "avg_o3": 126.8}, {"date": "2026-02-03", "avg_pm25": 25.9, "avg_pm10": 31.2, "avg_aqi": 76.8, "avg_no2": 4.8, "avg_o3": 104.5}, {"date": "2026-02-04", "avg_pm25": 15.5, "avg_pm10": 19.5, "avg_aqi": 39.9, "avg_no2": 4.3, "avg_o3": 91.0}, {"date": "2026-02-05", "avg_pm25": 15.4, "avg_pm10": 19.1, "avg_aqi": 35.5, "avg_no2": 4.6, "avg_o3": 88.7}, {"date": "2026-02-06", "avg_pm25": 23.0, "avg_pm10": 27.3, "avg_aqi": 40.7, "avg_no2": 5.3, "avg_o3": 92.9}, {"date": "2026-02-07", "avg_pm25": 34.3, "avg_pm10": 38.6, "avg_aqi": 62.1, "avg_no2": 6.9, "avg_o3": 89.9}, {"date": "2026-02-08", "avg_pm25": 44.6, "avg_pm10": 47.6, "avg_aqi": 72.9, "avg_no2": 10.7, "avg_o3": 101.6}, {"date": "2026-02-09", "avg_pm25": 37.0, "avg_pm10": 39.9, "avg_aqi": 72.2, "avg_no2": 6.9, "avg_o3": 118.2}, {"date": "2026-02-10", "avg_pm25": 30.2, "avg_pm10": 37.1, "avg_aqi": 67.6, "avg_no2": 5.8, "avg_o3": 127.0}, {"date": "2026-02-11", "avg_pm25": 29.7, "avg_pm10": 39.7, "avg_aqi": 64.0, "avg_no2": 5.4, "avg_o3": 113.8}, {"date": "2026-02-12", "avg_pm25": 24.1, "avg_pm10": 29.8, "avg_aqi": 61.1, "avg_no2": 4.5, "avg_o3": 107.1}, {"date": "2026-02-13", "avg_pm25": 23.8, "avg_pm10": 28.4, "avg_aqi": 53.3, "avg_no2": 4.1, "avg_o3": 99.5}, {"date": "2026-02-14", "avg_pm25": 34.2, "avg_pm10": 39.7, "avg_aqi": 61.4, "avg_no2": 6.4, "avg_o3": 118.0}, {"date": "2026-02-15", "avg_pm25": 52.1, "avg_pm10": 56.8, "avg_aqi": 75.6, "avg_no2": 8.8, "avg_o3": 124.0}, {"date": "2026-02-16", "avg_pm25": 54.5, "avg_pm10": 59.1, "avg_aqi": 83.1, "avg_no2": 8.2, "avg_o3": 128.0}, {"date": "2026-02-17", "avg_pm25": 36.5, "avg_pm10": 40.4, "avg_aqi": 77.2, "avg_no2": 6.1, "avg_o3": 122.8}, {"date": "2026-02-18", "avg_pm25": 32.3, "avg_pm10": 38.3, "avg_aqi": 66.6, "avg_no2": 6.2, "avg_o3": 115.0}, {"date": "2026-02-19", "avg_pm25": 24.3, "avg_pm10": 30.4, "avg_aqi": 63.7, "avg_no2": 5.1, "avg_o3": 112.8}, {"date": "2026-02-20", "avg_pm25": 29.5, "avg_pm10": 35.2, "avg_aqi": 56.6, "avg_no2": 3.9, "avg_o3": 111.1}, {"date": "2026-02-21", "avg_pm25": 24.5, "avg_pm10": 29.2, "avg_aqi": 63.1, "avg_no2": 3.7, "avg_o3": 103.5}, {"date": "2026-02-22", "avg_pm25": 14.5, "avg_pm10": 17.9, "avg_aqi": 41.6, "avg_no2": 3.8, "avg_o3": 69.3}, {"date": "2026-02-23", "avg_pm25": 7.4, "avg_pm10": 9.8, "avg_aqi": 23.8, "avg_no2": 4.9, "avg_o3": 55.7}, {"date": "2026-02-24", "avg_pm25": 11.0, "avg_pm10": 14.0, "avg_aqi": 26.3, "avg_no2": 4.5, "avg_o3": 65.8}, {"date": "2026-02-25", "avg_pm25": 17.0, "avg_pm10": 20.0, "avg_aqi": 28.9, "avg_no2": 6.8, "avg_o3": 68.7}, {"date": "2026-02-26", "avg_pm25": 31.6, "avg_pm10": 33.9, "avg_aqi": 53.2, "avg_no2": 12.3, "avg_o3": 90.4}, {"date": "2026-02-27", "avg_pm25": 39.2, "avg_pm10": 42.1, "avg_aqi": 68.9, "avg_no2": 9.6, "avg_o3": 98.9}, {"date": "2026-02-28", "avg_pm25": 53.6, "avg_pm10": 57.7, "avg_aqi": 75.5, "avg_no2": 8.2, "avg_o3": 98.2}, {"date": "2026-03-01", "avg_pm25": 50.3, "avg_pm10": 54.5, "avg_aqi": 83.2, "avg_no2": 7.8, "avg_o3": 98.8}, {"date": "2026-03-02", "avg_pm25": 45.1, "avg_pm10": 49.5, "avg_aqi": 78.6, "avg_no2": 9.7, "avg_o3": 105.5}, {"date": "2026-03-03", "avg_pm25": 41.6, "avg_pm10": 46.4, "avg_aqi": 74.0, "avg_no2": 11.6, "avg_o3": 110.0}, {"date": "2026-03-04", "avg_pm25": 36.2, "avg_pm10": 40.8, "avg_aqi": 71.8, "avg_no2": 11.7, "avg_o3": 89.6}, {"date": "2026-03-05", "avg_pm25": 30.6, "avg_pm10": 34.5, "avg_aqi": 67.5, "avg_no2": 11.9, "avg_o3": 81.7}, {"date": "2026-03-06", "avg_pm25": 26.9, "avg_pm10": 30.7, "avg_aqi": 60.1, "avg_no2": 9.8, "avg_o3": 89.1}, {"date": "2026-03-07", "avg_pm25": 29.7, "avg_pm10": 37.0, "avg_aqi": 64.7, "avg_no2": 6.6, "avg_o3": 84.3}, {"date": "2026-03-08", "avg_pm25": 23.2, "avg_pm10": 33.1, "avg_aqi": 59.4, "avg_no2": 5.8, "avg_o3": 72.0}, {"date": "2026-03-09", "avg_pm25": 33.1, "avg_pm10": 45.5, "avg_aqi": 59.8, "avg_no2": 6.6, "avg_o3": 84.5}, {"date": "2026-03-10", "avg_pm25": 23.9, "avg_pm10": 30.9, "avg_aqi": 64.9, "avg_no2": 7.1, "avg_o3": 70.7}, {"date": "2026-03-11", "avg_pm25": 20.7, "avg_pm10": 25.4, "avg_aqi": 44.1, "avg_no2": 8.1, "avg_o3": 69.2}, {"date": "2026-03-12", "avg_pm25": 24.4, "avg_pm10": 28.7, "avg_aqi": 52.5, "avg_no2": 8.7, "avg_o3": 70.8}, {"date": "2026-03-13", "avg_pm25": 16.8, "avg_pm10": 21.2, "avg_aqi": 43.4, "avg_no2": 7.6, "avg_o3": 62.9}, {"date": "2026-03-14", "avg_pm25": 12.7, "avg_pm10": 16.2, "avg_aqi": 30.9, "avg_no2": 6.5, "avg_o3": 64.9}, {"date": "2026-03-15", "avg_pm25": 10.0, "avg_pm10": 13.1, "avg_aqi": 26.4, "avg_no2": 6.3, "avg_o3": 63.5}, {"date": "2026-03-16", "avg_pm25": 8.5, "avg_pm10": 11.3, "avg_aqi": 27.3, "avg_no2": 6.1, "avg_o3": 67.8}, {"date": "2026-03-17", "avg_pm25": 8.5, "avg_pm10": 11.7, "avg_aqi": 27.4, "avg_no2": 5.3, "avg_o3": 68.3}, {"date": "2026-03-18", "avg_pm25": 8.5, "avg_pm10": 11.8, "avg_aqi": 22.1, "avg_no2": 6.3, "avg_o3": 55.5}, {"date": "2026-03-19", "avg_pm25": 8.2, "avg_pm10": 10.6, "avg_aqi": 29.5, "avg_no2": 7.2, "avg_o3": 73.6}]}
data/dataset_meta.json ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "built_at": "2026-03-21T19:41:52.965783",
3
+ "location": "Chennai, India (13.08N, 80.27E)",
4
+ "data_sources": [
5
+ "Open-Meteo Archive",
6
+ "USGS Earthquake API",
7
+ "Open-Meteo AQI"
8
+ ],
9
+ "weather": {
10
+ "period": "2021-03-15 to 2026-03-14",
11
+ "total_days": 1826,
12
+ "avg_temp_max_c": 31.9,
13
+ "max_temp_ever_c": 41.0,
14
+ "min_temp_ever_c": 24.0,
15
+ "avg_daily_precip_mm": 4.44,
16
+ "max_single_day_rain": 255.8,
17
+ "avg_wind_kmh": 18.1,
18
+ "max_wind_kmh": 53.1,
19
+ "monthly_total_precip_mm": {
20
+ "1": 230.4,
21
+ "2": 19.2,
22
+ "3": 71.4,
23
+ "4": 73.8,
24
+ "5": 520.2,
25
+ "6": 343.6,
26
+ "7": 620.1,
27
+ "8": 866.0,
28
+ "9": 745.7,
29
+ "10": 1257.4,
30
+ "11": 2133.6,
31
+ "12": 1231.7
32
+ },
33
+ "yearly_summary": {
34
+ "2021": {
35
+ "avg_temp_max": 32.0,
36
+ "total_precip_mm": 1626.3
37
+ },
38
+ "2022": {
39
+ "avg_temp_max": 31.3,
40
+ "total_precip_mm": 1441.4
41
+ },
42
+ "2023": {
43
+ "avg_temp_max": 32.0,
44
+ "total_precip_mm": 1625.2
45
+ },
46
+ "2024": {
47
+ "avg_temp_max": 32.2,
48
+ "total_precip_mm": 1610.5
49
+ },
50
+ "2025": {
51
+ "avg_temp_max": 32.4,
52
+ "total_precip_mm": 1699.8
53
+ },
54
+ "2026": {
55
+ "avg_temp_max": 29.2,
56
+ "total_precip_mm": 109.9
57
+ }
58
+ },
59
+ "peak_monsoon_months": "June-November (Northeast monsoon dominant Oct-Dec)",
60
+ "heatwave_season": "March-June (temps frequently exceed 38C)",
61
+ "cyclone_peak_season": "October-December (Bay of Bengal cyclogenesis)"
62
+ },
63
+ "earthquakes": {
64
+ "total_events_5yr": 23,
65
+ "avg_magnitude": 4.58,
66
+ "max_magnitude": 5.1,
67
+ "region": "Bay of Bengal / South India (~1000km radius from Chennai)",
68
+ "risk_note": "Chennai on stable Deccan shield. Major risk from Bay of Bengal subduction zone."
69
+ },
70
+ "aqi": {
71
+ "total_days": 0,
72
+ "avg_aqi": null,
73
+ "max_aqi": null,
74
+ "context": "Typically moderate (50-100). Winter spikes (Nov-Jan) from crop burning and low wind."
75
+ },
76
+ "notable_events": [
77
+ {
78
+ "event": "Cyclone Michaung",
79
+ "date": "December 2023",
80
+ "impact": "Category 1 landfall, severe Chennai flooding, 2500mm rain in 48hr"
81
+ },
82
+ {
83
+ "event": "2015 Chennai Floods",
84
+ "date": "November-December 2015",
85
+ "impact": "Worst flooding in 100 years, 500+ deaths, $3B damage"
86
+ },
87
+ {
88
+ "event": "2004 Indian Ocean Tsunami",
89
+ "date": "December 26 2004",
90
+ "impact": "Mag 9.1 Sumatra earthquake, Chennai coastline devastated"
91
+ },
92
+ {
93
+ "event": "Cyclone Vardah",
94
+ "date": "December 2016",
95
+ "impact": "Direct hit Chennai, 100+ km/h winds, widespread damage"
96
+ },
97
+ {
98
+ "event": "Cyclone Nivar",
99
+ "date": "November 2020",
100
+ "impact": "Very severe cyclone, landfall near Puducherry, heavy Chennai rain"
101
+ }
102
+ ],
103
+ "climate_patterns": {
104
+ "type": "Tropical wet and dry (Koppen Aw)",
105
+ "annual_rainfall_mm": "~1400mm avg, 60% from Northeast monsoon Oct-Dec",
106
+ "sea_surface_temp": "Bay of Bengal 28-30C peak Jun-Oct (cyclone fuel)",
107
+ "urban_heat_island": "UHI adds +1.5 to 2.5C vs rural",
108
+ "warming_trend": "Max temps rising ~0.3C per decade since 1980",
109
+ "flood_risk_zones": "Adyar, Cooum, Buckingham Canal flood plains highest risk"
110
+ }
111
+ }
data/earthquake_history.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"region": "Bay of Bengal / South India", "period_start": "2021-03-22", "period_end": "2026-03-21", "total_events": 23, "events": [{"id": "us7000s0pc", "time": "2026-02-27T07:52:25Z", "magnitude": 5, "place": "23 km SSE of S\u0101tkhira, Bangladesh", "longitude": 89.1853, "latitude": 22.5236, "depth_km": 10}, {"id": "us6000pv8n", "time": "2025-02-25T00:40:20Z", "magnitude": 5.1, "place": "224 km ESE of Par\u0101d\u012bp Garh, India", "longitude": 88.4613, "latitude": 19.2977, "depth_km": 10}, {"id": "us7000nvs3", "time": "2024-12-04T01:56:58Z", "magnitude": 5, "place": "49 km NE of Mulugu, India", "longitude": 80.3296, "latitude": 18.4471, "depth_km": 10}, {"id": "us7000nvp4", "time": "2024-11-17T18:39:54Z", "magnitude": 4.5, "place": "North Indian Ocean", "longitude": 88.6924, "latitude": 3.2614, "depth_km": 10}, {"id": "us7000ns0n", "time": "2024-10-29T03:52:27Z", "magnitude": 4.3, "place": "Bay of Bengal", "longitude": 88.4428, "latitude": 11.1211, "depth_km": 10}, {"id": "us7000nmel", "time": "2024-09-30T08:06:58Z", "magnitude": 4.4, "place": "22 km NNW of Anjangaon, India", "longitude": 77.2016, "latitude": 21.343, "depth_km": 10}, {"id": "us7000nguk", "time": "2024-09-23T19:03:59Z", "magnitude": 4.2, "place": "173 km SSE of Gos\u0101ba, India", "longitude": 89.4934, "latitude": 20.7407, "depth_km": 10}, {"id": "us7000my69", "time": "2024-07-10T01:44:52Z", "magnitude": 4.4, "place": "18 km NE of Basmat, India", "longitude": 77.2915, "latitude": 19.4402, "depth_km": 10}, {"id": "us7000mq2i", "time": "2024-05-27T15:26:45Z", "magnitude": 4.6, "place": "293 km W of Kulhudhuffushi, Maldives", "longitude": 70.4316, "latitude": 6.3587, "depth_km": 10}, {"id": "us7000mcym", "time": "2024-04-10T18:45:49Z", "magnitude": 4.6, "place": "66 km SSE of Kavaratti, India", "longitude": 72.9404, "latitude": 10.0467, "depth_km": 10}, {"id": "us6000mk51", "time": "2024-03-21T00:38:31Z", "magnitude": 4.6, "place": "20 km NNE of Basmat, India", "longitude": 77.2545, "latitude": 19.4899, "depth_km": 10}, {"id": "us7000l76c", "time": "2023-10-28T11:09:16Z", "magnitude": 4.7, "place": "Bay of Bengal", "longitude": 88.2129, "latitude": 6.5874, "depth_km": 10.014}, {"id": "us6000lbpm", "time": "2023-09-25T04:07:55Z", "magnitude": 4.4, "place": "Bay of Bengal", "longitude": 88.5466, "latitude": 7.6226, "depth_km": 10}, {"id": "us6000j86n", "time": "2022-12-06T19:54:42Z", "magnitude": 4.5, "place": "North Indian Ocean", "longitude": 89.8244, "latitude": 5.5405, "depth_km": 10}, {"id": "us6000j6yh", "time": "2022-12-05T03:02:58Z", "magnitude": 4.9, "place": "Bay of Bengal", "longitude": 89.8755, "latitude": 19.1042, "depth_km": 45.293}, {"id": "us6000i21t", "time": "2022-07-13T07:48:10Z", "magnitude": 4.8, "place": "Bay of Bengal", "longitude": 85.9923, "latitude": 7.0288, "depth_km": 10}, {"id": "us6000i13p", "time": "2022-07-09T00:52:02Z", "magnitude": 4.5, "place": "Karnataka, India", "longitude": 75.7188, "latitude": 16.9254, "depth_km": 10}, {"id": "us7000gfxf", "time": "2022-01-22T08:46:23Z", "magnitude": 4.2, "place": "132 km SE of Narasannapeta, India", "longitude": 84.9267, "latitude": 17.562, "depth_km": 10}, {"id": "us6000fuwm", "time": "2021-10-11T16:24:38Z", "magnitude": 4.3, "place": "7 km ENE of Sh?h?b?d, India", "longitude": 77.0051, "latitude": 17.1543, "depth_km": 10}, {"id": "us7000ff7l", "time": "2021-09-23T19:48:30Z", "magnitude": 4.5, "place": "Laccadive Sea", "longitude": 78.943, "latitude": 5.5906, "depth_km": 10}, {"id": "us7000f2x8", "time": "2021-08-24T07:05:53Z", "magnitude": 5.1, "place": "257 km SSE of R?zole, India", "longitude": 83.0456, "latitude": 14.4654, "depth_km": 10}, {"id": "us7000ef8p", "time": "2021-06-17T11:14:32Z", "magnitude": 4.6, "place": "Bay of Bengal", "longitude": 85.0001, "latitude": 6.592, "depth_km": 10}, {"id": "us7000e51v", "time": "2021-05-16T22:07:22Z", "magnitude": 4.1, "place": "41 km S of R?jula, India", "longitude": 71.4793, "latitude": 20.6607, "depth_km": 10}]}
data/flood_baseline.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "location": "Chennai",
3
+ "baselines": {}
4
+ }
data/llm_context.json ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "built_at": "2026-03-21T19:42:53.519462",
3
+ "location": "Chennai, India (13.08N, 80.27E)",
4
+ "data_sources": [
5
+ "Open-Meteo Archive",
6
+ "USGS Earthquake API",
7
+ "Open-Meteo AQI"
8
+ ],
9
+ "weather": {
10
+ "period": "2021-03-15 to 2026-03-14",
11
+ "total_days": 1826,
12
+ "avg_temp_max_c": 31.9,
13
+ "max_temp_ever_c": 41.0,
14
+ "min_temp_ever_c": 24.0,
15
+ "avg_daily_precip_mm": 4.44,
16
+ "max_single_day_rain": 255.8,
17
+ "avg_wind_kmh": 18.1,
18
+ "max_wind_kmh": 53.1,
19
+ "monthly_total_precip_mm": {
20
+ "1": 230.4,
21
+ "2": 19.2,
22
+ "3": 71.4,
23
+ "4": 73.8,
24
+ "5": 520.2,
25
+ "6": 343.6,
26
+ "7": 620.1,
27
+ "8": 866.0,
28
+ "9": 745.7,
29
+ "10": 1257.4,
30
+ "11": 2133.6,
31
+ "12": 1231.7
32
+ },
33
+ "yearly_summary": {
34
+ "2021": {
35
+ "avg_temp_max": 32.0,
36
+ "total_precip_mm": 1626.3
37
+ },
38
+ "2022": {
39
+ "avg_temp_max": 31.3,
40
+ "total_precip_mm": 1441.4
41
+ },
42
+ "2023": {
43
+ "avg_temp_max": 32.0,
44
+ "total_precip_mm": 1625.2
45
+ },
46
+ "2024": {
47
+ "avg_temp_max": 32.2,
48
+ "total_precip_mm": 1610.5
49
+ },
50
+ "2025": {
51
+ "avg_temp_max": 32.4,
52
+ "total_precip_mm": 1699.8
53
+ },
54
+ "2026": {
55
+ "avg_temp_max": 29.2,
56
+ "total_precip_mm": 109.9
57
+ }
58
+ },
59
+ "peak_monsoon_months": "June-November (Northeast monsoon dominant Oct-Dec)",
60
+ "heatwave_season": "March-June (temps frequently exceed 38C)",
61
+ "cyclone_peak_season": "October-December (Bay of Bengal cyclogenesis)"
62
+ },
63
+ "earthquakes": {
64
+ "total_events_5yr": 23,
65
+ "avg_magnitude": 4.58,
66
+ "max_magnitude": 5.1,
67
+ "region": "Bay of Bengal / South India (~1000km radius from Chennai)",
68
+ "risk_note": "Chennai on stable Deccan shield. Major risk from Bay of Bengal subduction zone."
69
+ },
70
+ "aqi": {
71
+ "total_days": 366,
72
+ "avg_aqi": 49.2,
73
+ "max_aqi": 96.6,
74
+ "context": "Typically moderate (50-100). Winter spikes (Nov-Jan) from crop burning and low wind."
75
+ },
76
+ "notable_events": [
77
+ {
78
+ "event": "Cyclone Michaung",
79
+ "date": "December 2023",
80
+ "impact": "Category 1 landfall, severe Chennai flooding, 2500mm rain in 48hr"
81
+ },
82
+ {
83
+ "event": "2015 Chennai Floods",
84
+ "date": "November-December 2015",
85
+ "impact": "Worst flooding in 100 years, 500+ deaths, $3B damage"
86
+ },
87
+ {
88
+ "event": "2004 Indian Ocean Tsunami",
89
+ "date": "December 26 2004",
90
+ "impact": "Mag 9.1 Sumatra earthquake, Chennai coastline devastated"
91
+ },
92
+ {
93
+ "event": "Cyclone Vardah",
94
+ "date": "December 2016",
95
+ "impact": "Direct hit Chennai, 100+ km/h winds, widespread damage"
96
+ },
97
+ {
98
+ "event": "Cyclone Nivar",
99
+ "date": "November 2020",
100
+ "impact": "Very severe cyclone, landfall near Puducherry, heavy Chennai rain"
101
+ }
102
+ ],
103
+ "climate_patterns": {
104
+ "type": "Tropical wet and dry (Koppen Aw)",
105
+ "annual_rainfall_mm": "~1400mm avg, 60% from Northeast monsoon Oct-Dec",
106
+ "sea_surface_temp": "Bay of Bengal 28-30C peak Jun-Oct (cyclone fuel)",
107
+ "urban_heat_island": "UHI adds +1.5 to 2.5C vs rural",
108
+ "warming_trend": "Max temps rising ~0.3C per decade since 1980",
109
+ "flood_risk_zones": "Adyar, Cooum, Buckingham Canal flood plains highest risk"
110
+ }
111
+ }
data/weather_history.json ADDED
The diff for this file is too large to render. See raw diff
 
groq_llm.py CHANGED
@@ -40,7 +40,7 @@ def _load_llm_context() -> dict:
40
  if age_hours < _CONTEXT_TTL_HOURS:
41
  return _context_cache
42
 
43
- context_path = "data/llm_context.json"
44
  if os.path.exists(context_path):
45
  try:
46
  with open(context_path) as f:
 
40
  if age_hours < _CONTEXT_TTL_HOURS:
41
  return _context_cache
42
 
43
+ context_path = "llm_context.json"
44
  if os.path.exists(context_path):
45
  try:
46
  with open(context_path) as f:
main.py CHANGED
@@ -41,6 +41,20 @@ app.add_middleware(
41
  expose_headers=["*"],
42
  )
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  @app.get("/ping")
45
  def ping():
46
  return {"status": "ok", "time": datetime.now().isoformat(), "version": "3.5-pro"}
@@ -249,7 +263,7 @@ def fetch_training_data(days: int = 90):
249
  """
250
  import os as _os
251
  import json as _json
252
- dataset_path = "data/weather_history.json"
253
 
254
  # ── Try loading from saved dataset first ──────────────────────
255
  if _os.path.exists(dataset_path):
@@ -2123,7 +2137,7 @@ def refresh_dataset():
2123
  return {
2124
  "status": "started",
2125
  "message": "Dataset rebuild started in background. Check data/ folder in ~2 minutes.",
2126
- "files_to_update": ["data/weather_history.json","data/earthquake_history.json","data/aqi_history.json","data/flood_baseline.json","data/llm_context.json"],
2127
  }
2128
  except Exception as e:
2129
  return {"status": "error", "message": str(e)}
@@ -2134,11 +2148,11 @@ def dataset_status():
2134
  """Check which dataset files exist and when they were last updated."""
2135
  import os as _os, json as _json
2136
  files = {
2137
- "weather_history": "data/weather_history.json",
2138
- "earthquake_history": "data/earthquake_history.json",
2139
- "aqi_history": "data/aqi_history.json",
2140
- "flood_baseline": "data/flood_baseline.json",
2141
- "llm_context": "data/llm_context.json",
2142
  }
2143
  result = {}
2144
  for key, path in files.items():
 
41
  expose_headers=["*"],
42
  )
43
 
44
+
45
+ @app.get("/debug-paths")
46
+ def debug_paths():
47
+ import os as _os
48
+ cwd = _os.getcwd()
49
+ files_in_cwd = _os.listdir(cwd)
50
+ return {
51
+ "cwd": cwd,
52
+ "files_in_cwd": files_in_cwd,
53
+ "weather_history_exists": _os.path.exists("weather_history.json"),
54
+ "data_folder_exists": _os.path.exists("data"),
55
+ "data_files": _os.listdir("data") if _os.path.exists("data") else [],
56
+ }
57
+
58
  @app.get("/ping")
59
  def ping():
60
  return {"status": "ok", "time": datetime.now().isoformat(), "version": "3.5-pro"}
 
263
  """
264
  import os as _os
265
  import json as _json
266
+ dataset_path = "weather_history.json"
267
 
268
  # ── Try loading from saved dataset first ──────────────────────
269
  if _os.path.exists(dataset_path):
 
2137
  return {
2138
  "status": "started",
2139
  "message": "Dataset rebuild started in background. Check data/ folder in ~2 minutes.",
2140
+ "files_to_update": ["weather_history.json","earthquake_history.json","aqi_history.json","flood_baseline.json","llm_context.json"],
2141
  }
2142
  except Exception as e:
2143
  return {"status": "error", "message": str(e)}
 
2148
  """Check which dataset files exist and when they were last updated."""
2149
  import os as _os, json as _json
2150
  files = {
2151
+ "weather_history": "weather_history.json",
2152
+ "earthquake_history": "earthquake_history.json",
2153
+ "aqi_history": "aqi_history.json",
2154
+ "flood_baseline": "flood_baseline.json",
2155
+ "llm_context": "llm_context.json",
2156
  }
2157
  result = {}
2158
  for key, path in files.items():
pyrightconfig.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "pythonVersion": "3.14",
3
+ "pythonPlatform": "Windows",
4
+ "reportMissingModuleSource": false,
5
+ "reportMissingImports": false,
6
+ "reportGeneralTypeIssues": false,
7
+ "reportOptionalMemberAccess": false,
8
+ "reportIndexIssue": false,
9
+ "typeCheckingMode": "off",
10
+ "executionEnvironments": [
11
+ {
12
+ "root": ".",
13
+ "extraPaths": [
14
+ "."
15
+ ],
16
+ "pythonPath": "C:\\Users\\acer\\AppData\\Local\\Programs\\Python\\Python314\\python.exe"
17
+ }
18
+ ]
19
+ }
requirements.txt CHANGED
@@ -1,13 +1,13 @@
1
- fastapi
2
- uvicorn
3
- requests
4
- numpy
5
- scikit-learn
6
- xgboost
7
- lightgbm
8
- python-dotenv
9
- google-generativeai
10
- groq
11
- typing-extensions
12
- python-multipart
13
- dateparser
 
1
+ fastapi
2
+ uvicorn
3
+ requests
4
+ numpy
5
+ scikit-learn
6
+ xgboost
7
+ lightgbm
8
+ python-dotenv
9
+ google-generativeai
10
+ groq
11
+ typing-extensions
12
+ python-multipart
13
+ dateparser
test_output.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "query": "compare weather in 2025 and 2024",
4
+ "intents": [
5
+ "weather_comparison",
6
+ "weather_history"
7
+ ],
8
+ "analysis": "To compare the weather in 2025 and 2024, let's look at the historical data for March 14th of both years.\n\nIn 2024, on March 14th, the maximum temperature was 33.5\u00b0C and the minimum temperature was 24.8\u00b0C, with a maximum wind speed of 22.0 km/h.\n\nIn 2025, on March 14th, the maximum temperature was 33.4\u00b0C and the minimum temperature was 24.7\u00b0C, with a maximum wind speed of 16.2 km/h.\n\nThe difference between the two years is:\n- Maximum temperature: 2024 (33.5\u00b0C) was 0.1\u00b0C higher than 2025 (33.4\u00b0C)\n- Minimum temperature: 2024 (24.8\u00b0C) was 0.1\u00b0C higher than 2025 (24.7\u00b0C)\n- Maximum wind speed: 2024 (22.0 km/h) was 5.8 km/h higher than 2025 (16.2 km/h)\n\nNote that the data is only available for March 14th of both years, so this comparison is limited to that specific date."
9
+ },
10
+ {
11
+ "query": "what is the trend from 2022 to 2026",
12
+ "intents": [
13
+ "weather_comparison"
14
+ ],
15
+ "analysis": "The trend from 2022 to 2026 in Chennai, India, shows variations in temperature and precipitation. \nOn March 14th of each year, the maximum temperatures were: 32.5\u00b0C in 2022, 31.2\u00b0C in 2023, 33.5\u00b0C in 2024, 33.4\u00b0C in 2025, and a forecasted 33.4\u00b0C in 2026.\nThe highest maximum temperature was 33.5\u00b0C in 2024, and the lowest was 31.2\u00b0C in 2023.\nThe minimum temperatures on the same dates were: 22.1\u00b0C in 2022, 23.4\u00b0C in 2023, 24.8\u00b0C in 2024, 24.7\u00b0C in 2025, and a forecasted 24.1\u00b0C in 2026.\nThere was no precipitation on March 14th in the years 2022, 2023, 2024, and 2025, but the forecast for 2026 shows no precipitation on the 14th as well."
16
+ }
17
+ ]