From 09e38e7350d94aae52e49a24394bc2ae431ad075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=91=AB?= Date: Tue, 16 Dec 2025 11:42:36 +0800 Subject: [PATCH] Add initial project files for Soil Water Balance Model including Docker setup, deployment scripts, API implementation, and data files --- .dockerignore | 50 ++ Dockerfile | 40 + data/57278_2024.csv | 732 +++++++++++++++ data/N_organ.json | 38 + data/SOILPROP.json | 84 ++ data/forecast.csv | 732 +++++++++++++++ data/management.json | 8 + data/management_nowadays.json | 8 + data/nowadays.csv | 732 +++++++++++++++ data/para.json | 15 + data/plant_para.json | 18 + deploy.bat | 117 +++ deploy.sh | 121 +++ docker-compose.yml | 19 + main.py | 1597 +++++++++++++++++++++++++++++++++ nginx.conf | 74 ++ requirements.txt | 6 + test_api.py | 106 +++ 18 files changed, 4497 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 data/57278_2024.csv create mode 100644 data/N_organ.json create mode 100644 data/SOILPROP.json create mode 100644 data/forecast.csv create mode 100644 data/management.json create mode 100644 data/management_nowadays.json create mode 100644 data/nowadays.csv create mode 100644 data/para.json create mode 100644 data/plant_para.json create mode 100644 deploy.bat create mode 100644 deploy.sh create mode 100644 docker-compose.yml create mode 100644 main.py create mode 100644 nginx.conf create mode 100644 requirements.txt create mode 100644 test_api.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f72ab56 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,50 @@ +# Python +__pycache__/ +*.pyc +*.pyo +*.pyd +.Python +env/ +venv/ +.venv/ +pip-log.txt +pip-delete-this-directory.txt +.tox/ +.coverage +.coverage.* +.pytest_cache/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Git +.git/ +.gitignore + +# Documentation +*.md +README.md + +# Docker +Dockerfile +.dockerignore + +# Logs +*.log + +# Testing +test_*.py +*_test.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b55f24d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +# Use Python 3.11 slim image as base +FROM python:3.11-slim + +# Set working directory +WORKDIR /app + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + gcc \ + g++ \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Copy requirements first for better caching +COPY requirements.txt . + +# Install Python dependencies +RUN pip install --no-cache-dir -r requirements.txt + +# Copy application code +COPY main.py . +COPY test_api.py . + +# Copy data directory +COPY data/ ./data/ + +# Create non-root user for security +RUN useradd --create-home --shell /bin/bash app \ + && chown -R app:app /app +USER app + +# Expose port +EXPOSE 8000 + +# Health check +HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \ + CMD curl -f http://localhost:8000/health || exit 1 + +# Start the application +CMD ["python", "main.py"] diff --git a/data/57278_2024.csv b/data/57278_2024.csv new file mode 100644 index 0000000..0a2017f --- /dev/null +++ b/data/57278_2024.csv @@ -0,0 +1,732 @@ +date,Tmax,Tmin,SH,RAIN,Tmean,u2,RHave,RHmin,Atm +01/01/2023,10,-6,8.4,0,2,2.11,44.91,46.61,100.34 +01/02/2023,10,-1,5.2,0,4.5,3.21,75.64,37.06,99.83 +01/03/2023,3.7,-7,2.9,0,-1.65,3.67,43.58,30.72,99.89 +01/04/2023,2,-4.5,2.1,0,-1.25,8.7,73.46,38.99,99.84 +01/05/2023,2,-6.2,4.8,0,-2.1,1.5,46.25,44.45,100.22 +01/06/2023,4,-12,8.7,0,-4,9.73,74.55,32.31,99.34 +01/07/2023,-3,-11,8.9,0,-7,9,55.68,32.02,100.52 +01/08/2023,2,-5,9.2,0,-1.5,4.07,75.84,46.84,99.72 +01/09/2023,4,-4,8.7,0,0,6.22,60.6,47.71,100.24 +01/10/2023,4.5,-1,5.2,0,1.75,6.17,72.42,39.8,99.12 +01/11/2023,5.5,-4.2,9.2,0,0.65,3.01,68.8,30.33,100.03 +01/12/2023,14.7,-4.2,8.4,0,5.25,1.23,55.2,44.73,100.4 +01/13/2023,18,-1,8.4,0,8.5,2.51,61.63,38.44,99.77 +01/14/2023,17,-0.7,7.6,0,8.15,8.52,43.85,49.74,100.09 +01/15/2023,8.2,0,2.4,0,4.1,2.01,57.02,32.12,99.71 +01/16/2023,6.2,-1,4.4,0,2.6,1.81,73.99,41.06,100.88 +01/17/2023,9,-5,9.8,0,2,3.2,55.51,39.12,99.5 +01/18/2023,15,-4,8.7,0,5.5,8.98,42.1,37.97,100.3 +01/19/2023,6,-3,6.8,0,1.5,6.36,66.72,43.73,100.39 +01/20/2023,5,-2,3.3,0,1.5,3.61,64.39,49.77,99.06 +01/21/2023,10,-2,2,0,4,2.87,41.72,45.91,100.93 +01/22/2023,8,-0.9,0,0,3.55,3.03,79.63,36.36,99.96 +01/23/2023,8,1,0,0,4.5,6.57,69.48,35.14,99.09 +01/24/2023,5.1,2,0,0.1,3.55,9.6,58.35,43.54,100.12 +01/25/2023,9,1,0,0.9,5,6.66,41.06,37.53,100.64 +01/26/2023,12,-1,7.2,0,5.5,7.32,41.94,47.45,100.46 +01/27/2023,11.5,1,0,0,6.25,1.27,77.88,47.58,99.06 +01/28/2023,10,-4,9.8,0,3,3.04,56.38,47.68,100.56 +01/29/2023,14,-2,7.5,0,6,8.51,49.1,39.07,99.55 +01/30/2023,17,1.1,8.9,0,9.05,2.99,76.19,35.75,99.48 +01/31/2023,16,0.2,5.7,0,8.1,3.97,47.76,38.13,99.57 +02/01/2023,16.2,0,7.7,0,8.1,8.48,60.98,31.42,99.04 +02/02/2023,10,-2,8,0,4,5.69,52.47,48.22,99.22 +02/03/2023,16,-2,6.8,0,7,3.67,72.48,30.02,100.27 +02/04/2023,13.5,-0.2,0,0,6.65,9.93,54.15,36.32,99.97 +02/05/2023,19,1,0,0,10,2.51,71.26,40.63,100.25 +02/06/2023,22,1.7,0,0,11.85,2.84,57.92,35.02,99.52 +02/07/2023,10.1,0,0,0,5.05,1.94,60.3,34.09,100.58 +02/08/2023,9.5,-1,0,0,4.25,8.87,55.04,30.28,100.82 +02/09/2023,12,0,0,0,6,4.99,45.47,46.15,100.36 +02/10/2023,16,0,5.9,0,8,8.81,64.63,36.11,100.47 +02/11/2023,2,2,6.7,0,2,3.55,65.57,37.27,99.86 +02/12/2023,7.5,4,0,0,5.75,3.81,42.98,45.78,99.1 +02/13/2023,13,6,1.5,4.7,9.5,1.23,57.67,37.97,99.48 +02/14/2023,20,2,0,0,11,1.77,59.36,35.54,99.53 +02/15/2023,8,2.2,0,0,5.1,9.52,56.87,33.77,99.38 +02/16/2023,13,-1,0,0,6,7.33,40.46,37.51,99.69 +02/17/2023,11.2,-2,0,0,4.6,5.65,54.23,38.02,99.75 +02/18/2023,14.6,1.7,0,0,8.15,9.9,57.54,35.26,100.27 +02/19/2023,24,3.2,9.8,0,13.6,6.93,78.31,33.84,100.39 +02/20/2023,20.7,8.7,10.1,0,14.7,5.73,46.75,40.56,99.8 +02/21/2023,27.5,8.2,9.9,0,17.85,8.7,59.87,48.31,100.25 +02/22/2023,17,5,6.9,0,11,8.66,51.56,38.77,100.27 +02/23/2023,12,5,7.8,0,8.5,4.73,41.52,30.49,99.24 +02/24/2023,6,0,0,43.2,3,6.24,69.35,46.16,99.07 +02/25/2023,4.6,1,0,2.2,2.8,9.88,77,44.06,100.95 +02/26/2023,8.2,5,1.9,0,6.6,2,74.58,46.71,99.95 +02/27/2023,10.7,6,4.6,0.3,8.35,5.61,45.75,48.08,99.87 +02/28/2023,8.1,4,0,35.7,6.05,1.06,51.51,44.98,99.81 +03/01/2023,7.2,0,2.1,0.4,3.6,9.07,73.49,47.72,100.72 +03/02/2023,13.7,2.5,8.1,0,8.1,2.42,54.92,40.14,100.04 +03/03/2023,16.1,5,9,0,10.55,4.9,44.05,34.85,100.42 +03/04/2023,20.5,6.5,7.9,0,13.5,3.57,41.3,37.47,100.5 +03/05/2023,19.7,1,5,0,10.35,2.12,49.85,44.32,99.94 +03/06/2023,3,0,0.3,0,1.5,1.05,64.79,31.03,99.51 +03/07/2023,10.2,1.7,4.9,0,5.95,4.59,46.39,34.68,99.82 +03/08/2023,11,3,2.1,0,7,2.54,63.81,42.72,100.01 +03/09/2023,15.7,6.2,7.2,0,10.95,6.23,78.79,38.2,99.26 +03/10/2023,12.2,8,1,1.8,10.1,6.33,56.4,45.89,99.78 +03/11/2023,14.2,5,3,2.4,9.6,3.77,73.37,37.98,100.89 +03/12/2023,14.5,8,2.7,0,11.25,4.05,67.13,43.43,100.2 +03/13/2023,13.7,9,0.8,0,11.35,2.27,71.96,46.87,99.02 +03/14/2023,16,10,1.4,0.2,13,1.85,71.24,41.91,99.56 +03/15/2023,19.5,8,4.4,0,13.75,9.26,68.53,45.07,99.2 +03/16/2023,15,8,0,0,11.5,6.46,44.87,49.21,99.71 +03/17/2023,15,10,2.5,0,12.5,5.01,43.07,43.57,100.17 +03/18/2023,10.1,6,0,0.2,8.05,6.57,47.09,38.92,100.97 +03/19/2023,11,3,0.9,5,7,1.06,46,46.17,100.23 +03/20/2023,15.1,8,3.5,0,11.55,9.11,41.62,34.88,100.43 +03/21/2023,14.1,1,0,0,7.55,6.22,55.69,36.62,99.35 +03/22/2023,19.7,5,11.6,0,12.35,6.71,61.83,39.03,100.26 +03/23/2023,22.2,9,8.6,0,15.6,5.22,58.84,45.93,99.98 +03/24/2023,22.1,10.1,6.5,0,16.1,6.9,60.1,38.03,99.64 +03/25/2023,23.1,12,8.3,0.3,17.55,9.66,40.07,45.86,100.66 +03/26/2023,17.5,11,0,12.3,14.25,7.73,51.07,34.99,100.92 +03/27/2023,22.6,9,0,0,15.8,7.2,65.19,43.57,100.84 +03/28/2023,28.7,14,7.9,0,21.35,1.56,43.82,41.6,99.21 +03/29/2023,18,9,3.4,0,13.5,6.51,68.93,43.55,99.47 +03/30/2023,21,12,7.3,0,16.5,6.65,48.9,37.96,100.39 +03/31/2023,14.2,12,0,1.4,13.1,4.55,76.06,37.34,100.25 +04/01/2023,16.5,11,1.3,1.2,13.75,8.54,65.61,49.92,99.87 +04/02/2023,15,10,0,8.8,12.5,5.3,40.26,34.31,100.71 +04/03/2023,12.2,3.7,0,0.8,7.95,8.31,53.86,43.5,99.1 +04/04/2023,16.2,6,7.9,0,11.1,6.54,67.49,44.12,99.14 +04/05/2023,14.6,3,1.3,0,8.8,1.14,65.72,47.9,99.04 +04/06/2023,19.5,10.1,8,0,14.8,9.58,58.42,39.67,99.82 +04/07/2023,19.1,7,2.5,0,13.05,2.65,67.69,39.64,99.24 +04/08/2023,21.2,8,7.3,0,14.6,4.62,66.38,41.69,99.52 +04/09/2023,20.2,9,0,0,14.6,4.08,59.69,41.74,99.85 +04/10/2023,20.5,11,7.9,0,15.75,5.78,50.14,47.48,100.32 +04/11/2023,17,13,0.4,0,15,9.81,49.3,43.34,100.69 +04/12/2023,24.6,13,7.9,0,18.8,8.66,42.16,47.18,99.69 +04/13/2023,17,12,6.2,0,14.5,9,49.99,30.33,100.24 +04/14/2023,20.2,13,9.4,0,16.6,2.33,43.07,36.69,100 +04/15/2023,27,15,7,0,21,4.12,79.46,39.81,99.07 +04/16/2023,22.7,8,8.4,0,15.35,4.85,79.9,37.52,99.54 +04/17/2023,23.2,9,12.2,0,16.1,2.41,66,41.46,100.25 +04/18/2023,23,12.1,9.6,0,17.55,1.51,69.6,42.22,100.61 +04/19/2023,25,13,0,1.7,19,6.56,58.67,37.73,99.48 +04/20/2023,15.5,11.7,0,29.4,13.6,7.52,55.22,35.17,100.75 +04/21/2023,14,11,0,6.1,12.5,2.1,62.69,38.69,99.75 +04/22/2023,20.5,11,5.5,0,15.75,7.52,65.97,41.28,100.19 +04/23/2023,19.5,13,2,0,16.25,8.5,77.6,48.73,100.06 +04/24/2023,16.7,13,0,0,14.85,2.35,62.95,42.08,100.65 +04/25/2023,16.5,11,2.1,0,13.75,2.79,44,45.46,99.92 +04/26/2023,23.6,12,5.9,0,17.8,6.52,71.38,34.05,100.3 +04/27/2023,28,17,10.4,0,22.5,3.67,77.36,42.02,99.95 +04/28/2023,25.2,16,10.7,0,20.6,8.32,79.19,42.56,99.81 +04/29/2023,31,15,10.7,0,23,8.36,60.78,47.68,99.13 +04/30/2023,32,11,10,0,21.5,5.39,69.1,48.01,99.93 +05/01/2023,27.1,14,0,0,20.55,6.08,79.31,40.23,99.6 +05/02/2023,20.2,15,6.5,0,17.6,7.04,63.32,43.81,99.3 +05/03/2023,18,12,1,5.4,15,7.83,56.34,43.25,99.89 +05/04/2023,27,11,8.4,0,19,3.46,40.32,34.1,99.08 +05/05/2023,29.2,16,11.6,0,22.6,2.6,52.57,49.81,99.2 +05/06/2023,33.6,19,8.5,0,26.3,7.96,66.67,37.02,100.04 +05/07/2023,28.7,13,8.3,0,20.85,1.21,70.39,31.4,99.64 +05/08/2023,35.7,19,10.4,0,27.35,1.25,57.39,44.35,99.27 +05/09/2023,31,21,9.5,0,26,6.26,76.25,30.12,99.44 +05/10/2023,26.1,17,7,0,21.55,4.89,49.95,33.47,99.2 +05/11/2023,24.7,15.5,7,0,20.1,7.84,40.86,36.91,99.43 +05/12/2023,27.7,18,7.1,0,22.85,7.24,69.92,36.08,99.13 +05/13/2023,25.5,20,2.4,0,22.75,9.3,72.22,40.77,100.05 +05/14/2023,25.2,20,0.5,1.8,22.6,1.53,76.25,47.22,99.15 +05/15/2023,24.1,13,0,22,18.55,2.74,41.85,45.37,99.93 +05/16/2023,18,11,1.2,0.8,14.5,8.42,70.96,34.14,100.44 +05/17/2023,26,13.2,8.6,0,19.6,4.22,74.9,36.72,99.82 +05/18/2023,28.5,15,9.6,0,21.75,3.25,63.29,30.37,100.59 +05/19/2023,26.1,16,3.9,0,21.05,4.51,67.02,40.83,99.76 +05/20/2023,28.7,16,7.2,0,22.35,2.91,74.28,46.53,100.81 +05/21/2023,29.2,18.7,0,0,23.95,3.11,60.34,48.41,99.01 +05/22/2023,32.5,21,8.7,0,26.75,2.92,53.85,33.56,100.81 +05/23/2023,26,16,4.5,0.8,21,5.39,61.22,46.52,99.35 +05/24/2023,33,19,11.4,0,26,2.06,48.73,39.99,99.28 +05/25/2023,28.1,19,5.9,0,23.55,4.31,61.6,35.36,99.9 +05/26/2023,34.2,16.5,6.6,0,25.35,8.16,55.95,46.61,100.48 +05/27/2023,37.2,24,10,0,30.6,3.38,77.61,30.08,100.06 +05/28/2023,33.5,20,11.8,0,26.75,9.83,51.46,36.73,99.11 +05/29/2023,38.5,20,9.2,0,29.25,9.79,44.01,33.74,100.57 +05/30/2023,32.5,21,10.1,0,26.75,4.91,48.61,35.41,99.13 +05/31/2023,35,23,8.3,0,29,6.52,40.57,42.09,99.43 +06/01/2023,29.1,22,3.9,0,25.55,7.34,75.98,44.82,100.82 +06/02/2023,35.9,21,7.2,31.5,28.45,9.51,65.95,47.99,99.89 +06/03/2023,29,16.7,3.1,0,22.85,7.91,50.5,39.57,100.84 +06/04/2023,35.2,18.6,12.9,0,26.9,5.28,41.17,36.81,99.14 +06/05/2023,39,20,11.2,0,29.5,4.83,68.45,39.29,99.24 +06/06/2023,37.7,27,10.9,0,32.35,5.64,41.53,44.44,99.52 +06/07/2023,39,24,8.3,0,31.5,1.9,69.28,34.12,99.44 +06/08/2023,34,24.5,8.9,0,29.25,7.41,78.68,38.81,99.32 +06/09/2023,30.2,22,1.4,0,26.1,2.79,50.33,43.03,100.11 +06/10/2023,33,23,0,0,28,7.5,75.11,33.38,100.46 +06/11/2023,35.2,26,8.3,0,30.6,6.78,46.27,45.1,99.05 +06/12/2023,33.5,23,3.4,2,28.25,9.14,74.98,38.1,100.28 +06/13/2023,28,24,0,1.4,26,3.9,58.69,48.65,99.93 +06/14/2023,32,24.7,1.7,12.4,28.35,1.63,66.31,44.68,100.45 +06/15/2023,32,23,3.4,0,27.5,4.75,61.66,46.35,99.46 +06/16/2023,26.5,23,0.4,0.2,24.75,4.31,41.73,49.29,99.04 +06/17/2023,25,20,0,0.8,22.5,9.71,72.31,42.01,99.05 +06/18/2023,29.2,19,5.3,0,24.1,9.72,71.37,30.08,99.05 +06/19/2023,34,22,6.7,0,28,9.02,64.73,46.03,100.11 +06/20/2023,36.7,23,8.4,0,29.85,1.18,56.97,49.16,99.41 +06/21/2023,36,24,7.6,0,30,1.25,74.87,43.71,100.79 +06/22/2023,35.2,22,9.7,0,28.6,7.37,53.28,39.94,99.83 +06/23/2023,36.2,25,4.8,0,30.6,2.72,45.26,39.3,99.95 +06/24/2023,34.5,26,6.2,0,30.25,2.79,66.54,49.43,99.8 +06/25/2023,29.4,23,1,21.5,26.2,2.09,76.09,31.01,100.33 +06/26/2023,33.5,24,7.3,0,28.75,1.79,64.91,46.27,99.95 +06/27/2023,33.2,25,7.3,0,29.1,3.26,45.95,41.71,100.59 +06/28/2023,37.1,28,0,0,32.55,9.2,56.47,34.73,100 +06/29/2023,37,25,4.4,3.2,31,8.14,78,31.27,100.22 +06/30/2023,37.5,25,7,2.8,31.25,5.95,41.43,36.49,99.14 +07/01/2023,33,24,3.5,0,28.5,3.4,62.12,36.03,100.94 +07/02/2023,31,22,1.7,89.4,26.5,7.26,71.21,31.98,100.3 +07/03/2023,32.7,25.5,8.6,0,29.1,5.68,56.15,39.02,100.37 +07/04/2023,34.2,24,5.9,0,29.1,5.24,71.58,45.69,99.4 +07/05/2023,32,22,0,0,27,9.76,45.97,48.01,100.19 +07/06/2023,32,25,5.1,0,28.5,1.05,45.58,39.77,99.88 +07/07/2023,33.6,25,0,0,29.3,4.55,77.58,43.13,99.59 +07/08/2023,37.2,22,0,0.2,29.6,3.4,79.4,45.64,99.8 +07/09/2023,38.1,27,0,0,32.55,5.31,79.19,39.82,99.35 +07/10/2023,34.2,27,0,0,30.6,3.59,43.31,30.46,100.34 +07/11/2023,31,27.2,0,9.4,29.1,6.25,65.9,34.88,99.66 +07/12/2023,38,27,7.8,0,32.5,2.43,56.2,44.9,100.83 +07/13/2023,37.2,28,9.5,0,32.6,1.54,42.95,41.08,100.96 +07/14/2023,37.5,24,8.2,62.4,30.75,2.57,60.12,43.26,100.52 +07/15/2023,33.5,25,7.2,0,29.25,2.93,59.54,42.33,100.77 +07/16/2023,31.2,26,4.2,0.2,28.6,2.19,48.42,43.57,99.72 +07/17/2023,30.5,24,3.7,0,27.25,5.4,59.25,35.01,100.36 +07/18/2023,27.7,24,0.3,79.4,25.85,9.52,63.33,38.16,100.12 +07/19/2023,26,23,0,127.3,24.5,2.86,65.46,44.33,100.51 +07/20/2023,26,22.7,0,941.3,24.35,2.09,53.25,38.91,100.55 +07/21/2023,27.1,23,0,132.3,25.05,6.34,62.04,46.35,99.78 +07/22/2023,28.2,24,1.6,27.6,26.1,6.88,68.35,44.11,99.86 +07/23/2023,27.6,24,1.6,0.1,25.8,3.75,68.96,35.88,100.55 +07/24/2023,32.5,23,7.1,0,27.75,9.49,40.06,32.16,100.3 +07/25/2023,33.5,24,9.9,0,28.75,4.53,63.44,31.02,99.95 +07/26/2023,34.2,25,0,0,29.6,8.56,77.92,33.44,100.87 +07/27/2023,32.6,26,0,1.5,29.3,7.68,77.57,48.5,100.12 +07/28/2023,30.5,24,4,0.2,27.25,3.82,69.03,41.69,100.83 +07/29/2023,31,22,7.6,0,26.5,9.85,79.53,31.51,99.09 +07/30/2023,36.1,26,9.7,0,31.05,4.47,64.4,37.97,100.24 +07/31/2023,37,27,10.4,0,32,5.22,53.29,30.38,100.54 +08/01/2023,35,26,7.7,0,30.5,4.56,71.01,40.45,99.05 +08/02/2023,33,23.5,9.9,0,28.25,2.51,43.31,38.43,100.28 +08/03/2023,33,25,0,0,29,6.23,68.83,44.82,99.6 +08/04/2023,34.5,25,0,0,29.75,8.11,48.78,46.81,100.8 +08/05/2023,32,22.2,3,0,27.1,9.36,58.44,37.06,100.93 +08/06/2023,34.2,27,9,0,30.6,9.72,52.84,30.27,99.56 +08/07/2023,33,24,0,19.2,28.5,8.29,47.22,33.21,99.28 +08/08/2023,33,25,0,0.3,29,1.59,49.54,37.84,99.08 +08/09/2023,33.7,22,7.6,0.1,27.85,2.48,73.71,38.68,99.25 +08/10/2023,32,22,5.1,0,27,3.05,79.43,46.53,100.43 +08/11/2023,31.9,27,4,0,29.45,8.55,48.06,30.2,99.55 +08/12/2023,29.5,22,0.4,14.1,25.75,9.47,55.56,44.4,99.22 +08/13/2023,26,21,0.1,9.5,23.5,2.74,55.79,31.12,99.91 +08/14/2023,30.2,21,6.2,0.4,25.6,7.89,40.86,41.06,99.59 +08/15/2023,30.5,24,7.2,0,27.25,2.16,75.21,39.88,100.47 +08/16/2023,31.5,23,4.6,0,27.25,6.05,71.66,34.86,99.39 +08/17/2023,32.6,23,5.3,0,27.8,6.25,66.41,40.55,99.13 +08/18/2023,32,26,3.6,0,29,3.91,73.38,46.71,99.13 +08/19/2023,32.5,23,0,4.6,27.75,9.9,51.37,38.53,99.11 +08/20/2023,31.5,22,8.1,4.6,26.75,1.36,75.95,31.59,100.53 +08/21/2023,31,24,5.5,0,27.5,6.34,63.99,33.07,100.97 +08/22/2023,26,20,0,132.6,23,6.08,49.65,35.48,99.48 +08/23/2023,28.2,23,5.3,0,25.6,8.64,60.26,42.36,100.35 +08/24/2023,32.7,17.7,0,0,25.2,5.4,52.72,40.25,100.78 +08/25/2023,31.2,21.1,7.6,0,26.15,4.68,78.77,33.64,100.87 +08/26/2023,27.5,18,0,0,22.75,6.35,63.44,33.89,100.1 +08/27/2023,26.5,19,5.7,0,22.75,3.24,72.02,45,99.24 +08/28/2023,23,19,0.4,66,21,1.05,64.38,41.9,100.37 +08/29/2023,21,20,0,116.3,20.5,1.05,54.93,32.73,99.98 +08/30/2023,22,21,0,58,21.5,3.56,73.46,40.19,100.29 +08/31/2023,24.2,19,0,6,21.6,5.79,71.68,34.2,100.15 +09/01/2023,21.2,18,0,66.9,19.6,8.71,48.16,44.95,100.93 +09/02/2023,30,20,9.5,0,25,2.93,72.9,32.8,100.26 +09/03/2023,28.2,20,0,16.8,24.1,9.35,65.01,36.42,100.65 +09/04/2023,21,19,0,31.8,20,8.92,42.23,38.18,99.61 +09/05/2023,26.5,20,2.9,6.9,23.25,5.75,62.59,48.18,100.83 +09/06/2023,25.2,20,2.6,10.7,22.6,4.33,62.34,36.56,100.78 +09/07/2023,28.2,17,8.3,0,22.6,1.69,51.33,31.64,99.85 +09/08/2023,31,18.2,10,0,24.6,6.59,51.93,45.46,100.44 +09/09/2023,34,20.2,10.2,0,27.1,2.79,45.2,32.69,99.89 +09/10/2023,33.1,21,9.7,0,27.05,1.88,57.12,49.17,100.33 +09/11/2023,34,20,0,0,27,5.6,59.3,37.57,100.64 +09/12/2023,34,20,0,0,27,4.1,79.38,45.85,100.25 +09/13/2023,32,24,8.8,0,28,5.19,58.99,33.97,100.76 +09/14/2023,31,23,7.3,0,27,4.99,51.57,37.29,100.05 +09/15/2023,30,19.7,0,0,24.85,1.54,46.3,38.39,99.36 +09/16/2023,30,21,3.3,0,25.5,5.65,40.82,39.04,99.41 +09/17/2023,23,20,0,12,21.5,7.67,78.59,34.83,99.66 +09/18/2023,20.1,16,0,89,18.05,5.19,74.23,33.71,100.45 +09/19/2023,18.2,15.7,0,71.6,16.95,7.92,53.08,48.33,100.28 +09/20/2023,29.2,17.7,9.9,0,23.45,7.65,62.27,32.1,100.07 +09/21/2023,34,17.2,0,0,25.6,8.23,42.95,42.65,100.18 +09/22/2023,30,22,7.5,0,26,9.57,65.9,40.32,100.92 +09/23/2023,32,21,6.3,0,26.5,2.28,79.94,45.28,100.18 +09/24/2023,24,20,0,88.6,22,8.8,58.11,37.16,100.48 +09/25/2023,21,18,0,17.9,19.5,2.14,57.74,41.31,100.49 +09/26/2023,22,18.5,0,1.7,20.25,10,79.08,35.72,99.12 +09/27/2023,23.5,19,0,6.1,21.25,4.92,48.38,39.65,99.38 +09/28/2023,19.2,12,0,80,15.6,6.04,66.85,36.3,100.27 +09/29/2023,29.5,15.7,9.7,0,22.6,2.16,77.38,35.43,99.65 +09/30/2023,30,17,9.6,0,23.5,6.72,49.93,37.25,99.4 +10/01/2023,22.1,17.8,0,3.2,19.95,1.08,70.52,46.35,99.53 +10/02/2023,17.4,15.7,0,4.4,16.55,9.66,61.16,47.58,99.87 +10/03/2023,22,16,5,2,19,9.64,70.94,31.33,99.97 +10/04/2023,20.1,18.3,0,4.4,19.2,9.62,68.01,41.18,100.96 +10/05/2023,22.3,18,5,2.6,20.15,7.1,79.85,46.64,100.09 +10/06/2023,18.3,13.7,0,9.4,16,4.93,50.22,34.61,100.9 +10/07/2023,21.9,14.1,7,0.8,18,6.45,44.73,31.29,100.29 +10/08/2023,27.2,12.3,8,0,19.75,2.7,55.69,48.82,99.14 +10/09/2023,24.9,16.9,7,0,20.9,5.5,43.2,33.86,100.98 +10/10/2023,24,16.3,6,2,20.15,5.76,47.74,44.67,100.46 +10/11/2023,27.7,14,7,0,20.85,5.24,56.27,38.36,100.78 +10/12/2023,21.7,15.4,5,0.4,18.55,7.12,42.26,46.91,99.92 +10/13/2023,25.3,13.7,7,0,19.5,1.51,50.1,33.24,99.63 +10/14/2023,29.3,14.8,8,0,22.05,4.14,56.77,38.28,100.03 +10/15/2023,31.3,14,7,0,22.65,4.67,62.13,40.38,99.09 +10/16/2023,29.7,15,7,0,22.35,8.4,64.47,41.41,99.63 +10/17/2023,29.8,15.4,7,0,22.6,1.62,76.84,43.33,99.1 +10/18/2023,29.8,16.1,7,0,22.95,1.68,79.63,49.62,100.45 +10/19/2023,20.9,14.7,0,5.8,17.8,1.52,43.45,41.8,100.83 +10/20/2023,25.1,12.2,5,0,18.65,7.09,79.66,48.94,99.68 +10/21/2023,23.9,10.6,6,0,17.25,4.7,40.8,32.73,99.86 +10/22/2023,26.3,11.9,7,0,19.1,7.42,54.65,45.16,99.93 +10/23/2023,27.5,13,7,0,20.25,3,59.8,31.21,99.59 +10/24/2023,30.5,15.9,7,0,23.2,9.33,57.34,39.95,99.7 +10/25/2023,21.3,18.5,2,6.8,19.9,8.68,51.78,47.14,100.71 +10/26/2023,28.6,17,5,0,22.8,5.92,64.15,43.01,99.28 +10/27/2023,23.6,18.1,3,0,20.85,8.16,51.81,37.09,99.02 +10/28/2023,28,17.8,8,0,22.9,1.62,51.25,42.67,100.22 +10/29/2023,28.3,14.4,7,0,21.35,4.03,50.92,41.62,99.99 +10/30/2023,29.5,14,7,0,21.75,5.91,41.06,35.3,100.37 +10/31/2023,29.3,14.3,7,0,21.8,6,46.94,49.03,100.47 +11/01/2023,30.5,15.5,7,0,23,8.61,54.52,38.51,100.74 +11/02/2023,31.2,15.7,7,0,23.45,3.55,41.88,44.52,99.33 +11/03/2023,26.6,13.8,5,3.8,20.2,2.97,41.91,44.92,99.58 +11/04/2023,18.8,13.4,1,3.6,16.1,8.22,46.14,45.93,100.26 +11/05/2023,18.2,13.7,0,18.2,15.95,2.2,58.08,45.51,100.77 +11/06/2023,20.3,9.6,7,0,14.95,5.4,74.51,34.71,99.93 +11/07/2023,24.2,9.8,6,0.8,17,6.35,51.79,31.34,100.58 +11/08/2023,25.8,13,6,0,19.4,8.04,44.42,44.29,99.96 +11/09/2023,20.1,13.5,2,7.4,16.8,4.62,45.16,42.59,100.13 +11/10/2023,13.2,7.1,0,0.4,10.15,7.7,52.78,46.72,99.69 +11/11/2023,7.1,4.3,0,6.2,5.7,2.11,72.6,48.98,99.43 +11/12/2023,11.8,5.4,4,0,8.6,6.06,44.39,38.74,100.82 +11/13/2023,14.8,5.2,6,0,10,8.52,63.32,32.84,100.28 +11/14/2023,18.5,3.3,5,0,10.9,5.33,47.36,48.86,100.35 +11/15/2023,13.4,9.6,0,2.8,11.5,2.11,46.36,34.33,99.61 +11/16/2023,19.9,6.6,6,0,13.25,6.64,67.61,32.3,99.09 +11/17/2023,23.1,5.2,5,0,14.15,9.51,46.3,35.43,99.33 +11/18/2023,20.3,6.6,5,0,13.45,6.08,70.12,37.83,99.7 +11/19/2023,25,7.5,5,0,16.25,3.22,61.34,31.1,100.07 +11/20/2023,24.6,8.4,5,0,16.5,2.87,78.79,36.8,100.26 +11/21/2023,23.3,9.4,6,0,16.35,3.6,68.12,31.65,100.31 +11/22/2023,25,11.9,6,0,18.45,8.19,74.54,41.77,99.4 +11/23/2023,22.5,10.6,6,0,16.55,7.97,71.53,39.44,99.86 +11/24/2023,15.3,9.1,6,0,12.2,5.24,48.8,43.49,100.4 +11/25/2023,10.8,3.8,2,5.6,7.3,6.93,69.71,44.3,99.58 +11/26/2023,14.7,3.4,5,0,9.05,7.96,72.15,33.34,100.28 +11/27/2023,19.4,4.4,6,0,11.9,6.94,58.23,44.81,100.56 +11/28/2023,19.3,6.9,4,0,13.1,8.5,67.91,44.76,100.71 +11/29/2023,14,9,0,0,11.5,5.43,56.95,36.59,100.75 +11/30/2023,8.6,3.4,0,0,6,9.38,68.36,45.43,99.21 +12/01/2023,12,0.5,6,0,6.25,1.02,67.12,34.11,99.67 +12/02/2023,15.3,3.5,5,0,9.4,4.63,72.06,33.89,100.77 +12/03/2023,15,4.7,2,0,9.85,6.17,75.97,32.05,100.17 +12/04/2023,18.5,6.1,6,0,12.3,4.48,51.66,40.93,100.52 +12/05/2023,21.3,4.5,5,0,12.9,3.62,45.99,39.3,99.39 +12/06/2023,23.8,7.8,5,0,15.8,1.58,40.68,43.8,99.79 +12/07/2023,25,5.8,5,0,15.4,4.85,43.32,39.57,100 +12/08/2023,22,7.6,4,0,14.8,2.12,63.96,39.38,99.9 +12/09/2023,23,12.8,4,0,17.9,9.95,63.48,39.17,99.36 +12/10/2023,16.8,5.5,0,12.2,11.15,5.05,45.94,32.38,100.54 +12/11/2023,5.5,2.9,3,11.2,4.2,2.93,53.53,48.03,100.4 +12/12/2023,8.7,3,4,0,5.85,7.86,69.79,48.84,100.28 +12/13/2023,7.7,5,0,0,6.35,1.72,46.79,31.83,99.69 +12/14/2023,5.3,2.4,0,11.6,3.85,6.63,57.13,41.49,100.23 +12/15/2023,4.4,1.7,0,13,3.05,5.49,41.19,39.79,99.39 +12/16/2023,3.8,1.3,0,0,2.55,3.16,68.79,34.78,100.6 +12/17/2023,2.3,0.7,0,0,1.5,1.16,72.16,37.7,100.14 +12/18/2023,6.7,-1,5,0,2.85,7.71,63.74,40.06,99.8 +12/19/2023,10.6,-2.8,5,0,3.9,5.62,55.34,43.59,100.7 +12/20/2023,7.1,0,6,0,3.55,4.32,42.08,45.56,100.9 +12/21/2023,6.8,-1.4,5,0,2.7,7.74,44.45,38.41,100.94 +12/22/2023,6,-2.8,4,0,1.6,1.19,64.23,39.36,99.68 +12/23/2023,9.8,-2.9,5,0,3.45,2.67,64.58,33.99,100.28 +12/24/2023,12.2,-0.8,5,0,5.7,2.24,72.79,44.68,99.21 +12/25/2023,13,-1.2,5,0,5.9,7.69,46.76,36.61,100.4 +12/26/2023,14.9,2.8,5,0,8.85,7.09,47.07,38.68,100.54 +12/27/2023,11.8,2.5,5,0,7.15,6.46,59.39,31.01,99.08 +12/28/2023,11.8,3.8,5,0,7.8,1.82,67.51,48.56,100.72 +12/29/2023,9.5,6.1,0,1.2,7.8,6.62,43.41,46.83,99.81 +12/30/2023,8.1,3.4,0,0,5.75,9.72,59.13,40.03,99.84 +12/31/2023,15.7,4.2,5,0,9.95,3.91,60.39,42.71,100.98 +01/01/2024,12.3,2.9,5,2,7.6,7.26,75.09,45.19,99.27 +01/02/2024,9,4.8,1,8.2,6.9,8,43.13,39.02,100.27 +01/03/2024,8.6,3.8,4,0,6.2,7.58,47.47,37.5,100.26 +01/04/2024,14.4,4.3,5,0,9.35,9.07,53.01,49.84,99.23 +01/05/2024,15.1,3.9,5,0,9.5,1.88,59.53,33.03,99.83 +01/06/2024,15.6,7.2,5,0,11.4,1.46,47.75,49.15,99.41 +01/07/2024,10.7,5.4,4,1.2,8.05,7.98,48.41,33.12,100.67 +01/08/2024,11.3,3.9,6,0,7.6,7.27,56.07,46.75,100.81 +01/09/2024,15.1,2,6,0,8.55,5.79,54.57,31.6,99.17 +01/10/2024,15,3.5,6,0,9.25,1.97,73.38,32.66,100.55 +01/11/2024,17.3,2.6,5,0,9.95,8.92,51.81,30.76,99.2 +01/12/2024,21.3,4,5,0,12.65,5.36,65.82,35.64,100.47 +01/13/2024,20.8,6,6,0,13.4,6.45,61.37,36.28,99.17 +01/14/2024,15.6,8.7,5,0,12.15,4.89,74.45,48.4,99.34 +01/15/2024,8.5,3,1,0.4,5.75,4.92,56.55,45.11,100.31 +01/16/2024,2.9,1.7,0,17,2.3,2.53,77.12,45.6,100.35 +01/17/2024,4.8,2.1,0,10,3.45,8.89,54.92,32.47,99.63 +01/18/2024,5.4,2,0,19.4,3.7,5.47,55.41,31.54,99.26 +01/19/2024,2.1,0.2,0,7.2,1.15,7.53,79.79,34,99.56 +01/20/2024,7,-0.1,5,0.4,3.45,5.23,79.25,30.52,100.62 +01/21/2024,5,0,1,0,2.5,5.63,48.07,33.08,99.76 +01/22/2024,2.5,-3.5,7,0,-0.5,5.39,55.55,42.66,100.5 +01/23/2024,5,-6,6,0,-0.5,3.01,48.73,42.85,99.06 +01/24/2024,8.9,-5.2,6,0,1.85,4.73,53.32,35.57,100.03 +01/25/2024,10.8,-3.3,5,0,3.75,6.77,58.8,33.54,100.02 +01/26/2024,12.6,2.2,6,0,7.4,1.52,74.84,48.67,99.71 +01/27/2024,14.3,-0.2,5,0,7.05,8.69,70.46,41.11,99.7 +01/28/2024,14.8,-0.6,5,0,7.1,8.1,47.08,40.63,100.29 +01/29/2024,16,6.2,6,0,11.1,1.26,52.56,32.96,100.92 +01/30/2024,11.1,2.9,4,0,7,2.18,63.02,38.28,99.01 +01/31/2024,10.6,5.8,0,0,8.2,1.43,44.51,38.5,99.54 +02/01/2024,5.4,-1.6,0,17.2,1.9,1.15,66.99,45.08,100.05 +02/02/2024,-1.7,-2.6,0,1.4,-2.15,5.78,64.45,39.62,99.12 +02/03/2024,0.5,-3.1,5,0,-1.3,1.02,69.05,48.86,100.89 +02/04/2024,1.3,-3.1,2,0,-0.9,2.3,53.26,31.62,99.84 +02/05/2024,1.2,-4.2,2,0,-1.5,3.61,58.7,41.29,100.31 +02/06/2024,2.1,-0.4,2,0,0.85,7.07,51.74,35.24,100.31 +02/07/2024,4.7,1.6,5,0,3.15,6.85,41.53,39.47,100.59 +02/08/2024,10.1,-1.5,7,0,4.3,6.49,67.96,41.76,100.32 +02/09/2024,14.6,-1.3,6,0,6.65,8.6,59.07,48.48,100.04 +02/10/2024,18.1,-1.1,7,0,8.5,5.47,51.07,42.12,99.99 +02/11/2024,18.8,1.9,7,0,10.35,4.47,58.51,46.18,99.37 +02/12/2024,20.7,4.9,7,0,12.8,5.11,78.25,44.91,100 +02/13/2024,22.6,6.5,7,0,14.55,2.95,53.59,35.83,99.64 +02/14/2024,22.2,9.6,6,4.2,15.9,1.08,64.48,43.85,99.72 +02/15/2024,13.4,6.1,6,5.8,9.75,2.77,57.61,39.8,100.3 +02/16/2024,17.7,2.9,7,0,10.3,4.4,56.18,33.8,99.38 +02/17/2024,19.7,6.1,7,0,12.9,8.78,46.85,41.01,100.14 +02/18/2024,25.2,11.1,7,0,18.15,8.25,50.13,32.11,100.27 +02/19/2024,17,5.7,0,1.6,11.35,4.67,56.36,36.79,99.76 +02/20/2024,5.2,-0.3,0,15,2.45,1.02,67.36,39.38,100.38 +02/21/2024,-0.9,-3.4,0,0.4,-2.15,6.87,77.72,49.63,99.89 +02/22/2024,-0.6,-3.8,5,0.4,-2.2,8.27,53.98,43.41,99.72 +02/23/2024,-0.1,-3.3,1,0,-1.7,4.78,53.3,37.13,100.03 +02/24/2024,4,-2.2,6,0,0.9,9.28,59.26,48.98,99.66 +02/25/2024,8.3,-2.2,7,0,3.05,4.18,54.04,38.92,99.88 +02/26/2024,7.7,3.4,5,0,5.55,8.07,76.59,39.32,100.58 +02/27/2024,11.9,0.7,7,0,6.3,5.03,56.4,44.27,100.21 +02/28/2024,9.8,3.4,5,0,6.6,9.68,52.78,31.4,100.03 +02/29/2024,9.9,4.5,6,0,7.2,9.68,52.78,31.4,100.03 +03/01/2024,10.2,4,8,0,7.1,1.49,44.61,35.77,99.8 +03/02/2024,14.7,2,7,0,8.35,6.62,40.59,43.17,100.22 +03/03/2024,12.1,4,5,0,8.05,2.33,65.78,36.32,99.95 +03/04/2024,10,8.1,0,0,9.05,6.58,41.71,33.82,100.07 +03/05/2024,13.7,8.7,4,0,11.2,5.54,60.41,43.08,100.13 +03/06/2024,14.7,8.7,7,0,11.7,6.72,53.72,34.9,100.17 +03/07/2024,19.2,7.9,8,0,13.55,3.65,42.64,49.61,100.27 +03/08/2024,17.8,7.5,7,0,12.65,2.66,77.86,37.3,99.31 +03/09/2024,18.9,8.3,7,0,13.6,5.82,58.37,46.24,99.61 +03/10/2024,17.8,5.3,4,0,11.55,2.72,53.04,48.93,99.14 +03/11/2024,25.5,6.9,6,0,16.2,5.59,47.24,40.86,100.17 +03/12/2024,23.8,10.1,6,0,16.95,8.1,67.73,30.73,99.02 +03/13/2024,17.8,12.6,3,1.6,15.2,4.18,77.28,42.62,99.05 +03/14/2024,23.6,7.7,7,0,15.65,6.89,71.68,34.26,100.04 +03/15/2024,19.4,12.3,6,0,15.85,2.16,41.39,43.05,99.41 +03/16/2024,23.4,13.9,7,0.4,18.65,6.97,52.34,35.02,100.32 +03/17/2024,17.2,15,0,0.8,16.1,8.78,67.28,38.75,100.27 +03/18/2024,11.3,7.6,0,12,9.45,7.83,72.97,34.78,100.31 +03/19/2024,20,10,3,0,15,5.2,59.17,46.13,100.61 +03/20/2024,23.8,12.2,3,0,18,8.71,50.12,38.77,99.21 +03/21/2024,24.8,10.2,8,0,17.5,4.15,76.25,32.7,99.82 +03/22/2024,26.8,11.2,8,0,19,4.77,58.98,34.24,99.56 +03/23/2024,22,14.8,4,3.2,18.4,7.52,62.75,38.13,99.12 +03/24/2024,15.2,12.6,0,13.4,13.9,1.68,77.43,42.49,99.23 +03/25/2024,16.8,9.2,7,17,13,1.57,75.97,40.1,99.32 +03/26/2024,21.7,8,8,0,14.85,7.38,68.99,44.44,99.87 +03/27/2024,16.7,13.5,3,1.8,15.1,3.97,46.45,44.44,100.42 +03/28/2024,28.2,12,9,0,20.1,1.31,79.32,36.16,99.36 +03/29/2024,31.1,12.6,8,0,21.85,4.06,41.35,41.33,99.41 +03/30/2024,30.9,15.2,7,0,23.05,3.54,49.3,30.68,99.9 +03/31/2024,30.1,17.4,8,0,23.75,2.05,42.83,46.27,100.1 +04/01/2024,26.4,18,7,1,22.2,8.45,69.43,31.57,100.46 +04/02/2024,20.8,14.8,4,3.6,17.8,1.72,46.72,40.95,99.34 +04/03/2024,20.1,14.3,4,1,17.2,7.75,60.04,41.2,99.18 +04/04/2024,18.5,11.8,8,0,15.15,6.52,57.38,49.93,100.03 +04/05/2024,16.1,11,2,3,13.55,8.52,40.36,34.21,100.6 +04/06/2024,20,11.2,7,0,15.6,1.3,77.61,30.98,100.38 +04/07/2024,23.9,12.5,7,0,18.2,7.48,50.71,44.15,100.42 +04/08/2024,26.4,12.5,7,0,19.45,9.25,75.37,42.5,99.09 +04/09/2024,24.2,14.4,6,0,19.3,5.11,76.87,35.75,100.45 +04/10/2024,19.6,15.7,2,2,17.65,5.09,60.43,39.67,100.18 +04/11/2024,21,13.9,3,0,17.45,5.84,72.81,33.44,100.81 +04/12/2024,26.2,14.9,9,0,20.55,5.12,78.43,30.2,100.88 +04/13/2024,26.6,15.9,6,0,21.25,8.94,52.71,43.18,99.93 +04/14/2024,31.2,18.5,8,0,24.85,1.05,50.65,49.13,99.58 +04/15/2024,31.1,18,8,0,24.55,7.64,48.01,31.68,99.23 +04/16/2024,23.7,18.9,3,3.6,21.3,7.66,68.76,35.17,99.92 +04/17/2024,27.4,16.8,9,0,22.1,5.94,42.09,33.28,100.59 +04/18/2024,27.5,13.6,9,0,20.55,4,51.32,42.72,99.22 +04/19/2024,20.5,16.6,2,13.6,18.55,9.66,45.04,35.06,99.23 +04/20/2024,27.6,15.2,8,0,21.4,2.76,64.23,38.15,100.36 +04/21/2024,28.5,18.9,9,0,23.7,1.69,50.51,44.88,100.85 +04/22/2024,27.3,17.3,6,1.6,22.3,9.36,57.37,34.42,99.77 +04/23/2024,30,15.3,9,0,22.65,5.64,62.58,38.91,99.64 +04/24/2024,28.5,16.3,10,0,22.4,2.93,72.09,36.56,100.91 +04/25/2024,30.8,16.6,10,0,23.7,1.24,64.06,38.35,100.04 +04/26/2024,31.1,17.3,10,0,24.2,6.35,58.46,41.77,100.09 +04/27/2024,31.1,18.4,9,0,24.75,2.66,78.87,47.66,99.21 +04/28/2024,28.4,20.2,9,1.4,24.3,2.27,72.02,46.51,99.47 +04/29/2024,23.7,17.4,4,4.4,20.55,4.84,64.98,47.2,100.25 +04/30/2024,17.4,12.7,1,36.6,15.05,2.76,53.28,37.47,99.74 +05/01/2024,23.4,12.5,9,0.4,17.95,3.15,51.32,42.75,99.2 +05/02/2024,21.6,13.5,7,1,17.55,5.35,60.83,43.74,100.24 +05/03/2024,17.8,14.8,0,9,16.3,7.58,69.67,49.94,99.49 +05/04/2024,20.3,14,7,2.6,17.15,4.8,42.37,46.84,99.19 +05/05/2024,26.2,15.3,10,0,20.75,2.6,79.5,42.12,99.44 +05/06/2024,32.3,16.9,9,0,24.6,8.97,76.73,43.91,99.08 +05/07/2024,32.7,21,8,0,26.85,3.32,56.4,35.46,99.75 +05/08/2024,33.4,21.7,9,0,27.55,7.68,71.87,43.07,100.04 +05/09/2024,31.3,19.8,9,0,25.55,8.46,40.19,47.51,100 +05/10/2024,27.3,19.1,8,0.4,23.2,8.23,40.49,46.29,99.15 +05/11/2024,29.4,21.1,5,0.8,25.25,6.26,63.1,39.32,100.92 +05/12/2024,33.8,18.5,8,0,26.15,1.44,53.65,39.73,100.1 +05/13/2024,33.1,17.9,9,0,25.5,8.56,67.32,31.01,99.87 +05/14/2024,34.8,19.7,8,0,27.25,9.25,51.51,34.82,99.13 +05/15/2024,29.4,20.7,10,0,25.05,5.4,44.29,38.69,99.13 +05/16/2024,31.9,17,10,0,24.45,8.57,70.75,40.24,100.75 +05/17/2024,35.8,20.4,10,0,28.1,7.15,46.56,42,100.22 +05/18/2024,32.1,22.3,9,0,27.2,8.22,77.9,34.46,99.62 +05/19/2024,27,20.7,4,9.8,23.85,1.1,75.7,47.6,100.77 +05/20/2024,27.3,20.8,6,1.8,24.05,9.27,70.27,35.67,99.67 +05/21/2024,32.1,22.2,9,0,27.15,7.12,62.39,35.32,99.66 +05/22/2024,33,19.4,10,0,26.2,8.72,55.91,33.3,100.03 +05/23/2024,33.7,20.7,10,0,27.2,1.84,53.86,38.65,100.71 +05/24/2024,35.6,23,10,0,29.3,8.07,44.28,49.56,99.62 +05/25/2024,36.8,25.3,10,0,31.05,9.51,71.55,38.41,99.01 +05/26/2024,29.5,25.6,5,0,27.55,4.89,79.31,31.23,99.15 +05/27/2024,32.1,23.4,10,0,27.75,8.74,76.96,40.71,99 +05/28/2024,33.7,20,9,0,26.85,1.55,68.22,46.22,100.06 +05/29/2024,27.9,19.3,6,3,23.6,9.26,65.15,48.88,100.44 +05/30/2024,24.4,18.8,7,1,21.6,3.97,75.17,36.21,99.27 +05/31/2024,30.7,20.7,10,0,25.7,2.07,75.83,46.75,100.23 +06/01/2024,35,21.6,10.4,0,28.3,8.32,45.9,47.16,100.2 +06/02/2024,37,24.7,9.4,0,30.85,9.34,42.91,38.83,100.09 +06/03/2024,36,26,8.3,0,31,4.05,56.24,47.76,99.71 +06/04/2024,30,22,0.2,0.4,26,8.5,51.06,38.12,100.85 +06/05/2024,37,23,9.7,0,30,3.26,41.31,31.46,100.03 +06/06/2024,36,23,12,0,29.5,9.29,48.98,48.53,99.05 +06/07/2024,33.5,23,8.6,0,28.25,5.02,53.44,36.03,99.01 +06/08/2024,37,25,7,0,31,6.42,77.49,45.39,99.41 +06/09/2024,34,21,4.9,8.5,27.5,4.13,50.59,45.44,99.39 +06/10/2024,29.6,21,5,1.1,25.3,9.59,79.7,38.62,100.26 +06/11/2024,34,24,9.2,0,29,2.22,64.3,39.27,100.72 +06/12/2024,30,20.2,2.3,0,25.1,1.92,65.95,48.21,99.27 +06/13/2024,37,19,9.7,0.2,28,4.93,56.58,39.88,100.3 +06/14/2024,34.9,21,11.4,0,27.95,6.52,52.49,32.43,99.11 +06/15/2024,36,24,10.4,0,30,3.99,64.5,31.45,99.44 +06/16/2024,40,28,10.1,0,34,3.1,40.57,33.97,100.59 +06/17/2024,40.1,25,10.4,0,32.55,8.59,76.25,47.72,100.84 +06/18/2024,37.3,26,9.6,0,31.65,9.94,40.62,34.62,99.03 +06/19/2024,37,25,8,0,31,1.12,42.99,31.54,99.37 +06/20/2024,38.4,26,9.7,0,32.2,7.16,79.02,44.69,100.81 +06/21/2024,37,28,8.1,0,32.5,1.59,78.38,48.62,100.5 +06/22/2024,38.9,27,8.3,2,32.95,5.87,79.75,32.15,100.18 +06/23/2024,37.3,27,7.1,4.3,32.15,2.5,64.8,39.46,99.73 +06/24/2024,41.6,28,10.8,0,34.8,4.5,58.55,48.59,99.59 +06/25/2024,39.8,30,10.3,0,34.9,4.37,73.51,42.58,99.97 +06/26/2024,34.3,25,0.8,2,29.65,4.83,46.27,32.69,100.89 +06/27/2024,29.3,24,1.4,22.5,26.65,2.56,67.03,40.45,99.42 +06/28/2024,39,24,10.7,0,31.5,7.99,46.99,38.46,100.45 +06/29/2024,33.9,23,8.9,0,28.45,7.39,77.32,38.16,99.89 +06/30/2024,32,24,6.5,4,28,2.43,75.21,31.44,99.37 +07/01/2024,34,25.7,6.9,14,29.85,5.58,53.65,35.32,100.57 +07/02/2024,36,24,4.7,10,30,3.37,51.11,33.35,100.98 +07/03/2024,30,24,3.1,13,27,1.16,41.56,34.79,99.27 +07/04/2024,34,25,6.2,0,29.5,3.29,47.79,36.52,100.62 +07/05/2024,28,24,0.4,35.8,26,9.15,47.8,35.56,100.03 +07/06/2024,33.5,24,7.9,0,28.75,3.75,43.03,36.8,100.17 +07/07/2024,36.4,24.5,12.1,0,30.45,6.64,52.26,43.73,100.76 +07/08/2024,36.4,27,11.5,0,31.7,3.16,44.25,42.29,100.91 +07/09/2024,36.2,26,8.7,0,31.1,7.87,76.14,46.54,100.67 +07/10/2024,28,23,3,0,25.5,1.76,50.23,33.3,99.91 +07/11/2024,26,23.9,0,0,24.95,4.41,55.04,42.39,99.84 +07/12/2024,26.3,23.9,0.3,0,25.1,3.79,49.15,45.11,100.18 +07/13/2024,30,25,1.5,0,27.5,8.02,78.29,31.96,100.76 +07/14/2024,35.9,28,7.5,0,31.95,3.57,67.86,48.22,99.93 +07/15/2024,32.1,27,2.5,24,29.55,8.66,76.72,35.1,100.87 +07/16/2024,31,23,0.5,4.4,27,2.76,67.55,34.47,100.29 +07/17/2024,35.5,24,10.4,0,29.75,5.77,42.28,34.78,100.15 +07/18/2024,35.1,26.9,7.3,0,31,5.73,53.85,42.65,99.28 +07/19/2024,28,19,0,35,23.5,6.51,54.03,35.36,100.43 +07/20/2024,27.4,21,2.3,27.1,24.2,3.41,45.02,45,100.56 +07/21/2024,34.7,24,11,0,29.35,6.98,47.7,45.2,99.58 +07/22/2024,26.1,21,0,176,23.55,8.36,74.69,42.94,99.31 +07/23/2024,32,22,10,0,27,1.26,57.95,48.24,100.54 +07/24/2024,34.1,24,11.7,0,29.05,7.25,77.09,36.16,99.59 +07/25/2024,34.1,22,8.3,90.5,28.05,3.29,54.58,40.89,99.37 +07/26/2024,31.8,25,6.8,0,28.4,3.16,55.95,38.64,99.77 +07/27/2024,31.3,23,1.5,52.2,27.15,3.18,67.15,38.17,99.16 +07/28/2024,30,22.6,5.4,0,26.3,5.31,66.7,49.75,99.95 +07/29/2024,30.9,25,8.9,0,27.95,5.26,62.47,33.54,99.64 +07/30/2024,32,25,7.5,0,28.5,3.04,43.73,44.45,99.14 +07/31/2024,32.2,25,7.3,0,28.6,2.89,41.42,33.41,100.46 +08/01/2024,34.1,26,8.8,0,30.05,2.53,77.42,30.25,100.29 +08/02/2024,34.7,27,8,0,30.85,6.82,61.11,48.85,100.95 +08/03/2024,36.1,28,8.3,0,32.05,3.69,50.49,36.82,100.16 +08/04/2024,37,29,9.3,0,33,2.83,40.2,47.87,99.6 +08/05/2024,37,29,9.3,0,33,4.57,55.12,32.05,100.76 +08/06/2024,37,29,10,0,33,5.44,65.05,35.08,100.75 +08/07/2024,35.5,29,7,0,32.25,8.31,62.96,34.36,99.58 +08/08/2024,36,25,4.4,76,30.5,9.08,75.63,35.39,99.5 +08/09/2024,27,21,2.3,0.4,24,2.29,70.04,34.89,100.65 +08/10/2024,27,21.7,2.6,0,24.35,3.9,68.45,40.34,99.63 +08/11/2024,34,26,6.5,0,30,6.47,55.74,31.58,99.5 +08/12/2024,37,30,9.8,0,33.5,5.51,48.04,46.88,99.4 +08/13/2024,38,27,8.9,0,32.5,9.27,71.16,30.48,99.77 +08/14/2024,35.4,29,6,0,32.2,3.54,40.72,47.06,99.46 +08/15/2024,38,29.6,5.6,0,33.8,4,71.52,45.9,100.52 +08/16/2024,31,25,0.1,0,28,1.6,46.81,47.5,99.99 +08/17/2024,33,27,4.7,0,30,4.31,48.14,39.87,100.47 +08/18/2024,37,29,7.1,0,33,7.76,65.52,35.58,99.86 +08/19/2024,36,28,6.1,0,32,9.31,67.72,43.26,100.94 +08/20/2024,34,25,7.1,0,29.5,8.37,55.15,46.16,99.44 +08/21/2024,37,27.7,7,0,32.35,3.52,47.74,35.03,99.8 +08/22/2024,38,26,3.4,0,32,5.29,65.77,45.24,100.14 +08/23/2024,32,22.7,7.3,0,27.35,1.8,48.36,45.01,100.07 +08/24/2024,32,23,8.8,1.4,27.5,2.23,76.5,37.62,99.25 +08/25/2024,27,21,0,9.5,24,7.47,60.68,32.31,99.33 +08/26/2024,29,18,1.6,0.2,23.5,4.52,68.53,47.5,100.73 +08/27/2024,22,17,0,4.6,19.5,3.39,52.73,49.02,99.41 +08/28/2024,18.9,16,0,22.8,17.45,2.5,40.71,31.28,99.31 +08/29/2024,22.1,17,0,13.6,19.55,5.86,68.37,33.83,100.87 +08/30/2024,22.6,17.5,0.8,9.3,20.05,2.94,71.64,32.16,100.97 +08/31/2024,29.4,18,7.9,0,23.7,7.47,75.69,45.25,99.2 +09/01/2024,30,19.5,9.7,0,24.75,6.66,57,40.55,100.21 +09/02/2024,29,20.5,7.8,0,24.75,2.04,74.63,33.94,99.56 +09/03/2024,28,17,2.1,0,22.5,3.38,42.84,42.66,100.32 +09/04/2024,31.3,18,8.7,0,24.65,4.3,60.3,38.95,99.69 +09/05/2024,34.8,19,9.4,0,26.9,8.85,78.34,41.66,99.42 +09/06/2024,35.2,19,9.8,0,27.1,1.44,67.91,49.62,100.06 +09/07/2024,33.4,19,9.3,0,26.2,1.24,42.65,30.04,99.35 +09/08/2024,32.3,22,6.2,0,27.15,6,53.77,45.05,99.15 +09/09/2024,26,20,0.1,1.2,23,5.15,74.57,45.63,99.17 +09/10/2024,25,16,2.7,5,20.5,3.17,51.86,31.68,100.38 +09/11/2024,31,17,7.4,0,24,2.03,66.54,34.87,99.49 +09/12/2024,31.8,18.7,7.8,0,25.25,8.4,79.13,36.8,100.26 +09/13/2024,30.2,21,7.1,0,25.6,2.69,74.23,41.58,99.86 +09/14/2024,28,22,7.4,0,25,7.67,69.14,36.56,100.64 +09/15/2024,30,18,6.3,0,24,8.14,64.54,40.55,100.63 +09/16/2024,31.4,18,8.6,0,24.7,3.91,73.55,31.1,100.98 +09/17/2024,32.8,20,7.7,0,26.4,6.69,63.57,45.31,100.36 +09/18/2024,33,23,8.2,0,28,7.9,51.5,30.45,100.11 +09/19/2024,28,20,4.3,0,24,5.09,66.85,32.09,100.62 +09/20/2024,23.5,18,2.4,0,20.75,5.67,68.91,36.85,100.82 +09/21/2024,27,16.1,7.3,0,21.55,2.84,76.81,37.9,100.92 +09/22/2024,32,18,8.3,0,25,1.4,68.62,36.98,100.24 +09/23/2024,24.6,13,8.3,0,18.8,7.06,63.19,35.02,100.92 +09/24/2024,23.4,10,2.4,0,16.7,4.17,44.93,30.7,99.35 +09/25/2024,28.7,13,7.4,0,20.85,6.63,61.35,32.84,99.77 +09/26/2024,29.9,17,9.3,0,23.45,2.61,56.21,44.44,99.22 +09/27/2024,25.7,14,2.2,16,19.85,8.05,55.65,36.85,99.94 +09/28/2024,31.2,15,8.5,0,23.1,1.21,64.76,48.24,99.29 +09/29/2024,32.6,19,8.4,0,25.8,8.56,61.1,48.85,100.52 +09/30/2024,28.9,21,2.7,11.6,24.95,5.4,53.26,33.55,99.83 +10/01/2024,27,21,1.7,0,24,9.17,51.49,47.71,99.93 +10/02/2024,23.1,20,0.3,0,21.55,5.21,66.35,45.9,99.13 +10/03/2024,21.5,10,0,48.1,15.75,6.99,62.26,30.23,99.08 +10/04/2024,10.5,7,0,28.2,8.75,2.19,41.15,44.58,99.34 +10/05/2024,10.3,7,0,18.8,8.65,6.98,66.29,35.18,99.72 +10/06/2024,12.1,6.6,0,0,9.35,6.28,71.56,47.81,100.97 +10/07/2024,16,9.2,3.8,0,12.6,8.63,46.89,37.44,100.53 +10/08/2024,17,10.3,3.2,0,13.65,9.68,48.51,31.49,99.85 +10/09/2024,16.8,2,6.2,0,9.4,7.59,72.59,36.85,100.75 +10/10/2024,21,4,10.3,0,12.5,4.48,47.7,30.76,99.33 +10/11/2024,21.2,5,9.5,0,13.1,1.22,57.08,37.48,100.33 +10/12/2024,20,8.7,5.5,0,14.35,9.83,61.25,49.37,99.16 +10/13/2024,20.6,13,3.5,0,16.8,6.3,64.02,36.17,99.49 +10/14/2024,22,13,2.4,0,17.5,4.03,70.29,30.09,99.02 +10/15/2024,24,14,3.5,0,19,3.15,47.87,41.28,99.57 +10/16/2024,25,13,3.5,0,19,4.66,49.56,31.88,99.03 +10/17/2024,19.3,6,9.7,0,12.65,5.59,51.81,31.32,100.21 +10/18/2024,20.4,6,8.7,0,13.2,4.76,50.72,42.65,99.85 +10/19/2024,21.5,9,8.2,0,15.25,5.49,46.19,35.41,100.42 +10/20/2024,21.5,8.8,6.9,0,15.15,8.49,41.81,34.6,100.6 +10/21/2024,25,9,7.1,0,17,7.73,74.26,39.17,99.76 +10/22/2024,26.4,9,6.7,0,17.7,6.9,57.92,38.1,100.04 +10/23/2024,24,8,6.7,0,16,9.02,60.96,38.8,99.92 +10/24/2024,23,9,5.8,0,16,1.49,54.39,30.17,99.67 +10/25/2024,21.3,10.9,4.7,0,16.1,3.36,63.22,37.69,100.89 +10/26/2024,18,10,1.6,0.4,14,4.78,62.33,38.14,99.77 +10/27/2024,19,11,4.1,0,15,7.32,71.5,48.74,99.54 +10/28/2024,18,11.9,2.4,0,14.95,5.03,46.74,43.85,99.01 +10/29/2024,19,12.7,2.4,0.8,15.85,6.05,63.89,44.93,99.4 +10/30/2024,19,9,1.4,0.2,14,5.4,50.96,48.86,100.01 +10/31/2024,22,9,4.9,0,15.5,5.72,61.83,48.38,99.59 +11/01/2024,20.2,9,4,0,14.6,2.94,68.27,44.75,99.81 +11/02/2024,21,10,6.2,0,15.5,3.07,52.94,49,99.26 +11/03/2024,13.9,9,0.2,0,11.45,5.07,67.88,40.02,100.06 +11/04/2024,15.3,6,5.8,0,10.65,7.07,43.1,35.61,100.68 +11/05/2024,18,9.4,5.6,0.4,13.7,4.71,66.91,35.68,100.1 +11/06/2024,21,9,5.8,0,15,5.2,79.81,39.77,99.76 +11/07/2024,18.2,7.8,4.9,0,13,3.31,49.62,44.35,99.25 +11/08/2024,18,10,2.3,0,14,4.32,73.11,44.18,100.2 +11/09/2024,18,10,1,4.2,14,2.6,48.41,44.37,100.71 +11/10/2024,17,13,0.7,5.9,15,5.75,73,31.57,100.56 +11/11/2024,15,12,0,1.9,13.5,7.85,46.41,41.19,100.63 +11/12/2024,14,7,0,0.4,10.5,4.59,57.92,32.19,99.87 +11/13/2024,10.1,4,1.7,0,7.05,5.61,77.86,42.79,99.03 +11/14/2024,16.2,2,7,0,9.1,3.95,75.71,40.87,100.85 +11/15/2024,19.9,4,8.1,0,11.95,8.97,56.29,48.85,99.1 +11/16/2024,16,2,2.9,0,9,4.53,53.65,34.03,99.54 +11/17/2024,18,5,7.1,0,11.5,1.33,76.41,35.13,99.28 +11/18/2024,12.8,9,0,0.6,10.9,3.15,72.5,34.23,100.31 +11/19/2024,17.7,6,4.5,0,11.85,7.1,58.7,36,100.53 +11/20/2024,13,9,0.2,0,11,5.35,55.82,31.15,100.84 +11/21/2024,12.2,9,0,15,10.6,1.93,75.93,43.51,99.18 +11/22/2024,11.6,3,0.6,0.5,7.3,6.98,40.16,46.57,100.57 +11/23/2024,16.2,5.5,4.4,0,10.85,2.14,70.42,46.39,100.12 +11/24/2024,18.3,6,6.2,0,12.15,9.91,66.63,40.85,100.59 +11/25/2024,22,6.7,7.4,0,14.35,3.48,47.18,50,100.66 +11/26/2024,10,6,5.1,0,8,1.81,59.6,31.3,100.95 +11/27/2024,7,3,0,2.2,5,3.04,63.6,44.68,99.81 +11/28/2024,11.3,5,0.1,0.9,8.15,9.07,42.75,46.41,99.53 +11/29/2024,4.7,-2,0,0,1.35,1.85,60.56,35.06,99.59 +11/30/2024,1.5,-3,3.7,0,-0.75,6.41,56.52,35.44,100.38 +12/01/2024,4,-5,7,0,-0.5,3.56,77.52,36.87,99.79 +12/02/2024,6.6,-1.5,6.9,0,2.55,4.44,56.57,30.68,100.53 +12/03/2024,5,0,2.7,0,2.5,4.34,40.18,45.58,100.32 +12/04/2024,5.2,-3,1,0,1.1,9.6,52.93,45.02,99.24 +12/05/2024,9.4,-3,5.9,0,3.2,7.28,69.54,44.28,100.92 +12/06/2024,7.6,-2.2,1,0,2.7,9.53,66.22,44.69,99.7 +12/07/2024,12,-2,5.2,0,5,8.79,45.27,47.9,99.28 +12/08/2024,9,-2,2.8,0,3.5,9.04,66.16,49.85,100.87 +12/09/2024,8.8,-1.6,2,0,3.6,2.76,57.18,32.27,99.4 +12/10/2024,5.1,-4,4.6,0,0.55,5.41,71.06,34.82,100.74 +12/11/2024,5.8,-3,5.6,0,1.4,9.91,76.18,40.96,100.53 +12/12/2024,10,-2,8.8,0,4,2.02,47.63,35.81,99.13 +12/13/2024,9,-4,4.6,0,2.5,8.36,45.04,37.89,99.79 +12/14/2024,8,-3,8.2,0,2.5,4,65.8,38.91,100.2 +12/15/2024,6,-2,3.6,0,2,7.51,48.11,46.57,100.98 +12/16/2024,3.9,-4,5.1,0,-0.05,3.93,78.73,44.3,100.99 +12/17/2024,1,-4,9.6,0,-1.5,7.04,74.49,35.76,99.74 +12/18/2024,10,-7,9.1,0,1.5,7.14,51.21,48.28,100.74 +12/19/2024,8,-5.2,8,0,1.4,9.23,73.6,45.06,100.74 +12/20/2024,11,0.5,1.9,0,5.75,4.94,59.88,32.85,99.63 +12/21/2024,13,-3,7.4,0,5,1.48,46.97,32.66,100.97 +12/22/2024,6,-6,9.2,0,0,4.32,60.57,38.27,100.29 +12/23/2024,8.4,-8,7.7,0,0.2,8.02,44.02,47.76,99.35 +12/24/2024,5.9,-6,8.2,0,-0.05,5.71,65.79,41.09,99.07 +12/25/2024,5.5,-3.3,2.4,2.3,1.1,7.6,48.17,42.13,99.23 +12/26/2024,5.3,-5,4.4,0,0.15,6.66,50.05,44.62,100.53 +12/27/2024,7,-8,2.4,0,-0.5,1.44,50.06,41.55,100.16 +12/28/2024,7.4,-6,6.8,0,0.7,9.22,70.54,39.06,99.88 +12/29/2024,7.3,-5,7.9,0,1.15,5.95,75.88,32.13,99.02 +12/30/2024,8,-5,5.4,0,1.5,7.4,69.02,43.48,100.89 +12/31/2024,12.6,-3.6,5.9,0,4.5,3.42,41.3,49.89,99.8 diff --git a/data/N_organ.json b/data/N_organ.json new file mode 100644 index 0000000..93cfae8 --- /dev/null +++ b/data/N_organ.json @@ -0,0 +1,38 @@ +{ + "CNI":[1,1,1,1], + "straw_N_content":0.016, + "straw_amonut":0.03, + "FW2":1, + "Nstrawm":0, + "Nd":0, + "aerfa_Nc": 3.53, + "beta_Nc": -0.28, + "aerfa_Nmax": 3.64, + "beta_Nmax": -0.25, + "aerfa_Nmin": 1.96, + "beta_Nmin": -0.33, + "aerfa_LV_Nc": 3.76, + "beta_LV_Nc": -0.22, + "aerfa_LV_Nmax": 3.93, + "beta_LV_Nmax": -0.2, + "aerfa_LV_Nmin": 2.22, + "beta_LV_Nmin": -0.24, + "aerfa_SO_Nc": 3.76, + "beta_SO_Nc": -0.22, + "aerfa_SO_Nmax": 3.93, + "beta_SO_Nmax": -0.2, + "aerfa_SO_Nmin": 2.22, + "beta_SO_Nmin": -0.24, + "aerfa_ST_Nc": 3.76, + "beta_ST_Nc": -0.22, + "aerfa_ST_Nmax": 3.93, + "beta_ST_Nmax": -0.2, + "aerfa_ST_Nmin": 2.22, + "beta_ST_Nmin": -0.24, + "aerfa_RT_Nc": 3.76, + "beta_RT_Nc": -0.22, + "aerfa_RT_Nmax": 3.93, + "beta_RT_Nmax": -0.2, + "aerfa_RT_Nmin": 2.22, + "beta_RT_Nmin": -0.24 +} \ No newline at end of file diff --git a/data/SOILPROP.json b/data/SOILPROP.json new file mode 100644 index 0000000..d96fc72 --- /dev/null +++ b/data/SOILPROP.json @@ -0,0 +1,84 @@ +{ + "CN": 75, + "NLAYR": 4, + "DLAYR": [ + 10, + 10, + 10, + 10 + ], + "DS": [ + 10, + 20, + 30, + 40 + ], + "DUL": [ + 0.52, + 0.53, + 0.55, + 0.56 + ], + "SAT": [ + 0.63, + 0.59, + 0.58, + 0.57 + ], + "LL": [ + 0.17, + 0.19, + 0.2, + 0.2 + ], + "BD": [ + 1.31, + 1.27, + 1.27, + 1.3 + ], + "PH": [ + 6.5, + 6.5, + 6.5, + 6.5 + ], + "SOILC": [ + 0.41, + 0.35, + 0.27, + 0.24 + ], + "FOM": [ + 6500, + 6500, + 6500, + 6500 + ], + "FON": [ + 1.14, + 1.14, + 1.14, + 1.14 + ], + "TOTN": [ + 13.2, + 10.5, + 7.6, + 6.9 + ], + "CLAY": [ + 0.33, + 0.33, + 0.33, + 0.33 + ], +"SNO3_0": [ + 9.8, 7.3, 5.3, 4.1 + ], +"SNH4_0": [ + 2.2, 2.2, 1.5, 1.2 + ], +"SW0": [0.52, 0.53, 0.55, 0.56] + +} \ No newline at end of file diff --git a/data/forecast.csv b/data/forecast.csv new file mode 100644 index 0000000..cb5dbb2 --- /dev/null +++ b/data/forecast.csv @@ -0,0 +1,732 @@ +date,Tmax,Tmin,SH,RAIN,Tmean,u2,RHave,RHmin,Atm +01/01/2024,10,-6,8.4,0,2,3.524900097,79.06894537,52.48158151,99.94065906 +01/02/2024,10,-1,5.2,0,4.5,6.014376808,69.26254324,40.75516405,99.23499436 +01/03/2024,3.7,-7,2.9,0,-1.65,1.548522359,80.30989912,42.85859497,99.61753317 +01/04/2024,2,-4.5,2.1,0,-1.25,5.605485177,85.80681821,48.8527297,100.9565193 +01/05/2024,2,-6.2,4.8,0,-2.1,7.478845162,70.87635477,58.27859205,100.1388993 +01/06/2024,4,-12,8.7,0,-4,1.264029175,97.53182346,31.25848377,99.59422856 +01/07/2024,-3,-11,8.9,0,-7,5.179943182,89.73548272,49.88827252,99.75765952 +01/08/2024,2,-5,9.2,0,-1.5,3.919703752,91.37554542,47.33067063,99.85573888 +01/09/2024,4,-4,8.7,0,0,5.747429161,80.9603822,49.66042876,99.90266855 +01/10/2024,4.5,-1,5.2,0,1.75,5.341609176,97.00216088,56.40090066,99.5244394 +01/11/2024,5.5,-4.2,9.2,0,0.65,6.219659698,96.04679533,59.61767814,100.0183047 +01/12/2024,14.7,-4.2,8.4,0,5.25,2.134582434,70.08834382,40.5400456,99.17383651 +01/13/2024,18,-1,8.4,0,8.5,4.260903707,79.77472669,48.39692484,99.43258442 +01/14/2024,17,-0.7,7.6,0,8.15,2.600465397,79.98286435,36.43332904,99.99045859 +01/15/2024,8.2,0,2.4,0,4.1,3.785560778,71.36890725,57.49057912,99.62419119 +01/16/2024,6.2,-1,4.4,0,2.6,6.207287706,95.01388974,59.64324002,100.2368477 +01/17/2024,9,-5,9.8,0,2,1.677621279,87.6123401,37.37246451,99.43392937 +01/18/2024,15,-4,8.7,0,5.5,4.154972097,81.98401407,56.98335362,100.2738456 +01/19/2024,6,-3,6.8,0,1.5,0.820094613,63.46458959,46.27562464,99.48302997 +01/20/2024,5,-2,3.3,0,1.5,0.323084963,88.24080539,46.12914666,100.0560863 +01/21/2024,10,-2,2,0,4,6.709737519,98.81480308,52.32692196,100.4006582 +01/22/2024,8,-0.9,0,0,3.55,6.452858058,87.89107187,59.46150833,99.09459254 +01/23/2024,8,1,0,0,4.5,1.893790395,98.74811143,48.68637139,100.368533 +01/24/2024,5.1,2,0,0.1,3.55,3.117929098,63.50246384,38.40737651,99.90590069 +01/25/2024,9,1,0,0.9,5,0.917527412,60.63022134,41.76257464,99.45285111 +01/26/2024,12,-1,7.2,0,5.5,5.768276033,75.15385608,37.06190987,100.3965685 +01/27/2024,11.5,1,0,0,6.25,1.221015234,89.99498874,57.89777602,100.4446941 +01/28/2024,10,-4,9.8,0,3,5.62834266,96.27610017,36.65918419,99.18726741 +01/29/2024,14,-2,7.5,0,6,3.506302475,89.34583413,52.94722577,100.6504816 +01/30/2024,17,1.1,8.9,0,9.05,2.059275894,65.87924339,37.55995218,99.06557476 +01/31/2024,16,0.2,5.7,0,8.1,4.179396193,85.753406,43.77495257,100.8352495 +02/01/2024,16.2,0,7.7,0,8.1,3.825151629,76.7342643,41.51289454,100.584855 +02/02/2024,10,-2,8,0,4,5.7557802,97.66448908,54.89962538,100.2278418 +02/03/2024,16,-2,6.8,0,7,6.209294249,98.44935313,36.018087,100.9770226 +02/04/2024,13.5,-0.2,0,0,6.65,0.611426425,63.31321635,46.24841475,99.23065466 +02/05/2024,19,1,0,0,10,0.92507955,97.26341821,56.02162147,100.6737179 +02/06/2024,22,1.7,0,0,11.85,3.88905533,85.98971925,45.85740154,100.2152733 +02/07/2024,10.1,0,0,0,5.05,6.464745026,84.55734043,30.2105099,99.99181802 +02/08/2024,9.5,-1,0,0,4.25,4.475506939,93.50387937,50.05802119,100.0622767 +02/09/2024,12,0,0,0,6,7.425339175,71.90261015,41.405093,99.7068691 +02/10/2024,16,0,5.9,0,8,5.665165738,85.15246676,53.74132121,100.8517253 +02/11/2024,2,2,6.7,0,2,3.227720861,98.45993914,33.12119633,100.2476521 +02/12/2024,7.5,4,0,0,5.75,0.794029148,75.69388024,40.64850785,100.9471654 +02/13/2024,13,6,1.5,4.7,9.5,5.285179298,63.19664555,46.62896759,100.3375288 +02/14/2024,20,2,0,0,11,1.904903851,94.73334166,51.42530777,100.6051856 +02/15/2024,8,2.2,0,0,5.1,7.249082516,82.80673983,30.70035466,99.64934347 +02/16/2024,13,-1,0,0,6,7.410303679,61.45515741,59.05767699,99.1708739 +02/17/2024,11.2,-2,0,0,4.6,1.32293961,83.61049192,56.05881781,100.6006295 +02/18/2024,14.6,1.7,0,0,8.15,7.645489192,93.81240988,46.81648323,100.342139 +02/19/2024,24,3.2,9.8,0,13.6,0.677408881,80.56015621,30.83851028,99.30971249 +02/20/2024,20.7,8.7,10.1,0,14.7,1.827121689,74.53668566,44.07334523,99.55878262 +02/21/2024,27.5,8.2,9.9,0,17.85,7.548254067,78.95179281,34.80965311,99.84096417 +02/22/2024,17,5,6.9,0,11,2.392813148,64.46267022,40.1541176,99.40808095 +02/23/2024,12,5,7.8,0,8.5,2.199360912,86.00809613,39.5905598,100.0427424 +02/24/2024,6,0,0,43.2,3,5.158261035,98.32762495,47.71366871,99.14389443 +02/25/2024,4.6,1,0,2.2,2.8,3.987796935,62.28530698,37.59142706,100.4852523 +02/26/2024,8.2,5,1.9,0,6.6,2.194863176,64.31467833,44.04078824,100.5787755 +02/27/2024,10.7,6,4.6,0.3,8.35,6.454091547,63.5215123,30.67746831,100.3902381 +02/28/2024,8.1,4,0,35.7,6.05,0.083576527,81.11934283,38.48007612,99.44472417 +02/29/2024,9.9,4.5,6,0,7.2,9.68,52.78,31.4,100.03 +03/01/2024,7.2,0,2.1,0.4,3.6,1.768901579,66.3771429,55.4351301,100.2763758 +03/02/2024,13.7,2.5,8.1,0,8.1,6.217358945,90.86551384,42.27554438,100.3287409 +03/03/2024,16.1,5,9,0,10.55,1.689728732,73.48812856,51.15530563,99.88775588 +03/04/2024,20.5,6.5,7.9,0,13.5,6.068750089,63.10958173,48.81028038,99.82194362 +03/05/2024,19.7,1,5,0,10.35,7.040481327,70.10911417,49.18395803,100.7258391 +03/06/2024,3,0,0.3,0,1.5,7.825765767,61.17689252,51.65767103,99.2226304 +03/07/2024,10.2,1.7,4.9,0,5.95,3.399127615,98.81358716,39.64947882,100.5942822 +03/08/2024,11,3,2.1,0,7,4.614952727,79.5611989,31.09522268,99.36711282 +03/09/2024,15.7,6.2,7.2,0,10.95,2.845084698,79.39240452,54.72967808,100.4208777 +03/10/2024,12.2,8,1,1.8,10.1,3.201036021,80.25229848,43.01202409,99.38260614 +03/11/2024,14.2,5,3,2.4,9.6,7.729074488,72.06526962,40.8285959,100.0618685 +03/12/2024,14.5,8,2.7,0,11.25,3.299132735,84.49591851,46.32603861,99.40495419 +03/13/2024,13.7,9,0.8,0,11.35,2.8237765,79.71151078,58.455129,99.79367763 +03/14/2024,16,10,1.4,0.2,13,6.699686186,89.50919497,37.67405003,100.2604182 +03/15/2024,19.5,8,4.4,0,13.75,2.960890886,60.45073645,51.09411254,100.8975815 +03/16/2024,15,8,0,0,11.5,6.024607293,78.36289174,43.54891977,99.52585779 +03/17/2024,15,10,2.5,0,12.5,7.834972061,94.53681115,59.6412081,99.84337407 +03/18/2024,10.1,6,0,0.2,8.05,1.537695566,87.40851456,55.99956025,99.14271645 +03/19/2024,11,3,0.9,5,7,6.694469088,93.14943148,32.60328055,100.3701847 +03/20/2024,15.1,8,3.5,0,11.55,7.861576193,62.49941301,32.74125934,100.5650133 +03/21/2024,14.1,1,0,0,7.55,1.202195011,82.63931978,55.60372662,100.6235626 +03/22/2024,19.7,5,11.6,0,12.35,1.035480785,81.26557886,39.84293871,99.31636769 +03/23/2024,22.2,9,8.6,0,15.6,3.298441048,99.58259277,41.17924526,99.6427245 +03/24/2024,22.1,10.1,6.5,0,16.1,4.8854325,84.27283894,59.58317322,99.12999885 +03/25/2024,23.1,12,8.3,0.3,17.55,0.558996118,97.98536731,40.47309362,99.06206374 +03/26/2024,17.5,11,0,12.3,14.25,3.547987164,89.57352218,59.17949409,99.58363703 +03/27/2024,22.6,9,0,0,15.8,7.172978163,86.389702,39.54496519,100.7100375 +03/28/2024,28.7,14,7.9,0,21.35,5.051936692,85.83329205,35.20991895,100.953385 +03/29/2024,18,9,3.4,0,13.5,3.668328707,78.90099853,36.27832777,99.15468106 +03/30/2024,21,12,7.3,0,16.5,5.545322344,73.96907826,33.59590108,99.09396966 +03/31/2024,14.2,12,0,1.4,13.1,6.068387121,79.89585165,31.58143456,99.24959557 +04/01/2024,16.5,11,1.3,1.2,13.75,4.763219712,76.72124489,31.03277579,99.14099229 +04/02/2024,15,10,0,8.8,12.5,7.681855923,86.96572237,45.12334147,99.29977877 +04/03/2024,12.2,3.7,0,0.8,7.95,7.634873581,80.67726663,34.87537996,99.40380912 +04/04/2024,16.2,6,7.9,0,11.1,6.670256314,88.50801788,41.03473177,100.0047087 +04/05/2024,14.6,3,1.3,0,8.8,3.958712744,74.80587906,53.48719502,100.5297726 +04/06/2024,19.5,10.1,8,0,14.8,0.737673547,68.55927518,45.54669316,100.8514609 +04/07/2024,19.1,7,2.5,0,13.05,0.609999719,72.17464692,44.86846935,100.0453856 +04/08/2024,21.2,8,7.3,0,14.6,6.339596501,70.63342774,55.95531357,99.6009483 +04/09/2024,20.2,9,0,0,14.6,4.129913242,83.64191147,33.98137521,99.97523761 +04/10/2024,20.5,11,7.9,0,15.75,4.916526809,91.10400207,36.35664162,100.9589994 +04/11/2024,17,13,0.4,0,15,1.568391549,69.22148708,39.91969013,100.5172188 +04/12/2024,24.6,13,7.9,0,18.8,7.780739334,71.82260375,48.64851648,100.3366939 +04/13/2024,17,12,6.2,0,14.5,4.300036152,94.70264892,55.32680578,99.66116226 +04/14/2024,20.2,13,9.4,0,16.6,3.042313008,97.84935302,31.69177907,100.5801933 +04/15/2024,27,15,7,0,21,1.982542054,96.14213499,49.6563922,99.41456253 +04/16/2024,22.7,8,8.4,0,15.35,5.632033449,66.66437603,59.02441723,100.0617408 +04/17/2024,23.2,9,12.2,0,16.1,0.568964565,90.53340687,31.98786452,99.03858978 +04/18/2024,23,12.1,9.6,0,17.55,0.581366617,63.21177354,58.05444249,99.75073102 +04/19/2024,25,13,0,1.7,19,5.100723386,74.54914565,57.63950166,99.20565214 +04/20/2024,15.5,11.7,0,29.4,13.6,5.459034303,65.54035753,41.64949873,99.8914407 +04/21/2024,14,11,0,6.1,12.5,4.099594315,93.2434509,36.13412661,99.36542781 +04/22/2024,20.5,11,5.5,0,15.75,5.528030105,80.56715478,31.34473393,100.0954438 +04/23/2024,19.5,13,2,0,16.25,5.676881622,97.56658261,46.00505083,99.89161025 +04/24/2024,16.7,13,0,0,14.85,5.017567126,76.48361226,56.05779963,100.8460151 +04/25/2024,16.5,11,2.1,0,13.75,3.353647302,65.34164171,37.10233229,99.87936211 +04/26/2024,23.6,12,5.9,0,17.8,5.069308104,60.0994975,49.06910414,100.9231902 +04/27/2024,28,17,10.4,0,22.5,4.929183987,95.52919353,57.42681073,100.2258747 +04/28/2024,25.2,16,10.7,0,20.6,6.349314358,80.09194231,55.04343192,100.7470695 +04/29/2024,31,15,10.7,0,23,6.841565611,64.74504038,48.40470546,100.2523409 +04/30/2024,32,11,10,0,21.5,2.626829165,95.0263386,36.92064446,100.6710798 +05/01/2024,27.1,14,0,0,20.55,4.174682233,83.71452771,56.10951992,100.6060692 +05/02/2024,20.2,15,6.5,0,17.6,5.987003664,79.21493517,53.08785579,100.7336713 +05/03/2024,18,12,1,5.4,15,5.102803821,70.04236336,41.47707142,99.25563112 +05/04/2024,27,11,8.4,0,19,3.379068128,93.58314161,38.98040956,99.98912597 +05/05/2024,29.2,16,11.6,0,22.6,4.263863743,95.25355419,44.62702175,99.89676055 +05/06/2024,33.6,19,8.5,0,26.3,5.086634757,95.6058091,31.61393479,99.14911212 +05/07/2024,28.7,13,8.3,0,20.85,7.177262715,76.25820151,45.5355857,100.870856 +05/08/2024,35.7,19,10.4,0,27.35,4.726558398,72.67123494,59.53608353,100.1924425 +05/09/2024,31,21,9.5,0,26,5.010796783,61.93303952,55.43577558,99.42765993 +05/10/2024,26.1,17,7,0,21.55,5.024884859,85.95827694,52.51629031,100.048 +05/11/2024,24.7,15.5,7,0,20.1,2.233486921,78.41560093,52.91659322,100.1444754 +05/12/2024,27.7,18,7.1,0,22.85,4.347321305,64.61623624,39.14376802,99.40785015 +05/13/2024,25.5,20,2.4,0,22.75,1.534541498,82.60642846,40.76949608,99.14434729 +05/14/2024,25.2,20,0.5,1.8,22.6,4.946099221,71.33288725,42.37581445,100.704388 +05/15/2024,24.1,13,0,22,18.55,6.646212191,97.81481506,46.03586599,100.8374362 +05/16/2024,18,11,1.2,0.8,14.5,4.491014712,87.07248906,45.78288245,99.48035362 +05/17/2024,26,13.2,8.6,0,19.6,4.276190157,64.07342226,48.19612671,99.8397394 +05/18/2024,28.5,15,9.6,0,21.75,4.763686743,64.24575378,37.33991438,100.7534655 +05/19/2024,26.1,16,3.9,0,21.05,0.870765443,63.86638393,30.27135857,99.22959805 +05/20/2024,28.7,16,7.2,0,22.35,7.498393123,99.28658365,52.31583885,99.98307826 +05/21/2024,29.2,18.7,0,0,23.95,0.90692341,74.15658871,48.01050347,99.51598644 +05/22/2024,32.5,21,8.7,0,26.75,3.303016642,71.99971265,41.07849919,99.07317677 +05/23/2024,26,16,4.5,0.8,21,3.00736895,62.06240334,43.58487661,100.6317208 +05/24/2024,33,19,11.4,0,26,3.822852986,97.93849359,52.50443746,99.5176409 +05/25/2024,28.1,19,5.9,0,23.55,3.449832354,63.60958527,38.28057219,100.88446 +05/26/2024,34.2,16.5,6.6,0,25.35,7.406584296,78.20733503,44.98355036,100.3043657 +05/27/2024,37.2,24,10,0,30.6,5.671979315,88.7763386,44.55228485,99.46710029 +05/28/2024,33.5,20,11.8,0,26.75,2.799045616,73.32094459,43.41686054,100.5288875 +05/29/2024,38.5,20,9.2,0,29.25,1.448160686,69.52842645,54.97189058,99.16912578 +05/30/2024,32.5,21,10.1,0,26.75,1.728030757,98.07732983,41.80757859,100.1720647 +05/31/2024,35,23,8.3,0,29,6.066241831,94.64683691,38.33230736,99.48575243 +06/01/2024,29.1,22,3.9,0,25.55,1.600788531,78.60292053,54.62625698,99.87423166 +06/02/2024,35.9,21,7.2,31.5,28.45,0.587296347,61.90026869,43.10861965,100.7546851 +06/03/2024,29,16.7,3.1,0,22.85,7.150169485,69.49924897,56.20319733,100.2908149 +06/04/2024,35.2,18.6,12.9,0,26.9,3.284319116,64.37340288,30.52494642,99.14252698 +06/05/2024,39,20,11.2,0,29.5,7.868230951,86.35504065,46.51666258,100.9175754 +06/06/2024,37.7,27,10.9,0,32.35,7.262542747,80.42885231,49.94289302,100.9019222 +06/07/2024,39,24,8.3,0,31.5,1.405467004,71.57714546,45.22050735,99.73189084 +06/08/2024,34,24.5,8.9,0,29.25,4.251262327,91.62010018,42.65256025,99.19265752 +06/09/2024,30.2,22,1.4,0,26.1,6.250941504,68.96320327,54.01647485,99.45168945 +06/10/2024,33,23,0,0,28,2.393272585,91.11437465,47.47698405,100.8722572 +06/11/2024,35.2,26,8.3,0,30.6,6.72127508,95.80036583,36.30758449,100.8884751 +06/12/2024,33.5,23,3.4,2,28.25,4.433775064,99.46413468,43.4295436,99.59898618 +06/13/2024,28,24,0,1.4,26,2.714717877,75.39960611,50.87222178,100.0585261 +06/14/2024,32,24.7,1.7,12.4,28.35,3.380737917,73.80601048,31.79614719,99.52380784 +06/15/2024,32,23,3.4,0,27.5,6.092081482,78.24237461,35.68297786,99.3035727 +06/16/2024,26.5,23,0.4,0.2,24.75,2.412972787,99.67744275,57.44269929,99.32254967 +06/17/2024,25,20,0,0.8,22.5,3.079642835,94.47294108,47.13370719,100.3892516 +06/18/2024,29.2,19,5.3,0,24.1,5.798902645,93.83462589,48.10553386,100.1601381 +06/19/2024,34,22,6.7,0,28,0.807357128,71.88066534,44.33455958,100.3966977 +06/20/2024,36.7,23,8.4,0,29.85,0.807172783,64.69270887,42.09352127,99.94116301 +06/21/2024,36,24,7.6,0,30,5.136488936,64.09554132,45.71479697,99.8294713 +06/22/2024,35.2,22,9.7,0,28.6,3.87793072,97.61416973,57.48239806,100.2376371 +06/23/2024,36.2,25,4.8,0,30.6,1.858796071,73.63890081,33.63657435,100.6334437 +06/24/2024,34.5,26,6.2,0,30.25,1.502533205,76.02561515,40.11966246,100.4051282 +06/25/2024,29.4,23,1,21.5,26.2,1.10478278,84.47164061,35.73374391,99.85473167 +06/26/2024,33.5,24,7.3,0,28.75,0.208943025,83.59909714,31.04615749,100.178491 +06/27/2024,33.2,25,7.3,0,29.1,7.412019262,81.7031916,54.09525582,99.23977086 +06/28/2024,37.1,28,0,0,32.55,5.293937413,74.08573955,32.47366988,99.26620263 +06/29/2024,37,25,4.4,3.2,31,7.795921482,85.84159689,32.42226937,100.6053749 +06/30/2024,37.5,25,7,2.8,31.25,2.247343032,94.53078579,30.06957187,99.60539296 +07/01/2024,33,24,3.5,0,28.5,7.241374434,65.43996657,53.04910283,100.7257338 +07/02/2024,31,22,1.7,89.4,26.5,6.985683875,95.31059093,41.78872934,99.93596141 +07/03/2024,32.7,25.5,8.6,0,29.1,1.440855379,60.38869023,43.39010742,99.29769157 +07/04/2024,34.2,24,5.9,0,29.1,2.908296567,82.13931216,55.56637253,100.7501225 +07/05/2024,32,22,0,0,27,4.534198307,98.43461987,33.70703996,99.16661528 +07/06/2024,32,25,5.1,0,28.5,3.255502401,93.28879217,42.97715416,99.9385318 +07/07/2024,33.6,25,0,0,29.3,4.321281002,63.00689089,33.47655092,100.0627562 +07/08/2024,37.2,22,0,0.2,29.6,7.510482716,67.02255838,53.70346512,99.71511353 +07/09/2024,38.1,27,0,0,32.55,0.594620832,67.91696911,38.40285303,99.54224197 +07/10/2024,34.2,27,0,0,30.6,6.434961807,73.62647278,45.96733333,99.1282413 +07/11/2024,31,27.2,0,9.4,29.1,2.107733896,83.3824567,44.85875865,99.02372798 +07/12/2024,38,27,7.8,0,32.5,6.423584968,90.35240413,59.17897012,100.2368684 +07/13/2024,37.2,28,9.5,0,32.6,1.150384706,61.72116446,41.342202,99.56560234 +07/14/2024,37.5,24,8.2,62.4,30.75,0.55333375,61.7355791,48.09089524,100.6450976 +07/15/2024,33.5,25,7.2,0,29.25,3.056727964,71.30410311,55.36220141,100.3345067 +07/16/2024,31.2,26,4.2,0.2,28.6,6.438163267,73.29634418,33.31115313,100.923151 +07/17/2024,30.5,24,3.7,0,27.25,0.732417937,88.38442948,56.5132512,99.04636854 +07/18/2024,27.7,24,0.3,79.4,25.85,5.784969666,66.64907755,44.70536778,99.12576113 +07/19/2024,26,23,0,127.3,24.5,6.928677606,94.1349448,57.93726144,99.22378718 +07/20/2024,26,22.7,0,941.3,24.35,6.331935084,92.4811356,52.59652249,99.26960682 +07/21/2024,27.1,23,0,132.3,25.05,5.154291147,78.67125005,42.44234961,100.0249629 +07/22/2024,28.2,24,1.6,27.6,26.1,6.153915026,85.92095823,39.03321536,99.80041673 +07/23/2024,27.6,24,1.6,0.1,25.8,7.38964631,61.54405691,55.01148193,99.73978552 +07/24/2024,32.5,23,7.1,0,27.75,3.81115856,93.80899287,55.70751088,99.61054767 +07/25/2024,33.5,24,9.9,0,28.75,0.135296626,95.82693007,47.89235556,99.12255752 +07/26/2024,34.2,25,0,0,29.6,4.642631277,95.66504258,52.61795693,100.6790397 +07/27/2024,32.6,26,0,1.5,29.3,4.525959932,61.99972351,54.06456833,99.87762242 +07/28/2024,30.5,24,4,0.2,27.25,0.168027616,65.23152915,53.81279845,99.72197298 +07/29/2024,31,22,7.6,0,26.5,7.407366995,76.03270161,51.00732954,100.6046199 +07/30/2024,36.1,26,9.7,0,31.05,3.474863076,63.04435423,44.4571811,100.8726801 +07/31/2024,37,27,10.4,0,32,0.368407962,62.56062591,51.39183911,100.4142693 +08/01/2024,35,26,7.7,0,30.5,1.287486819,89.78633443,41.30027962,99.27939392 +08/02/2024,33,23.5,9.9,0,28.25,6.862845027,86.44314284,58.71314989,100.4505358 +08/03/2024,33,25,0,0,29,6.654085856,63.5563821,53.43975941,99.53501332 +08/04/2024,34.5,25,0,0,29.75,3.350306058,73.14792269,51.0956204,100.3320193 +08/05/2024,32,22.2,3,0,27.1,2.780671473,78.21175541,42.70556964,100.3548247 +08/06/2024,34.2,27,9,0,30.6,3.486575331,81.2647846,51.49294878,100.2669672 +08/07/2024,33,24,0,19.2,28.5,4.547629838,64.43943585,46.58673227,100.9391518 +08/08/2024,33,25,0,0.3,29,5.00621974,97.12773738,47.71675286,100.0449524 +08/09/2024,33.7,22,7.6,0.1,27.85,6.549165274,79.95258427,36.63114269,100.9620672 +08/10/2024,32,22,5.1,0,27,2.318334469,61.64949558,57.9533912,100.8328122 +08/11/2024,31.9,27,4,0,29.45,3.808626114,97.73460574,33.67493723,99.54745764 +08/12/2024,29.5,22,0.4,14.1,25.75,0.682707897,74.1588954,42.0517462,99.54176045 +08/13/2024,26,21,0.1,9.5,23.5,0.402741369,90.09045165,57.95026118,100.5380041 +08/14/2024,30.2,21,6.2,0.4,25.6,3.161649782,72.22904524,51.92518588,99.7039865 +08/15/2024,30.5,24,7.2,0,27.25,7.103174303,80.73568645,50.0057684,100.6793432 +08/16/2024,31.5,23,4.6,0,27.25,5.565463804,81.71395245,57.07308543,99.84197312 +08/17/2024,32.6,23,5.3,0,27.8,4.412707342,93.84238267,52.54362837,100.5713019 +08/18/2024,32,26,3.6,0,29,6.792672104,71.82488436,58.61721948,99.80583901 +08/19/2024,32.5,23,0,4.6,27.75,3.488482429,70.1626749,32.40922637,99.79208486 +08/20/2024,31.5,22,8.1,4.6,26.75,7.340676728,79.86340778,49.41812326,100.3174405 +08/21/2024,31,24,5.5,0,27.5,4.447988432,68.11552484,45.34491854,99.87114829 +08/22/2024,26,20,0,132.6,23,3.365537705,61.34704849,33.61791907,99.58873332 +08/23/2024,28.2,23,5.3,0,25.6,7.224199435,72.39222932,40.60077638,99.0900539 +08/24/2024,32.7,17.7,0,0,25.2,2.913654212,64.70675221,32.34962862,100.4990299 +08/25/2024,31.2,21.1,7.6,0,26.15,0.218582667,74.66661462,41.694387,99.14128254 +08/26/2024,27.5,18,0,0,22.75,0.369740762,70.90111909,59.37342882,100.6775678 +08/27/2024,26.5,19,5.7,0,22.75,1.252993381,60.62273761,59.11806322,100.3310852 +08/28/2024,23,19,0.4,66,21,2.156165217,85.60840346,30.41481885,99.46567242 +08/29/2024,21,20,0,116.3,20.5,0.679953089,69.19962589,55.14572595,99.94275513 +08/30/2024,22,21,0,58,21.5,7.563256783,85.28776679,49.53027969,100.1827454 +08/31/2024,24.2,19,0,6,21.6,2.098344905,65.04286082,57.1408758,100.351916 +09/01/2024,21.2,18,0,66.9,19.6,0.461000146,70.84475739,37.68888842,99.58401718 +09/02/2024,30,20,9.5,0,25,1.913690432,68.59035924,50.27872516,99.76803525 +09/03/2024,28.2,20,0,16.8,24.1,4.28771412,69.73927446,52.22960437,100.0968348 +09/04/2024,21,19,0,31.8,20,4.004446622,74.9380159,49.62674607,100.7911711 +09/05/2024,26.5,20,2.9,6.9,23.25,1.585714012,89.72837184,50.52427026,100.645406 +09/06/2024,25.2,20,2.6,10.7,22.6,0.66079992,93.70120611,51.05895149,100.476471 +09/07/2024,28.2,17,8.3,0,22.6,2.767977187,75.56865216,58.68355067,100.017003 +09/08/2024,31,18.2,10,0,24.6,5.08695628,98.52595491,51.11285969,99.54996719 +09/09/2024,34,20.2,10.2,0,27.1,4.690557484,66.36460682,48.83298811,99.3953745 +09/10/2024,33.1,21,9.7,0,27.05,0.11024542,78.51973302,37.25576424,99.74659339 +09/11/2024,34,20,0,0,27,5.717113372,61.29633786,56.61875165,99.69287957 +09/12/2024,34,20,0,0,27,7.376855913,96.60717848,32.53879861,99.80707041 +09/13/2024,32,24,8.8,0,28,2.866957441,66.82813162,53.51020467,100.604768 +09/14/2024,31,23,7.3,0,27,1.435740741,78.94845864,34.01817401,100.1336111 +09/15/2024,30,19.7,0,0,24.85,7.872885332,86.2216542,39.35426385,100.1617756 +09/16/2024,30,21,3.3,0,25.5,3.317365418,71.27222023,49.86381657,100.8661838 +09/17/2024,23,20,0,12,21.5,3.260100965,81.18055125,34.71745262,99.01338462 +09/18/2024,20.1,16,0,89,18.05,7.006089815,63.19867125,53.13298864,99.38647609 +09/19/2024,18.2,15.7,0,71.6,16.95,6.89373573,74.08182901,55.09854273,100.1259612 +09/20/2024,29.2,17.7,9.9,0,23.45,1.505538511,98.51319004,31.43411943,99.82431368 +09/21/2024,34,17.2,0,0,25.6,2.921865099,68.09646596,37.99423448,99.48247023 +09/22/2024,30,22,7.5,0,26,2.85558869,77.51167014,42.90640043,99.52537973 +09/23/2024,32,21,6.3,0,26.5,1.679203837,67.96351466,34.74893916,100.4458689 +09/24/2024,24,20,0,88.6,22,7.251087452,76.72289339,30.49080726,100.2451036 +09/25/2024,21,18,0,17.9,19.5,5.553563751,64.03048615,55.93871303,99.91910547 +09/26/2024,22,18.5,0,1.7,20.25,4.414714551,95.73314767,45.08808229,99.07778129 +09/27/2024,23.5,19,0,6.1,21.25,1.490930226,97.13373294,47.569664,99.8744143 +09/28/2024,19.2,12,0,80,15.6,7.26262846,86.06698625,34.57452432,99.78017382 +09/29/2024,29.5,15.7,9.7,0,22.6,6.099470255,87.94492142,53.29810055,100.7614626 +09/30/2024,30,17,9.6,0,23.5,0.443973154,76.89418616,59.4532932,100.2940678 +10/01/2024,27,17,0,0,22,5.795323584,63.66667525,37.38987832,99.95242826 +10/02/2024,31,20.7,0,0,25.85,2.65840171,95.07702184,39.82813177,100.2373616 +10/03/2024,32,21,0,0,26.5,6.599189437,94.98911629,33.58618033,99.4135966 +10/04/2024,21,12,0,0,16.5,6.734877036,68.65918288,54.34908243,100.4753191 +10/05/2024,14.2,10,0,17.5,12.1,6.332529938,95.09852505,44.90845228,100.4109053 +10/06/2024,13.5,11,0,7.9,12.25,1.081859154,79.85507012,47.17232103,99.66293254 +10/07/2024,14.1,12,0,3.6,13.05,2.385843464,63.28001117,31.82852643,100.3022249 +10/08/2024,14.2,13,0,6.6,13.6,0.500039844,95.25926032,35.13010358,100.7186664 +10/09/2024,18.6,13.7,0.8,0.2,16.15,4.045800005,75.33462242,41.27513802,100.2886733 +10/10/2024,16,12,0,5.2,14,6.68624384,90.44203598,36.32649051,100.1307814 +10/11/2024,17,11,3,1.2,14,6.079436349,79.09476461,31.05400624,100.1036374 +10/12/2024,20,10.2,6.9,0.8,15.1,0.968570503,83.62899645,47.24237561,100.1421954 +10/13/2024,24,13,8.6,0,18.5,1.528568354,82.45346475,48.44239004,99.68538165 +10/14/2024,19,15,0.1,21.6,17,7.81604626,92.15543473,33.99736709,100.3396055 +10/15/2024,18.7,13,0.4,5,15.85,4.970967598,89.83414145,35.03644122,100.9278081 +10/16/2024,15,4,5.3,0,9.5,6.659387443,96.1223817,49.63525672,99.98135324 +10/17/2024,15.2,7.5,9.4,0,11.35,0.293473936,85.3117721,53.22920767,100.6004618 +10/18/2024,21,11,7.6,0,16,1.506524952,72.6837675,39.02817365,99.05193782 +10/19/2024,13,8,0,2.1,10.5,0.914987638,65.99668908,30.82427578,99.31034664 +10/20/2024,13,6,0.3,1.1,9.5,1.43753499,70.16680714,58.49692168,99.02396172 +10/21/2024,19,6,0,0,12.5,1.067941681,99.8027817,53.03467136,99.45591279 +10/22/2024,18.2,7,7,0,12.6,6.287537193,94.94743557,32.14816168,99.16997669 +10/23/2024,18,7,4.1,0,12.5,0.739711129,94.04721751,40.53903142,100.0724084 +10/24/2024,20.1,7,5.4,0,13.55,3.196764655,60.70155683,51.32130007,100.5135195 +10/25/2024,20.6,9,0,0,14.8,2.521505749,89.48342013,58.30188762,99.89508704 +10/26/2024,22,9,3.5,0,15.5,3.89620502,89.20279173,31.81082882,100.6133591 +10/27/2024,20.2,11,4.4,0,15.6,2.096661228,71.56842453,53.49541352,99.10643751 +10/28/2024,22.7,9,0,0.1,15.85,6.238445472,92.06074002,35.66874424,99.92107022 +10/29/2024,22,8,3.5,0,15,0.026165351,85.9958813,52.10550783,100.1661769 +10/30/2024,25.1,10,7,0,17.55,2.961398374,92.01560252,52.65867012,100.4308022 +10/31/2024,20.2,11,1.6,0,15.6,7.963580565,79.91915952,33.90519437,100.5333978 +11/01/2024,16,11.7,2.5,0,13.85,6.711864877,80.1003533,35.75829786,99.75321197 +11/02/2024,18,8,1.5,0,13,2.223667004,70.05820434,37.3941182,100.9722875 +11/03/2024,21,8,4.1,0,14.5,3.773260306,80.46479899,34.43338291,99.31674946 +11/04/2024,20.7,12.5,0,0,16.6,7.529027099,75.68860311,44.22407366,99.45026873 +11/05/2024,20,15,0,0,17.5,3.115179756,70.93729156,49.93120192,100.0152567 +11/06/2024,18.1,1,1.3,11.2,9.55,1.2570531,60.13510413,56.22144501,99.41858219 +11/07/2024,8,1,2.8,17.4,4.5,0.916901953,93.25613106,35.44166101,100.6918535 +11/08/2024,11.2,4.1,9.8,0,7.65,0.497091003,89.15250931,54.7373009,100.8762233 +11/09/2024,14.1,7.6,0,0,10.85,0.396102993,78.12577087,32.87107248,99.6821585 +11/10/2024,17,8,0,0,12.5,0.680374289,68.33659295,33.42168886,100.3970643 +11/11/2024,18,6,0,0,12,5.333413655,74.34470082,40.79563655,100.8735855 +11/12/2024,18,5,8.3,0,11.5,7.204496463,76.27027231,41.34578812,99.10860005 +11/13/2024,21,7,0,0,14,5.76459079,62.44263198,41.43113665,99.98461887 +11/14/2024,21.2,9.5,0,0,15.35,0.709769832,60.84414142,43.10893655,100.6198724 +11/15/2024,19,5,5.2,0,12,1.680271091,74.5758578,31.91081582,99.31310501 +11/16/2024,15.7,7,5.5,0,11.35,7.866793242,98.17785505,30.26465764,99.45360926 +11/17/2024,21,4,5.7,0,12.5,3.569885659,64.90218859,56.17158541,100.0280083 +11/18/2024,21.2,6,7.9,0,13.6,6.322221393,65.86249964,54.99975945,100.8457296 +11/19/2024,14.7,9,4.4,0,11.85,6.608388309,70.18869676,36.61831488,100.3555018 +11/20/2024,11,5,0,2,8,4.47168689,81.3583559,35.81065567,99.86706206 +11/21/2024,13,1,4.2,0,7,7.233494242,81.71451482,44.71849311,99.48425786 +11/22/2024,9,-3,9.6,0,3,3.719767468,76.76196418,53.00541229,99.43202516 +11/23/2024,14.2,1.2,0,0,7.7,0.971554893,77.75504761,52.56733029,100.4522928 +11/24/2024,19,3,8.2,0,11,7.044767756,88.57118211,34.9354286,100.2819435 +11/25/2024,20,3,8,0,11.5,4.566552506,86.35271166,56.33032041,100.9367649 +11/26/2024,16.1,2,6.4,0,9.05,1.660301928,93.39406634,38.84582424,100.4179176 +11/27/2024,15.1,2.7,5.2,0,8.9,2.137346919,66.64589077,58.361318,100.1703479 +11/28/2024,15,4,4.8,0,9.5,0.949445052,83.44739172,48.39096637,100.311121 +11/29/2024,14.2,6,0,0.8,10.1,0.053925164,90.82680041,47.85372562,100.3743845 +11/30/2024,11.2,-3,9.3,0,4.1,0.231864842,87.44958432,51.05044156,99.8196493 +12/01/2024,11.7,-1,9,0,5.35,7.106203267,90.75753354,32.37141515,100.8161915 +12/02/2024,14,6,8.7,0,10,3.253142144,94.02931199,34.40821008,100.0454247 +12/03/2024,17,1,8.8,0,9,1.06829112,76.51943704,43.10674284,100.3096862 +12/04/2024,18,0,8.1,0,9,2.339934246,86.71583942,59.02495799,99.26490063 +12/05/2024,17,1,7,0,9,7.777887239,96.7358529,45.98493169,100.2633317 +12/06/2024,14.7,5,7.6,0,9.85,5.559154253,84.91068926,56.49996781,100.7774429 +12/07/2024,10.2,2.7,5.5,0,6.45,0.507019597,90.99603804,56.81737274,99.27030753 +12/08/2024,9.5,0,0.1,0,4.75,2.945120295,88.66127234,45.68629583,99.09682491 +12/09/2024,15.2,1,5.4,0,8.1,2.748266969,95.93675288,37.40356992,100.0853457 +12/10/2024,10,3.7,0,12.3,6.85,3.805560194,89.3608341,53.3103691,99.434741 +12/11/2024,11.7,5,3.1,4.1,8.35,2.195145292,90.99033779,31.48728524,100.17044 +12/12/2024,7.5,-4,6.9,0,1.75,5.135410146,99.50981418,46.62403918,99.27443959 +12/13/2024,9.1,-2,5.2,0,3.55,5.520582515,90.503537,56.79701563,99.86449052 +12/14/2024,16,0,6.9,0,8,2.406348297,93.51100577,36.99049435,99.55164872 +12/15/2024,12,0,3.5,0,6,5.54973365,95.89638161,34.92556575,99.97358559 +12/16/2024,14,4,4.6,0,9,4.241669441,74.44569735,33.00133332,99.79023032 +12/17/2024,4.2,-2,5.4,0,1.1,1.996737595,66.47818533,57.40165131,100.7274798 +12/18/2024,10,-1,5.5,0,4.5,6.590566708,89.00877163,54.28680256,100.4136764 +12/19/2024,16,1.7,8.2,0,8.85,0.843790691,95.24144066,58.91123534,100.358476 +12/20/2024,18,4,8,0,11,7.417695624,90.96928727,36.13559137,99.27607936 +12/21/2024,18,0.5,7.8,0,9.25,7.955567312,94.65002309,49.20960458,100.6477715 +12/22/2024,10.2,1,5.9,0,5.6,2.932464232,69.36451186,31.7223675,99.11280218 +12/23/2024,6,1,1.8,0.1,3.5,1.090603397,85.38452178,51.95287945,99.42815533 +12/24/2024,1.2,-5,0,0.1,-1.9,0.913238366,77.15923698,59.30174317,100.4688162 +12/25/2024,-2.4,-9,2.9,0,-5.7,5.622341107,93.11684645,32.62503173,99.16549947 +12/26/2024,2.2,-10,8,0,-3.9,4.398377332,98.32977229,42.73308284,100.5194672 +12/27/2024,6.6,-7.2,8.2,0,-0.3,4.425779516,93.06891132,43.55675296,99.93322797 +12/28/2024,10,-2.5,7.6,0,3.75,3.699723285,78.02646576,46.39165348,99.89131392 +12/29/2024,9.1,-4,0,0,2.55,5.594983122,74.39741224,49.70295455,100.2308255 +12/30/2024,11,-6,0,0,2.5,6.362980557,80.18336129,31.27058988,99.0093549 +12/31/2024,9.6,-2,0,0,3.8,6.053640027,99.30595469,53.44157079,100.3980982 +01/01/2025,13.2,-1.5,6.7,0,5.85,4.538269384,81.79397745,38.95568964,99.86069765 +01/02/2025,6.7,-5,5.7,0,0.85,5.811162007,61.49837942,54.95904618,99.36032177 +01/03/2025,10.7,-2.2,4.9,0,4.25,3.382664413,88.82482443,32.19729582,100.1390776 +01/04/2025,3.5,0,0,18.8,1.75,5.634674765,65.69370007,52.21972902,100.6285035 +01/05/2025,2,0,0,1.4,1,1.940482508,99.33547908,42.71340751,100.3600286 +01/06/2025,3.2,1,0,0.4,2.1,4.755522366,98.55795969,31.88092708,99.31806276 +01/07/2025,7,-3,1.7,0,2,0.68314769,88.43871405,45.53921128,99.47821073 +01/08/2025,8.5,-2,3.8,0,3.25,3.820563798,78.19571338,56.13239817,100.0754309 +01/09/2025,5.7,-0.5,2.7,0,2.6,0.754439599,60.33134087,37.21431377,99.63469154 +01/10/2025,4,-5,1,0,-0.5,0.270317382,85.02015887,38.99348776,100.2528855 +01/11/2025,5,-1,2.6,0,2,5.922654198,81.4721851,57.57892903,100.2089542 +01/12/2025,11,-6,4.6,0,2.5,6.916670872,89.57945355,33.10546986,100.4072987 +01/13/2025,5.7,-4,7.9,0,0.85,1.999084036,95.00177191,59.66689797,99.35862462 +01/14/2025,3,-4,0.6,0,-0.5,0.520726975,70.5313761,37.25799568,99.18324393 +01/15/2025,16,-2.5,6.4,0,6.75,3.323508396,73.02092088,53.67441508,100.7236345 +01/16/2025,7,-2,4.4,0,2.5,1.813151021,63.33561551,33.09244439,100.1188815 +01/17/2025,6.5,-4,4.3,0,1.25,7.037817837,87.14542774,38.58397952,99.25248069 +01/18/2025,9,-3,3,0,3,0.154451492,89.39685822,49.26081011,100.7164003 +01/19/2025,5,-1,0,0,2,2.076656784,69.9619816,54.79518792,99.99388595 +01/20/2025,-0.7,-3,0,0,-1.85,4.074802446,76.93427025,40.57266828,100.5726679 +01/21/2025,-1.2,-3,0,15.4,-2.1,3.326678851,98.8231961,44.78729698,100.0913691 +01/22/2025,0.1,-2,0,10,-0.95,1.395187588,75.81027698,42.60264202,99.00514363 +01/23/2025,0.2,-2,0,8.8,-0.9,3.57517721,97.24942579,44.34597873,99.36725685 +01/24/2025,1.7,-2.5,0,1.2,-0.4,1.818003514,71.05852356,37.97701273,100.8305947 +01/25/2025,5.6,-2.9,3.5,0,1.35,2.6374136,88.20314592,31.21269516,100.4896695 +01/26/2025,2,0,0,2.4,1,0.322702293,66.18980331,34.78161008,99.1306787 +01/27/2025,3.2,-1,0.7,0,1.1,2.322643431,62.93405172,31.18621689,99.04140882 +01/28/2025,1.2,-4,0,0.6,-1.4,5.552103247,76.64262812,53.59764906,100.9046363 +01/29/2025,4.2,-5,1.6,0,-0.4,5.645480785,97.93755934,35.2762001,100.3747285 +01/30/2025,6.6,-3,5.5,0,1.8,0.13102799,61.53047903,49.30617143,99.63189838 +01/31/2025,7,-2,9.9,0,2.5,2.65885608,79.66980353,40.2858992,100.8813113 +02/01/2025,6.2,-3,9,0,1.6,3.262038329,86.47373298,56.50597338,100.2422931 +02/02/2025,8,-2.7,6,0,2.65,3.102079474,78.51350425,37.43365717,100.0105177 +02/03/2025,9.1,-4,5.7,0,2.55,1.9009245,94.18582626,47.56795671,100.2550934 +02/04/2025,6,-4,6,0,1,0.042431835,77.46321452,47.24916601,99.49553463 +02/05/2025,6,-4,6.6,0,1,4.646881111,96.39824986,46.11587884,100.0666554 +02/06/2025,5.5,-1,3.5,0,2.25,1.777745958,93.08963691,39.96390499,99.89605393 +02/07/2025,5.5,-4,4.2,0,0.75,2.632371491,79.96390864,49.50944944,99.27214789 +02/08/2025,8,-1.5,4.1,0,3.25,6.432886827,73.95570163,44.1380003,100.0335198 +02/09/2025,10.1,-3,5.1,0,3.55,2.155643744,93.86833704,55.82873733,99.49567283 +02/10/2025,11,-2,4.9,0,4.5,4.218346491,87.19665153,38.6859688,99.11556394 +02/11/2025,9.2,-2,2.4,0,3.6,7.041272898,79.62628435,55.93453194,99.43820915 +02/12/2025,10.1,1,2.9,0,5.55,6.259925717,92.40245569,39.16928857,100.961687 +02/13/2025,7.7,0,2,0,3.85,4.43584785,81.39957671,34.38317985,99.52286584 +02/14/2025,1.7,-1,0,0,0.35,3.863682551,82.51188426,37.37665011,99.32220114 +02/15/2025,4.5,0,1.2,0,2.25,5.60482889,81.62635056,41.12844191,100.6400074 +02/16/2025,2,-2,0,0,0,4.72902148,62.26672386,47.96660531,99.9041132 +02/17/2025,1.2,-4,2,0.6,-1.4,1.024249811,71.78813354,57.22302675,100.7078978 +02/18/2025,5,-1,3.8,0,2,2.044072747,78.52506308,31.11613125,100.8659727 +02/19/2025,5.5,-6,7,0,-0.25,5.251794092,80.58284625,49.30732117,100.803254 +02/20/2025,10,-4,7.5,0,3,2.433556875,98.02487526,44.10983829,100.4610586 +02/21/2025,11.6,0,7.2,0,5.8,6.481548404,74.77299577,42.10932479,100.141193 +02/22/2025,7.1,-2.7,4.9,0,2.2,5.347355528,71.19563689,34.49697842,100.3693817 +02/23/2025,9,-2,5.8,0,3.5,4.884598389,91.260512,44.75298744,99.89162441 +02/24/2025,14,-0.2,6.1,0,6.9,2.459693004,65.23301722,52.21115795,100.8604275 +02/25/2025,17,2,7.8,0,9.5,5.586578077,67.88092252,53.92546534,100.1264129 +02/26/2025,18,0,10.2,0,9,1.42694962,95.20645452,33.73873233,99.75731633 +02/27/2025,18,4,7.3,0,11,6.237311406,89.50692382,32.94880038,99.06626685 +02/28/2025,19,8,4.1,0,13.5,5.771991025,98.35969994,37.98227909,100.7509898 +03/01/2025,14,1,9,0,7.5,7.344809922,80.16207787,59.47980464,100.1098692 +03/02/2025,19,3,8.6,0,11,7.551589199,63.62741647,39.5633925,99.17141968 +03/03/2025,20.1,5,4.5,0,12.55,6.198174492,93.07645565,48.58560465,99.85714163 +03/04/2025,23,8,8.3,0,15.5,6.705194915,92.59065626,38.02919945,100.481097 +03/05/2025,16.2,6,8.2,0,11.1,1.196033605,90.64758163,51.2677343,100.9947274 +03/06/2025,13.2,5,1.6,0,9.1,1.530739144,67.55025278,33.20478133,100.9182288 +03/07/2025,20.5,5,9.1,0,12.75,0.116268278,86.52252574,34.11434044,100.5476444 +03/08/2025,20.7,8.2,8.3,0,14.45,4.536579767,90.56393875,52.34361174,99.53806349 +03/09/2025,22,9.6,7.2,0,15.8,5.987659386,73.18228496,46.38866248,99.47866606 +03/10/2025,24.7,9,7.5,0,16.85,2.02750974,60.28319796,30.22083058,100.5789184 +03/11/2025,25,11,7.2,0,18,2.498729882,73.20487307,45.97945337,100.5935115 +03/12/2025,16.6,9,0,3.2,12.8,6.202952617,93.78476846,54.32207059,100.4987254 +03/13/2025,14,10,0.1,0,12,6.105907838,62.86757878,48.37816452,100.4134196 +03/14/2025,20.6,12,3.5,0,16.3,2.243339986,87.00183646,44.99383295,100.6173849 +03/15/2025,25.1,12,5,0,18.55,0.951153495,93.46325588,53.08905707,99.25578918 +03/16/2025,16,4,0,8.4,10,0.827054879,62.00928788,31.15256392,99.51292021 +03/17/2025,5.1,2,0,0,3.55,7.31707939,65.53545347,35.35923081,100.3608778 +03/18/2025,12.5,3,6.7,0,7.75,4.759334853,70.90975747,40.97933567,100.675508 +03/19/2025,6.2,2,1.4,0,4.1,1.942590707,66.57881011,54.99504839,100.443886 +03/20/2025,9.2,2,1,0,5.6,4.715055542,88.08126683,51.00767188,100.560429 +03/21/2025,9,3,1.1,0,6,4.483016221,93.76796649,53.85038065,99.17899938 +03/22/2025,12.5,5,2.4,0,8.75,7.830764713,86.26753391,51.357923,99.249421 +03/23/2025,17.5,7,9.3,0,12.25,6.417783926,63.41990833,41.1041263,99.27358219 +03/24/2025,16,9,4.3,0,12.5,6.230392775,70.17755548,38.88463653,100.8785959 +03/25/2025,12,5,0,17,8.5,0.205831298,89.4843867,59.29883151,100.7198063 +03/26/2025,20.5,8.7,6.5,0,14.6,0.163408409,96.35216013,40.26393264,100.3655662 +03/27/2025,15,5,9,0.1,10,1.407071471,70.68494444,50.09553743,100.8117187 +03/28/2025,18.2,10,8.3,0.2,14.1,1.713665395,72.09662344,51.10958142,99.50447089 +03/29/2025,22,11,7.1,1,16.5,5.138111925,86.00331439,40.86000174,99.77194402 +03/30/2025,17,9,2.4,0,13,5.838427302,86.77355773,31.8722418,100.7772588 +03/31/2025,15,7,4.5,0,11,2.443320162,81.7752005,41.27874155,100.4632934 +04/01/2025,18,7,8.6,0,12.5,3.213826727,90.98885605,33.19631502,99.79949683 +04/02/2025,19.1,4,9.9,0,11.55,0.927217831,69.20444807,30.2159329,100.2411965 +04/03/2025,20.7,9,9.8,0,14.85,5.047173118,65.67664242,43.62789994,100.0433063 +04/04/2025,23.5,13.7,7.3,0,18.6,4.019227453,95.4352791,38.59363068,100.863286 +04/05/2025,31,14,8.4,0,22.5,5.1896774,98.78238278,54.05580428,100.64538 +04/06/2025,20,9,7.5,0,14.5,4.306017152,71.90678959,55.63206229,99.88857156 +04/07/2025,23.5,12.7,8.7,0,18.1,5.748640738,74.33694086,44.10818586,100.3973988 +04/08/2025,29,16,8.8,0,22.5,4.322096859,75.68514862,59.91387033,99.50046412 +04/09/2025,34,15.6,8.4,0,24.8,0.768667839,70.90642033,51.72299162,99.97701851 +04/10/2025,33,20.7,9.9,0,26.85,6.066847184,99.29748935,53.65431259,100.7263295 +04/11/2025,33,15,9.5,0,24,6.689269404,83.59190316,32.01693548,99.03842972 +04/12/2025,17,11,0,0,14,6.669699709,81.45466032,41.6354395,99.12433492 +04/13/2025,19.5,9,9.6,0,14.25,1.119034762,64.10222864,37.42169887,100.9027476 +04/14/2025,17,13,1.5,0,15,0.242829187,63.11297486,54.72126295,99.03640488 +04/15/2025,16,8.7,2.1,0,12.35,1.246624897,80.37225337,43.85538706,99.05870215 +04/16/2025,20,6,6.8,0,13,0.830803023,91.04189601,36.74111036,99.60838649 +04/17/2025,19.1,11,2.8,0,15.05,3.325237513,79.04639713,33.39653256,99.38094306 +04/18/2025,23,9,7.7,0,16,6.18120899,87.60487196,49.35119272,100.0767139 +04/19/2025,26.2,11,10.2,0,18.6,4.639834629,64.09826517,40.43946275,99.96061177 +04/20/2025,27.5,14,9.4,0,20.75,5.679387566,75.81767583,45.43203872,100.7123931 +04/21/2025,29,16.6,9.3,0,22.8,0.530746639,65.07628152,41.07372262,100.5813123 +04/22/2025,23,10.8,7.8,0,16.9,2.286508283,80.77753278,37.63387988,99.11017145 +04/23/2025,28.1,18.1,9.2,0,23.1,5.977711645,69.74479376,50.96245144,99.57679895 +04/24/2025,30,21,4.8,0,25.5,3.676098295,91.26262322,45.62328242,100.4078937 +04/25/2025,30.7,19,5.2,0,24.85,6.308733711,85.51504105,33.58961675,100.120446 +04/26/2025,28,18,6,0,23,6.308904038,62.40331612,37.73060199,100.3700631 +04/27/2025,20,13,0,0.1,16.5,1.336932748,66.92702878,41.8143059,99.4164784 +04/28/2025,13.4,5,0,15.1,9.2,7.18307022,67.1741787,42.69510333,99.53419522 +04/29/2025,19.4,11.8,7.2,0,15.6,6.044351757,80.71144406,52.28299736,99.1466889 +04/30/2025,17.2,8,0.5,0,12.6,0.802455948,83.33400742,38.92543314,99.86961453 +05/01/2025,26.1,14,11.9,0,20.05,0.416027439,81.68898801,31.855326,99.49463919 +05/02/2025,30,11,10.9,0,20.5,0.07435158,64.9738007,41.19094377,100.0827523 +05/03/2025,32.6,20,11.5,0,26.3,5.554479602,63.95247044,52.13265539,100.2461948 +05/04/2025,31.8,19,11.9,0,25.4,2.667546062,98.39461704,34.60111962,99.69347706 +05/05/2025,31,19,11.2,0,25,3.56577381,71.05591675,45.52978672,99.95419835 +05/06/2025,31,15,9.5,0,23,6.361817299,77.01240177,32.71978046,100.4552353 +05/07/2025,32.7,21,8,0,26.85,3.32,56.4,35.46,99.75 +05/08/2025,33.4,21.7,9,0,27.55,7.68,71.87,43.07,100.04 +05/09/2025,31.3,19.8,9,0,25.55,8.46,40.19,47.51,100 +05/10/2025,27.3,19.1,8,0.4,23.2,8.23,40.49,46.29,99.15 +05/11/2025,29.4,21.1,5,0.8,25.25,6.26,63.1,39.32,100.92 +05/12/2025,33.8,18.5,8,0,26.15,1.44,53.65,39.73,100.1 +05/13/2025,33.1,17.9,9,0,25.5,8.56,67.32,31.01,99.87 +05/14/2025,34.8,19.7,8,0,27.25,9.25,51.51,34.82,99.13 +05/15/2025,29.4,20.7,10,0,25.05,5.4,44.29,38.69,99.13 +05/16/2025,31.9,17,10,0,24.45,8.57,70.75,40.24,100.75 +05/17/2025,35.8,20.4,10,0,28.1,7.15,46.56,42,100.22 +05/18/2025,32.1,22.3,9,0,27.2,8.22,77.9,34.46,99.62 +05/19/2025,27,20.7,4,9.8,23.85,1.1,75.7,47.6,100.77 +05/20/2025,27.3,20.8,6,1.8,24.05,9.27,70.27,35.67,99.67 +05/21/2025,32.1,22.2,9,0,27.15,7.12,62.39,35.32,99.66 +05/22/2025,33,19.4,10,0,26.2,8.72,55.91,33.3,100.03 +05/23/2025,33.7,20.7,10,0,27.2,1.84,53.86,38.65,100.71 +05/24/2025,35.6,23,10,0,29.3,8.07,44.28,49.56,99.62 +05/25/2025,36.8,25.3,10,0,31.05,9.51,71.55,38.41,99.01 +05/26/2025,29.5,25.6,5,0,27.55,4.89,79.31,31.23,99.15 +05/27/2025,32.1,23.4,10,0,27.75,8.74,76.96,40.71,99 +05/28/2025,33.7,20,9,0,26.85,1.55,68.22,46.22,100.06 +05/29/2025,27.9,19.3,6,3,23.6,9.26,65.15,48.88,100.44 +05/30/2025,24.4,18.8,7,1,21.6,3.97,75.17,36.21,99.27 +05/31/2025,30.7,20.7,10,0,25.7,2.07,75.83,46.75,100.23 +06/01/2025,35,21.6,10.4,0,28.3,8.32,45.9,47.16,100.2 +06/02/2025,37,24.7,9.4,0,30.85,9.34,42.91,38.83,100.09 +06/03/2025,36,26,8.3,0,31,4.05,56.24,47.76,99.71 +06/04/2025,30,22,0.2,0.4,26,8.5,51.06,38.12,100.85 +06/05/2025,37,23,9.7,0,30,3.26,41.31,31.46,100.03 +06/06/2025,36,23,12,0,29.5,9.29,48.98,48.53,99.05 +06/07/2025,33.5,23,8.6,0,28.25,5.02,53.44,36.03,99.01 +06/08/2025,37,25,7,0,31,6.42,77.49,45.39,99.41 +06/09/2025,34,21,4.9,8.5,27.5,4.13,50.59,45.44,99.39 +06/10/2025,29.6,21,5,1.1,25.3,9.59,79.7,38.62,100.26 +06/11/2025,34,24,9.2,0,29,2.22,64.3,39.27,100.72 +06/12/2025,30,20.2,2.3,0,25.1,1.92,65.95,48.21,99.27 +06/13/2025,37,19,9.7,0.2,28,4.93,56.58,39.88,100.3 +06/14/2025,34.9,21,11.4,0,27.95,6.52,52.49,32.43,99.11 +06/15/2025,36,24,10.4,0,30,3.99,64.5,31.45,99.44 +06/16/2025,40,28,10.1,0,34,3.1,40.57,33.97,100.59 +06/17/2025,40.1,25,10.4,0,32.55,8.59,76.25,47.72,100.84 +06/18/2025,37.3,26,9.6,0,31.65,9.94,40.62,34.62,99.03 +06/19/2025,37,25,8,0,31,1.12,42.99,31.54,99.37 +06/20/2025,38.4,26,9.7,0,32.2,7.16,79.02,44.69,100.81 +06/21/2025,37,28,8.1,0,32.5,1.59,78.38,48.62,100.5 +06/22/2025,38.9,27,8.3,2,32.95,5.87,79.75,32.15,100.18 +06/23/2025,37.3,27,7.1,4.3,32.15,2.5,64.8,39.46,99.73 +06/24/2025,41.6,28,10.8,0,34.8,4.5,58.55,48.59,99.59 +06/25/2025,39.8,30,10.3,0,34.9,4.37,73.51,42.58,99.97 +06/26/2025,34.3,25,0.8,2,29.65,4.83,46.27,32.69,100.89 +06/27/2025,29.3,24,1.4,22.5,26.65,2.56,67.03,40.45,99.42 +06/28/2025,39,24,10.7,0,31.5,7.99,46.99,38.46,100.45 +06/29/2025,33.9,23,8.9,0,28.45,7.39,77.32,38.16,99.89 +06/30/2025,32,24,6.5,4,28,2.43,75.21,31.44,99.37 +07/01/2025,34,25.7,6.9,14,29.85,5.58,53.65,35.32,100.57 +07/02/2025,36,24,4.7,10,30,3.37,51.11,33.35,100.98 +07/03/2025,30,24,3.1,13,27,1.16,41.56,34.79,99.27 +07/04/2025,34,25,6.2,0,29.5,3.29,47.79,36.52,100.62 +07/05/2025,28,24,0.4,35.8,26,9.15,47.8,35.56,100.03 +07/06/2025,33.5,24,7.9,0,28.75,3.75,43.03,36.8,100.17 +07/07/2025,36.4,24.5,12.1,0,30.45,6.64,52.26,43.73,100.76 +07/08/2025,36.4,27,11.5,0,31.7,3.16,44.25,42.29,100.91 +07/09/2025,36.2,26,8.7,0,31.1,7.87,76.14,46.54,100.67 +07/10/2025,28,23,3,0,25.5,1.76,50.23,33.3,99.91 +07/11/2025,26,23.9,0,0,24.95,4.41,55.04,42.39,99.84 +07/12/2025,26.3,23.9,0.3,0,25.1,3.79,49.15,45.11,100.18 +07/13/2025,30,25,1.5,0,27.5,8.02,78.29,31.96,100.76 +07/14/2025,35.9,28,7.5,0,31.95,3.57,67.86,48.22,99.93 +07/15/2025,32.1,27,2.5,24,29.55,8.66,76.72,35.1,100.87 +07/16/2025,31,23,0.5,4.4,27,2.76,67.55,34.47,100.29 +07/17/2025,35.5,24,10.4,0,29.75,5.77,42.28,34.78,100.15 +07/18/2025,35.1,26.9,7.3,0,31,5.73,53.85,42.65,99.28 +07/19/2025,28,19,0,35,23.5,6.51,54.03,35.36,100.43 +07/20/2025,27.4,21,2.3,27.1,24.2,3.41,45.02,45,100.56 +07/21/2025,34.7,24,11,0,29.35,6.98,47.7,45.2,99.58 +07/22/2025,26.1,21,0,176,23.55,8.36,74.69,42.94,99.31 +07/23/2025,32,22,10,0,27,1.26,57.95,48.24,100.54 +07/24/2025,34.1,24,11.7,0,29.05,7.25,77.09,36.16,99.59 +07/25/2025,34.1,22,8.3,90.5,28.05,3.29,54.58,40.89,99.37 +07/26/2025,31.8,25,6.8,0,28.4,3.16,55.95,38.64,99.77 +07/27/2025,31.3,23,1.5,52.2,27.15,3.18,67.15,38.17,99.16 +07/28/2025,30,22.6,5.4,0,26.3,5.31,66.7,49.75,99.95 +07/29/2025,30.9,25,8.9,0,27.95,5.26,62.47,33.54,99.64 +07/30/2025,32,25,7.5,0,28.5,3.04,43.73,44.45,99.14 +07/31/2025,32.2,25,7.3,0,28.6,2.89,41.42,33.41,100.46 +08/01/2025,34.1,26,8.8,0,30.05,2.53,77.42,30.25,100.29 +08/02/2025,34.7,27,8,0,30.85,6.82,61.11,48.85,100.95 +08/03/2025,36.1,28,8.3,0,32.05,3.69,50.49,36.82,100.16 +08/04/2025,37,29,9.3,0,33,2.83,40.2,47.87,99.6 +08/05/2025,37,29,9.3,0,33,4.57,55.12,32.05,100.76 +08/06/2025,37,29,10,0,33,5.44,65.05,35.08,100.75 +08/07/2025,35.5,29,7,0,32.25,8.31,62.96,34.36,99.58 +08/08/2025,36,25,4.4,76,30.5,9.08,75.63,35.39,99.5 +08/09/2025,27,21,2.3,0.4,24,2.29,70.04,34.89,100.65 +08/10/2025,27,21.7,2.6,0,24.35,3.9,68.45,40.34,99.63 +08/11/2025,34,26,6.5,0,30,6.47,55.74,31.58,99.5 +08/12/2025,37,30,9.8,0,33.5,5.51,48.04,46.88,99.4 +08/13/2025,38,27,8.9,0,32.5,9.27,71.16,30.48,99.77 +08/14/2025,35.4,29,6,0,32.2,3.54,40.72,47.06,99.46 +08/15/2025,38,29.6,5.6,0,33.8,4,71.52,45.9,100.52 +08/16/2025,31,25,0.1,0,28,1.6,46.81,47.5,99.99 +08/17/2025,33,27,4.7,0,30,4.31,48.14,39.87,100.47 +08/18/2025,37,29,7.1,0,33,7.76,65.52,35.58,99.86 +08/19/2025,36,28,6.1,0,32,9.31,67.72,43.26,100.94 +08/20/2025,34,25,7.1,0,29.5,8.37,55.15,46.16,99.44 +08/21/2025,37,27.7,7,0,32.35,3.52,47.74,35.03,99.8 +08/22/2025,38,26,3.4,0,32,5.29,65.77,45.24,100.14 +08/23/2025,32,22.7,7.3,0,27.35,1.8,48.36,45.01,100.07 +08/24/2025,32,23,8.8,1.4,27.5,2.23,76.5,37.62,99.25 +08/25/2025,27,21,0,9.5,24,7.47,60.68,32.31,99.33 +08/26/2025,29,18,1.6,0.2,23.5,4.52,68.53,47.5,100.73 +08/27/2025,22,17,0,4.6,19.5,3.39,52.73,49.02,99.41 +08/28/2025,18.9,16,0,22.8,17.45,2.5,40.71,31.28,99.31 +08/29/2025,22.1,17,0,13.6,19.55,5.86,68.37,33.83,100.87 +08/30/2025,22.6,17.5,0.8,9.3,20.05,2.94,71.64,32.16,100.97 +08/31/2025,29.4,18,7.9,0,23.7,7.47,75.69,45.25,99.2 +09/01/2025,30,19.5,9.7,0,24.75,6.66,57,40.55,100.21 +09/02/2025,29,20.5,7.8,0,24.75,2.04,74.63,33.94,99.56 +09/03/2025,28,17,2.1,0,22.5,3.38,42.84,42.66,100.32 +09/04/2025,31.3,18,8.7,0,24.65,4.3,60.3,38.95,99.69 +09/05/2025,34.8,19,9.4,0,26.9,8.85,78.34,41.66,99.42 +09/06/2025,35.2,19,9.8,0,27.1,1.44,67.91,49.62,100.06 +09/07/2025,33.4,19,9.3,0,26.2,1.24,42.65,30.04,99.35 +09/08/2025,32.3,22,6.2,0,27.15,6,53.77,45.05,99.15 +09/09/2025,26,20,0.1,1.2,23,5.15,74.57,45.63,99.17 +09/10/2025,25,16,2.7,5,20.5,3.17,51.86,31.68,100.38 +09/11/2025,31,17,7.4,0,24,2.03,66.54,34.87,99.49 +09/12/2025,31.8,18.7,7.8,0,25.25,8.4,79.13,36.8,100.26 +09/13/2025,30.2,21,7.1,0,25.6,2.69,74.23,41.58,99.86 +09/14/2025,28,22,7.4,0,25,7.67,69.14,36.56,100.64 +09/15/2025,30,18,6.3,0,24,8.14,64.54,40.55,100.63 +09/16/2025,31.4,18,8.6,0,24.7,3.91,73.55,31.1,100.98 +09/17/2025,32.8,20,7.7,0,26.4,6.69,63.57,45.31,100.36 +09/18/2025,33,23,8.2,0,28,7.9,51.5,30.45,100.11 +09/19/2025,28,20,4.3,0,24,5.09,66.85,32.09,100.62 +09/20/2025,23.5,18,2.4,0,20.75,5.67,68.91,36.85,100.82 +09/21/2025,27,16.1,7.3,0,21.55,2.84,76.81,37.9,100.92 +09/22/2025,32,18,8.3,0,25,1.4,68.62,36.98,100.24 +09/23/2025,24.6,13,8.3,0,18.8,7.06,63.19,35.02,100.92 +09/24/2025,23.4,10,2.4,0,16.7,4.17,44.93,30.7,99.35 +09/25/2025,28.7,13,7.4,0,20.85,6.63,61.35,32.84,99.77 +09/26/2025,29.9,17,9.3,0,23.45,2.61,56.21,44.44,99.22 +09/27/2025,25.7,14,2.2,16,19.85,8.05,55.65,36.85,99.94 +09/28/2025,31.2,15,8.5,0,23.1,1.21,64.76,48.24,99.29 +09/29/2025,32.6,19,8.4,0,25.8,8.56,61.1,48.85,100.52 +09/30/2025,28.9,21,2.7,11.6,24.95,5.4,53.26,33.55,99.83 +10/01/2025,27,21,1.7,0,24,9.17,51.49,47.71,99.93 +10/02/2025,23.1,20,0.3,0,21.55,5.21,66.35,45.9,99.13 +10/03/2025,21.5,10,0,48.1,15.75,6.99,62.26,30.23,99.08 +10/04/2025,10.5,7,0,28.2,8.75,2.19,41.15,44.58,99.34 +10/05/2025,10.3,7,0,18.8,8.65,6.98,66.29,35.18,99.72 +10/06/2025,12.1,6.6,0,0,9.35,6.28,71.56,47.81,100.97 +10/07/2025,16,9.2,3.8,0,12.6,8.63,46.89,37.44,100.53 +10/08/2025,17,10.3,3.2,0,13.65,9.68,48.51,31.49,99.85 +10/09/2025,16.8,2,6.2,0,9.4,7.59,72.59,36.85,100.75 +10/10/2025,21,4,10.3,0,12.5,4.48,47.7,30.76,99.33 +10/11/2025,21.2,5,9.5,0,13.1,1.22,57.08,37.48,100.33 +10/12/2025,20,8.7,5.5,0,14.35,9.83,61.25,49.37,99.16 +10/13/2025,20.6,13,3.5,0,16.8,6.3,64.02,36.17,99.49 +10/14/2025,22,13,2.4,0,17.5,4.03,70.29,30.09,99.02 +10/15/2025,24,14,3.5,0,19,3.15,47.87,41.28,99.57 +10/16/2025,25,13,3.5,0,19,4.66,49.56,31.88,99.03 +10/17/2025,19.3,6,9.7,0,12.65,5.59,51.81,31.32,100.21 +10/18/2025,20.4,6,8.7,0,13.2,4.76,50.72,42.65,99.85 +10/19/2025,21.5,9,8.2,0,15.25,5.49,46.19,35.41,100.42 +10/20/2025,21.5,8.8,6.9,0,15.15,8.49,41.81,34.6,100.6 +10/21/2025,25,9,7.1,0,17,7.73,74.26,39.17,99.76 +10/22/2025,26.4,9,6.7,0,17.7,6.9,57.92,38.1,100.04 +10/23/2025,24,8,6.7,0,16,9.02,60.96,38.8,99.92 +10/24/2025,23,9,5.8,0,16,1.49,54.39,30.17,99.67 +10/25/2025,21.3,10.9,4.7,0,16.1,3.36,63.22,37.69,100.89 +10/26/2025,18,10,1.6,0.4,14,4.78,62.33,38.14,99.77 +10/27/2025,19,11,4.1,0,15,7.32,71.5,48.74,99.54 +10/28/2025,18,11.9,2.4,0,14.95,5.03,46.74,43.85,99.01 +10/29/2025,19,12.7,2.4,0.8,15.85,6.05,63.89,44.93,99.4 +10/30/2025,19,9,1.4,0.2,14,5.4,50.96,48.86,100.01 +10/31/2025,22,9,4.9,0,15.5,5.72,61.83,48.38,99.59 +11/01/2025,20.2,9,4,0,14.6,2.94,68.27,44.75,99.81 +11/02/2025,21,10,6.2,0,15.5,3.07,52.94,49,99.26 +11/03/2025,13.9,9,0.2,0,11.45,5.07,67.88,40.02,100.06 +11/04/2025,15.3,6,5.8,0,10.65,7.07,43.1,35.61,100.68 +11/05/2025,18,9.4,5.6,0.4,13.7,4.71,66.91,35.68,100.1 +11/06/2025,21,9,5.8,0,15,5.2,79.81,39.77,99.76 +11/07/2025,18.2,7.8,4.9,0,13,3.31,49.62,44.35,99.25 +11/08/2025,18,10,2.3,0,14,4.32,73.11,44.18,100.2 +11/09/2025,18,10,1,4.2,14,2.6,48.41,44.37,100.71 +11/10/2025,17,13,0.7,5.9,15,5.75,73,31.57,100.56 +11/11/2025,15,12,0,1.9,13.5,7.85,46.41,41.19,100.63 +11/12/2025,14,7,0,0.4,10.5,4.59,57.92,32.19,99.87 +11/13/2025,10.1,4,1.7,0,7.05,5.61,77.86,42.79,99.03 +11/14/2025,16.2,2,7,0,9.1,3.95,75.71,40.87,100.85 +11/15/2025,19.9,4,8.1,0,11.95,8.97,56.29,48.85,99.1 +11/16/2025,16,2,2.9,0,9,4.53,53.65,34.03,99.54 +11/17/2025,18,5,7.1,0,11.5,1.33,76.41,35.13,99.28 +11/18/2025,12.8,9,0,0.6,10.9,3.15,72.5,34.23,100.31 +11/19/2025,17.7,6,4.5,0,11.85,7.1,58.7,36,100.53 +11/20/2025,13,9,0.2,0,11,5.35,55.82,31.15,100.84 +11/21/2025,12.2,9,0,15,10.6,1.93,75.93,43.51,99.18 +11/22/2025,11.6,3,0.6,0.5,7.3,6.98,40.16,46.57,100.57 +11/23/2025,16.2,5.5,4.4,0,10.85,2.14,70.42,46.39,100.12 +11/24/2025,18.3,6,6.2,0,12.15,9.91,66.63,40.85,100.59 +11/25/2025,22,6.7,7.4,0,14.35,3.48,47.18,50,100.66 +11/26/2025,10,6,5.1,0,8,1.81,59.6,31.3,100.95 +11/27/2025,7,3,0,2.2,5,3.04,63.6,44.68,99.81 +11/28/2025,11.3,5,0.1,0.9,8.15,9.07,42.75,46.41,99.53 +11/29/2025,4.7,-2,0,0,1.35,1.85,60.56,35.06,99.59 +11/30/2025,1.5,-3,3.7,0,-0.75,6.41,56.52,35.44,100.38 +12/01/2025,4,-5,7,0,-0.5,3.56,77.52,36.87,99.79 +12/02/2025,6.6,-1.5,6.9,0,2.55,4.44,56.57,30.68,100.53 +12/03/2025,5,0,2.7,0,2.5,4.34,40.18,45.58,100.32 +12/04/2025,5.2,-3,1,0,1.1,9.6,52.93,45.02,99.24 +12/05/2025,9.4,-3,5.9,0,3.2,7.28,69.54,44.28,100.92 +12/06/2025,7.6,-2.2,1,0,2.7,9.53,66.22,44.69,99.7 +12/07/2025,12,-2,5.2,0,5,8.79,45.27,47.9,99.28 +12/08/2025,9,-2,2.8,0,3.5,9.04,66.16,49.85,100.87 +12/09/2025,8.8,-1.6,2,0,3.6,2.76,57.18,32.27,99.4 +12/10/2025,5.1,-4,4.6,0,0.55,5.41,71.06,34.82,100.74 +12/11/2025,5.8,-3,5.6,0,1.4,9.91,76.18,40.96,100.53 +12/12/2025,10,-2,8.8,0,4,2.02,47.63,35.81,99.13 +12/13/2025,9,-4,4.6,0,2.5,8.36,45.04,37.89,99.79 +12/14/2025,8,-3,8.2,0,2.5,4,65.8,38.91,100.2 +12/15/2025,6,-2,3.6,0,2,7.51,48.11,46.57,100.98 +12/16/2025,3.9,-4,5.1,0,-0.05,3.93,78.73,44.3,100.99 +12/17/2025,1,-4,9.6,0,-1.5,7.04,74.49,35.76,99.74 +12/18/2025,10,-7,9.1,0,1.5,7.14,51.21,48.28,100.74 +12/19/2025,8,-5.2,8,0,1.4,9.23,73.6,45.06,100.74 +12/20/2025,11,0.5,1.9,0,5.75,4.94,59.88,32.85,99.63 +12/21/2025,13,-3,7.4,0,5,1.48,46.97,32.66,100.97 +12/22/2025,6,-6,9.2,0,0,4.32,60.57,38.27,100.29 +12/23/2025,8.4,-8,7.7,0,0.2,8.02,44.02,47.76,99.35 +12/24/2025,5.9,-6,8.2,0,-0.05,5.71,65.79,41.09,99.07 +12/25/2025,5.5,-3.3,2.4,2.3,1.1,7.6,48.17,42.13,99.23 +12/26/2025,5.3,-5,4.4,0,0.15,6.66,50.05,44.62,100.53 +12/27/2025,7,-8,2.4,0,-0.5,1.44,50.06,41.55,100.16 +12/28/2025,7.4,-6,6.8,0,0.7,9.22,70.54,39.06,99.88 +12/29/2025,7.3,-5,7.9,0,1.15,5.95,75.88,32.13,99.02 +12/30/2025,8,-5,5.4,0,1.5,7.4,69.02,43.48,100.89 +12/31/2025,12.6,-3.6,5.9,0,4.5,3.42,41.3,49.89,99.8 diff --git a/data/management.json b/data/management.json new file mode 100644 index 0000000..adfae11 --- /dev/null +++ b/data/management.json @@ -0,0 +1,8 @@ +{ + "sowdate": "10/5/2023", + "latitude": 32, + "elevation": 100, + "seed_weight": 50, + "Nfertilizer": {"kind": "SNH4", "amount": 200, "date": "03/15/2024"}, + "irrigation": {"amount": 10, "date": "03/15/2024"} +} \ No newline at end of file diff --git a/data/management_nowadays.json b/data/management_nowadays.json new file mode 100644 index 0000000..32bdf51 --- /dev/null +++ b/data/management_nowadays.json @@ -0,0 +1,8 @@ +{ + "sowdate": "10/5/2024", + "latitude": 32, + "elevation": 100, + "seed_weight": 50, + "Nfertilizer": {"kind": "SNH4", "amount": 200, "date": "03/15/2025"}, + "irrigation": {"amount": 10, "date": "03/15/2025"} +} \ No newline at end of file diff --git a/data/nowadays.csv b/data/nowadays.csv new file mode 100644 index 0000000..6302498 --- /dev/null +++ b/data/nowadays.csv @@ -0,0 +1,732 @@ +date,Tmax,Tmin,SH,RAIN,Tmean,u2,RHave,RHmin,Atm +01/01/2024,10,-6,8.4,0,2,3.524900097,79.06894537,52.48158151,99.94065906 +01/02/2024,10,-1,5.2,0,4.5,6.014376808,69.26254324,40.75516405,99.23499436 +01/03/2024,3.7,-7,2.9,0,-1.65,1.548522359,80.30989912,42.85859497,99.61753317 +01/04/2024,2,-4.5,2.1,0,-1.25,5.605485177,85.80681821,48.8527297,100.9565193 +01/05/2024,2,-6.2,4.8,0,-2.1,7.478845162,70.87635477,58.27859205,100.1388993 +01/06/2024,4,-12,8.7,0,-4,1.264029175,97.53182346,31.25848377,99.59422856 +01/07/2024,-3,-11,8.9,0,-7,5.179943182,89.73548272,49.88827252,99.75765952 +01/08/2024,2,-5,9.2,0,-1.5,3.919703752,91.37554542,47.33067063,99.85573888 +01/09/2024,4,-4,8.7,0,0,5.747429161,80.9603822,49.66042876,99.90266855 +01/10/2024,4.5,-1,5.2,0,1.75,5.341609176,97.00216088,56.40090066,99.5244394 +01/11/2024,5.5,-4.2,9.2,0,0.65,6.219659698,96.04679533,59.61767814,100.0183047 +01/12/2024,14.7,-4.2,8.4,0,5.25,2.134582434,70.08834382,40.5400456,99.17383651 +01/13/2024,18,-1,8.4,0,8.5,4.260903707,79.77472669,48.39692484,99.43258442 +01/14/2024,17,-0.7,7.6,0,8.15,2.600465397,79.98286435,36.43332904,99.99045859 +01/15/2024,8.2,0,2.4,0,4.1,3.785560778,71.36890725,57.49057912,99.62419119 +01/16/2024,6.2,-1,4.4,0,2.6,6.207287706,95.01388974,59.64324002,100.2368477 +01/17/2024,9,-5,9.8,0,2,1.677621279,87.6123401,37.37246451,99.43392937 +01/18/2024,15,-4,8.7,0,5.5,4.154972097,81.98401407,56.98335362,100.2738456 +01/19/2024,6,-3,6.8,0,1.5,0.820094613,63.46458959,46.27562464,99.48302997 +01/20/2024,5,-2,3.3,0,1.5,0.323084963,88.24080539,46.12914666,100.0560863 +01/21/2024,10,-2,2,0,4,6.709737519,98.81480308,52.32692196,100.4006582 +01/22/2024,8,-0.9,0,0,3.55,6.452858058,87.89107187,59.46150833,99.09459254 +01/23/2024,8,1,0,0,4.5,1.893790395,98.74811143,48.68637139,100.368533 +01/24/2024,5.1,2,0,0.1,3.55,3.117929098,63.50246384,38.40737651,99.90590069 +01/25/2024,9,1,0,0.9,5,0.917527412,60.63022134,41.76257464,99.45285111 +01/26/2024,12,-1,7.2,0,5.5,5.768276033,75.15385608,37.06190987,100.3965685 +01/27/2024,11.5,1,0,0,6.25,1.221015234,89.99498874,57.89777602,100.4446941 +01/28/2024,10,-4,9.8,0,3,5.62834266,96.27610017,36.65918419,99.18726741 +01/29/2024,14,-2,7.5,0,6,3.506302475,89.34583413,52.94722577,100.6504816 +01/30/2024,17,1.1,8.9,0,9.05,2.059275894,65.87924339,37.55995218,99.06557476 +01/31/2024,16,0.2,5.7,0,8.1,4.179396193,85.753406,43.77495257,100.8352495 +02/01/2024,16.2,0,7.7,0,8.1,3.825151629,76.7342643,41.51289454,100.584855 +02/02/2024,10,-2,8,0,4,5.7557802,97.66448908,54.89962538,100.2278418 +02/03/2024,16,-2,6.8,0,7,6.209294249,98.44935313,36.018087,100.9770226 +02/04/2024,13.5,-0.2,0,0,6.65,0.611426425,63.31321635,46.24841475,99.23065466 +02/05/2024,19,1,0,0,10,0.92507955,97.26341821,56.02162147,100.6737179 +02/06/2024,22,1.7,0,0,11.85,3.88905533,85.98971925,45.85740154,100.2152733 +02/07/2024,10.1,0,0,0,5.05,6.464745026,84.55734043,30.2105099,99.99181802 +02/08/2024,9.5,-1,0,0,4.25,4.475506939,93.50387937,50.05802119,100.0622767 +02/09/2024,12,0,0,0,6,7.425339175,71.90261015,41.405093,99.7068691 +02/10/2024,16,0,5.9,0,8,5.665165738,85.15246676,53.74132121,100.8517253 +02/11/2024,2,2,6.7,0,2,3.227720861,98.45993914,33.12119633,100.2476521 +02/12/2024,7.5,4,0,0,5.75,0.794029148,75.69388024,40.64850785,100.9471654 +02/13/2024,13,6,1.5,4.7,9.5,5.285179298,63.19664555,46.62896759,100.3375288 +02/14/2024,20,2,0,0,11,1.904903851,94.73334166,51.42530777,100.6051856 +02/15/2024,8,2.2,0,0,5.1,7.249082516,82.80673983,30.70035466,99.64934347 +02/16/2024,13,-1,0,0,6,7.410303679,61.45515741,59.05767699,99.1708739 +02/17/2024,11.2,-2,0,0,4.6,1.32293961,83.61049192,56.05881781,100.6006295 +02/18/2024,14.6,1.7,0,0,8.15,7.645489192,93.81240988,46.81648323,100.342139 +02/19/2024,24,3.2,9.8,0,13.6,0.677408881,80.56015621,30.83851028,99.30971249 +02/20/2024,20.7,8.7,10.1,0,14.7,1.827121689,74.53668566,44.07334523,99.55878262 +02/21/2024,27.5,8.2,9.9,0,17.85,7.548254067,78.95179281,34.80965311,99.84096417 +02/22/2024,17,5,6.9,0,11,2.392813148,64.46267022,40.1541176,99.40808095 +02/23/2024,12,5,7.8,0,8.5,2.199360912,86.00809613,39.5905598,100.0427424 +02/24/2024,6,0,0,43.2,3,5.158261035,98.32762495,47.71366871,99.14389443 +02/25/2024,4.6,1,0,2.2,2.8,3.987796935,62.28530698,37.59142706,100.4852523 +02/26/2024,8.2,5,1.9,0,6.6,2.194863176,64.31467833,44.04078824,100.5787755 +02/27/2024,10.7,6,4.6,0.3,8.35,6.454091547,63.5215123,30.67746831,100.3902381 +02/28/2024,8.1,4,0,35.7,6.05,0.083576527,81.11934283,38.48007612,99.44472417 +02/29/2024,9.9,4.5,6,0,7.2,9.68,52.78,31.4,100.03 +03/01/2024,7.2,0,2.1,0.4,3.6,1.768901579,66.3771429,55.4351301,100.2763758 +03/02/2024,13.7,2.5,8.1,0,8.1,6.217358945,90.86551384,42.27554438,100.3287409 +03/03/2024,16.1,5,9,0,10.55,1.689728732,73.48812856,51.15530563,99.88775588 +03/04/2024,20.5,6.5,7.9,0,13.5,6.068750089,63.10958173,48.81028038,99.82194362 +03/05/2024,19.7,1,5,0,10.35,7.040481327,70.10911417,49.18395803,100.7258391 +03/06/2024,3,0,0.3,0,1.5,7.825765767,61.17689252,51.65767103,99.2226304 +03/07/2024,10.2,1.7,4.9,0,5.95,3.399127615,98.81358716,39.64947882,100.5942822 +03/08/2024,11,3,2.1,0,7,4.614952727,79.5611989,31.09522268,99.36711282 +03/09/2024,15.7,6.2,7.2,0,10.95,2.845084698,79.39240452,54.72967808,100.4208777 +03/10/2024,12.2,8,1,1.8,10.1,3.201036021,80.25229848,43.01202409,99.38260614 +03/11/2024,14.2,5,3,2.4,9.6,7.729074488,72.06526962,40.8285959,100.0618685 +03/12/2024,14.5,8,2.7,0,11.25,3.299132735,84.49591851,46.32603861,99.40495419 +03/13/2024,13.7,9,0.8,0,11.35,2.8237765,79.71151078,58.455129,99.79367763 +03/14/2024,16,10,1.4,0.2,13,6.699686186,89.50919497,37.67405003,100.2604182 +03/15/2024,19.5,8,4.4,0,13.75,2.960890886,60.45073645,51.09411254,100.8975815 +03/16/2024,15,8,0,0,11.5,6.024607293,78.36289174,43.54891977,99.52585779 +03/17/2024,15,10,2.5,0,12.5,7.834972061,94.53681115,59.6412081,99.84337407 +03/18/2024,10.1,6,0,0.2,8.05,1.537695566,87.40851456,55.99956025,99.14271645 +03/19/2024,11,3,0.9,5,7,6.694469088,93.14943148,32.60328055,100.3701847 +03/20/2024,15.1,8,3.5,0,11.55,7.861576193,62.49941301,32.74125934,100.5650133 +03/21/2024,14.1,1,0,0,7.55,1.202195011,82.63931978,55.60372662,100.6235626 +03/22/2024,19.7,5,11.6,0,12.35,1.035480785,81.26557886,39.84293871,99.31636769 +03/23/2024,22.2,9,8.6,0,15.6,3.298441048,99.58259277,41.17924526,99.6427245 +03/24/2024,22.1,10.1,6.5,0,16.1,4.8854325,84.27283894,59.58317322,99.12999885 +03/25/2024,23.1,12,8.3,0.3,17.55,0.558996118,97.98536731,40.47309362,99.06206374 +03/26/2024,17.5,11,0,12.3,14.25,3.547987164,89.57352218,59.17949409,99.58363703 +03/27/2024,22.6,9,0,0,15.8,7.172978163,86.389702,39.54496519,100.7100375 +03/28/2024,28.7,14,7.9,0,21.35,5.051936692,85.83329205,35.20991895,100.953385 +03/29/2024,18,9,3.4,0,13.5,3.668328707,78.90099853,36.27832777,99.15468106 +03/30/2024,21,12,7.3,0,16.5,5.545322344,73.96907826,33.59590108,99.09396966 +03/31/2024,14.2,12,0,1.4,13.1,6.068387121,79.89585165,31.58143456,99.24959557 +04/01/2024,16.5,11,1.3,1.2,13.75,4.763219712,76.72124489,31.03277579,99.14099229 +04/02/2024,15,10,0,8.8,12.5,7.681855923,86.96572237,45.12334147,99.29977877 +04/03/2024,12.2,3.7,0,0.8,7.95,7.634873581,80.67726663,34.87537996,99.40380912 +04/04/2024,16.2,6,7.9,0,11.1,6.670256314,88.50801788,41.03473177,100.0047087 +04/05/2024,14.6,3,1.3,0,8.8,3.958712744,74.80587906,53.48719502,100.5297726 +04/06/2024,19.5,10.1,8,0,14.8,0.737673547,68.55927518,45.54669316,100.8514609 +04/07/2024,19.1,7,2.5,0,13.05,0.609999719,72.17464692,44.86846935,100.0453856 +04/08/2024,21.2,8,7.3,0,14.6,6.339596501,70.63342774,55.95531357,99.6009483 +04/09/2024,20.2,9,0,0,14.6,4.129913242,83.64191147,33.98137521,99.97523761 +04/10/2024,20.5,11,7.9,0,15.75,4.916526809,91.10400207,36.35664162,100.9589994 +04/11/2024,17,13,0.4,0,15,1.568391549,69.22148708,39.91969013,100.5172188 +04/12/2024,24.6,13,7.9,0,18.8,7.780739334,71.82260375,48.64851648,100.3366939 +04/13/2024,17,12,6.2,0,14.5,4.300036152,94.70264892,55.32680578,99.66116226 +04/14/2024,20.2,13,9.4,0,16.6,3.042313008,97.84935302,31.69177907,100.5801933 +04/15/2024,27,15,7,0,21,1.982542054,96.14213499,49.6563922,99.41456253 +04/16/2024,22.7,8,8.4,0,15.35,5.632033449,66.66437603,59.02441723,100.0617408 +04/17/2024,23.2,9,12.2,0,16.1,0.568964565,90.53340687,31.98786452,99.03858978 +04/18/2024,23,12.1,9.6,0,17.55,0.581366617,63.21177354,58.05444249,99.75073102 +04/19/2024,25,13,0,1.7,19,5.100723386,74.54914565,57.63950166,99.20565214 +04/20/2024,15.5,11.7,0,29.4,13.6,5.459034303,65.54035753,41.64949873,99.8914407 +04/21/2024,14,11,0,6.1,12.5,4.099594315,93.2434509,36.13412661,99.36542781 +04/22/2024,20.5,11,5.5,0,15.75,5.528030105,80.56715478,31.34473393,100.0954438 +04/23/2024,19.5,13,2,0,16.25,5.676881622,97.56658261,46.00505083,99.89161025 +04/24/2024,16.7,13,0,0,14.85,5.017567126,76.48361226,56.05779963,100.8460151 +04/25/2024,16.5,11,2.1,0,13.75,3.353647302,65.34164171,37.10233229,99.87936211 +04/26/2024,23.6,12,5.9,0,17.8,5.069308104,60.0994975,49.06910414,100.9231902 +04/27/2024,28,17,10.4,0,22.5,4.929183987,95.52919353,57.42681073,100.2258747 +04/28/2024,25.2,16,10.7,0,20.6,6.349314358,80.09194231,55.04343192,100.7470695 +04/29/2024,31,15,10.7,0,23,6.841565611,64.74504038,48.40470546,100.2523409 +04/30/2024,32,11,10,0,21.5,2.626829165,95.0263386,36.92064446,100.6710798 +05/01/2024,27.1,14,0,0,20.55,4.174682233,83.71452771,56.10951992,100.6060692 +05/02/2024,20.2,15,6.5,0,17.6,5.987003664,79.21493517,53.08785579,100.7336713 +05/03/2024,18,12,1,5.4,15,5.102803821,70.04236336,41.47707142,99.25563112 +05/04/2024,27,11,8.4,0,19,3.379068128,93.58314161,38.98040956,99.98912597 +05/05/2024,29.2,16,11.6,0,22.6,4.263863743,95.25355419,44.62702175,99.89676055 +05/06/2024,33.6,19,8.5,0,26.3,5.086634757,95.6058091,31.61393479,99.14911212 +05/07/2024,28.7,13,8.3,0,20.85,7.177262715,76.25820151,45.5355857,100.870856 +05/08/2024,35.7,19,10.4,0,27.35,4.726558398,72.67123494,59.53608353,100.1924425 +05/09/2024,31,21,9.5,0,26,5.010796783,61.93303952,55.43577558,99.42765993 +05/10/2024,26.1,17,7,0,21.55,5.024884859,85.95827694,52.51629031,100.048 +05/11/2024,24.7,15.5,7,0,20.1,2.233486921,78.41560093,52.91659322,100.1444754 +05/12/2024,27.7,18,7.1,0,22.85,4.347321305,64.61623624,39.14376802,99.40785015 +05/13/2024,25.5,20,2.4,0,22.75,1.534541498,82.60642846,40.76949608,99.14434729 +05/14/2024,25.2,20,0.5,1.8,22.6,4.946099221,71.33288725,42.37581445,100.704388 +05/15/2024,24.1,13,0,22,18.55,6.646212191,97.81481506,46.03586599,100.8374362 +05/16/2024,18,11,1.2,0.8,14.5,4.491014712,87.07248906,45.78288245,99.48035362 +05/17/2024,26,13.2,8.6,0,19.6,4.276190157,64.07342226,48.19612671,99.8397394 +05/18/2024,28.5,15,9.6,0,21.75,4.763686743,64.24575378,37.33991438,100.7534655 +05/19/2024,26.1,16,3.9,0,21.05,0.870765443,63.86638393,30.27135857,99.22959805 +05/20/2024,28.7,16,7.2,0,22.35,7.498393123,99.28658365,52.31583885,99.98307826 +05/21/2024,29.2,18.7,0,0,23.95,0.90692341,74.15658871,48.01050347,99.51598644 +05/22/2024,32.5,21,8.7,0,26.75,3.303016642,71.99971265,41.07849919,99.07317677 +05/23/2024,26,16,4.5,0.8,21,3.00736895,62.06240334,43.58487661,100.6317208 +05/24/2024,33,19,11.4,0,26,3.822852986,97.93849359,52.50443746,99.5176409 +05/25/2024,28.1,19,5.9,0,23.55,3.449832354,63.60958527,38.28057219,100.88446 +05/26/2024,34.2,16.5,6.6,0,25.35,7.406584296,78.20733503,44.98355036,100.3043657 +05/27/2024,37.2,24,10,0,30.6,5.671979315,88.7763386,44.55228485,99.46710029 +05/28/2024,33.5,20,11.8,0,26.75,2.799045616,73.32094459,43.41686054,100.5288875 +05/29/2024,38.5,20,9.2,0,29.25,1.448160686,69.52842645,54.97189058,99.16912578 +05/30/2024,32.5,21,10.1,0,26.75,1.728030757,98.07732983,41.80757859,100.1720647 +05/31/2024,35,23,8.3,0,29,6.066241831,94.64683691,38.33230736,99.48575243 +06/01/2024,29.1,22,3.9,0,25.55,1.600788531,78.60292053,54.62625698,99.87423166 +06/02/2024,35.9,21,7.2,31.5,28.45,0.587296347,61.90026869,43.10861965,100.7546851 +06/03/2024,29,16.7,3.1,0,22.85,7.150169485,69.49924897,56.20319733,100.2908149 +06/04/2024,35.2,18.6,12.9,0,26.9,3.284319116,64.37340288,30.52494642,99.14252698 +06/05/2024,39,20,11.2,0,29.5,7.868230951,86.35504065,46.51666258,100.9175754 +06/06/2024,37.7,27,10.9,0,32.35,7.262542747,80.42885231,49.94289302,100.9019222 +06/07/2024,39,24,8.3,0,31.5,1.405467004,71.57714546,45.22050735,99.73189084 +06/08/2024,34,24.5,8.9,0,29.25,4.251262327,91.62010018,42.65256025,99.19265752 +06/09/2024,30.2,22,1.4,0,26.1,6.250941504,68.96320327,54.01647485,99.45168945 +06/10/2024,33,23,0,0,28,2.393272585,91.11437465,47.47698405,100.8722572 +06/11/2024,35.2,26,8.3,0,30.6,6.72127508,95.80036583,36.30758449,100.8884751 +06/12/2024,33.5,23,3.4,2,28.25,4.433775064,99.46413468,43.4295436,99.59898618 +06/13/2024,28,24,0,1.4,26,2.714717877,75.39960611,50.87222178,100.0585261 +06/14/2024,32,24.7,1.7,12.4,28.35,3.380737917,73.80601048,31.79614719,99.52380784 +06/15/2024,32,23,3.4,0,27.5,6.092081482,78.24237461,35.68297786,99.3035727 +06/16/2024,26.5,23,0.4,0.2,24.75,2.412972787,99.67744275,57.44269929,99.32254967 +06/17/2024,25,20,0,0.8,22.5,3.079642835,94.47294108,47.13370719,100.3892516 +06/18/2024,29.2,19,5.3,0,24.1,5.798902645,93.83462589,48.10553386,100.1601381 +06/19/2024,34,22,6.7,0,28,0.807357128,71.88066534,44.33455958,100.3966977 +06/20/2024,36.7,23,8.4,0,29.85,0.807172783,64.69270887,42.09352127,99.94116301 +06/21/2024,36,24,7.6,0,30,5.136488936,64.09554132,45.71479697,99.8294713 +06/22/2024,35.2,22,9.7,0,28.6,3.87793072,97.61416973,57.48239806,100.2376371 +06/23/2024,36.2,25,4.8,0,30.6,1.858796071,73.63890081,33.63657435,100.6334437 +06/24/2024,34.5,26,6.2,0,30.25,1.502533205,76.02561515,40.11966246,100.4051282 +06/25/2024,29.4,23,1,21.5,26.2,1.10478278,84.47164061,35.73374391,99.85473167 +06/26/2024,33.5,24,7.3,0,28.75,0.208943025,83.59909714,31.04615749,100.178491 +06/27/2024,33.2,25,7.3,0,29.1,7.412019262,81.7031916,54.09525582,99.23977086 +06/28/2024,37.1,28,0,0,32.55,5.293937413,74.08573955,32.47366988,99.26620263 +06/29/2024,37,25,4.4,3.2,31,7.795921482,85.84159689,32.42226937,100.6053749 +06/30/2024,37.5,25,7,2.8,31.25,2.247343032,94.53078579,30.06957187,99.60539296 +07/01/2024,33,24,3.5,0,28.5,7.241374434,65.43996657,53.04910283,100.7257338 +07/02/2024,31,22,1.7,89.4,26.5,6.985683875,95.31059093,41.78872934,99.93596141 +07/03/2024,32.7,25.5,8.6,0,29.1,1.440855379,60.38869023,43.39010742,99.29769157 +07/04/2024,34.2,24,5.9,0,29.1,2.908296567,82.13931216,55.56637253,100.7501225 +07/05/2024,32,22,0,0,27,4.534198307,98.43461987,33.70703996,99.16661528 +07/06/2024,32,25,5.1,0,28.5,3.255502401,93.28879217,42.97715416,99.9385318 +07/07/2024,33.6,25,0,0,29.3,4.321281002,63.00689089,33.47655092,100.0627562 +07/08/2024,37.2,22,0,0.2,29.6,7.510482716,67.02255838,53.70346512,99.71511353 +07/09/2024,38.1,27,0,0,32.55,0.594620832,67.91696911,38.40285303,99.54224197 +07/10/2024,34.2,27,0,0,30.6,6.434961807,73.62647278,45.96733333,99.1282413 +07/11/2024,31,27.2,0,9.4,29.1,2.107733896,83.3824567,44.85875865,99.02372798 +07/12/2024,38,27,7.8,0,32.5,6.423584968,90.35240413,59.17897012,100.2368684 +07/13/2024,37.2,28,9.5,0,32.6,1.150384706,61.72116446,41.342202,99.56560234 +07/14/2024,37.5,24,8.2,62.4,30.75,0.55333375,61.7355791,48.09089524,100.6450976 +07/15/2024,33.5,25,7.2,0,29.25,3.056727964,71.30410311,55.36220141,100.3345067 +07/16/2024,31.2,26,4.2,0.2,28.6,6.438163267,73.29634418,33.31115313,100.923151 +07/17/2024,30.5,24,3.7,0,27.25,0.732417937,88.38442948,56.5132512,99.04636854 +07/18/2024,27.7,24,0.3,79.4,25.85,5.784969666,66.64907755,44.70536778,99.12576113 +07/19/2024,26,23,0,127.3,24.5,6.928677606,94.1349448,57.93726144,99.22378718 +07/20/2024,26,22.7,0,941.3,24.35,6.331935084,92.4811356,52.59652249,99.26960682 +07/21/2024,27.1,23,0,132.3,25.05,5.154291147,78.67125005,42.44234961,100.0249629 +07/22/2024,28.2,24,1.6,27.6,26.1,6.153915026,85.92095823,39.03321536,99.80041673 +07/23/2024,27.6,24,1.6,0.1,25.8,7.38964631,61.54405691,55.01148193,99.73978552 +07/24/2024,32.5,23,7.1,0,27.75,3.81115856,93.80899287,55.70751088,99.61054767 +07/25/2024,33.5,24,9.9,0,28.75,0.135296626,95.82693007,47.89235556,99.12255752 +07/26/2024,34.2,25,0,0,29.6,4.642631277,95.66504258,52.61795693,100.6790397 +07/27/2024,32.6,26,0,1.5,29.3,4.525959932,61.99972351,54.06456833,99.87762242 +07/28/2024,30.5,24,4,0.2,27.25,0.168027616,65.23152915,53.81279845,99.72197298 +07/29/2024,31,22,7.6,0,26.5,7.407366995,76.03270161,51.00732954,100.6046199 +07/30/2024,36.1,26,9.7,0,31.05,3.474863076,63.04435423,44.4571811,100.8726801 +07/31/2024,37,27,10.4,0,32,0.368407962,62.56062591,51.39183911,100.4142693 +08/01/2024,35,26,7.7,0,30.5,1.287486819,89.78633443,41.30027962,99.27939392 +08/02/2024,33,23.5,9.9,0,28.25,6.862845027,86.44314284,58.71314989,100.4505358 +08/03/2024,33,25,0,0,29,6.654085856,63.5563821,53.43975941,99.53501332 +08/04/2024,34.5,25,0,0,29.75,3.350306058,73.14792269,51.0956204,100.3320193 +08/05/2024,32,22.2,3,0,27.1,2.780671473,78.21175541,42.70556964,100.3548247 +08/06/2024,34.2,27,9,0,30.6,3.486575331,81.2647846,51.49294878,100.2669672 +08/07/2024,33,24,0,19.2,28.5,4.547629838,64.43943585,46.58673227,100.9391518 +08/08/2024,33,25,0,0.3,29,5.00621974,97.12773738,47.71675286,100.0449524 +08/09/2024,33.7,22,7.6,0.1,27.85,6.549165274,79.95258427,36.63114269,100.9620672 +08/10/2024,32,22,5.1,0,27,2.318334469,61.64949558,57.9533912,100.8328122 +08/11/2024,31.9,27,4,0,29.45,3.808626114,97.73460574,33.67493723,99.54745764 +08/12/2024,29.5,22,0.4,14.1,25.75,0.682707897,74.1588954,42.0517462,99.54176045 +08/13/2024,26,21,0.1,9.5,23.5,0.402741369,90.09045165,57.95026118,100.5380041 +08/14/2024,30.2,21,6.2,0.4,25.6,3.161649782,72.22904524,51.92518588,99.7039865 +08/15/2024,30.5,24,7.2,0,27.25,7.103174303,80.73568645,50.0057684,100.6793432 +08/16/2024,31.5,23,4.6,0,27.25,5.565463804,81.71395245,57.07308543,99.84197312 +08/17/2024,32.6,23,5.3,0,27.8,4.412707342,93.84238267,52.54362837,100.5713019 +08/18/2024,32,26,3.6,0,29,6.792672104,71.82488436,58.61721948,99.80583901 +08/19/2024,32.5,23,0,4.6,27.75,3.488482429,70.1626749,32.40922637,99.79208486 +08/20/2024,31.5,22,8.1,4.6,26.75,7.340676728,79.86340778,49.41812326,100.3174405 +08/21/2024,31,24,5.5,0,27.5,4.447988432,68.11552484,45.34491854,99.87114829 +08/22/2024,26,20,0,132.6,23,3.365537705,61.34704849,33.61791907,99.58873332 +08/23/2024,28.2,23,5.3,0,25.6,7.224199435,72.39222932,40.60077638,99.0900539 +08/24/2024,32.7,17.7,0,0,25.2,2.913654212,64.70675221,32.34962862,100.4990299 +08/25/2024,31.2,21.1,7.6,0,26.15,0.218582667,74.66661462,41.694387,99.14128254 +08/26/2024,27.5,18,0,0,22.75,0.369740762,70.90111909,59.37342882,100.6775678 +08/27/2024,26.5,19,5.7,0,22.75,1.252993381,60.62273761,59.11806322,100.3310852 +08/28/2024,23,19,0.4,66,21,2.156165217,85.60840346,30.41481885,99.46567242 +08/29/2024,21,20,0,116.3,20.5,0.679953089,69.19962589,55.14572595,99.94275513 +08/30/2024,22,21,0,58,21.5,7.563256783,85.28776679,49.53027969,100.1827454 +08/31/2024,24.2,19,0,6,21.6,2.098344905,65.04286082,57.1408758,100.351916 +09/01/2024,21.2,18,0,66.9,19.6,0.461000146,70.84475739,37.68888842,99.58401718 +09/02/2024,30,20,9.5,0,25,1.913690432,68.59035924,50.27872516,99.76803525 +09/03/2024,28.2,20,0,16.8,24.1,4.28771412,69.73927446,52.22960437,100.0968348 +09/04/2024,21,19,0,31.8,20,4.004446622,74.9380159,49.62674607,100.7911711 +09/05/2024,26.5,20,2.9,6.9,23.25,1.585714012,89.72837184,50.52427026,100.645406 +09/06/2024,25.2,20,2.6,10.7,22.6,0.66079992,93.70120611,51.05895149,100.476471 +09/07/2024,28.2,17,8.3,0,22.6,2.767977187,75.56865216,58.68355067,100.017003 +09/08/2024,31,18.2,10,0,24.6,5.08695628,98.52595491,51.11285969,99.54996719 +09/09/2024,34,20.2,10.2,0,27.1,4.690557484,66.36460682,48.83298811,99.3953745 +09/10/2024,33.1,21,9.7,0,27.05,0.11024542,78.51973302,37.25576424,99.74659339 +09/11/2024,34,20,0,0,27,5.717113372,61.29633786,56.61875165,99.69287957 +09/12/2024,34,20,0,0,27,7.376855913,96.60717848,32.53879861,99.80707041 +09/13/2024,32,24,8.8,0,28,2.866957441,66.82813162,53.51020467,100.604768 +09/14/2024,31,23,7.3,0,27,1.435740741,78.94845864,34.01817401,100.1336111 +09/15/2024,30,19.7,0,0,24.85,7.872885332,86.2216542,39.35426385,100.1617756 +09/16/2024,30,21,3.3,0,25.5,3.317365418,71.27222023,49.86381657,100.8661838 +09/17/2024,23,20,0,12,21.5,3.260100965,81.18055125,34.71745262,99.01338462 +09/18/2024,20.1,16,0,89,18.05,7.006089815,63.19867125,53.13298864,99.38647609 +09/19/2024,18.2,15.7,0,71.6,16.95,6.89373573,74.08182901,55.09854273,100.1259612 +09/20/2024,29.2,17.7,9.9,0,23.45,1.505538511,98.51319004,31.43411943,99.82431368 +09/21/2024,34,17.2,0,0,25.6,2.921865099,68.09646596,37.99423448,99.48247023 +09/22/2024,30,22,7.5,0,26,2.85558869,77.51167014,42.90640043,99.52537973 +09/23/2024,32,21,6.3,0,26.5,1.679203837,67.96351466,34.74893916,100.4458689 +09/24/2024,24,20,0,88.6,22,7.251087452,76.72289339,30.49080726,100.2451036 +09/25/2024,21,18,0,17.9,19.5,5.553563751,64.03048615,55.93871303,99.91910547 +09/26/2024,22,18.5,0,1.7,20.25,4.414714551,95.73314767,45.08808229,99.07778129 +09/27/2024,23.5,19,0,6.1,21.25,1.490930226,97.13373294,47.569664,99.8744143 +09/28/2024,19.2,12,0,80,15.6,7.26262846,86.06698625,34.57452432,99.78017382 +09/29/2024,29.5,15.7,9.7,0,22.6,6.099470255,87.94492142,53.29810055,100.7614626 +09/30/2024,30,17,9.6,0,23.5,0.443973154,76.89418616,59.4532932,100.2940678 +10/01/2024,27,17,0,0,22,5.795323584,63.66667525,37.38987832,99.95242826 +10/02/2024,31,20.7,0,0,25.85,2.65840171,95.07702184,39.82813177,100.2373616 +10/03/2024,32,21,0,0,26.5,6.599189437,94.98911629,33.58618033,99.4135966 +10/04/2024,21,12,0,0,16.5,6.734877036,68.65918288,54.34908243,100.4753191 +10/05/2024,14.2,10,0,17.5,12.1,6.332529938,95.09852505,44.90845228,100.4109053 +10/06/2024,13.5,11,0,7.9,12.25,1.081859154,79.85507012,47.17232103,99.66293254 +10/07/2024,14.1,12,0,3.6,13.05,2.385843464,63.28001117,31.82852643,100.3022249 +10/08/2024,14.2,13,0,6.6,13.6,0.500039844,95.25926032,35.13010358,100.7186664 +10/09/2024,18.6,13.7,0.8,0.2,16.15,1.877166623,81.16201563,44.04892168,997.5938124 +10/10/2024,16,12,0,5.2,14,3.712360558,60.77103461,64.82943716,993.5979278 +10/11/2024,17,11,3,1.2,14,2.342746138,70.16361638,51.29094533,991.7628058 +10/12/2024,20,10.2,6.9,0.8,15.1,0.801270219,96.21808788,3.593803177,998.3643797 +10/13/2024,24,13,8.6,0,18.5,1.837921522,34.9751401,31.96493368,995.8305421 +10/14/2024,19,15,0.1,21.6,17,4.535252404,74.46604879,27.85776566,999.5609568 +10/15/2024,18.7,13,0.4,5,15.85,2.832311112,75.91384801,70.16580058,992.4299757 +10/16/2024,15,4,5.3,0,9.5,0.138419252,56.95897818,11.63058519,996.1210292 +10/17/2024,15.2,7.5,9.4,0,11.35,4.091490663,55.3322441,74.20807663,998.4823809 +10/18/2024,21,11,7.6,0,16,3.747910544,48.68287706,2.786735615,998.7791477 +10/19/2024,13,8,0,2.1,10.5,3.163524692,88.21986677,62.06810719,991.8635914 +10/20/2024,13,6,0.3,1.1,9.5,4.178578203,77.69213218,13.81389647,991.3735247 +10/21/2024,19,6,0,0,12.5,2.402159992,6.203632907,16.02685324,996.3703165 +10/22/2024,18.2,7,7,0,12.6,3.919084671,48.04047566,32.30278057,998.7512118 +10/23/2024,18,7,4.1,0,12.5,1.53035267,56.60111906,75.12560108,992.8899164 +10/24/2024,20.1,7,5.4,0,13.55,1.118387464,22.52110091,79.12253372,996.4939209 +10/25/2024,20.6,9,0,0,14.8,2.812821526,5.482492195,78.66595587,994.0081994 +10/26/2024,22,9,3.5,0,15.5,4.553856053,82.14280488,4.626181566,992.5447426 +10/27/2024,20.2,11,4.4,0,15.6,3.816372587,80.81603588,6.028874289,993.6692654 +10/28/2024,22.7,9,0,0.1,15.85,0.158673865,45.80443158,20.65632985,997.697109 +10/29/2024,22,8,3.5,0,15,0.887453789,74.67277823,65.08998643,993.6298484 +10/30/2024,25.1,10,7,0,17.55,4.778106724,46.8395265,41.83134981,991.7772401 +10/31/2024,20.2,11,1.6,0,15.6,2.263866353,5.292648264,46.63720491,994.69716 +11/01/2024,16,11.7,2.5,0,13.85,2.394882132,77.74976521,26.1004152,998.8190396 +11/02/2024,18,8,1.5,0,13,3.040643766,26.58967558,67.43255209,995.574069 +11/03/2024,21,8,4.1,0,14.5,4.540258621,10.41841407,30.20110858,992.8161633 +11/04/2024,20.7,12.5,0,0,16.6,3.987869049,23.46443995,70.64442223,997.4378322 +11/05/2024,20,15,0,0,17.5,3.583654594,38.32661152,21.50018244,990.3153477 +11/06/2024,18.1,1,1.3,11.2,9.55,2.557115992,21.98589255,29.32485104,992.0244304 +11/07/2024,8,1,2.8,17.4,4.5,4.665941847,94.60197101,58.93242722,996.5752831 +11/08/2024,11.2,4.1,9.8,0,7.65,3.301702448,23.57242048,2.186504901,997.7290228 +11/09/2024,14.1,7.6,0,0,10.85,2.058934699,45.09437243,69.30390511,994.7092371 +11/10/2024,17,8,0,0,12.5,3.841810696,12.92553226,54.42344617,994.8572128 +11/11/2024,18,6,0,0,12,0.644832197,33.34158941,39.96890362,998.8632392 +11/12/2024,18,5,8.3,0,11.5,2.312517343,4.978844428,59.50403567,991.1437281 +11/13/2024,21,7,0,0,14,1.956207311,34.74300614,48.95183621,992.1866343 +11/14/2024,21.2,9.5,0,0,15.35,3.07193253,36.81435994,65.7498684,999.1292562 +11/15/2024,19,5,5.2,0,12,1.196423541,10.91424284,74.86791628,992.3935515 +11/16/2024,15.7,7,5.5,0,11.35,1.036385586,34.43884987,56.68394531,992.9673609 +11/17/2024,21,4,5.7,0,12.5,1.857002257,14.39853754,2.551190017,995.6165566 +11/18/2024,21.2,6,7.9,0,13.6,4.111405765,19.9290189,67.5976818,995.7343882 +11/19/2024,14.7,9,4.4,0,11.85,1.918562358,49.94868135,42.81789031,993.8813496 +11/20/2024,11,5,0,2,8,1.039291581,51.78251782,4.463631982,994.5420601 +11/21/2024,13,1,4.2,0,7,4.036407284,69.81468878,0.104808171,993.3741861 +11/22/2024,9,-3,9.6,0,3,3.845392106,16.53710324,15.38723525,994.2331128 +11/23/2024,14.2,1.2,0,0,7.7,0.707825492,44.33481956,58.61083101,992.2189248 +11/24/2024,19,3,8.2,0,11,4.52637937,20.99539288,31.4020748,995.1801713 +11/25/2024,20,3,8,0,11.5,2.117879238,39.37828131,66.96174265,998.7733246 +11/26/2024,16.1,2,6.4,0,9.05,3.867360794,34.88341523,34.44849662,994.7083355 +11/27/2024,15.1,2.7,5.2,0,8.9,2.145427763,76.53378685,56.319719,994.7436233 +11/28/2024,15,4,4.8,0,9.5,4.951984368,52.92724194,15.82653576,994.6529093 +11/29/2024,14.2,6,0,0.8,10.1,3.19230682,40.41014111,7.226197432,999.7738198 +11/30/2024,11.2,-3,9.3,0,4.1,0.926576228,25.82723684,52.0618022,996.9668959 +12/01/2024,11.7,-1,9,0,5.35,0.894124336,62.25792837,19.89598956,998.8484882 +12/02/2024,14,6,8.7,0,10,4.615125369,74.84890931,13.30517267,998.0780048 +12/03/2024,17,1,8.8,0,9,1.57586554,38.45197732,13.42350848,992.0179088 +12/04/2024,18,0,8.1,0,9,0.904553665,30.93240783,42.70636967,991.9387711 +12/05/2024,17,1,7,0,9,1.215852711,44.78558449,47.48423392,998.9166757 +12/06/2024,14.7,5,7.6,0,9.85,3.614361125,97.1296797,9.219579979,990.666107 +12/07/2024,10.2,2.7,5.5,0,6.45,0.878990137,43.17674926,51.43358471,993.4567391 +12/08/2024,9.5,0,0.1,0,4.75,3.269247356,62.23715051,45.48329999,993.2063798 +12/09/2024,15.2,1,5.4,0,8.1,4.022875458,91.35690563,47.75956053,992.1908819 +12/10/2024,10,3.7,0,12.3,6.85,3.639386655,78.5437008,32.12972023,999.2277194 +12/11/2024,11.7,5,3.1,4.1,8.35,1.11319501,52.71693,52.70193285,999.0518698 +12/12/2024,7.5,-4,6.9,0,1.75,1.674962092,65.06694191,33.92964863,996.0879239 +12/13/2024,9.1,-2,5.2,0,3.55,2.187095455,32.39245913,64.30913287,994.6723751 +12/14/2024,16,0,6.9,0,8,3.798850582,75.11384074,6.891118117,995.7982833 +12/15/2024,12,0,3.5,0,6,1.035277114,48.82686395,38.55770998,995.1133008 +12/16/2024,14,4,4.6,0,9,2.67016877,53.31520317,12.43357371,999.3301866 +12/17/2024,4.2,-2,5.4,0,1.1,0.864907506,14.21237572,56.5362405,995.1183684 +12/18/2024,10,-1,5.5,0,4.5,1.909772983,59.27108733,4.00327815,996.9625598 +12/19/2024,16,1.7,8.2,0,8.85,1.250807856,65.8476235,49.43251195,997.9478797 +12/20/2024,18,4,8,0,11,0.481850619,53.55137724,32.74201955,999.0239499 +12/21/2024,18,0.5,7.8,0,9.25,0.541595521,90.90622257,67.70402955,999.9159763 +12/22/2024,10.2,1,5.9,0,5.6,0.06612086,20.5426078,10.31850067,999.4237036 +12/23/2024,6,1,1.8,0.1,3.5,0.859107122,40.24382789,1.791619337,993.3242683 +12/24/2024,1.2,-5,0,0.1,-1.9,1.512310716,95.0786919,26.45124686,995.5480578 +12/25/2024,-2.4,-9,2.9,0,-5.7,2.204920233,48.2874284,34.29822707,990.3797784 +12/26/2024,2.2,-10,8,0,-3.9,4.623851527,89.51977574,58.12366656,992.4233383 +12/27/2024,6.6,-7.2,8.2,0,-0.3,3.202673663,12.54894565,34.5152049,995.1459293 +12/28/2024,10,-2.5,7.6,0,3.75,3.078218758,82.70796643,21.64053824,992.0743198 +12/29/2024,9.1,-4,0,0,2.55,0.471935461,42.91018972,33.50666509,993.9809226 +12/30/2024,11,-6,0,0,2.5,3.839000521,10.74421683,13.75042318,990.4704482 +12/31/2024,9.6,-2,0,0,3.8,2.502260621,56.14289864,76.39579423,996.4518444 +01/01/2025,13.2,-1.5,6.7,0,5.85,2.073814959,3.079899611,32.07143785,992.6920086 +01/02/2025,6.7,-5,5.7,0,0.85,3.71001846,72.21367993,15.34049208,992.2125315 +01/03/2025,10.7,-2.2,4.9,0,4.25,0.948047975,46.77895292,69.7880106,993.4508971 +01/04/2025,3.5,0,0,18.8,1.75,1.878666744,75.58431259,23.25705032,994.2461823 +01/05/2025,2,0,0,1.4,1,4.838005785,26.03560103,26.27580111,998.3241788 +01/06/2025,3.2,1,0,0.4,2.1,4.092492413,83.54081991,35.43828164,997.0121926 +01/07/2025,7,-3,1.7,0,2,0.506264071,33.2288221,75.64066301,994.8193567 +01/08/2025,8.5,-2,3.8,0,3.25,1.190117838,11.42935616,29.46985465,990.0651154 +01/09/2025,5.7,-0.5,2.7,0,2.6,3.851445847,91.61052343,49.17343511,990.0129033 +01/10/2025,4,-5,1,0,-0.5,0.674348593,6.433733668,24.35317955,997.3757198 +01/11/2025,5,-1,2.6,0,2,4.249531266,36.12808253,70.58538764,993.1932712 +01/12/2025,11,-6,4.6,0,2.5,1.836439656,35.03113673,77.2288861,992.0565234 +01/13/2025,5.7,-4,7.9,0,0.85,2.254046993,2.484299906,11.09749577,994.3869926 +01/14/2025,3,-4,0.6,0,-0.5,3.629512646,27.71311617,79.72958484,992.3421341 +01/15/2025,16,-2.5,6.4,0,6.75,4.25487037,64.96235315,13.73520063,992.250467 +01/16/2025,7,-2,4.4,0,2.5,1.44899428,9.935864108,13.2425088,990.6685684 +01/17/2025,6.5,-4,4.3,0,1.25,0.649999446,4.641856861,76.67289058,992.482832 +01/18/2025,9,-3,3,0,3,4.746531369,84.24548532,66.91014791,997.8948295 +01/19/2025,5,-1,0,0,2,1.097209646,23.56115022,74.69954004,993.241307 +01/20/2025,-0.7,-3,0,0,-1.85,4.611480563,73.70915507,30.87752962,993.9854701 +01/21/2025,-1.2,-3,0,15.4,-2.1,3.391939093,84.02996463,42.13595222,991.9964772 +01/22/2025,0.1,-2,0,10,-0.95,2.033181208,57.53039184,3.714809124,995.1479072 +01/23/2025,0.2,-2,0,8.8,-0.9,2.408420146,19.88385084,4.626633322,991.3969554 +01/24/2025,1.7,-2.5,0,1.2,-0.4,2.671740847,10.49016941,53.59521034,993.9706621 +01/25/2025,5.6,-2.9,3.5,0,1.35,2.031179937,80.19884495,15.40792824,990.1047277 +01/26/2025,2,0,0,2.4,1,1.115152834,36.43493089,68.47916941,994.0607787 +01/27/2025,3.2,-1,0.7,0,1.1,0.192905733,66.10217543,0.273688523,994.1231805 +01/28/2025,1.2,-4,0,0.6,-1.4,4.965992572,74.64850642,58.88168911,991.7134194 +01/29/2025,4.2,-5,1.6,0,-0.4,0.213336338,41.8993407,62.91776815,991.365934 +01/30/2025,6.6,-3,5.5,0,1.8,0.435320718,73.1872549,74.57792928,995.7561813 +01/31/2025,7,-2,9.9,0,2.5,3.704125778,54.90562291,34.22486486,992.5842389 +02/01/2025,6.2,-3,9,0,1.6,2.763080033,73.22485736,4.271263972,993.6252272 +02/02/2025,8,-2.7,6,0,2.65,4.989729966,57.5115012,59.81411755,996.1685787 +02/03/2025,9.1,-4,5.7,0,2.55,0.799909478,91.98081091,20.73654991,992.2689205 +02/04/2025,6,-4,6,0,1,0.775697374,40.24354869,61.77903026,990.3717856 +02/05/2025,6,-4,6.6,0,1,4.618160311,14.51932845,30.51710147,992.9514153 +02/06/2025,5.5,-1,3.5,0,2.25,3.178197338,7.353759649,72.22276313,994.9309826 +02/07/2025,5.5,-4,4.2,0,0.75,1.577666151,65.86132982,44.2498348,992.3224174 +02/08/2025,8,-1.5,4.1,0,3.25,3.381655544,63.42133679,12.44133361,993.4986071 +02/09/2025,10.1,-3,5.1,0,3.55,0.144969775,13.44777888,4.322501388,991.6181812 +02/10/2025,11,-2,4.9,0,4.5,1.712175704,52.62220491,76.00164666,994.748692 +02/11/2025,9.2,-2,2.4,0,3.6,3.284950768,40.33188779,73.96974108,994.4213182 +02/12/2025,10.1,1,2.9,0,5.55,1.146562493,59.31716184,21.10144671,996.8491908 +02/13/2025,7.7,0,2,0,3.85,3.880599015,93.85990537,76.13158849,993.9844019 +02/14/2025,1.7,-1,0,0,0.35,1.088907275,2.348360344,56.19500663,998.5707612 +02/15/2025,4.5,0,1.2,0,2.25,2.248139809,50.66348088,58.80178213,997.7569835 +02/16/2025,2,-2,0,0,0,3.277424562,23.26971113,31.56821464,998.9841681 +02/17/2025,1.2,-4,2,0.6,-1.4,2.094468062,56.10173063,40.68633703,994.3587632 +02/18/2025,5,-1,3.8,0,2,1.998456483,16.74391229,3.414629429,994.7410353 +02/19/2025,5.5,-6,7,0,-0.25,1.283595195,38.97953955,25.66495095,995.5790431 +02/20/2025,10,-4,7.5,0,3,1.806173003,33.11566703,15.41576093,991.3257463 +02/21/2025,11.6,0,7.2,0,5.8,2.903525693,20.38086952,3.511247878,993.9883234 +02/22/2025,7.1,-2.7,4.9,0,2.2,0.781619142,57.46533323,32.652135,998.7507153 +02/23/2025,9,-2,5.8,0,3.5,0.362259906,16.69543799,36.01679512,995.713163 +02/24/2025,14,-0.2,6.1,0,6.9,1.434641572,31.63944739,54.0755037,998.6735907 +02/25/2025,17,2,7.8,0,9.5,3.545389297,10.16769918,11.73757618,996.3778106 +02/26/2025,18,0,10.2,0,9,0.978410993,8.089732894,68.1710586,997.3183783 +02/27/2025,18,4,7.3,0,11,3.53851199,53.65913316,26.31094659,990.949447 +02/28/2025,19,8,4.1,0,13.5,2.980324413,85.62585575,20.95581775,996.3432756 +03/01/2025,14,1,9,0,7.5,3.262868772,37.99437782,53.31220721,993.3009853 +03/02/2025,19,3,8.6,0,11,1.389867369,82.22616133,4.879127051,992.0734988 +03/03/2025,20.1,5,4.5,0,12.55,4.451725435,12.78255747,25.7484202,997.9444329 +03/04/2025,23,8,8.3,0,15.5,3.548051151,6.812821626,29.23698089,995.4001067 +03/05/2025,16.2,6,8.2,0,11.1,4.116337833,32.11668089,4.112060552,993.8744095 +03/06/2025,13.2,5,1.6,0,9.1,4.089345001,42.62774734,58.98310497,993.8485821 +03/07/2025,20.5,5,9.1,0,12.75,4.993891357,31.87492691,2.362025574,992.2904204 +03/08/2025,20.7,8.2,8.3,0,14.45,2.312046746,76.05267723,68.44693515,998.1594143 +03/09/2025,22,9.6,7.2,0,15.8,0.055769416,15.39081883,8.638855447,999.0464535 +03/10/2025,24.7,9,7.5,0,16.85,0.005670475,74.26795008,77.19307968,998.8848678 +03/11/2025,25,11,7.2,0,18,3.990365269,4.00765104,38.81948537,997.1637423 +03/12/2025,16.6,9,0,3.2,12.8,3.919333345,41.82950561,56.77979438,994.1234924 +03/13/2025,14,10,0.1,0,12,2.825437851,21.86853712,26.32839762,991.0247351 +03/14/2025,20.6,12,3.5,0,16.3,0.754970611,45.54447899,49.0273115,993.6265399 +03/15/2025,25.1,12,5,0,18.55,2.048301771,61.1470996,65.25530603,992.0454259 +03/16/2025,16,4,0,8.4,10,3.805798878,76.05527487,19.50163675,999.4797099 +03/17/2025,5.1,2,0,0,3.55,3.354420888,35.69599512,72.02350843,999.4491421 +03/18/2025,12.5,3,6.7,0,7.75,0.576908798,17.76337654,68.86349585,990.0334637 +03/19/2025,6.2,2,1.4,0,4.1,2.290695305,23.10535248,16.48431678,998.6128945 +03/20/2025,9.2,2,1,0,5.6,4.715055542,88.08126683,51.00767188,100.560429 +03/21/2025,9,3,1.1,0,6,4.483016221,93.76796649,53.85038065,99.17899938 +03/22/2025,12.5,5,2.4,0,8.75,7.830764713,86.26753391,51.357923,99.249421 +03/23/2025,17.5,7,9.3,0,12.25,6.417783926,63.41990833,41.1041263,99.27358219 +03/24/2025,16,9,4.3,0,12.5,6.230392775,70.17755548,38.88463653,100.8785959 +03/25/2025,12,5,0,17,8.5,0.205831298,89.4843867,59.29883151,100.7198063 +03/26/2025,20.5,8.7,6.5,0,14.6,0.163408409,96.35216013,40.26393264,100.3655662 +03/27/2025,15,5,9,0.1,10,1.407071471,70.68494444,50.09553743,100.8117187 +03/28/2025,18.2,10,8.3,0.2,14.1,1.713665395,72.09662344,51.10958142,99.50447089 +03/29/2025,22,11,7.1,1,16.5,5.138111925,86.00331439,40.86000174,99.77194402 +03/30/2025,17,9,2.4,0,13,5.838427302,86.77355773,31.8722418,100.7772588 +03/31/2025,15,7,4.5,0,11,2.443320162,81.7752005,41.27874155,100.4632934 +04/01/2025,18,7,8.6,0,12.5,3.213826727,90.98885605,33.19631502,99.79949683 +04/02/2025,19.1,4,9.9,0,11.55,0.927217831,69.20444807,30.2159329,100.2411965 +04/03/2025,20.7,9,9.8,0,14.85,5.047173118,65.67664242,43.62789994,100.0433063 +04/04/2025,23.5,13.7,7.3,0,18.6,4.019227453,95.4352791,38.59363068,100.863286 +04/05/2025,31,14,8.4,0,22.5,5.1896774,98.78238278,54.05580428,100.64538 +04/06/2025,20,9,7.5,0,14.5,4.306017152,71.90678959,55.63206229,99.88857156 +04/07/2025,23.5,12.7,8.7,0,18.1,5.748640738,74.33694086,44.10818586,100.3973988 +04/08/2025,29,16,8.8,0,22.5,4.322096859,75.68514862,59.91387033,99.50046412 +04/09/2025,34,15.6,8.4,0,24.8,0.768667839,70.90642033,51.72299162,99.97701851 +04/10/2025,33,20.7,9.9,0,26.85,6.066847184,99.29748935,53.65431259,100.7263295 +04/11/2025,33,15,9.5,0,24,6.689269404,83.59190316,32.01693548,99.03842972 +04/12/2025,17,11,0,0,14,6.669699709,81.45466032,41.6354395,99.12433492 +04/13/2025,19.5,9,9.6,0,14.25,1.119034762,64.10222864,37.42169887,100.9027476 +04/14/2025,17,13,1.5,0,15,0.242829187,63.11297486,54.72126295,99.03640488 +04/15/2025,16,8.7,2.1,0,12.35,1.246624897,80.37225337,43.85538706,99.05870215 +04/16/2025,20,6,6.8,0,13,0.830803023,91.04189601,36.74111036,99.60838649 +04/17/2025,19.1,11,2.8,0,15.05,3.325237513,79.04639713,33.39653256,99.38094306 +04/18/2025,23,9,7.7,0,16,6.18120899,87.60487196,49.35119272,100.0767139 +04/19/2025,26.2,11,10.2,0,18.6,4.639834629,64.09826517,40.43946275,99.96061177 +04/20/2025,27.5,14,9.4,0,20.75,5.679387566,75.81767583,45.43203872,100.7123931 +04/21/2025,29,16.6,9.3,0,22.8,0.530746639,65.07628152,41.07372262,100.5813123 +04/22/2025,23,10.8,7.8,0,16.9,2.286508283,80.77753278,37.63387988,99.11017145 +04/23/2025,28.1,18.1,9.2,0,23.1,5.977711645,69.74479376,50.96245144,99.57679895 +04/24/2025,30,21,4.8,0,25.5,3.676098295,91.26262322,45.62328242,100.4078937 +04/25/2025,30.7,19,5.2,0,24.85,6.308733711,85.51504105,33.58961675,100.120446 +04/26/2025,28,18,6,0,23,6.308904038,62.40331612,37.73060199,100.3700631 +04/27/2025,20,13,0,0.1,16.5,1.336932748,66.92702878,41.8143059,99.4164784 +04/28/2025,13.4,5,0,15.1,9.2,7.18307022,67.1741787,42.69510333,99.53419522 +04/29/2025,19.4,11.8,7.2,0,15.6,6.044351757,80.71144406,52.28299736,99.1466889 +04/30/2025,17.2,8,0.5,0,12.6,0.802455948,83.33400742,38.92543314,99.86961453 +05/01/2025,26.1,14,11.9,0,20.05,0.416027439,81.68898801,31.855326,99.49463919 +05/02/2025,30,11,10.9,0,20.5,0.07435158,64.9738007,41.19094377,100.0827523 +05/03/2025,32.6,20,11.5,0,26.3,5.554479602,63.95247044,52.13265539,100.2461948 +05/04/2025,31.8,19,11.9,0,25.4,2.667546062,98.39461704,34.60111962,99.69347706 +05/05/2025,31,19,11.2,0,25,3.56577381,71.05591675,45.52978672,99.95419835 +05/06/2025,31,15,9.5,0,23,6.361817299,77.01240177,32.71978046,100.4552353 +05/07/2025,32.7,21,8,0,26.85,3.32,56.4,35.46,99.75 +05/08/2025,33.4,21.7,9,0,27.55,7.68,71.87,43.07,100.04 +05/09/2025,31.3,19.8,9,0,25.55,8.46,40.19,47.51,100 +05/10/2025,27.3,19.1,8,0.4,23.2,8.23,40.49,46.29,99.15 +05/11/2025,29.4,21.1,5,0.8,25.25,6.26,63.1,39.32,100.92 +05/12/2025,33.8,18.5,8,0,26.15,1.44,53.65,39.73,100.1 +05/13/2025,33.1,17.9,9,0,25.5,8.56,67.32,31.01,99.87 +05/14/2025,34.8,19.7,8,0,27.25,9.25,51.51,34.82,99.13 +05/15/2025,29.4,20.7,10,0,25.05,5.4,44.29,38.69,99.13 +05/16/2025,31.9,17,10,0,24.45,8.57,70.75,40.24,100.75 +05/17/2025,35.8,20.4,10,0,28.1,7.15,46.56,42,100.22 +05/18/2025,32.1,22.3,9,0,27.2,8.22,77.9,34.46,99.62 +05/19/2025,27,20.7,4,9.8,23.85,1.1,75.7,47.6,100.77 +05/20/2025,27.3,20.8,6,1.8,24.05,9.27,70.27,35.67,99.67 +05/21/2025,32.1,22.2,9,0,27.15,7.12,62.39,35.32,99.66 +05/22/2025,33,19.4,10,0,26.2,8.72,55.91,33.3,100.03 +05/23/2025,33.7,20.7,10,0,27.2,1.84,53.86,38.65,100.71 +05/24/2025,35.6,23,10,0,29.3,8.07,44.28,49.56,99.62 +05/25/2025,36.8,25.3,10,0,31.05,9.51,71.55,38.41,99.01 +05/26/2025,29.5,25.6,5,0,27.55,4.89,79.31,31.23,99.15 +05/27/2025,32.1,23.4,10,0,27.75,8.74,76.96,40.71,99 +05/28/2025,33.7,20,9,0,26.85,1.55,68.22,46.22,100.06 +05/29/2025,27.9,19.3,6,3,23.6,9.26,65.15,48.88,100.44 +05/30/2025,24.4,18.8,7,1,21.6,3.97,75.17,36.21,99.27 +05/31/2025,30.7,20.7,10,0,25.7,2.07,75.83,46.75,100.23 +06/01/2025,35,21.6,10.4,0,28.3,8.32,45.9,47.16,100.2 +06/02/2025,37,24.7,9.4,0,30.85,9.34,42.91,38.83,100.09 +06/03/2025,36,26,8.3,0,31,4.05,56.24,47.76,99.71 +06/04/2025,30,22,0.2,0.4,26,8.5,51.06,38.12,100.85 +06/05/2025,37,23,9.7,0,30,3.26,41.31,31.46,100.03 +06/06/2025,36,23,12,0,29.5,9.29,48.98,48.53,99.05 +06/07/2025,33.5,23,8.6,0,28.25,5.02,53.44,36.03,99.01 +06/08/2025,37,25,7,0,31,6.42,77.49,45.39,99.41 +06/09/2025,34,21,4.9,8.5,27.5,4.13,50.59,45.44,99.39 +06/10/2025,29.6,21,5,1.1,25.3,9.59,79.7,38.62,100.26 +06/11/2025,34,24,9.2,0,29,2.22,64.3,39.27,100.72 +06/12/2025,30,20.2,2.3,0,25.1,1.92,65.95,48.21,99.27 +06/13/2025,37,19,9.7,0.2,28,4.93,56.58,39.88,100.3 +06/14/2025,34.9,21,11.4,0,27.95,6.52,52.49,32.43,99.11 +06/15/2025,36,24,10.4,0,30,3.99,64.5,31.45,99.44 +06/16/2025,40,28,10.1,0,34,3.1,40.57,33.97,100.59 +06/17/2025,40.1,25,10.4,0,32.55,8.59,76.25,47.72,100.84 +06/18/2025,37.3,26,9.6,0,31.65,9.94,40.62,34.62,99.03 +06/19/2025,37,25,8,0,31,1.12,42.99,31.54,99.37 +06/20/2025,38.4,26,9.7,0,32.2,7.16,79.02,44.69,100.81 +06/21/2025,37,28,8.1,0,32.5,1.59,78.38,48.62,100.5 +06/22/2025,38.9,27,8.3,2,32.95,5.87,79.75,32.15,100.18 +06/23/2025,37.3,27,7.1,4.3,32.15,2.5,64.8,39.46,99.73 +06/24/2025,41.6,28,10.8,0,34.8,4.5,58.55,48.59,99.59 +06/25/2025,39.8,30,10.3,0,34.9,4.37,73.51,42.58,99.97 +06/26/2025,34.3,25,0.8,2,29.65,4.83,46.27,32.69,100.89 +06/27/2025,29.3,24,1.4,22.5,26.65,2.56,67.03,40.45,99.42 +06/28/2025,39,24,10.7,0,31.5,7.99,46.99,38.46,100.45 +06/29/2025,33.9,23,8.9,0,28.45,7.39,77.32,38.16,99.89 +06/30/2025,32,24,6.5,4,28,2.43,75.21,31.44,99.37 +07/01/2025,34,25.7,6.9,14,29.85,5.58,53.65,35.32,100.57 +07/02/2025,36,24,4.7,10,30,3.37,51.11,33.35,100.98 +07/03/2025,30,24,3.1,13,27,1.16,41.56,34.79,99.27 +07/04/2025,34,25,6.2,0,29.5,3.29,47.79,36.52,100.62 +07/05/2025,28,24,0.4,35.8,26,9.15,47.8,35.56,100.03 +07/06/2025,33.5,24,7.9,0,28.75,3.75,43.03,36.8,100.17 +07/07/2025,36.4,24.5,12.1,0,30.45,6.64,52.26,43.73,100.76 +07/08/2025,36.4,27,11.5,0,31.7,3.16,44.25,42.29,100.91 +07/09/2025,36.2,26,8.7,0,31.1,7.87,76.14,46.54,100.67 +07/10/2025,28,23,3,0,25.5,1.76,50.23,33.3,99.91 +07/11/2025,26,23.9,0,0,24.95,4.41,55.04,42.39,99.84 +07/12/2025,26.3,23.9,0.3,0,25.1,3.79,49.15,45.11,100.18 +07/13/2025,30,25,1.5,0,27.5,8.02,78.29,31.96,100.76 +07/14/2025,35.9,28,7.5,0,31.95,3.57,67.86,48.22,99.93 +07/15/2025,32.1,27,2.5,24,29.55,8.66,76.72,35.1,100.87 +07/16/2025,31,23,0.5,4.4,27,2.76,67.55,34.47,100.29 +07/17/2025,35.5,24,10.4,0,29.75,5.77,42.28,34.78,100.15 +07/18/2025,35.1,26.9,7.3,0,31,5.73,53.85,42.65,99.28 +07/19/2025,28,19,0,35,23.5,6.51,54.03,35.36,100.43 +07/20/2025,27.4,21,2.3,27.1,24.2,3.41,45.02,45,100.56 +07/21/2025,34.7,24,11,0,29.35,6.98,47.7,45.2,99.58 +07/22/2025,26.1,21,0,176,23.55,8.36,74.69,42.94,99.31 +07/23/2025,32,22,10,0,27,1.26,57.95,48.24,100.54 +07/24/2025,34.1,24,11.7,0,29.05,7.25,77.09,36.16,99.59 +07/25/2025,34.1,22,8.3,90.5,28.05,3.29,54.58,40.89,99.37 +07/26/2025,31.8,25,6.8,0,28.4,3.16,55.95,38.64,99.77 +07/27/2025,31.3,23,1.5,52.2,27.15,3.18,67.15,38.17,99.16 +07/28/2025,30,22.6,5.4,0,26.3,5.31,66.7,49.75,99.95 +07/29/2025,30.9,25,8.9,0,27.95,5.26,62.47,33.54,99.64 +07/30/2025,32,25,7.5,0,28.5,3.04,43.73,44.45,99.14 +07/31/2025,32.2,25,7.3,0,28.6,2.89,41.42,33.41,100.46 +08/01/2025,34.1,26,8.8,0,30.05,2.53,77.42,30.25,100.29 +08/02/2025,34.7,27,8,0,30.85,6.82,61.11,48.85,100.95 +08/03/2025,36.1,28,8.3,0,32.05,3.69,50.49,36.82,100.16 +08/04/2025,37,29,9.3,0,33,2.83,40.2,47.87,99.6 +08/05/2025,37,29,9.3,0,33,4.57,55.12,32.05,100.76 +08/06/2025,37,29,10,0,33,5.44,65.05,35.08,100.75 +08/07/2025,35.5,29,7,0,32.25,8.31,62.96,34.36,99.58 +08/08/2025,36,25,4.4,76,30.5,9.08,75.63,35.39,99.5 +08/09/2025,27,21,2.3,0.4,24,2.29,70.04,34.89,100.65 +08/10/2025,27,21.7,2.6,0,24.35,3.9,68.45,40.34,99.63 +08/11/2025,34,26,6.5,0,30,6.47,55.74,31.58,99.5 +08/12/2025,37,30,9.8,0,33.5,5.51,48.04,46.88,99.4 +08/13/2025,38,27,8.9,0,32.5,9.27,71.16,30.48,99.77 +08/14/2025,35.4,29,6,0,32.2,3.54,40.72,47.06,99.46 +08/15/2025,38,29.6,5.6,0,33.8,4,71.52,45.9,100.52 +08/16/2025,31,25,0.1,0,28,1.6,46.81,47.5,99.99 +08/17/2025,33,27,4.7,0,30,4.31,48.14,39.87,100.47 +08/18/2025,37,29,7.1,0,33,7.76,65.52,35.58,99.86 +08/19/2025,36,28,6.1,0,32,9.31,67.72,43.26,100.94 +08/20/2025,34,25,7.1,0,29.5,8.37,55.15,46.16,99.44 +08/21/2025,37,27.7,7,0,32.35,3.52,47.74,35.03,99.8 +08/22/2025,38,26,3.4,0,32,5.29,65.77,45.24,100.14 +08/23/2025,32,22.7,7.3,0,27.35,1.8,48.36,45.01,100.07 +08/24/2025,32,23,8.8,1.4,27.5,2.23,76.5,37.62,99.25 +08/25/2025,27,21,0,9.5,24,7.47,60.68,32.31,99.33 +08/26/2025,29,18,1.6,0.2,23.5,4.52,68.53,47.5,100.73 +08/27/2025,22,17,0,4.6,19.5,3.39,52.73,49.02,99.41 +08/28/2025,18.9,16,0,22.8,17.45,2.5,40.71,31.28,99.31 +08/29/2025,22.1,17,0,13.6,19.55,5.86,68.37,33.83,100.87 +08/30/2025,22.6,17.5,0.8,9.3,20.05,2.94,71.64,32.16,100.97 +08/31/2025,29.4,18,7.9,0,23.7,7.47,75.69,45.25,99.2 +09/01/2025,30,19.5,9.7,0,24.75,6.66,57,40.55,100.21 +09/02/2025,29,20.5,7.8,0,24.75,2.04,74.63,33.94,99.56 +09/03/2025,28,17,2.1,0,22.5,3.38,42.84,42.66,100.32 +09/04/2025,31.3,18,8.7,0,24.65,4.3,60.3,38.95,99.69 +09/05/2025,34.8,19,9.4,0,26.9,8.85,78.34,41.66,99.42 +09/06/2025,35.2,19,9.8,0,27.1,1.44,67.91,49.62,100.06 +09/07/2025,33.4,19,9.3,0,26.2,1.24,42.65,30.04,99.35 +09/08/2025,32.3,22,6.2,0,27.15,6,53.77,45.05,99.15 +09/09/2025,26,20,0.1,1.2,23,5.15,74.57,45.63,99.17 +09/10/2025,25,16,2.7,5,20.5,3.17,51.86,31.68,100.38 +09/11/2025,31,17,7.4,0,24,2.03,66.54,34.87,99.49 +09/12/2025,31.8,18.7,7.8,0,25.25,8.4,79.13,36.8,100.26 +09/13/2025,30.2,21,7.1,0,25.6,2.69,74.23,41.58,99.86 +09/14/2025,28,22,7.4,0,25,7.67,69.14,36.56,100.64 +09/15/2025,30,18,6.3,0,24,8.14,64.54,40.55,100.63 +09/16/2025,31.4,18,8.6,0,24.7,3.91,73.55,31.1,100.98 +09/17/2025,32.8,20,7.7,0,26.4,6.69,63.57,45.31,100.36 +09/18/2025,33,23,8.2,0,28,7.9,51.5,30.45,100.11 +09/19/2025,28,20,4.3,0,24,5.09,66.85,32.09,100.62 +09/20/2025,23.5,18,2.4,0,20.75,5.67,68.91,36.85,100.82 +09/21/2025,27,16.1,7.3,0,21.55,2.84,76.81,37.9,100.92 +09/22/2025,32,18,8.3,0,25,1.4,68.62,36.98,100.24 +09/23/2025,24.6,13,8.3,0,18.8,7.06,63.19,35.02,100.92 +09/24/2025,23.4,10,2.4,0,16.7,4.17,44.93,30.7,99.35 +09/25/2025,28.7,13,7.4,0,20.85,6.63,61.35,32.84,99.77 +09/26/2025,29.9,17,9.3,0,23.45,2.61,56.21,44.44,99.22 +09/27/2025,25.7,14,2.2,16,19.85,8.05,55.65,36.85,99.94 +09/28/2025,31.2,15,8.5,0,23.1,1.21,64.76,48.24,99.29 +09/29/2025,32.6,19,8.4,0,25.8,8.56,61.1,48.85,100.52 +09/30/2025,28.9,21,2.7,11.6,24.95,5.4,53.26,33.55,99.83 +10/01/2025,27,21,1.7,0,24,9.17,51.49,47.71,99.93 +10/02/2025,23.1,20,0.3,0,21.55,5.21,66.35,45.9,99.13 +10/03/2025,21.5,10,0,48.1,15.75,6.99,62.26,30.23,99.08 +10/04/2025,10.5,7,0,28.2,8.75,2.19,41.15,44.58,99.34 +10/05/2025,10.3,7,0,18.8,8.65,6.98,66.29,35.18,99.72 +10/06/2025,12.1,6.6,0,0,9.35,6.28,71.56,47.81,100.97 +10/07/2025,16,9.2,3.8,0,12.6,8.63,46.89,37.44,100.53 +10/08/2025,17,10.3,3.2,0,13.65,9.68,48.51,31.49,99.85 +10/09/2025,16.8,2,6.2,0,9.4,7.59,72.59,36.85,100.75 +10/10/2025,21,4,10.3,0,12.5,4.48,47.7,30.76,99.33 +10/11/2025,21.2,5,9.5,0,13.1,1.22,57.08,37.48,100.33 +10/12/2025,20,8.7,5.5,0,14.35,9.83,61.25,49.37,99.16 +10/13/2025,20.6,13,3.5,0,16.8,6.3,64.02,36.17,99.49 +10/14/2025,22,13,2.4,0,17.5,4.03,70.29,30.09,99.02 +10/15/2025,24,14,3.5,0,19,3.15,47.87,41.28,99.57 +10/16/2025,25,13,3.5,0,19,4.66,49.56,31.88,99.03 +10/17/2025,19.3,6,9.7,0,12.65,5.59,51.81,31.32,100.21 +10/18/2025,20.4,6,8.7,0,13.2,4.76,50.72,42.65,99.85 +10/19/2025,21.5,9,8.2,0,15.25,5.49,46.19,35.41,100.42 +10/20/2025,21.5,8.8,6.9,0,15.15,8.49,41.81,34.6,100.6 +10/21/2025,25,9,7.1,0,17,7.73,74.26,39.17,99.76 +10/22/2025,26.4,9,6.7,0,17.7,6.9,57.92,38.1,100.04 +10/23/2025,24,8,6.7,0,16,9.02,60.96,38.8,99.92 +10/24/2025,23,9,5.8,0,16,1.49,54.39,30.17,99.67 +10/25/2025,21.3,10.9,4.7,0,16.1,3.36,63.22,37.69,100.89 +10/26/2025,18,10,1.6,0.4,14,4.78,62.33,38.14,99.77 +10/27/2025,19,11,4.1,0,15,7.32,71.5,48.74,99.54 +10/28/2025,18,11.9,2.4,0,14.95,5.03,46.74,43.85,99.01 +10/29/2025,19,12.7,2.4,0.8,15.85,6.05,63.89,44.93,99.4 +10/30/2025,19,9,1.4,0.2,14,5.4,50.96,48.86,100.01 +10/31/2025,22,9,4.9,0,15.5,5.72,61.83,48.38,99.59 +11/01/2025,20.2,9,4,0,14.6,2.94,68.27,44.75,99.81 +11/02/2025,21,10,6.2,0,15.5,3.07,52.94,49,99.26 +11/03/2025,13.9,9,0.2,0,11.45,5.07,67.88,40.02,100.06 +11/04/2025,15.3,6,5.8,0,10.65,7.07,43.1,35.61,100.68 +11/05/2025,18,9.4,5.6,0.4,13.7,4.71,66.91,35.68,100.1 +11/06/2025,21,9,5.8,0,15,5.2,79.81,39.77,99.76 +11/07/2025,18.2,7.8,4.9,0,13,3.31,49.62,44.35,99.25 +11/08/2025,18,10,2.3,0,14,4.32,73.11,44.18,100.2 +11/09/2025,18,10,1,4.2,14,2.6,48.41,44.37,100.71 +11/10/2025,17,13,0.7,5.9,15,5.75,73,31.57,100.56 +11/11/2025,15,12,0,1.9,13.5,7.85,46.41,41.19,100.63 +11/12/2025,14,7,0,0.4,10.5,4.59,57.92,32.19,99.87 +11/13/2025,10.1,4,1.7,0,7.05,5.61,77.86,42.79,99.03 +11/14/2025,16.2,2,7,0,9.1,3.95,75.71,40.87,100.85 +11/15/2025,19.9,4,8.1,0,11.95,8.97,56.29,48.85,99.1 +11/16/2025,16,2,2.9,0,9,4.53,53.65,34.03,99.54 +11/17/2025,18,5,7.1,0,11.5,1.33,76.41,35.13,99.28 +11/18/2025,12.8,9,0,0.6,10.9,3.15,72.5,34.23,100.31 +11/19/2025,17.7,6,4.5,0,11.85,7.1,58.7,36,100.53 +11/20/2025,13,9,0.2,0,11,5.35,55.82,31.15,100.84 +11/21/2025,12.2,9,0,15,10.6,1.93,75.93,43.51,99.18 +11/22/2025,11.6,3,0.6,0.5,7.3,6.98,40.16,46.57,100.57 +11/23/2025,16.2,5.5,4.4,0,10.85,2.14,70.42,46.39,100.12 +11/24/2025,18.3,6,6.2,0,12.15,9.91,66.63,40.85,100.59 +11/25/2025,22,6.7,7.4,0,14.35,3.48,47.18,50,100.66 +11/26/2025,10,6,5.1,0,8,1.81,59.6,31.3,100.95 +11/27/2025,7,3,0,2.2,5,3.04,63.6,44.68,99.81 +11/28/2025,11.3,5,0.1,0.9,8.15,9.07,42.75,46.41,99.53 +11/29/2025,4.7,-2,0,0,1.35,1.85,60.56,35.06,99.59 +11/30/2025,1.5,-3,3.7,0,-0.75,6.41,56.52,35.44,100.38 +12/01/2025,4,-5,7,0,-0.5,3.56,77.52,36.87,99.79 +12/02/2025,6.6,-1.5,6.9,0,2.55,4.44,56.57,30.68,100.53 +12/03/2025,5,0,2.7,0,2.5,4.34,40.18,45.58,100.32 +12/04/2025,5.2,-3,1,0,1.1,9.6,52.93,45.02,99.24 +12/05/2025,9.4,-3,5.9,0,3.2,7.28,69.54,44.28,100.92 +12/06/2025,7.6,-2.2,1,0,2.7,9.53,66.22,44.69,99.7 +12/07/2025,12,-2,5.2,0,5,8.79,45.27,47.9,99.28 +12/08/2025,9,-2,2.8,0,3.5,9.04,66.16,49.85,100.87 +12/09/2025,8.8,-1.6,2,0,3.6,2.76,57.18,32.27,99.4 +12/10/2025,5.1,-4,4.6,0,0.55,5.41,71.06,34.82,100.74 +12/11/2025,5.8,-3,5.6,0,1.4,9.91,76.18,40.96,100.53 +12/12/2025,10,-2,8.8,0,4,2.02,47.63,35.81,99.13 +12/13/2025,9,-4,4.6,0,2.5,8.36,45.04,37.89,99.79 +12/14/2025,8,-3,8.2,0,2.5,4,65.8,38.91,100.2 +12/15/2025,6,-2,3.6,0,2,7.51,48.11,46.57,100.98 +12/16/2025,3.9,-4,5.1,0,-0.05,3.93,78.73,44.3,100.99 +12/17/2025,1,-4,9.6,0,-1.5,7.04,74.49,35.76,99.74 +12/18/2025,10,-7,9.1,0,1.5,7.14,51.21,48.28,100.74 +12/19/2025,8,-5.2,8,0,1.4,9.23,73.6,45.06,100.74 +12/20/2025,11,0.5,1.9,0,5.75,4.94,59.88,32.85,99.63 +12/21/2025,13,-3,7.4,0,5,1.48,46.97,32.66,100.97 +12/22/2025,6,-6,9.2,0,0,4.32,60.57,38.27,100.29 +12/23/2025,8.4,-8,7.7,0,0.2,8.02,44.02,47.76,99.35 +12/24/2025,5.9,-6,8.2,0,-0.05,5.71,65.79,41.09,99.07 +12/25/2025,5.5,-3.3,2.4,2.3,1.1,7.6,48.17,42.13,99.23 +12/26/2025,5.3,-5,4.4,0,0.15,6.66,50.05,44.62,100.53 +12/27/2025,7,-8,2.4,0,-0.5,1.44,50.06,41.55,100.16 +12/28/2025,7.4,-6,6.8,0,0.7,9.22,70.54,39.06,99.88 +12/29/2025,7.3,-5,7.9,0,1.15,5.95,75.88,32.13,99.02 +12/30/2025,8,-5,5.4,0,1.5,7.4,69.02,43.48,100.89 +12/31/2025,12.6,-3.6,5.9,0,4.5,3.42,41.3,49.89,99.8 diff --git a/data/para.json b/data/para.json new file mode 100644 index 0000000..9021fae --- /dev/null +++ b/data/para.json @@ -0,0 +1,15 @@ +{ + "TS": 1.24, + "PS": 0.0066, + "PVT": 39, + "FDF": 1, + "P": 12, + "PLMXp": 16, + "PLMXl": 16, + "SLA": 0.0021, + "SPA": 0.00065, + "HI": 1.15, + "Tb": [0,0,5,5,5], + "To": [25,25,25, 25, 25], + "Tm": [35,35,35,35,35] +} \ No newline at end of file diff --git a/data/plant_para.json b/data/plant_para.json new file mode 100644 index 0000000..8e3f9dc --- /dev/null +++ b/data/plant_para.json @@ -0,0 +1,18 @@ +{ + "GDD_emergence": 120, + "1.1": 0.0, + "1.5": 16.9, + "2.2": 27.85, + "2.4": 42.31, + "3.0": 66.46, + "pp": 0.05, + "pl": 0.05, + "kp": 0.5, + "kl": 0.75, + "RFAC1": 1050, + "RTGR": 0.05, + "Kcbini": 0, + "Kcbmid": 1.15, + "Kcbend": 0.35, + "h": 0.6 +} \ No newline at end of file diff --git a/deploy.bat b/deploy.bat new file mode 100644 index 0000000..26391b9 --- /dev/null +++ b/deploy.bat @@ -0,0 +1,117 @@ +@echo off +REM Soil Water Balance Model Docker Deployment Script for Windows + +setlocal enabledelayedexpansion + +set IMAGE_NAME=soil-water-model +set CONTAINER_NAME=soil-water-model-container +set PORT=8000 + +echo 🚀 Starting Soil Water Balance Model deployment... + +REM Function to check if container is running +:check_container +docker ps -q -f name=%CONTAINER_NAME% >nul 2>&1 +if %errorlevel% equ 0 ( + echo ⚠️ Container '%CONTAINER_NAME%' is already running. + set /p choice="Do you want to stop and restart it? (y/N): " + if /i "!choice!"=="y" ( + echo 🛑 Stopping existing container... + docker stop %CONTAINER_NAME% + docker rm %CONTAINER_NAME% + ) else ( + echo ❌ Deployment cancelled. + exit /b 1 + ) +) +goto :eof + +REM Function to build image +:build_image +echo 🔨 Building Docker image... +docker build -t %IMAGE_NAME% . +if %errorlevel% neq 0 ( + echo ❌ Failed to build image + exit /b 1 +) +echo ✅ Image built successfully! +goto :eof + +REM Function to run container +:run_container +echo 🏃 Running container... +docker run -d --name %CONTAINER_NAME% -p %PORT%:8000 --restart unless-stopped %IMAGE_NAME% +if %errorlevel% neq 0 ( + echo ❌ Failed to start container + exit /b 1 +) +echo ✅ Container started successfully! +goto :eof + +REM Function to show status +:show_status +echo 📊 Container Status: +docker ps -f name=%CONTAINER_NAME% --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + +REM Wait a moment for container to start +timeout /t 3 /nobreak >nul + +REM Test health endpoint +echo 🔍 Testing health endpoint... +curl -f http://localhost:%PORT%/health >nul 2>&1 +if %errorlevel% equ 0 ( + echo ✅ Health check passed! + echo 🌐 API is available at: http://localhost:%PORT% + echo 📚 API documentation: http://localhost:%PORT%/docs +) else ( + echo ❌ Health check failed. Container might still be starting... + echo Please wait a moment and check the logs: + echo docker logs %CONTAINER_NAME% +) +goto :eof + +REM Main deployment process +:main +call :check_container +call :build_image +call :run_container +call :show_status + +echo. +echo 🎉 Deployment completed successfully! +echo. +echo Useful commands: +echo View logs: docker logs %CONTAINER_NAME% +echo Stop container: docker stop %CONTAINER_NAME% +echo Restart container: docker restart %CONTAINER_NAME% +echo Remove container: docker rm %CONTAINER_NAME% +goto :eof + +REM Handle command line arguments +if "%1"=="build" ( + call :build_image +) else if "%1"=="run" ( + call :check_container + call :run_container + call :show_status +) else if "%1"=="stop" ( + echo 🛑 Stopping container... + docker stop %CONTAINER_NAME% 2>nul || echo Container not running +) else if "%1"=="restart" ( + echo 🔄 Restarting container... + docker restart %CONTAINER_NAME% 2>nul || (echo Container not running, starting new one... && call :run_container) + call :show_status +) else if "%1"=="logs" ( + echo 📋 Showing container logs... + docker logs -f %CONTAINER_NAME% +) else if "%1"=="status" ( + call :show_status +) else if "%1"=="clean" ( + echo 🧹 Cleaning up... + docker stop %CONTAINER_NAME% 2>nul || echo. + docker rm %CONTAINER_NAME% 2>nul || echo. + docker rmi %IMAGE_NAME% 2>nul || echo. + echo ✅ Cleanup completed! +) else ( + call :main +) diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..894b3c3 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,121 @@ +#!/bin/bash + +# Soil Water Balance Model Docker Deployment Script + +set -e + +IMAGE_NAME="soil-water-model" +CONTAINER_NAME="soil-water-model-container" +PORT="8000" + +echo "🚀 Starting Soil Water Balance Model deployment..." + +# Function to check if container is running +check_container() { + if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then + echo "⚠️ Container '$CONTAINER_NAME' is already running." + read -p "Do you want to stop and restart it? (y/N): " -r + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "🛑 Stopping existing container..." + docker stop "$CONTAINER_NAME" + docker rm "$CONTAINER_NAME" + else + echo "❌ Deployment cancelled." + exit 1 + fi + fi +} + +# Function to build image +build_image() { + echo "🔨 Building Docker image..." + docker build -t "$IMAGE_NAME" . + echo "✅ Image built successfully!" +} + +# Function to run container +run_container() { + echo "🏃 Running container..." + docker run -d \ + --name "$CONTAINER_NAME" \ + -p "$PORT:8000" \ + --restart unless-stopped \ + "$IMAGE_NAME" + echo "✅ Container started successfully!" +} + +# Function to show status +show_status() { + echo "📊 Container Status:" + docker ps -f name="$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + + # Wait a moment for container to start + sleep 3 + + # Test health endpoint + echo "🔍 Testing health endpoint..." + if curl -f http://localhost:"$PORT"/health > /dev/null 2>&1; then + echo "✅ Health check passed!" + echo "🌐 API is available at: http://localhost:$PORT" + echo "📚 API documentation: http://localhost:$PORT/docs" + else + echo "❌ Health check failed. Container might still be starting..." + echo " Please wait a moment and check the logs:" + echo " docker logs $CONTAINER_NAME" + fi +} + +# Main deployment process +main() { + check_container + build_image + run_container + show_status + + echo "" + echo "🎉 Deployment completed successfully!" + echo "" + echo "Useful commands:" + echo " View logs: docker logs $CONTAINER_NAME" + echo " Stop container: docker stop $CONTAINER_NAME" + echo " Restart container: docker restart $CONTAINER_NAME" + echo " Remove container: docker rm $CONTAINER_NAME" +} + +# Handle command line arguments +case "${1:-}" in + "build") + build_image + ;; + "run") + check_container + run_container + show_status + ;; + "stop") + echo "🛑 Stopping container..." + docker stop "$CONTAINER_NAME" 2>/dev/null || echo "Container not running" + ;; + "restart") + echo "🔄 Restarting container..." + docker restart "$CONTAINER_NAME" 2>/dev/null || (echo "Container not running, starting new one..." && run_container) + show_status + ;; + "logs") + echo "📋 Showing container logs..." + docker logs -f "$CONTAINER_NAME" + ;; + "status") + show_status + ;; + "clean") + echo "🧹 Cleaning up..." + docker stop "$CONTAINER_NAME" 2>/dev/null || true + docker rm "$CONTAINER_NAME" 2>/dev/null || true + docker rmi "$IMAGE_NAME" 2>/dev/null || true + echo "✅ Cleanup completed!" + ;; + *) + main + ;; +esac diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..744cefe --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3.8' + +services: + soil-water-model: + build: . + ports: + - "8000:8000" + environment: + - PYTHONUNBUFFERED=1 + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + volumes: + # Optional: Mount data directory for live updates (development only) + - ./data:/app/data:ro diff --git a/main.py b/main.py new file mode 100644 index 0000000..a2ab11d --- /dev/null +++ b/main.py @@ -0,0 +1,1597 @@ +### Y/M/D 2025/02/28_Beta_hqw +### This function is to calculate Si module of soil water balance. # 根系吸水量。 + +import datetime +import json +import math +from dataclasses import dataclass +from typing import Any, Dict, List, Tuple + +import numpy as np +import pandas as pd +import uvicorn +from fastapi import FastAPI, File, HTTPException, UploadFile +from pydantic import BaseModel + + +class DateUtils: + @staticmethod + def cal_Doy(date: str) -> int: + """计算日序""" + try: + month, day, year = map(int, date.split('/')) + date_obj = datetime.date(year, month, day) + return int(date_obj.strftime('%j')) + except (ValueError, IndexError): + raise ValueError(f"日期格式错误: {date}") + + @staticmethod + def cal_DayLength(date: str, latitude: float) -> float: + """计算日长""" + day_of_year = DateUtils.cal_Doy(date) + RAD = math.pi / 180.0 + DEC = -math.asin(math.sin(23.45 * RAD) * math.cos(2.0 * math.pi * (day_of_year + 10.0) / 365.0)) + dSINLD = math.sin(RAD * latitude) * math.sin(DEC) + dCOSLD = math.cos(RAD * latitude) * math.cos(DEC) + dCOSLD = dCOSLD if dCOSLD != 0.0 else 0.001 + SSCC = dSINLD / dCOSLD + return 12.0 * (1.0 + 2.0 * math.asin(SSCC) / math.pi) + +class TemperatureUtils: + @staticmethod + def get_hourly_temps(min_temperature: float, max_temperature: float) -> list: + """获取逐时温度""" + if min_temperature > max_temperature: + raise ValueError("温度参数错误") + return [(max_temperature + min_temperature)/2 + + (max_temperature - min_temperature)*math.cos(0.2618*(i-14))/2 + for i in range(1, 25)] + + @staticmethod + def get_day_temps(min_temperature: float, max_temperature: float) -> float: + """获取白天平均温度""" + if min_temperature > max_temperature: + raise ValueError("温度参数错误") + else: + T5 = [] + for i in range(1, 9): + # print(i) + if i == 4 or i == 5 or i == 6: + continue + else: + Tfac = 0.9310 + 0.1140 * i - 0.0703 * i ** 2 + 0.0053 * i ** 3 + # print(format(min_temperature + Tfac * (max_temperature - min_temperature), '.4f')) + T5.append(format(min_temperature + Tfac * (max_temperature - min_temperature), '.4f')) + T5 = [float(x) for x in T5] + average_Tday = np.mean(T5) + return average_Tday + + @staticmethod + def dailyGDD(Tmax: float, Tmin: float, Tb: float, Tm: float) -> float: + """计算日有效积温""" + Tmean = (Tmax + Tmin) / 2 + Tmean = max(min(Tmean, Tm), Tb) + return Tmean - Tb + +class VernalizationCalculator: + @staticmethod + def cal_DVE(PVT: float, VD: float, min_temp: float, max_temp: float) -> float: + """春化效应计算""" + T24 = TemperatureUtils.get_hourly_temps(min_temp, max_temp) + Tbv = -PVT / 12 + Tol = 5 - PVT / 12 + Tou = 10 - PVT / 12 + Tmv = 20 - PVT / 6 + vef = 1 / (2 - 0.0167 * PVT) + + sum_RVE = sum_DDVE = 0 + for Ti in T24: + # 春化效应计算 + if Ti <= Tbv or Ti >= Tmv: + RVEi = 0 + elif Tbv < Ti < Tol: + RVEi = math.sin((Ti-Tbv)/(Tol-Tbv)*math.pi/2)**0.5 + elif Tol <= Ti <= Tou: + RVEi = 1 + else: + RVEi = math.sin((Ti-Tou)/(Tmv-Tou)*math.pi/2)**vef + sum_RVE += RVEi + + # 反春化效应计算 + sum_DDVE += 0.5*(Ti-27) if Ti > 27 else 0 + + DVE = sum_RVE / 24 + DDVE = sum_DDVE / 24 + + if VD < 0.3*PVT: + return DVE - DDVE + elif 0.3*PVT <= VD <= PVT: + return DVE + return 0 + + +class PhotoperiodCalculator: + @staticmethod + def cal_DPE(date: str, latitude: float, P: float, PS: float) -> float: + """光周期效应计算""" + DL = DateUtils.cal_DayLength(date, latitude) + return max(0, 2/(1 + math.exp(PS*(P - DL)))) + +class StressCalculator: + def __init__(self, plant_params: dict): + self.plant_params = plant_params + + def _init_parameters(self): + """参数初始化""" + # 物候阶段阈值 + self.PDT_EM = self.plant_params['1.1'] + self.PDT_BT = self.plant_params['1.5'] + self.PDT_SF = self.plant_params['2.2'] + self.PDT_EF = self.plant_params['2.4'] + self.PDT_MT = self.plant_params['3.0'] + + + @staticmethod + def temperature_stress(Tmin: float, Tmax: float) -> float: + """温度胁迫""" + Tmn = 0 + Tpl = 20 + Tpu = 25 + Tmx = 35 + + Tmean = (Tmax + Tmin) / 2 + if Tmn <= Tmean <= Tpl: + TE = math.sin((Tmean - Tmn) / (Tpl - Tmn) * math.pi / 2) + elif Tpl < Tmean <= Tpu: + TE = 1 + elif Tpu < Tmean <= Tmx: + TE = math.sin((Tmx - Tmean) / (Tmx - Tpu) * math.pi / 2) + else: + TE = 0 + + return TE + + + def age_stress(self, current_pdt: float): + """生理年龄胁迫""" + # 计算生理年龄胁迫因子 + if current_pdt <= self.PDT_SF: + FAL = 1.0 + else: + FAL = 1 - 0.013 * (current_pdt - self.PDT_SF) + + if current_pdt <= self.PDT_EF: + FAP = 1.0 + else: + FAP = 1 - 1 / 48 * (current_pdt - self.PDT_EF) + + return FAL, FAP + + @staticmethod + def co2_stress(cx: float) -> float: + """二氧化碳浓度胁迫 + :param Cx: 实际CO2浓度,ppm + :return: + FCO2, CO2影响因子 + """ + FCO2 = 1 + 0.8 * math.log(cx / 340) + + return FCO2 + + @staticmethod + def NNI_stress(TOPWT: float, NA: float) -> float: + """N浓度胁迫 + :param TOPWT: 地上部干物质量,kg/ha + :param NA: 地上部组织中的实际氮浓度, % + :return: + NNI, 氮素营养指数 + """ + DM = TOPWT / 1000 # 地上部干重单位换算成 t/ha + if DM >= 0.88: + NC = 4.48 * DM ** (-0.25) + else: + NC = 4.63 + + NNI = NA / NC + + return NNI + + @staticmethod + def WDF_stress(ETcadj: float, ETo: float) -> float: + """ + :param ETcadj: 实际蒸散量,mm + :param ETo: 潜在蒸散量,mm + :return: + WDF,水分亏缺因子""" + WDF = ETcadj / ETo + + return WDF + +class FlowerAreaIndex: + def __init__(self, DW_onset_flower: float, FlowerArea: float = 1.99): + """ + 花面积指数(FAI)计算模型 + + :param DW_onset_flower : float - 初花期地上部干物重 (kg hm⁻²) + :param FlowerArea : float, optional - 单花面积 (cm²),默认1.99 + """ + # 品种参数 + self.FlowerArea = FlowerArea + + # 计算开花速率 + self.Flowerrate = 41.5 * DW_onset_flower + + # 状态变量初始化 + self.FlowerNum = 0.0 # 当前花朵总数 + self.flower_queue = [] # 花朵开放队列 (剩余积温, 花朵数量) + + + def _calc_senescence(self, Tmean: float) -> float: + """计算当日凋谢花朵数""" + senesced = 0.0 + remaining_flowers = [] + + for batch in self.flower_queue: + batch["remaining"] -= Tmean + if batch["remaining"] <= 0: + senesced += batch["amount"] + else: + remaining_flowers.append(batch) + + self.flower_queue = remaining_flowers + return senesced + + + def daily_step(self, Tmean: float) -> float: + """ + 执行单日计算 + + :param Tmean : float - 当日平均温度(℃) + :param date : str, optional - 日期字符串,月/日/年 + + """ + # 当日新开花朵数 + new_flowers = self.Flowerrate * Tmean + + # 将新花朵加入追踪队列 + self.flower_queue.append({"remaining": 100.0, "amount": new_flowers}) + + # 计算当日凋谢花朵数 + senesced = self._calc_senescence(Tmean) + # 更新花朵总数 + self.FlowerNum += new_flowers - senesced + + # 计算花面积指数 + FAI = self.FlowerNum * self.FlowerArea + + return FAI + + +@dataclass +class GaussianCoefficients: + """高斯积分系数容器""" + nodes: Tuple[float, ...] + weights: Tuple[float, ...] + +class PhotosynthesisSimulator: + # 高斯积分系数 + TIME_GAUSS = GaussianCoefficients( + nodes=(0.112702, 0.500000, 0.887298), + weights=(0.277778, 0.444444, 0.277778) + ) + + LAYER_GAUSS = GaussianCoefficients( + nodes=(0.0469101, 0.2307534, 0.5000000, 0.7691465, 0.9530899), + weights=(0.1184635, 0.2393144, 0.2844444, 0.2393144, 0.1184635) + ) + def __init__(self, latitude: float, SH: float, PDT_BT: float, PDT_EF: float): + self.latitude = latitude + self.SH = SH + self.PDT_BT = PDT_BT + self.PDT_EF = PDT_EF + + def _cal_PARCAN(self, current_date: datetime) -> float: + """计算冠层光合有效辐射PARCAN""" + RAD = math.pi / 180.0 + Gsc = 1367 + + # 日地距离系数计算 + dr = 1 + 0.033 * math.cos(2 * math.pi * DateUtils.cal_Doy(current_date) / 365) + + # 太阳赤纬计算 + delta = 0.409 * math.sin(2 * math.pi * DateUtils.cal_Doy(current_date) / 365 - 1.39) + + # 太阳时角计算 + ws = math.acos(-math.tan(self.latitude * RAD) * math.tan(delta)) + + # 天文辐射计算 + Q = (Gsc / math.pi * dr * + (ws * math.sin(self.latitude * RAD) * math.sin(delta) + + math.sin(ws) * math.cos(self.latitude * RAD) * math.cos(delta))) + + # 日长计算 + DL = DateUtils.cal_DayLength(current_date, self.latitude) + + # PAR计算 + PARCAN = (0.23 + 0.48 * self.SH / DL) * Q + return PARCAN + + def _cal_DTGA(self, current_date: datetime, GAI: float, PAR: float, + kx: float, px: float, PLMX: float) -> float: + """ + 计算每日光合同化物 (DTGA) + + :param current_date: 当前日期 + :param GAI: 绿色面积指数 (叶/角果面积指数) + :param PAR: 光合有效辐射 + :param kx: 消光系数 + :param px: 反射率 + :param PLMX: 最大光合速率 + """ + RAD = math.pi / 180.0 + + # 计算太阳赤纬 + delta = 0.409 * math.sin(2 * math.pi * DateUtils.cal_Doy(current_date) / 365 - 1.39) + + # 太阳位置参数 + SSIN = math.sin(self.latitude * RAD) * math.sin(delta) + CCOS = math.cos(self.latitude * RAD) * math.cos(delta) + + # 日长计算 + DL = DateUtils.cal_DayLength(current_date, self.latitude) + + total_assimilation = 0.0 + + # 时间维度高斯积分(每日时角) + for t_node, t_weight in zip(self.TIME_GAUSS.nodes, self.TIME_GAUSS.weights): + # 将积分点转换为实际时间 + hour = 12 + 0.5 * DL * t_node + solar_angle = 2 * math.pi * (hour + 12) / 24 + # 计算瞬时太阳高度角正弦 + sin_beta = SSIN + CCOS * math.cos(solar_angle) + if sin_beta < 0: + continue # 夜间时段 + + # 冠层维度高斯积分(垂直分布) + layer_integral = 0.0 + for l_node, l_weight in zip(self.LAYER_GAUSS.nodes, self.LAYER_GAUSS.weights): + cumulative_gai = GAI * l_node + + # 光强衰减计算(比尔-朗伯定律) + light_intensity = (1 - px) * PAR * 3 * sin_beta * math.exp(-kx * cumulative_gai) # PAR偏低,加上系数 + + # 光合响应模型(非直角双曲线) + photosynthesis = PLMX * (1 - math.exp(-0.45 * light_intensity / PLMX)) + + layer_integral += photosynthesis * l_weight + + # 积分结果累加 + total_assimilation += layer_integral * t_weight + DTGA = total_assimilation * DL + return DTGA + + def Respiratory(self, FDTGA: float, Tmean: float, Tday: float) -> tuple: + """呼吸作用计算""" + RmTo = 0.15 + Q10 = 2 + To = 25 + RM = RmTo * FDTGA * Q10 ** ((Tmean - To) / 10) + RG = 0.39 * FDTGA + RpTo = 0.33 + RP = FDTGA * RpTo * Q10 ** ((Tday - To) / 10) + return (RM, RG, RP) + + def _cal_distribution(self, current_pdt: float, biomass: float) -> tuple: + """干物质分配计算""" + if current_pdt < self.PDT_BT: + PIR = (0.18 - 0.0386) * math.sin(current_pdt / self.PDT_BT * math.pi / 2) + 0.0386 + PIFP = 0 + PIF = 0 + PIL = 0.8 if current_pdt == 0 else -0.0600 * math.log(current_pdt / self.PDT_BT) + 0.22 + else: + PIR = -0.0011 * (current_pdt - self.PDT_BT) + 0.18 + PIFP = 0.54 * 0.1202 * (math.exp(0.0439 * (current_pdt - self.PDT_BT)) - 1) + PIL = -0.1454 * math.log(current_pdt / self.PDT_BT) + 0.22 + PIF = 0.05 * math.exp(-(current_pdt - self.PDT_EF) ** 2 / (9.486 ** 2)) if current_pdt <= self.PDT_EF else 0 + + PIS = 1 - PIR + PIP = PIFP - PIF + PIST = PIS - PIL - PIFP + + ROOTWT = biomass * PIR + TOPWT = biomass * PIS + WLV = TOPWT * PIL + WST = TOPWT * PIST + WAPV = TOPWT * PIP + WFL = TOPWT * PIF + + return (ROOTWT, TOPWT, WLV, WAPV, WFL, WST) + + +class BiomassModel: + def __init__(self, start: str, end: str, weather: pd.DataFrame, cultivar_params: dict, + management: dict, plant_params: dict, soil_params: dict): + self.start = start + self.end = end + self.weather = weather + self.cultivar_params = cultivar_params + self.management = management + self.plant_params = plant_params + self.soil_params = soil_params + + self._parse_dates() + self._init_parameters() + + def _parse_dates(self): + """日期解析""" + def parse_date(date_str): + return datetime.date(*map(int, (date_str.split('/')[-1], + date_str.split('/')[0], + date_str.split('/')[1]))) + + self.sow_date = parse_date(self.management['sowdate']) + self.start_date = parse_date(self.start) + self.end_date = parse_date(self.end) + self.latitude = self.management['latitude'] + self.seed_weight = self.management['seed_weight'] + + def _init_parameters(self): + """参数初始化""" + self.P = self.cultivar_params['P'] + self.PS = self.cultivar_params['PS'] + self.TS = self.cultivar_params['TS'] + self.PVT = self.cultivar_params['PVT'] + self.FDF = self.cultivar_params['FDF'] + self.PLMXp = self.cultivar_params['PLMXp'] + self.PLMXl = self.cultivar_params['PLMXl'] + self.SLA = self.cultivar_params['SLA'] + self.SPA = self.cultivar_params['SPA'] + self.pp = self.plant_params['pp'] + self.pl = self.plant_params['pl'] + self.kp = self.plant_params['kp'] + self.kl = self.plant_params['kl'] + self.RTGR = self.plant_params['RTGR'] + self.RFAC1 = self.plant_params['RFAC1'] + + # 物候阶段阈值 + self.GDD_emergence = self.plant_params.get('GDD_emergence', 120) # 默认120℃·d + self.emergence_calculated = False + self.PDT_EM = self.plant_params['1.1'] + self.PDT_BT = self.plant_params['1.5'] + self.PDT_SF = self.plant_params['2.2'] + self.PDT_EF = self.plant_params['2.4'] + self.PDT_MT = self.plant_params['3.0'] + + # 温度参数 + self.Tb = self.cultivar_params['Tb'] + self.To = self.cultivar_params['To'] + self.Tm = self.cultivar_params['Tm'] + + # 土壤参数 + self.SNO3_0 = self.soil_params['SNO3_0'] + self.SNH4_0 = self.soil_params['SNH4_0'] + self.BD = self.soil_params['BD'] + self.DLAYR = self.soil_params['DLAYR'] + self.NLAYR = self.soil_params['NLAYR'] + self.DS = self.soil_params['DS'] + self.DUL = self.soil_params['DUL'] + self.SAT = self.soil_params['SAT'] + self.LL = self.soil_params['LL'] + self.PH = self.soil_params['PH'] + self.SOILC = self.soil_params['SOILC'] + self.FOM = self.soil_params['FOM'] + self.FON = self.soil_params['FON'] + self.TOTN = self.soil_params['TOTN'] + self.SW0 = self.soil_params['SW0'] + self.CLAY = self.soil_params['CLAY'] + self.CN = self.soil_params['CN'] + + def _get_temperature_parameters(self, current_pdt: float) -> tuple: + """获取当前阶段的温度参数""" + if current_pdt <= self.PDT_BT: + return self.Tb[1], self.To[1], self.Tm[1] + elif self.PDT_BT < current_pdt <= self.PDT_SF: + return self.Tb[2], self.To[2], self.Tm[2] + elif self.PDT_SF < current_pdt <= self.PDT_EF: + return self.Tb[3], self.To[3], self.Tm[3] + elif self.PDT_EF < current_pdt <= self.PDT_MT: + return self.Tb[4], self.To[4], self.Tm[4] + return self.Tb[-1], self.To[-1], self.Tm[-1] + + def _calculate_daily_effects(self, current_date: str, current_pdt: float, VD: float): + """计算每日效应值""" + # 光周期效应 + DPE = PhotoperiodCalculator.cal_DPE(current_date, self.latitude, self.P, self.PS) + + # 温度效应 + Tb, To, Tm = self._get_temperature_parameters(current_pdt) + Tmin = self.weather.loc[current_date, 'Tmin'] + Tmax = self.weather.loc[current_date, 'Tmax'] + DTE = self._calculate_DTE(Tb, To, Tm, Tmin, Tmax) + + # 春化效应 + DVE = VernalizationCalculator.cal_DVE(self.PVT, VD, Tmin, Tmax) + + return DPE, DTE, DVE + + def _calculate_DTE(self, Tb: float, To: float, Tm: float, Tmin: float, Tmax: float) -> float: + """温度效应计算""" + T24 = TemperatureUtils.get_hourly_temps(Tmin, Tmax) + total_TE = 0 + for Ti in T24: + if Ti < Tb or Ti > Tm: + TE = 0 + elif Tb <= Ti <= To: + TE = (math.sin((Ti-Tb)/(To-Tb)*math.pi/2)) ** self.TS + else: + TE = (math.sin((Tm-Ti)/(Tm-To)*math.pi/2)) ** ((Tm-To)/(To-Tb)*self.TS) + total_TE += TE + return total_TE / 24 + + def ifEmergence(self) -> str: + """判断出苗期开始时间""" + + GDD = 0 + current_date = self.sow_date + while GDD < self.GDD_emergence: + date_str = current_date.strftime("%m/%d/%Y") + try: + Tmax = self.weather.loc[date_str, 'Tmax'] + Tmin = self.weather.loc[date_str, 'Tmin'] + except KeyError: + current_date += datetime.timedelta(days=1) + continue + + # 判断是否出苗 + GDD_daily = TemperatureUtils.dailyGDD(Tmax, Tmin, + Tb=self.cultivar_params['Tb'][0],Tm=self.cultivar_params['Tm'][0]) + GDD += GDD_daily + + # 记录出苗日期 + if GDD >= self.GDD_emergence: + self.emergence_date = current_date + self.emergence_days = (current_date - self.sow_date).days + break + + current_date += datetime.timedelta(days=1) + + # 防止无限循环 + if (current_date - self.sow_date).days > 365: + self.emergence_date = None + self.emergence_days = 9999 + break + + def _cal_pdt(self, current_date: datetime.date) -> float: + """执行模拟""" + + # 阶段1:计算出苗期 + self.ifEmergence() + + # 阶段2:出苗后发育阶段 + VD = 0 # 累积春化天数 + PDT = self.PDT_EM # 从出苗开始发育 + + # 模拟循环 + delta = (current_date - self.emergence_date).days + for day in (self.emergence_date + datetime.timedelta(n) for n in range(delta + 1)): + date_str = day.strftime("%m/%d/%Y") + # 计算每日效应 + DPE, DTE, DVE = self._calculate_daily_effects(date_str, PDT, VD) + VD += DVE + + # 计算物候发育进度 + if PDT <= self.PDT_BT: + DPDT = DTE * (DPE * min(VD / self.PVT, 1) if self.PVT else DPE) + else: + DPDT = DTE * self.FDF if PDT > self.PDT_SF else DTE * DPE + + DPDT = max(0, DPDT) + + PDT += DPDT + if PDT > self.PDT_MT: + break + + return PDT + + + def daily_DRTDEP(self, current_date: str, current_pdt: float, wdf): + """计算每日增加的根系深度""" + + Tb, To, Tm = self._get_temperature_parameters(current_pdt) + Tmin = self.weather.loc[current_date, 'Tmin'] + Tmax = self.weather.loc[current_date, 'Tmax'] + + GDD = TemperatureUtils.dailyGDD(Tmax, Tmin, Tb, Tm) + DRTDEP = self.RTGR * GDD * wdf # DRTDEP(cm) + + return DRTDEP + + def RLV(self, RTDEP: float, rootwt: float): + """ + 计算单位体积土壤中根系的总长度,单位为 cm/cm3 + + :param RTDEP: 根深,单位为 cm + :param rootwt: 地下部生物量(干重),单位为 kg 干物质/ha/d + :return: + RLV: Root Length Volume, 指单位体积土壤中根系的总长度,单位为 cm/cm3 + """ + CUMDEP = 0 + RLV_list = [] # cm/cm3 + for L in range(self.NLAYR): + DEP = min(RTDEP - CUMDEP, self.DLAYR[L]) + RLINIT = rootwt / 10000 / 10000 * 1000 * self.RFAC1 * DEP / (RTDEP) + CUMDEP += DEP + RLV = round(RLINIT / self.DLAYR[L], 3) + RLV_list.append(RLV) + + if CUMDEP > RTDEP: + break + + return RLV_list + + def biomass(self, day: datetime.date, Biomass0: float, TE: int = 0, FA: int = 0, FCO2: int = 0, NNI: int = 0, + WDF: int = 0) -> tuple: + """ + 执行模拟 + + :param TE: 温度胁迫, 0 - 无胁迫(默认),1 - 有胁迫 + :param FA: 生长年龄胁迫, 0 - 无胁迫(默认),1 - 有胁迫 + :param FCO2: CO2胁迫, 0 - 无胁迫(默认),1 - 有胁迫 + :param NNI: 氮素胁迫, 0 - 无胁迫(默认),1 - 有胁迫 + :param WDF: 水分胁迫, 0 - 无胁迫(默认),1 - 有胁迫 + """ + + # 计算出苗期,从出苗后开始发育 + self.ifEmergence() + + date_str = day.strftime("%m/%d/%Y") + try: + Tmax = self.weather.loc[date_str, 'Tmax'] + Tmin = self.weather.loc[date_str, 'Tmin'] + Tmean = (Tmax + Tmin) / 2 + SH = self.weather.loc[date_str, 'SH'] + except KeyError: + print(f"气象数据中缺少 {date_str} 的记录,跳过该天。") + + PDT = self._cal_pdt(day) + + # 开始计算 + + photo = PhotosynthesisSimulator(self.latitude, SH, self.PDT_BT, self.PDT_EF) + + # 地上部、地下部、叶片、角果、花、茎生物量 + ROOTWT, TOPWT, WLV, WAPV, WFL, WST = photo._cal_distribution(PDT, Biomass0) + + # 胁迫判断 + stess = StressCalculator(self.plant_params) + if FA == 0: + FAL, FAP = 1.0, 1.0 + else: + FAL, FAP = stess.age_stress(PDT) + + if TE == 0: + tem_stress = 1.0 + else: + tem_stress = StressCalculator.temperature_stress(Tmin, Tmax) + + if FCO2 == 0: + co2 = 1.0 + else: + co2 = StressCalculator.co2_stress(cx=340) + + if WDF == 0: + wdf = 1.0 + # else: + # wdf = StressCalculator.WDF_stress(ETcadj, ETo) + + if NNI == 0: + nni = 1.0 + # else: + # nni = StressCalculator.NNI_stress(TOPWT, NA) + + PLMXL = self.PLMXl * co2 * FAL * tem_stress * min(wdf, nni) + PLMXP = self.PLMXp * co2 * FAP * tem_stress * min(wdf, nni) + + # 花面积指数 + startflowering = False + if not startflowering and PDT >= self.PDT_SF: + OnesetFlower = WFL + startflowering = True + + if self.PDT_SF <= PDT <= self.PDT_EF: + flowermodel = FlowerAreaIndex(DW_onset_flower=OnesetFlower) + FAI = flowermodel.daily_step(Tmean) + else: + FAI = 0 + + # 叶面积指数 + if PDT <= self.PDT_BT: + SLAv = self.SLA + else: + SLAv = self.SLA * (-0.0009 * (PDT - self.PDT_BT) ** 2 + 0.0683 * (PDT - self.PDT_BT) + 1.177) + + LAI = SLAv * WLV + + # 角果面积指数 + if PDT >= self.PDT_SF: + SPAv = self.SPA * (0.00017 * (PDT - self.PDT_SF) ** 2 - 0.05554 * (PDT - self.PDT_SF) + 2.91887) + PAI = SPAv * WAPV + else: + PAI = 0 + + # 计算光合同化物 + if PDT < self.PDT_SF: + Tp = photo._cal_PARCAN(date_str) # 无角果遮挡 + else: + Tp = (1 - self.pp) * photo._cal_PARCAN(date_str) * math.exp(-self.kp * PAI) # 有角果遮挡 + + Tl = (1 - self.pl) * Tp * math.exp(-self.kl * LAI) # radiation passing through the leaves + Rl = 0.05 * Tp # leaf reflection + Rs = 0.2 * Tl # soil reflection + + if PDT >= self.PDT_SF: + PARP = (1 - self.pp) * photo._cal_PARCAN(date_str) + Rl + else: + PARP = 0 + PARL = (1 - self.pl) * Tp + Rs + + DTGAp = photo._cal_DTGA(date_str, PAI, PARP, self.kp, self.pp, PLMXP) + DTGAl = photo._cal_DTGA(date_str, LAI, PARL, self.kl, self.pl, PLMXL) + # print('DTGAp, DTGAl: ', DTGAp, DTGAl) + + FDTGA = (DTGAl + DTGAp) * min(wdf, nni) + # print('FDTGA: ', FDTGA) + + # RmTo = 0.03*WLV+0.015*WST+0.015*ROOTWT+0.01*WAPV + # print('RmTo: ', RmTo) + Tday = TemperatureUtils.get_day_temps(Tmin, Tmax) + RM, RG, RP = photo.Respiratory(FDTGA, Tmean, Tday) + # print('RM, RG, RP: ', RM, RG, RP) + + PND = FDTGA - RM - RG + # print('PND: ', PND) + + TDRW = 30 / 44 * 0.95 * PND / (1 - 0.05) + + TBiomass = TDRW + Biomass0 + + return TBiomass, LAI, TOPWT, ROOTWT + + +class SoilWaterModel: + def __init__(self, start: str, + end: str, + weather: pd.DataFrame, + cultivar_params: dict, + plant_params: dict, + soil_params: dict, + management: dict, + n_params: dict): + self.start = start + self.end = end + self.weather = weather + self.cultivar_params = cultivar_params + self.plant_params = plant_params + self.soil_params = soil_params + self.management = management + self.n_params = n_params + + self._parse_dates() + self._init_parameters() + + def _parse_dates(self): + """日期解析""" + def parse_date(date_str): + return datetime.date(*map(int, (date_str.split('/')[-1], + date_str.split('/')[0], + date_str.split('/')[1]))) + + self.sow_date = parse_date(self.management['sowdate']) + self.start_date = parse_date(self.start) + self.end_date = parse_date(self.end) + + def _init_parameters(self): + """参数初始化""" + + # 管理措施参数 + self.latitude = self.management['latitude'] + self.irrigation = self.management['irrigation'] + self.elevation = self.management['elevation'] + self.seed_weight = self.management['seed_weight'] + + # 作物参数 + self.GDD_emergence = self.plant_params.get('GDD_emergence', 120) # 默认120℃·d + self.emergence_calculated = False + self.PDT_EM = self.plant_params['1.1'] + self.PDT_BT = self.plant_params['1.5'] + self.PDT_SF = self.plant_params['2.2'] + self.PDT_EF = self.plant_params['2.4'] + self.PDT_MT = self.plant_params['3.0'] + self.RTGR = self.plant_params['RTGR'] + self.Kcbini = self.plant_params['Kcbini'] + self.Kcbmid = self.plant_params['Kcbmid'] + self.Kcbend = self.plant_params['Kcbend'] + self.h = self.plant_params['h'] + self.kl = self.plant_params['kl'] + + # 品种参数 + self.Po = self.cultivar_params['P'] + self.PS = self.cultivar_params['PS'] + self.TS = self.cultivar_params['TS'] + self.PVT = self.cultivar_params['PVT'] + self.FDF = self.cultivar_params['FDF'] + self.Tb = self.cultivar_params['Tb'] + self.To = self.cultivar_params['To'] + self.Tm = self.cultivar_params['Tm'] + + # 土壤参数 + self.SNO3_0 = self.soil_params['SNO3_0'] + self.SNH4_0 = self.soil_params['SNH4_0'] + self.BD = self.soil_params['BD'] + self.DLAYR = self.soil_params['DLAYR'] + self.NLAYR = self.soil_params['NLAYR'] + self.DS = self.soil_params['DS'] + self.DUL = self.soil_params['DUL'] + self.SAT = self.soil_params['SAT'] + self.LL = self.soil_params['LL'] + self.PH = self.soil_params['PH'] + self.SOILC = self.soil_params['SOILC'] + self.FOM = self.soil_params['FOM'] + self.FON = self.soil_params['FON'] + self.TOTN = self.soil_params['TOTN'] + self.SW0 = self.soil_params['SW0'] + self.CLAY = self.soil_params['CLAY'] + self.CN = self.soil_params['CN'] + + # 氮相关参数 + self.Nd = self.n_params['Nd'] + + def interception(self, P: float, LAI: float, Fw: float, SW0: list): + """Interception, 作物叶片截留, 单位为cm3/cm3""" + + eta = math.exp(- self.kl * LAI) + f = 0.2 # f means 0.2kg water/kg fresh weight,f为单位鲜重生物量的截留能力(0.2kg水/kg 鲜重) + intcap = (1-eta) * f * Fw/10000/10000*1000 # Fw means fresh weight of the crop,its unit is kg/ha. turns to g/cm2 ???? Fw = 地上部鲜重? ,intercap(cm) + t = 1 # 模拟步长 + Interception = min(P, intcap/t) + if Interception <= 0: ###补充代码,避免出现截留量<0的情况 + # print('interception < 0, please check') + Interception = 0 + + return Interception, SW0 + + def runoff(self, P: float, I: float, Interception: float, SW0: list, Flood: bool=False): + """ + 计算Runoff, 地表径流量,cm + + :param Flood: 是否淹水,布尔类型,默认False + """ + SW1 = [0 for i in range(self.NLAYR)] + if Flood == True: + FldH = 4 # flooding depth, cm 水田淹水深度 + Pinf = P + I - Interception + FldH = FldH + Pinf + BundH = 30 # height of ridge, cm 田埂高 + if FldH > BundH: + Runoff = FldH - BundH #### SW会改变吗????????!!!!!!!! + depth = BundH + if FldH <= BundH: + Runoff = 0 + depth = FldH + # SW = [] + for L in range(self.NLAYR): + SW1[L] = self.DUL[L] + + if Flood == False: + + # 土壤储水量 Soil storage + # SMX = 254.0 * (100.0 / CN - 1.0) # (mm) + SMX = 254.0 * (100.0 / self.CN - 1.0) / 10 #(cm) + + # 初始吸收比率 Initial abstraction ratio + # 地表径流与土壤地表两层含水量的平均值有关。Runoff is related to the average soil water content of the top two layers of soil + SWABI = 0.15 * ((self.SAT[0] - SW0[0]) / (self.SAT[0] - self.LL[0] * 0.5) + ( + self.SAT[1] - SW0[1]) / (self.SAT[1] - self.LL[1] * 0.5)) + SWABI = max(0.0, SWABI) + + # 暂不考虑土壤表层的覆盖物 + IABS = SWABI + + # WATAVL, Water available for infiltration or runoff (rainfall plus irrigation) (cm/d) + # 可用于入渗或径流的水量(= 降雨量+灌溉量)单位为cm/d,与降雨和灌溉的单位一致 + WATAVL = P + I + + # PB, Determines threshold amount of rainfall that will occur before runoff starts (mm/d) + # 确定在径流开始之前,将发生的降雨或灌溉阈值(毫米/天) + PB = WATAVL - IABS * SMX + if WATAVL > 0.001: + if PB > 0: + Runoff = PB ** 2 / (WATAVL + (1.0 - IABS) * SMX) + else: + Runoff = 0.0 + else: + Runoff = 0.0 + + for L in range(self.NLAYR): + # print(L) + if L <= 1: + SW1[L] = self.DUL[L] # 土壤前两层为饱和含水量 + else: + SW1[L] = self.SW0[L] + + return Runoff, SW1 + + def pinf(self, P: float, I: float, Interception: float, SW1: list): + """降水或灌溉的入渗,cm""" + + SWSAT =[] + # SWFC = DUL # SWFC means field water capacity,the same as DUL. + Ksw = [] + Pinf = [0 for i in range(self.NLAYR)] + SW2 = [0 for i in range(self.NLAYR)] + + # Interception = Soil_Interception.Interception(WEATHER, t, PDT, HI, TBiomass, SLA) + sum_Pinf = [0 for i in range(self.NLAYR)] + sum_Pinf[0] = P + I - Interception + # print('sum_Pinf = ',sum_Pinf) + + for L in range(self.NLAYR): + SWSAT.append(1 - self.BD[L] / 2.65) #SWSAT == SAT + # SWSAT = SAT + Ksw.append(75 * ((SWSAT[L] - self.DUL[L]) / self.DUL[L]) ** 2) #Its unit is cm/h, KSAT means Soil Saturated Hydraulic Conductivity. the same as Ksw.饱和导水率 + SW2[L] = (sum_Pinf[L]/self.DLAYR[L] + SW1[L]) + if SW2[L] < self.DUL[L]: + Pinf[L] = sum_Pinf[L] + sum_Pinf[L] = 0 + + continue + if SW2[L] == self.DUL[L]: + if L == 0: + Pinf[L] = sum_Pinf[L] + if L > 0: + sum_Pinf[L] = sum_Pinf[L - 1] + continue + if SW2[L] > self.DUL[L]: + Pinf[L] = (self.DUL[L]-SW1[L])*self.DLAYR[L] + SW2[L] = self.DUL[L] + sum_Pinf[L] = sum_Pinf[L] - Pinf[L] #sum_Pinf 表示到下一层的入渗量 + + if SW2[L] <= self.LL[L]: ###补充代码,农田的含水量始终高于萎蔫含水量,避免出现含水量为0的情况 + SW2[L] == self.LL[L] + print('SW2 < 0, please check') + + return SW2 + + def capillary_rise(self, SW2: list, water_table_presence: bool=1): + """ + 计算地下水的毛细管上升量 + + :param water_table_presence: 是否存在地下水(0,1) + :return: 地下水位对毛细管的补给量 + """ + + Soil_fshape_cr = 16.0 # 毛细管上升形状系数,用于控制毛细管上升水量的比例 + FluxOut = [0.04, 0.03, 0.02, 0.01] # 从每层流出量 + z_gw = 25 + Init_water_Adj = [0, 0, 0, 0] + + zMid_1 = np.cumsum(self.DLAYR) + zMid_2 = [item / 2 for item in self.DLAYR] + zMid = np.subtract(zMid_1, zMid_2) + + # 计算每一层的饱和导水率 (mm/day) 饱和导水率 + Ksat = [] + for ii in range(len(self.SAT)): + lmbda = 1 / ((np.log(1500) - np.log(33)) / (np.log(self.DUL[ii]) - np.log(self.LL[ii]))) + K1 = (1930 * (self.SAT[ii] - self.DUL[ii]) ** (3 - lmbda)) * 24 + Ksat.append(K1) + # print(Ksat) + + # 模块输入系数总体上bCR、aCR,需要的系数 + bCR = np.zeros(self.NLAYR) + aCR = np.zeros(self.NLAYR) + for jj in range(0, self.NLAYR): + if ( + (self.LL[jj] >= 0.04) + and (self.LL[jj] <= 0.15) + and (self.DUL[jj] >= 0.09) + and (self.DUL[jj] <= 0.28) + and (self.SAT[jj] >= 0.32) + and (self.SAT[jj] <= 0.51) + ): + # Sandy soil class + if (Ksat[jj] >= 200) and (Ksat[jj] <= 2000): + aCR[jj] = -0.3112 - (Ksat[jj] * (1e-5)) + bCR[jj] = -1.4936 + (0.2416 * np.log(Ksat[jj])) + elif Ksat[jj] < 200: + aCR[jj] = -0.3112 - (200 * (1e-5)) + bCR[jj] = -1.4936 + (0.2416 * np.log(200)) + elif Ksat[jj] > 2000: + aCR[jj] = -0.3112 - (2000 * (1e-5)) + bCR[jj] = -1.4936 + (0.2416 * np.log(2000)) + + elif ( + (self.LL[jj] >= 0.06) + and (self.LL[jj] <= 0.20) + and (self.DUL[jj] >= 0.23) + and (self.DUL[jj] <= 0.42) + and (self.SAT[jj] >= 0.42) + and (self.SAT[jj] <= 0.55) + ): + # Loamy soil class + if (Ksat[jj] >= 100) and (Ksat[jj] <= 750): + aCR[jj] = -0.4986 + (9 * (1e-5) * Ksat[jj]) + bCR[jj] = -2.132 + (0.4778 * np.log(Ksat[jj])) + elif Ksat[jj] < 100: + aCR[jj] = -0.4986 + (9 * (1e-5) * 100) + bCR[jj] = -2.132 + (0.4778 * np.log(100)) + elif Ksat[jj] > 750: + aCR[jj] = -0.4986 + (9 * (1e-5) * 750) + bCR[jj] = -2.132 + (0.4778 * np.log(750)) + + elif ( + (self.LL[jj] >= 0.16) + and (self.LL[jj] <= 0.34) + and (self.DUL[jj] >= 0.25) + and (self.DUL[jj] <= 0.45) + and (self.SAT[jj] >= 0.40) + and (self.SAT[jj] <= 0.53) + ): + # Sandy clayey soil class + if (Ksat[jj] >= 5) and (Ksat[jj] <= 150): + aCR[jj] = -0.5677 - (4 * (1e-5) * Ksat[jj]) + bCR[jj] = -3.7189 + (0.5922 * np.log(Ksat[jj])) + elif Ksat[jj] < 5: + aCR[jj] = -0.5677 - (4 * (1e-5) * 5) + bCR[jj] = -3.7189 + (0.5922 * np.log(5)) + elif Ksat[jj] > 150: + aCR[jj] = -0.5677 - (4 * (1e-5) * 150) + bCR[jj] = -3.7189 + (0.5922 * np.log(150)) + + elif ( + (self.LL[jj] >= 0.20) + and (self.LL[jj] <= 0.42) + and (self.DUL[jj] >= 0.40) + and (self.DUL[jj] <= 0.58) + and (self.SAT[jj] >= 0.49) + and (self.SAT[jj] <= 0.58) + ): + + # Silty clayey soil class + if (Ksat[jj] >= 1) and (Ksat[jj] <= 150): + # print(aCR) + aCR[jj] = -0.6366 + (8 * (1e-4) * Ksat[jj]) + bCR[jj] = -1.9165 + (0.7063 * np.log(Ksat[jj])) + elif Ksat[jj] < 1: + aCR[jj] = -0.6366 + (8 * (1e-4) * 1) + bCR[jj] = -1.9165 + (0.7063 * np.log(1)) + elif Ksat[jj] > 150: + aCR[jj] = -0.6366 + (8 * (1e-4) * 150) + bCR[jj] = -1.9165 + (0.7063 * np.log(150)) + + for i in range(len(aCR)): + aCR[i] = max(aCR[i], 0) + bCR[i] = max(bCR[i], 0) + + # print(aCR, bCR) + + ## Get groundwater table elevation on current day ## + z_gw = z_gw + + ## Calculate capillary rise ## + if water_table_presence == 0: # No water table present + # Capillary rise is zero + CrTot = 0 + elif water_table_presence == 1: # Water table present + # Get maximum capillary rise for bottom compartment + zBot = zMid_1[-1] + zBotMid = zMid[-1] + if (Ksat[-1] > 0) and (z_gw > 0) and ((z_gw - zBotMid) < 4): + if zBotMid >= z_gw: + MaxCR = 99 + else: + MaxCR = np.exp((np.log(z_gw - zBotMid) - bCR[-1]) / aCR[-1]) + if MaxCR > 99: + MaxCR = 99 + + else: + MaxCR = 0 + + + compi = self.NLAYR - 1 # 从土层最底部开始 + WCr = 0 # 毛细管上升计数器 + + Init_water = SW2 + + while (round(MaxCR * 1000) > 0) and (compi > -1) and (round(FluxOut[compi] * 1000) == 0): + # 向上运动,达到土壤表面,或遇到当天已经发生向下排水渗透的隔室,找到当前土层,计算驱动力 + if (Init_water[compi] >= self.LL[compi]) and (Soil_fshape_cr > 0): + Df = 1 - ( + ( + (Init_water[compi] - self.LL[compi]) + / (Init_water_Adj[compi] - self.LL[compi]) + ) + ** Soil_fshape_cr + ) + if Df > 1: + Df = 1 + elif Df < 0: + Df = 0 + + else: + Df = 1 + + # 计算相对水力传导系数 + thThr = (self.LL[compi] + self.DUL[compi]) / 2 + if Init_water[compi] < thThr: + if (Init_water[compi] <= self.LL[compi]) or (thThr <= self.LL[compi]): + Krel = 0 + else: + Krel = (Init_water[compi] - self.LL[compi]) / (thThr - self.LL[compi]) + + else: + Krel = 1 + + # 检查是否有空间储存毛细管上升的水 + dth = round(Init_water_Adj[compi] - Init_water[compi],4) + + # Store water if room is available 如果空间有效的话,存储水量 + if (dth > 0) and ((zBot - self.DLAYR[compi] / 2) < z_gw): + dthMax = Krel * Df * MaxCR / (10 * self.DLAYR[compi]) + if dth >= dthMax: + Init_water[compi] = Init_water[compi] + dthMax + CRcomp = dthMax * 10 * self.DLAYR[compi] + MaxCR = 0 + else: + Init_water[compi] = Init_water_Adj[compi] + CRcomp = dth * 10 * self.DLAYR[compi] + MaxCR = (Krel * MaxCR) - CRcomp + + WCr = WCr + CRcomp + + # 更新各层底部高度 + zBot = zBot - self.DLAYR[compi] + # 更新隔间和层计数器 + compi = compi - 1 + # 更新毛细管最大上升限制 + if compi > -1: + + zBotMid = zBot - (self.DLAYR[compi] / 2) + if (Ksat[compi] > 0) and (z_gw > 0) and ((z_gw - zBotMid) < 4): + if zBotMid >= z_gw: + LimCR = 99 + else: + LimCR = np.exp((np.log(z_gw - zBotMid) - bCR[compi]) / aCR[compi]) + if LimCR > 99: + LimCR = 99 + + else: + LimCR = 0 + + if MaxCR > LimCR: + MaxCR = LimCR + + # Store total depth of capillary rise 毛细管上升总深度 + CrTot = WCr + + return CrTot, SW2 + + def e0(self, T: float): + """ + :param T: 气温,℃ + :return: + e: 气温为T时的水汽压,kPa + """ + e = 0.6108*(math.exp((17.27 * T / (T + 237.3)))) + return e + + def cal_Rn(self, doy: int, SH: float, Tmax: float, Tmin: float, RH: float) -> float: + """作物表面上的净辐射,MJ/(m2·day)""" + + a = 0.23 # 冠层反射率,绿色植被覆盖的地表的反射率约为0.20-0.25。以绿草为参考作物时,a=0.23。 + Lat = self.latitude * math.pi / 180.0 + Z = self.elevation + delta = 0.409 * math.sin(2 * math.pi * doy / 365 - 1.39) # 太阳赤纬 + ws = math.acos(-math.tan(Lat*math.pi / 180.0)*math.tan(delta)) # 太阳时角 + dr = 1 + 0.033 * math.cos(2 * math.pi * doy / 365) # 日地距离系数 + Ra = ((24 * 60 * 0.082) / math.pi * dr * + (ws * math.sin(Lat*math.pi / 180.0) * math.sin(delta) + math.sin(ws) * math.cos(Lat*math.pi / 180.0) * math.cos(delta))) # 天文辐射 + Rso = (0.75 + 2 * 10**(-5) * Z) * Ra # 晴天辐射 + N = 24 / math.pi * ws + Rs = (0.25 + 0.5 * SH / N) * Ra # 太阳短波辐射 + Rns = (1 - a) * Rs # 净短波辐射 + + es = (self.e0(Tmax) + self.e0(Tmin)) / 2 + ea = es * RH / 100 + Rnl = (4.903 * 10**(-9) * (((Tmax + 273.16)**4 - (Tmin + 273.16)**4) / 4) * + (0.34 - 0.14 * ea**0.5) * (1.35 * Rs / Rso - 0.35)) # 净长波辐射 + Rn = Rns - Rnl + return Rn + + def PM_ET0(self, Tmax, Tmin, RH, P, u2, Rn): + """作物潜在蒸散量,mm""" + + Tmean = (Tmax + Tmin) / 2 + # 土壤热通量 + G = 0 + # 饱和水汽压 + es = (self.e0(Tmax) + self.e0(Tmin)) / 2 + # 实际水汽压 + ea = es * RH / 100 + # 饱和水汽压曲线斜率 + delta = 4098 * self.e0(Tmean) / (Tmean + 237.3) ** 2 + # 湿度计常数 + gama = 0.665 * 0.001 * P + ET0 = (0.408*delta*(Rn-G) + gama*900*u2*(es-ea)/(Tmean+273)) / (delta + gama*(1 + 0.34*u2)) + + return ET0 + + def cal_Kcb(self, current_pdt: float, RHmin: float, u2: float) -> float: + """Kcb,作物蒸腾系数""" + + PDT_1 = self.PDT_EM + PDT_2 = self.PDT_BT + PDT_3 = self.PDT_EF + PDT_4 = self.PDT_MT + + if RHmin != 45 or u2 != 2: + if self.Kcbmid >= 0.45: + kcbmid_new = self.Kcbmid + (0.04*(u2-2)-0.004*(RHmin-45))*(self.h/3)**0.3 + else: + kcbmid_new = self.Kcbmid + + if self.Kcbend >= 0.45: + kcbend_new = self.Kcbend + (0.04*(u2-2)-0.004*(RHmin-45))*(self.h/3)**0.3 + else: + kcbend_new = self.Kcbend + else: + kcbmid_new = self.Kcbmid + kcbend_new = self.Kcbend + + if current_pdt <= PDT_1: + Kcb = self.Kcbini + elif PDT_1 < current_pdt <= PDT_2: + Kcb = self.Kcbini + (kcbmid_new - self.Kcbini)/(PDT_2 - PDT_1) * (current_pdt - PDT_1) + elif PDT_2 < current_pdt <= PDT_3: + Kcb = kcbmid_new + elif PDT_3 < current_pdt < PDT_4: + Kcb = self.Kcbmid + (kcbend_new - kcbmid_new)/(PDT_4 - PDT_3) * (current_pdt - PDT_3) + else: + Kcb = kcbend_new + return Kcb + + def ETc(self, current_date: str, current_pdt: float, rootdepth: float, Runoff: float, I: float, CrTot: float, De0: float, SW0: list): + """ETcadj: 胁迫条件下的作物蒸腾量,mm""" + + Rain = self.weather.loc[current_date, 'RAIN'] + Tmin = self.weather.loc[current_date, 'Tmin'] + Tmax = self.weather.loc[current_date, 'Tmax'] + SH = self.weather.loc[current_date, 'SH'] + u2 = self.weather.loc[current_date, 'u2'] + RH = self.weather.loc[current_date, 'RHave'] + RHmin = self.weather.loc[current_date, 'RHmin'] + P = self.weather.loc[current_date, 'Atm'] + + # 计算ETo + doy = DateUtils.cal_Doy(current_date) + Rn = self.cal_Rn(doy, SH, Tmax, Tmin, RH) + ETo = self.PM_ET0(Tmax, Tmin, RH, P, u2, Rn) # 参考作物蒸散量,mm/d + + kcb = self.cal_Kcb(current_pdt, RHmin, u2) # 作物蒸腾系数 + # print(kcb) + kcmin = 0.15 # 无地表覆盖的干燥土壤最小Kc值,约为 0.15-0.20 + kcmax = max((1.2 + (0.04 * (u2 - 2) - 0.004 * (RHmin - 45)) * (self.h / 3) ** 0.3), (kcb + 0.5)) + if kcb >= kcmin: + fc = ((kcb - kcmin) / (kcmax - kcmin)) ** (1 + 0.5 * self.h) # 地表遮盖比例 + else: + fc = 0 + fw = 1.0 # 地表湿润比例,降雨、喷灌、漫灌、畦灌条件下为1.0 + few = min((1 - fc), fw) + + # 计算蒸发减少系数kr + Ze = 0.10 # 由于蒸发而变干的表土层厚度,可取0.10~0.15m + TEW = 1000 * (self.DUL[0] - 0.5 * self.LL[0]) * Ze # 总蒸发水量 + REW = 8 # 易蒸发水量 + if De0 <= REW: + kr = 1 + else: + kr = (TEW - De0) / (TEW - REW) + + # 计算地表蒸发系数ke和地表蒸发量E + ke = min(kr*(kcmax-kcb), few*kcb) + E = kr * ke * ETo # 地表蒸发量,mm + + Tew = 0 # 通常可忽略 + + # 当有强降水或灌溉时,De可认为是0 + if Rain >= 3 or I > 0: + De = 0 + DPe = (Rain - Runoff) + I / fw - De0 + SW = SW0 + SW[0] = self.DUL[0] + else: + DPe = 0 + De = De0 - (Rain - Runoff) - I/fw + E/few + Tew + DPe + if De < 0: + De = 0 + elif De > TEW: + De = TEW + SW = SW0 + SW[0] = SW0[0] - De / (Ze * 1000) + + ETcadj = 0 + if rootdepth > 0: + + # ======================== 计算 ET ========================= + Zr = rootdepth / 10 # 每日有效根深,m + # Zr = 0.5 + + Depth = 0 + if Zr > 0.4: + i = 3 + Zr = 0.4 + else: + i = 0 + while i < self.NLAYR: + Depth += self.DLAYR[i] / 100 + if Zr > Depth: + i += 1 + else: + break + + # print(i) + + TAW = 1000 * (self.DUL[i] - self.LL[i]) * Zr # 总有效水量,mm + pct = 0.5 # 不遭受水分胁迫时,作物从根系层中吸收的有效水量与总有效水量 TAW 之比,通常取0.5 + + Dr0 = 1000 * (self.DUL[i] - SW0[i]) * Zr + if Dr0 > TAW: + Dr0 = TAW + if Dr0 <= pct*TAW: + ks = 1.0 + else: + ks = (TAW - Dr0) / ((1 - pct) * TAW) + ETc = (kcb + ke) * ETo + # ETcadj = (ks*kcb + ke) * ETo + ETcadj = (kcb + ke) * ETo + # 当有强降水或灌溉时,De可认为是0 + if Rain >= 3 or I > 0: + DP = (Rain - Runoff) + I - ETcadj - Dr0 + else: + DP = 0 + + Dr = Dr0 - (Rain - Runoff) - I - CrTot + ETcadj + DP + if Dr > TAW: + Dr = TAW + SW[i] = SW0[i] - Dr / (Zr * 1000) + + return E, ETcadj, De, SW + + def simulate(self): + """根系吸水量,单位为 cm3/cm3""" + + biomassmodel = BiomassModel(self.start, self.end, self.weather, self.cultivar_params, self.management, + self.plant_params, self.soil_params) + biomassmodel.ifEmergence() + + results = {} + + delta = (self.end_date - self.start_date).days + SW = self.SW0 + De0 = 0 + Biomass0 = self.seed_weight / 2 + rootdepth = 0 + for day in (self.start_date + datetime.timedelta(n) for n in range(delta + 1)): + date_str = day.strftime("%m/%d/%Y") + + Biomass0, LAI, Fw, ROOTWT = BiomassModel(self.start, date_str, self.weather, self.cultivar_params, self.management, + self.plant_params, self.soil_params).biomass(day, Biomass0) + + irri_date = self.irrigation['date'] + if date_str == irri_date: + I = self.irrigation['amount'] + else: + I = 0.0 + try: + Rain = self.weather.loc[date_str, 'RAIN'] + Tmin = self.weather.loc[date_str, 'Tmin'] + Tmax = self.weather.loc[date_str, 'Tmax'] + SH = self.weather.loc[date_str, 'SH'] + u2 = self.weather.loc[date_str, 'u2'] + RH = self.weather.loc[date_str, 'RHave'] + RHmin = self.weather.loc[date_str, 'RHmin'] + # P = self.weather.loc[date_str, 'Atm'] + except KeyError: + print(f"气象数据中缺少 {date_str} 的记录,跳过该天。") + continue + if day < biomassmodel.emergence_date: + print("作物还未出苗。") + PDT = 0 + Interception = 0 + Runoff, SW1 = self.runoff(Rain, I, Interception, SW) + SW2 = self.pinf(Rain, I, Interception, SW1) + CrTot, SW2 = self.capillary_rise(SW2) + E, ETcadj, De, SW3 = self.ETc(date_str, PDT, rootdepth, Runoff, I, CrTot, De0, SW2) + Si = [0 for i in range(self.NLAYR)] + SW4 = [0 for i in range(self.NLAYR)] + for L in range(self.NLAYR): + SW4[L] = min(max(self.LL[L], SW3[L] - Si[L]), self.SAT[L]) ### 土壤水分含量最低为LL + else: + Interception, SW0 = self.interception(Rain, LAI, Fw, SW) + PDT = biomassmodel._cal_pdt(day) + + daily_rootdepth = biomassmodel.daily_DRTDEP(date_str, PDT, wdf=1) + rootdepth += daily_rootdepth + # 达到最大有效根深后根系深度不再增加 + if rootdepth == 150: + rootdepth = 150 + RLV = biomassmodel.RLV(rootdepth, ROOTWT) + + Runoff, SW1 = self.runoff(Rain, I, Interception, SW0) + SW2 = self.pinf(Rain, I, Interception, SW1) + CrTot, SW2 = self.capillary_rise(SW2) + E, ETcadj, De, SW3 = self.ETc(date_str, PDT, rootdepth, Runoff, I, CrTot, De0, SW2) + + Tp = ETcadj - E # Tp means potential transpiration of plants + + Si = [] + SW4 = [0 for i in range(self.NLAYR)] + sum_RLV = sum(RLV) + for L in range(self.NLAYR): + ccc = RLV[L] / sum_RLV + Smi = Tp * ccc + WFi = 0.4 # WFi means the effct on Soil water transpiration, and its range is 0-1. + # WFi = 1 + # print(min(SW3[L] - self.LL[L], WFi * Smi)) + Si.append(max(min(SW3[L] - self.LL[L], WFi * Smi), 0)) ### 作物仅能吸收LL以上的土壤水分 + # sum_Ta = sum_Ta + Si + SW4[L] = min(max(self.LL[L], SW3[L] - Si[L]), self.SAT[L]) ### 土壤水分含量最低为LL + + results[date_str] = Si + SW = SW4 + De0 = De + return results + + +# Pydantic models for API +class SimulationRequest(BaseModel): + start_date: str + end_date: str + cultivar_params: Dict[str, Any] + plant_params: Dict[str, Any] + soil_params: Dict[str, Any] + management: Dict[str, Any] + n_params: Dict[str, Any] + weather_data: List[Dict[str, Any]] # Weather data as list of dicts + +class HealthCheckResponse(BaseModel): + status: str + message: str + +# FastAPI app +app = FastAPI( + title="Soil Water Balance Model API", + description="API for calculating soil water balance and root water uptake", + version="1.0.0" +) + +@app.get("/health", response_model=HealthCheckResponse) +async def health_check(): + """Health check endpoint""" + return HealthCheckResponse(status="healthy", message="Soil water balance model API is running") + +@app.post("/simulate", response_model=Dict[str, any]) +async def simulate_soil_water_balance(request: SimulationRequest): + """ + Run soil water balance simulation + + Parameters: + - start_date: Start date in MM/DD/YYYY format + - end_date: End date in MM/DD/YYYY format + - cultivar_params: Cultivar parameters + - plant_params: Plant parameters + - soil_params: Soil parameters + - management: Management parameters + - n_params: Nitrogen parameters + - weather_data: Weather data as list of dictionaries + + Returns: + - Dictionary containing simulation results with dates as keys and root water uptake (Si) as values + """ + try: + # Convert weather data list to pandas DataFrame + weather_df = pd.DataFrame(request.weather_data) + if 'date' in weather_df.columns: + weather_df.set_index('date', inplace=True) + weather_df.index = pd.to_datetime(weather_df.index) + + # Initialize the model + model = SoilWaterModel( + start=request.start_date, + end=request.end_date, + weather=weather_df, + cultivar_params=request.cultivar_params, + plant_params=request.plant_params, + soil_params=request.soil_params, + management=request.management, + n_params=request.n_params + ) + + # Run simulation + results = model.simulate() + + return { + "status": "success", + "results": results, + "start_date": request.start_date, + "end_date": request.end_date + } + + except Exception as e: + raise HTTPException(status_code=500, detail=f"Simulation failed: {str(e)}") + +@app.post("/simulate_from_files") +async def simulate_from_files( + start_date: str, + end_date: str, + weather_file: UploadFile = File(...), + management_file: UploadFile = File(...), + soil_params_file: UploadFile = File(...), + n_params_file: UploadFile = File(...), + plant_params_file: UploadFile = File(...), + cultivar_params_file: UploadFile = File(...) +): + """ + Run simulation using uploaded parameter files + + Parameters: + - start_date: Start date in MM/DD/YYYY format + - end_date: End date in MM/DD/YYYY format + - weather_file: CSV file with weather data + - management_file: JSON file with management parameters + - soil_params_file: JSON file with soil parameters + - n_params_file: JSON file with nitrogen parameters + - plant_params_file: JSON file with plant parameters + - cultivar_params_file: JSON file with cultivar parameters + + Returns: + - Dictionary containing simulation results + """ + try: + # Read uploaded files + weather_data = pd.read_csv(weather_file.file, index_col='date', parse_dates=True) + + management = json.load(management_file.file) + soil_params = json.load(soil_params_file.file) + n_params = json.load(n_params_file.file) + plant_params = json.load(plant_params_file.file) + cultivar_params = json.load(cultivar_params_file.file) + + # Initialize the model + model = SoilWaterModel( + start=start_date, + end=end_date, + weather=weather_data, + cultivar_params=cultivar_params, + plant_params=plant_params, + soil_params=soil_params, + management=management, + n_params=n_params + ) + + # Run simulation + results = model.simulate() + + return { + "status": "success", + "results": results, + "start_date": start_date, + "end_date": end_date + } + + except Exception as e: + raise HTTPException(status_code=500, detail=f"Simulation failed: {str(e)}") + +if __name__ == '__main__': + # Run with uvicorn + uvicorn.run(app, host="0.0.0.0", port=8000) \ No newline at end of file diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..5bae334 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,74 @@ +# Nginx configuration for Soil Water Balance Model API +# Place this file in /etc/nginx/sites-available/ and create symlink to sites-enabled/ + +upstream soil_water_api { + server 127.0.0.1:8000; + # Add more servers for load balancing if needed + # server 127.0.0.1:8001; + # server 127.0.0.1:8002; +} + +server { + listen 80; + server_name your-domain.com; # Replace with your actual domain + + # Redirect HTTP to HTTPS (optional, but recommended) + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; # Replace with your actual domain + + # SSL configuration (replace with your actual certificates) + ssl_certificate /path/to/your/certificate.crt; + ssl_certificate_key /path/to/your/private.key; + + # SSL security settings + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384; + ssl_prefer_server_ciphers off; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-XSS-Protection "1; mode=block" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; + add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; + + # API endpoints + location / { + proxy_pass http://soil_water_api; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Timeout settings + proxy_connect_timeout 30s; + proxy_send_timeout 30s; + proxy_read_timeout 30s; + + # File upload size limit (adjust as needed) + client_max_body_size 50M; + } + + # Health check endpoint (for load balancer) + location /health { + proxy_pass http://soil_water_api/health; + access_log off; + } + + # API documentation + location /docs { + proxy_pass http://soil_water_api/docs; + proxy_set_header Host $host; + } + + # Static files for API docs + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { + proxy_pass http://soil_water_api; + expires 1y; + add_header Cache-Control "public, immutable"; + } +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0b0e887 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +fastapi==0.104.1 +uvicorn[standard]==0.24.0 +pandas==2.1.4 +numpy==1.26.2 +pydantic==2.5.0 +python-multipart==0.0.6 diff --git a/test_api.py b/test_api.py new file mode 100644 index 0000000..aa89242 --- /dev/null +++ b/test_api.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +""" +测试Soil Water Balance Model API +""" + +import requests +import json +import pandas as pd +import os + +def test_health_check(): + """测试健康检查端点""" + try: + response = requests.get("http://localhost:8000/health") + if response.status_code == 200: + print("✓ 健康检查通过") + return True + else: + print("✗ 健康检查失败") + return False + except Exception as e: + print(f"✗ 健康检查错误: {e}") + return False + +def load_test_data(): + """加载测试数据""" + base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) + + # 加载参数文件 + with open(os.path.join(base_dir, 'data', 'management.json')) as f: + management = json.load(f) + + with open(os.path.join(base_dir, 'data', 'SOILPROP.json')) as f: + soil_params = json.load(f) + + with open(os.path.join(base_dir, 'data', 'N_organ.json')) as f: + n_params = json.load(f) + + with open(os.path.join(base_dir, 'data', 'plant_para.json')) as f: + plant_params = json.load(f) + + with open(os.path.join(base_dir, 'data', 'para.json')) as f: + cultivar_params = json.load(f) + + # 加载气象数据 + weather_data = pd.read_csv( + os.path.join(base_dir, 'data', '57278_2024.csv'), + index_col='date', + parse_dates=True + ) + + # 转换为字典列表格式 + weather_list = [] + for date, row in weather_data.iterrows(): + weather_dict = {'date': date.strftime('%m/%d/%Y')} + weather_dict.update(row.to_dict()) + weather_list.append(weather_dict) + + return { + "start_date": "10/9/2023", + "end_date": "10/15/2023", # 缩短测试时间 + "cultivar_params": cultivar_params, + "plant_params": plant_params, + "soil_params": soil_params, + "management": management, + "n_params": n_params, + "weather_data": weather_list + } + +def test_simulation(): + """测试模拟计算""" + try: + test_data = load_test_data() + + response = requests.post( + "http://localhost:8000/simulate", + json=test_data, + headers={"Content-Type": "application/json"} + ) + + if response.status_code == 200: + result = response.json() + print("✓ 模拟计算成功") + print(f"结果包含 {len(result.get('results', {}))} 天的计算结果") + return True + else: + print(f"✗ 模拟计算失败: {response.status_code}") + print(response.text) + return False + except Exception as e: + print(f"✗ 模拟计算错误: {e}") + return False + +if __name__ == "__main__": + print("开始测试Soil Water Balance Model API...") + + # 测试健康检查 + if not test_health_check(): + print("API服务未运行,请先启动API服务") + exit(1) + + # 测试模拟计算 + if test_simulation(): + print("所有测试通过!") + else: + print("测试失败")