Hydroinformatics workflows for NYC FloodNet sensor data, including:
- API extraction and parquet checkpointing
- dataset joining and spatial weather enrichment
- storm delineation and event-level EDA
- rain-influenced gage selection for modeling
- single-gage focused modeling on
apparently-darling-gecko - model training and evaluation
Finalized_Scripts/: primary notebooks and Python scripts for the core pipelineTest_Scripts/: exploratory notebooks and standalone experimentsData_Files/: parquet datasets and training databasesImages_or_plots/: exported figuresresults/: run logs and presentation outputs
- Python
3.10+(recommended:3.11) pip- Jupyter Notebook or JupyterLab
- Optional for R scripts: R
4.2+
git clone https://github.com/mwdunlap2004/floodnet_work.git
cd floodnet_work
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt
jupyter labWindows (PowerShell):
git clone https://github.com/mwdunlap2004/floodnet_work.git
cd floodnet_work
py -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -r requirements.txt
jupyter labNotes:
geopandasmay require system GIS libraries on some machines.torchinstall can vary by OS/GPU. If needed, use the official selector: https://pytorch.org/get-started/locally/
Most finalized notebooks/scripts expect files under Data_Files/:
Primary shared data location:
- Google Drive folder: FloodNet project data
- Download/sync these files into local
Data_Files/before running the notebooks.
| File | Produced By | Used By |
|---|---|---|
floodnet_parquet_data/*.parquet |
Finalized_Scripts/parquet_floodnet_download.py |
Finalized_Scripts/joining_parquets.ipynb |
nyc_precipitation_master.parquet |
Finalized_Scripts/merging_precip.ipynb |
Finalized_Scripts/spatial_join.ipynb |
floodnet_full_dataset_merged.parquet |
Finalized_Scripts/joining_parquets.ipynb |
Finalized_Scripts/spatial_join.ipynb |
floodnet_floods_only.parquet |
Finalized_Scripts/joining_parquets.ipynb |
Test_Scripts/flood_duration.ipynb |
floodnet_full_dataset_merged_with_weather.parquet |
Finalized_Scripts/spatial_join.ipynb |
Finalized_Scripts/select_precip_influenced_gages.py |
rain_influenced_sites_raw.parquet |
Finalized_Scripts/select_precip_influenced_gages.py |
Finalized_Scripts/delineate_filtered_storms.py |
apparently-darling-gecko.parquet |
Finalized_Scripts/apparently_darling_gecko.py |
Finalized_Scripts/hpo_search.py, Finalized_Scripts/model_training.py |
rain_influenced_gages.parquet |
Finalized_Scripts/delineate_filtered_storms.py |
Finalized_Scripts/rain_influenced_EDA.ipynb, Finalized_Scripts/hpo_search.py, Finalized_Scripts/model_training.py |
delineated_storms.parquet |
Test_Scripts/updated_method_storm_seperation.ipynb |
Finalized_Scripts/floodnet_eda.ipynb |
floodnet_hpo_newfilter.db |
Finalized_Scripts/hpo_search.py |
Finalized_Scripts/model_training.py |
Note:
Finalized_Scripts/merging_precip.ipynbis currently configured to read source CSVs fromdata_files/request/and writesnyc_precipitation_master.parquet; place that parquet underData_Files/forspatial_join.ipynb.
Use this order for a clean, reproducible workflow:
Finalized_Scripts/parquet_floodnet_download.pyFinalized_Scripts/joining_parquets.ipynbFinalized_Scripts/merging_precip.ipynb(buildsnyc_precipitation_master.parquet)Finalized_Scripts/spatial_join.ipynbFinalized_Scripts/select_precip_influenced_gages.py(default--top-n 3; createsData_Files/rain_influenced_sites_raw.parquet)Finalized_Scripts/delineate_filtered_storms.py(createsData_Files/rain_influenced_gages.parquet)Finalized_Scripts/apparently_darling_gecko.py(isolates one deployment and createsData_Files/apparently-darling-gecko.parquet)Finalized_Scripts/rain_influenced_EDA.ipynb(rain-coupling diagnostics)Finalized_Scripts/hpo_search.py(default input:apparently-darling-gecko.parquet)Finalized_Scripts/model_training.py(default input:apparently-darling-gecko.parquet)- Optional full-network analysis notebooks:
Test_Scripts/updated_method_storm_seperation.ipynb,Finalized_Scripts/floodnet_eda.ipynb,Test_Scripts/flood_duration.ipynb,Test_Scripts/finalized_lstm_modeling.ipynb
For final model development, the workflow uses one high-reliability FloodNet deployment: apparently-darling-gecko (written as apparently_darling_gecko in text and apparently-darling-gecko in file/script IDs).
Finalized_Scripts/apparently_darling_gecko.py filters storm records to that deployment and writes Data_Files/apparently-darling-gecko.parquet, which is the default training input used by both hpo_search.py and model_training.py.
The current checked metrics are from results/run_log.json with timestamp 2026-05-04T15:38:45.092605.
Test-set skill scores:
| Model | KGE | NSE | RMSE (in) | PBIAS (%) | PeakNSE |
|---|---|---|---|---|---|
| Log-Ridge | -0.0246 | 0.1502 | 1.3014 | 55.83 | -0.4895 |
| Res-ANN | 0.0323 | 0.1273 | 1.3188 | 40.55 | -0.4663 |
| Attn-LSTM | 0.0699 | 0.1796 | 1.2963 | 32.11 | -0.4105 |
Train-set skill scores:
| Model | KGE | NSE | RMSE (in) | PBIAS (%) | PeakNSE |
|---|---|---|---|---|---|
| Log-Ridge | 0.4419 | 0.1626 | 0.4988 | 3.54 | -1.1352 |
| Res-ANN | 0.5302 | 0.1229 | 0.5105 | 6.47 | -0.5716 |
| Attn-LSTM | 0.6296 | 0.5234 | 0.3820 | 1.67 | -0.1554 |
- Unified job script:
Test_Scripts/run_rain_influenced.sbatch
- Examples:
sbatch Test_Scripts/run_rain_influenced.sbatch
sbatch --export=STEP=hpo Test_Scripts/run_rain_influenced.sbatch
sbatch --export=STEP=train Test_Scripts/run_rain_influenced.sbatch
sbatch --export=STEP=all Test_Scripts/run_rain_influenced.sbatch- Legacy scripts are also aligned to the new input file:
Finalized_Scripts/run_hpo.slurmFinalized_Scripts/run_training.sbatch
Images_or_plots/: static figures (for example model comparison and duration plots)results/: model run artifacts/logsresults/presentation_figures/: exported presentation figures fromfloodnet_eda.ipynbcheckpoints/: trained model checkpoints and scalers from training scripts
If you plan to run .R scripts in Test_Scripts/:
install.packages(c("tidyverse", "jsonlite", "leaflet", "htmltools", "lubridate"))ModuleNotFoundError: install missing packages into the active.venv.- Jupyter kernel mismatch: select the
.venvkernel in notebook UI. - GeoPandas install issues: try conda/mamba for geospatial dependencies.
- Slow API pulls: the downloader includes retries and checkpointed parquet outputs.