From 7f57befaeef00b101b139d553254d51175be2f51 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 10 Jul 2025 13:13:11 +0000 Subject: [PATCH 1/7] Fixing gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index baa3eb6..4c7b7d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ +.idea .Trash-1000 target database data/stats/imported -data/stats/imported/* \ No newline at end of file +data/__pycache__ \ No newline at end of file From 5ba8ae59d6c0c5d1a7ef4f34981448812ec418ab Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 10 Jul 2025 21:09:48 +0000 Subject: [PATCH 2/7] Started adding weather code --- Pipfile | 6 +- Pipfile.lock | 36 ++++++++-- data/build_weather.py | 150 ++++++++++++++++++++++------------------- data/db_connect.py | 15 ++++- data/sql/build_db.sql | 21 +++--- data/stats_importer.py | 59 ++++++++++++---- main.py | 21 +++--- 7 files changed, 197 insertions(+), 111 deletions(-) diff --git a/Pipfile b/Pipfile index 4f913fa..b86d932 100644 --- a/Pipfile +++ b/Pipfile @@ -4,9 +4,11 @@ verify_ssl = true name = "pypi" [packages] -numpy = "*" +geopy = "*" matplotlib = "*" -requests = "2.32" +numpy = "*" +pytz = "*" +requests = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index eeec9aa..88e0dc9 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e9b6a65b58f567612bd972fe4d418a525f8ce074120f1b49939a2a5e73f07ac9" + "sha256": "126729a6f98a1153aadb9df0008587107239cbb495b6d44f658c16a275f11a0a" }, "pipfile-spec": 6, "requires": { @@ -18,11 +18,11 @@ "default": { "certifi": { "hashes": [ - "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", - "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b" + "sha256:c1d2ec05395148ee10cf672ffc28cd37ea0ab0d99f9cc74c43e588cbd111b079", + "sha256:d842783a14f8fdd646895ac26f719a061408834473cfc10203f6a575beb15d39" ], "markers": "python_version >= '3.7'", - "version": "==2025.6.15" + "version": "==2025.7.9" }, "charset-normalizer": { "hashes": [ @@ -241,6 +241,22 @@ "markers": "python_version >= '3.9'", "version": "==4.58.5" }, + "geographiclib": { + "hashes": [ + "sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734", + "sha256:f7f41c85dc3e1c2d3d935ec86660dc3b2c848c83e17f9a9e51ba9d5146a15859" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0" + }, + "geopy": { + "hashes": [ + "sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1", + "sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7" + ], + "index": "pypi", + "version": "==2.4.1" + }, "idna": { "hashes": [ "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", @@ -565,9 +581,17 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, + "pytz": { + "hashes": [ + "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", + "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" + ], + "index": "pypi", + "version": "==2025.2" + }, "requests": { "hashes": [ "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", @@ -581,7 +605,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "urllib3": { diff --git a/data/build_weather.py b/data/build_weather.py index 1c56f9c..b1882f3 100644 --- a/data/build_weather.py +++ b/data/build_weather.py @@ -1,75 +1,85 @@ +import pytz import requests import datetime +from geopy.geocoders import Nominatim -class Weather: - # Example usage (requires OpenWeatherMap API key) - # Replace 'YOUR_API_KEY' with your actual key from https://openweathermap.org/ - def get_weather(self, latitude: float, longitude: float, date_str: str, hour: int) -> dict: - """ - Fetches weather data for the specified location and time. +def get_timezone(latitude: float, longitude: float): + geolocator = Nominatim() + location = geolocator.reverse(f"{latitude}, {longitude}") + + if location: + for tag in location.raw['address']: + if 'timezone' in tag: + tz_name = tag.split('=')[1] + return pytz.timezone(tz_name) + +def get_weather(latitude: float, longitude: float, date_str: str, hour: int) -> dict: + """ + Fetches weather data for the specified location and time. + + Args: + latitude (float): Latitude of the location in degrees. + longitude (float): Longitude of the location in degrees. + date_str (str): Date in YYYYMMDD format. + hour (int): Hour (0-23) when you want to know the weather. + + Returns: + dict: Dictionary containing temperature, condition, and sunrise/sunset times. + """ + # Convert date string components for API request + date = f"{date_str[:4]}-{date_str[4:6]}-{date_str[6:8]}" + + stats_to_get = [ + "temperature_2m", + "relative_humidity_2m", + "dew_point_2m", + "apparent_temperature", + "pressure_msl", + "surface_pressure", + "precipitation", + "rain", + "snowfall", + "cloud_cover", + "cloud_cover_low", + "cloud_cover_mid", + "cloud_cover_high", + "shortwave_radiation", + "direct_radiation", + "direct_normal_irradiance", + "diffuse_radiation", + "global_tilted_irradiance", + "sunshine_duration", + "wind_speed_10m", + "wind_speed_100m", + "wind_direction_10m", + "wind_direction_100m", + "wind_gusts_10m", + "et0_fao_evapotranspiration", + "weather_code", + "snow_depth", + "vapour_pressure_deficit", + "soil_temperature_0_to_7cm", + "soil_temperature_7_to_28cm", + "soil_temperature_28_to_100cm", + "soil_temperature_100_to_255cm", + "soil_moisture_0_to_7cm", + "soil_moisture_7_to_28cm", + "soil_moisture_28_to_100cm", + "soil_moisture_100_to_255cm", + ] + + stats_to_get = ','.join(stats_to_get) + timezone = get_timezone(latitude, longitude) + + try: + api_url = f"https://archive-api.open-meteo.com/v1/archive?latitude={latitude}&longitude={longitude}&timezone={timezone}&start_date={date}&end_date={date}&hourly={stats_to_get}" + response = requests.get(api_url) + data = response.json() - Args: - latitude (float): Latitude of the location in degrees. - longitude (float): Longitude of the location in degrees. - date_str (str): Date in YYYYMMDD format. - hour (int): Hour (0-23) when you want to know the weather. - - Returns: - dict: Dictionary containing temperature, condition, and sunrise/sunset times. - """ - # Convert date string components for API request - date = f"{date_str[:4]}-{date_str[4:6]}-{date_str[6:8]}" + if response.status_code != 200: + return {"error": "Failed to fetch weather", "details": data} - stats_to_get = [ - "temperature_2m", - "relative_humidity_2m", - "dew_point_2m", - "apparent_temperature", - "pressure_msl", - "surface_pressure", - "precipitation", - "rain", - "snowfall", - "cloud_cover", - "cloud_cover_low", - "cloud_cover_mid", - "cloud_cover_high", - "shortwave_radiation", - "direct_radiation", - "direct_normal_irradiance", - "diffuse_radiation", - "global_tilted_irradiance", - "sunshine_duration", - "wind_speed_10m", - "wind_speed_100m", - "wind_direction_10m", - "wind_direction_100m", - "wind_gusts_10m", - "et0_fao_evapotranspiration", - "weather_code", - "snow_depth", - "vapour_pressure_deficit", - "soil_temperature_0_to_7cm", - "soil_temperature_7_to_28cm", - "soil_temperature_28_to_100cm", - "soil_temperature_100_to_255cm", - "soil_moisture_0_to_7cm", - "soil_moisture_7_to_28cm", - "soil_moisture_28_to_100cm", - "soil_moisture_100_to_255cm", - ] - - stats_to_get = ','.join(stats_to_get) - - try: - api_url = f"https://archive-api.open-meteo.com/v1/archive?latitude={latitude}&longitude={longitude}&start_date={date}&end_date={date}&hourly={stats_to_get}" - response = requests.get(api_url) - data = response.json() - - if response.status_code != 200: - return {"error": "Failed to fetch weather", "details": data} - - return data - - except Exception as e: - return {"error": str(e), "details": f"No weather data available for {latitude}, {longitude} on {date_str}"} + return data + + except Exception as e: + return {"error": str(e), "details": f"No weather data available for {latitude}, {longitude} on {date_str}"} diff --git a/data/db_connect.py b/data/db_connect.py index ecdd8a9..43e6c3b 100644 --- a/data/db_connect.py +++ b/data/db_connect.py @@ -13,17 +13,26 @@ class Database: cursor.executescript(sql_script_string) self.db.commit() - def select(self, index): + def select(self, query, values): # Query the database for the specified index cursor = self.db.cursor() - query = "SELECT name, address FROM people WHERE id = ?" - cursor.execute(query, (index,)) + cursor.execute(query, values) result = cursor.fetchone() if result: return result else: return None + def selectall(self, query, values): + # Query the database for the specified index + cursor = self.db.cursor() + cursor.execute(query, values) + result = cursor.fetchall() + if result: + return result + else: + return None + def insert(self, query, values): # Insert new entry into the database cursor = self.db.cursor() diff --git a/data/sql/build_db.sql b/data/sql/build_db.sql index 96ea95b..cec0119 100644 --- a/data/sql/build_db.sql +++ b/data/sql/build_db.sql @@ -138,15 +138,20 @@ CREATE TABLE IF NOT EXISTS team_game ( CREATE TABLE IF NOT EXISTS weather ( game_id INTEGER NOT NULL, - temperature SMALLINT, - wind_speed FLOAT, - air_pressure FLOAT, + temperature FLOAT, humidity SMALLINT UNSIGNED, - uv_index FLOAT, - air_quality TINYINT UNSIGNED, - percipitation_type CHAR(10), - percipitation_amount FLOAT, - sky_condition CHAR(20), + dew_point FLOAT, + apparent_temperature FLOAT, + air_pressure FLOAT, + wind_speed FLOAT, + precipitation FLOAT, + rain FLOAT, + snowfall FLOAT, + cloud_cover SMALLINT UNSIGNED, + wind_speed FLOAT, + wind_direction SMALLINT UNSIGNED, + wind_gusts SMALLINT UNSIGNED, + sun_rise TIME, sun_set TIME, moon_phase TINYINT UNSIGNED, diff --git a/data/stats_importer.py b/data/stats_importer.py index 4f4e653..eec998f 100644 --- a/data/stats_importer.py +++ b/data/stats_importer.py @@ -2,6 +2,7 @@ import os import csv import shutil from data.db_connect import Database +from data.build_weather import get_weather class Importer: def __init__(self, database: Database): @@ -71,6 +72,19 @@ class Importer: ) """ + game_data = [ + game_stats["date"], game_stats["num-of-game"], game_stats["day-of-week"], + game_stats["length-in-outs"], game_stats["day-night"], game_stats["completion-info"], + game_stats["forfeit"], game_stats["protest"], game_stats["park-id"], + game_stats["attendance"], game_stats["length-in-min"], game_stats["home-plate-ump-id"], + game_stats["home-plate-ump-name"], game_stats["1b-plate-ump-id"], game_stats["1b-plate-ump-name"], + game_stats["2b-plate-ump-id"], game_stats["2b-plate-ump-name"], game_stats["3b-plate-ump-id"], + game_stats["3b-plate-ump-name"], game_stats["lf-plate-ump-id"], game_stats["lf-plate-ump-name"], + game_stats["rf-plate-ump-id"], game_stats["rf-plate-ump-name"], + ] + + game_id = self.database.insert(insert_game, game_data) + insert_team_game = """ INSERT INTO team_game ( @@ -124,19 +138,6 @@ class Importer: ) """ - game_data = [ - game_stats["date"], game_stats["num-of-game"], game_stats["day-of-week"], - game_stats["length-in-outs"], game_stats["day-night"], game_stats["completion-info"], - game_stats["forfeit"], game_stats["protest"], game_stats["park-id"], - game_stats["attendance"], game_stats["length-in-min"], game_stats["home-plate-ump-id"], - game_stats["home-plate-ump-name"], game_stats["1b-plate-ump-id"], game_stats["1b-plate-ump-name"], - game_stats["2b-plate-ump-id"], game_stats["2b-plate-ump-name"], game_stats["3b-plate-ump-id"], - game_stats["3b-plate-ump-name"], game_stats["lf-plate-ump-id"], game_stats["lf-plate-ump-name"], - game_stats["rf-plate-ump-id"], game_stats["rf-plate-ump-name"], - ] - - game_id = self.database.insert(insert_game, game_data) - visiting_team_data = [ game_id, game_stats["visiting-team"], game_stats["visiting-game-num"], game_stats["visiting-score"], game_stats["visiting-line-scores"], game_stats["visiting-at-bats"], @@ -189,3 +190,35 @@ class Importer: self.database.insert(insert_team_game, visiting_team_data) self.database.insert(insert_team_game, home_team_data) + + park_data = self.database.select("SELECT latitude, longitude FROM parks WHERE park_id = ?", (game_stats["park-id"],)) + + hour = 15 if game_stats["day-night"] == "D" else 19 + historic_weather = get_weather(park_data[0], park_data[1], game_stats["date"], hour) + historic_weather = historic_weather["hourly"] + + insert_into_weather = """ + INSERT INTO weather + ( + game_id, temperature, humidity, + dew_point, apparent_temperature, air_pressure, + wind_speed, precipitation, rain, + snowfall, cloud_cover, wind_speed, + wind_direction, wind_gusts, sun_rise, + sin_set, moon_phase + ) + VALUES + ( + ?, ?, ?, + ?, ?, ?, + ?, ?, ?, + ?, ?, ?, + ?, ?, ?, + ?, ? + ) + """ + + weather_data = [ + game_id, historic_weather["temperature_2m"][hour], historic_weather["relative_humidity_2m"][hour], + + ] diff --git a/main.py b/main.py index bf201d7..84776f4 100644 --- a/main.py +++ b/main.py @@ -2,7 +2,7 @@ import numpy as np # helps with the math import matplotlib.pyplot as plt # to plot error during training from data.db_connect import Database from data.stats_importer import Importer -from data.build_weather import Weather +from data.build_weather import get_weather # input data inputs = np.array([[0, 0, 1, 0], @@ -59,23 +59,26 @@ class NeuralNetwork: return prediction if __name__ == '__main__': - build_db_path = "./data/sql/build_db.sql" - fill_parks_path = "./data/sql/prefill_parks.sql" - fill_teams_path = "./data/sql/prefill_teams.sql" + #build_db_path = "./data/sql/build_db.sql" + #fill_parks_path = "./data/sql/prefill_parks.sql" + #fill_teams_path = "./data/sql/prefill_teams.sql" db_file = "./database/baseball.db" db_conn = Database(db_file) - db_conn.run_sql_file(build_db_path) - db_conn.run_sql_file(fill_parks_path) - db_conn.run_sql_file(fill_teams_path) + #db_conn.run_sql_file(build_db_path) + #db_conn.run_sql_file(fill_parks_path) + #db_conn.run_sql_file(fill_teams_path) - imp = Importer(db_conn) - imp.parse_all_data("./data/stats/to_import", "./data/stats/imported/") + #imp = Importer(db_conn) + #imp.parse_all_data("./data/stats/to_import", "./data/stats/imported/") #we = Weather() #print(we.get_weather(39.26733000, -76.79831000, "20250706", 12)) + park_data = db_conn.select("SELECT latitude, longitude FROM parks WHERE park_id = ? OR park_id = ?", ("ATL03","KAN06",)) + print(park_data[0]) + else: # create neural network NN = NeuralNetwork(inputs, outputs) From 3d7354481b88e526dabc47028533a04a813140d3 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 10 Jul 2025 21:10:39 +0000 Subject: [PATCH 3/7] Adding weather example --- weather_example.json | 988 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 988 insertions(+) create mode 100644 weather_example.json diff --git a/weather_example.json b/weather_example.json new file mode 100644 index 0000000..27eea72 --- /dev/null +++ b/weather_example.json @@ -0,0 +1,988 @@ +{ + "latitude": 39.26186, + "longitude": -76.8595, + "generationtime_ms": 15.3275728225708, + "utc_offset_seconds": 0, + "timezone": "GMT", + "timezone_abbreviation": "GMT", + "elevation": 54.0, + "hourly_units": { + "time": "iso8601", + "temperature_2m": "°C", + "relative_humidity_2m": "%", + "dew_point_2m": "°C", + "apparent_temperature": "°C", + "pressure_msl": "hPa", + "surface_pressure": "hPa", + "precipitation": "mm", + "rain": "mm", + "snowfall": "cm", + "cloud_cover": "%", + "cloud_cover_low": "%", + "cloud_cover_mid": "%", + "cloud_cover_high": "%", + "shortwave_radiation": "W/m²", + "direct_radiation": "W/m²", + "direct_normal_irradiance": "W/m²", + "diffuse_radiation": "W/m²", + "global_tilted_irradiance": "W/m²", + "sunshine_duration": "s", + "wind_speed_10m": "km/h", + "wind_speed_100m": "km/h", + "wind_direction_10m": "°", + "wind_direction_100m": "°", + "wind_gusts_10m": "km/h", + "et0_fao_evapotranspiration": "mm", + "weather_code": "wmo code", + "snow_depth": "m", + "vapour_pressure_deficit": "kPa", + "soil_temperature_0_to_7cm": "°C", + "soil_temperature_7_to_28cm": "°C", + "soil_temperature_28_to_100cm": "°C", + "soil_temperature_100_to_255cm": "°C", + "soil_moisture_0_to_7cm": "m³/m³", + "soil_moisture_7_to_28cm": "m³/m³", + "soil_moisture_28_to_100cm": "m³/m³", + "soil_moisture_100_to_255cm": "m³/m³" + }, + "hourly": { + "time": [ + "2025-07-06T00:00", + "2025-07-06T01:00", + "2025-07-06T02:00", + "2025-07-06T03:00", + "2025-07-06T04:00", + "2025-07-06T05:00", + "2025-07-06T06:00", + "2025-07-06T07:00", + "2025-07-06T08:00", + "2025-07-06T09:00", + "2025-07-06T10:00", + "2025-07-06T11:00", + "2025-07-06T12:00", + "2025-07-06T13:00", + "2025-07-06T14:00", + "2025-07-06T15:00", + "2025-07-06T16:00", + "2025-07-06T17:00", + "2025-07-06T18:00", + "2025-07-06T19:00", + "2025-07-06T20:00", + "2025-07-06T21:00", + "2025-07-06T22:00", + "2025-07-06T23:00" + ], + "temperature_2m": [ + 25.4, + 24.2, + 23.4, + 22.8, + 22.2, + 21.6, + 21.1, + 20.7, + 20.2, + 19.9, + 19.5, + 20.4, + 22.4, + 24.7, + 26.6, + 27.7, + 27.7, + 29.4, + 29.4, + 29.4, + 29.8, + 29.5, + 29.0, + 28.2 + ], + "relative_humidity_2m": [ + 57, + 69, + 71, + 73, + 76, + 78, + 79, + 79, + 80, + 82, + 84, + 82, + 77, + 74, + 69, + 67, + 66, + 59, + 60, + 62, + 63, + 61, + 64, + 68 + ], + "dew_point_2m": [ + 16.2, + 18.2, + 17.8, + 17.8, + 17.8, + 17.6, + 17.2, + 16.9, + 16.7, + 16.7, + 16.7, + 17.2, + 18.1, + 19.9, + 20.5, + 21.0, + 20.7, + 20.6, + 20.9, + 21.4, + 21.9, + 21.3, + 21.5, + 21.8 + ], + "apparent_temperature": [ + 25.9, + 25.6, + 24.6, + 24.2, + 23.7, + 23.0, + 22.3, + 21.8, + 21.3, + 21.0, + 20.8, + 22.0, + 24.6, + 27.8, + 29.1, + 31.2, + 30.5, + 33.4, + 33.0, + 32.8, + 33.4, + 32.1, + 31.4, + 31.0 + ], + "pressure_msl": [ + 1018.7, + 1019.2, + 1019.6, + 1019.8, + 1019.8, + 1019.6, + 1019.4, + 1019.1, + 1018.8, + 1018.9, + 1018.9, + 1018.9, + 1019.1, + 1019.6, + 1019.2, + 1018.8, + 1018.8, + 1018.1, + 1017.2, + 1016.2, + 1015.6, + 1015.1, + 1014.8, + 1014.9 + ], + "surface_pressure": [ + 1012.4, + 1012.9, + 1013.3, + 1013.5, + 1013.5, + 1013.2, + 1013.0, + 1012.7, + 1012.4, + 1012.5, + 1012.5, + 1012.5, + 1012.8, + 1013.3, + 1012.9, + 1012.6, + 1012.6, + 1011.9, + 1011.0, + 1010.0, + 1009.4, + 1008.9, + 1008.6, + 1008.7 + ], + "precipitation": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1, + 0.1, + 0.3, + 0.4, + 0.6, + 0.1, + 0.1, + 0.0, + 0.0 + ], + "rain": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1, + 0.1, + 0.3, + 0.4, + 0.6, + 0.1, + 0.1, + 0.0, + 0.0 + ], + "snowfall": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cloud_cover": [ + 99, + 99, + 98, + 100, + 98, + 100, + 97, + 99, + 98, + 99, + 92, + 6, + 5, + 11, + 39, + 65, + 30, + 31, + 53, + 60, + 20, + 28, + 15, + 11 + ], + "cloud_cover_low": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, + 39, + 64, + 30, + 29, + 28, + 39, + 11, + 15, + 12, + 0 + ], + "cloud_cover_mid": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 4, + 10, + 37, + 35, + 11, + 19, + 7, + 11 + ], + "cloud_cover_high": [ + 99, + 99, + 98, + 100, + 98, + 100, + 97, + 99, + 98, + 99, + 92, + 6, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "shortwave_radiation": [ + 121.0, + 11.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 63.0, + 224.0, + 394.0, + 553.0, + 664.0, + 388.0, + 821.0, + 771.0, + 670.0, + 638.0, + 455.0, + 379.0, + 261.0 + ], + "direct_radiation": [ + 73.0, + 3.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 31.0, + 155.0, + 292.0, + 419.0, + 480.0, + 52.0, + 598.0, + 558.0, + 438.0, + 465.0, + 287.0, + 237.0, + 166.0 + ], + "direct_normal_irradiance": [ + 386.8, + 35.6, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 223.5, + 519.1, + 607.6, + 648.2, + 611.7, + 58.7, + 633.5, + 585.0, + 478.5, + 559.5, + 406.0, + 430.2, + 443.9 + ], + "diffuse_radiation": [ + 48.0, + 8.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 32.0, + 69.0, + 102.0, + 134.0, + 184.0, + 336.0, + 223.0, + 213.0, + 232.0, + 173.0, + 168.0, + 142.0, + 95.0 + ], + "global_tilted_irradiance": [ + 121.0, + 11.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 63.0, + 224.0, + 394.0, + 553.0, + 664.0, + 388.0, + 821.0, + 771.0, + 670.0, + 638.0, + 455.0, + 379.0, + 261.0 + ], + "sunshine_duration": [ + 3600.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 2585.07, + 3600.0, + 3600.0, + 3600.0, + 3600.0, + 0.0, + 3600.0, + 3600.0, + 3600.0, + 3600.0, + 3600.0, + 3600.0, + 3600.0 + ], + "wind_speed_10m": [ + 10.8, + 10.9, + 11.4, + 9.5, + 9.1, + 9.1, + 8.9, + 8.5, + 8.1, + 8.3, + 7.3, + 6.5, + 4.7, + 4.8, + 11.0, + 10.3, + 9.5, + 11.5, + 12.9, + 12.5, + 11.7, + 13.4, + 15.2, + 13.5 + ], + "wind_speed_100m": [ + 23.0, + 23.5, + 25.4, + 22.0, + 21.3, + 20.7, + 20.5, + 20.5, + 19.6, + 19.8, + 18.9, + 14.7, + 13.5, + 7.3, + 14.9, + 13.9, + 12.9, + 15.2, + 17.5, + 16.8, + 16.1, + 18.7, + 21.9, + 20.7 + ], + "wind_direction_10m": [ + 133, + 147, + 157, + 179, + 189, + 195, + 198, + 205, + 219, + 219, + 216, + 231, + 198, + 202, + 194, + 178, + 171, + 158, + 148, + 143, + 149, + 143, + 137, + 136 + ], + "wind_direction_100m": [ + 137, + 148, + 162, + 184, + 193, + 198, + 198, + 203, + 212, + 215, + 214, + 220, + 205, + 203, + 195, + 179, + 172, + 159, + 148, + 142, + 148, + 145, + 141, + 139 + ], + "wind_gusts_10m": [ + 21.2, + 19.4, + 19.8, + 20.2, + 16.2, + 15.5, + 15.5, + 14.8, + 14.4, + 13.7, + 13.7, + 11.5, + 11.5, + 14.4, + 24.5, + 26.3, + 25.2, + 27.7, + 29.9, + 29.9, + 28.4, + 27.7, + 31.7, + 31.3 + ], + "et0_fao_evapotranspiration": [ + 0.13, + 0.06, + 0.04, + 0.03, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.02, + 0.04, + 0.13, + 0.26, + 0.38, + 0.47, + 0.31, + 0.6, + 0.57, + 0.5, + 0.48, + 0.37, + 0.32, + 0.22 + ], + "weather_code": [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 0, + 0, + 0, + 1, + 51, + 51, + 51, + 51, + 53, + 51, + 51, + 0, + 0 + ], + "snow_depth": [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None + ], + "vapour_pressure_deficit": [ + 1.39, + 0.92, + 0.84, + 0.74, + 0.64, + 0.57, + 0.53, + 0.52, + 0.47, + 0.42, + 0.37, + 0.44, + 0.62, + 0.8, + 1.07, + 1.22, + 1.28, + 1.68, + 1.62, + 1.54, + 1.56, + 1.59, + 1.44, + 1.22 + ], + "soil_temperature_0_to_7cm": [ + 26.8, + 25.8, + 24.9, + 24.1, + 23.3, + 22.7, + 22.1, + 21.6, + 21.1, + 20.7, + 20.3, + 20.4, + 21.3, + 22.9, + 24.3, + 25.7, + 26.2, + 27.5, + 28.3, + 28.7, + 29.0, + 28.9, + 28.7, + 28.2 + ], + "soil_temperature_7_to_28cm": [ + 24.3, + 24.4, + 24.4, + 24.4, + 24.3, + 24.2, + 24.1, + 24.0, + 23.8, + 23.6, + 23.5, + 23.3, + 23.1, + 23.1, + 23.1, + 23.2, + 23.3, + 23.4, + 23.6, + 23.8, + 24.0, + 24.2, + 24.4, + 24.5 + ], + "soil_temperature_28_to_100cm": [ + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6, + 21.6 + ], + "soil_temperature_100_to_255cm": [ + 14.3, + 14.3, + 14.3, + 14.3, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4, + 14.4 + ], + "soil_moisture_0_to_7cm": [ + 0.247, + 0.244, + 0.244, + 0.244, + 0.244, + 0.244, + 0.244, + 0.244, + 0.244, + 0.244, + 0.244, + 0.244, + 0.244, + 0.248, + 0.246, + 0.245, + 0.246, + 0.246, + 0.247, + 0.251, + 0.25, + 0.249, + 0.248, + 0.247 + ], + "soil_moisture_7_to_28cm": [ + 0.362, + 0.361, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.359, + 0.362, + 0.361, + 0.36, + 0.359, + 0.358, + 0.357, + 0.356, + 0.355, + 0.355, + 0.354, + 0.353 + ], + "soil_moisture_28_to_100cm": [ + 0.287, + 0.286, + 0.286, + 0.287, + 0.287, + 0.287, + 0.287, + 0.287, + 0.287, + 0.287, + 0.287, + 0.287, + 0.287, + 0.288, + 0.288, + 0.288, + 0.288, + 0.288, + 0.288, + 0.288, + 0.288, + 0.288, + 0.288, + 0.288 + ], + "soil_moisture_100_to_255cm": [ + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352, + 0.352 + ] + } +} \ No newline at end of file From 6747c731c613c15bbed70cc5fd58308251cd5ff8 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 10 Jul 2025 23:53:16 +0000 Subject: [PATCH 4/7] Adding moon and sun phases --- Pipfile | 1 + Pipfile.lock | 108 ++++++++++++++++++++++++++++++++++++- data/build_weather.py | 21 ++++++++ data/sql/build_db.sql | 1 - data/sql/prefill_parks.sql | 3 +- data/stats_importer.py | 25 ++++++--- main.py | 24 +++++---- 7 files changed, 161 insertions(+), 22 deletions(-) diff --git a/Pipfile b/Pipfile index b86d932..16094ce 100644 --- a/Pipfile +++ b/Pipfile @@ -4,6 +4,7 @@ verify_ssl = true name = "pypi" [packages] +ephem = "*" geopy = "*" matplotlib = "*" numpy = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 88e0dc9..ea0b32e 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "126729a6f98a1153aadb9df0008587107239cbb495b6d44f658c16a275f11a0a" + "sha256": "a3658f8ae490d77c34cccced0d4f5c75c0c32084ef390cd6abe8fbd885a09bba" }, "pipfile-spec": 6, "requires": { @@ -193,6 +193,112 @@ "markers": "python_version >= '3.8'", "version": "==0.12.1" }, + "ephem": { + "hashes": [ + "sha256:02189a7e9eaf70aa887a1e9cd38db1297c52cd6febd7226811d01c304d563ebf", + "sha256:0277e0022d7a9efd740e4014a66ac56fe79f35972f79d70e2d828b17cec3805f", + "sha256:0e0c517d9e586d9cdb6bd63d3b3ca3ef1b82809fa64f70c8f659856096e0d403", + "sha256:0fbf26f0c99d7ba100df584cd4899044e582af57bbe313aecfecefd6ab389753", + "sha256:10f561e488787b6fc9a689f1f926f51bb225bb91af18ed0b38e1c93ffa179d2e", + "sha256:129fda6db42abb6baf4e55e953969ad923995dcaadacfc7d652e5ad6103d7ebe", + "sha256:13349edb5263e81a38c07157a558b712948e0456e9dd02fc33d7bb2ebdb54bdb", + "sha256:1a99357c6e1a2394231718434ec77b0a09daaaf8308e852eb887c0f830e5eab4", + "sha256:1e9b3b809ccf6addf01e852b1bb0a0c872b92144a38efda13caef1c3de451808", + "sha256:1f924be0002e943e5a73b226aecdf43c94d3e557f85674c153e712b92f6df9b3", + "sha256:20c9545f19660fcc8a6546f944304749932da354d2e5bb268df324c8051b6e9b", + "sha256:245accecb7050f3f0e495dbd49f58b38e63d70d1af2a034ba40038daa968925f", + "sha256:2c9763d4c108de400226697e7256e496ef37f60490591c043038b8fbce7bde94", + "sha256:303a476a6242174231233bcfebb8c05ad46bcc07000ef90e7c84c0b5174c50d0", + "sha256:3069578b3dfe0de4182d95ba58843f2efc26145171ca2afb233ba70a6b4b8e9d", + "sha256:308bbf9cd4449661225ceb96b205037bdefe0c82b1579d8cacd93c4b98cfa939", + "sha256:323649d8fd4f34036b43a332c8457a9e711c91ac708e3d5238a379a704b53ffb", + "sha256:38a74e63cfb6fcee6b23ad183c6d02da0c0113ae7ad4f433422a15e401c3aa92", + "sha256:3c4fd64f453e8f40cf862420a70da95a71b6487ace75e8e0cf85d73707db6065", + "sha256:3d2e52724b315944b330e9cf5e2dd2a16d7d646a14a3f21a7368e95f6e1f30e8", + "sha256:3dbb30fde6ab28b2455ea2bea5b52a93941c920125b5f2977f70dd9cc69f8c51", + "sha256:3dcc4ead3446e9831c0acc8396d93ab281cfc37d68bc01413f65017750cef13a", + "sha256:3e776b20832067257525de0bb0fdca8b6aec8c3fc9e059cff5df9160f857c9c5", + "sha256:3f3e5ff58de24006928c7ea9ff0c70a01f510816b1d687591b0de5697ea014e5", + "sha256:40aa89b316bd2cb6a5a1ed0f391983272626582cdf14e5c92cfe8d167b4a32c0", + "sha256:41589191e9cea33a2c455fcd75cd8906433b88e2b0eaca0400c753272c007272", + "sha256:45bea1bb6fb1850f2d3169e541c22fb88030976967f8c551181786f5e713100e", + "sha256:4765768de1cb0af0e179f3860e6fa0163e8a7d23faf2fa61fe113eee3748fe02", + "sha256:4776dcfabc2a2346770901da1bae7917deae557b0adc7c3d5e5f7c6e3e4d4c9f", + "sha256:4b1c87517be414f67c3b35c6dbd8bd7c28d664e06d857b4a4224511bdb06ad2e", + "sha256:4f42e6c7330b852b3cb94dedea805345d259b1bc4f3a715640a0c651c221ef47", + "sha256:5152d5e84458a10f0dec83c6934839b5f2d4a9e642fb9f9ea53161923db58aba", + "sha256:5371eeb1cdf51d7cddbc615ca140764117ddbf8b14b8e5c4be112761a570393d", + "sha256:539339b435b7fb501c3ef3695e37cc39e280c7402e4ac28d829124928bb2a8ae", + "sha256:5670edeb6a531104ae594eb48d1595ac28a57cc41603f760ab45f2618b6bf100", + "sha256:599df915cd37dae047e4d885885afff23102d33a33f9900ae95c11195cbe83cb", + "sha256:5c787ef694db5e56151595ec237f960836e672a8770b41f09f9c65c26133291b", + "sha256:65c4b960b556b1db868de77ddc7ecc9a554dd103a9d59a07321ee45657c32b3f", + "sha256:67eeb1e05390fd6ff1ed25bc60379c717ec7c2313305cf85995f469a2ee66e0c", + "sha256:68976d765a78ff3c534e11c8b9f87e83b67cacd461e7074664fb8a0c0b9ab341", + "sha256:6d3a4b72e8dc3fe36680c3f150f0f98c9df3a97e85df1c37781a0c475c1f667a", + "sha256:6e29cc55b647e07f992e7f360b7b44bb6e1ec41d503eab923054e7b6f08caa1a", + "sha256:6f72e5136105006e0eb3360a8f41c7551062d07d055fa7f48551985541b6ab74", + "sha256:6ff641a038b883c572d6ce0f642f54c0e42d568f2827e15cb7c2f78cb8e72ec6", + "sha256:729d9d42a9dcc7f80ab4a12f2cb40b2908c66a13708d6f0792bfebf55b62169f", + "sha256:74673ea73bda79b81b21a9326798f6cc32d22c0845cffb05eca5dec5c50b3a89", + "sha256:7933731d614fdb05c67a64d1e27999cd680994da3c75f1aff85a9eef11ea80d1", + "sha256:797fb2a6ecef2866f7a2d57f897dfb9f34bea60462950b94a22935272f4d7e5c", + "sha256:7b3ac07c8e09d185ff35d68dcbdde948fe9ffb5eb3b67661a5e237391145b0f6", + "sha256:813b50b2cd2172f59df4f71792e0e16702581b0b13c64bd995b29f1121d604df", + "sha256:81d20d83d5bd6ab18dcbe1b477bc3cd71c690011284d1075d08101040f2de66e", + "sha256:94cad00341ed5367144f3dfec98b6a33f285b5eb5c35971f697f8cac14f12a00", + "sha256:953292ca2e5610f472532597b14ff6c91086a0821cfe443580a6b4e27a4ed7a7", + "sha256:9592cfa54519b79fc3ab25efeee1fb4330ae8ba33d6cec24ca57ccf8abcb9983", + "sha256:97164eeeeb1da0d2ba5b72ef62e7fcde121f2b0e140774c5e5b93d902994e119", + "sha256:98b7ac952cfcefc39883684ef4d39a5d81dfa925ea9a7c720713feb665819601", + "sha256:99b6d7c75505f2ca3e470fea659dabe806c947f21d57093af5c97bb9310851e4", + "sha256:9a4e8b69803bff40ba56bb60d08e3e20c23f50bf2076cc8b8df371c92ab4418c", + "sha256:9da22f8b6fe666cc77f69ca74959463007fc0c8e913026b225658bcd91e9d358", + "sha256:9e0ca372021345efccb91845cdfe6c6e51a44067adb8f3d2629f4ab49c2cc8b0", + "sha256:9ebfbc111ff91d183d7c58612ad4f5f6c7d7e95d9ac7b5a5451714713b334f81", + "sha256:9f72002f2f6dd8ad838fcbe7b4e9bdf8daadfe3e7093383336a234da458c77a5", + "sha256:a0490e6755bde5c80787ab4937a1f1d2832ea5e6e1b624b53d5e2852b7d4c303", + "sha256:a0ab0091cb4dbe7f9a163a11d16fae63e3d2b51c9b7f0557ce5a721c95a6b4f4", + "sha256:a6f3354a5a2e78f435bd1a70bb2c245fef31591547ec5d3d95e85038e3ea0edd", + "sha256:a7aa551ea1a6ae2ee58ab31571be1caf5647c31f97588ef2a09ac8e991f9c133", + "sha256:af2a25550171fcdab9a62f1395c5e203f16796326409282d5e6e1222f4d62e0f", + "sha256:b023c79e5d8dd17124f68fcfd8756d6ec236002545769069c12479376c721d70", + "sha256:b39fb90633da4dfef95829f57c5eab4271e8284efdcdc0d00dfb8db9dee6ad78", + "sha256:b535eb78c84779531868a96cc45db1b9d98fd0258bc1994dc4ae63902841d466", + "sha256:b5ebe25f33f43cd3ae92b70a43ad558775513bddcac706474110045795b356a1", + "sha256:b767edad8324d76f8a713a4c48d9998012706455d9f1407c4d41602ff2938fce", + "sha256:bc9107ff5b290edc560898c0dcdf11c260547fd6fd0a1f65936954a92498eef9", + "sha256:bd7f93743ef79a88115d5106620827a108ca2afd83baae71d056f2f90ebb4e94", + "sha256:bd836343c6d3b0a7658a8f7d1df2937f398f4b8465a6a77b47e6fa84edd574ae", + "sha256:c34abfcbc5d33106bbc9128299e05e20f97b81f25dbf19824cf7634d2023c4ec", + "sha256:c7dcd7425cc82945b0d6cb31a0897aeae835d5e68082243e210b59036950b61e", + "sha256:cbd5f01a5a6fd687ce283ccb02d30a831ef4a88e8e8e35019d436be9c58faae9", + "sha256:cce2e0cddd3f04f0d9a5799f948cd4ad7345157819df4e7aea3d4ab24911c07b", + "sha256:d617510363d1d80d50cc601b477e4e817b83de311fea932d85bb9d87913b577a", + "sha256:d978cf7398ecc0a7e4b09c6539e5f066dc0c60efa3dfe53ab2d5ad88610f62fa", + "sha256:db6ba8a8940b0d13495e020e68092323fc7ac22cff00f5398fe1c9d4445e8fc1", + "sha256:dbad1ea774465e6cb95601dc8d8c95dd66708e08de5122f8b98e9a2e472f3b8f", + "sha256:dc2f11f7b16901cdfcd68f3fbf83ea513f3fa1368dfb456fa8e880cc70c64bb8", + "sha256:e0e771e10ffe1acaf32d2925287ff19c4b2ad8f411e32f874a7830d4043211e0", + "sha256:e2f542499995177ce675cbd32349962248cb34a4eee7caba41abfcae1655941c", + "sha256:e467a8c84295e9c3cfb5588b2d33d4649ea75c49caa0e3664dcc4f356f199704", + "sha256:e520611383389b9da89c75ea414adeead142f3acf73d662cfa2d9c09dcce6e26", + "sha256:e6db15e4169f8a73827ab0eb3a5722bb9679781375384cdea5809cf325e13b14", + "sha256:e6eb387020bccd43bf69f4f62f7f9dc154ed12947f10e8ced99ce17115426884", + "sha256:e793840ab6e899c79e09b075b1bfe21f0ff7ce9c11d9d493cee6b2c30c622008", + "sha256:e9083fe4144478a43fbba07169957b6eb3797fd97955145dd614eaa0a934ad79", + "sha256:ea8d23e7d452537fbbe1da12891ccaea5bf890a0ae35007d6c773842ad08ec16", + "sha256:f04201c4ff62ad0b1ddf1a3af9bc49e652eeaff2299a3030f68af2de2e27ec02", + "sha256:f1c232b35229130dd800c8c0dfa5d8aa6d563ced63a438d1ea0ca145e505842a", + "sha256:f20917fc08b96735e9e244219f8b211eeaacff1082406e82bf855669a92c3233", + "sha256:f409c4adb0160689a3297b83bfddf4893942eb8a6a6bf31f034d9ed8ebcd6112", + "sha256:f5f7428004626a36dc76164fe3c5b12a567b198afc3327f7d6721f87b4f73792", + "sha256:faf33b2b03e3b6cecff25b6cdb6fd3295908a8cea29b614beda5e36dc6f978a6", + "sha256:fea3ff1fb12241f12a5d4e7f303e43ac5ab467903c98f0b90539ea9cbe0cab4d" + ], + "index": "pypi", + "version": "==4.2" + }, "fonttools": { "hashes": [ "sha256:0162a6a37b0ca70d8505311d541e291cd6cab54d1a986ae3d2686c56c0581e8f", diff --git a/data/build_weather.py b/data/build_weather.py index b1882f3..61e4f72 100644 --- a/data/build_weather.py +++ b/data/build_weather.py @@ -1,8 +1,29 @@ import pytz +import ephem import requests import datetime from geopy.geocoders import Nominatim +def get_sun_and_moon_phase(lat, long, date_str): + date_str = f"{date_str[:4]}/{date_str[4:6]}/{date_str[6:8]}" + + observer = ephem.Observer() + observer.lat = str(lat) + observer.lon = str(long) + observer.date = date_str + + sun = ephem.Sun() + sun.compute(observer) + + sunrise_time = int(observer.next_rising(sun).datetime().strftime('%Y%m%d')) + sunset_time = int(observer.next_setting(sun).datetime().strftime('%Y%m%d')) + + date = ephem.Date(date_str) + moon = ephem.Moon() + moon.compute(date) + + return (sunrise_time, sunset_time, moon.phase) + def get_timezone(latitude: float, longitude: float): geolocator = Nominatim() location = geolocator.reverse(f"{latitude}, {longitude}") diff --git a/data/sql/build_db.sql b/data/sql/build_db.sql index cec0119..5eaa057 100644 --- a/data/sql/build_db.sql +++ b/data/sql/build_db.sql @@ -143,7 +143,6 @@ CREATE TABLE IF NOT EXISTS weather ( dew_point FLOAT, apparent_temperature FLOAT, air_pressure FLOAT, - wind_speed FLOAT, precipitation FLOAT, rain FLOAT, snowfall FLOAT, diff --git a/data/sql/prefill_parks.sql b/data/sql/prefill_parks.sql index f595702..b02868e 100644 --- a/data/sql/prefill_parks.sql +++ b/data/sql/prefill_parks.sql @@ -19,12 +19,13 @@ INSERT OR IGNORE INTO parks ("MIN04", "Target Field", 339, 8, 404, 8, 328, 23, 0, 44.981667, -93.278333, 827), ("NYC20", "Citi Field", 335, 8, 408, 8, 330, 8, 0, 40.756944, -73.845833, 13), ("NYC21", "Yankee Stadium II", 318, 8, 408, 8, 314, 8, 0, 40.829167, -73.926389, 23), + ("OAK01", "Oakland-Alameda County Coliseum", 330, 8, 400, 8, 330, 8, 0, 37.751667, -122.200556, -16), ("PHI13", "Citizens Bank Park", 329, 10, 401, 6, 330, 13, 0, 39.905833, -75.166389, 0), ("PHO01", "Chase Field", 330, 7.6, 407, 25, 335, 7.6, 1, 33.445526, -112.066664, 1060.36), ("PIT08", "PNC Park", 325, 6, 399, 15, 320, 21, 0, 40.446944, -80.005833, 725), - ("OAK01", "Oakland-Alameda County Coliseum", 330, 8, 400, 8, 330, 8, 0, 37.751667, -122.200556, -16), ("SAN02", "Petco Park", 334, 4, 369, 4, 322, 5, 0, 32.7073, -117.1566, 16), ("SEA03", "T-Mobile Park", 331, 15, 401, 7, 326, 7, 1, 47.591, -122.333, 16), + ("SEO01", "Gocheok Sky Dome", 325, 12, 400, 12, 325, 12, 1, 37.498222, 126.86725, 40), ("SFO03", "Oracle Park", 339, 8, 399, 8, 309, 25, 0, 37.778611, -122.389167, 13), ("STL10", "Busch Stadium III", 336, 8, 400, 8, 335, 8, 0, 38.6225, -90.193056, 440), ("STP01", "Tropicana Field", 315, 11, 404, 9, 322, 11, 1, 27.768333, -82.653333, 39), diff --git a/data/stats_importer.py b/data/stats_importer.py index eec998f..a0cba98 100644 --- a/data/stats_importer.py +++ b/data/stats_importer.py @@ -2,7 +2,7 @@ import os import csv import shutil from data.db_connect import Database -from data.build_weather import get_weather +from data.build_weather import get_weather, get_sun_and_moon_phase class Importer: def __init__(self, database: Database): @@ -191,8 +191,11 @@ class Importer: self.database.insert(insert_team_game, visiting_team_data) self.database.insert(insert_team_game, home_team_data) + parkid = game_stats["park-id"] + print(f"SELECT latitude, longitude FROM parks WHERE park_id = {parkid}") park_data = self.database.select("SELECT latitude, longitude FROM parks WHERE park_id = ?", (game_stats["park-id"],)) - + print(f"latlon {park_data}") + hour = 15 if game_stats["day-night"] == "D" else 19 historic_weather = get_weather(park_data[0], park_data[1], game_stats["date"], hour) historic_weather = historic_weather["hourly"] @@ -202,10 +205,10 @@ class Importer: ( game_id, temperature, humidity, dew_point, apparent_temperature, air_pressure, - wind_speed, precipitation, rain, - snowfall, cloud_cover, wind_speed, - wind_direction, wind_gusts, sun_rise, - sin_set, moon_phase + precipitation, rain, snowfall, + cloud_cover, wind_speed, wind_direction, + wind_gusts, sun_rise, sun_set, + moon_phase ) VALUES ( @@ -214,11 +217,17 @@ class Importer: ?, ?, ?, ?, ?, ?, ?, ?, ?, - ?, ? + ?, ) """ + (sunrise_time, sunset_time, moonphase) = get_sun_and_moon_phase(park_data[0], park_data[1], game_stats["date"]) + weather_data = [ game_id, historic_weather["temperature_2m"][hour], historic_weather["relative_humidity_2m"][hour], - + historic_weather["dew_point_2m"][hour], historic_weather["apparent_temperature"][hour], historic_weather["pressure_msl"][hour], + historic_weather["precipitation"][hour], historic_weather["rain"][hour], historic_weather["snowfall"][hour], + historic_weather["cloud_cover"][hour], historic_weather["wind_speed_10m"][hour], historic_weather["wind_direction_10m"][hour], + historic_weather["wind_gusts_10m"][hour], sunrise_time, sunset_time, + moonphase, ] diff --git a/main.py b/main.py index 84776f4..169fd2c 100644 --- a/main.py +++ b/main.py @@ -2,7 +2,7 @@ import numpy as np # helps with the math import matplotlib.pyplot as plt # to plot error during training from data.db_connect import Database from data.stats_importer import Importer -from data.build_weather import get_weather +from data.build_weather import get_weather, get_sun_and_moon_phase # input data inputs = np.array([[0, 0, 1, 0], @@ -59,25 +59,27 @@ class NeuralNetwork: return prediction if __name__ == '__main__': - #build_db_path = "./data/sql/build_db.sql" - #fill_parks_path = "./data/sql/prefill_parks.sql" - #fill_teams_path = "./data/sql/prefill_teams.sql" + build_db_path = "./data/sql/build_db.sql" + fill_parks_path = "./data/sql/prefill_parks.sql" + fill_teams_path = "./data/sql/prefill_teams.sql" db_file = "./database/baseball.db" db_conn = Database(db_file) - #db_conn.run_sql_file(build_db_path) - #db_conn.run_sql_file(fill_parks_path) - #db_conn.run_sql_file(fill_teams_path) + db_conn.run_sql_file(build_db_path) + db_conn.run_sql_file(fill_parks_path) + db_conn.run_sql_file(fill_teams_path) - #imp = Importer(db_conn) - #imp.parse_all_data("./data/stats/to_import", "./data/stats/imported/") + imp = Importer(db_conn) + imp.parse_all_data("./data/stats/to_import", "./data/stats/imported/") #we = Weather() #print(we.get_weather(39.26733000, -76.79831000, "20250706", 12)) - park_data = db_conn.select("SELECT latitude, longitude FROM parks WHERE park_id = ? OR park_id = ?", ("ATL03","KAN06",)) - print(park_data[0]) + #park_data = db_conn.select("SELECT latitude, longitude FROM parks WHERE park_id = ?", ("ATL03",)) + #print(get_sun_and_moon_phase(park_data[0], park_data[1], "20250709")) + #historic_weather = get_weather(park_data[0], park_data[1], game_stats["date"], hour) + else: # create neural network From bdaa432ab723cd199223b9e182c234e3183cb6c2 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 11 Jul 2025 21:09:17 +0000 Subject: [PATCH 5/7] Fixing issues with stadiums --- Pipfile | 3 +- Pipfile.lock | 169 ++++++++++++++++++++++++++++++++----- data/build_weather.py | 14 +-- data/sql/prefill_parks.sql | 7 +- data/stats_importer.py | 16 ++-- 5 files changed, 168 insertions(+), 41 deletions(-) diff --git a/Pipfile b/Pipfile index 16094ce..7b32c51 100644 --- a/Pipfile +++ b/Pipfile @@ -5,11 +5,10 @@ name = "pypi" [packages] ephem = "*" -geopy = "*" matplotlib = "*" numpy = "*" -pytz = "*" requests = "*" +timezonefinder = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index ea0b32e..a58333d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a3658f8ae490d77c34cccced0d4f5c75c0c32084ef390cd6abe8fbd885a09bba" + "sha256": "0763149251463ba577d24ee5a2399615cd74ddb51f0d7d75bbd777d9b499164f" }, "pipfile-spec": 6, "requires": { @@ -24,6 +24,79 @@ "markers": "python_version >= '3.7'", "version": "==2025.7.9" }, + "cffi": { + "hashes": [ + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" + ], + "markers": "python_version >= '3.8'", + "version": "==1.17.1" + }, "charset-normalizer": { "hashes": [ "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", @@ -347,21 +420,48 @@ "markers": "python_version >= '3.9'", "version": "==4.58.5" }, - "geographiclib": { + "h3": { "hashes": [ - "sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734", - "sha256:f7f41c85dc3e1c2d3d935ec86660dc3b2c848c83e17f9a9e51ba9d5146a15859" + "sha256:019f47d5d3bd174b1714ba4c2560783c2a81be98b6a37b130a52e6f00c2aea37", + "sha256:02df69a61c59d06b8516c85d9cf4f6bb2efc8e8b526000ac46b16328540d0952", + "sha256:0963d760b9b067cffbebab3c8514214bdbc18eb66c6292092ca6439fbed25b2b", + "sha256:0f6b8432a104dacf21a2a06bb5dd60e2b63375b544d4964d7e4980543d8285da", + "sha256:15bf255188d5fdd4b33cd24ed3952fbf8161575a42dcba2730a4530ef0f057fa", + "sha256:1e5d2180c1391db507473a6877c2df036de396d88212e90d7d0f6c73b33901d3", + "sha256:1fe4c11a1b512ef64cc155c84977fa41bdc8f059d0db3c411da854805b08ad59", + "sha256:23ee690ab45f95997fa20674937eb2d49018395c272ad63373d0f2cc31925094", + "sha256:24ad4e247388bb7f5afece4fb5f901b1168c4b2f0417b3459bae5c4939939327", + "sha256:2edcae634d23535827e16bf16282646eacacd911f1735aacee381ff717d8a5e9", + "sha256:309bed3271bb7dc5ed32b073dd0a3fda56f4985cf7c4ec2b33d0621ce4357e16", + "sha256:56862fa893903b966840a4aff27e19be2ee62b80e7e67d93dbd805ab719195bc", + "sha256:6409d7d9c7c3a888359c5012aa7eedfe909da230e0f109d6a80ab973c0a2bf73", + "sha256:67c3a8d883b7b233b30a372f85434f48cba3b42b926598a835a73512a0a3d958", + "sha256:67c82019afb5b0b214f50502a141bdb4e9b72dfffe5ed63fdd7630119edee123", + "sha256:689cb238becb5f5af3631934e54cb8c7782c60af8fa9daf7e2cd972235b88c6a", + "sha256:69ceab01438558ab2b5a90a2a30cf9e1627a4a8b6923ad8ec51a9e2dfa2ad0e8", + "sha256:69dc186712c6adeb500b1aaec875493c742fbddb7b9b40d02016769a991732d1", + "sha256:6adba5b249792d8f01abd9e410439a2912a4e900073cfcc2d32297f2ec803db0", + "sha256:6f22ce0f63b1bae098e7258321d51ea268b4cb9f8b4db0be68042b5158e1433b", + "sha256:7de13e47ea3e3a3fc06c50def371050227ecfb1ccf0c8923c2b8bd8acba27355", + "sha256:7f870c0c90fd6657b51d8b1501142e9bee0787437be9486251a0e86e2d1513c1", + "sha256:81ce3b1caeb510618332853a75d6aba5a259f4cf03f9e681c726063915b90d14", + "sha256:902e92c06bb2c08a6a551d5ca6a69a5deae2a9802263ae54455a803c3fb1766c", + "sha256:a647d9635633ca243d8c24c990a9e37e3b294781fd6a47a0f5dfe9a1dec0dd13", + "sha256:a9c18bec33c300485452f3ed46a5165d27b186cfb15ee36fb7252228483c84b9", + "sha256:b75f40700466cf5ac82509cccb3c66404b586ee9ddf97168f4550e02504edfa1", + "sha256:b9d35dfa97e7f4b4c9c9f1564f22a44565694ac1ca96469a08170869e7d0ce0a", + "sha256:c61761f524d7b42872f085dfcafc6466b7ff2ef0fc4c4626b336448e8fffca3a", + "sha256:c961be621a7a14a6fcc2a71c5c4e6b4cf0865781d29e000048a4a5ceb8734ff2", + "sha256:d45005bb56a9d70ab420bda6096c579e4246038f8b0553394b2b82aa474f2d1c", + "sha256:dbaa311260ed1497f6ff97ec8c582fcfb8fbfd90a4156d3d4831d964f0431702", + "sha256:e42d6efec68363943dd062e228f2d77b288041870679ffd08eb37813e9694c96", + "sha256:e46ac17a7dc520ba7e5b5698bf39f3123e68e2c834398711a93a42ab3ec46d60", + "sha256:e8a7d63ee5213f43dea80b79821fa7e07d9377260bc352201cac5c954017ea99", + "sha256:ee2d2ab17c10172b265876b4655094c530251cae24f03cf0d2f339aca5ee603f", + "sha256:f5d19bdb1d592fa01aaeb6a469050c621eea6d82ffb99f095b5502f483151b70" ], - "markers": "python_version >= '3.7'", - "version": "==2.0" - }, - "geopy": { - "hashes": [ - "sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1", - "sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7" - ], - "index": "pypi", - "version": "==2.4.1" + "markers": "python_version >= '3.8'", + "version": "==4.3.0" }, "idna": { "hashes": [ @@ -674,6 +774,14 @@ "markers": "python_version >= '3.9'", "version": "==11.3.0" }, + "pycparser": { + "hashes": [ + "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" + ], + "markers": "python_version >= '3.8'", + "version": "==2.22" + }, "pyparsing": { "hashes": [ "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", @@ -690,14 +798,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, - "pytz": { - "hashes": [ - "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", - "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" - ], - "index": "pypi", - "version": "==2025.2" - }, "requests": { "hashes": [ "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", @@ -714,6 +814,31 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, + "timezonefinder": { + "hashes": [ + "sha256:0d84c792a499fd098a35c701c3e3293423ba8d45c81b3eecd7c7cb72c7f1f415", + "sha256:23465a74af9fdb17c139c40e1dd3a46db284befb822fc454a03ad9516f0c502a", + "sha256:2e402d54b6442c5203e0dfb3c6d1b4c96371d4e71ca86c99a35589ca0c90f5db", + "sha256:39578e7225e5c272b30bf86a25c697d8ebf4df443534b2523c707deefebc6277", + "sha256:3e9a0caf638f43b6dd9980731d1424500c7a6a5048db808aad7032560df5c663", + "sha256:4f36877ad3a988f329cbd3f04f7cadc56dce073ad4a7bda7397f46ac2a61f9a4", + "sha256:4fa18e4b3f3ac1469bc50031700bc9696477cbf40953bdcbdec7bef20f3200d0", + "sha256:52d5a4a8fc96990f72d9d3d48297e789217f67689d3178c9ff8ea3ab57125e3b", + "sha256:643535f76436b13216ed1c3b69c6ed8f793253810916ca6bef3b8e0cf3084fef", + "sha256:7a84ad5afb02ca1b536481cee05a8f2d5d7dd4818f73cd780acd03aa3cc033c9", + "sha256:9039919be603809b98f3d2b6a4ed33110ac7cc6bbd507959531401c91f3469fb", + "sha256:9ee6ad1719ae5769f5218facf5ceb25cc16a188e4b1a7baa2c7baf53cfd8568a", + "sha256:a7d1f30b550c24598459643285ef0f5469524ad7a32dd854199e7a2a463600ff", + "sha256:bfb175d470e6f6abbeb13bd3a638bb1a0aa4124e1a93d040e5d933cf69076c60", + "sha256:c1ed4828b27b38ec454b0d82458fd35f7a7039f9a640afce51338c1c91a56a27", + "sha256:c5347c4a73b40af4867a2946a5172ec68b644e7036888b9b5a0e568499bfc0f3", + "sha256:cfc9cc75a39b7997c1e616481d559831e3e4a1c0cde66f20c9168ab3d45e0fa6", + "sha256:f34df7e66a7c82212191909f0461027d6b584d57a9c549b7f31a2687620b8fcf", + "sha256:f7af80ceac094932c07750d384539f6c4397c7b1bcbbb51dc9d5a90a65ad1df4" + ], + "index": "pypi", + "version": "==6.5.9" + }, "urllib3": { "hashes": [ "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", diff --git a/data/build_weather.py b/data/build_weather.py index 61e4f72..a3639c8 100644 --- a/data/build_weather.py +++ b/data/build_weather.py @@ -1,8 +1,7 @@ -import pytz import ephem import requests import datetime -from geopy.geocoders import Nominatim +from timezonefinder import TimezoneFinder def get_sun_and_moon_phase(lat, long, date_str): date_str = f"{date_str[:4]}/{date_str[4:6]}/{date_str[6:8]}" @@ -25,14 +24,9 @@ def get_sun_and_moon_phase(lat, long, date_str): return (sunrise_time, sunset_time, moon.phase) def get_timezone(latitude: float, longitude: float): - geolocator = Nominatim() - location = geolocator.reverse(f"{latitude}, {longitude}") - - if location: - for tag in location.raw['address']: - if 'timezone' in tag: - tz_name = tag.split('=')[1] - return pytz.timezone(tz_name) + obj = TimezoneFinder() + timezone_str = obj.timezone_at(lng=longitude, lat=latitude) + return timezone_str def get_weather(latitude: float, longitude: float, date_str: str, hour: int) -> dict: """ diff --git a/data/sql/prefill_parks.sql b/data/sql/prefill_parks.sql index b02868e..30c1db0 100644 --- a/data/sql/prefill_parks.sql +++ b/data/sql/prefill_parks.sql @@ -4,7 +4,9 @@ INSERT OR IGNORE INTO parks ("ARL03", "Globe Life Field in Arlington", 332, 14, 400, 8, 325, 8, 1, 32.747361, -97.084167, 568), ("ATL03", "Truist Park", 335, 11, 400, 12, 330, 15, 0, 33.89, -84.468, 951), ("BAL12", "Oriole Park at Camden Yards", 333, 7, 400, 7, 318, 21, 0, 39.283889, -76.621667, 36), + ("BIR01", "Rickwood Field", 325, 8, 400, 8, 332, 8, 0, 33.502222, -86.855833, 551), ("BOS07", "Fenway Park", 310, 37, 390, 15, 302, 3, 0, 42.34625, -71.09775, 16), + ("CHI11", "Weeghman Park; Cubs Park", 355, 11, 400, 11, 353, 11, 0, 41.948056, -87.655556, 594), ("CHI12", "Guaranteed Rate Field", 330, 8, 400, 8, 335, 8, 0, 41.83, -87.633889, 594), ("CIN09", "Great American Ballpark", 328, 12, 404, 8, 325, 12, 0, 39.0975, -84.506667, 489), ("CLE08", "Progressive Field", 325, 19, 410, 9, 325, 9, 0, 41.495833, -81.685278, 653), @@ -12,8 +14,10 @@ INSERT OR IGNORE INTO parks ("DET05", "Comerica Park", 345, 7, 420, 9, 330, 8, 0, 42.339169, -83.048607, 577), ("HOU03", "Minute Maid Park", 315, 21, 436, 10, 326, 7, 1, 29.756944, -95.355556, 20), ("KAN06", "Kauffman Stadium", 330, 9, 410, 9, 330, 9, 0, 39.051389, -94.480556, 856), + ("LON01", "London Stadium", 330, 16, 392, 16, 330, 16, 1, 51.538611, -0.016389, 24), ("LOS02", "Wrigley Field", 355, 15, 400, 11.5, 353, 15, 0, 41.948056, -87.655556, 600), ("LOS03", "Dodger Stadium", 330, 8, 395, 8, 330, 8, 0, 34.073611, -118.24, 515), + ("MEX02", "Estadio Alfredo Harp Helu", 332, 10, 410, 10, 332, 10, 0, 19.404, -99.0855, 7316), ("MIA02", "Marlins Park", 344, 9, 407, 12, 335, 9, 1, 25.778056, -80.219722, 7), ("MIL06", "Miller Park", 344, 8, 400, 8, 345, 8, 1, 43.028333, -87.971111, 617), ("MIN04", "Target Field", 339, 8, 404, 8, 328, 23, 0, 44.981667, -93.278333, 827), @@ -30,4 +34,5 @@ INSERT OR IGNORE INTO parks ("STL10", "Busch Stadium III", 336, 8, 400, 8, 335, 8, 0, 38.6225, -90.193056, 440), ("STP01", "Tropicana Field", 315, 11, 404, 9, 322, 11, 1, 27.768333, -82.653333, 39), ("TOR02", "Rogers Centre", 328, 8, 400, 8, 328, 8, 1, 43.641389, -79.389167, 282), - ("WAS11", "Nationals Park", 336, 8, 402, 12, 335, 10, 0, 38.872778, -77.0075, 7) + ("WAS11", "Nationals Park", 336, 8, 402, 12, 335, 10, 0, 38.872778, -77.0075, 7), + ("WIL02", "BB&T Ballpark at Bowman Field", 323, 8, 411, 8, 331, 8, 0, 41.242347, -77.047067, 521) diff --git a/data/stats_importer.py b/data/stats_importer.py index a0cba98..339fa99 100644 --- a/data/stats_importer.py +++ b/data/stats_importer.py @@ -47,6 +47,13 @@ class Importer: self.populate_database_with_stats(game) def populate_database_with_stats(self, game_stats): + parkid = game_stats["park-id"] + park_data = self.database.select("SELECT latitude, longitude FROM parks WHERE park_id = ?", (game_stats["park-id"],)) + + if park_data is None: + print(f"{parkid} is None") + return + insert_game = """ INSERT INTO games ( @@ -191,11 +198,6 @@ class Importer: self.database.insert(insert_team_game, visiting_team_data) self.database.insert(insert_team_game, home_team_data) - parkid = game_stats["park-id"] - print(f"SELECT latitude, longitude FROM parks WHERE park_id = {parkid}") - park_data = self.database.select("SELECT latitude, longitude FROM parks WHERE park_id = ?", (game_stats["park-id"],)) - print(f"latlon {park_data}") - hour = 15 if game_stats["day-night"] == "D" else 19 historic_weather = get_weather(park_data[0], park_data[1], game_stats["date"], hour) historic_weather = historic_weather["hourly"] @@ -217,7 +219,7 @@ class Importer: ?, ?, ?, ?, ?, ?, ?, ?, ?, - ?, + ? ) """ @@ -231,3 +233,5 @@ class Importer: historic_weather["wind_gusts_10m"][hour], sunrise_time, sunset_time, moonphase, ] + + self.database.insert(insert_into_weather, weather_data) From f59ae02734d7b149ed8e84b140a203cc511ca780 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 8 Aug 2025 19:17:44 +0000 Subject: [PATCH 6/7] Updating file parsing --- data/stats_importer.py | 109 +++++++++++++++++++++++------------------ main.py | 56 ++------------------- 2 files changed, 64 insertions(+), 101 deletions(-) diff --git a/data/stats_importer.py b/data/stats_importer.py index 339fa99..e68d626 100644 --- a/data/stats_importer.py +++ b/data/stats_importer.py @@ -29,13 +29,12 @@ class Importer: src_file = os.path.join(source_dir, filename) dest_file = os.path.join(dest_dir, filename) - self.parse_one_file(f"{source_dir}/{filename}") - - try: - shutil.copy(src_file, dest_file) - print(f"Copied {filename} to {dest_dir}") - except Exception as e: - print(f"Failed to copy {filename}: {e}") + if self.parse_one_file(f"{source_dir}/{filename}"): + try: + shutil.copy(src_file, dest_file) + print(f"Copied {filename} to {dest_dir}") + except Exception as e: + print(f"Failed to copy {filename}: {e}") def parse_one_file(self, filepath): bb_dict = {} @@ -44,15 +43,18 @@ class Importer: bb_dict = list(reader) for game in bb_dict: - self.populate_database_with_stats(game) + if not self.populate_database_with_stats(game): + return False + + return True - def populate_database_with_stats(self, game_stats): + def populate_database_with_stats(self, game_stats) -> bool: parkid = game_stats["park-id"] park_data = self.database.select("SELECT latitude, longitude FROM parks WHERE park_id = ?", (game_stats["park-id"],)) if park_data is None: print(f"{parkid} is None") - return + return True insert_game = """ INSERT INTO games @@ -79,19 +81,6 @@ class Importer: ) """ - game_data = [ - game_stats["date"], game_stats["num-of-game"], game_stats["day-of-week"], - game_stats["length-in-outs"], game_stats["day-night"], game_stats["completion-info"], - game_stats["forfeit"], game_stats["protest"], game_stats["park-id"], - game_stats["attendance"], game_stats["length-in-min"], game_stats["home-plate-ump-id"], - game_stats["home-plate-ump-name"], game_stats["1b-plate-ump-id"], game_stats["1b-plate-ump-name"], - game_stats["2b-plate-ump-id"], game_stats["2b-plate-ump-name"], game_stats["3b-plate-ump-id"], - game_stats["3b-plate-ump-name"], game_stats["lf-plate-ump-id"], game_stats["lf-plate-ump-name"], - game_stats["rf-plate-ump-id"], game_stats["rf-plate-ump-name"], - ] - - game_id = self.database.insert(insert_game, game_data) - insert_team_game = """ INSERT INTO team_game ( @@ -145,6 +134,53 @@ class Importer: ) """ + insert_into_weather = """ + INSERT INTO weather + ( + game_id, temperature, humidity, + dew_point, apparent_temperature, air_pressure, + precipitation, rain, snowfall, + cloud_cover, wind_speed, wind_direction, + wind_gusts, sun_rise, sun_set, + moon_phase + ) + VALUES + ( + ?, ?, ?, + ?, ?, ?, + ?, ?, ?, + ?, ?, ?, + ?, ?, ?, + ? + ) + """ + + hour = 15 if game_stats["day-night"] == "D" else 19 + historic_weather = get_weather(park_data[0], park_data[1], game_stats["date"], hour) + + if "error" in historic_weather: + print(f"Error: {historic_weather['error']}: Details: {historic_weather['details']}") + return False + + if "hourly" not in historic_weather: + print(f"Failed to get weather: Full JSON: {historic_weather}") + return False + + historic_weather = historic_weather["hourly"] + + game_data = [ + game_stats["date"], game_stats["num-of-game"], game_stats["day-of-week"], + game_stats["length-in-outs"], game_stats["day-night"], game_stats["completion-info"], + game_stats["forfeit"], game_stats["protest"], game_stats["park-id"], + game_stats["attendance"], game_stats["length-in-min"], game_stats["home-plate-ump-id"], + game_stats["home-plate-ump-name"], game_stats["1b-plate-ump-id"], game_stats["1b-plate-ump-name"], + game_stats["2b-plate-ump-id"], game_stats["2b-plate-ump-name"], game_stats["3b-plate-ump-id"], + game_stats["3b-plate-ump-name"], game_stats["lf-plate-ump-id"], game_stats["lf-plate-ump-name"], + game_stats["rf-plate-ump-id"], game_stats["rf-plate-ump-name"], + ] + + game_id = self.database.insert(insert_game, game_data) + visiting_team_data = [ game_id, game_stats["visiting-team"], game_stats["visiting-game-num"], game_stats["visiting-score"], game_stats["visiting-line-scores"], game_stats["visiting-at-bats"], @@ -198,31 +234,6 @@ class Importer: self.database.insert(insert_team_game, visiting_team_data) self.database.insert(insert_team_game, home_team_data) - hour = 15 if game_stats["day-night"] == "D" else 19 - historic_weather = get_weather(park_data[0], park_data[1], game_stats["date"], hour) - historic_weather = historic_weather["hourly"] - - insert_into_weather = """ - INSERT INTO weather - ( - game_id, temperature, humidity, - dew_point, apparent_temperature, air_pressure, - precipitation, rain, snowfall, - cloud_cover, wind_speed, wind_direction, - wind_gusts, sun_rise, sun_set, - moon_phase - ) - VALUES - ( - ?, ?, ?, - ?, ?, ?, - ?, ?, ?, - ?, ?, ?, - ?, ?, ?, - ? - ) - """ - (sunrise_time, sunset_time, moonphase) = get_sun_and_moon_phase(park_data[0], park_data[1], game_stats["date"]) weather_data = [ @@ -235,3 +246,5 @@ class Importer: ] self.database.insert(insert_into_weather, weather_data) + + return True diff --git a/main.py b/main.py index 169fd2c..d627971 100644 --- a/main.py +++ b/main.py @@ -14,50 +14,6 @@ inputs = np.array([[0, 0, 1, 0], # output data outputs = np.array([[0], [0], [0], [1], [1], [1]]) -# create NeuralNetwork class -class NeuralNetwork: - - # intialize variables in class - def __init__(self, inputs, outputs): - self.inputs = inputs - self.outputs = outputs - # initialize weights as .50 for simplicity - self.weights = np.array([[.50], [.50], [.50], [0.50]]) - self.error_history = [] - self.epoch_list = [] - - #activation function ==> S(x) = 1/1+e^(-x) - def sigmoid(self, x, deriv=False): - if deriv == True: - return x * (1 - x) - return 1 / (1 + np.exp(-x)) - - # data will flow through the neural network. - def feed_forward(self): - self.hidden = self.sigmoid(np.dot(self.inputs, self.weights)) - - # going backwards through the network to update weights - def backpropagation(self): - self.error = self.outputs - self.hidden - delta = self.error * self.sigmoid(self.hidden, deriv=True) - self.weights += np.dot(self.inputs.T, delta) - - # train the neural net for 25,000 iterations - def train(self, epochs=25000): - for epoch in range(epochs): - # flow forward and produce an output - self.feed_forward() - # go back though the network to make corrections based on the output - self.backpropagation() - # keep track of the error history over each epoch - self.error_history.append(np.average(np.abs(self.error))) - self.epoch_list.append(epoch) - - # function to predict output on new and unseen input data - def predict(self, new_input): - prediction = self.sigmoid(np.dot(new_input, self.weights)) - return prediction - if __name__ == '__main__': build_db_path = "./data/sql/build_db.sql" fill_parks_path = "./data/sql/prefill_parks.sql" @@ -73,14 +29,7 @@ if __name__ == '__main__': imp = Importer(db_conn) imp.parse_all_data("./data/stats/to_import", "./data/stats/imported/") - #we = Weather() - #print(we.get_weather(39.26733000, -76.79831000, "20250706", 12)) - - #park_data = db_conn.select("SELECT latitude, longitude FROM parks WHERE park_id = ?", ("ATL03",)) - #print(get_sun_and_moon_phase(park_data[0], park_data[1], "20250709")) - #historic_weather = get_weather(park_data[0], park_data[1], game_stats["date"], hour) - - +""" else: # create neural network NN = NeuralNetwork(inputs, outputs) @@ -100,4 +49,5 @@ else: plt.plot(NN.epoch_list, NN.error_history) plt.xlabel('Epoch') plt.ylabel('Error') - plt.savefig('plot.png') \ No newline at end of file + plt.savefig('plot.png') +""" \ No newline at end of file From ecaad438a5827e2cdaad6e4a43d52fae8c822b17 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 26 Aug 2025 19:27:59 +0000 Subject: [PATCH 7/7] Throttling connections for free API, Skipping already imported games --- Pipfile.lock | 951 +++++++++++++++++++++++------------------ data/stats_importer.py | 59 ++- 2 files changed, 566 insertions(+), 444 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index a58333d..017a411 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -18,11 +18,11 @@ "default": { "certifi": { "hashes": [ - "sha256:c1d2ec05395148ee10cf672ffc28cd37ea0ab0d99f9cc74c43e588cbd111b079", - "sha256:d842783a14f8fdd646895ac26f719a061408834473cfc10203f6a575beb15d39" + "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", + "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5" ], "markers": "python_version >= '3.7'", - "version": "==2025.7.9" + "version": "==2025.8.3" }, "cffi": { "hashes": [ @@ -99,164 +99,166 @@ }, "charset-normalizer": { "hashes": [ - "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", - "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", - "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", - "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", - "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", - "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", - "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", - "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", - "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", - "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", - "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", - "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", - "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", - "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", - "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", - "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", - "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", - "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", - "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", - "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", - "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", - "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", - "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", - "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", - "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", - "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", - "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", - "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", - "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", - "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", - "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", - "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", - "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", - "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", - "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", - "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", - "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", - "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", - "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", - "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", - "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", - "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", - "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", - "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", - "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", - "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", - "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", - "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", - "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", - "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", - "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", - "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", - "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", - "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", - "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", - "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", - "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", - "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", - "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", - "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", - "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", - "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", - "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", - "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", - "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", - "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", - "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", - "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", - "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", - "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", - "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", - "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", - "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", - "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", - "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", - "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", - "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", - "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", - "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", - "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", - "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", - "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", - "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", - "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", - "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", - "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", - "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", - "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", - "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", - "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", - "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", - "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" + "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", + "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", + "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", + "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", + "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", + "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", + "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c", + "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", + "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", + "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", + "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", + "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", + "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", + "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", + "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", + "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", + "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", + "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", + "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4", + "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", + "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", + "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", + "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", + "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", + "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", + "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", + "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b", + "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", + "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", + "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", + "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", + "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", + "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", + "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", + "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", + "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", + "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a", + "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40", + "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", + "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", + "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", + "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", + "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", + "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", + "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", + "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", + "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", + "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", + "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9", + "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", + "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", + "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", + "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b", + "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", + "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942", + "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", + "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", + "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b", + "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", + "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", + "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", + "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", + "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", + "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", + "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", + "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", + "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", + "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", + "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", + "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", + "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", + "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb", + "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", + "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557", + "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", + "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", + "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", + "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", + "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9" ], "markers": "python_version >= '3.7'", - "version": "==3.4.2" + "version": "==3.4.3" }, "contourpy": { "hashes": [ - "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", - "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", - "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", - "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", - "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", - "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", - "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", - "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", - "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", - "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", - "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", - "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", - "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", - "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", - "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", - "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", - "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", - "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", - "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", - "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", - "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", - "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", - "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", - "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", - "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", - "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", - "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", - "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", - "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", - "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", - "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", - "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", - "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", - "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", - "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", - "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", - "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", - "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", - "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", - "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", - "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", - "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", - "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", - "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", - "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", - "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", - "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", - "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", - "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", - "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", - "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", - "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", - "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", - "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", - "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", - "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", - "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c" + "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", + "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", + "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", + "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", + "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", + "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", + "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", + "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", + "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", + "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", + "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", + "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", + "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", + "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", + "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", + "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", + "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", + "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", + "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", + "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", + "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", + "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", + "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", + "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", + "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", + "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", + "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", + "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", + "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", + "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", + "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", + "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", + "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", + "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", + "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", + "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", + "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", + "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", + "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", + "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", + "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", + "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", + "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", + "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", + "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", + "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", + "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", + "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", + "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", + "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", + "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", + "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", + "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", + "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", + "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", + "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", + "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", + "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", + "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", + "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", + "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", + "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", + "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", + "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", + "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", + "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", + "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", + "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", + "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", + "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", + "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", + "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a" ], - "markers": "python_version >= '3.10'", - "version": "==1.3.2" + "markers": "python_version >= '3.11'", + "version": "==1.3.3" }, "cycler": { "hashes": [ @@ -372,96 +374,130 @@ "index": "pypi", "version": "==4.2" }, + "flatbuffers": { + "hashes": [ + "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e", + "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051" + ], + "version": "==25.2.10" + }, "fonttools": { "hashes": [ - "sha256:0162a6a37b0ca70d8505311d541e291cd6cab54d1a986ae3d2686c56c0581e8f", - "sha256:082410bc40014db55be5457836043f0dd1e6b3817c7d11a0aeb44eaa862890af", - "sha256:0b0983be58d8c8acb11161fdd3b43d64015cef8c3d65ad9289a252243b236128", - "sha256:0bfddfd09aafbbfb3bd98ae67415fbe51eccd614c17db0c8844fe724fbc5d43d", - "sha256:0feac9dda9a48a7a342a593f35d50a5cee2dbd27a03a4c4a5192834a4853b204", - "sha256:126c16ec4a672c9cb5c1c255dc438d15436b470afc8e9cac25a2d39dd2dc26eb", - "sha256:1cde303422198fdc7f502dbdf1bf65306166cdb9446debd6c7fb826b4d66a530", - "sha256:26ec05319353842d127bd02516eacb25b97ca83966e40e9ad6fab85cab0576f4", - "sha256:2af65836cf84cd7cb882d0b353bdc73643a497ce23b7414c26499bb8128ca1af", - "sha256:2d172b92dff59ef8929b4452d5a7b19b8e92081aa87bfb2d82b03b1ff14fc667", - "sha256:3515ac47a9a5ac025d2899d195198314023d89492340ba86e4ba79451f7518a8", - "sha256:36555230e168511e83ad8637232268649634b8dfff6ef58f46e1ebc057a041ad", - "sha256:3f2c05a8d82a4d15aebfdb3506e90793aea16e0302cec385134dd960647a36c0", - "sha256:4a036822e915692aa2c03e2decc60f49a8190f8111b639c947a4f4e5774d0d7a", - "sha256:688137789dbd44e8757ad77b49a771539d8069195ffa9a8bcf18176e90bbd86d", - "sha256:75cf8c2812c898dd3d70d62b2b768df4eeb524a83fb987a512ddb3863d6a8c54", - "sha256:778a632e538f82c1920579c0c01566a8f83dc24470c96efbf2fbac698907f569", - "sha256:79f0c4b1cc63839b61deeac646d8dba46f8ed40332c2ac1b9997281462c2e4ba", - "sha256:83a96e4a4e65efd6c098da549ec34f328f08963acd2d7bc910ceba01d2dc73e6", - "sha256:8ddb7c0c3e91b187acc1bed31857376926569a18a348ac58d6a71eb8a6b22393", - "sha256:9e2d71676025dd74a21d682be36d4846aa03644c619f2c2d695a11a7262433f6", - "sha256:9f7e2ab9c10b6811b4f12a0768661325a48e664ec0a0530232c1605896a598db", - "sha256:a1a9a2c462760976882131cbab7d63407813413a2d32cd699e86a1ff22bf7aa5", - "sha256:a6d7709fcf4577b0f294ee6327088884ca95046e1eccde87c53bbba4d5008541", - "sha256:a81769fc4d473c808310c9ed91fbe01b67f615e3196fb9773e093939f59e6783", - "sha256:adf440deecfcc2390998e649156e3bdd0b615863228c484732dc06ac04f57385", - "sha256:b00530b84f87792891874938bd42f47af2f7f4c2a1d70466e6eb7166577853ab", - "sha256:b2a35b0a19f1837284b3a23dd64fd7761b8911d50911ecd2bdbaf5b2d1b5df9c", - "sha256:b5a0e28fb6abc31ba45a2d11dc2fe826e5a074013d13b7b447b441e8236e5f1c", - "sha256:b9b5099ca99b79d6d67162778b1b1616fc0e1de02c1a178248a0da8d78a33852", - "sha256:bca61b14031a4b7dc87e14bf6ca34c275f8e4b9f7a37bc2fe746b532a924cf30", - "sha256:bf09f14d73a18c62eb9ad1cac98a37569241ba3cd5789cc578286c128cc29f7f", - "sha256:c3af3fefaafb570a03051a0d6899b8374dcf8e6a4560e42575843aef33bdbad6", - "sha256:c5579fb3744dfec151b5c29b35857df83e01f06fe446e8c2ebaf1effd7e6cdce", - "sha256:cda226253bf14c559bc5a17c570d46abd70315c9a687d91c0e01147f87736182", - "sha256:cfde5045f1bc92ad11b4b7551807564045a1b38cb037eb3c2bc4e737cd3a8d0f", - "sha256:d2d79cfeb456bf438cb9fb87437634d4d6f228f27572ca5c5355e58472d5519d", - "sha256:d500d399aa4e92d969a0d21052696fa762385bb23c3e733703af4a195ad9f34c", - "sha256:d506652abc285934ee949a5f3a952c5d52a09257bc2ba44a92db3ec2804c76fe", - "sha256:e48a487ed24d9b611c5c4b25db1e50e69e9854ca2670e39a3486ffcd98863ec4", - "sha256:eb46a73759efc8a7eca40203843241cd3c79aa983ed7f7515548ed3d82073761", - "sha256:f4b6f1360da13cecc88c0d60716145b31e1015fbe6a59e32f73a4404e2ea92cf" + "sha256:01158376b8a418a0bae9625c476cebfcfcb5e6761e9d243b219cd58341e7afbb", + "sha256:02e4fdf27c550dded10fe038a5981c29f81cb9bc649ff2eaa48e80dab8998f97", + "sha256:075f745d539a998cd92cb84c339a82e53e49114ec62aaea8307c80d3ad3aef3a", + "sha256:0b9e4fa7eaf046ed6ac470f6033d52c052481ff7a6e0a92373d14f556f298dc0", + "sha256:1017413cdc8555dce7ee23720da490282ab7ec1cf022af90a241f33f9a49afc4", + "sha256:1ab4c1fb45f2984b8b4a3face7cff0f67f9766e9414cbb6fd061e9d77819de98", + "sha256:2a2d0d33307f6ad3a2086a95dd607c202ea8852fa9fb52af9b48811154d1428a", + "sha256:2aeb829ad9d41a2ef17cab8bb5d186049ba38a840f10352e654aa9062ec32dc1", + "sha256:2beb5bfc4887a3130f8625349605a3a45fe345655ce6031d1bac11017454b943", + "sha256:39dfd42cc2dc647b2c5469bc7a5b234d9a49e72565b96dd14ae6f11c2c59ef15", + "sha256:412a5fd6345872a7c249dac5bcce380393f40c1c316ac07f447bc17d51900922", + "sha256:419f16d750d78e6d704bfe97b48bba2f73b15c9418f817d0cb8a9ca87a5b94bf", + "sha256:42052b56d176f8b315fbc09259439c013c0cb2109df72447148aeda677599612", + "sha256:43ab814bbba5f02a93a152ee61a04182bb5809bd2bc3609f7822e12c53ae2c91", + "sha256:43d177cd0e847ea026fedd9f099dc917da136ed8792d142298a252836390c478", + "sha256:4909cce2e35706f3d18c54d3dcce0414ba5e0fb436a454dffec459c61653b513", + "sha256:4f04c3ffbfa0baafcbc550657cf83657034eb63304d27b05cff1653b448ccff6", + "sha256:5265bc52ed447187d39891b5f21d7217722735d0de9fe81326566570d12851a9", + "sha256:57a3708ca6bfccb790f585fa6d8f29432ec329618a09ff94c16bcb3c55994643", + "sha256:58a8844f96cff35860647a65345bfca87f47a2494bfb4bef754e58c082511443", + "sha256:5b9b4c35b3be45e5bc774d3fc9608bbf4f9a8d371103b858c80edbeed31dd5aa", + "sha256:5c6d8d773470a5107052874341ed3c487c16ecd179976d81afed89dea5cd7406", + "sha256:5d29ab70658d2ec19422b25e6ace00a0b0ae4181ee31e03335eaef53907d2d83", + "sha256:5f3f021cea6e36410874763f4a517a5e2d6ac36ca8f95521f3a9fdaad0fe73dc", + "sha256:6065fdec8ff44c32a483fd44abe5bcdb40dd5e2571a5034b555348f2b3a52cea", + "sha256:647db657073672a8330608970a984d51573557f328030566521bc03415535042", + "sha256:652159e8214eb4856e8387ebcd6b6bd336ee258cbeb639c8be52005b122b9609", + "sha256:729367c91eb1ee84e61a733acc485065a00590618ca31c438e7dd4d600c01486", + "sha256:74995b402ad09822a4c8002438e54940d9f1ecda898d2bb057729d7da983e4cb", + "sha256:8156b11c0d5405810d216f53907bd0f8b982aa5f1e7e3127ab3be1a4062154ff", + "sha256:8387876a8011caec52d327d5e5bca705d9399ec4b17afb8b431ec50d47c17d23", + "sha256:89d9957b54246c6251345297dddf77a84d2c19df96af30d2de24093bbdf0528b", + "sha256:8c8758a7d97848fc8b514b3d9b4cb95243714b2f838dde5e1e3c007375de6214", + "sha256:8ee39da0227950f88626c91e219659e6cd725ede826b1c13edd85fc4cec9bbe6", + "sha256:8f8ef66ac6db450193ed150e10b3b45dde7aded10c5d279968bc63368027f62b", + "sha256:94f9721a564978a10d5c12927f99170d18e9a32e5a727c61eae56f956a4d118b", + "sha256:a960b09ff50c2e87864e83f352e5a90bcf1ad5233df579b1124660e1643de272", + "sha256:ac216a2980a2d2b3b88c68a24f8a9bfb203e2490e991b3238502ad8f1e7bfed0", + "sha256:b11bc177a0d428b37890825d7d025040d591aa833f85f8d8878ed183354f47df", + "sha256:bcd52eaa5c4c593ae9f447c1d13e7e4a00ca21d755645efa660b6999425b3c88", + "sha256:bf5fb864f80061a40c1747e0dbc4f6e738de58dd6675b07eb80bd06a93b063c4", + "sha256:c29ea087843e27a7cffc78406d32a5abf166d92afde7890394e9e079c9b4dbe9", + "sha256:c2b0597522d4c5bb18aa5cf258746a2d4a90f25878cbe865e4d35526abd1b9fc", + "sha256:c536f8a852e8d3fa71dde1ec03892aee50be59f7154b533f0bf3c1174cfd5126", + "sha256:c735e385e30278c54f43a0d056736942023c9043f84ee1021eff9fd616d17693", + "sha256:c866eef7a0ba320486ade6c32bfc12813d1a5db8567e6904fb56d3d40acc5116", + "sha256:cf7c5089d37787387123f1cb8f1793a47c5e1e3d1e4e7bfbc1cc96e0f925eabe", + "sha256:d31dc137ed8ec71dbc446949eba9035926e6e967b90378805dcf667ff57cabb1", + "sha256:d5c3bfdc9663f3d4b565f9cb3b8c1efb3e178186435b45105bde7328cfddd7fe", + "sha256:d601b153e51a5a6221f0d4ec077b6bfc6ac35bfe6c19aeaa233d8990b2b71726", + "sha256:e1ca10da138c300f768bb68e40e5b20b6ecfbd95f91aac4cc15010b6b9d65455", + "sha256:e3680884189e2b7c3549f6d304376e64711fd15118e4b1ae81940cb6b1eaa267", + "sha256:e54437651e1440ee53a95e6ceb6ee440b67a3d348c76f45f4f48de1a5ecab019", + "sha256:e90a89e52deb56b928e761bb5b5f65f13f669bfd96ed5962975debea09776a23", + "sha256:e9ad4ce044e3236f0814c906ccce8647046cc557539661e35211faadf76f283b", + "sha256:ea03f1da0d722fe3c2278a05957e6550175571a4894fbf9d178ceef4a3783d2b", + "sha256:efbec204fa9f877641747f2d9612b2b656071390d7a7ef07a9dbf0ecf9c7195c", + "sha256:fb13823a74b3a9204a8ed76d3d6d5ec12e64cc5bc44914eb9ff1cdac04facd43" ], "markers": "python_version >= '3.9'", - "version": "==4.58.5" + "version": "==4.59.1" }, "h3": { "hashes": [ - "sha256:019f47d5d3bd174b1714ba4c2560783c2a81be98b6a37b130a52e6f00c2aea37", - "sha256:02df69a61c59d06b8516c85d9cf4f6bb2efc8e8b526000ac46b16328540d0952", - "sha256:0963d760b9b067cffbebab3c8514214bdbc18eb66c6292092ca6439fbed25b2b", - "sha256:0f6b8432a104dacf21a2a06bb5dd60e2b63375b544d4964d7e4980543d8285da", - "sha256:15bf255188d5fdd4b33cd24ed3952fbf8161575a42dcba2730a4530ef0f057fa", - "sha256:1e5d2180c1391db507473a6877c2df036de396d88212e90d7d0f6c73b33901d3", - "sha256:1fe4c11a1b512ef64cc155c84977fa41bdc8f059d0db3c411da854805b08ad59", - "sha256:23ee690ab45f95997fa20674937eb2d49018395c272ad63373d0f2cc31925094", - "sha256:24ad4e247388bb7f5afece4fb5f901b1168c4b2f0417b3459bae5c4939939327", - "sha256:2edcae634d23535827e16bf16282646eacacd911f1735aacee381ff717d8a5e9", - "sha256:309bed3271bb7dc5ed32b073dd0a3fda56f4985cf7c4ec2b33d0621ce4357e16", - "sha256:56862fa893903b966840a4aff27e19be2ee62b80e7e67d93dbd805ab719195bc", - "sha256:6409d7d9c7c3a888359c5012aa7eedfe909da230e0f109d6a80ab973c0a2bf73", - "sha256:67c3a8d883b7b233b30a372f85434f48cba3b42b926598a835a73512a0a3d958", - "sha256:67c82019afb5b0b214f50502a141bdb4e9b72dfffe5ed63fdd7630119edee123", - "sha256:689cb238becb5f5af3631934e54cb8c7782c60af8fa9daf7e2cd972235b88c6a", - "sha256:69ceab01438558ab2b5a90a2a30cf9e1627a4a8b6923ad8ec51a9e2dfa2ad0e8", - "sha256:69dc186712c6adeb500b1aaec875493c742fbddb7b9b40d02016769a991732d1", - "sha256:6adba5b249792d8f01abd9e410439a2912a4e900073cfcc2d32297f2ec803db0", - "sha256:6f22ce0f63b1bae098e7258321d51ea268b4cb9f8b4db0be68042b5158e1433b", - "sha256:7de13e47ea3e3a3fc06c50def371050227ecfb1ccf0c8923c2b8bd8acba27355", - "sha256:7f870c0c90fd6657b51d8b1501142e9bee0787437be9486251a0e86e2d1513c1", - "sha256:81ce3b1caeb510618332853a75d6aba5a259f4cf03f9e681c726063915b90d14", - "sha256:902e92c06bb2c08a6a551d5ca6a69a5deae2a9802263ae54455a803c3fb1766c", - "sha256:a647d9635633ca243d8c24c990a9e37e3b294781fd6a47a0f5dfe9a1dec0dd13", - "sha256:a9c18bec33c300485452f3ed46a5165d27b186cfb15ee36fb7252228483c84b9", - "sha256:b75f40700466cf5ac82509cccb3c66404b586ee9ddf97168f4550e02504edfa1", - "sha256:b9d35dfa97e7f4b4c9c9f1564f22a44565694ac1ca96469a08170869e7d0ce0a", - "sha256:c61761f524d7b42872f085dfcafc6466b7ff2ef0fc4c4626b336448e8fffca3a", - "sha256:c961be621a7a14a6fcc2a71c5c4e6b4cf0865781d29e000048a4a5ceb8734ff2", - "sha256:d45005bb56a9d70ab420bda6096c579e4246038f8b0553394b2b82aa474f2d1c", - "sha256:dbaa311260ed1497f6ff97ec8c582fcfb8fbfd90a4156d3d4831d964f0431702", - "sha256:e42d6efec68363943dd062e228f2d77b288041870679ffd08eb37813e9694c96", - "sha256:e46ac17a7dc520ba7e5b5698bf39f3123e68e2c834398711a93a42ab3ec46d60", - "sha256:e8a7d63ee5213f43dea80b79821fa7e07d9377260bc352201cac5c954017ea99", - "sha256:ee2d2ab17c10172b265876b4655094c530251cae24f03cf0d2f339aca5ee603f", - "sha256:f5d19bdb1d592fa01aaeb6a469050c621eea6d82ffb99f095b5502f483151b70" + "sha256:01504895b01b2abac280de0afe70aa6e0fd8201953095027618d6050f0072b53", + "sha256:06f0349364c2bcd7344880902d63fa2e3b5d9a96edbdf0d2d59d2d2e9ee65814", + "sha256:089a83c3046887d762a702fa8bbd63508113ce91b702749a3ee260531da9d084", + "sha256:0ba48c0d64a5dc6843290441c2cf885a4912ccd861c3288e8f8be47a2d09e201", + "sha256:11e945ab6cc38391f2b21c3c5967bf5735c14c30cfd1ed585ff37a987cba4065", + "sha256:14f2012c8bbc6ec72e74ceeb46d617019bb3489c07d1c0dee516bc7765509850", + "sha256:166fd7ecc8a384aad8272432ea482310dbe0022cb12dc84b9f8fd704a908890a", + "sha256:180c82873452aa3fef17b01bc1a5bea90cc508b5d7f78657566dc3e2cc5a0b87", + "sha256:2a838d17726baf573cde98338b8eba9c78f5fb0a60e076a4f038b1573c64959d", + "sha256:2eee0ce19777910187018d8878b2ba746a529c3cf54efa0fd1b79be95034c4b5", + "sha256:348aa0a4f5899fcab48c5d0573c68b1190a3b3e574294524349428658587b7a3", + "sha256:382fbc8904cdf1b606c374c32f1501c182157bb179ac2261eb5f9bf1f06613ad", + "sha256:3904a68322d9f0159d194ee4193c3a8f9823981ddbffe8e9ca7ff8c6fb05a76e", + "sha256:4a8dcb11f7b5b902521b6dd6955fe8710ab7aef33bccf21861182bc7ae02e04e", + "sha256:4b4885dd55ae5bc1848334981f1593eea098133c13bedc66bca1dac624cefe2c", + "sha256:513bbe40727ceba75e746477a19a02f1e1b1803bcf910cf69f7eca9f6164a4bb", + "sha256:5961d986e77900e57b25ce0b0be362d2181bd3db9e1b8792f2b4a503f1d0857e", + "sha256:5e41ddbcc8d89e81a7a2b8de80d957f260802a47fe84fb12b4b1fdfacef93dea", + "sha256:5fc9fcf2f4a96b71b084a0a535f0a3728d43258624e0aad077304bf170f6d95c", + "sha256:63affe0b9d590e138aa3595300e8989d309480b650c3ba5f1219fa412e06147a", + "sha256:65662d46dc3786b961533231e5597aafe642b835a9f09d4fcb1e4081fd3161f9", + "sha256:693f91e0819cd77b2037d7b8e8ef2b807243896a8bf9d542385067087c67b561", + "sha256:836903c620114b67438cf589be108d974d72c96091e9f0d1461975114ce439a2", + "sha256:8451a5b611d62aecbaf5af7772e9879d54f988874ab94acea31ae32a524cf4bb", + "sha256:87ac213063082a67698098c51e54443f465a239a11bf5e7aa4cf95071e3ea2f3", + "sha256:a0877a425e46a1d0999c1069d5d7b902a76ca923bd8d539cdca31f811dbbf640", + "sha256:a4739b305fef270348874b2c81c84a2df2ca0fce418a2c1a822adda0164216b7", + "sha256:adf011133912ec8346b7c9c2e396f8c4ad8395a3713d3ceac36c0fad6e66e7d5", + "sha256:ae63c00cedc0f499d83fb8eec9a84291c16ceb81d5909f75dd28fc6b0efe6d96", + "sha256:aec62f93cae0e146766e6bfced32e5b0f9964aa33bf738d19be779d4a77328f0", + "sha256:b005d38c4e91917b0b2e6053a47f07b123cc5eed794cb849a2d347b6b3888ea0", + "sha256:b3b67b687f339c0bb9f656a8120dcf36714364aadb77c8641206ace9cf664850", + "sha256:b6e0d81d60397fae0159e2f6f6a457f959f5b137b1db969e513aeeb26895798a", + "sha256:b6e2dd52fd50546fb7be574025e7ac01c34b77c171583008cbcdbb2b9e918766", + "sha256:bbc9bed33915386cfa7fa29314e2cc2f7aa94384835d5e2f772c4f66133b34fa", + "sha256:c4db6b3507f37a6dfd60bf82095f1438e0741d50f416de8bbfe8eeaf5c70d4ff", + "sha256:c8b0ce8ac5b4227f511a56933f3da9587d31e4ad68e29ce82eb6214b949883fe", + "sha256:ce6033bdee8dd0179a99f818d6bdce01bf63821fc0ecee9ce5d013ec54cb1000", + "sha256:d1fad090aa81eb6ac2e97cd06e3c17c2021b32afef55f202f4b733fecccfd51c", + "sha256:dd5d6893a3b81b6855c8343375f335b639de202559c69802c4739497cf0d6127", + "sha256:e357001998db9babb4e8b23b617134819e5a2e8c3223c5b292ab05e4c36f19b0", + "sha256:e94a71a2f319d719014808329e66f7ff6137a1a4531f1267575e6c007041b26e", + "sha256:ecac67318538ecef1d893c019946d4cce58c1eef9349090b887ebfe8a59d4f31", + "sha256:f2aad5df6517b993142350503b04b23cc6efa1660e440de56e73ef2a60afba8f", + "sha256:f324654b6e4606f10ebedaaeffcb2d057ad2593e8886ac659451519f3ac30b13", + "sha256:f3f5ca6ac0f155a88889de788c13025f582cbde4cbc6281c472c4673784b6f54", + "sha256:fc8a2c12d945ce840d20bbca68c2c4aae52db7b27a5c275c0171e9887ee902c0", + "sha256:ff45e693c875373489f790f233a3ca3f100bc06a85cd6fc91848dfaa1131af61" ], "markers": "python_version >= '3.8'", - "version": "==4.3.0" + "version": "==4.3.1" }, "idna": { "hashes": [ @@ -473,186 +509,253 @@ }, "kiwisolver": { "hashes": [ - "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", - "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", - "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", - "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", - "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", - "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", - "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", - "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", - "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", - "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", - "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", - "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", - "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", - "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", - "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", - "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", - "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", - "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", - "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", - "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", - "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", - "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", - "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", - "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", - "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", - "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", - "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", - "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", - "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", - "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", - "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", - "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", - "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", - "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", - "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", - "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", - "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", - "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", - "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", - "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", - "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", - "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", - "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", - "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", - "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", - "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", - "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", - "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", - "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", - "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", - "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", - "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", - "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", - "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", - "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", - "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", - "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", - "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", - "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", - "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", - "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", - "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", - "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", - "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", - "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", - "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", - "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", - "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", - "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", - "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", - "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", - "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", - "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", - "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", - "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", - "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", - "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", - "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", - "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", - "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794" + "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", + "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", + "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", + "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", + "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", + "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", + "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", + "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", + "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", + "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", + "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", + "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", + "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", + "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", + "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", + "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", + "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", + "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", + "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", + "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", + "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", + "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", + "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", + "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", + "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", + "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", + "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", + "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", + "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", + "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", + "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", + "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", + "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", + "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", + "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", + "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", + "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", + "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", + "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", + "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", + "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", + "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", + "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", + "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", + "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", + "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", + "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", + "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", + "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", + "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", + "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", + "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", + "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", + "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", + "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", + "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", + "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", + "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", + "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", + "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", + "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", + "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", + "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", + "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", + "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", + "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", + "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", + "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", + "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", + "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", + "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", + "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", + "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", + "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", + "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", + "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", + "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", + "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", + "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", + "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", + "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", + "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", + "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", + "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", + "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", + "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", + "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", + "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", + "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", + "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", + "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", + "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", + "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", + "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", + "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", + "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", + "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", + "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", + "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", + "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", + "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220" ], "markers": "python_version >= '3.10'", - "version": "==1.4.8" + "version": "==1.4.9" }, "matplotlib": { "hashes": [ - "sha256:0ab1affc11d1f495ab9e6362b8174a25afc19c081ba5b0775ef00533a4236eea", - "sha256:0ef061f74cd488586f552d0c336b2f078d43bc00dc473d2c3e7bfee2272f3fa8", - "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93", - "sha256:213fadd6348d106ca7db99e113f1bea1e65e383c3ba76e8556ba4a3054b65ae7", - "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d", - "sha256:2a818d8bdcafa7ed2eed74487fdb071c09c1ae24152d403952adad11fa3c65b4", - "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", - "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e", - "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5", - "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d", - "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566", - "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d", - "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15", - "sha256:748ebc3470c253e770b17d8b0557f0aa85cf8c63fd52f1a61af5b27ec0b7ffee", - "sha256:7c5f0283da91e9522bdba4d6583ed9d5521566f63729ffb68334f86d0bb98049", - "sha256:86ab63d66bbc83fdb6733471d3bff40897c1e9921cba112accd748eee4bce5e4", - "sha256:8c21ae75651c0231b3ba014b6d5e08fb969c40cdb5a011e33e99ed0c9ea86ecb", - "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84", - "sha256:a48f9c08bf7444b5d2391a83e75edb464ccda3c380384b36532a0962593a1751", - "sha256:a49e39755580b08e30e3620efc659330eac5d6534ab7eae50fa5e31f53ee4e30", - "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7", - "sha256:c0b9849a17bce080a16ebcb80a7b714b5677d0ec32161a2cc0a8e5a6030ae220", - "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2", - "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014", - "sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05", - "sha256:cf4636203e1190871d3a73664dea03d26fb019b66692cbfd642faafdad6208e8", - "sha256:d3bec61cb8221f0ca6313889308326e7bb303d0d302c5cc9e523b2f2e6c73deb", - "sha256:d96985d14dc5f4a736bbea4b9de9afaa735f8a0fc2ca75be2fa9e96b2097369d", - "sha256:dbed9917b44070e55640bd13419de83b4c918e52d97561544814ba463811cbc7", - "sha256:ed70453fd99733293ace1aec568255bc51c6361cb0da94fa5ebf0649fdb2150a", - "sha256:eef6ed6c03717083bc6d69c2d7ee8624205c29a8e6ea5a31cd3492ecdbaee1e1", - "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158", - "sha256:fd5641a9bb9d55f4dd2afe897a53b537c834b9012684c8444cc105895c8c16fd", - "sha256:fdfa07c0ec58035242bc8b2c8aae37037c9a886370eef6850703d7583e19964b" + "sha256:00b6feadc28a08bd3c65b2894f56cf3c94fc8f7adcbc6ab4516ae1e8ed8f62e2", + "sha256:07442d2692c9bd1cceaa4afb4bbe5b57b98a7599de4dabfcca92d3eea70f9ebe", + "sha256:080c3676a56b8ee1c762bcf8fca3fe709daa1ee23e6ef06ad9f3fc17332f2d2a", + "sha256:160e125da27a749481eaddc0627962990f6029811dbeae23881833a011a0907f", + "sha256:1f5f3ec4c191253c5f2b7c07096a142c6a1c024d9f738247bfc8e3f9643fc975", + "sha256:1fc0d2a3241cdcb9daaca279204a3351ce9df3c0e7e621c7e04ec28aaacaca30", + "sha256:1ff10ea43288f0c8bab608a305dc6c918cc729d429c31dcbbecde3b9f4d5b569", + "sha256:21a95b9bf408178d372814de7baacd61c712a62cae560b5e6f35d791776f6516", + "sha256:27f52634315e96b1debbfdc5c416592edcd9c4221bc2f520fd39c33db5d9f202", + "sha256:2efaf97d72629e74252e0b5e3c46813e9eeaa94e011ecf8084a971a31a97f40b", + "sha256:33775bbeb75528555a15ac29396940128ef5613cf9a2d31fb1bfd18b3c0c0903", + "sha256:352ed6ccfb7998a00881692f38b4ca083c691d3e275b4145423704c34c909076", + "sha256:354204db3f7d5caaa10e5de74549ef6a05a4550fdd1c8f831ab9bca81efd39ed", + "sha256:3967424121d3a46705c9fa9bdb0931de3228f13f73d7bb03c999c88343a89d89", + "sha256:3b80eb8621331449fc519541a7461987f10afa4f9cfd91afcd2276ebe19bd56c", + "sha256:47a388908e469d6ca2a6015858fa924e0e8a2345a37125948d8e93a91c47933e", + "sha256:48fe6d47380b68a37ccfcc94f009530e84d41f71f5dae7eda7c4a5a84aa0a674", + "sha256:4b4984d5064a35b6f66d2c11d668565f4389b1119cc64db7a4c1725bc11adffc", + "sha256:4fa40a8f98428f789a9dcacd625f59b7bc4e3ef6c8c7c80187a7a709475cf592", + "sha256:525f6e28c485c769d1f07935b660c864de41c37fd716bfa64158ea646f7084bb", + "sha256:52c6573dfcb7726a9907b482cd5b92e6b5499b284ffacb04ffbfe06b3e568124", + "sha256:56da3b102cf6da2776fef3e71cd96fcf22103a13594a18ac9a9b31314e0be154", + "sha256:5d4773a6d1c106ca05cb5a5515d277a6bb96ed09e5c8fab6b7741b8fcaa62c8f", + "sha256:64c4535419d5617f7363dad171a5a59963308e0f3f813c4bed6c9e6e2c131512", + "sha256:6c49465bf689c4d59d174d0c7795fb42a21d4244d11d70e52b8011987367ac61", + "sha256:707f9c292c4cd4716f19ab8a1f93f26598222cd931e0cd98fbbb1c5994bf7667", + "sha256:77fab633e94b9da60512d4fa0213daeb76d5a7b05156840c4fd0399b4b818837", + "sha256:7e44cada61bec8833c106547786814dd4a266c1b2964fd25daa3804f1b8d4467", + "sha256:8a8da0453a7fd8e3da114234ba70c5ba9ef0e98f190309ddfde0f089accd46ea", + "sha256:8b6b49167d208358983ce26e43aa4196073b4702858670f2eb111f9a10652b4b", + "sha256:8dee65cb1424b7dc982fe87895b5613d4e691cc57117e8af840da0148ca6c1d7", + "sha256:903352681b59f3efbf4546985142a9686ea1d616bb054b09a537a06e4b892ccf", + "sha256:94986a242747a0605cb3ff1cb98691c736f28a59f8ffe5175acaeb7397c49a5a", + "sha256:95672a5d628b44207aab91ec20bf59c26da99de12b88f7e0b1fb0a84a86ff959", + "sha256:96ef8f5a3696f20f55597ffa91c28e2e73088df25c555f8d4754931515512715", + "sha256:97b9d6443419085950ee4a5b1ee08c363e5c43d7176e55513479e53669e88468", + "sha256:a17e57e33de901d221a07af32c08870ed4528db0b6059dce7d7e65c1122d4bea", + "sha256:a23193db2e9d64ece69cac0c8231849db7dd77ce59c7b89948cf9d0ce655a3ce", + "sha256:a277033048ab22d34f88a3c5243938cef776493f6201a8742ed5f8b553201343", + "sha256:a41bcb6e2c8e79dc99c5511ae6f7787d2fb52efd3d805fff06d5d4f667db16b2", + "sha256:a6b310f95e1102a8c7c817ef17b60ee5d1851b8c71b63d9286b66b177963039e", + "sha256:ac3d50760394d78a3c9be6b28318fe22b494c4fcf6407e8fd4794b538251899b", + "sha256:b072aac0c3ad563a2b3318124756cb6112157017f7431626600ecbe890df57a1", + "sha256:b5fa2e941f77eb579005fb804026f9d0a1082276118d01cc6051d0d9626eaa7f", + "sha256:ba6c3c9c067b83481d647af88b4e441d532acdb5ef22178a14935b0b881188f4", + "sha256:c04cba0f93d40e45b3c187c6c52c17f24535b27d545f757a2fffebc06c12b98b", + "sha256:c61333a8e5e6240e73769d5826b9a31d8b22df76c0778f8480baf1b4b01c9420", + "sha256:ceefe5d40807d29a66ae916c6a3915d60ef9f028ce1927b84e727be91d884369", + "sha256:d52fd5b684d541b5a51fb276b2b97b010c75bee9aa392f96b4a07aeb491e33c7", + "sha256:dc88af74e7ba27de6cbe6faee916024ea35d895ed3d61ef6f58c4ce97da7185a", + "sha256:dcfc39c452c6a9f9028d3e44d2d721484f665304857188124b505b2c95e1eecf", + "sha256:e4a6470a118a2e93022ecc7d3bd16b3114b2004ea2bf014fff875b3bc99b70c6", + "sha256:ee7a09ae2f4676276f5a65bd9f2bd91b4f9fbaedf49f40267ce3f9b448de501f", + "sha256:ee98a5c5344dc7f48dc261b6ba5d9900c008fc12beb3fa6ebda81273602cc389", + "sha256:f6adb644c9d040ffb0d3434e440490a66cf73dbfa118a6f79cd7568431f7a012" ], "index": "pypi", - "version": "==3.10.3" + "markers": "python_version >= '3.10'", + "version": "==3.10.5" }, "numpy": { "hashes": [ - "sha256:0025048b3c1557a20bc80d06fdeb8cc7fc193721484cca82b2cfa072fec71a93", - "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", - "sha256:0bb3a4a61e1d327e035275d2a993c96fa786e4913aa089843e6a2d9dd205c66a", - "sha256:0c4d9e0a8368db90f93bd192bfa771ace63137c3488d198ee21dfb8e7771916e", - "sha256:15aa4c392ac396e2ad3d0a2680c0f0dee420f9fed14eef09bdb9450ee6dcb7b7", - "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", - "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", - "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", - "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", - "sha256:2959d8f268f3d8ee402b04a9ec4bb7604555aeacf78b360dc4ec27f1d508177d", - "sha256:2a809637460e88a113e186e87f228d74ae2852a2e0c44de275263376f17b5bdc", - "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", - "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", - "sha256:39bff12c076812595c3a306f22bfe49919c5513aa1e0e70fac756a0be7c2a2b8", - "sha256:467db865b392168ceb1ef1ffa6f5a86e62468c43e0cfb4ab6da667ede10e58db", - "sha256:4e602e1b8682c2b833af89ba641ad4176053aaa50f5cacda1a27004352dde943", - "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", - "sha256:5ccb7336eaf0e77c1635b232c141846493a588ec9ea777a7c24d7166bb8533ae", - "sha256:5f1b8f26d1086835f442286c1d9b64bb3974b0b1e41bb105358fd07d20872952", - "sha256:6269b9edfe32912584ec496d91b00b6d34282ca1d07eb10e82dfc780907d6c2e", - "sha256:6ea9e48336a402551f52cd8f593343699003d2353daa4b72ce8d34f66b722070", - "sha256:762e0c0c6b56bdedfef9a8e1d4538556438288c4276901ea008ae44091954e29", - "sha256:7be91b2239af2658653c5bb6f1b8bccafaf08226a258caf78ce44710a0160d30", - "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", - "sha256:867ef172a0976aaa1f1d1b63cf2090de8b636a7674607d514505fb7276ab08fc", - "sha256:8d5ee6eec45f08ce507a6570e06f2f879b374a552087a4179ea7838edbcbfa42", - "sha256:8e333040d069eba1652fb08962ec5b76af7f2c7bce1df7e1418c8055cf776f25", - "sha256:a5ee121b60aa509679b682819c602579e1df14a5b07fe95671c8849aad8f2115", - "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", - "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", - "sha256:a8b740f5579ae4585831b3cf0e3b0425c667274f82a484866d2adf9570539369", - "sha256:ad506d4b09e684394c42c966ec1527f6ebc25da7f4da4b1b056606ffe446b8a3", - "sha256:afed2ce4a84f6b0fc6c1ce734ff368cbf5a5e24e8954a338f3bdffa0718adffb", - "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", - "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", - "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", - "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", - "sha256:c6e0bf9d1a2f50d2b65a7cf56db37c095af17b59f6c132396f7c6d5dd76484df", - "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", - "sha256:cfecc7822543abdea6de08758091da655ea2210b8ffa1faf116b940693d3df76", - "sha256:d4580adadc53311b163444f877e0789f1c8861e2698f6b2a4ca852fda154f3ff", - "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", - "sha256:e344eb79dab01f1e838ebb67aab09965fb271d6da6b00adda26328ac27d4a66e", - "sha256:e610832418a2bc09d974cc9fecebfa51e9532d6190223bc5ef6a7402ebf3b5cb", - "sha256:e772dda20a6002ef7061713dc1e2585bc1b534e7909b2030b5a46dae8ff077ab", - "sha256:e7cbf5a5eafd8d230a3ce356d892512185230e4781a361229bd902ff403bc660", - "sha256:eabd7e8740d494ce2b4ea0ff05afa1b7b291e978c0ae075487c51e8bd93c0c68", - "sha256:ebb8603d45bc86bbd5edb0d63e52c5fd9e7945d3a503b77e486bd88dde67a19b", - "sha256:ec0bdafa906f95adc9a0c6f26a4871fa753f25caaa0e032578a30457bff0af6a", - "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", - "sha256:ee8340cb48c9b7a5899d1149eece41ca535513a9698098edbade2a8e7a84da77" + "sha256:07b62978075b67eee4065b166d000d457c82a1efe726cce608b9db9dd66a73a5", + "sha256:087ffc25890d89a43536f75c5fe8770922008758e8eeeef61733957041ed2f9b", + "sha256:092aeb3449833ea9c0bf0089d70c29ae480685dd2377ec9cdbbb620257f84631", + "sha256:095737ed986e00393ec18ec0b21b47c22889ae4b0cd2d5e88342e08b01141f58", + "sha256:0a4f2021a6da53a0d580d6ef5db29947025ae8b35b3250141805ea9a32bbe86b", + "sha256:103ea7063fa624af04a791c39f97070bf93b96d7af7eb23530cd087dc8dbe9dc", + "sha256:11e58218c0c46c80509186e460d79fbdc9ca1eb8d8aee39d8f2dc768eb781089", + "sha256:122bf5ed9a0221b3419672493878ba4967121514b1d7d4656a7580cd11dddcbf", + "sha256:14a91ebac98813a49bc6aa1a0dfc09513dcec1d97eaf31ca21a87221a1cdcb15", + "sha256:1f91e5c028504660d606340a084db4b216567ded1056ea2b4be4f9d10b67197f", + "sha256:20b8200721840f5621b7bd03f8dcd78de33ec522fc40dc2641aa09537df010c3", + "sha256:240259d6564f1c65424bcd10f435145a7644a65a6811cfc3201c4a429ba79170", + "sha256:2738534837c6a1d0c39340a190177d7d66fdf432894f469728da901f8f6dc910", + "sha256:27c9f90e7481275c7800dc9c24b7cc40ace3fdb970ae4d21eaff983a32f70c91", + "sha256:293b2192c6bcce487dbc6326de5853787f870aeb6c43f8f9c6496db5b1781e45", + "sha256:2c3271cc4097beb5a60f010bcc1cc204b300bb3eafb4399376418a83a1c6373c", + "sha256:2f4f0215edb189048a3c03bd5b19345bdfa7b45a7a6f72ae5945d2a28272727f", + "sha256:3dcf02866b977a38ba3ec10215220609ab9667378a9e2150615673f3ffd6c73b", + "sha256:4209f874d45f921bde2cff1ffcd8a3695f545ad2ffbef6d3d3c6768162efab89", + "sha256:448a66d052d0cf14ce9865d159bfc403282c9bc7bb2a31b03cc18b651eca8b1a", + "sha256:4ae6863868aaee2f57503c7a5052b3a2807cf7a3914475e637a0ecd366ced220", + "sha256:4d002ecf7c9b53240be3bb69d80f86ddbd34078bae04d87be81c1f58466f264e", + "sha256:4e6ecfeddfa83b02318f4d84acf15fbdbf9ded18e46989a15a8b6995dfbf85ab", + "sha256:508b0eada3eded10a3b55725b40806a4b855961040180028f52580c4729916a2", + "sha256:546aaf78e81b4081b2eba1d105c3b34064783027a06b3ab20b6eba21fb64132b", + "sha256:572d5512df5470f50ada8d1972c5f1082d9a0b7aa5944db8084077570cf98370", + "sha256:5ad4ebcb683a1f99f4f392cc522ee20a18b2bb12a2c1c42c3d48d5a1adc9d3d2", + "sha256:66459dccc65d8ec98cc7df61307b64bf9e08101f9598755d42d8ae65d9a7a6ee", + "sha256:6936aff90dda378c09bea075af0d9c675fe3a977a9d2402f95a87f440f59f619", + "sha256:69779198d9caee6e547adb933941ed7520f896fd9656834c300bdf4dd8642712", + "sha256:6f1ae3dcb840edccc45af496f312528c15b1f79ac318169d094e85e4bb35fdf1", + "sha256:71669b5daae692189540cffc4c439468d35a3f84f0c88b078ecd94337f6cb0ec", + "sha256:72c6df2267e926a6d5286b0a6d556ebe49eae261062059317837fda12ddf0c1a", + "sha256:72dbebb2dcc8305c431b2836bcc66af967df91be793d63a24e3d9b741374c450", + "sha256:754d6755d9a7588bdc6ac47dc4ee97867271b17cee39cb87aef079574366db0a", + "sha256:76c3e9501ceb50b2ff3824c3589d5d1ab4ac857b0ee3f8f49629d0de55ecf7c2", + "sha256:7a0e27186e781a69959d0230dd9909b5e26024f8da10683bd6344baea1885168", + "sha256:7d6e390423cc1f76e1b8108c9b6889d20a7a1f59d9a60cac4a050fa734d6c1e2", + "sha256:8145dd6d10df13c559d1e4314df29695613575183fa2e2d11fac4c208c8a1f73", + "sha256:8446acd11fe3dc1830568c941d44449fd5cb83068e5c70bd5a470d323d448296", + "sha256:852ae5bed3478b92f093e30f785c98e0cb62fa0a939ed057c31716e18a7a22b9", + "sha256:87c930d52f45df092f7578889711a0768094debf73cfcde105e2d66954358125", + "sha256:8b1224a734cd509f70816455c3cffe13a4f599b1bf7130f913ba0e2c0b2006c0", + "sha256:8dc082ea901a62edb8f59713c6a7e28a85daddcb67454c839de57656478f5b19", + "sha256:906a30249315f9c8e17b085cc5f87d3f369b35fedd0051d4a84686967bdbbd0b", + "sha256:938065908d1d869c7d75d8ec45f735a034771c6ea07088867f713d1cd3bbbe4f", + "sha256:9c144440db4bf3bb6372d2c3e49834cc0ff7bb4c24975ab33e01199e645416f2", + "sha256:9e196ade2400c0c737d93465327d1ae7c06c7cb8a1756121ebf54b06ca183c7f", + "sha256:a3ef07ec8cbc8fc9e369c8dcd52019510c12da4de81367d8b20bc692aa07573a", + "sha256:a7af9ed2aa9ec5950daf05bb11abc4076a108bd3c7db9aa7251d5f107079b6a6", + "sha256:a9f66e7d2b2d7712410d3bc5684149040ef5f19856f20277cd17ea83e5006286", + "sha256:aa098a5ab53fa407fded5870865c6275a5cd4101cfdef8d6fafc48286a96e981", + "sha256:af58de8745f7fa9ca1c0c7c943616c6fe28e75d0c81f5c295810e3c83b5be92f", + "sha256:b05a89f2fb84d21235f93de47129dd4f11c16f64c87c33f5e284e6a3a54e43f2", + "sha256:b5e40e80299607f597e1a8a247ff8d71d79c5b52baa11cc1cce30aa92d2da6e0", + "sha256:b9d0878b21e3918d76d2209c924ebb272340da1fb51abc00f986c258cd5e957b", + "sha256:bc3186bea41fae9d8e90c2b4fb5f0a1f5a690682da79b92574d63f56b529080b", + "sha256:c63d95dc9d67b676e9108fe0d2182987ccb0f11933c1e8959f42fa0da8d4fa56", + "sha256:c771cfac34a4f2c0de8e8c97312d07d64fd8f8ed45bc9f5726a7e947270152b5", + "sha256:c8d9727f5316a256425892b043736d63e89ed15bbfe6556c5ff4d9d4448ff3b3", + "sha256:cbc95b3813920145032412f7e33d12080f11dc776262df1712e1638207dde9e8", + "sha256:cefc2219baa48e468e3db7e706305fcd0c095534a192a08f31e98d83a7d45fb0", + "sha256:d95f59afe7f808c103be692175008bab926b59309ade3e6d25009e9a171f7036", + "sha256:dd937f088a2df683cbb79dda9a772b62a3e5a8a7e76690612c2737f38c6ef1b6", + "sha256:de6ea4e5a65d5a90c7d286ddff2b87f3f4ad61faa3db8dabe936b34c2275b6f8", + "sha256:e0486a11ec30cdecb53f184d496d1c6a20786c81e55e41640270130056f8ee48", + "sha256:ee807923782faaf60d0d7331f5e86da7d5e3079e28b291973c545476c2b00d07", + "sha256:efc81393f25f14d11c9d161e46e6ee348637c0a1e8a54bf9dedc472a3fae993b", + "sha256:f0a1a8476ad77a228e41619af2fa9505cf69df928e9aaa165746584ea17fed2b", + "sha256:f75018be4980a7324edc5930fe39aa391d5734531b1926968605416ff58c332d", + "sha256:f92d6c2a8535dc4fe4419562294ff957f83a16ebdec66df0805e473ffaad8bd0", + "sha256:fb1752a3bb9a3ad2d6b090b88a9a0ae1cd6f004ef95f75825e2f382c183b2097", + "sha256:fc927d7f289d14f5e037be917539620603294454130b6de200091e23d27dc9be", + "sha256:fed5527c4cf10f16c6d0b6bee1f89958bccb0ad2522c8cadc2efd318bcd545f5" ], "index": "pypi", - "version": "==2.3.1" + "markers": "python_version >= '3.11'", + "version": "==2.3.2" }, "packaging": { "hashes": [ @@ -800,11 +903,12 @@ }, "requests": { "hashes": [ - "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", - "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422" + "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", + "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf" ], "index": "pypi", - "version": "==2.32.4" + "markers": "python_version >= '3.9'", + "version": "==2.32.5" }, "six": { "hashes": [ @@ -816,28 +920,21 @@ }, "timezonefinder": { "hashes": [ - "sha256:0d84c792a499fd098a35c701c3e3293423ba8d45c81b3eecd7c7cb72c7f1f415", - "sha256:23465a74af9fdb17c139c40e1dd3a46db284befb822fc454a03ad9516f0c502a", - "sha256:2e402d54b6442c5203e0dfb3c6d1b4c96371d4e71ca86c99a35589ca0c90f5db", - "sha256:39578e7225e5c272b30bf86a25c697d8ebf4df443534b2523c707deefebc6277", - "sha256:3e9a0caf638f43b6dd9980731d1424500c7a6a5048db808aad7032560df5c663", - "sha256:4f36877ad3a988f329cbd3f04f7cadc56dce073ad4a7bda7397f46ac2a61f9a4", - "sha256:4fa18e4b3f3ac1469bc50031700bc9696477cbf40953bdcbdec7bef20f3200d0", - "sha256:52d5a4a8fc96990f72d9d3d48297e789217f67689d3178c9ff8ea3ab57125e3b", - "sha256:643535f76436b13216ed1c3b69c6ed8f793253810916ca6bef3b8e0cf3084fef", - "sha256:7a84ad5afb02ca1b536481cee05a8f2d5d7dd4818f73cd780acd03aa3cc033c9", - "sha256:9039919be603809b98f3d2b6a4ed33110ac7cc6bbd507959531401c91f3469fb", - "sha256:9ee6ad1719ae5769f5218facf5ceb25cc16a188e4b1a7baa2c7baf53cfd8568a", - "sha256:a7d1f30b550c24598459643285ef0f5469524ad7a32dd854199e7a2a463600ff", - "sha256:bfb175d470e6f6abbeb13bd3a638bb1a0aa4124e1a93d040e5d933cf69076c60", - "sha256:c1ed4828b27b38ec454b0d82458fd35f7a7039f9a640afce51338c1c91a56a27", - "sha256:c5347c4a73b40af4867a2946a5172ec68b644e7036888b9b5a0e568499bfc0f3", - "sha256:cfc9cc75a39b7997c1e616481d559831e3e4a1c0cde66f20c9168ab3d45e0fa6", - "sha256:f34df7e66a7c82212191909f0461027d6b584d57a9c549b7f31a2687620b8fcf", - "sha256:f7af80ceac094932c07750d384539f6c4397c7b1bcbbb51dc9d5a90a65ad1df4" + "sha256:00a1b2e681c182ed492280ab0da6343b5a064ad6a1f8ad5a69f94465ccb74ec6", + "sha256:10faae3e0e124fa3e31a7f3b2c97371be8a65d5221de39814b30702119386e0f", + "sha256:2564aecc6d38e5639c2bfb55af7b245070a1b1186d9580d6a8b0274344b3e99e", + "sha256:40d061db0871f612bf958825743d6e4fe74ef62940f0f83c650b90832b5bc190", + "sha256:412bd68647969de715f766355477e04b5379c5349d5e7d6f8a633370495904e5", + "sha256:a88beb09a8e24d32b522c9e70c37d633697477e7c436dfaebe24d8e155c81bbb", + "sha256:b5d2a5253e049a51b9ccc7050c29289948e9cd8c9bb9d2f3752ac873c46ee56e", + "sha256:ddfe811320afda1b6fac4318e787185cee1fed7d2b3a14b09a143783f7f75fa8", + "sha256:ebb647f568a5b859f3e6fff2b866528ebe92d4b33e2146931c6f98b0da1985e2", + "sha256:edaa36149dfa2436472c5ae644fbf5e8c7de3097da28b70fb12fad9d0ff0d3cf", + "sha256:ffbe860f478d976bae342ca08aa0ca3b1f0dee15bc164800b39c335c320b5de7" ], "index": "pypi", - "version": "==6.5.9" + "markers": "python_version >= '3.9' and python_version < '4'", + "version": "==8.0.0" }, "urllib3": { "hashes": [ diff --git a/data/stats_importer.py b/data/stats_importer.py index e68d626..645489e 100644 --- a/data/stats_importer.py +++ b/data/stats_importer.py @@ -1,6 +1,9 @@ import os import csv +import time import shutil + +from math import * from data.db_connect import Database from data.build_weather import get_weather, get_sun_and_moon_phase @@ -42,9 +45,23 @@ class Importer: reader = csv.DictReader(bb_data_file) bb_dict = list(reader) + count = 0 for game in bb_dict: + # Delay to not overwhelm the free api + count += 1 + print(f"Current line {count}") + if count % 600 == 0: + print("Sleeping for 1 min") + time.sleep(60) + if count % 5000 == 0: + print("Sleeping for 1 hour") + time.sleep(60*60) + if count % 10000 == 0: + print("Sleeping for 1 day") + time.sleep(60*60*24) + if not self.populate_database_with_stats(game): - return False + return False return True @@ -56,6 +73,11 @@ class Importer: print(f"{parkid} is None") return True + check_game_added_query = "SELECT id FROM games WHERE game_date = ? AND game_number = ? AND park_id = ?" + check_game_added_data = [game_stats["date"], game_stats["num-of-game"], game_stats['park-id']] + if self.database.select(check_game_added_query, check_game_added_data) is not None: + return True + insert_game = """ INSERT INTO games ( @@ -160,13 +182,15 @@ class Importer: if "error" in historic_weather: print(f"Error: {historic_weather['error']}: Details: {historic_weather['details']}") - return False - - if "hourly" not in historic_weather: + if "No weather data available" in historic_weather['details']: + historic_weather = None + else: + return False + elif "hourly" not in historic_weather: print(f"Failed to get weather: Full JSON: {historic_weather}") - return False - - historic_weather = historic_weather["hourly"] + historic_weather = None + else: + historic_weather = historic_weather["hourly"] game_data = [ game_stats["date"], game_stats["num-of-game"], game_stats["day-of-week"], @@ -234,17 +258,18 @@ class Importer: self.database.insert(insert_team_game, visiting_team_data) self.database.insert(insert_team_game, home_team_data) - (sunrise_time, sunset_time, moonphase) = get_sun_and_moon_phase(park_data[0], park_data[1], game_stats["date"]) + if historic_weather is not None: + (sunrise_time, sunset_time, moonphase) = get_sun_and_moon_phase(park_data[0], park_data[1], game_stats["date"]) - weather_data = [ - game_id, historic_weather["temperature_2m"][hour], historic_weather["relative_humidity_2m"][hour], - historic_weather["dew_point_2m"][hour], historic_weather["apparent_temperature"][hour], historic_weather["pressure_msl"][hour], - historic_weather["precipitation"][hour], historic_weather["rain"][hour], historic_weather["snowfall"][hour], - historic_weather["cloud_cover"][hour], historic_weather["wind_speed_10m"][hour], historic_weather["wind_direction_10m"][hour], - historic_weather["wind_gusts_10m"][hour], sunrise_time, sunset_time, - moonphase, - ] + weather_data = [ + game_id, historic_weather["temperature_2m"][hour], historic_weather["relative_humidity_2m"][hour], + historic_weather["dew_point_2m"][hour], historic_weather["apparent_temperature"][hour], historic_weather["pressure_msl"][hour], + historic_weather["precipitation"][hour], historic_weather["rain"][hour], historic_weather["snowfall"][hour], + historic_weather["cloud_cover"][hour], historic_weather["wind_speed_10m"][hour], historic_weather["wind_direction_10m"][hour], + historic_weather["wind_gusts_10m"][hour], sunrise_time, sunset_time, + moonphase, + ] - self.database.insert(insert_into_weather, weather_data) + self.database.insert(insert_into_weather, weather_data) return True