/

India’s rapid population growth and the need to meet the increasing demands for irrigation, human, and industrial consumption, available water resources in many parts of the country are depleting and water quality has deteriorated. The discharge of untreated sewage and industrial effluents pollutes Indian rivers and water bodies, which in turn pollutes the country’s waterways.
Water quality monitoring is very important to obtain quantitative information about the characteristics of water and identify changes or trends in water quality over time, as well as to respond to emerging water quality problems, such as the identification of sediment, harmful algae blooms, salinity, dissolved organic matter and dissolved oxygen levels.
One disadvantage of measuring and monitoring water quality in situ is that it can be very expensive and time consuming. Satellite imagery is an alternative method for monitoring water quality. The team explored Sentinel 2, Sentinel 3, and Landsat 8 satellite imagery for water quality monitoring.
Satellite-based remote sensing is a cost-effective and efficient method for analyzing and quantifying water quality. It is possible to establish long-term baseline conditions for any region of the world using satellite data. It can also provide information on both the local and regional scales using near real-time satellite data.
There are several water quality parameters available, but the team has chosen the following 8 important parameters to monitor water quality.


Several satellites orbit the earth with sensors that could be used to estimate water quality parameters. The spectral, spatial, and temporal resolution of sensors can be used to compare and select them. A short list of sensors was compiled based on the literature.


Following indices has been used for water quality monitoring:
• NDWI: The Normalized Difference Water Index (NDWI) is an index for delineating and monitoring content changes in surface water. It is computed with the near-infrared (NIR) and green bands. NDWI = (Green – NIR) / (Green + NIR).
• MNDWI: The modified NDWI (MNDWI) can enhance open water features while efficiently suppressing and even removing built‐up land noise as well as vegetation and soil noise. It uses green and SWIR bands for the enhancement of open water features.
• NDSI: Normalized Difference Salinity Index.
• NDTI: The Normalized Difference Turbidity Index (NDTI) is used to estimate the turbidity in water bodies. It is also estimated using the spectral reflectance values of the water pixels.
It uses the phenomenon that the electromagnetic reflectance is higher in the green spectrum than the red spectrum for clear water. Hence, with increase in turbidity the reflectance of the red spectrum also increases.
• NDCI: Normalized Difference Chlorophyll Index is used for estimation of chlorophyll-a concentration in turbid water. It is calculated using the red spectral band B04 with the red edge spectral band B05.
• Step 1: Identify your region of interest or the geometry
geometry = ee.Geometry.Point([72.6026,23.0063])
• Step 2: Identify the satellite and use filters like date, filter bounds or cloud pixel percentage
sentinel = ee.ImageCollection("COPERNICUS/S2_SR").filterBounds(vectors)
.filterDate(start_date,end_date)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',20))
.median()
• Step 3: Calculate Normalized Difference Water Index (NDWI) using the bands
ndwi = sentinel.normalizedDifference(['B3','B11']).rename('ndwi')
• Step 4: Extract the water parameters for example Chlorophyll, based on the regression formulae above
latlon = ee.Image.pixelLonLat().addBands(ndci)
# apply reducer to list
latlon = latlon.reduceRegion(
reducer=ee.Reducer.toList(),
geometry=vectors,
scale=100);
# get data into three different arrays
data_ndci = np.array((ee.Array(latlon.get("ndci")).getInfo()))
• Step 5: Extract the water parameters for example Dissolved Oxygen, based on the regression formulae above
latlon = ee.Image.pixelLonLat().addBands(dissolvedoxygen)
# apply reducer to list
latlon = latlon.reduceRegion(
reducer=ee.Reducer.toList(),
geometry=vectors,
scale=100,
tileScale = 16);
# get data into three different arrays
data_do = np.array((ee.Array(latlon.get("dissolvedoxygen")).getInfo()))
• Step 6: Extract the water parameters for example Temperature, based on the regression formulae above
latlon = ee.Image.pixelLonLat().addBands(temp)
latlon = latlon.reduceRegion(
reducer=ee.Reducer.toList(),
geometry=vectors,
scale=100);
data_lst = np.array((ee.Array(latlon.get("temp")).getInfo()))
• Step 7: Extract the water parameters for example Turbidity, based on the regression formulae above
latlon = ee.Image.pixelLonLat().addBands(ndti)
# apply reducer to list
latlon = latlon.reduceRegion(
reducer=ee.Reducer.toList(),
geometry=vectors,
scale=100);
# get data into three different arrays
data_ndti = np.array((ee.Array(latlon.get("ndti")).getInfo()))
• Step 8: Extract the water parameters for example Salinity, based on the regression formulae above
latlon = ee.Image.pixelLonLat().addBands(ndsi)
# apply reducer to list
latlon = latlon.reduceRegion(
reducer=ee.Reducer.toList(),
geometry=vectors,
scale=100);
# get data into three different arrays
data_ndsi = np.array((ee.Array(latlon.get("ndsi")).getInfo()))
• Step 9: Create the dataset using the extracted values from the above steps
df = pd.concat([pd.DataFrame(data_do, columns = ['Dissolved Oxygen']), pd.DataFrame(data_ndsi, columns = ['Salinity']), pd.DataFrame(data_lst, columns = ['Temperature']), pd.DataFrame(data_ph, columns = ['pH']), pd.DataFrame(data_ndti, columns = ['Turbidity']), pd.DataFrame(data_dom, columns = ['Dissolved Organic Matter']), pd.DataFrame(data_sm, columns = ['Suspended Matter']), pd.DataFrame(data_ndci, columns = ['Chlorophyll'])], axis=1, sort=False)









