diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 192c4d2..206f0e2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,4 +26,4 @@ jobs: # renovate: datasource=conda depName=conda-forge/python python-version: "3.12.4" # renovate: datasource=pypi depName=ruff - ruff-version: "0.4.10" + ruff-version: "0.7.4" diff --git a/extcats/CatalogQuery.py b/extcats/CatalogQuery.py index 0c151fc..31452f6 100755 --- a/extcats/CatalogQuery.py +++ b/extcats/CatalogQuery.py @@ -721,7 +721,7 @@ def test_queries( for pp in tqdm.tqdm(points): buff = qfunc(pp[0], pp[1], rs_arcsec, method, **qfunc_args) if ( - (type(buff) == tuple and buff == (None, None)) + (isinstance(buff, tuple) and buff == (None, None)) or (buff is None) or (not buff) ): diff --git a/notebooks/example_ingest_multiproc.ipynb b/notebooks/example_ingest_multiproc.ipynb index 0fad6ba..4ca2fad 100644 --- a/notebooks/example_ingest_multiproc.ipynb +++ b/notebooks/example_ingest_multiproc.ipynb @@ -30,77 +30,87 @@ "from healpy import ang2pix\n", "\n", "import importlib\n", + "\n", "importlib.reload(CatalogPusher)\n", "\n", "# build the pusher object and point it to the raw files.\n", "ps1p = CatalogPusher.CatalogPusher(\n", - " catalog_name = 'ps1_test', # short name of the catalog\n", - " data_source = '../testdata/PS1DR1_test/', # where to find the data (other options are possible)\n", - " file_type = '*.csv.gz' # filter files (there is col definition file in data_source)\n", - " )\n", + " catalog_name=\"ps1_test\", # short name of the catalog\n", + " data_source=\"../testdata/PS1DR1_test/\", # where to find the data (other options are possible)\n", + " file_type=\"*.csv.gz\", # filter files (there is col definition file in data_source)\n", + ")\n", "\n", "# define the reader for the raw files (import column names from file.)\n", - "headfile = '../testdata/PS1DR1_test/column_headings.csv'\n", - "with open(headfile, 'r') as header:\n", - " catcols=[c.strip() for c in header.readline().split(',')]\n", + "headfile = \"../testdata/PS1DR1_test/column_headings.csv\"\n", + "with open(headfile, \"r\") as header:\n", + " catcols = [c.strip() for c in header.readline().split(\",\")]\n", "\n", "# skimm out some columns\n", - "bad = ['projectionID', 'skyCellID']\n", - "usecols = [c for c in catcols if (not c in bad) or ('gNpt' in c)]\n", + "bad = [\"projectionID\", \"skyCellID\"]\n", + "usecols = [c for c in catcols if (c not in bad) or (\"gNpt\" in c)]\n", "\n", "# specify some data types to save up on the storage\n", "# See https://outerspace.stsci.edu/display/PANSTARRS/PS1+MeanObject+table+fields\n", "types = {}\n", "for c in usecols:\n", " types[c] = np.float16\n", - " if c == 'objID':\n", + " if c == \"objID\":\n", " types[c] = np.int32\n", - " if 'Flags' in c:\n", + " if \"Flags\" in c:\n", " types[c] = np.int16\n", - " if ('ra' in c) or ('dec' in c):\n", + " if (\"ra\" in c) or (\"dec\" in c):\n", " types[c] = np.float32\n", "\n", "ps1p.assign_file_reader(\n", - " reader_func = pd.read_csv, # callable to use to read the raw_files. \n", - " read_chunks = True, # weather or not the reader process each file into smaller chunks.\n", - " names=catcols, # All other arguments are passed directly to this function.\n", + " reader_func=pd.read_csv, # callable to use to read the raw_files.\n", + " read_chunks=True, # weather or not the reader process each file into smaller chunks.\n", + " names=catcols, # All other arguments are passed directly to this function.\n", " usecols=usecols,\n", - " dtype = types,\n", - " na_values = -999,\n", + " dtype=types,\n", + " na_values=-999,\n", " chunksize=50000,\n", - " engine='c')\n", + " engine=\"c\",\n", + ")\n", "\n", "# define modifier. This time the healpix grid is finer (an orer 16 corresponds to 3\")\n", - "hp_nside16=2**16\n", + "hp_nside16 = 2**16\n", + "\n", + "\n", "def ps1_modifier(srcdict):\n", - " srcdict['_id'] = srcdict.pop('objID')\n", - " srcdict['hpxid_16']=int(\n", - " ang2pix(hp_nside16, srcdict['raMean'], srcdict['decMean'], lonlat = True, nest = True))\n", + " srcdict[\"_id\"] = srcdict.pop(\"objID\")\n", + " srcdict[\"hpxid_16\"] = int(\n", + " ang2pix(\n", + " hp_nside16, srcdict[\"raMean\"], srcdict[\"decMean\"], lonlat=True, nest=True\n", + " )\n", + " )\n", " return srcdict\n", + "\n", + "\n", "ps1p.assign_dict_modifier(ps1_modifier)\n", "\n", - "# wrap up the file pushing function so that we can \n", + "# wrap up the file pushing function so that we can\n", "# use multiprocessing to speed up the catalog ingestion\n", "\n", + "\n", "def pushfiles(filerange):\n", " # push stuff\n", " ps1p.push_to_db(\n", - " coll_name = 'srcs',\n", - " index_on = ['hpxid_16'],\n", - " filerange = filerange,\n", - " overwrite_coll = False,\n", - " dry = False, \n", - " fillna_val = None)\n", + " coll_name=\"srcs\",\n", + " index_on=[\"hpxid_16\"],\n", + " filerange=filerange,\n", + " overwrite_coll=False,\n", + " dry=False,\n", + " fillna_val=None,\n", + " )\n", " # add metadata to direct queries\n", - " ps1p.healpix_meta(\n", - " healpix_id_key = 'hpxid_16', \n", - " order = 16, is_indexed = True, nest = True)\n", + " ps1p.healpix_meta(healpix_id_key=\"hpxid_16\", order=16, is_indexed=True, nest=True)\n", + "\n", "\n", "# each job will run on a subgroup of all the files\n", "file_groups = ps1p.file_groups(group_size=1)\n", - "with concurrent.futures.ProcessPoolExecutor(max_workers = 2) as executor:\n", - " executor.map(pushfiles, file_groups) \n", - "print (\"done! Enjoy your PS1_test database.\")" + "with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executor:\n", + " executor.map(pushfiles, file_groups)\n", + "print(\"done! Enjoy your PS1_test database.\")" ] }, { diff --git a/notebooks/insert_allWISE.ipynb b/notebooks/insert_allWISE.ipynb index 4381751..cd22e14 100644 --- a/notebooks/insert_allWISE.ipynb +++ b/notebooks/insert_allWISE.ipynb @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -78,27 +78,26 @@ ], "source": [ "import numpy as np\n", + "import pandas as pd\n", "from healpy import ang2pix\n", "from extcats import CatalogPusher\n", "\n", "# build the pusher object and point it to the raw files.\n", "wisep = CatalogPusher.CatalogPusher(\n", - " catalog_name = 'wise',\n", - " data_source = '../testdata/AllWISE/',\n", - " file_type = \".bz2\")\n", + " catalog_name=\"wise\", data_source=\"../testdata/AllWISE/\", file_type=\".bz2\"\n", + ")\n", "\n", "\n", "# read column names and types from schema file\n", "schema_file = \"../testdata/AllWISE/wise-allwise-cat-schema.txt\"\n", "names, types = [], {}\n", "with open(schema_file) as schema:\n", - " for l in schema:\n", - " if \"#\" in l or (not l.strip()):\n", + " for line in schema:\n", + " if \"#\" in line or (not line.strip()):\n", " continue\n", - " name, dtype = zip(\n", - " [p.strip() for p in l.strip().split(\" \") if not p in [\"\"]])\n", + " name, dtype = zip([p.strip() for p in line.strip().split(\" \") if p not in [\"\"]])\n", " name, dtype = name[0], dtype[0]\n", - " #print (name, dtype)\n", + " # print (name, dtype)\n", " names.append(name)\n", " # convert the data type\n", " if \"char\" in dtype:\n", @@ -114,60 +113,65 @@ " elif dtype == \"int8\":\n", " types[name] = np.int8\n", " else:\n", - " print(\"unknown data type: %s\"%dtype)\n", + " print(\"unknown data type: %s\" % dtype)\n", "\n", "# select the columns you want to use.\n", "use_cols = []\n", - "select = [\"Basic Position and Identification Information\", \n", - " \"Primary Photometric Information\", \n", - " \"Measurement Quality and Source Reliability Information\",\n", - " \"2MASS PSC Association Information\"]\n", + "select = [\n", + " \"Basic Position and Identification Information\",\n", + " \"Primary Photometric Information\",\n", + " \"Measurement Quality and Source Reliability Information\",\n", + " \"2MASS PSC Association Information\",\n", + "]\n", "with open(schema_file) as schema:\n", " blocks = schema.read().split(\"#\")\n", " for block in blocks:\n", " if any([k in block for k in select]):\n", - " for l in block.split(\"\\n\")[1:]:\n", - " if \"#\" in l or (not l.strip()):\n", + " for line in block.split(\"\\n\")[1:]:\n", + " if \"#\" in line or (not line.strip()):\n", " continue\n", " name, dtype = zip(\n", - " [p.strip() for p in l.strip().split(\" \") if not p in [\"\"]])\n", + " [p.strip() for p in line.strip().split(\" \") if p not in [\"\"]]\n", + " )\n", " use_cols.append(name[0])\n", - "print(\"we will be using %d columns out of %d\"%(len(use_cols), len(names)))\n", + "print(\"we will be using %d columns out of %d\" % (len(use_cols), len(names)))\n", "\n", "# now assign the reader to the catalog pusher object\n", - "import pandas as pd\n", + "\n", "wisep.assign_file_reader(\n", - " reader_func = pd.read_csv, \n", - " read_chunks = True,\n", - " names = names,\n", - " usecols = lambda x : x in use_cols,\n", - " #dtype = types, #this mess up with NaN values\n", - " chunksize=5000,\n", - " header=None,\n", - " engine='c',\n", - " sep='|',\n", - " na_values = 'nnnn')\n", + " reader_func=pd.read_csv,\n", + " read_chunks=True,\n", + " names=names,\n", + " usecols=lambda x: x in use_cols,\n", + " # dtype = types, #this mess up with NaN values\n", + " chunksize=5000,\n", + " header=None,\n", + " engine=\"c\",\n", + " sep=\"|\",\n", + " na_values=\"nnnn\",\n", + ")\n", "\n", "\n", "# define the dictionary modifier that will act on the single entries\n", "def modifier(srcdict):\n", - " srcdict['hpxid_16'] = int(\n", - " ang2pix(2**16, srcdict['ra'], srcdict['dec'], lonlat = True, nest = True))\n", - " #srcdict['_id'] = srcdict.pop('source_id') doesn't work, seems it is not unique\n", + " srcdict[\"hpxid_16\"] = int(\n", + " ang2pix(2**16, srcdict[\"ra\"], srcdict[\"dec\"], lonlat=True, nest=True)\n", + " )\n", + " # srcdict['_id'] = srcdict.pop('source_id') doesn't work, seems it is not unique\n", " return srcdict\n", + "\n", + "\n", "wisep.assign_dict_modifier(modifier)\n", "\n", "\n", "# finally push it in the databse\n", "wisep.push_to_db(\n", - " coll_name = 'srcs', \n", - " index_on = \"hpxid_16\",\n", - " overwrite_coll = True, \n", - " append_to_coll = False)\n", + " coll_name=\"srcs\", index_on=\"hpxid_16\", overwrite_coll=True, append_to_coll=False\n", + ")\n", "\n", "\n", "# if needed print extensive info on database\n", - "#wisep.info()" + "# wisep.info()" ] }, { @@ -210,53 +214,57 @@ } ], "source": [ - "# now test the database for query performances. We use \n", + "# now test the database for query performances. We use\n", "# a sample of randomly distributed points on a sphere\n", - "# as targets. \n", + "# as targets.\n", "\n", "# define the funtion to test coordinate based queries:\n", - "from healpy import ang2pix, get_all_neighbours\n", + "from healpy import get_all_neighbours\n", "from astropy.table import Table\n", "from astropy.coordinates import SkyCoord\n", "\n", - "return_fields = ['designation', 'ra', 'dec']\n", + "return_fields = [\"designation\", \"ra\", \"dec\"]\n", "project = {}\n", - "for field in return_fields: project[field] = 1\n", - "print (project)\n", + "for field in return_fields:\n", + " project[field] = 1\n", + "print(project)\n", + "\n", + "\n", + "hp_order, rs_arcsec = 16, 30.0\n", "\n", "\n", - "hp_order, rs_arcsec = 16, 30.\n", "def test_query(ra, dec, coll):\n", " \"\"\"query collection for points within rs of target ra, dec.\n", " The results as returned as an astropy Table.\"\"\"\n", - " \n", - " # find the index of the target pixel and its neighbours \n", - " target_pix = int( ang2pix(2**hp_order, ra, dec, nest = True, lonlat = True) )\n", - " neighbs = get_all_neighbours(2**hp_order, ra, dec, nest = True, lonlat = True)\n", + "\n", + " # find the index of the target pixel and its neighbours\n", + " target_pix = int(ang2pix(2**hp_order, ra, dec, nest=True, lonlat=True))\n", + " neighbs = get_all_neighbours(2**hp_order, ra, dec, nest=True, lonlat=True)\n", "\n", " # remove non-existing neigbours (in case of E/W/N/S) and add center pixel\n", " pix_group = [int(pix_id) for pix_id in neighbs if pix_id != -1] + [target_pix]\n", - " \n", + "\n", " # query the database for sources in these pixels\n", - " qfilter = { 'hpxid_%d'%hp_order: { '$in': pix_group } }\n", + " qfilter = {\"hpxid_%d\" % hp_order: {\"$in\": pix_group}}\n", " qresults = [o for o in coll.find(qfilter)]\n", - " if len(qresults)==0:\n", + " if len(qresults) == 0:\n", " return None\n", - " \n", + "\n", " # then use astropy to find the closest match\n", " tab = Table(qresults)\n", - " target = SkyCoord(ra, dec, unit = 'deg')\n", - " matches_pos = SkyCoord(tab['ra'], tab['dec'], unit = 'deg')\n", + " target = SkyCoord(ra, dec, unit=\"deg\")\n", + " matches_pos = SkyCoord(tab[\"ra\"], tab[\"dec\"], unit=\"deg\")\n", " d2t = target.separation(matches_pos).arcsecond\n", " match_id = np.argmin(d2t)\n", "\n", " # if it's too far away don't use it\n", - " if d2t[match_id]>rs_arcsec:\n", + " if d2t[match_id] > rs_arcsec:\n", " return None\n", " return tab[match_id]\n", "\n", + "\n", "# run the test\n", - "wisep.run_test(test_query, npoints = 10000)\n" + "wisep.run_test(test_query, npoints=10000)" ] }, { @@ -274,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -290,13 +298,14 @@ } ], "source": [ - "mqp.healpix_meta(healpix_id_key = 'hpxid_16', order = 16, is_indexed = True, nest = True)\n", - "mqp.coord_meta(ra = 'ra', dec = 'dec')\n", - "mqp.science_meta(\n", - " contact = 'C. Norris', \n", - " email = 'chuck.norris@desy.de', \n", - " description = 'allWISE infrared catalog',\n", - " reference = 'http://wise2.ipac.caltech.edu/docs/release/allwise/')" + "wisep.healpix_meta(healpix_id_key=\"hpxid_16\", order=16, is_indexed=True, nest=True)\n", + "wisep.coord_meta(ra=\"ra\", dec=\"dec\")\n", + "wisep.science_meta(\n", + " contact=\"C. Norris\",\n", + " email=\"chuck.norris@desy.de\",\n", + " description=\"allWISE infrared catalog\",\n", + " reference=\"http://wise2.ipac.caltech.edu/docs/release/allwise/\",\n", + ")" ] }, { diff --git a/notebooks/insert_example.ipynb b/notebooks/insert_example.ipynb index a1a3a67..8a48e89 100644 --- a/notebooks/insert_example.ipynb +++ b/notebooks/insert_example.ipynb @@ -48,6 +48,7 @@ "source": [ "# here we download the test data\n", "from extcats.testdata import MQC\n", + "\n", "MQC.download()" ] }, @@ -65,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -104,74 +105,97 @@ } ], "source": [ + "import pymongo\n", + "import pandas as pd\n", + "\n", + "from healpy import ang2pix\n", + "\n", "from extcats import CatalogPusher\n", "\n", "# build the pusher object and point it to the raw files.\n", "mqp = CatalogPusher.CatalogPusher(\n", - " catalog_name = 'milliquas_old', # short name of the catalog\n", - " data_source = '../testdata/milliquas/', # where to find the data\n", - " file_type = 'tdat.gz'\n", - " )\n", + " catalog_name=\"milliquas_old\", # short name of the catalog\n", + " data_source=\"../testdata/milliquas/\", # where to find the data\n", + " file_type=\"tdat.gz\",\n", + ")\n", "\n", "\n", - "# define the reader for the raw files. In this case the formatting or the raw file \n", + "# define the reader for the raw files. In this case the formatting or the raw file\n", "# is pretty ugly so we have to put quite a lot of information here.\n", "# the pandas package provides very efficient ways to read flat files and its use\n", "# is recommended. For this specific example see:\n", "# https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_table.html\n", - "catcols=['name', 'ra', 'dec', 'lii', 'bii', 'broad_type', 'rmag', \n", - " 'bmag', 'optical_flag', 'red_psf_flag', 'blue_psf_flag',\n", - " 'redshift', 'ref_name', 'ref_redshift', 'qso_prob', \n", - " 'radio_name', 'xray_name', 'alt_name_1', 'alt_name_2', 'class']\n", - "import pandas as pd\n", - "mqp.assign_file_reader(\n", - " reader_func = pd.read_table, # callable to use to read the raw_files. \n", - " read_chunks = True, # weather or not the reader process each file into smaller chunks.\n", - " names=catcols, # All other arguments are passed directly to this function.\n", - " chunksize=50000,\n", - " engine='c',\n", - " skiprows=65,\n", - " sep='|',\n", - " index_col=False,\n", - " comment='<')\n", + "catcols = [\n", + " \"name\",\n", + " \"ra\",\n", + " \"dec\",\n", + " \"lii\",\n", + " \"bii\",\n", + " \"broad_type\",\n", + " \"rmag\",\n", + " \"bmag\",\n", + " \"optical_flag\",\n", + " \"red_psf_flag\",\n", + " \"blue_psf_flag\",\n", + " \"redshift\",\n", + " \"ref_name\",\n", + " \"ref_redshift\",\n", + " \"qso_prob\",\n", + " \"radio_name\",\n", + " \"xray_name\",\n", + " \"alt_name_1\",\n", + " \"alt_name_2\",\n", + " \"class\",\n", + "]\n", "\n", + "mqp.assign_file_reader(\n", + " reader_func=pd.read_table, # callable to use to read the raw_files.\n", + " read_chunks=True, # weather or not the reader process each file into smaller chunks.\n", + " names=catcols, # All other arguments are passed directly to this function.\n", + " chunksize=50000,\n", + " engine=\"c\",\n", + " skiprows=65,\n", + " sep=\"|\",\n", + " index_col=False,\n", + " comment=\"<\",\n", + ")\n", "\n", "# now we have to define a modifier function that acts on the single documents\n", "# (dictionaries) and format them in the way they have to appear in the database.\n", "# in this case we format coordinates in the geoJSON type (this enables mongo to\n", "# support queries in spherical cooridnates), and we assign to each source its\n", "# healpix index on a grid of order 16, corresponding to ~3\" resolution.\n", - "from healpy import ang2pix\n", + "\n", + "\n", "def mqc_modifier(srcdict):\n", - " \n", " # format coordinates into geoJSON type (commented version uses 'legacy' pair):\n", " # unfortunately mongo needs the RA to be folded into -180, +180\n", - " ra=srcdict['ra'] if srcdict['ra']<180. else srcdict['ra']-360.\n", - " srcdict['pos']={\n", - " 'type': 'Point', \n", - " 'coordinates': [ra, srcdict['dec']]\n", - " }\n", - " #srcdict['pos']=[srcdict['ra'], srcdict['dec']] # This is the legacy coordinate format\n", - " \n", + " ra = srcdict[\"ra\"] if srcdict[\"ra\"] < 180.0 else srcdict[\"ra\"] - 360.0\n", + " srcdict[\"pos\"] = {\"type\": \"Point\", \"coordinates\": [ra, srcdict[\"dec\"]]}\n", + " # srcdict['pos']=[srcdict['ra'], srcdict['dec']] # This is the legacy coordinate format\n", + "\n", " # add healpix index\n", - " srcdict['hpxid_16']=int(\n", - " ang2pix(2**16, srcdict['ra'], srcdict['dec'], lonlat = True, nest = True))\n", - " \n", + " srcdict[\"hpxid_16\"] = int(\n", + " ang2pix(2**16, srcdict[\"ra\"], srcdict[\"dec\"], lonlat=True, nest=True)\n", + " )\n", + "\n", " return srcdict\n", "\n", + "\n", "mqp.assign_dict_modifier(mqc_modifier)\n", "\n", "# fill in the database, creting indexes on the position and healpix ID.\n", - "import pymongo\n", + "\n", "mqp.push_to_db(\n", - " coll_name = 'srcs', \n", - " index_on = ['hpxid_16', [('pos', pymongo.GEOSPHERE)] ] ,\n", - " index_args = [{}, {}], # specify arguments for the index creation\n", - " overwrite_coll = False, \n", - " append_to_coll = False)\n", + " coll_name=\"srcs\",\n", + " index_on=[\"hpxid_16\", [(\"pos\", pymongo.GEOSPHERE)]],\n", + " index_args=[{}, {}], # specify arguments for the index creation\n", + " overwrite_coll=False,\n", + " append_to_coll=False,\n", + ")\n", "\n", "# now print some info on the database\n", - "#mqp.info()" + "# mqp.info()" ] }, { @@ -208,80 +232,84 @@ "source": [ "# define the funtion to test coordinate based queries:\n", "import numpy as np\n", - "from healpy import ang2pix, get_all_neighbours\n", + "from healpy import get_all_neighbours\n", "from astropy.table import Table\n", "from astropy.coordinates import SkyCoord\n", "from math import radians\n", + "\n", "# define your search radius\n", - "rs_arcsec = 10.\n", + "rs_arcsec = 10.0\n", + "\n", "\n", "def test_query_healpix(ra, dec, coll):\n", - " \"\"\"query collection for the closest point within \n", + " \"\"\"query collection for the closest point within\n", " rs_arcsec of target ra, dec. It uses healpix ID\n", " to perform the search.\n", - " \n", - " The results as returned as an astropy Table. \"\"\"\n", - " \n", - " # find the index of the target pixel and its neighbours \n", - " target_pix = int( ang2pix(2**16, ra, dec, nest = True, lonlat = True) )\n", - " neighbs = get_all_neighbours(2*16, ra, dec, nest = True, lonlat = True)\n", + "\n", + " The results as returned as an astropy Table.\"\"\"\n", + "\n", + " # find the index of the target pixel and its neighbours\n", + " target_pix = int(ang2pix(2**16, ra, dec, nest=True, lonlat=True))\n", + " neighbs = get_all_neighbours(2 * 16, ra, dec, nest=True, lonlat=True)\n", "\n", " # remove non-existing neigbours (in case of E/W/N/S) and add center pixel\n", " pix_group = [int(pix_id) for pix_id in neighbs if pix_id != -1] + [target_pix]\n", - " \n", + "\n", " # query the database for sources in these pixels\n", - " qfilter = { 'hpxid_16': { '$in': pix_group } }\n", + " qfilter = {\"hpxid_16\": {\"$in\": pix_group}}\n", " qresults = [o for o in coll.find(qfilter)]\n", - " if len(qresults)==0:\n", + " if len(qresults) == 0:\n", " return None\n", - " \n", + "\n", " # then use astropy to find the closest match\n", " tab = Table(qresults)\n", - " target = SkyCoord(ra, dec, unit = 'deg')\n", - " matches_pos = SkyCoord(tab['ra'], tab['dec'], unit = 'deg')\n", + " target = SkyCoord(ra, dec, unit=\"deg\")\n", + " matches_pos = SkyCoord(tab[\"ra\"], tab[\"dec\"], unit=\"deg\")\n", " d2t = target.separation(matches_pos).arcsecond\n", " match_id = np.argmin(d2t)\n", "\n", " # if it's too far away don't use it\n", - " if d2t[match_id]>rs_arcsec:\n", + " if d2t[match_id] > rs_arcsec:\n", " return None\n", " return tab[match_id]\n", "\n", "\n", "def test_query_2dsphere(ra, dec, coll):\n", - " \"\"\"query collection for the closest point within \n", + " \"\"\"query collection for the closest point within\n", " rs_arcsec of target ra, dec. It uses mondod spherical\n", " geometry queries.\n", - " \n", - " The results as returned as an astropy Table. \"\"\"\n", - " \n", - " \n", + "\n", + " The results as returned as an astropy Table.\"\"\"\n", + "\n", " # fold the RA between -180 and 180.\n", " if ra > 180:\n", - " ra = ra - 360.\n", - " \n", + " ra = ra - 360.0\n", + "\n", " # query and return\n", - " geowithin={\"$geoWithin\": { \"$centerSphere\": [[ra, dec], radians(rs_arcsec/3600.)]}}\n", + " geowithin = {\n", + " \"$geoWithin\": {\"$centerSphere\": [[ra, dec], radians(rs_arcsec / 3600.0)]}\n", + " }\n", " qresults = [o for o in coll.find({\"pos\": geowithin})]\n", - " if len(qresults)==0:\n", + " if len(qresults) == 0:\n", " return None\n", - " \n", + "\n", " # then use astropy to find the closest match\n", " tab = Table(qresults)\n", - " target = SkyCoord(ra, dec, unit = 'deg')\n", - " matches_pos = SkyCoord(tab['ra'], tab['dec'], unit = 'deg')\n", + " target = SkyCoord(ra, dec, unit=\"deg\")\n", + " matches_pos = SkyCoord(tab[\"ra\"], tab[\"dec\"], unit=\"deg\")\n", " d2t = target.separation(matches_pos).arcsecond\n", " match_id = np.argmin(d2t)\n", "\n", " # if it's too far away don't use it\n", - " if d2t[match_id]>rs_arcsec:\n", + " if d2t[match_id] > rs_arcsec:\n", " return None\n", " return tab[match_id]\n", "\n", - "# run the test. Here we compare queries based on the \n", + "\n", + "# run the test. Here we compare queries based on the\n", "# healpix index with those based on the 2dsphere mongod support.\n", - "mqp.run_test(test_query_healpix, npoints = 1000)\n", - "mqp.run_test(test_query_2dsphere, npoints = 1000)" + "mqp.run_test(test_query_healpix, npoints=1000)\n", + "mqp.run_test(test_query_2dsphere, npoints=1000)" ] }, { @@ -313,14 +341,15 @@ } ], "source": [ - "mqp.healpix_meta(healpix_id_key = 'hpxid_16', order = 16, is_indexed = True, nest = True)\n", - "mqp.sphere2d_meta(sphere2d_key = 'pos', is_indexed = True, pos_format = 'geoJSON')\n", - "mqp.coord_meta(ra = 'ra', dec = 'dec')\n", + "mqp.healpix_meta(healpix_id_key=\"hpxid_16\", order=16, is_indexed=True, nest=True)\n", + "mqp.sphere2d_meta(sphere2d_key=\"pos\", is_indexed=True, pos_format=\"geoJSON\")\n", + "mqp.coord_meta(ra=\"ra\", dec=\"dec\")\n", "mqp.science_meta(\n", - " contact = 'C. Norris', \n", - " email = 'chuck.norris@desy.de', \n", - " description = 'compilation of AGN and Quasar',\n", - " reference = 'http://quasars.org/milliquas.htm')" + " contact=\"C. Norris\",\n", + " email=\"chuck.norris@desy.de\",\n", + " description=\"compilation of AGN and Quasar\",\n", + " reference=\"http://quasars.org/milliquas.htm\",\n", + ")" ] }, { diff --git a/notebooks/query_example.ipynb b/notebooks/query_example.ipynb index 03299e7..67a2d4a 100644 --- a/notebooks/query_example.ipynb +++ b/notebooks/query_example.ipynb @@ -49,15 +49,16 @@ "\n", "# initialize the CatalogQuery object pointing it to an existsing database\n", "mqc_query = CatalogQuery.CatalogQuery(\n", - " cat_name = 'milliquas', # name of the database\n", - " coll_name = 'srcs', # name of the collection with the sources\n", - " dbclient = None)\n", + " cat_name=\"milliquas\", # name of the database\n", + " coll_name=\"srcs\", # name of the collection with the sources\n", + " dbclient=None,\n", + ")\n", "\n", "\n", - "# specify target position (same format as the 'ra_key' and \n", + "# specify target position (same format as the 'ra_key' and\n", "# 'dec_key specified at initilization) and serach radius\n", - "target_ra, target_dec, rs = 5.458082, 16.035756, 100.\n", - "target_ra, target_dec, rs = 321.6639722, -89.48325, 100.\n" + "target_ra, target_dec, rs = 5.458082, 16.035756, 100.0\n", + "target_ra, target_dec, rs = 321.6639722, -89.48325, 100.0" ] }, { @@ -74,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -111,64 +112,101 @@ } ], "source": [ + "import matplotlib.pyplot as plt\n", + "\n", "# the 'raw' method does not require any pre-formatting of the catalog.\n", "# It first selects points within a box of radius 'box_scale' times larger than the\n", "# search radius using $gte and $lte operators, then uses the $where expression\n", "# to compute the angular distance of the sources in the box from the target.\n", - "out_raw = mqc_query.findwithin(target_ra, target_dec, rs, method = 'raw', box_scale = 2.5)\n", - "if not out_raw is None:\n", - " print (\"%d sources found around target position using the 'raw' method.\"%len(out_raw))\n", + "out_raw = mqc_query.findwithin(target_ra, target_dec, rs, method=\"raw\", box_scale=2.5)\n", + "if out_raw is not None:\n", + " print(\n", + " \"%d sources found around target position using the 'raw' method.\" % len(out_raw)\n", + " )\n", "\n", - "# the '2dsphere' method uses instead the use mongodb searches in \n", + "# the '2dsphere' method uses instead the use mongodb searches in\n", "# spherical geometry using \"$geoWithin\" and \"$centerSphere\" operators.\n", - "# it requires the catalog documents to have been assigned a geoJSON \n", + "# it requires the catalog documents to have been assigned a geoJSON\n", "# or 'legacy pair' field of type 'Point' (see insert_example notebook).\n", - "out_2dsphere = mqc_query.findwithin(target_ra, target_dec, rs, method = '2dsphere')\n", - "if not out_2dsphere is None:\n", - " print (\"%d sources found around target position using the '2dsphere' method.\"%len(out_2dsphere))\n", + "out_2dsphere = mqc_query.findwithin(target_ra, target_dec, rs, method=\"2dsphere\")\n", + "if out_2dsphere is not None:\n", + " print(\n", + " \"%d sources found around target position using the '2dsphere' method.\"\n", + " % len(out_2dsphere)\n", + " )\n", "\n", "\n", - "# finally, the healpix method can be used to speed up queries using a \n", - "# spatial prepartinioning of the data based on a HEALPix grid. In this \n", + "# finally, the healpix method can be used to speed up queries using a\n", + "# spatial prepartinioning of the data based on a HEALPix grid. In this\n", "# case, the sources in the catalog should be assigned a field containing\n", "# the ID of the healpix that contains it.\n", - "out_healpix = mqc_query.findwithin(target_ra, target_dec, rs, method = 'healpix')\n", - "if not out_healpix is None:\n", - " print (\"%d sources found around target position using the 'healpix' method.\"%len(out_healpix))\n", - "\n", - "out_healpix_square = mqc_query.findwithin(target_ra, target_dec, rs, method = 'healpix', circular = False)\n", - "if not out_healpix_square is None:\n", - " print (\"%d sources found around target position using the 'healpix' (square) method.\"%len(out_healpix_square))\n", + "out_healpix = mqc_query.findwithin(target_ra, target_dec, rs, method=\"healpix\")\n", + "if out_healpix is not None:\n", + " print(\n", + " \"%d sources found around target position using the 'healpix' method.\"\n", + " % len(out_healpix)\n", + " )\n", + "\n", + "out_healpix_square = mqc_query.findwithin(\n", + " target_ra, target_dec, rs, method=\"healpix\", circular=False\n", + ")\n", + "if out_healpix_square is not None:\n", + " print(\n", + " \"%d sources found around target position using the 'healpix' (square) method.\"\n", + " % len(out_healpix_square)\n", + " )\n", "\n", "\n", "# ======================================== #\n", "# make a plot with the query results #\n", "# ======================================== #\n", "%matplotlib notebook\n", - "import matplotlib.pyplot as plt\n", "\n", "# get a random sample from the catalog\n", - "cat_pos=[[o['ra'], o['dec']] for o in \n", - " mqc_query.src_coll.aggregate([{ '$sample': { 'size': 5000 }}])]\n", + "cat_pos = [\n", + " [o[\"ra\"], o[\"dec\"]]\n", + " for o in mqc_query.src_coll.aggregate([{\"$sample\": {\"size\": 5000}}])\n", + "]\n", "cat_ra, cat_dec = zip(*cat_pos)\n", "\n", "\n", - "fig=plt.figure()\n", - "ax=fig.add_subplot(111)#, projection=\"aitoff\")\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111) # , projection=\"aitoff\")\n", "\n", "ax.scatter(cat_ra, cat_dec, label=\"random sample\", c=\"k\", s=50, marker=\"o\", zorder=1)\n", - "ax.scatter(out_raw['ra'], out_raw['dec'], label=\"matches (RAW)\", c=\"r\", s=100, marker=\"+\")\n", - "ax.scatter(out_2dsphere['ra'], out_2dsphere['dec'], label=\"matches (2D sphere)\", c=\"b\", s=100, marker=\"x\")\n", - "ax.scatter(out_healpix['ra'], out_healpix['dec'], label=\"matches (HEALPix)\", c=\"m\", s=100, marker=\"v\")\n", "ax.scatter(\n", - "out_healpix_square['ra'], out_healpix_square['dec'], label=\"matches (HEALPix square)\", c=\"g\", s=50, marker=\"v\")\n", - "\n", - "ax.scatter(target_ra, target_dec, label='target', s=200, c='y', marker='*', zorder=0)\n", - "ax.set_xlim(target_ra-2, target_ra+2)\n", - "ax.set_ylim(target_dec-3, target_dec+3)\n", - "ax.legend(loc='best')\n", - "fig.show()\n", - " " + " out_raw[\"ra\"], out_raw[\"dec\"], label=\"matches (RAW)\", c=\"r\", s=100, marker=\"+\"\n", + ")\n", + "ax.scatter(\n", + " out_2dsphere[\"ra\"],\n", + " out_2dsphere[\"dec\"],\n", + " label=\"matches (2D sphere)\",\n", + " c=\"b\",\n", + " s=100,\n", + " marker=\"x\",\n", + ")\n", + "ax.scatter(\n", + " out_healpix[\"ra\"],\n", + " out_healpix[\"dec\"],\n", + " label=\"matches (HEALPix)\",\n", + " c=\"m\",\n", + " s=100,\n", + " marker=\"v\",\n", + ")\n", + "ax.scatter(\n", + " out_healpix_square[\"ra\"],\n", + " out_healpix_square[\"dec\"],\n", + " label=\"matches (HEALPix square)\",\n", + " c=\"g\",\n", + " s=50,\n", + " marker=\"v\",\n", + ")\n", + "\n", + "ax.scatter(target_ra, target_dec, label=\"target\", s=200, c=\"y\", marker=\"*\", zorder=0)\n", + "ax.set_xlim(target_ra - 2, target_ra + 2)\n", + "ax.set_ylim(target_dec - 3, target_dec + 3)\n", + "ax.legend(loc=\"best\")\n", + "fig.show()" ] }, { @@ -200,16 +238,16 @@ } ], "source": [ - "rawcp, rawcp_dist = mqc_query.findclosest(target_ra, target_dec, rs, method = 'raw')\n", - "s2dcp, s2d_dist = mqc_query.findclosest(target_ra, target_dec, rs, method = '2dsphere')\n", - "hpcp, hpcp_dist = mqc_query.findclosest(target_ra, target_dec, rs, method = 'healpix')\n", + "rawcp, rawcp_dist = mqc_query.findclosest(target_ra, target_dec, rs, method=\"raw\")\n", + "s2dcp, s2d_dist = mqc_query.findclosest(target_ra, target_dec, rs, method=\"2dsphere\")\n", + "hpcp, hpcp_dist = mqc_query.findclosest(target_ra, target_dec, rs, method=\"healpix\")\n", "\n", "# here we verify that all the counterparts are actually the same\n", - "print (' Database ID | cp-dist [\"]')\n", - "print (\"------------------------------------------\")\n", - "print (rawcp['_id'], \"|\", rawcp_dist)\n", - "print (s2dcp['_id'], \"|\", s2d_dist)\n", - "print (hpcp['_id'], \"|\", hpcp_dist)\n" + "print(' Database ID | cp-dist [\"]')\n", + "print(\"------------------------------------------\")\n", + "print(rawcp[\"_id\"], \"|\", rawcp_dist)\n", + "print(s2dcp[\"_id\"], \"|\", s2d_dist)\n", + "print(hpcp[\"_id\"], \"|\", hpcp_dist)" ] }, { @@ -236,12 +274,12 @@ } ], "source": [ - "raw_bool = mqc_query.binaryserach(target_ra, target_dec, rs, method = 'raw')\n", - "s2d_bool = mqc_query.binaryserach(target_ra, target_dec, rs, method = '2dsphere')\n", - "hp_bool = mqc_query.binaryserach(target_ra, target_dec, rs, method = 'healpix')\n", + "raw_bool = mqc_query.binaryserach(target_ra, target_dec, rs, method=\"raw\")\n", + "s2d_bool = mqc_query.binaryserach(target_ra, target_dec, rs, method=\"2dsphere\")\n", + "hp_bool = mqc_query.binaryserach(target_ra, target_dec, rs, method=\"healpix\")\n", "\n", "# here we verify that all the counterparts are actually the same\n", - "print (raw_bool, s2d_bool, hp_bool)" + "print(raw_bool, s2d_bool, hp_bool)" ] }, { @@ -304,17 +342,21 @@ ], "source": [ "# test te three main types of queries with the healpix method\n", - "mqc_query.test_queries(query_type = 'within', method = 'healpix', rs_arcsec = 3, npoints=1e4)\n", + "mqc_query.test_queries(query_type=\"within\", method=\"healpix\", rs_arcsec=3, npoints=1e4)\n", "\n", "# here we don't seed the rng, to avoid mongo using some cached results\n", - "mqc_query.test_queries(query_type = 'within', method = 'healpix', rs_arcsec = 3, npoints=1e4, rnd_seed = None)\n", + "mqc_query.test_queries(\n", + " query_type=\"within\", method=\"healpix\", rs_arcsec=3, npoints=1e4, rnd_seed=None\n", + ")\n", "\n", - "mqc_query.test_queries(query_type = 'closest', method = 'healpix', rs_arcsec = 3, npoints=1e4)\n", - "mqc_query.test_queries(query_type = 'binary', method = 'healpix', rs_arcsec = 3, npoints=1e4)\n", + "mqc_query.test_queries(query_type=\"closest\", method=\"healpix\", rs_arcsec=3, npoints=1e4)\n", + "mqc_query.test_queries(query_type=\"binary\", method=\"healpix\", rs_arcsec=3, npoints=1e4)\n", "\n", "# and the other query methods as well (they are much slower, since there are not indexes to support them)\n", - "mqc_query.test_queries(query_type = 'closest', method ='raw', rs_arcsec = 3, npoints=10)\n", - "mqc_query.test_queries(query_type = 'closest', method ='2dsphere', rs_arcsec = 3, npoints=100)" + "mqc_query.test_queries(query_type=\"closest\", method=\"raw\", rs_arcsec=3, npoints=10)\n", + "mqc_query.test_queries(\n", + " query_type=\"closest\", method=\"2dsphere\", rs_arcsec=3, npoints=100\n", + ")" ] }, { diff --git a/poetry.lock b/poetry.lock index fbfbdc3..a0ba7fc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -192,28 +192,28 @@ files = [ [[package]] name = "healpy" -version = "1.17.1" +version = "1.17.3" description = "Healpix tools package for Python" optional = false python-versions = ">=3.9" files = [ - {file = "healpy-1.17.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:19a5eea85f348896eb58e572ce25845cc0dc40661508b6b4b6e8fb4f34d50d74"}, - {file = "healpy-1.17.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:e06abb17b17e2ce586de37b0327dccd334d60802a4e20d7b67f349e248e6fd0f"}, - {file = "healpy-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:574c714c17a23ae21668df4587b63f25d977436be685df51a1d11be217079ee9"}, - {file = "healpy-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610fe0255a5dd72108ad9778f0ca90422ebfa34ace098cace93b470186c9f6cc"}, - {file = "healpy-1.17.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:63fbd4dbdac0d869aacb65d952ce0415c20393107fbe3ded18f682ba6b5e4a51"}, - {file = "healpy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:50b17c796fa90679d9618d6cbeb048ad4c82f226d97b0575f6f62c2ef7f8a788"}, - {file = "healpy-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80dee19bec6029df43ab606c4caefae945f787edc8a9e551a3189d437c0b52ba"}, - {file = "healpy-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b05ba7ae36708371cce9b01934d86d22d17b0a81898b7b7c83e6f99b64933b62"}, - {file = "healpy-1.17.1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:8a9db38eca26764b671156529edd6a19f9b5d5c9ed3f2bf190c8b1b93575a4ef"}, - {file = "healpy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:c66f35a77def27cfc444f1f9a36521c0a954a88eba7d11bec8c10616e0bb4a5b"}, - {file = "healpy-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378e36660d3df4ef5c85c1b0d782d5993c86daefafe0a1e4594e7f7a71792583"}, - {file = "healpy-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5ea378e683f877f70870744abfbeb900d20e43ba024074763e3999d4db5402"}, - {file = "healpy-1.17.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:26fc9a22939c04b09bdda3a9e72fb6969dd8e446b420ea7947b7e146d4c6c075"}, - {file = "healpy-1.17.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:36e4699ed00aaec7dad9d22d8de635900e4a7b1bb4e6ce2dc9c0cb3ef47e6ec1"}, - {file = "healpy-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f521714cf325bc2886c95a7cd9e6a81d4e4583c6d478b0ffbe8d08d4da7d7954"}, - {file = "healpy-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f18548572b6a702e57071b70cc9818fe7ed74edaccbab5987ff55c6e9fd9b3a"}, - {file = "healpy-1.17.1.tar.gz", hash = "sha256:6469fc9669e4cc6068c1509ba67228f215db57b3c2d6f00bd1eb481d97732e88"}, + {file = "healpy-1.17.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:13ed8e7f3204e37139d0f4fbb1d9b7d4dd73564a3972770567ee50a1fa8c0fec"}, + {file = "healpy-1.17.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:f5cfddd9891ab586fde558462c3b2e998c5d0d8ffe1bcbfb127a89265a119385"}, + {file = "healpy-1.17.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd908103b524734c5beb01741714accb9f61a567563abf1c76c99e611c286756"}, + {file = "healpy-1.17.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9792a37410605dd746508bc9cb8b3b1421d789fcb3e79cd9e3249aee8ff22920"}, + {file = "healpy-1.17.3-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b1d942184d54e1422c19fd1ea8c35eaea6cdef8c678e3bd287f5322f600db466"}, + {file = "healpy-1.17.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1d8c60405fde26362ed10eba474fd4c9c075d819c5574fd7f99cda2f827711d5"}, + {file = "healpy-1.17.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4669267121a170792416e4310b3d6f9d9819059ecd4be61b4adc443911adc57e"}, + {file = "healpy-1.17.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f27a8f897a15279a5f240bb17f24d784a69a28f0830ed00fffee5070c5aadec"}, + {file = "healpy-1.17.3-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:465e8627ffafeefff94e7705614f3fbb0c517dd4f04d33aa15bfe704c0e9352e"}, + {file = "healpy-1.17.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:7ae3632a05c588a76bcac187a8e7cbb065c4d4051af47875a0e162cd28ca2243"}, + {file = "healpy-1.17.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39577afa822c03d321211373eb18116711796762f2288ff399df8c139a7f53dc"}, + {file = "healpy-1.17.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4afac0cb7f6bebbf821fbe0dc17da5ab8dffdb60bdee9b04451b30c06d94ddd3"}, + {file = "healpy-1.17.3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:77d5cd25e6d01cada2c8e61f1a35307ff66bbd1b0620304bdeae0c606ca0e21f"}, + {file = "healpy-1.17.3-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:5a50e3db968ac5168669cd4bd8b1b8e2db34031483f731e687c6c3e55c31a294"}, + {file = "healpy-1.17.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc12ed80c985c909272736e959a4d98c8d0b7bfbe7f34accb0c00658da1d0d59"}, + {file = "healpy-1.17.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea016d3ffa69396ec145ec0f630fd2f34f659b0fe5d33d17666bc9b57c043237"}, + {file = "healpy-1.17.3.tar.gz", hash = "sha256:4b9f6ae44c6a5a2922b6542b2086d53cc3a6b51543d856d18406fb984edbec5f"}, ] [package.dependencies] @@ -237,47 +237,53 @@ files = [ [[package]] name = "mypy" -version = "1.10.0" +version = "1.13.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, + {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, + {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, + {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, + {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, + {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, + {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, + {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, + {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, + {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] @@ -351,40 +357,53 @@ files = [ [[package]] name = "pandas" -version = "2.2.2" +version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = true python-versions = ">=3.9" files = [ - {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, - {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, - {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, - {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, ] [package.dependencies] @@ -466,71 +485,70 @@ test = ["pytest", "pytest-doctestplus (>=0.7)"] [[package]] name = "pymongo" -version = "4.7.3" +version = "4.10.1" description = "Python driver for MongoDB " optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pymongo-4.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e9580b4537b3cc5d412070caabd1dabdf73fdce249793598792bac5782ecf2eb"}, - {file = "pymongo-4.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:517243b2b189c98004570dd8fc0e89b1a48363d5578b3b99212fa2098b2ea4b8"}, - {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23b1e9dabd61da1c7deb54d888f952f030e9e35046cebe89309b28223345b3d9"}, - {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03e0f9901ad66c6fb7da0d303461377524d61dab93a4e4e5af44164c5bb4db76"}, - {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a870824aa54453aee030bac08c77ebcf2fe8999400f0c2a065bebcbcd46b7f8"}, - {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd7b3d3f4261bddbb74a332d87581bc523353e62bb9da4027cc7340f6fcbebc"}, - {file = "pymongo-4.7.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d719a643ea6da46d215a3ba51dac805a773b611c641319558d8576cbe31cef8"}, - {file = "pymongo-4.7.3-cp310-cp310-win32.whl", hash = "sha256:d8b1e06f361f3c66ee694cb44326e1a2e4f93bc9c3a4849ae8547889fca71154"}, - {file = "pymongo-4.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:c450ab2f9397e2d5caa7fddeb4feb30bf719c47c13ae02c0bbb3b71bf4099c1c"}, - {file = "pymongo-4.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cc6459209e885ba097779eaa0fe7f2fa049db39ab43b1731cf8d065a4650e8"}, - {file = "pymongo-4.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e2287f1e2cc35e73cd74a4867e398a97962c5578a3991c730ef78d276ca8e46"}, - {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:413506bd48d8c31ee100645192171e4773550d7cb940b594d5175ac29e329ea1"}, - {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cc1febf17646d52b7561caa762f60bdfe2cbdf3f3e70772f62eb624269f9c05"}, - {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dfcf18a49955d50a16c92b39230bd0668ffc9c164ccdfe9d28805182b48fa72"}, - {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89872041196c008caddf905eb59d3dc2d292ae6b0282f1138418e76f3abd3ad6"}, - {file = "pymongo-4.7.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3ed97b89de62ea927b672ad524de0d23f3a6b4a01c8d10e3d224abec973fbc3"}, - {file = "pymongo-4.7.3-cp311-cp311-win32.whl", hash = "sha256:d2f52b38151e946011d888a8441d3d75715c663fc5b41a7ade595e924e12a90a"}, - {file = "pymongo-4.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:4a4cc91c28e81c0ce03d3c278e399311b0af44665668a91828aec16527082676"}, - {file = "pymongo-4.7.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cb30c8a78f5ebaca98640943447b6a0afcb146f40b415757c9047bf4a40d07b4"}, - {file = "pymongo-4.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9cf2069f5d37c398186453589486ea98bb0312214c439f7d320593b61880dc05"}, - {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3564f423958fced8a8c90940fd2f543c27adbcd6c7c6ed6715d847053f6200a0"}, - {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a8af8a38fa6951fff73e6ff955a6188f829b29fed7c5a1b739a306b4aa56fe8"}, - {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a0e81c8dba6d825272867d487f18764cfed3c736d71d7d4ff5b79642acbed42"}, - {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88fc1d146feabac4385ea8ddb1323e584922922641303c8bf392fe1c36803463"}, - {file = "pymongo-4.7.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4225100b2c5d1f7393d7c5d256ceb8b20766830eecf869f8ae232776347625a6"}, - {file = "pymongo-4.7.3-cp312-cp312-win32.whl", hash = "sha256:5f3569ed119bf99c0f39ac9962fb5591eff02ca210fe80bb5178d7a1171c1b1e"}, - {file = "pymongo-4.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:eb383c54c0c8ba27e7712b954fcf2a0905fee82a929d277e2e94ad3a5ba3c7db"}, - {file = "pymongo-4.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a46cffe91912570151617d866a25d07b9539433a32231ca7e7cf809b6ba1745f"}, - {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c3cba427dac50944c050c96d958c5e643c33a457acee03bae27c8990c5b9c16"}, - {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a5fd893edbeb7fa982f8d44b6dd0186b6cd86c89e23f6ef95049ff72bffe46"}, - {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c168a2fadc8b19071d0a9a4f85fe38f3029fe22163db04b4d5c046041c0b14bd"}, - {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c59c2c9e70f63a7f18a31e367898248c39c068c639b0579623776f637e8f482"}, - {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d08165fd82c89d372e82904c3268bd8fe5de44f92a00e97bb1db1785154397d9"}, - {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:397fed21afec4fdaecf72f9c4344b692e489756030a9c6d864393e00c7e80491"}, - {file = "pymongo-4.7.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f903075f8625e2d228f1b9b9a0cf1385f1c41e93c03fd7536c91780a0fb2e98f"}, - {file = "pymongo-4.7.3-cp37-cp37m-win32.whl", hash = "sha256:8ed1132f58c38add6b6138b771d0477a3833023c015c455d9a6e26f367f9eb5c"}, - {file = "pymongo-4.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8d00a5d8fc1043a4f641cbb321da766699393f1b6f87c70fae8089d61c9c9c54"}, - {file = "pymongo-4.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9377b868c38700c7557aac1bc4baae29f47f1d279cc76b60436e547fd643318c"}, - {file = "pymongo-4.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da4a6a7b4f45329bb135aa5096823637bd5f760b44d6224f98190ee367b6b5dd"}, - {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:487e2f9277f8a63ac89335ec4f1699ae0d96ebd06d239480d69ed25473a71b2c"}, - {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db3d608d541a444c84f0bfc7bad80b0b897e0f4afa580a53f9a944065d9b633"}, - {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e90af2ad3a8a7c295f4d09a2fbcb9a350c76d6865f787c07fe843b79c6e821d1"}, - {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e28feb18dc559d50ededba27f9054c79f80c4edd70a826cecfe68f3266807b3"}, - {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f21ecddcba2d9132d5aebd8e959de8d318c29892d0718420447baf2b9bccbb19"}, - {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:26140fbb3f6a9a74bd73ed46d0b1f43d5702e87a6e453a31b24fad9c19df9358"}, - {file = "pymongo-4.7.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:94baa5fc7f7d22c3ce2ac7bd92f7e03ba7a6875f2480e3b97a400163d6eaafc9"}, - {file = "pymongo-4.7.3-cp38-cp38-win32.whl", hash = "sha256:92dd247727dd83d1903e495acc743ebd757f030177df289e3ba4ef8a8c561fad"}, - {file = "pymongo-4.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:1c90c848a5e45475731c35097f43026b88ef14a771dfd08f20b67adc160a3f79"}, - {file = "pymongo-4.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f598be401b416319a535c386ac84f51df38663f7a9d1071922bda4d491564422"}, - {file = "pymongo-4.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:35ba90477fae61c65def6e7d09e8040edfdd3b7fd47c3c258b4edded60c4d625"}, - {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aa8735955c70892634d7e61b0ede9b1eefffd3cd09ccabee0ffcf1bdfe62254"}, - {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82a97d8f7f138586d9d0a0cff804a045cdbbfcfc1cd6bba542b151e284fbbec5"}, - {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de3b9db558930efab5eaef4db46dcad8bf61ac3ddfd5751b3e5ac6084a25e366"}, - {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0e149217ef62812d3c2401cf0e2852b0c57fd155297ecc4dcd67172c4eca402"}, - {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3a8a1ef4a824f5feb793b3231526d0045eadb5eb01080e38435dfc40a26c3e5"}, - {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d14e5e89a4be1f10efc3d9dcb13eb7a3b2334599cb6bb5d06c6a9281b79c8e22"}, - {file = "pymongo-4.7.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6bfa29f032fd4fd7b129520f8cdb51ab71d88c2ba0567cccd05d325f963acb5"}, - {file = "pymongo-4.7.3-cp39-cp39-win32.whl", hash = "sha256:1421d0bd2ce629405f5157bd1aaa9b83f12d53a207cf68a43334f4e4ee312b66"}, - {file = "pymongo-4.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:f7ee974f8b9370a998919c55b1050889f43815ab588890212023fecbc0402a6d"}, - {file = "pymongo-4.7.3.tar.gz", hash = "sha256:6354a66b228f2cd399be7429685fb68e07f19110a3679782ecb4fdb68da03831"}, + {file = "pymongo-4.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e699aa68c4a7dea2ab5a27067f7d3e08555f8d2c0dc6a0c8c60cfd9ff2e6a4b1"}, + {file = "pymongo-4.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:70645abc714f06b4ad6b72d5bf73792eaad14e3a2cfe29c62a9c81ada69d9e4b"}, + {file = "pymongo-4.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae2fd94c9fe048c94838badcc6e992d033cb9473eb31e5710b3707cba5e8aee2"}, + {file = "pymongo-4.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ded27a4a5374dae03a92e084a60cdbcecd595306555bda553b833baf3fc4868"}, + {file = "pymongo-4.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ecc2455e3974a6c429687b395a0bc59636f2d6aedf5785098cf4e1f180f1c71"}, + {file = "pymongo-4.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920fee41f7d0259f5f72c1f1eb331bc26ffbdc952846f9bd8c3b119013bb52c"}, + {file = "pymongo-4.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0a15665b2d6cf364f4cd114d62452ce01d71abfbd9c564ba8c74dcd7bbd6822"}, + {file = "pymongo-4.10.1-cp310-cp310-win32.whl", hash = "sha256:29e1c323c28a4584b7095378ff046815e39ff82cdb8dc4cc6dfe3acf6f9ad1f8"}, + {file = "pymongo-4.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:88dc4aa45f8744ccfb45164aedb9a4179c93567bbd98a33109d7dc400b00eb08"}, + {file = "pymongo-4.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:57ee6becae534e6d47848c97f6a6dff69e3cce7c70648d6049bd586764febe59"}, + {file = "pymongo-4.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6f437a612f4d4f7aca1812311b1e84477145e950fdafe3285b687ab8c52541f3"}, + {file = "pymongo-4.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a970fd3117ab40a4001c3dad333bbf3c43687d90f35287a6237149b5ccae61d"}, + {file = "pymongo-4.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c4d0e7cd08ef9f8fbf2d15ba281ed55604368a32752e476250724c3ce36c72e"}, + {file = "pymongo-4.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca6f700cff6833de4872a4e738f43123db34400173558b558ae079b5535857a4"}, + {file = "pymongo-4.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cec237c305fcbeef75c0bcbe9d223d1e22a6e3ba1b53b2f0b79d3d29c742b45b"}, + {file = "pymongo-4.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3337804ea0394a06e916add4e5fac1c89902f1b6f33936074a12505cab4ff05"}, + {file = "pymongo-4.10.1-cp311-cp311-win32.whl", hash = "sha256:778ac646ce6ac1e469664062dfe9ae1f5c9961f7790682809f5ec3b8fda29d65"}, + {file = "pymongo-4.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:9df4ab5594fdd208dcba81be815fa8a8a5d8dedaf3b346cbf8b61c7296246a7a"}, + {file = "pymongo-4.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fbedc4617faa0edf423621bb0b3b8707836687161210d470e69a4184be9ca011"}, + {file = "pymongo-4.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7bd26b2aec8ceeb95a5d948d5cc0f62b0eb6d66f3f4230705c1e3d3d2c04ec76"}, + {file = "pymongo-4.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb104c3c2a78d9d85571c8ac90ec4f95bca9b297c6eee5ada71fabf1129e1674"}, + {file = "pymongo-4.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4924355245a9c79f77b5cda2db36e0f75ece5faf9f84d16014c0a297f6d66786"}, + {file = "pymongo-4.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11280809e5dacaef4971113f0b4ff4696ee94cfdb720019ff4fa4f9635138252"}, + {file = "pymongo-4.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5d55f2a82e5eb23795f724991cac2bffbb1c0f219c0ba3bf73a835f97f1bb2e"}, + {file = "pymongo-4.10.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e974ab16a60be71a8dfad4e5afccf8dd05d41c758060f5d5bda9a758605d9a5d"}, + {file = "pymongo-4.10.1-cp312-cp312-win32.whl", hash = "sha256:544890085d9641f271d4f7a47684450ed4a7344d6b72d5968bfae32203b1bb7c"}, + {file = "pymongo-4.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:dcc07b1277e8b4bf4d7382ca133850e323b7ab048b8353af496d050671c7ac52"}, + {file = "pymongo-4.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:90bc6912948dfc8c363f4ead54d54a02a15a7fee6cfafb36dc450fc8962d2cb7"}, + {file = "pymongo-4.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:594dd721b81f301f33e843453638e02d92f63c198358e5a0fa8b8d0b1218dabc"}, + {file = "pymongo-4.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0783e0c8e95397c84e9cf8ab092ab1e5dd7c769aec0ef3a5838ae7173b98dea0"}, + {file = "pymongo-4.10.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fb6a72e88df46d1c1040fd32cd2d2c5e58722e5d3e31060a0393f04ad3283de"}, + {file = "pymongo-4.10.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e3a593333e20c87415420a4fb76c00b7aae49b6361d2e2205b6fece0563bf40"}, + {file = "pymongo-4.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72e2ace7456167c71cfeca7dcb47bd5dceda7db2231265b80fc625c5e8073186"}, + {file = "pymongo-4.10.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ad05eb9c97e4f589ed9e74a00fcaac0d443ccd14f38d1258eb4c39a35dd722b"}, + {file = "pymongo-4.10.1-cp313-cp313-win32.whl", hash = "sha256:ee4c86d8e6872a61f7888fc96577b0ea165eb3bdb0d841962b444fa36001e2bb"}, + {file = "pymongo-4.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:45ee87a4e12337353242bc758accc7fb47a2f2d9ecc0382a61e64c8f01e86708"}, + {file = "pymongo-4.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:442ca247f53ad24870a01e80a71cd81b3f2318655fd9d66748ee2bd1b1569d9e"}, + {file = "pymongo-4.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23e1d62df5592518204943b507be7b457fb8a4ad95a349440406fd42db5d0923"}, + {file = "pymongo-4.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6131bc6568b26e7495a9f3ef2b1700566b76bbecd919f4472bfe90038a61f425"}, + {file = "pymongo-4.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdeba88c540c9ed0338c0b2062d9f81af42b18d6646b3e6dda05cf6edd46ada9"}, + {file = "pymongo-4.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a624d752dd3c89d10deb0ef6431559b6d074703cab90a70bb849ece02adc6b"}, + {file = "pymongo-4.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba164e73fdade9b4614a2497321c5b7512ddf749ed508950bdecc28d8d76a2d9"}, + {file = "pymongo-4.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9235fa319993405ae5505bf1333366388add2e06848db7b3deee8f990b69808e"}, + {file = "pymongo-4.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4a65567bd17d19f03157c7ec992c6530eafd8191a4e5ede25566792c4fe3fa2"}, + {file = "pymongo-4.10.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f1945d48fb9b8a87d515da07f37e5b2c35b364a435f534c122e92747881f4a7c"}, + {file = "pymongo-4.10.1-cp38-cp38-win32.whl", hash = "sha256:345f8d340802ebce509f49d5833cc913da40c82f2e0daf9f60149cacc9ca680f"}, + {file = "pymongo-4.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:3a70d5efdc0387ac8cd50f9a5f379648ecfc322d14ec9e1ba8ec957e5d08c372"}, + {file = "pymongo-4.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15b1492cc5c7cd260229590be7218261e81684b8da6d6de2660cf743445500ce"}, + {file = "pymongo-4.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95207503c41b97e7ecc7e596d84a61f441b4935f11aa8332828a754e7ada8c82"}, + {file = "pymongo-4.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb99f003c720c6d83be02c8f1a7787c22384a8ca9a4181e406174db47a048619"}, + {file = "pymongo-4.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2bc1ee4b1ca2c4e7e6b7a5e892126335ec8d9215bcd3ac2fe075870fefc3358"}, + {file = "pymongo-4.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93a0833c10a967effcd823b4e7445ec491f0bf6da5de0ca33629c0528f42b748"}, + {file = "pymongo-4.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f56707497323150bd2ed5d63067f4ffce940d0549d4ea2dfae180deec7f9363"}, + {file = "pymongo-4.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:409ab7d6c4223e5c85881697f365239dd3ed1b58f28e4124b846d9d488c86880"}, + {file = "pymongo-4.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dac78a650dc0637d610905fd06b5fa6419ae9028cf4d04d6a2657bc18a66bbce"}, + {file = "pymongo-4.10.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1ec3fa88b541e0481aff3c35194c9fac96e4d57ec5d1c122376000eb28c01431"}, + {file = "pymongo-4.10.1-cp39-cp39-win32.whl", hash = "sha256:e0e961923a7b8a1c801c43552dcb8153e45afa41749d9efbd3a6d33f45489f7a"}, + {file = "pymongo-4.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:dabe8bf1ad644e6b93f3acf90ff18536d94538ca4d27e583c6db49889e98e48f"}, + {file = "pymongo-4.10.1.tar.gz", hash = "sha256:a9de02be53b6bb98efe0b9eda84ffa1ec027fcb23a2de62c4f941d9a2f2f3330"}, ] [package.dependencies] @@ -538,22 +556,23 @@ dnspython = ">=1.16.0,<3.0.0" [package.extras] aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] -encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] +docs = ["furo (==2023.9.10)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-autobuild (>=2020.9.1)", "sphinx-rtd-theme (>=2,<3)", "sphinxcontrib-shellcheck (>=1,<2)"] +encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.10.0,<2.0.0)"] gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] snappy = ["python-snappy"] -test = ["pytest (>=7)"] +test = ["pytest (>=8.2)", "pytest-asyncio (>=0.24.0)"] zstd = ["zstandard"] [[package]] name = "pytest" -version = "8.2.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -561,7 +580,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] @@ -694,13 +713,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.4" +version = "4.67.0" description = "Fast, Extensible Progress Meter" optional = true python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, + {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, + {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, ] [package.dependencies] @@ -708,6 +727,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"]