• Step 1: Data Pre-processing and Exploration
1. The data was gathered separately for the Kutch region’s Hamirsar Lake, Shinai Lake, and Tappar Lake, and then concatenated into a single data file.

2. After carefully examining the data, it was discovered that it had more than 60% null values; thus, replacing the null values or doing any imputation was not feasible, since it may result in imbalanced observations or skewed estimations.
3. The number of outliers was examined after the null values were removed. Only Dissolved Oxygen had data points beyond the Interquartile Region, however owing to the large number of them, they couldn’t be called unambiguous outliers.
4. The data was examined for multicollinearity between the parameters, but no significant correlations were discovered, with the exception of one relationship between Dissolved Organic Matter and Suspended Matter.
5. It was observed that we didn’t have clear class distinctions for salinity parameters due to lack of data from diverse saline regions. So we decided to drop the salinity parameter from training and add a salinity check condition for the final prediction as explained in the machine learning section.
• Step 2: Training and Validation dataset Preparation
1. To perform Supervised Machine Learning, we needed to add labels to the dataset after it was ready.

2. Due to a lack of in-situ data for training in India, we applied research-based thresholds (shown in the table) to categorise the records into ‘good,’ ‘poor,’ and ‘Needs treatment,’ and created our own training and testing data.
3. The data was labelled using the following criteria: –
4. The Min-Max Scaler was then used to normalize the data.

5. There were 989 entries for ‘Needs Treatment’, 50 values for ‘poor’ and 461 values for ‘good’ in the dataset, which indicated the imbalance nature of the data.
6. The unbalanced data was therefore balanced by using SMOTE to up sample it, resulting in 989 values for each class.
• Step 3: Machine Learning Models
1. Various Machine learning models were applied on the final dataframe, and the metrics were analysed and the best model was chosen with having a good validation accuracy. Among all the models we evaluated, Random Forest Classifier performed best and was used for the final deployment.
2. For the final prediction, salinity_class is the class predicted based on only Salinity and predicted_class is the class predicted by the model. The following were the 3 conditions for Final prediction:
3. Below are the confusion matrix and ROC curve for the final model.
4. The Classification report shows the Precision Recall and F1 score, for the validation set.
5. F1 score provides a way to combine both precision and recall into a single measure that captures both properties.

6. Confusion Matrix : A confusion matrix tells us the number of ways in which our model made correct, incorrect and confusing predictions.


Our dashboard has 7 tabs/pages as listed below :
It acts as the landing page of our dashboard having the problem statement – ‘Water Quality Centralized Dashboard for Better Decision Making’.
It describes the following:
– Project Goals: to analyze, interpret and visualize the different water quality parameters and compare them with standard limits.
– Location Chosen: Kutch Region (Hamisar, Shinai and Tappar Lake)
– Developments Made: starting with parameters identification, spotting the useful sources and absence of in-situ data for the Indian region, it talks about how we were able to achieve the interactive dashboard that classifies the water of the selected region of interest using a machine learning model.
It is about the project endorsements which includes projecting the water quality, monitoring and analyzing existing conditions, identification of parameters with threshold values.
Water Body, Parameters, Latitude, Longitude, Start Date and End Date of the area of interest is set by the user.
It displays the Lake Satellite Imaging using Sentinel
It is broadly categorized into the tech stacks used, the project summary which talks about the water quality crisis, ability of decision making and real-time enforcement and finally the conclusion portraying the success of the centralized dashboard to check the real time water conditions.
It has the list of all the collaborators and the team lead linked to their respective linkedin profiles.
Dashboard Gif

According to UNICEF, one in nine people worldwide uses drinking water from unimproved and unsafe sources. Water quality is one of the main challenges that societies are facing in the 21st century, threatening human health, limiting food production, reducing ecosystem functions, and hindering economic growth. To align and meet the Sustainable Development Goals(SDG), the dashboard was built with different water quality parameters to monitor water quality more effectively and efficiently in real-time using satellite imagery and remote sensing techniques. As the traditional in situ methods are costly as well as time-consuming, by using advanced geospatial technology, water quality can be monitored spatially and temporally in near real-time and self-operating. This would help decision makers and stakeholders to make better decisions.
Numerous water quality monitoring articles have been studied by the team. A handful of the most notable sources are listed here:
Github:
Exploring the Data:
You might also like

AI-Powered Rooftop Solar Assessment: How Computer Vision Eliminates the 30-40% Pre-Sales Survey Cost

From Orbit to Harvest: Inside TerraYield, a Multimodal Dataset for Smarter Crop Yield Forecasting

8 Best Streamlit Machine Learning Web App Examples in 2026

AI-Powered Drone Technology for Water Management and Plant Health Prediction