diff --git a/clinica/pipelines/statistics_surface/_inputs.py b/clinica/pipelines/statistics_surface/_inputs.py new file mode 100644 index 000000000..755d07b31 --- /dev/null +++ b/clinica/pipelines/statistics_surface/_inputs.py @@ -0,0 +1,171 @@ +"""This file contains functions for loading data from disk +and performing some checks on them. +""" +from os import PathLike +from pathlib import Path +from typing import Dict, Tuple + +import numpy as np +import pandas as pd +from nilearn.surface import Mesh + +TSV_FIRST_COLUMN = "participant_id" +TSV_SECOND_COLUMN = "session_id" + + +def _read_and_check_tsv_file(tsv_file: PathLike) -> pd.DataFrame: + """This function reads the TSV file provided and performs some basic checks. + + Parameters + ---------- + tsv_file : PathLike + Path to the TSV file to open. + + Returns + ------- + tsv_data : pd.DataFrame + DataFrame obtained from the file. + """ + try: + return pd.read_csv(tsv_file, sep="\t").set_index( + [TSV_FIRST_COLUMN, TSV_SECOND_COLUMN] + ) + except FileNotFoundError: + raise FileNotFoundError(f"File {tsv_file} does not exist.") + except KeyError: + raise ValueError( + f"The TSV data should have at least two columns: {TSV_FIRST_COLUMN} and {TSV_SECOND_COLUMN}" + ) + + +def _get_t1_freesurfer_custom_file_template(base_dir: PathLike) -> str: + """Returns a Template for the path to the desired surface file. + + Parameters + ---------- + base_dir : PathLike + Base directory to seach for the template. + + Returns + ------- + template_path : str + Path to the t1 freesurfer template. + """ + return str(base_dir) + ( + "/%(subject)s/%(session)s/t1/freesurfer_cross_sectional/%(subject)s_%(session)s" + "/surf/%(hemi)s.thickness.fwhm%(fwhm)s.fsaverage.mgh" + ) + + +def _build_thickness_array( + input_dir: PathLike, + surface_file: str, + df: pd.DataFrame, + fwhm: float, +) -> np.ndarray: + """This function builds the cortical thickness array. + + Parameters + ---------- + input_dir : PathLike + Input directory. + + surface_file : str + Template for the path to the surface file of interest. + + df : pd.DataFrame + Subjects DataFrame. + + fwhm : float + Smoothing parameter only used to retrieve the right surface file. + + Returns + ------- + thickness : np.ndarray + Cortical thickness. Hemispheres and subjects are stacked. + """ + from nibabel.freesurfer.mghformat import load + + thickness = [] + for idx, row in df.iterrows(): + subject = row[TSV_FIRST_COLUMN] + session = row[TSV_SECOND_COLUMN] + parts = [] + for hemi in ["lh", "rh"]: + query = {"subject": subject, "session": session, "fwhm": fwhm, "hemi": hemi} + parts.append( + load(str(Path(input_dir) / Path(surface_file % query))).get_fdata() + ) + combined = np.vstack(parts) + thickness.append(combined.flatten()) + thickness = np.vstack(thickness) + if thickness.shape[0] != len(df): + raise ValueError( + f"Unexpected shape for thickness array : {thickness.shape}. " + f"Expected {len(df)} rows." + ) + return thickness + + +def _get_average_surface(fsaverage_path: PathLike) -> Tuple[Dict, Mesh]: + """This function extracts the average surface and the average mesh + from the path to the fsaverage templates. + + .. note:: + + Note that the average surface is returned as a dictionary + with 'coord' and 'tri' as keys, while the average mesh is + returned as a Nilearn Mesh object (basically a NamedTuple + with 'coordinates' and 'faces' attributes). The surface + isn't returned as a Nilearn Surface object for compatibility + with BrainStats. + + .. warning:: + + There is an issue with faces having a value of 0 as index. + This is most likely a bug in BrainStat as MATLAB indexing + starts at 1 while Python starts at zero. + + Parameters + ---------- + fsaverage_path : PathLike + Path to the fsaverage templates. + + Returns + ------- + average_surface : dict + Average surface as a dictionary for BrainStat compatibility. + + average_mesh : nilearn.surface.Mesh + Average mesh as a Nilearn Mesh object. + """ + import copy + + from nilearn.surface import Mesh, load_surf_mesh + + meshes = [ + load_surf_mesh(str(fsaverage_path / Path(f"{hemi}.pial"))) + for hemi in ["lh", "rh"] + ] + coordinates = np.vstack([mesh.coordinates for mesh in meshes]) + faces = np.vstack( + [meshes[0].faces, meshes[1].faces + meshes[0].coordinates.shape[0]] + ) + average_mesh = Mesh( + coordinates=coordinates, + faces=copy.deepcopy(faces), + ) + ################## + # UGLY HACK !!! Need investigation + ################## + # Uncomment the following line if getting an error + # with negative values in bincount in Brainstat. + # Not sure, but might be a bug in BrainStat... + # + faces += 1 + ################# + average_surface = { + "coord": coordinates, + "tri": faces, + } + return average_surface, average_mesh diff --git a/clinica/pipelines/statistics_surface/_model.py b/clinica/pipelines/statistics_surface/_model.py new file mode 100644 index 000000000..78fe92e32 --- /dev/null +++ b/clinica/pipelines/statistics_surface/_model.py @@ -0,0 +1,1099 @@ +import abc +import warnings +from dataclasses import dataclass +from functools import reduce +from os import PathLike +from pathlib import Path +from string import Template +from typing import Callable, Dict, List, Optional, Union + +import numpy as np +import pandas as pd +from brainstat.stats.SLM import SLM +from brainstat.stats.terms import FixedEffect +from nilearn.surface import Mesh + +from clinica.utils.stream import cprint + +MISSING_TERM_ERROR_MSG = Template( + "Term ${term} from the design matrix is not in the columns of the " + "provided TSV file. Please make sure that there is no typo." +) + + +def _print_clusters(model: SLM, threshold: float) -> None: + """This function prints the results related to total number + of clusters, as well as the significative clusters. + + Parameters + ---------- + model : brainstat.stats.SLM + Fitted SLM model. + + threshold : float + Cluster defining threshold. + """ + cprint("#" * 40) + cprint("After correction (Cluster-wise Correction for Multiple Comparisons): ") + df = model.P["clus"][0] + cprint(df) + cprint(f"Clusters found: {len(df)}") + cprint( + f"Significative clusters (after correction): {len(df[df['P'] <= threshold])}" + ) + + +def _check_column_in_df(df: pd.DataFrame, column: str) -> None: + """Checks if the provided column name is in the provided DataFrame. + Raises a ValueError if not. + + Parameters + ---------- + df : pd.DataFrame + DataFrame to analyze. + + column : str + Name of the column to check. + """ + if column not in df.columns: + raise ValueError(MISSING_TERM_ERROR_MSG.safe_substitute(term=column)) + + +def _categorical_column(df: pd.DataFrame, column: str) -> bool: + """Returns `True` if the column is categorical and `False` otherwise. + + Parameters + ---------- + df : pd.DataFrame + The DataFrame to analyze. + + column : str + The name of the column to check. + + Returns + ------- + bool : + `True` if the column contains categorical values, `False` otherwise. + """ + return not df[column].dtype.name.startswith("float") + + +def _build_model(design_matrix: str, df: pd.DataFrame) -> FixedEffect: + """Build a brainstat model from the design matrix in + string format. + + This function assumes that the design matrix is formatted + in the following way: + + 1 + factor_1 + factor_2 + ... + + Or: + + factor_1 + factor_2 + ... + + in the latter case the intercept will be added automatically. + + Parameters + ---------- + design_matrix : str + Design matrix specified as a string. + + df : pd.DataFrame + Subjects DataFrame. + + Returns + ------- + model : FixedEffect + BrainStats model. + """ + if len(design_matrix) == 0: + raise ValueError("Design matrix cannot be empty.") + if "+" in design_matrix: + terms = [_.strip() for _ in design_matrix.split("+")] + else: + terms = [design_matrix.strip()] + model = [] + for term in terms: + # Intercept is automatically included in brainstat + if term == "1": + continue + # Handles the interaction effects + if "*" in term: + sub_terms = [_.strip() for _ in term.split("*")] + model_term = reduce( + lambda x, y: x * y, [_build_model_term(_, df) for _ in sub_terms] + ) + else: + model_term = _build_model_term(term, df) + model.append(model_term) + return reduce(lambda x, y: x + y, model) + + +def _build_model_term( + term: str, + df: pd.DataFrame, + add_intercept: Optional[bool] = True, +) -> FixedEffect: + """Builds a BrainStats model term from the subjects + DataFrame and a column name. + + Parameters + ---------- + term : str + The name of the column of the DataFrame to be used. + + df : pd.DataFrame + The subjects DataFrame. + + add_intercept : bool + If `True`, adds an intercept term. + + Returns + ------- + FixedEffect : + BrainStats model term. + """ + return FixedEffect(df[term], add_intercept=add_intercept) + + +class GLM: + """This class implements the functionalities common to all GLM models + used in the Clinica SurfaceStatistics pipeline. + + Attributes + ---------- + design : str + The design matrix specified in string format. + If this contains a "*", it will be interpreted as an interaction effect. + + df : pd.DataFrame + The subjects DataFrame. + + feature_label : str + The label used for building output filenames. + + contrast : str + The contrast specified in string format. + + fwhm : int, optional + The smoothing FWHM. This is used in the output file names. + Default=20. + + threshold_uncorrected_pvalue : float, optional + The threshold to be used with uncorrected P-values. Default=0.001. + + threshold_corrected_pvalue : float, optional + The threshold to be used with corrected P-values. Default=0.05. + + cluster_threshold : float, optional + The threshold to be used to declare clusters as significant. Default=0.001. + """ + + def __init__( + self, + design: str, + df: pd.DataFrame, + feature_label: str, + contrast: str, + fwhm: Optional[int] = 20, + threshold_uncorrected_pvalue: Optional[float] = 0.001, + threshold_corrected_pvalue: Optional[float] = 0.05, + cluster_threshold: Optional[float] = 0.001, + ): + self._two_tailed = False + self._correction = ["fdr", "rft"] + self.df = df + self.feature_label = feature_label + self.fwhm = fwhm + self.threshold_uncorrected_pvalue = threshold_uncorrected_pvalue + self.threshold_corrected_pvalue = threshold_corrected_pvalue + self.cluster_threshold = cluster_threshold + self.results_ = None + self.slm_models_ = None + self.contrasts = dict() + self.filenames = dict() + self.model = _build_model(design, df) + self.build_contrasts(contrast) + + @property + def contrast_names(self) -> List[str]: + if self.contrasts is not None: + return list(self.contrasts.keys()) + return list() + + @property + def results(self): + if self._is_fitted(): + return self.results_ + + @abc.abstractmethod + def build_contrasts(self, contrast: str): + """Build the contrasts from the provided contrast in string format. + + .. note:: + This method needs to be implemented in subclasses. + + Parameters + ---------- + contrast : str + Contrast in string format. + """ + pass + + @abc.abstractmethod + def filename_root(self, contrast: str): + """Returns the output file name root for the provided contrast. + + .. note:: + This method needs to be implemented in subclasses. + + Parameters + ---------- + contrast : str + Contrast for which to get the output filename. + """ + pass + + def _is_fitted(self) -> bool: + return self.results_ is not None + + def fit( + self, data: np.ndarray, surface: Dict, mask: Optional[np.ndarray] = None + ) -> None: + """Fit the GLM model instance. + + Parameters + ---------- + data : np.ndarray + The data on which to fit the GLM model. + + surface : dict + The Brainstat surface on which to fit the GLM model. + + mask : np.ndarray, optional + The mask to be used to mask the data. Default=None. + """ + if mask is None: + mask = data[0, :] > 0 + self.results_ = dict() + self.slm_models_ = dict() + for contrast_name, contrast in self.contrasts.items(): + slm_model = SLM( + self.model, + contrast=contrast, + surf=surface, + mask=mask, + two_tailed=self._two_tailed, + correction=self._correction, + cluster_threshold=self.cluster_threshold, + ) + cprint( + msg=f"Fitting the GLM model with contrast {contrast_name}...", + lvl="info", + ) + slm_model.fit(data) + _print_clusters(slm_model, self.threshold_corrected_pvalue) + self.results_[contrast_name] = StatisticsResults.from_slm_model( + slm_model, + mask, + self.threshold_uncorrected_pvalue, + self.threshold_corrected_pvalue, + ) + self.slm_models_[contrast_name] = slm_model + + def save_results(self, output_dir: PathLike, method: Union[str, List[str]]) -> None: + """Save results to the provided output directory. + + Parameters + ---------- + output_dir : PathLike + The output directory in which to write the results. + + method : str or List[str] + The method(s) to write the results. + """ + if not self._is_fitted(): + raise ValueError( + "GLM model needs to be fitted before accessing the results." + ) + if isinstance(method, str): + method = [method] + for contrast, result in self.results_.items(): + result_serializer = StatisticsResultsSerializer( + Path(output_dir) / Path(self.filename_root(contrast)) + ) + for meth in method: + result_serializer.save(result, meth) + + def plot_results( + self, + output_dir: PathLike, + method: Union[str, List[str]], + mesh: Mesh, + ) -> None: + """Plot results to the provided directory. + + Parameters + ---------- + output_dir : PathLike + The output directory in which to write the plot files. + + method : str or List[str] + The method(s) to make the plots. + + mesh : nilearn.surface.Mesh + The mesh on which to plot the result data. + """ + if not self._is_fitted(): + raise ValueError( + "GLM model needs to be fitted before accessing the results." + ) + if isinstance(method, str): + method = [method] + for contrast, result in self.results_.items(): + plotter = StatisticsResultsPlotter( + Path(output_dir) / Path(self.filename_root(contrast)), mesh + ) + for meth in method: + plotter.plot(result, meth) + + +class CorrelationGLM(GLM): + """Class implementing the correlation type GLM model. + + Attributes + ---------- + See documentation for `GLM` class. + + group_label : str, optinal + The label to use for group GLM models. Default=None. + """ + + def __init__( + self, + design: str, + df: pd.DataFrame, + feature_label: str, + contrast: str, + group_label: Optional[str], + fwhm: Optional[int] = 20, + threshold_uncorrected_pvalue: Optional[float] = 0.001, + threshold_corrected_pvalue: Optional[float] = 0.05, + cluster_threshold: Optional[float] = 0.001, + ): + self.with_interaction = False + self.absolute_contrast_name = None + self.contrast_sign = None + self.group_label = group_label + super().__init__( + design, + df, + feature_label, + contrast, + fwhm, + threshold_uncorrected_pvalue, + threshold_corrected_pvalue, + cluster_threshold, + ) + + def build_contrasts(self, contrast: str): + """Build the contrast from the string specification. + + Parameters + ---------- + contrast : str + The contrast to build. + """ + absolute_contrast_name = contrast + contrast_sign = "positive" + if contrast.startswith("-"): + absolute_contrast_name = contrast[1:].lstrip() + contrast_sign = "negative" + built_contrast = self.df[absolute_contrast_name] + if contrast_sign == "negative": + built_contrast *= -1 + self.contrasts[contrast] = built_contrast + self.absolute_contrast_name = absolute_contrast_name + self.contrast_sign = contrast_sign + + def filename_root(self, contrast: str): + """Build the filename root part from class attributes and provided contrast. + + Parameters + ---------- + contrast : str + The contrast to use for building the filename. + """ + if contrast not in self.contrasts: + raise ValueError(f"Unknown contrast {contrast}.") + return ( + f"group-{self.group_label}_correlation-{self.absolute_contrast_name}" + f"-{self.contrast_sign}_measure-{self.feature_label}_fwhm-{self.fwhm}" + ) + + +class GroupGLM(GLM): + """Class implementing group GLM models. + + Attributes + ---------- + See documentation for `GLM` class. + + group_label : str, optional + The Label to use for group GLM models. Default="group". + """ + + def __init__( + self, + design: str, + df: pd.DataFrame, + feature_label: str, + contrast: str, + group_label: Optional[str] = "group", + fwhm: Optional[int] = 20, + threshold_uncorrected_pvalue: Optional[float] = 0.001, + threshold_corrected_pvalue: Optional[float] = 0.05, + cluster_threshold: Optional[float] = 0.001, + ): + self.with_interaction = False + self.group_label = group_label + super().__init__( + design, + df, + feature_label, + contrast, + fwhm, + threshold_uncorrected_pvalue, + threshold_corrected_pvalue, + cluster_threshold, + ) + + def build_contrasts(self, contrast: str): + """Build the contrast from the string specification. + + Parameters + ---------- + contrast : str + The contrast to build. + """ + _check_column_in_df(self.df, contrast) + if not _categorical_column(self.df, contrast): + raise ValueError( + "Contrast should refer to a categorical variable for group comparison. " + "Please select 'correlation' for 'glm_type' otherwise." + ) + group_values = np.unique(self.df[contrast]) + for contrast_type, (i, j) in zip(["positive", "negative"], [(0, 1), (1, 0)]): + contrast_name = f"{group_values[j]}-lt-{group_values[i]}" + self.contrasts[contrast_name] = ( + self.df[contrast] == group_values[i] + ).astype(int) - (self.df[contrast] == group_values[j]).astype(int) + + def filename_root(self, contrast: str): + """Build the filename root part from class attributes and provided contrast. + + Parameters + ---------- + contrast : str + The contrast to use for building the filename. + """ + if contrast not in self.contrasts: + raise ValueError(f"Unknown contrast {contrast}.") + return f"group-{self.group_label}_{contrast}_measure-{self.feature_label}_fwhm-{self.fwhm}" + + +class GroupGLMWithInteraction(GroupGLM): + """This class implements a GLM model for group comparison with + interaction effects. + + Attributes + ---------- + See attributes of parent class `GroupGLM`. + """ + + def __init__( + self, + design: str, + df: pd.DataFrame, + feature_label: str, + contrast: str, + group_label: Optional[str] = "group", + fwhm: Optional[int] = 20, + threshold_uncorrected_pvalue: Optional[float] = 0.001, + threshold_corrected_pvalue: Optional[float] = 0.05, + cluster_threshold: Optional[float] = 0.001, + ): + super().__init__( + design, + df, + feature_label, + contrast, + group_label, + fwhm, + threshold_uncorrected_pvalue, + threshold_corrected_pvalue, + cluster_threshold, + ) + self.with_interaction = True + warnings.warn( + "You included interaction as covariate in your model, " + "please carefully check the format of your tsv files." + ) + + def build_contrasts(self, contrast: str): + """Build the contrast from the string specification. + + Parameters + ---------- + contrast : str + The contrast to build. + """ + contrast_elements = [_.strip() for _ in contrast.split("*")] + for contrast_element in contrast_elements: + _check_column_in_df(self.df, contrast_element) + categorical = [_categorical_column(self.df, _) for _ in contrast_elements] + if len(contrast_elements) != 2 or sum(categorical) != 1: + raise ValueError( + "The contrast must be an interaction between one continuous " + "variable and one categorical variable. Your contrast contains " + f"the following variables : {contrast_elements}" + ) + idx = 0 if categorical[0] else 1 + categorical_contrast = contrast_elements[idx] + continue_contrast = contrast_elements[(idx + 1) % 2] + group_values = np.unique(self.df[categorical_contrast]) + built_contrast = self.df[continue_contrast].where( + self.df[categorical_contrast] == group_values[0], 0 + ) - self.df[continue_contrast].where( + self.df[categorical_contrast] == group_values[1], 0 + ) + self.contrasts[contrast] = built_contrast + + def filename_root(self, contrast: str): + """Build the filename root part from class attributes and provided contrast. + + Parameters + ---------- + contrast : str + The contrast to use for building the filename. + """ + if contrast not in self.contrasts: + raise ValueError(f"Unknown contrast {contrast}.") + return f"interaction-{contrast}_measure-{self.feature_label}_fwhm-{self.fwhm}" + + +def create_glm_model( + glm_type: str, + design: str, + df: pd.DataFrame, + contrast: str, + feature_label: str, + group_label: Optional[str] = "group", + fwhm: Optional[int] = 20, + threshold_uncorrected_pvalue: Optional[float] = 0.001, + threshold_corrected_pvalue: Optional[float] = 0.05, + cluster_threshold: Optional[float] = 0.001, +) -> GLM: + """Factory method for building a GLM model instance corresponding to the + provided type and design matrix. + + Parameters + ---------- + glm_type : str + The type of GLM to be created. Either "correlation" or "group_comparison". + + design : str + The design matrix specified in string format. + If this contains a "*", it will be interpreted as an interaction effect. + + df : pd.DataFrame + The subjects DataFrame. + + contrast : str + The contrast specified in string format. + + feature_label : str + The label used for building output filenames. + + group_label : str, optional + The label to use for group GLM models. Default="group". + + fwhm : int, optional + The smoothing FWHM. This is used in the output file names. + Default=20. + + threshold_uncorrected_pvalue : float, optional + The threshold to be used with uncorrected P-values. Default=0.001. + + threshold_corrected_pvalue : float, optional + The threshold to be used with corrected P-values. Default=0.05. + + cluster_threshold : float, optional + The threshold to be used to declare clusters as significant. Default=0.001. + + Returns + ------- + model : GLM + An instance of the `GLM` class. + + Raises + ------ + ValueError + If the glm_type is not supported. + """ + cprint( + msg=f"The GLM model is: {design} and the GLM type is: {glm_type}", + lvl="info", + ) + params = { + "group_label": group_label, + "fwhm": fwhm, + "threshold_uncorrected_pvalue": threshold_uncorrected_pvalue, + "threshold_corrected_pvalue": threshold_corrected_pvalue, + "cluster_threshold": cluster_threshold, + } + if glm_type == "correlation": + return CorrelationGLM(design, df, feature_label, contrast, **params) + elif glm_type == "group_comparison": + if "*" in design: + return GroupGLMWithInteraction( + design, df, feature_label, contrast, **params + ) + return GroupGLM(design, df, feature_label, contrast, **params) + raise ValueError( + f"create_glm_model received an unknown GLM type: {glm_type}." + f"Only 'correlation' and 'group_comparison' are supported." + ) + + +def _convert_arrays_to_lists(data: dict) -> dict: + """If the input dictionary contains numpy arrays, this function will + cast them to lists and return the same dictionary with the lists instead + of the numpy arrays. + + Parameters + ---------- + data : dict + The dictionary to clean. + + Returns + ------- + new_data : dict + The dictionary with arrays casted to lists. + """ + new_data = dict() + for k, v in data.items(): + if isinstance(v, dict): + new_data[k] = _convert_arrays_to_lists(v) + elif isinstance(v, np.ndarray): + new_data[k] = v.tolist() + else: + new_data[k] = v + return new_data + + +class Results: + """Common class for GLM results.""" + + def to_dict(self) -> dict: + """Returns the `Results` instance in dict format. + + Private attributes and all methods are not returned. + + This function does not perform any casting. + + Returns + ------- + data : dict + Resulting dictionary. + """ + import inspect + + data = dict() + for attribute in inspect.getmembers(self): + name, value = attribute + if not name.startswith("_"): + if not inspect.ismethod(value): + if hasattr(value, "to_dict"): + data[name] = value.to_dict() + else: + data[name] = value + return data + + def to_json(self, indent: Optional[int] = 4) -> str: + """Returns the json of the `Results` instance. + + Parameters + ---------- + indent : int, optional + Indent to use. Default=4. + + Returns + ------- + str : + The JSON dumps of the results. + """ + import json + + return json.dumps(_convert_arrays_to_lists(self.to_dict()), indent=indent) + + +@dataclass +class PValueResults(Results): + """This class implements a container for raw (uncorrected) + P-value results obtained with a GLM model. + + Attributes + ---------- + pvalues : np.ndarray + Array of uncorrected P-values. + + mask : np.ndarray + The binary mask. + + threshold : float + The threshold used. + """ + + pvalues: np.ndarray + mask: np.ndarray + threshold: float + + @property + def thresh(self): + """For compatibility with previous Matlab implementation.""" + return self.threshold + + @property + def P(self): + """For compatibility with previous Matlab implementation.""" + return self.pvalues + + @classmethod + def from_t_statistics( + cls, + tstats: np.ndarray, + df: pd.DataFrame, + mask: np.ndarray, + threshold: float, + ): + """Instantiate the class from an array of T-statistics. + + Parameters + ---------- + tstats : np.ndarray + Array of T-statistics. + + df : pd.DataFrame + The subjects DataFrame. + + mask : np.ndarray + The binary mask. + + threshold : float + The threshold to be used. + """ + from scipy.stats import t + + return cls(1 - t.cdf(tstats, df), mask, threshold) + + +@dataclass +class CorrectedPValueResults(PValueResults): + """This class implements a container for corrected P-value + results obtained with a GLM model. + + Attributes + ---------- + cluster_pvalues : np.ndarray + The cluster P-values. + """ + + cluster_pvalues: np.ndarray + + @property + def C(self): + """For compatibility with previous Matlab implementation.""" + return self.cluster_pvalues + + +@dataclass +class StatisticsResults(Results): + """This class implements a container for results obtained with + the GLM model classes. It holds information relative to a GLM + run with one specific contrast. + + Attributes + ---------- + coefficients : np.ndarray + The beta coefficients of the fitted GLM model. + + tstats : np.ndarray + The corresponding T-statistics. + + uncorrected_p_value : PValueResults + The corresponding uncorrected p values, stored in a `PValueResults` instance. + + fdr : np.ndarray + The corresponding False Discovery Rate. + + corrected_p_value : CorrectedPValueResults + The corresponding corrected p values, stored in a `CorrectedPValueResults` instance. + """ + + coefficients: np.ndarray + tstats: np.ndarray + uncorrected_p_values: PValueResults + fdr: np.ndarray + corrected_p_values: CorrectedPValueResults + + @property + def TStatistics(self): + """Needed for compatibility with previous implementation in Matlab.""" + return self.tstats + + @property + def uncorrectedPValue(self): + """Needed for compatibility with previous implementation in Matlab.""" + return self.uncorrected_p_values + + @property + def correctedPValue(self): + """Needed for compatibility with previous implementation in Matlab.""" + return self.corrected_p_values + + @property + def FDR(self): + """Needed for compatibility with previous implementation in Matlab.""" + return self.fdr + + @classmethod + def from_slm_model( + cls, + model: SLM, + mask: np.ndarray, + threshold_uncorrected_p_value: float, + threshold_corrected_p_value: float, + ): + """Instanciate from a SLM model. + + Parameters + ---------- + model : brainstat.stats.SLM + SLM model instance to use. + + mask : np.ndarray + The binary mask to use. + + threshold_uncorrected_p_value : float + The threshold to use with uncorrected P-values. + + threshold_corrected_p_value : float + The threshold to use with corrected P-values. + """ + idx = np.argwhere(np.isnan(model.t)) + corrected_pvals = model.P["pval"]["P"] + corrected_pvals[idx] = 1.0 + tstats = np.nan_to_num(model.t) + uncorrected_p_values = PValueResults.from_t_statistics( + tstats, + model.df, + mask, + threshold_uncorrected_p_value, + ) + corrected_p_values = CorrectedPValueResults( + corrected_pvals, + model.P["pval"]["C"], + mask, + threshold_corrected_p_value, + ) + return cls( + np.nan_to_num(model.coef), + tstats, + uncorrected_p_values, + model.Q, + corrected_p_values, + ) + + +class StatisticsResultsPlotter: + """Class responsible to plotting results of GLM fit. + + Attributes + ---------- + output_file : PathLike + Path to the output file. + + mesh : nilearn.surface.Mesh + The mesh to be used for plotting results. + """ + + def __init__(self, output_file: PathLike, mesh: Mesh): + self.output_file = output_file + self.mesh = mesh + self.plotting_extension = ".png" + self.no_plot = {"coefficients"} # Elements which should not be plotted + + def plot(self, result: StatisticsResults, method: str) -> None: + """Plot the results. + + Parameters + ---------- + result : StatisticsResults + The results to be plotted. + + method : str + The plotting method to use. + """ + plotter = self._get_plotter(method) + plotter(result) + + def _get_plotter(self, method: str) -> Callable[[StatisticsResults], None]: + """Returns the plotting method from its name. + + Parameters + ---------- + method : str + Name of the plotting method to use. + + Returns + ------- + Callable : + Plotting method. + """ + if method == "nilearn_plot_surf_stat_map": + return self._plot_stat_maps + else: + raise NotImplementedError(f"Plotting method {method} is not implemented.") + + def _plot_stat_maps(self, result: StatisticsResults) -> None: + """Wrapper around the `nilearn.plotting.plot_surf_stat_map` method. + + Parameters + ---------- + result : StatisticsResults + The results to plot. + """ + from nilearn.plotting import plot_surf_stat_map + + for name, res in result.to_dict(jsonable=False).items(): + if name not in self.no_plot: + texture = res + threshold = None + plot_filename = ( + str(self.output_file) + "_" + name + self.plotting_extension + ) + if isinstance(res, dict): + texture = res["P"] + threshold = res["thresh"] + cprint(msg=f"Saving plot to {plot_filename}", lvl="info") + plot_surf_stat_map( + self.mesh, + texture, + threshold=threshold, + output_file=plot_filename, + title=name, + ) + + +class StatisticsResultsSerializer: + """This class is responsible for writing instances of `StatisticsResults` + to disk through different methods. + + Attributes + ---------- + output_file : PathLike + Path and filename root to be used. + """ + + def __init__(self, output_file: PathLike): + self.output_file = output_file + self.json_extension = "_results.json" + self.json_indent = 4 + self.mat_extension = ".mat" + + def save(self, result: StatisticsResults, method: str) -> None: + """Save provided `StatisticsResults` to disk with provided method. + + Parameters + ---------- + result : StatisticsResults + Results to be saved. + + method : str + Name of the saving method to use. + """ + writer = self._get_writer(method) + writer(result) + + def _get_writer(self, method: str) -> Callable[[StatisticsResults], None]: + """Returns a writter method from its name. + + Parameters + ---------- + method : str + The name of the writting method to use. + + Returns + ------- + Callable : + The writting method. + """ + if method.lower() == "json": + return self._write_to_json + elif method.lower() == "mat": + return self._write_to_mat + else: + raise NotImplementedError( + f"Serializing method {method} is not implemented." + ) + + def _write_to_json(self, results: StatisticsResults) -> None: + """Write the provided `StatisticsResults` to JSON format. + + Parameters + ---------- + results : StatisticsResults + The results to write to disk in JSON format. + """ + import json + import os + + out_json_file = Path(str(self.output_file) + self.json_extension) + if not os.path.exists(out_json_file.parents[0]): + os.makedirs(out_json_file.parents[0]) + cprint( + msg=f"Writing results to JSON in {out_json_file}...", + lvl="info", + ) + with open(out_json_file, "w") as fp: + json.dump(results.to_json(indent=self.json_indent), fp) + + def _write_to_mat(self, results: StatisticsResults) -> None: + """Write the provided `StatisticsResults` to MAT format. + + Parameters + ---------- + results : StatisticsResults + The results to write to disk in MAT format. + """ + from scipy.io import savemat + + # These labels are used for compatibility with the previous + # MATLAB implementation of the Statistics Surface Pipeline + # of Clinica. + struct_labels = { + "coefficients": "coef", + "TStatistics": "tvaluewithmask", + "uncorrectedPValue": "uncorrectedpvaluesstruct", + "correctedPValue": "correctedpvaluesstruct", + "FDR": "FDR", + } + for name, res in results.to_dict().items(): + if name in struct_labels: + mat_filename = str(self.output_file) + "_" + name + self.mat_extension + cprint( + msg=f"Writing {name} results to MAT in {mat_filename}", + lvl="info", + ) + savemat(mat_filename, {struct_labels[name]: res}) diff --git a/clinica/pipelines/statistics_surface/clinica_surfstat.py b/clinica/pipelines/statistics_surface/clinica_surfstat.py new file mode 100644 index 000000000..02b5d339c --- /dev/null +++ b/clinica/pipelines/statistics_surface/clinica_surfstat.py @@ -0,0 +1,162 @@ +from os import PathLike +from pathlib import Path +from typing import Dict, Optional + +from ._inputs import ( + _build_thickness_array, + _get_average_surface, + _get_t1_freesurfer_custom_file_template, + _read_and_check_tsv_file, +) +from ._model import create_glm_model + + +def clinica_surfstat( + input_dir: PathLike, + output_dir: PathLike, + tsv_file: PathLike, + design_matrix: str, + contrast: str, + glm_type: str, + group_label: str, + freesurfer_home: PathLike, + surface_file: Optional[PathLike], + feature_label: str, + fwhm: Optional[int] = 20, + threshold_uncorrected_pvalue: Optional[float] = 0.001, + threshold_corrected_pvalue: Optional[float] = 0.05, + cluster_threshold: Optional[float] = 0.001, +) -> None: + """This function mimics the previous function `clinica_surfstat` + written in MATLAB and relying on the MATLAB package SurfStat. + + This implementation is written in pure Python and rely on the + package brainstat for GLM modeling. + + Results, both plots and matrices, will be written in the location + specified through `output_dir`. + + The names of the output files within `output_dir` follow the + conventions: + + _. + + EXTENSION can be: + + - "mat": for storing matrices (this is mainly for backward + compatibility with the previous MATLAB implementation of + this function). + - "json": for storing matrices in a more Pythonic way. + - "png" for surface figures. + + SUFFIX can be: + + - "coefficients": relative to the model's beta coefficients. + - "TStatistics": relative to the T-statistics. + - "uncorrectedPValue": relative to the uncorrected P-values. + - "correctedPValues": relative to the corrected P-values. + - "FDR": Relative to the False Discovery Rate. + + ROOT can be: + + - For group comparison GLM with an interaction term: + + interaction-_measure-_fwhm- + + - For group comparison GLM without an interaction term: + + group-__measure-_fwhm- + + - For correlation GLM: + + group-_correlation--_measure-_fwhm- + + Parameters + ---------- + input_dir : PathLike + Path to the input folder. + + output_dir : PathLike + Path to the output folder for storing results. + + tsv_file : PathLike + Path to the TSV file `subjects.tsv` which contains the + necessary metadata to run the statistical analysis. + + .. warning:: + The column names need to be accurate because they + are used to defined contrast and model terms. + Please double check for typos. + + design_matrix : str + The design matrix specified in string format. + For example "1 + Label" + + contrast : str + The contrast to be used in the GLM, specified in string format. + + .. warning:: + The contrast needs to be in the design matrix. + + glm_type : {"group_comparison", "correlation"} + Type of GLM to run: + - "group_comparison": Performs group comparison. + For example "AD - ND". + - "correlation": Performs correlation analysis. + + group_label : str + The label for the group. This is used in the output file names + (see main description of the function). + + freesurfer_home : PathLike + The path to the home folder of Freesurfer. + This is required to get the fsaverage templates. + + surface_file : PathLike, optional + The path to the surface file to analyze. + Typically the cortical thickness. + If `None`, the surface file will be the t1 freesurfer template. + + feature_label : str + The label used for the measure. This is used in the output file + names (see main description of the function). + + fwhm : int, optional + The smoothing FWHM. This is used in the output file names. + Default=20. + + threshold_uncorrected_pvalue : float, optional + The threshold to be used with uncorrected P-values. Default=0.001. + + threshold_corrected_pvalue : float, optional + The threshold to be used with corrected P-values. Default=0.05. + + cluster_threshold : float, optional + The threshold to be used to declare clusters as significant. Default=0.05. + """ + # Load subjects data + df_subjects = _read_and_check_tsv_file(tsv_file) + if surface_file is None: + surface_file = _get_t1_freesurfer_custom_file_template(input_dir) + thickness = _build_thickness_array(input_dir, surface_file, df_subjects, fwhm) + + # Load average surface template + fsaverage_path = freesurfer_home / Path("subjects/fsaverage/surf") + average_surface, average_mesh = _get_average_surface(fsaverage_path) + + # Build and run GLM model + glm_model = create_glm_model( + glm_type, + design_matrix, + df_subjects, + contrast, + feature_label, + group_label=group_label, + fwhm=fwhm, + threshold_uncorrected_pvalue=threshold_uncorrected_pvalue, + threshold_corrected_pvalue=threshold_corrected_pvalue, + cluster_threshold=cluster_threshold, + ) + glm_model.fit(thickness, average_surface) + glm_model.save_results(output_dir, ["json", "mat"]) + glm_model.plot_results(output_dir, ["nilearn_plot_surf_stat_map"], average_mesh) diff --git a/clinica/pipelines/statistics_surface/statistics_surface_cli.py b/clinica/pipelines/statistics_surface/statistics_surface_cli.py index 266f15372..e2f2c00f8 100644 --- a/clinica/pipelines/statistics_surface/statistics_surface_cli.py +++ b/clinica/pipelines/statistics_surface/statistics_surface_cli.py @@ -97,19 +97,28 @@ def cli( ) -> None: """Surface-based mass-univariate analysis with SurfStat. - GROUP_LABEL is an user-defined identifier to target a specific group of subjects. + GROUP_LABEL is a user-defined identifier to target a specific group of + subjects. - The type of surface-based feature can be defined by using the third argument: t1-freesurfer for cortical thickness, pet-surface for projected PET data or custom-pipeline for you own data in CAPS directory. + The type of surface-based feature can be defined by using the third + argument: t1-freesurfer for cortical thickness, pet-surface for projected + PET data or custom-pipeline for you own data in CAPS directory. - The type of analysis of the model is defined by the argument 'group_comparison' or 'correlation'. + The type of analysis of the model is defined by the argument + 'group_comparison' or 'correlation'. - SUBJECT_VISITS_WITH_COVARIATES_TSV is a TSV file containing a list of subjects with their sessions and all the covariates and factors in your model. + SUBJECT_VISITS_WITH_COVARIATES_TSV is a TSV file containing a list of + subjects with their sessions and all the covariates and factors in your + model. - CONTRAST s a string defining the contrast matrix or the variable of interest for the GLM, e.g. 'group' or 'age' + CONTRAST is a string defining the contrast matrix or the variable of + interest in the GLM, e.g. 'group' or 'age' - Prerequisite: You need to have performed the t1-freesurfer pipeline on your T1-weighted MR images or pet-surface pipeline for measurements of activity map from PET. + Prerequisite: You need to have performed the t1-freesurfer pipeline on + your T1-weighted MR images or pet-surface pipeline for measurements of + activity map from PET. - See "https://aramislab.paris.inria.fr/clinica/docs/public/latest/Pipelines/Stats_Surface/ + See https://aramislab.paris.inria.fr/clinica/docs/public/latest/Pipelines/Stats_Surface/ """ from networkx import Graph diff --git a/clinica/pipelines/statistics_surface/statistics_surface_pipeline.py b/clinica/pipelines/statistics_surface/statistics_surface_pipeline.py index 3cd71a398..02ea2d479 100644 --- a/clinica/pipelines/statistics_surface/statistics_surface_pipeline.py +++ b/clinica/pipelines/statistics_surface/statistics_surface_pipeline.py @@ -21,7 +21,7 @@ def check_pipeline_parameters(self): from clinica.utils.exceptions import ClinicaException from clinica.utils.group import check_group_label - from .statistics_surface_utils import get_t1_freesurfer_custom_file + from ._inputs import _get_t1_freesurfer_custom_file_template # Clinica compulsory parameters self.parameters.setdefault("group_label", None) @@ -51,7 +51,9 @@ def check_pipeline_parameters(self): self.parameters.setdefault("suvr_reference_region", None) # Optional parameters for custom pipeline - self.parameters.setdefault("custom_file", get_t1_freesurfer_custom_file()) + self.parameters.setdefault( + "custom_file", _get_t1_freesurfer_custom_file_template(self.base_dir) + ) self.parameters.setdefault("measure_label", "ct") # Advanced parameters @@ -113,34 +115,26 @@ def build_input_node(self): # ===================================================== all_errors = [] # clinica_files_reader expects regexp to start at subjects/ so sub-*/ses-*/ is removed here - pattern_hemisphere = ( - self.parameters["custom_file"] - .replace("@subject", "sub-*") - .replace("@session", "ses-*") - .replace("@fwhm", str(self.parameters["full_width_at_half_maximum"])) - .replace("sub-*/ses-*/", "") - ) - # Files on left hemisphere - lh_surface_based_info = { - "pattern": pattern_hemisphere.replace("@hemi", "lh"), - "description": f"surface-based features on left hemisphere at FWHM = {self.parameters['full_width_at_half_maximum']}", - } - try: - clinica_file_reader( - self.subjects, self.sessions, self.caps_directory, lh_surface_based_info - ) - except ClinicaException as e: - all_errors.append(e) - rh_surface_based_info = { - "pattern": pattern_hemisphere.replace("@hemi", "rh"), - "description": f"surface-based features on right hemisphere at FWHM = {self.parameters['full_width_at_half_maximum']}", - } - try: - clinica_file_reader( - self.subjects, self.sessions, self.caps_directory, rh_surface_based_info - ) - except ClinicaException as e: - all_errors.append(e) + fwhm = str(self.parameters["full_width_at_half_maximum"]) + for direction, hemi in zip(["left", "right"], ["lh", "rh"]): + cut_pattern = "sub-*/ses-*/" + query = {"subject": "sub-*", "session": "ses-*", "hemi": hemi, "fwhm": fwhm} + pattern_hemisphere = self.parameters["custom_file"] % query + surface_based_info = { + "pattern": pattern_hemisphere[ + pattern_hemisphere.find(cut_pattern) + len(cut_pattern) : + ], + "description": f"surface-based features on {direction} hemisphere at FWHM = {fwhm}", + } + try: + clinica_file_reader( + self.subjects, + self.sessions, + self.caps_directory, + surface_based_info, + ) + except ClinicaException as e: + all_errors.append(e) # Raise all errors if something happened if len(all_errors) > 0: error_message = "Clinica faced errors while trying to read files in your CAPS directory.\n" diff --git a/clinica/pipelines/statistics_surface/statistics_surface_utils.py b/clinica/pipelines/statistics_surface/statistics_surface_utils.py index 94ca02949..b59b9c62d 100644 --- a/clinica/pipelines/statistics_surface/statistics_surface_utils.py +++ b/clinica/pipelines/statistics_surface/statistics_surface_utils.py @@ -40,9 +40,6 @@ def init_input_node(parameters, base_dir, subjects_visits_tsv): import os import shutil - from clinica.pipelines.statistics_surface.statistics_surface_utils import ( - create_glm_info_dictionary, - ) from clinica.utils.ux import print_begin_image group_id = "group-" + parameters["group_label"] @@ -173,26 +170,12 @@ def run_matlab(caps_dir, output_dir, subjects_visits_tsv, pipeline_parameters): """ import os - from nipype.interfaces.matlab import MatlabCommand, get_matlab_command - - import clinica.pipelines as clinica_pipelines - from clinica.pipelines.statistics_surface.statistics_surface_utils import ( - covariates_to_design_matrix, - get_string_format_from_tsv, - ) + from clinica.pipelines.statistics_surface.clinica_surfstat import clinica_surfstat from clinica.utils.check_dependency import check_environment_variable - path_to_matlab_script = os.path.join( - os.path.dirname(clinica_pipelines.__path__[0]), "lib", "clinicasurfstat" - ) freesurfer_home = check_environment_variable("FREESURFER_HOME", "FreeSurfer") - MatlabCommand.set_default_matlab_cmd(get_matlab_command()) - matlab = MatlabCommand() - matlab.inputs.paths = path_to_matlab_script - matlab.inputs.script = """ - clinicasurfstat('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', %.3f, '%s', %.3f, '%s', %.3f); - """ % ( + clinica_surfstat( os.path.join(caps_dir, "subjects"), output_dir, subjects_visits_tsv, @@ -200,35 +183,18 @@ def run_matlab(caps_dir, output_dir, subjects_visits_tsv, pipeline_parameters): pipeline_parameters["contrast"], pipeline_parameters["covariates"] ), pipeline_parameters["contrast"], - get_string_format_from_tsv(subjects_visits_tsv), pipeline_parameters["glm_type"], pipeline_parameters["group_label"], freesurfer_home, pipeline_parameters["custom_file"], pipeline_parameters["measure_label"], - "sizeoffwhm", - pipeline_parameters["full_width_at_half_maximum"], - "thresholduncorrectedpvalue", - 0.001, - "thresholdcorrectedpvalue", - 0.05, - "clusterthreshold", - pipeline_parameters["cluster_threshold"], + { + "sizeoffwhm": pipeline_parameters["full_width_at_half_maximum"], + "thresholduncorrectedpvalue": 0.001, + "thresholdcorrectedpvalue": 0.05, + "clusterthreshold": pipeline_parameters["cluster_threshold"], + }, ) - # This will create a file: pyscript.m , the pyscript.m is the default name - matlab.inputs.mfile = True - # This will stop running with single thread - matlab.inputs.single_comp_thread = False - matlab.inputs.logfile = ( - "group-" + pipeline_parameters["group_label"] + "_matlab.log" - ) - - # cprint("Matlab logfile is located at the following path: %s" % matlab.inputs.logfile) - # cprint("Matlab script command = %s" % matlab.inputs.script) - # cprint("MatlabCommand inputs flag: single_comp_thread = %s" % matlab.inputs.single_comp_thread) - # cprint("MatlabCommand choose which matlab to use(matlab_cmd): %s" % get_matlab_command()) - matlab.run() - return output_dir diff --git a/poetry.lock b/poetry.lock index b36f5e187..1375df7f6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,55 @@ +[[package]] +name = "abagen" +version = "0.1.3" +description = "A toolbox for working with the Allen Brain Atlas genetic data" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +nibabel = "*" +numpy = ">=1.14" +pandas = ">=0.25.0" +scipy = "*" + +[package.extras] +all = ["coverage", "fastparquet", "pytest (>=3.6)", "pytest-cov", "python-snappy", "sphinx (>=2.0)", "sphinx-argparse", "sphinx-rtd-theme"] +doc = ["sphinx (>=2.0)", "sphinx-argparse", "sphinx-rtd-theme"] +io = ["fastparquet", "python-snappy"] +style = ["flake8"] +test = ["coverage", "pytest (>=3.6)", "pytest-cov"] + +[[package]] +name = "aiohttp" +version = "3.8.1" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotli", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.2.0" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +frozenlist = ">=1.1.0" + [[package]] name = "argcomplete" version = "1.12.3" @@ -17,6 +69,14 @@ category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "atomicwrites" version = "1.4.0" @@ -39,6 +99,18 @@ docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +[[package]] +name = "bctpy" +version = "0.5.2" +description = "Brain Connectivity Toolbox for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +numpy = "*" +scipy = "*" + [[package]] name = "bids-validator" version = "1.9.7" @@ -47,6 +119,17 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "biopython" +version = "1.79" +description = "Freely available tools for computational molecular biology." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +numpy = "*" + [[package]] name = "black" version = "22.6.0" @@ -69,6 +152,54 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "brainspace" +version = "0.1.4" +description = "Cortical gradients and beyond" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +matplotlib = ">=2.0.0" +nibabel = "*" +numpy = ">=1.11.0" +pandas = "*" +pillow = "*" +scikit-learn = ">=0.20.0" +scipy = ">=0.17.0" +vtk = ">=8.1.0" + +[package.extras] +test = ["coverage", "coveralls", "matplotlib (>=2.0.0)", "nibabel", "numpy (>=1.11.0)", "pandas", "pillow", "pytest", "pytest-cov", "scikit-learn (>=0.20.0)", "scipy (>=0.17.0)", "vtk (>=8.1.0)"] + +[[package]] +name = "brainstat" +version = "0.3.6" +description = "A toolbox for statistical analysis of neuroimaging data" +category = "main" +optional = false +python-versions = ">=3.7.*" + +[package.dependencies] +abagen = ">=0.1" +brainspace = ">=0.1.2" +h5py = "*" +netneurotools = "*" +neurosynth = "*" +nibabel = "*" +nilearn = ">=0.7.0" +nimare = "*" +numpy = ">=1.16.5" +pandas = "*" +scikit-learn = "*" +scipy = ">=1.3.3" +templateflow = "*" +trimesh = "*" + +[package.extras] +dev = ["gitpython", "hcp-utils", "mypy", "plotly", "pytest"] + [[package]] name = "cattrs" version = "1.10.0" @@ -154,6 +285,19 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "cognitiveatlas" +version = "0.1.9" +description = "python wrapper for the cognitive atlas (cognitiveatlas.org) RESTful API" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +future = "*" +numpy = "*" +pandas = "*" + [[package]] name = "colorama" version = "0.4.5" @@ -301,6 +445,14 @@ wrapt = ">=1.0" arrow = ["pyarrow (>=1)"] calculus = ["sympy (>=1.3,<1.10)"] +[[package]] +name = "frozenlist" +version = "1.3.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" + [[package]] name = "fsspec" version = "2022.5.0" @@ -340,6 +492,17 @@ category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "fuzzywuzzy" +version = "0.18.0" +description = "Fuzzy string matching in python" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +speedup = ["python-levenshtein (>=0.12)"] + [[package]] name = "ghp-import" version = "2.1.0" @@ -354,6 +517,17 @@ python-dateutil = ">=2.8.1" [package.extras] dev = ["flake8", "markdown", "twine", "wheel"] +[[package]] +name = "h5py" +version = "3.7.0" +description = "Read and write HDF5 files from Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +numpy = ">=1.14.5" + [[package]] name = "identify" version = "2.5.1" @@ -619,6 +793,14 @@ python-versions = "*" develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] tests = ["pytest (>=4.6)"] +[[package]] +name = "multidict" +version = "6.0.2" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" + [[package]] name = "mypy-extensions" version = "0.4.3" @@ -627,6 +809,31 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "netneurotools" +version = "0.2.3" +description = "Commonly used tools in the Network Neuroscience Lab" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +bctpy = "*" +matplotlib = "*" +nibabel = "*" +nilearn = "*" +numpy = ">=1.16" +scikit-learn = "*" +scipy = ">=1.4.0" + +[package.extras] +all = ["coverage", "flake8", "mayavi", "numba", "pysurfer", "pytest (>=3.6)", "pytest-cov", "sphinx (>=2.0)", "sphinx-gallery", "sphinx-rtd-theme"] +doc = ["sphinx (>=2.0)", "sphinx-gallery", "sphinx-rtd-theme"] +numba = ["numba"] +plotting = ["mayavi", "pysurfer"] +style = ["flake8"] +test = ["coverage", "pytest (>=3.6)", "pytest-cov"] + [[package]] name = "networkx" version = "2.8.4" @@ -642,6 +849,27 @@ doc = ["nb2plots (>=0.6)", "numpydoc (>=1.4)", "pillow (>=9.1)", "pydata-sphinx- extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.9)", "sympy (>=1.10)"] test = ["codecov (>=2.1)", "pytest (>=7.1)", "pytest-cov (>=3.0)"] +[[package]] +name = "neurosynth" +version = "0.3.8" +description = "Large-scale synthesis of functional neuroimaging data" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +biopython = "*" +nibabel = "*" +numpy = "*" +pandas = "*" +ply = "*" +scikit-learn = "*" +scipy = "*" +six = "*" + +[package.extras] +test = ["nose (>=0.10.1)"] + [[package]] name = "nibabel" version = "2.5.1" @@ -690,6 +918,40 @@ requests = ">=2" scikit-learn = ">=0.19" scipy = ">=0.19" +[[package]] +name = "nimare" +version = "0.0.2" +description = "NiMARE: Neuroimaging Meta-Analysis Research Environment" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +cognitiveatlas = "*" +fuzzywuzzy = "*" +matplotlib = "*" +nibabel = "*" +nilearn = "*" +nipype = "*" +nltk = "*" +numpy = "*" +pandas = "*" +pyneurovault = "*" +scikit-learn = "*" +scipy = "*" +six = "*" +statsmodels = "*" +tqdm = "*" +traits = "*" + +[package.extras] +all = ["appdirs", "codecov", "coverage", "coveralls", "duecredit", "flake8", "m2r", "numpydoc", "pillow", "pytest", "pytest-cov", "sphinx (>=2.4.2,<2.5.0)", "sphinx-argparse", "sphinx-gallery", "sphinx-rtd-theme", "tensorflow (>=1.0.0)", "tensorflow-gpu (>=1.0.0)"] +doc = ["m2r", "numpydoc", "pillow", "sphinx (>=2.4.2,<2.5.0)", "sphinx-argparse", "sphinx-gallery", "sphinx-rtd-theme"] +duecredit = ["duecredit"] +peaks2maps-cpu = ["appdirs", "tensorflow (>=1.0.0)"] +peaks2maps-gpu = ["appdirs", "tensorflow-gpu (>=1.0.0)"] +tests = ["codecov", "coverage", "coveralls", "flake8", "pytest", "pytest-cov"] + [[package]] name = "nipy" version = "0.5.0" @@ -742,6 +1004,28 @@ ssh = ["paramiko"] tests = ["codecov", "coverage (<5)", "pytest", "pytest-cov", "pytest-env", "pytest-timeout"] xvfbwrapper = ["xvfbwrapper"] +[[package]] +name = "nltk" +version = "3.7" +description = "Natural Language Toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine_learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + [[package]] name = "nodeenv" version = "1.7.0" @@ -820,6 +1104,21 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +[[package]] +name = "patsy" +version = "0.5.2" +description = "A Python package for describing statistical models and for building design matrices." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +numpy = ">=1.4" +six = "*" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] + [[package]] name = "pillow" version = "9.2.0" @@ -856,6 +1155,14 @@ python-versions = ">=3.6" dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "ply" +version = "3.11" +description = "Python Lex & Yacc" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "pre-commit" version = "2.19.0" @@ -1012,6 +1319,19 @@ python-versions = ">=3.7" [package.dependencies] markdown = ">=3.2" +[[package]] +name = "pyneurovault" +version = "0.1.3" +description = "python wrapper for NeuroVault api" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +nibabel = "*" +nilearn = "*" +pandas = "*" + [[package]] name = "pyparsing" version = "3.0.9" @@ -1166,6 +1486,14 @@ docs = ["sphinx (<5)", "sphinxcontrib-apidoc"] html = ["html5lib"] tests = ["berkeleydb", "html5lib", "networkx", "pytest", "pytest-cov", "pytest-subtests"] +[[package]] +name = "regex" +version = "2022.9.13" +description = "Alternative regular expression module, to replace re." +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "requests" version = "2.28.1" @@ -1292,6 +1620,26 @@ postgresql_psycopg2binary = ["psycopg2-binary"] postgresql_psycopg2cffi = ["psycopg2cffi"] pymysql = ["pymysql", "pymysql (<1)"] +[[package]] +name = "statsmodels" +version = "0.13.2" +description = "Statistical computations and models for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +numpy = ">=1.17" +packaging = ">=21.3" +pandas = ">=0.25" +patsy = ">=0.5.2" +scipy = ">=1.3" + +[package.extras] +build = ["cython (>=0.29.26)"] +develop = ["cython (>=0.29.26)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + [[package]] name = "sympy" version = "1.10.1" @@ -1303,6 +1651,27 @@ python-versions = ">=3.7" [package.dependencies] mpmath = ">=0.19" +[[package]] +name = "templateflow" +version = "0.8.1" +description = "TemplateFlow Python Client - TemplateFlow is the Zone of neuroimaging templates." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +pybids = ">=0.12.1" +requests = "*" +tqdm = "*" + +[package.extras] +all = ["coverage", "datalad (>=0.12.0,<0.13.0)", "nbsphinx", "packaging", "pydot (>=1.2.3)", "pydotplus", "pytest", "pytest-cov (==2.5.1)", "pytest-xdist", "sphinx (>=4.0,<5.0)", "sphinx-argparse", "sphinx-multiversion", "sphinx-rtd-theme (>=0.4.3)", "sphinxcontrib-apidoc"] +datalad = ["datalad (>=0.12.0,<0.13.0)"] +doc = ["nbsphinx", "packaging", "pydot (>=1.2.3)", "pydotplus", "sphinx (>=4.0,<5.0)", "sphinx-argparse", "sphinx-multiversion", "sphinx-rtd-theme (>=0.4.3)", "sphinxcontrib-apidoc"] +docs = ["nbsphinx", "packaging", "pydot (>=1.2.3)", "pydotplus", "sphinx (>=4.0,<5.0)", "sphinx-argparse", "sphinx-multiversion", "sphinx-rtd-theme (>=0.4.3)", "sphinxcontrib-apidoc"] +test = ["coverage", "pytest", "pytest-cov (==2.5.1)", "pytest-xdist"] +tests = ["coverage", "pytest", "pytest-cov (==2.5.1)", "pytest-xdist"] + [[package]] name = "threadpoolctl" version = "3.1.0" @@ -1341,6 +1710,23 @@ category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "tqdm" +version = "4.64.1" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "traits" version = "6.3.2" @@ -1354,6 +1740,22 @@ docs = ["Sphinx (>=2.1.0,!=3.2.0)", "enthought-sphinx-theme"] examples = ["numpy", "pillow"] test = ["Sphinx (>=2.1.0,!=3.2.0)", "cython", "flake8", "flake8-ets", "mypy", "numpy", "pyface", "pyside2", "setuptools", "traitsui"] +[[package]] +name = "trimesh" +version = "3.15.1" +description = "Import, export, process, analyze and view triangular meshes." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +numpy = "*" + +[package.extras] +all = ["chardet", "colorlog", "glooey", "jsonschema", "lxml", "mapbox-earcut", "meshio", "msgpack", "networkx", "pillow", "psutil", "pycollada", "pyglet", "python-fcl", "requests", "rtree", "scikit-image", "scipy", "setuptools", "shapely", "svg.path", "sympy", "xatlas", "xxhash"] +easy = ["chardet", "colorlog", "jsonschema", "lxml", "mapbox-earcut", "msgpack", "networkx", "pillow", "pycollada", "pyglet", "requests", "rtree", "scipy", "setuptools", "shapely", "svg.path", "sympy", "xxhash"] +test = ["coveralls", "ezdxf", "pyinstrument", "pytest", "pytest-cov"] + [[package]] name = "typing-extensions" version = "4.3.0" @@ -1393,6 +1795,21 @@ six = ">=1.9.0,<2" docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "packaging (>=20.0)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)"] +[[package]] +name = "vtk" +version = "9.2.0rc2" +description = "VTK is an open-source toolkit for 3D computer graphics, image processing, and visualization" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +matplotlib = ">=2.0.0" +wslink = ">=1.0.4" + +[package.extras] +numpy = ["numpy (>=1.9)"] + [[package]] name = "watchdog" version = "2.1.9" @@ -1412,6 +1829,20 @@ category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +[[package]] +name = "wslink" +version = "1.8.2" +description = "Python/JavaScript library for communicating over WebSocket" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +aiohttp = "<4" + +[package.extras] +ssl = ["cryptography"] + [[package]] name = "xgboost" version = "1.6.1" @@ -1452,6 +1883,18 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "yarl" +version = "1.8.1" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + [[package]] name = "zipp" version = "3.8.0" @@ -1470,9 +1913,91 @@ docs = ["mkdocs", "mkdocs-material", "pymdown-extensions"] [metadata] lock-version = "1.1" python-versions = ">=3.8,<3.11" -content-hash = "8150835d0d3264b396fb42aa5d5aa5ec6ab32847d6919fb170e98cac89faa2ad" +content-hash = "f224cae376fdd5d7b8aedfb22191c8eab9040ddd3b3d9f92ba2e50b7a4dae1dd" [metadata.files] +abagen = [ + {file = "abagen-0.1.3-py3-none-any.whl", hash = "sha256:637a1b04c8adb6d6807b00116f686f7964b881b64c6b2a54a599b4bca52d8139"}, + {file = "abagen-0.1.3.tar.gz", hash = "sha256:22225ce661d082cdbeeee131da2187b4c942d7b610c5a2b312140ab127aaaee6"}, +] +aiohttp = [ + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"}, + {file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"}, + {file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"}, + {file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"}, + {file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"}, + {file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"}, + {file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"}, + {file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"}, + {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, + {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, +] +aiosignal = [ + {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, + {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, +] argcomplete = [ {file = "argcomplete-1.12.3-py2.py3-none-any.whl", hash = "sha256:291f0beca7fd49ce285d2f10e4c1c77e9460cf823eef2de54df0c0fec88b0d81"}, {file = "argcomplete-1.12.3.tar.gz", hash = "sha256:2c7dbffd8c045ea534921e63b0be6fe65e88599990d8dc408ac8c542b72a5445"}, @@ -1481,6 +2006,10 @@ astor = [ {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, ] +async-timeout = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -1489,10 +2018,43 @@ attrs = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] +bctpy = [ + {file = "bctpy-0.5.2-py3-none-any.whl", hash = "sha256:07c622138e693d9fc354a785921f7ba18da3d992eb127e192e114bc2632f8b55"}, + {file = "bctpy-0.5.2-py3.7.egg", hash = "sha256:6afabf11dbeb3389d830d86930fecd210fc35e13f59e0558a0bbee3520556346"}, + {file = "bctpy-0.5.2.linux-x86_64.tar.gz", hash = "sha256:c542c157da286f0f7bcfcf7185a33fe17241747324dad8ef283f5de2e47ffa19"}, +] bids-validator = [ {file = "bids-validator-1.9.7.tar.gz", hash = "sha256:abc767392a0df46bbdca5fd424d4577930412939df2611f0a8debe4154e57b12"}, {file = "bids_validator-1.9.7-py2.py3-none-any.whl", hash = "sha256:63ccfecc9e25857aab1ad9c9892c636e184808d04c6e23c0309950ccd3a403ca"}, ] +biopython = [ + {file = "biopython-1.79-cp310-cp310-win_amd64.whl", hash = "sha256:9eadfd4300f534cd4fa39613eeee786d2c3d6b981d373c5c46616fa1a97cad10"}, + {file = "biopython-1.79-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:72a1477cf1701964c7224e506a54fd65d1cc5228da200b634a17992230aa1cbd"}, + {file = "biopython-1.79-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:365569543ea58dd07ef205ec351c23b6c1a3200d5d321eb28ceaecd55eb5955e"}, + {file = "biopython-1.79-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4be31815226052d86d4c2f6a103c40504e34bba3e25cc1b1d687a3203c42fb6e"}, + {file = "biopython-1.79-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ceab668be9cbdcddef55ad459f87acd0316ae4a00d32251fea4cf665f5062fda"}, + {file = "biopython-1.79-cp36-cp36m-win32.whl", hash = "sha256:83bfea8a19f9352c47b13965c4b73853e7aeef3c5aed8489895b0679e32c621b"}, + {file = "biopython-1.79-cp36-cp36m-win_amd64.whl", hash = "sha256:98deacc30b8654cfcdcf707d93fa4e3c8717bbda07c3f9f828cf84753d4a1e4d"}, + {file = "biopython-1.79-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:884a2b99ac7820cb84f70089769a512e3238ee60438b8c934ed519613dc570ce"}, + {file = "biopython-1.79-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51eb467a60c38820ad1e6c3a7d4cb10535606f559646e824cc65c96091d91ff7"}, + {file = "biopython-1.79-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03ee5c72b3cc3f0675a8c22ce1c45fe99a32a60db18df059df479ae6cf619708"}, + {file = "biopython-1.79-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9580978803b582e0612b71673cab289e6bf261a865009cfb9501d65bc726a76e"}, + {file = "biopython-1.79-cp37-cp37m-win32.whl", hash = "sha256:5ae69c5e09769390643aa0f8064517665df6fb99c37433821d6664584d0ecb8c"}, + {file = "biopython-1.79-cp37-cp37m-win_amd64.whl", hash = "sha256:f0a7e1d94a318f74974345fd0987ec389b16988ec484e67218e900b116b932a8"}, + {file = "biopython-1.79-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aa23a83a220486af6193760d079b36543fe00afcfbd18280ca2fd0b2c1c8dd6d"}, + {file = "biopython-1.79-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3d4eec2e348c3d97a7fde80ee0f2b8ebeed849d2bd64a616833a9be03b93c8"}, + {file = "biopython-1.79-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:947b793e804c59ea45ae46945a57612ad1789ca87af4af0d6a62dcecf3a6246a"}, + {file = "biopython-1.79-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d9f6ce961e0c380e2a5435f64c96421dbcebeab6a1b41506bd81251feb733c08"}, + {file = "biopython-1.79-cp38-cp38-win32.whl", hash = "sha256:155c5b95857bca7ebd607210cb9d8ea459bb0b86b3ca37ea44ec47c26ede7e9a"}, + {file = "biopython-1.79-cp38-cp38-win_amd64.whl", hash = "sha256:2dbb4388c75b5dfca8ce729e791f465c9c878dbd7ba2ab9a1f9854609d2b5426"}, + {file = "biopython-1.79-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:76988ed3d7383d566db1d7fc69c9cf136c6275813fb749fc6753c340f81f1a8f"}, + {file = "biopython-1.79-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e921571b51514a6d35944242d6fef6427c3998acf58940fe1f209ac8a92a6e87"}, + {file = "biopython-1.79-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf634a56f449a4123e48e538d661948e5ac29fb452acd2962b8cb834b472a9d7"}, + {file = "biopython-1.79-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ab93d5749b375be3682866b3a606aa2ebd3e6d868079793925bf4fbb0987cf1f"}, + {file = "biopython-1.79-cp39-cp39-win32.whl", hash = "sha256:8f33dafd3c7254fff5e1684b965e45a7c08d9b8e1bf51562b0a521ff9a6f5ea0"}, + {file = "biopython-1.79-cp39-cp39-win_amd64.whl", hash = "sha256:b3ab26f26a1956ef26303386510d84e917e31fcbbc94918c336da0163ef628df"}, + {file = "biopython-1.79.tar.gz", hash = "sha256:edb07eac99d3b8abd7ba56ff4bedec9263f76dfc3c3f450e7d2e2bcdecf8559b"}, +] black = [ {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, @@ -1518,6 +2080,14 @@ black = [ {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, ] +brainspace = [ + {file = "brainspace-0.1.4-py3-none-any.whl", hash = "sha256:44212075b8039f42c5fe0166c06c9aa7da331f5e52810965b05b2bb3a7bf473d"}, + {file = "brainspace-0.1.4.tar.gz", hash = "sha256:ce1673d74804d603a87528e417201dadeb1248b00f12dd12dd05c07406a20933"}, +] +brainstat = [ + {file = "brainstat-0.3.6-py3-none-any.whl", hash = "sha256:47e266120c88a1d305221bacf703462575eea49749943bd96340a5be8b340701"}, + {file = "brainstat-0.3.6.tar.gz", hash = "sha256:de39767f3c21a8312434e8df66f3f7b98c82fb455e8ae0c90fb7b968c13e7a7e"}, +] cattrs = [ {file = "cattrs-1.10.0-py3-none-any.whl", hash = "sha256:35dd9063244263e63bd0bd24ea61e3015b00272cead084b2c40d788b0f857c46"}, {file = "cattrs-1.10.0.tar.gz", hash = "sha256:211800f725cdecedcbcf4c753bbd22d248312b37d130f06045434acb7d9b34e1"}, @@ -1550,6 +2120,9 @@ cloudpickle = [ {file = "cloudpickle-2.1.0-py3-none-any.whl", hash = "sha256:b5c434f75c34624eedad3a14f2be5ac3b5384774d5b0e3caf905c21479e6c4b1"}, {file = "cloudpickle-2.1.0.tar.gz", hash = "sha256:bb233e876a58491d9590a676f93c7a5473a08f747d5ab9df7f9ce564b3e7938e"}, ] +cognitiveatlas = [ + {file = "cognitiveatlas-0.1.9.tar.gz", hash = "sha256:0b46bdad9c5f7ccd66d86d5814a989923307aa853d07d24ea7b2986c65db4212"}, +] colorama = [ {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, @@ -1644,6 +2217,67 @@ formulaic = [ {file = "formulaic-0.3.4-py3-none-any.whl", hash = "sha256:5ee1f3f4a5990c0947a68f90d051a4ca497d6eb0f9f387d2cf1e732a9cbf76ec"}, {file = "formulaic-0.3.4.tar.gz", hash = "sha256:2f841297d27dbd19f51dadea35887c363512d6eed70503b453e0f59c679d0f54"}, ] +frozenlist = [ + {file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5f271c93f001748fc26ddea409241312a75e13466b06c94798d1a341cf0e6989"}, + {file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c6ef8014b842f01f5d2b55315f1af5cbfde284eb184075c189fd657c2fd8204"}, + {file = "frozenlist-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:219a9676e2eae91cb5cc695a78b4cb43d8123e4160441d2b6ce8d2c70c60e2f3"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b47d64cdd973aede3dd71a9364742c542587db214e63b7529fbb487ed67cddd9"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2af6f7a4e93f5d08ee3f9152bce41a6015b5cf87546cb63872cc19b45476e98a"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a718b427ff781c4f4e975525edb092ee2cdef6a9e7bc49e15063b088961806f8"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c56c299602c70bc1bb5d1e75f7d8c007ca40c9d7aebaf6e4ba52925d88ef826d"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717470bfafbb9d9be624da7780c4296aa7935294bd43a075139c3d55659038ca"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:31b44f1feb3630146cffe56344704b730c33e042ffc78d21f2125a6a91168131"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3b31180b82c519b8926e629bf9f19952c743e089c41380ddca5db556817b221"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d82bed73544e91fb081ab93e3725e45dd8515c675c0e9926b4e1f420a93a6ab9"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49459f193324fbd6413e8e03bd65789e5198a9fa3095e03f3620dee2f2dabff2"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:94e680aeedc7fd3b892b6fa8395b7b7cc4b344046c065ed4e7a1e390084e8cb5"}, + {file = "frozenlist-1.3.1-cp310-cp310-win32.whl", hash = "sha256:fabb953ab913dadc1ff9dcc3a7a7d3dc6a92efab3a0373989b8063347f8705be"}, + {file = "frozenlist-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:eee0c5ecb58296580fc495ac99b003f64f82a74f9576a244d04978a7e97166db"}, + {file = "frozenlist-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bc75692fb3770cf2b5856a6c2c9de967ca744863c5e89595df64e252e4b3944"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086ca1ac0a40e722d6833d4ce74f5bf1aba2c77cbfdc0cd83722ffea6da52a04"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b51eb355e7f813bcda00276b0114c4172872dc5fb30e3fea059b9367c18fbcb"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74140933d45271c1a1283f708c35187f94e1256079b3c43f0c2267f9db5845ff"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee4c5120ddf7d4dd1eaf079af3af7102b56d919fa13ad55600a4e0ebe532779b"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97d9e00f3ac7c18e685320601f91468ec06c58acc185d18bb8e511f196c8d4b2"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e19add867cebfb249b4e7beac382d33215d6d54476bb6be46b01f8cafb4878b"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a027f8f723d07c3f21963caa7d585dcc9b089335565dabe9c814b5f70c52705a"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:61d7857950a3139bce035ad0b0945f839532987dfb4c06cfe160254f4d19df03"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:53b2b45052e7149ee8b96067793db8ecc1ae1111f2f96fe1f88ea5ad5fd92d10"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bbb1a71b1784e68870800b1bc9f3313918edc63dbb8f29fbd2e767ce5821696c"}, + {file = "frozenlist-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:ab6fa8c7871877810e1b4e9392c187a60611fbf0226a9e0b11b7b92f5ac72792"}, + {file = "frozenlist-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f89139662cc4e65a4813f4babb9ca9544e42bddb823d2ec434e18dad582543bc"}, + {file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4c0c99e31491a1d92cde8648f2e7ccad0e9abb181f6ac3ddb9fc48b63301808e"}, + {file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61e8cb51fba9f1f33887e22488bad1e28dd8325b72425f04517a4d285a04c519"}, + {file = "frozenlist-1.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc2f3e368ee5242a2cbe28323a866656006382872c40869b49b265add546703f"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58fb94a01414cddcdc6839807db77ae8057d02ddafc94a42faee6004e46c9ba8"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:022178b277cb9277d7d3b3f2762d294f15e85cd2534047e68a118c2bb0058f3e"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:572ce381e9fe027ad5e055f143763637dcbac2542cfe27f1d688846baeef5170"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19127f8dcbc157ccb14c30e6f00392f372ddb64a6ffa7106b26ff2196477ee9f"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42719a8bd3792744c9b523674b752091a7962d0d2d117f0b417a3eba97d1164b"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2743bb63095ef306041c8f8ea22bd6e4d91adabf41887b1ad7886c4c1eb43d5f"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fa47319a10e0a076709644a0efbcaab9e91902c8bd8ef74c6adb19d320f69b83"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52137f0aea43e1993264a5180c467a08a3e372ca9d378244c2d86133f948b26b"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:f5abc8b4d0c5b556ed8cd41490b606fe99293175a82b98e652c3f2711b452988"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1e1cf7bc8cbbe6ce3881863671bac258b7d6bfc3706c600008925fb799a256e2"}, + {file = "frozenlist-1.3.1-cp38-cp38-win32.whl", hash = "sha256:0dde791b9b97f189874d654c55c24bf7b6782343e14909c84beebd28b7217845"}, + {file = "frozenlist-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:9494122bf39da6422b0972c4579e248867b6b1b50c9b05df7e04a3f30b9a413d"}, + {file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31bf9539284f39ff9398deabf5561c2b0da5bb475590b4e13dd8b268d7a3c5c1"}, + {file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e0c8c803f2f8db7217898d11657cb6042b9b0553a997c4a0601f48a691480fab"}, + {file = "frozenlist-1.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da5ba7b59d954f1f214d352308d1d86994d713b13edd4b24a556bcc43d2ddbc3"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e6b2b456f21fc93ce1aff2b9728049f1464428ee2c9752a4b4f61e98c4db96"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526d5f20e954d103b1d47232e3839f3453c02077b74203e43407b962ab131e7b"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b499c6abe62a7a8d023e2c4b2834fce78a6115856ae95522f2f974139814538c"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab386503f53bbbc64d1ad4b6865bf001414930841a870fc97f1546d4d133f141"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f63c308f82a7954bf8263a6e6de0adc67c48a8b484fab18ff87f349af356efd"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:12607804084d2244a7bd4685c9d0dca5df17a6a926d4f1967aa7978b1028f89f"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:da1cdfa96425cbe51f8afa43e392366ed0b36ce398f08b60de6b97e3ed4affef"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f810e764617b0748b49a731ffaa525d9bb36ff38332411704c2400125af859a6"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:35c3d79b81908579beb1fb4e7fcd802b7b4921f1b66055af2578ff7734711cfa"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c92deb5d9acce226a501b77307b3b60b264ca21862bd7d3e0c1f3594022f01bc"}, + {file = "frozenlist-1.3.1-cp39-cp39-win32.whl", hash = "sha256:5e77a8bd41e54b05e4fb2708dc6ce28ee70325f8c6f50f3df86a44ecb1d7a19b"}, + {file = "frozenlist-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:625d8472c67f2d96f9a4302a947f92a7adbc1e20bedb6aff8dbc8ff039ca6189"}, + {file = "frozenlist-1.3.1.tar.gz", hash = "sha256:3a735e4211a04ccfa3f4833547acdf5d2f863bfeb01cfd3edaffbc251f15cec8"}, +] fsspec = [ {file = "fsspec-2022.5.0-py3-none-any.whl", hash = "sha256:2c198c50eb541a80bbd03540b07602c4a957366f3fb416a1f270d34bd4ff0926"}, {file = "fsspec-2022.5.0.tar.gz", hash = "sha256:7a5459c75c44e760fbe6a3ccb1f37e81e023cde7da8ba20401258d877ec483b4"}, @@ -1651,10 +2285,36 @@ fsspec = [ future = [ {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, ] +fuzzywuzzy = [ + {file = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993"}, + {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, +] ghp-import = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, ] +h5py = [ + {file = "h5py-3.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d77af42cb751ad6cc44f11bae73075a07429a5cf2094dfde2b1e716e059b3911"}, + {file = "h5py-3.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63beb8b7b47d0896c50de6efb9a1eaa81dbe211f3767e7dd7db159cea51ba37a"}, + {file = "h5py-3.7.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04e2e1e2fc51b8873e972a08d2f89625ef999b1f2d276199011af57bb9fc7851"}, + {file = "h5py-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f73307c876af49aa869ec5df1818e9bb0bdcfcf8a5ba773cc45a4fba5a286a5c"}, + {file = "h5py-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:f514b24cacdd983e61f8d371edac8c1b780c279d0acb8485639e97339c866073"}, + {file = "h5py-3.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:43fed4d13743cf02798a9a03a360a88e589d81285e72b83f47d37bb64ed44881"}, + {file = "h5py-3.7.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c038399ce09a58ff8d89ec3e62f00aa7cb82d14f34e24735b920e2a811a3a426"}, + {file = "h5py-3.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03d64fb86bb86b978928bad923b64419a23e836499ec6363e305ad28afd9d287"}, + {file = "h5py-3.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e5b7820b75f9519499d76cc708e27242ccfdd9dfb511d6deb98701961d0445aa"}, + {file = "h5py-3.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a9351d729ea754db36d175098361b920573fdad334125f86ac1dd3a083355e20"}, + {file = "h5py-3.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6776d896fb90c5938de8acb925e057e2f9f28755f67ec3edcbc8344832616c38"}, + {file = "h5py-3.7.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a047fddbe6951bce40e9cde63373c838a978c5e05a011a682db9ba6334b8e85"}, + {file = "h5py-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0798a9c0ff45f17d0192e4d7114d734cac9f8b2b2c76dd1d923c4d0923f27bb6"}, + {file = "h5py-3.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:0d8de8cb619fc597da7cf8cdcbf3b7ff8c5f6db836568afc7dc16d21f59b2b49"}, + {file = "h5py-3.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f084bbe816907dfe59006756f8f2d16d352faff2d107f4ffeb1d8de126fc5dc7"}, + {file = "h5py-3.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1fcb11a2dc8eb7ddcae08afd8fae02ba10467753a857fa07a404d700a93f3d53"}, + {file = "h5py-3.7.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed43e2cc4f511756fd664fb45d6b66c3cbed4e3bd0f70e29c37809b2ae013c44"}, + {file = "h5py-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e7535df5ee3dc3e5d1f408fdfc0b33b46bc9b34db82743c82cd674d8239b9ad"}, + {file = "h5py-3.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:9e2ad2aa000f5b1e73b5dfe22f358ca46bf1a2b6ca394d9659874d7fc251731a"}, + {file = "h5py-3.7.0.tar.gz", hash = "sha256:3fcf37884383c5da64846ab510190720027dca0768def34dd8dcb659dbe5cbf3"}, +] identify = [ {file = "identify-2.5.1-py2.py3-none-any.whl", hash = "sha256:0dca2ea3e4381c435ef9c33ba100a78a9b40c0bab11189c7cf121f75815efeaa"}, {file = "identify-2.5.1.tar.gz", hash = "sha256:3d11b16f3fe19f52039fb7e39c9c884b21cb1b586988114fbe42671f03de3e82"}, @@ -1744,7 +2404,78 @@ looseversion = [ {file = "looseversion-1.0.1-py3-none-any.whl", hash = "sha256:a205beabd0ffd40488edb9ccb3a39134510fc7c0c2847a25079f559e59c004ac"}, {file = "looseversion-1.0.1.tar.gz", hash = "sha256:b339dfde67680e9c5c2e96673e52bee9f94d2f0e1b8f4cbfd86d32311e86b952"}, ] -lxml = [] +lxml = [ + {file = "lxml-4.9.1-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:98cafc618614d72b02185ac583c6f7796202062c41d2eeecdf07820bad3295ed"}, + {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c62e8dd9754b7debda0c5ba59d34509c4688f853588d75b53c3791983faa96fc"}, + {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21fb3d24ab430fc538a96e9fbb9b150029914805d551deeac7d7822f64631dfc"}, + {file = "lxml-4.9.1-cp27-cp27m-win32.whl", hash = "sha256:86e92728ef3fc842c50a5cb1d5ba2bc66db7da08a7af53fb3da79e202d1b2cd3"}, + {file = "lxml-4.9.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4cfbe42c686f33944e12f45a27d25a492cc0e43e1dc1da5d6a87cbcaf2e95627"}, + {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dad7b164905d3e534883281c050180afcf1e230c3d4a54e8038aa5cfcf312b84"}, + {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a614e4afed58c14254e67862456d212c4dcceebab2eaa44d627c2ca04bf86837"}, + {file = "lxml-4.9.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f9ced82717c7ec65a67667bb05865ffe38af0e835cdd78728f1209c8fffe0cad"}, + {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d9fc0bf3ff86c17348dfc5d322f627d78273eba545db865c3cd14b3f19e57fa5"}, + {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e5f66bdf0976ec667fc4594d2812a00b07ed14d1b44259d19a41ae3fff99f2b8"}, + {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fe17d10b97fdf58155f858606bddb4e037b805a60ae023c009f760d8361a4eb8"}, + {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8caf4d16b31961e964c62194ea3e26a0e9561cdf72eecb1781458b67ec83423d"}, + {file = "lxml-4.9.1-cp310-cp310-win32.whl", hash = "sha256:4780677767dd52b99f0af1f123bc2c22873d30b474aa0e2fc3fe5e02217687c7"}, + {file = "lxml-4.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:b122a188cd292c4d2fcd78d04f863b789ef43aa129b233d7c9004de08693728b"}, + {file = "lxml-4.9.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:be9eb06489bc975c38706902cbc6888f39e946b81383abc2838d186f0e8b6a9d"}, + {file = "lxml-4.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f1be258c4d3dc609e654a1dc59d37b17d7fef05df912c01fc2e15eb43a9735f3"}, + {file = "lxml-4.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:927a9dd016d6033bc12e0bf5dee1dde140235fc8d0d51099353c76081c03dc29"}, + {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9232b09f5efee6a495a99ae6824881940d6447debe272ea400c02e3b68aad85d"}, + {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:04da965dfebb5dac2619cb90fcf93efdb35b3c6994fea58a157a834f2f94b318"}, + {file = "lxml-4.9.1-cp35-cp35m-win32.whl", hash = "sha256:4d5bae0a37af799207140652a700f21a85946f107a199bcb06720b13a4f1f0b7"}, + {file = "lxml-4.9.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4878e667ebabe9b65e785ac8da4d48886fe81193a84bbe49f12acff8f7a383a4"}, + {file = "lxml-4.9.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:1355755b62c28950f9ce123c7a41460ed9743c699905cbe664a5bcc5c9c7c7fb"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:bcaa1c495ce623966d9fc8a187da80082334236a2a1c7e141763ffaf7a405067"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6eafc048ea3f1b3c136c71a86db393be36b5b3d9c87b1c25204e7d397cee9536"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:13c90064b224e10c14dcdf8086688d3f0e612db53766e7478d7754703295c7c8"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206a51077773c6c5d2ce1991327cda719063a47adc02bd703c56a662cdb6c58b"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e8f0c9d65da595cfe91713bc1222af9ecabd37971762cb830dea2fc3b3bb2acf"}, + {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8f0a4d179c9a941eb80c3a63cdb495e539e064f8054230844dcf2fcb812b71d3"}, + {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:830c88747dce8a3e7525defa68afd742b4580df6aa2fdd6f0855481e3994d391"}, + {file = "lxml-4.9.1-cp36-cp36m-win32.whl", hash = "sha256:1e1cf47774373777936c5aabad489fef7b1c087dcd1f426b621fda9dcc12994e"}, + {file = "lxml-4.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:5974895115737a74a00b321e339b9c3f45c20275d226398ae79ac008d908bff7"}, + {file = "lxml-4.9.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1423631e3d51008871299525b541413c9b6c6423593e89f9c4cfbe8460afc0a2"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:2aaf6a0a6465d39b5ca69688fce82d20088c1838534982996ec46633dc7ad6cc"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:9f36de4cd0c262dd9927886cc2305aa3f2210db437aa4fed3fb4940b8bf4592c"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae06c1e4bc60ee076292e582a7512f304abdf6c70db59b56745cca1684f875a4"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:57e4d637258703d14171b54203fd6822fda218c6c2658a7d30816b10995f29f3"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6d279033bf614953c3fc4a0aa9ac33a21e8044ca72d4fa8b9273fe75359d5cca"}, + {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a60f90bba4c37962cbf210f0188ecca87daafdf60271f4c6948606e4dabf8785"}, + {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ca2264f341dd81e41f3fffecec6e446aa2121e0b8d026fb5130e02de1402785"}, + {file = "lxml-4.9.1-cp37-cp37m-win32.whl", hash = "sha256:27e590352c76156f50f538dbcebd1925317a0f70540f7dc8c97d2931c595783a"}, + {file = "lxml-4.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:eea5d6443b093e1545ad0210e6cf27f920482bfcf5c77cdc8596aec73523bb7e"}, + {file = "lxml-4.9.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f05251bbc2145349b8d0b77c0d4e5f3b228418807b1ee27cefb11f69ed3d233b"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:487c8e61d7acc50b8be82bda8c8d21d20e133c3cbf41bd8ad7eb1aaeb3f07c97"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d1a92d8e90b286d491e5626af53afef2ba04da33e82e30744795c71880eaa21"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:b570da8cd0012f4af9fa76a5635cd31f707473e65a5a335b186069d5c7121ff2"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ef87fca280fb15342726bd5f980f6faf8b84a5287fcc2d4962ea8af88b35130"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:93e414e3206779ef41e5ff2448067213febf260ba747fc65389a3ddaa3fb8715"}, + {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6653071f4f9bac46fbc30f3c7838b0e9063ee335908c5d61fb7a4a86c8fd2036"}, + {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:32a73c53783becdb7eaf75a2a1525ea8e49379fb7248c3eeefb9412123536387"}, + {file = "lxml-4.9.1-cp38-cp38-win32.whl", hash = "sha256:1a7c59c6ffd6ef5db362b798f350e24ab2cfa5700d53ac6681918f314a4d3b94"}, + {file = "lxml-4.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:1436cf0063bba7888e43f1ba8d58824f085410ea2025befe81150aceb123e345"}, + {file = "lxml-4.9.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4beea0f31491bc086991b97517b9683e5cfb369205dac0148ef685ac12a20a67"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:41fb58868b816c202e8881fd0f179a4644ce6e7cbbb248ef0283a34b73ec73bb"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bd34f6d1810d9354dc7e35158aa6cc33456be7706df4420819af6ed966e85448"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:edffbe3c510d8f4bf8640e02ca019e48a9b72357318383ca60e3330c23aaffc7"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d949f53ad4fc7cf02c44d6678e7ff05ec5f5552b235b9e136bd52e9bf730b91"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:079b68f197c796e42aa80b1f739f058dcee796dc725cc9a1be0cdb08fc45b000"}, + {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9c3a88d20e4fe4a2a4a84bf439a5ac9c9aba400b85244c63a1ab7088f85d9d25"}, + {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4e285b5f2bf321fc0857b491b5028c5f276ec0c873b985d58d7748ece1d770dd"}, + {file = "lxml-4.9.1-cp39-cp39-win32.whl", hash = "sha256:ef72013e20dd5ba86a8ae1aed7f56f31d3374189aa8b433e7b12ad182c0d2dfb"}, + {file = "lxml-4.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:10d2017f9150248563bb579cd0d07c61c58da85c922b780060dcc9a3aa9f432d"}, + {file = "lxml-4.9.1-pp37-pypy37_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538747a9d7827ce3e16a8fdd201a99e661c7dee3c96c885d8ecba3c35d1032c"}, + {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0645e934e940107e2fdbe7c5b6fb8ec6232444260752598bc4d09511bd056c0b"}, + {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6daa662aba22ef3258934105be2dd9afa5bb45748f4f702a3b39a5bf53a1f4dc"}, + {file = "lxml-4.9.1-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:603a464c2e67d8a546ddaa206d98e3246e5db05594b97db844c2f0a1af37cf5b"}, + {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c4b2e0559b68455c085fb0f6178e9752c4be3bba104d6e881eb5573b399d1eb2"}, + {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0f3f0059891d3254c7b5fb935330d6db38d6519ecd238ca4fce93c234b4a0f73"}, + {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c852b1530083a620cb0de5f3cd6826f19862bafeaf77586f1aef326e49d95f0c"}, + {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:287605bede6bd36e930577c5925fcea17cb30453d96a7b4c63c14a257118dbb9"}, + {file = "lxml-4.9.1.tar.gz", hash = "sha256:fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f"}, +] markdown = [ {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, @@ -1836,7 +2567,10 @@ mkdocs = [ {file = "mkdocs-1.3.0-py3-none-any.whl", hash = "sha256:26bd2b03d739ac57a3e6eed0b7bcc86168703b719c27b99ad6ca91dc439aacde"}, {file = "mkdocs-1.3.0.tar.gz", hash = "sha256:b504405b04da38795fec9b2e5e28f6aa3a73bb0960cb6d5d27ead28952bd35ea"}, ] -mkdocs-material = [] +mkdocs-material = [ + {file = "mkdocs-material-8.3.9.tar.gz", hash = "sha256:dc82b667d2a83f0de581b46a6d0949732ab77e7638b87ea35b770b33bc02e75a"}, + {file = "mkdocs_material-8.3.9-py2.py3-none-any.whl", hash = "sha256:263f2721f3abe533b61f7c8bed435a0462620912742c919821ac2d698b4bfe67"}, +] mkdocs-material-extensions = [ {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, {file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"}, @@ -1845,11 +2579,82 @@ mpmath = [ {file = "mpmath-1.2.1-py3-none-any.whl", hash = "sha256:604bc21bd22d2322a177c73bdb573994ef76e62edd595d17e00aff24b0667e5c"}, {file = "mpmath-1.2.1.tar.gz", hash = "sha256:79ffb45cf9f4b101a807595bcb3e72e0396202e0b1d25d689134b48c4216a81a"}, ] +multidict = [ + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, + {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, + {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, + {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, + {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, + {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, + {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, + {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, + {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, + {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, + {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, +] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -networkx = [] +netneurotools = [ + {file = "netneurotools-0.2.3-py2.py3-none-any.whl", hash = "sha256:253dbb5e43aeeb359d2b00d9a220cf704407b0faac6d5a4a1b357df442e7d2be"}, + {file = "netneurotools-0.2.3.tar.gz", hash = "sha256:3f5ec8a1fcbbe105db1dd6a1e402158bf639bb8fa3fd2e26b6d5a054a80b9ba0"}, +] +networkx = [ + {file = "networkx-2.8.4-py3-none-any.whl", hash = "sha256:6933b9b3174a0bdf03c911bb4a1ee43a86ce3edeb813e37e1d4c553b3f4a2c4f"}, + {file = "networkx-2.8.4.tar.gz", hash = "sha256:5e53f027c0d567cf1f884dbb283224df525644e43afd1145d64c9d88a3584762"}, +] +neurosynth = [ + {file = "neurosynth-0.3.8.tar.gz", hash = "sha256:97ec422721b454e38ff7a1bd3b084393005299c462464a4aaf1de8044dddf75c"}, +] nibabel = [ {file = "nibabel-2.5.1-py2-none-any.whl", hash = "sha256:88a8867aa5a1eec70dc74c880d149539918b2983430bf3c3f3bca0a46bd9a7f4"}, {file = "nibabel-2.5.1-py3-none-any.whl", hash = "sha256:44678e9ec6151643736329103987c70f4a7b5b251e2ebb7012648365f29e2324"}, @@ -1863,6 +2668,10 @@ nilearn = [ {file = "nilearn-0.7.1-py3-none-any.whl", hash = "sha256:9d2681c7e828f6e1a8715470416c2f3bc752f06fcd1308b0ed0b7bb33fd32c3d"}, {file = "nilearn-0.7.1.tar.gz", hash = "sha256:8b1409a5e1f0f6d1a1f02555c2f11115a2364f45f1e57bcb5fb3c9ea11f346fa"}, ] +nimare = [ + {file = "NiMARE-0.0.2-py3-none-any.whl", hash = "sha256:f2a6595495ead01fd9c035074f1a7ecb5866a50894501c04481d193d5fe92583"}, + {file = "NiMARE-0.0.2.tar.gz", hash = "sha256:e4950c5b8a0b345f2a461f6b8512c02825e49983540fc203b5977fbffd00f332"}, +] nipy = [ {file = "nipy-0.5.0-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:c1e32c37b68efb16ca00bf54b9cf283079a34599e2bf89115db8030577adc1f1"}, {file = "nipy-0.5.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:df3761cf24d89b06c1cf29291104a45dffaef5f78f0a3804c83f0174040c03b0"}, @@ -1897,7 +2706,14 @@ nipype = [ {file = "nipype-1.8.2-py3-none-any.whl", hash = "sha256:00106a707083687da5a9687bf4f41a86170b0b05af803bda73f2260073302daa"}, {file = "nipype-1.8.2.tar.gz", hash = "sha256:c5465ddd9ceba762037cff8d21308b52cd080257fcb13d3f8d677bd1429b222b"}, ] -nodeenv = [] +nltk = [ + {file = "nltk-3.7-py3-none-any.whl", hash = "sha256:ba3de02490308b248f9b94c8bc1ac0683e9aa2ec49ee78536d8667afb5e3eec8"}, + {file = "nltk-3.7.zip", hash = "sha256:d6507d6460cec76d70afea4242a226a7542f85c669177b9c7f562b7cf1b05502"}, +] +nodeenv = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] num2words = [ {file = "num2words-0.5.11-py3-none-any.whl", hash = "sha256:0cabf605a9a0161282affc98ed682c32559963f73b05a23fd5f049b6fa8a2603"}, {file = "num2words-0.5.11.tar.gz", hash = "sha256:6c684e2220d8adb3612d2c807a9772cc3269963fbcd77f7979b689a77f6043d4"}, @@ -1961,7 +2777,70 @@ pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pillow = [] +patsy = [ + {file = "patsy-0.5.2-py2.py3-none-any.whl", hash = "sha256:cc80955ae8c13a7e7c4051eda7b277c8f909f50bc7d73e124bc38e2ee3d95041"}, + {file = "patsy-0.5.2.tar.gz", hash = "sha256:5053de7804676aba62783dbb0f23a2b3d74e35e5bfa238b88b7cbf148a38b69d"}, +] +pillow = [ + {file = "Pillow-9.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a9c9bc489f8ab30906d7a85afac4b4944a572a7432e00698a7239f44a44e6efb"}, + {file = "Pillow-9.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:510cef4a3f401c246cfd8227b300828715dd055463cdca6176c2e4036df8bd4f"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7888310f6214f19ab2b6df90f3f06afa3df7ef7355fc025e78a3044737fab1f5"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831e648102c82f152e14c1a0938689dbb22480c548c8d4b8b248b3e50967b88c"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cc1d2451e8a3b4bfdb9caf745b58e6c7a77d2e469159b0d527a4554d73694d1"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:136659638f61a251e8ed3b331fc6ccd124590eeff539de57c5f80ef3a9594e58"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6e8c66f70fb539301e064f6478d7453e820d8a2c631da948a23384865cd95544"}, + {file = "Pillow-9.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:37ff6b522a26d0538b753f0b4e8e164fdada12db6c6f00f62145d732d8a3152e"}, + {file = "Pillow-9.2.0-cp310-cp310-win32.whl", hash = "sha256:c79698d4cd9318d9481d89a77e2d3fcaeff5486be641e60a4b49f3d2ecca4e28"}, + {file = "Pillow-9.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:254164c57bab4b459f14c64e93df11eff5ded575192c294a0c49270f22c5d93d"}, + {file = "Pillow-9.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:adabc0bce035467fb537ef3e5e74f2847c8af217ee0be0455d4fec8adc0462fc"}, + {file = "Pillow-9.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:336b9036127eab855beec9662ac3ea13a4544a523ae273cbf108b228ecac8437"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50dff9cc21826d2977ef2d2a205504034e3a4563ca6f5db739b0d1026658e004"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb6259196a589123d755380b65127ddc60f4c64b21fc3bb46ce3a6ea663659b0"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0554af24df2bf96618dac71ddada02420f946be943b181108cac55a7a2dcd4"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:15928f824870535c85dbf949c09d6ae7d3d6ac2d6efec80f3227f73eefba741c"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:bdd0de2d64688ecae88dd8935012c4a72681e5df632af903a1dca8c5e7aa871a"}, + {file = "Pillow-9.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5b87da55a08acb586bad5c3aa3b86505f559b84f39035b233d5bf844b0834b1"}, + {file = "Pillow-9.2.0-cp311-cp311-win32.whl", hash = "sha256:b6d5e92df2b77665e07ddb2e4dbd6d644b78e4c0d2e9272a852627cdba0d75cf"}, + {file = "Pillow-9.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6bf088c1ce160f50ea40764f825ec9b72ed9da25346216b91361eef8ad1b8f8c"}, + {file = "Pillow-9.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:2c58b24e3a63efd22554c676d81b0e57f80e0a7d3a5874a7e14ce90ec40d3069"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef7592281f7c174d3d6cbfbb7ee5984a671fcd77e3fc78e973d492e9bf0eb3f"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcd7b9c7139dc8258d164b55696ecd16c04607f1cc33ba7af86613881ffe4ac8"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a138441e95562b3c078746a22f8fca8ff1c22c014f856278bdbdd89ca36cff1b"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:93689632949aff41199090eff5474f3990b6823404e45d66a5d44304e9cdc467"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:f3fac744f9b540148fa7715a435d2283b71f68bfb6d4aae24482a890aed18b59"}, + {file = "Pillow-9.2.0-cp37-cp37m-win32.whl", hash = "sha256:fa768eff5f9f958270b081bb33581b4b569faabf8774726b283edb06617101dc"}, + {file = "Pillow-9.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:69bd1a15d7ba3694631e00df8de65a8cb031911ca11f44929c97fe05eb9b6c1d"}, + {file = "Pillow-9.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:030e3460861488e249731c3e7ab59b07c7853838ff3b8e16aac9561bb345da14"}, + {file = "Pillow-9.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:74a04183e6e64930b667d321524e3c5361094bb4af9083db5c301db64cd341f3"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d33a11f601213dcd5718109c09a52c2a1c893e7461f0be2d6febc2879ec2402"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fd6f5e3c0e4697fa7eb45b6e93996299f3feee73a3175fa451f49a74d092b9f"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a647c0d4478b995c5e54615a2e5360ccedd2f85e70ab57fbe817ca613d5e63b8"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:4134d3f1ba5f15027ff5c04296f13328fecd46921424084516bdb1b2548e66ff"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:bc431b065722a5ad1dfb4df354fb9333b7a582a5ee39a90e6ffff688d72f27a1"}, + {file = "Pillow-9.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1536ad017a9f789430fb6b8be8bf99d2f214c76502becc196c6f2d9a75b01b76"}, + {file = "Pillow-9.2.0-cp38-cp38-win32.whl", hash = "sha256:2ad0d4df0f5ef2247e27fc790d5c9b5a0af8ade9ba340db4a73bb1a4a3e5fb4f"}, + {file = "Pillow-9.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:ec52c351b35ca269cb1f8069d610fc45c5bd38c3e91f9ab4cbbf0aebc136d9c8"}, + {file = "Pillow-9.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ed2c4ef2451de908c90436d6e8092e13a43992f1860275b4d8082667fbb2ffc"}, + {file = "Pillow-9.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ad2f835e0ad81d1689f1b7e3fbac7b01bb8777d5a985c8962bedee0cc6d43da"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea98f633d45f7e815db648fd7ff0f19e328302ac36427343e4432c84432e7ff4"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7761afe0126d046974a01e030ae7529ed0ca6a196de3ec6937c11df0df1bc91c"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a54614049a18a2d6fe156e68e188da02a046a4a93cf24f373bffd977e943421"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:5aed7dde98403cd91d86a1115c78d8145c83078e864c1de1064f52e6feb61b20"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:13b725463f32df1bfeacbf3dd197fb358ae8ebcd8c5548faa75126ea425ccb60"}, + {file = "Pillow-9.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:808add66ea764ed97d44dda1ac4f2cfec4c1867d9efb16a33d158be79f32b8a4"}, + {file = "Pillow-9.2.0-cp39-cp39-win32.whl", hash = "sha256:337a74fd2f291c607d220c793a8135273c4c2ab001b03e601c36766005f36885"}, + {file = "Pillow-9.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:fac2d65901fb0fdf20363fbd345c01958a742f2dc62a8dd4495af66e3ff502a4"}, + {file = "Pillow-9.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ad2277b185ebce47a63f4dc6302e30f05762b688f8dc3de55dbae4651872cdf3"}, + {file = "Pillow-9.2.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c7b502bc34f6e32ba022b4a209638f9e097d7a9098104ae420eb8186217ebbb"}, + {file = "Pillow-9.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1f14f5f691f55e1b47f824ca4fdcb4b19b4323fe43cc7bb105988cad7496be"}, + {file = "Pillow-9.2.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:dfe4c1fedfde4e2fbc009d5ad420647f7730d719786388b7de0999bf32c0d9fd"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:f07f1f00e22b231dd3d9b9208692042e29792d6bd4f6639415d2f23158a80013"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1802f34298f5ba11d55e5bb09c31997dc0c6aed919658dfdf0198a2fe75d5490"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17d4cafe22f050b46d983b71c707162d63d796a1235cdf8b9d7a112e97b15bac"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96b5e6874431df16aee0c1ba237574cb6dff1dcb173798faa6a9d8b399a05d0e"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0030fdbd926fb85844b8b92e2f9449ba89607231d3dd597a21ae72dc7fe26927"}, + {file = "Pillow-9.2.0.tar.gz", hash = "sha256:75e636fd3e0fb872693f23ccb8a5ff2cd578801251f3a4f6854c6a5d437d3c04"}, +] platformdirs = [ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, @@ -1970,6 +2849,10 @@ pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] +ply = [ + {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, + {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, +] pre-commit = [ {file = "pre_commit-2.19.0-py2.py3-none-any.whl", hash = "sha256:10c62741aa5704faea2ad69cb550ca78082efe5697d6f04e5710c3c229afdd10"}, {file = "pre_commit-2.19.0.tar.gz", hash = "sha256:4233a1e38621c87d9dda9808c6606d7e7ba0e087cd56d3fe03202a01d2919615"}, @@ -2009,6 +2892,9 @@ pymdown-extensions = [ {file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"}, {file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"}, ] +pyneurovault = [ + {file = "pyneurovault-0.1.3.tar.gz", hash = "sha256:c4a9a0fd000fbc02ce4dee71272f56101ab93535d8c40e07b893f0f70b74d3a3"}, +] pyparsing = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, @@ -2081,6 +2967,13 @@ pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, @@ -2116,6 +3009,96 @@ rdflib = [ {file = "rdflib-6.1.1-py3-none-any.whl", hash = "sha256:fc81cef513cd552d471f2926141396b633207109d0154c8e77926222c70367fe"}, {file = "rdflib-6.1.1.tar.gz", hash = "sha256:8dbfa0af2990b98471dacbc936d6494c997ede92fd8ed693fb84ee700ef6f754"}, ] +regex = [ + {file = "regex-2022.9.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0394265391a86e2bbaa7606e59ac71bd9f1edf8665a59e42771a9c9adbf6fd4f"}, + {file = "regex-2022.9.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86df2049b18745f3cd4b0f4c4ef672bfac4b80ca488e6ecfd2bbfe68d2423a2c"}, + {file = "regex-2022.9.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce331b076b2b013e7d7f07157f957974ef0b0881a808e8a4a4b3b5105aee5d04"}, + {file = "regex-2022.9.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:360ffbc9357794ae41336b681dff1c0463193199dfb91fcad3ec385ea4972f46"}, + {file = "regex-2022.9.13-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18e503b1e515a10282b3f14f1b3d856194ecece4250e850fad230842ed31227f"}, + {file = "regex-2022.9.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e167d1ccd41d27b7b6655bb7a2dcb1b1eb1e0d2d662043470bd3b4315d8b2b"}, + {file = "regex-2022.9.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4146cb7ae6029fc83b5c905ec6d806b7e5568dc14297c423e66b86294bad6c39"}, + {file = "regex-2022.9.13-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a1aec4ae549fd7b3f52ceaf67e133010e2fba1538bf4d5fc5cd162a5e058d5df"}, + {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cab548d6d972e1de584161487b2ac1aa82edd8430d1bde69587ba61698ad1cfb"}, + {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3d64e1a7e6d98a4cdc8b29cb8d8ed38f73f49e55fbaa737bdb5933db99b9de22"}, + {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:67a4c625361db04ae40ef7c49d3cbe2c1f5ff10b5a4491327ab20f19f2fb5d40"}, + {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:5d0dd8b06896423211ce18fba0c75dacc49182a1d6514c004b535be7163dca0f"}, + {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4318f69b79f9f7d84a7420e97d4bfe872dc767c72f891d4fea5fa721c74685f7"}, + {file = "regex-2022.9.13-cp310-cp310-win32.whl", hash = "sha256:26df88c9636a0c3f3bd9189dd435850a0c49d0b7d6e932500db3f99a6dd604d1"}, + {file = "regex-2022.9.13-cp310-cp310-win_amd64.whl", hash = "sha256:6fe1dd1021e0f8f3f454ce2811f1b0b148f2d25bb38c712fec00316551e93650"}, + {file = "regex-2022.9.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83cc32a1a2fa5bac00f4abc0e6ce142e3c05d3a6d57e23bd0f187c59b4e1e43b"}, + {file = "regex-2022.9.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2effeaf50a6838f3dd4d3c5d265f06eabc748f476e8441892645ae3a697e273"}, + {file = "regex-2022.9.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a786a55d00439d8fae4caaf71581f2aaef7297d04ee60345c3594efef5648a"}, + {file = "regex-2022.9.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b701dbc124558fd2b1b08005eeca6c9160e209108fbcbd00091fcfac641ac7"}, + {file = "regex-2022.9.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dab81cc4d58026861445230cfba27f9825e9223557926e7ec22156a1a140d55c"}, + {file = "regex-2022.9.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0c5cc3d1744a67c3b433dce91e5ef7c527d612354c1f1e8576d9e86bc5c5e2"}, + {file = "regex-2022.9.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:518272f25da93e02af4f1e94985f5042cec21557ef3591027d0716f2adda5d0a"}, + {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8418ee2cb857b83881b8f981e4c636bc50a0587b12d98cb9b947408a3c484fe7"}, + {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cfa4c956ff0a977c4823cb3b930b0a4e82543b060733628fec7ab3eb9b1abe37"}, + {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a1c4d17879dd4c4432c08a1ca1ab379f12ab54af569e945b6fc1c4cf6a74ca45"}, + {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:77c2879d3ba51e5ca6c2b47f2dcf3d04a976a623a8fc8236010a16c9e0b0a3c7"}, + {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2885ec6eea629c648ecc9bde0837ec6b92208b7f36381689937fe5d64a517e8"}, + {file = "regex-2022.9.13-cp311-cp311-win32.whl", hash = "sha256:2dda4b096a6f630d6531728a45bd12c67ec3badf44342046dc77d4897277d4f2"}, + {file = "regex-2022.9.13-cp311-cp311-win_amd64.whl", hash = "sha256:592b9e2e1862168e71d9e612bfdc22c451261967dbd46681f14e76dfba7105fd"}, + {file = "regex-2022.9.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:df8fe00b60e4717662c7f80c810ba66dcc77309183c76b7754c0dff6f1d42054"}, + {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995e70bb8c91d1b99ed2aaf8ec44863e06ad1dfbb45d7df95f76ef583ec323a9"}, + {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad75173349ad79f9d21e0d0896b27dcb37bfd233b09047bc0b4d226699cf5c87"}, + {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7681c49da1a2d4b905b4f53d86c9ba4506e79fba50c4a664d9516056e0f7dfcc"}, + {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bc8edc5f8ef0ebb46f3fa0d02bd825bbe9cc63d59e428ffb6981ff9672f6de1"}, + {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bee775ff05c9d519195bd9e8aaaccfe3971db60f89f89751ee0f234e8aeac5"}, + {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1a901ce5cd42658ab8f8eade51b71a6d26ad4b68c7cfc86b87efc577dfa95602"}, + {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:14a7ab070fa3aec288076eed6ed828587b805ef83d37c9bfccc1a4a7cfbd8111"}, + {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d23ac6b4bf9e32fcde5fcdb2e1fd5e7370d6693fcac51ee1d340f0e886f50d1f"}, + {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:4cdbfa6d2befeaee0c899f19222e9b20fc5abbafe5e9c43a46ef819aeb7b75e5"}, + {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ab07934725e6f25c6f87465976cc69aef1141e86987af49d8c839c3ffd367c72"}, + {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d2a1371dc73e921f3c2e087c05359050f3525a9a34b476ebc8130e71bec55e97"}, + {file = "regex-2022.9.13-cp36-cp36m-win32.whl", hash = "sha256:fcbd1edff1473d90dc5cf4b52d355cf1f47b74eb7c85ba6e45f45d0116b8edbd"}, + {file = "regex-2022.9.13-cp36-cp36m-win_amd64.whl", hash = "sha256:fe428822b7a8c486bcd90b334e9ab541ce6cc0d6106993d59f201853e5e14121"}, + {file = "regex-2022.9.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d7430f041755801b712ec804aaf3b094b9b5facbaa93a6339812a8e00d7bd53a"}, + {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:079c182f99c89524069b9cd96f5410d6af437e9dca576a7d59599a574972707e"}, + {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59bac44b5a07b08a261537f652c26993af9b1bbe2a29624473968dd42fc29d56"}, + {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a59d0377e58d96a6f11636e97992f5b51b7e1e89eb66332d1c01b35adbabfe8a"}, + {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9d68eb704b24bc4d441b24e4a12653acd07d2c39940548761e0985a08bc1fff"}, + {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0385d66e73cdd4462f3cc42c76a6576ddcc12472c30e02a2ae82061bff132c32"}, + {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db45016364eec9ddbb5af93c8740c5c92eb7f5fc8848d1ae04205a40a1a2efc6"}, + {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:03ff695518482b946a6d3d4ce9cbbd99a21320e20d94913080aa3841f880abcd"}, + {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6b32b45433df1fad7fed738fe15200b6516da888e0bd1fdd6aa5e50cc16b76bc"}, + {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:003a2e1449d425afc817b5f0b3d4c4aa9072dd5f3dfbf6c7631b8dc7b13233de"}, + {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a9eb9558e1d0f78e07082d8a70d5c4d631c8dd75575fae92105df9e19c736730"}, + {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f6e0321921d2fdc082ef90c1fd0870f129c2e691bfdc4937dcb5cd308aba95c4"}, + {file = "regex-2022.9.13-cp37-cp37m-win32.whl", hash = "sha256:3f3b4594d564ed0b2f54463a9f328cf6a5b2a32610a90cdff778d6e3e561d08b"}, + {file = "regex-2022.9.13-cp37-cp37m-win_amd64.whl", hash = "sha256:8aba0d01e3dfd335f2cb107079b07fdddb4cd7fb2d8c8a1986f9cb8ce9246c24"}, + {file = "regex-2022.9.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:944567bb08f52268d8600ee5bdf1798b2b62ea002cc692a39cec113244cbdd0d"}, + {file = "regex-2022.9.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b664a4d33ffc6be10996606dfc25fd3248c24cc589c0b139feb4c158053565e"}, + {file = "regex-2022.9.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f06cc1190f3db3192ab8949e28f2c627e1809487e2cfc435b6524c1ce6a2f391"}, + {file = "regex-2022.9.13-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c57d50d4d5eb0c862569ca3c840eba2a73412f31d9ecc46ef0d6b2e621a592b"}, + {file = "regex-2022.9.13-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19a4da6f513045f5ba00e491215bd00122e5bd131847586522463e5a6b2bd65f"}, + {file = "regex-2022.9.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a926339356fe29595f8e37af71db37cd87ff764e15da8ad5129bbaff35bcc5a6"}, + {file = "regex-2022.9.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:091efcfdd4178a7e19a23776dc2b1fafb4f57f4d94daf340f98335817056f874"}, + {file = "regex-2022.9.13-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:880dbeb6bdde7d926b4d8e41410b16ffcd4cb3b4c6d926280fea46e2615c7a01"}, + {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:73b985c9fc09a7896846e26d7b6f4d1fd5a20437055f4ef985d44729f9f928d0"}, + {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c0b7cb9598795b01f9a3dd3f770ab540889259def28a3bf9b2fa24d52edecba3"}, + {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37e5a26e76c46f54b3baf56a6fdd56df9db89758694516413757b7d127d4c57b"}, + {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:99945ddb4f379bb9831c05e9f80f02f079ba361a0fb1fba1fc3b267639b6bb2e"}, + {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dcbcc9e72a791f622a32d17ff5011326a18996647509cac0609a7fc43adc229"}, + {file = "regex-2022.9.13-cp38-cp38-win32.whl", hash = "sha256:d3102ab9bf16bf541ca228012d45d88d2a567c9682a805ae2c145a79d3141fdd"}, + {file = "regex-2022.9.13-cp38-cp38-win_amd64.whl", hash = "sha256:14216ea15efc13f28d0ef1c463d86d93ca7158a79cd4aec0f9273f6d4c6bb047"}, + {file = "regex-2022.9.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9a165a05979e212b2c2d56a9f40b69c811c98a788964e669eb322de0a3e420b4"}, + {file = "regex-2022.9.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:14c71437ffb89479c89cc7022a5ea2075a842b728f37205e47c824cc17b30a42"}, + {file = "regex-2022.9.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee7045623a5ace70f3765e452528b4c1f2ce669ed31959c63f54de64fe2f6ff7"}, + {file = "regex-2022.9.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6e521d9db006c5e4a0f8acfef738399f72b704913d4e083516774eb51645ad7c"}, + {file = "regex-2022.9.13-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b86548b8234b2be3985dbc0b385e35f5038f0f3e6251464b827b83ebf4ed90e5"}, + {file = "regex-2022.9.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b39ee3b280e15824298b97cec3f7cbbe6539d8282cc8a6047a455b9a72c598"}, + {file = "regex-2022.9.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6e6e61e9a38b6cc60ca3e19caabc90261f070f23352e66307b3d21a24a34aaf"}, + {file = "regex-2022.9.13-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d837ccf3bd2474feabee96cd71144e991472e400ed26582edc8ca88ce259899c"}, + {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6adfe300848d61a470ec7547adc97b0ccf86de86a99e6830f1d8c8d19ecaf6b3"}, + {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d5b003d248e6f292475cd24b04e5f72c48412231961a675edcb653c70730e79e"}, + {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d5edd3eb877c9fc2e385173d4a4e1d792bf692d79e25c1ca391802d36ecfaa01"}, + {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:50e764ffbd08b06aa8c4e86b8b568b6722c75d301b33b259099f237c46b2134e"}, + {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d43bd402b27e0e7eae85c612725ba1ce7798f20f6fab4e8bc3de4f263294f03"}, + {file = "regex-2022.9.13-cp39-cp39-win32.whl", hash = "sha256:7fcf7f94ccad19186820ac67e2ec7e09e0ac2dac39689f11cf71eac580503296"}, + {file = "regex-2022.9.13-cp39-cp39-win_amd64.whl", hash = "sha256:322bd5572bed36a5b39952d88e072738926759422498a96df138d93384934ff8"}, + {file = "regex-2022.9.13.tar.gz", hash = "sha256:f07373b6e56a6f3a0df3d75b651a278ca7bd357a796078a26a958ea1ce0588fd"}, +] requests = [ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, @@ -2300,10 +3283,39 @@ sqlalchemy = [ {file = "SQLAlchemy-1.3.24-cp39-cp39-win_amd64.whl", hash = "sha256:09083c2487ca3c0865dc588e07aeaa25416da3d95f7482c07e92f47e080aa17b"}, {file = "SQLAlchemy-1.3.24.tar.gz", hash = "sha256:ebbb777cbf9312359b897bf81ba00dae0f5cb69fba2a18265dcc18a6f5ef7519"}, ] +statsmodels = [ + {file = "statsmodels-0.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e7ca5b7e678c0bb7a24f5c735d58ac104a50eb61b17c484cce0e221a095560f"}, + {file = "statsmodels-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:066a75d5585378b2df972f81a90b9a3da5e567b7d4833300c1597438c1a35e29"}, + {file = "statsmodels-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f15f38dfc9c5c091662cb619e12322047368c67aef449c7554d9b324a15f7a94"}, + {file = "statsmodels-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c4ccc6b4744613367e8a233bd952c8a838db8f528f9fe033bda25aa13fc7d08"}, + {file = "statsmodels-0.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:855b1cc2a91ab140b9bcf304b1731705805ce73223bf500b988804968554c0ed"}, + {file = "statsmodels-0.13.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b69c9af7606325095f7c40c581957bad9f28775653d41537c1ec4cd1b185ff5b"}, + {file = "statsmodels-0.13.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab31bac0f72b83bca1f217a12ec6f309a56485a50c4a705fbdd63112213d4da4"}, + {file = "statsmodels-0.13.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d680b910b57fc0aa87472662cdfe09aae0e21db4bdf19ccd6420fd4dffda892"}, + {file = "statsmodels-0.13.2-cp37-cp37m-win32.whl", hash = "sha256:9e9a3f661d372431850d55157d049e079493c97fc06f550d23d8c8c70805cc48"}, + {file = "statsmodels-0.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c9f6326870c095ef688f072cd476b932aff0906d60193eaa08e93ec23b29ca83"}, + {file = "statsmodels-0.13.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bc050f25f1ba1221efef9ea01b751c60935ad787fcd4259f4ece986f2da9141"}, + {file = "statsmodels-0.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:426b1c8ea3918d3d27dbfa38f2bee36cabf41d32163e2cbb3adfb0178b24626a"}, + {file = "statsmodels-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b80fac4a63308b1e93fa9dc27a8598930fd5dfd77c850ca077bb850254c6d7"}, + {file = "statsmodels-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ee69ec0e0f79f627245c65f8a495b8581c2ea19084aac63941815feb15dcf3"}, + {file = "statsmodels-0.13.2-cp38-cp38-win32.whl", hash = "sha256:20483cc30e11aa072b30d307bb80470f86a23ae8fffa51439ca54509d7aa9b05"}, + {file = "statsmodels-0.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:bf43051a92231ccb9de95e4b6d22d3b15e499ee5ee9bff0a20e6b6ad293e34cb"}, + {file = "statsmodels-0.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bf0dfed5f5edb59b5922b295392cd276463b10a5e730f7e57ee4ff2d8e9a87e"}, + {file = "statsmodels-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a403b559c5586dab7ac0fc9e754c737b017c96cce0ddd66ff9094764cdaf293d"}, + {file = "statsmodels-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f23554dd025ea354ce072ba32bfaa840d2b856372e5734290e181d27a1f9e0c"}, + {file = "statsmodels-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815f4df713e3eb6f40ae175c71f2a70d32f9219b5b4d23d4e0faab1171ba93ba"}, + {file = "statsmodels-0.13.2-cp39-cp39-win32.whl", hash = "sha256:461c82ab2265fa8457b96afc23ef3ca19f42eb070436e0241b57e58a38863901"}, + {file = "statsmodels-0.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:39daab5a8a9332c8ea83d6464d065080c9ba65f236daf6a64aa18f64ef776fad"}, + {file = "statsmodels-0.13.2.tar.gz", hash = "sha256:77dc292c9939c036a476f1770f9d08976b05437daa229928da73231147cde7d4"}, +] sympy = [ {file = "sympy-1.10.1-py3-none-any.whl", hash = "sha256:df75d738930f6fe9ebe7034e59d56698f29e85f443f743e51e47df0caccc2130"}, {file = "sympy-1.10.1.tar.gz", hash = "sha256:5939eeffdf9e152172601463626c022a2c27e75cf6278de8d401d50c9d58787b"}, ] +templateflow = [ + {file = "templateflow-0.8.1-py3-none-any.whl", hash = "sha256:04e79f873f25576d779276a0bf72cf944cfc3cc582d32f4f38f751a308a00a23"}, + {file = "templateflow-0.8.1.tar.gz", hash = "sha256:1c89817d237a4eb3b390be1f36f5f45c4fb37725458ee45b3933fa5ea8b92710"}, +] threadpoolctl = [ {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, @@ -2320,6 +3332,10 @@ tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +tqdm = [ + {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, + {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, +] traits = [ {file = "traits-6.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6202ef3b2eb25663418b7afcacc998ebebcffcb629cefc8bc467e09967c71334"}, {file = "traits-6.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4241fd3877f51c5bfa00146eeba9bf20c2c58e5f985f4def2a2e7a910567768"}, @@ -2356,6 +3372,10 @@ traits = [ {file = "traits-6.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:4ed07efffa7f045d69561f45bfa0d36a0a6790adea1575b5d3a5f0e433c9f241"}, {file = "traits-6.3.2.tar.gz", hash = "sha256:4520ef4a675181f38be4a5bab1b1d5472691597fe2cfe4faf91023e89407e2c6"}, ] +trimesh = [ + {file = "trimesh-3.15.1-py3-none-any.whl", hash = "sha256:dfe640e012492ee056e4b58724ae488187efc0e731f6fb1eb471819bbe421252"}, + {file = "trimesh-3.15.1.tar.gz", hash = "sha256:fa72bf509d54172bd345842652c09366fc5c56dc340cc8962f724b6095adb137"}, +] typing-extensions = [ {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"}, {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"}, @@ -2364,7 +3384,29 @@ urllib3 = [ {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] -virtualenv = [] +virtualenv = [ + {file = "virtualenv-20.15.1-py2.py3-none-any.whl", hash = "sha256:b30aefac647e86af6d82bfc944c556f8f1a9c90427b2fb4e3bfbf338cb82becf"}, + {file = "virtualenv-20.15.1.tar.gz", hash = "sha256:288171134a2ff3bfb1a2f54f119e77cd1b81c29fc1265a2356f3e8d14c7d58c4"}, +] +vtk = [ + {file = "vtk-9.2.0rc2-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:93283072ef0b83a824f1cf9f6cd0da432285a49de97fe8751f301f5421c8a55e"}, + {file = "vtk-9.2.0rc2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f7549c364b3652d435d2b8adaa7aea5028011195125f75ce6e14069adfd2be6a"}, + {file = "vtk-9.2.0rc2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f83b013d6bf87bc4b3cdee3511debf43c813aedcaf4ea900f32b29804a4ecbf"}, + {file = "vtk-9.2.0rc2-cp310-cp310-win_amd64.whl", hash = "sha256:01d5e3ef394549de98390a43f30704debc800cf2ba5fc81ee7120d1ff98c3851"}, + {file = "vtk-9.2.0rc2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:87c2928e5aa5f6f628c9ba18516c06c1df997f29470ffec3072b700ba96c72b5"}, + {file = "vtk-9.2.0rc2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5244cb422961bc2cda7de08999cf28db4182255d541290c2cdec25c903c8f280"}, + {file = "vtk-9.2.0rc2-cp36-cp36m-win_amd64.whl", hash = "sha256:ef618e5ae53ae0d2fc69f0fc508749ad688e39eb2fe76cfcc5aaa6bc57159616"}, + {file = "vtk-9.2.0rc2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:6dcaa11f03eb202af83e9eac9c963e29076faa2068619e40af658cfb3168d836"}, + {file = "vtk-9.2.0rc2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:729a20951b084f86736843df4552c1571e1d17983a8a094d6a439a8e999e3f2a"}, + {file = "vtk-9.2.0rc2-cp37-cp37m-win_amd64.whl", hash = "sha256:9ab6c4c23772deaa5445996b90f58c532d2f1134a45873a9367b5b273e57ab4c"}, + {file = "vtk-9.2.0rc2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6dae259ca481099ef1d92caec4eaabfaab2859b5b98278c2c08f0b84a95395c1"}, + {file = "vtk-9.2.0rc2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab9312b6fdc8f833cd64e4c4db8257cc8a7f97a3454c29406bbd7794eed6eeaf"}, + {file = "vtk-9.2.0rc2-cp38-cp38-win_amd64.whl", hash = "sha256:2dde2a50d632871b1e6dce4efffd3e20267852d11f514427ac82c141e84032d9"}, + {file = "vtk-9.2.0rc2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:c5068e2cf09c3549b080690306df7e54cf1019c5d42134534a2d94458b6f793f"}, + {file = "vtk-9.2.0rc2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:90d51e0faeb8ad960c69f0c496fa77663a50ed6f745601e5497f836ab8f45597"}, + {file = "vtk-9.2.0rc2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebfc46d238936ef95ef6bedfa1f849c8862c1581412f829e04d239e2b79fbb4c"}, + {file = "vtk-9.2.0rc2-cp39-cp39-win_amd64.whl", hash = "sha256:060a9d376d38daab9caac18d9cfe3cb63dbcb316d4a552c59be30192ef94d9e2"}, +] watchdog = [ {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"}, {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"}, @@ -2458,6 +3500,10 @@ wrapt = [ {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] +wslink = [ + {file = "wslink-1.8.2-py3-none-any.whl", hash = "sha256:49c69e34ced8f21bf543db946a2824de4bb5629674511ebcf8b008d35af3240c"}, + {file = "wslink-1.8.2.tar.gz", hash = "sha256:627c0abfd184c0d65a432b0e616660c8614c1e95167259c287f1fdec25a3ae4f"}, +] xgboost = [ {file = "xgboost-1.6.1-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:2b3d4ee105f8434873b40edc511330b8276bf3a8d9d42fb0319973079df30b07"}, {file = "xgboost-1.6.1-py3-none-macosx_12_0_arm64.whl", hash = "sha256:bd3e59a5490e010004106d8ea1d07aa8e048be51a0974fca6b4f00988f087ab8"}, @@ -2473,6 +3519,67 @@ xlrd = [ xvfbwrapper = [ {file = "xvfbwrapper-0.2.9.tar.gz", hash = "sha256:bcf4ae571941b40254faf7a73432dfc119ad21ce688f1fdec533067037ecfc24"}, ] +yarl = [ + {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:abc06b97407868ef38f3d172762f4069323de52f2b70d133d096a48d72215d28"}, + {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07b21e274de4c637f3e3b7104694e53260b5fc10d51fb3ec5fed1da8e0f754e3"}, + {file = "yarl-1.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9de955d98e02fab288c7718662afb33aab64212ecb368c5dc866d9a57bf48880"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ec362167e2c9fd178f82f252b6d97669d7245695dc057ee182118042026da40"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20df6ff4089bc86e4a66e3b1380460f864df3dd9dccaf88d6b3385d24405893b"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5999c4662631cb798496535afbd837a102859568adc67d75d2045e31ec3ac497"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed19b74e81b10b592084a5ad1e70f845f0aacb57577018d31de064e71ffa267a"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e4808f996ca39a6463f45182e2af2fae55e2560be586d447ce8016f389f626f"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d800b9c2eaf0684c08be5f50e52bfa2aa920e7163c2ea43f4f431e829b4f0fd"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6628d750041550c5d9da50bb40b5cf28a2e63b9388bac10fedd4f19236ef4957"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f5af52738e225fcc526ae64071b7e5342abe03f42e0e8918227b38c9aa711e28"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:76577f13333b4fe345c3704811ac7509b31499132ff0181f25ee26619de2c843"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c03f456522d1ec815893d85fccb5def01ffaa74c1b16ff30f8aaa03eb21e453"}, + {file = "yarl-1.8.1-cp310-cp310-win32.whl", hash = "sha256:ea30a42dc94d42f2ba4d0f7c0ffb4f4f9baa1b23045910c0c32df9c9902cb272"}, + {file = "yarl-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:9130ddf1ae9978abe63808b6b60a897e41fccb834408cde79522feb37fb72fb0"}, + {file = "yarl-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0ab5a138211c1c366404d912824bdcf5545ccba5b3ff52c42c4af4cbdc2c5035"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0fb2cb4204ddb456a8e32381f9a90000429489a25f64e817e6ff94879d432fc"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85cba594433915d5c9a0d14b24cfba0339f57a2fff203a5d4fd070e593307d0b"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca7e596c55bd675432b11320b4eacc62310c2145d6801a1f8e9ad160685a231"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f77539733e0ec2475ddcd4e26777d08996f8cd55d2aef82ec4d3896687abda"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29e256649f42771829974e742061c3501cc50cf16e63f91ed8d1bf98242e5507"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7fce6cbc6c170ede0221cc8c91b285f7f3c8b9fe28283b51885ff621bbe0f8ee"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:59ddd85a1214862ce7c7c66457f05543b6a275b70a65de366030d56159a979f0"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:12768232751689c1a89b0376a96a32bc7633c08da45ad985d0c49ede691f5c0d"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:b19255dde4b4f4c32e012038f2c169bb72e7f081552bea4641cab4d88bc409dd"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6c8148e0b52bf9535c40c48faebb00cb294ee577ca069d21bd5c48d302a83780"}, + {file = "yarl-1.8.1-cp37-cp37m-win32.whl", hash = "sha256:de839c3a1826a909fdbfe05f6fe2167c4ab033f1133757b5936efe2f84904c07"}, + {file = "yarl-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:dd032e8422a52e5a4860e062eb84ac94ea08861d334a4bcaf142a63ce8ad4802"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19cd801d6f983918a3f3a39f3a45b553c015c5aac92ccd1fac619bd74beece4a"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6347f1a58e658b97b0a0d1ff7658a03cb79bdbda0331603bed24dd7054a6dea1"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c0da7e44d0c9108d8b98469338705e07f4bb7dab96dbd8fa4e91b337db42548"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5587bba41399854703212b87071c6d8638fa6e61656385875f8c6dff92b2e461"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31a9a04ecccd6b03e2b0e12e82131f1488dea5555a13a4d32f064e22a6003cfe"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:205904cffd69ae972a1707a1bd3ea7cded594b1d773a0ce66714edf17833cdae"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea513a25976d21733bff523e0ca836ef1679630ef4ad22d46987d04b372d57fc"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0b51530877d3ad7a8d47b2fff0c8df3b8f3b8deddf057379ba50b13df2a5eae"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2b8f245dad9e331540c350285910b20dd913dc86d4ee410c11d48523c4fd546"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ab2a60d57ca88e1d4ca34a10e9fb4ab2ac5ad315543351de3a612bbb0560bead"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:449c957ffc6bc2309e1fbe67ab7d2c1efca89d3f4912baeb8ead207bb3cc1cd4"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a165442348c211b5dea67c0206fc61366212d7082ba8118c8c5c1c853ea4d82e"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b3ded839a5c5608eec8b6f9ae9a62cb22cd037ea97c627f38ae0841a48f09eae"}, + {file = "yarl-1.8.1-cp38-cp38-win32.whl", hash = "sha256:c1445a0c562ed561d06d8cbc5c8916c6008a31c60bc3655cdd2de1d3bf5174a0"}, + {file = "yarl-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:56c11efb0a89700987d05597b08a1efcd78d74c52febe530126785e1b1a285f4"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e80ed5a9939ceb6fda42811542f31c8602be336b1fb977bccb012e83da7e4936"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6afb336e23a793cd3b6476c30f030a0d4c7539cd81649683b5e0c1b0ab0bf350"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c322cbaa4ed78a8aac89b2174a6df398faf50e5fc12c4c191c40c59d5e28357"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fae37373155f5ef9b403ab48af5136ae9851151f7aacd9926251ab26b953118b"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5395da939ffa959974577eff2cbfc24b004a2fb6c346918f39966a5786874e54"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:076eede537ab978b605f41db79a56cad2e7efeea2aa6e0fa8f05a26c24a034fb"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1a50e461615747dd93c099f297c1994d472b0f4d2db8a64e55b1edf704ec1c"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7de89c8456525650ffa2bb56a3eee6af891e98f498babd43ae307bd42dca98f6"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a88510731cd8d4befaba5fbd734a7dd914de5ab8132a5b3dde0bbd6c9476c64"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d93a049d29df172f48bcb09acf9226318e712ce67374f893b460b42cc1380ae"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:21ac44b763e0eec15746a3d440f5e09ad2ecc8b5f6dcd3ea8cb4773d6d4703e3"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d0272228fabe78ce00a3365ffffd6f643f57a91043e119c289aaba202f4095b0"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99449cd5366fe4608e7226c6cae80873296dfa0cde45d9b498fefa1de315a09e"}, + {file = "yarl-1.8.1-cp39-cp39-win32.whl", hash = "sha256:8b0af1cf36b93cee99a31a545fe91d08223e64390c5ecc5e94c39511832a4bb6"}, + {file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"}, + {file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"}, +] zipp = [ {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, diff --git a/pyproject.toml b/pyproject.toml index 3ba5e4f6e..fac0ce283 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ jinja2 = "^3" xvfbwrapper = "*" numpy = "^1.17" scikit-learn = "^1.0" -nilearn = "^0.7.0" +nilearn = {version = "^0.7.0", extras = ["plotting"]} colorlog = "^5" xgboost = "*" scipy = "^1.7" @@ -59,6 +59,9 @@ mkdocs-material = {version = ">=7.1.8", optional= true} pymdown-extensions = {version = "*", optional = true} attrs = ">=20.1.0" cattrs = "^1.9.0" +brainstat = "^0.3.6" +brainspace = "^v0.1.4" +vtk = {version = "^9.2.0rc1", allow-prereleases = true} [tool.poetry.dev-dependencies] black = "*" diff --git a/test/nonregression/pipelines/test_run_pipelines_stats.py b/test/nonregression/pipelines/test_run_pipelines_stats.py index 874cfd294..897a72ef7 100644 --- a/test/nonregression/pipelines/test_run_pipelines_stats.py +++ b/test/nonregression/pipelines/test_run_pipelines_stats.py @@ -86,26 +86,36 @@ def run_StatisticsSurface( pipeline.run(plugin="MultiProc", plugin_args={"n_procs": 1}, bypass_check=True) # Check files - filename = "group-UnitTest_AD-lt-CN_measure-ct_fwhm-20_correctedPValue.mat" - out_file = ( - caps_dir - / "groups" - / "group-UnitTest" - / "statistics" - / "surfstat_group_comparison" - / filename - ) - ref_file = ref_dir / filename - - out_file_mat = loadmat(fspath(out_file))["correctedpvaluesstruct"] - ref_file_mat = loadmat(fspath(ref_file))["correctedpvaluesstruct"] - for i in range(4): - assert np.allclose( - out_file_mat[0][0][i], - ref_file_mat[0][0][i], - rtol=1e-8, - equal_nan=True, - ) + for contrast in ["AD-lt-CN", "CN-lt-AD"]: + for suffix, struct in zip( + ["coefficients", "uncorrectedPValue", "FDR", "correctedPValue"], + ["coef", "uncorrectedpvaluesstruct", "FDR", "correctedpvaluesstruct"], + ): + filename = f"group-UnitTest_{contrast}_measure-ct_fwhm-20_{suffix}.mat" + out_file = ( + caps_dir + / "groups" + / "group-UnitTest" + / "statistics" + / "surfstat_group_comparison" + / filename + ) + ref_file = ref_dir / filename + out_file_mat = loadmat(fspath(out_file))[struct] + ref_file_mat = loadmat(fspath(ref_file))[struct] + if suffix in ["coefficients", "FDR"]: + assert np.allclose( + out_file_mat, ref_file_mat, rtol=1e-8, equal_nan=True + ) + else: + length = 4 if suffix == "correctedPValue" else 3 + for i in range(length): + assert np.allclose( + out_file_mat[0][0][i], + ref_file_mat[0][0][i], + rtol=1e-8, + equal_nan=True, + ) def run_StatisticsVolume( diff --git a/test/unittests/pipelines/statistics_surface/data/subjects.tsv b/test/unittests/pipelines/statistics_surface/data/subjects.tsv new file mode 100644 index 000000000..d7e9a3947 --- /dev/null +++ b/test/unittests/pipelines/statistics_surface/data/subjects.tsv @@ -0,0 +1,8 @@ +participant_id session_id group age sex +sub-ADNI002S4213 ses-M00 CN 78.0 Female +sub-ADNI011S4075 ses-M00 CN 73.4 Male +sub-ADNI011S4105 ses-M00 CN 70.8 Female +sub-ADNI011S4222 ses-M00 CN 82.3 Female +sub-ADNI130S4997 ses-M00 AD 60.6 Female +sub-ADNI130S5059 ses-M00 AD 72.1 Male +sub-ADNI130S5231 ses-M00 AD 74.2 Female diff --git a/test/unittests/pipelines/statistics_surface/test_inputs.py b/test/unittests/pipelines/statistics_surface/test_inputs.py new file mode 100644 index 000000000..02b204c85 --- /dev/null +++ b/test/unittests/pipelines/statistics_surface/test_inputs.py @@ -0,0 +1,37 @@ +import os +from pathlib import Path + +import pandas as pd +import pytest + +CURRENT_DIR = os.path.dirname(os.path.realpath(__file__)) + + +def test_read_and_check_tsv_file_filenotfound_error(tmpdir): + from clinica.pipelines.statistics_surface._inputs import _read_and_check_tsv_file + + with pytest.raises(FileNotFoundError, match="File foo.tsv does not exist"): + _read_and_check_tsv_file(Path("foo.tsv")) + + +@pytest.mark.parametrize( + "columns", [["foo"], ["foo", "bar"], ["participant_id", "bar"]] +) +def test_read_and_check_tsv_file_data_errors(tmpdir, columns): + from clinica.pipelines.statistics_surface._inputs import _read_and_check_tsv_file + + df = pd.DataFrame(columns=columns) + df.to_csv(tmpdir / "foo.tsv", sep="\t", index=False) + with pytest.raises( + ValueError, + match=r"The TSV data should have at least two columns: participant_id and session_id", + ): + _read_and_check_tsv_file(tmpdir / "foo.tsv") + + +def test_read_and_check_tsv_file(): + from clinica.pipelines.statistics_surface._inputs import _read_and_check_tsv_file + + df = _read_and_check_tsv_file(Path(CURRENT_DIR) / "data/subjects.tsv") + assert len(df) == 7 + assert set(df.columns) == {"group", "age", "sex"} diff --git a/test/unittests/pipelines/statistics_surface/test_model.py b/test/unittests/pipelines/statistics_surface/test_model.py new file mode 100644 index 000000000..57de384e3 --- /dev/null +++ b/test/unittests/pipelines/statistics_surface/test_model.py @@ -0,0 +1,297 @@ +import os +from pathlib import Path + +import numpy as np +import pandas as pd +import pytest +from brainstat.stats.terms import FixedEffect +from numpy.testing import assert_array_almost_equal, assert_array_equal + +CURRENT_DIR = os.path.dirname(os.path.realpath(__file__)) + + +@pytest.fixture +def df(): + return pd.read_csv(Path(CURRENT_DIR) / "data/subjects.tsv", sep="\t") + + +def test_missing_column_error(df): + from clinica.pipelines.statistics_surface._model import _check_column_in_df + + with pytest.raises( + ValueError, + match=( + "Term foo from the design matrix is not in the columns of the " + "provided TSV file. Please make sure that there is no typo" + ), + ): + _check_column_in_df(df, "foo") + + +def test_is_categorical(df): + from clinica.pipelines.statistics_surface._model import _categorical_column + + assert _categorical_column(df, "sex") + assert not _categorical_column(df, "age") + + +def test_build_model_term_error(df): + from clinica.pipelines.statistics_surface._model import _build_model_term + + assert isinstance(_build_model_term("sex", df), FixedEffect) + + +@pytest.mark.parametrize("design", ["1 + age", "1+age", "age +1", "age"]) +def test_build_model_intercept(design, df): + """Test that we get the same results with equivalent designs. + Especially, the fact that adding explicitly the intercept doesn't change the results. + Test also that spaces in the design expression have no effect. + """ + from clinica.pipelines.statistics_surface._model import _build_model + + model = _build_model(design, df) + assert isinstance(model, FixedEffect) + assert len(model.m.columns) == 2 + assert_array_equal(model.intercept, np.array([1, 1, 1, 1, 1, 1, 1])) + assert_array_equal(model.age, np.array([78.0, 73.4, 70.8, 82.3, 60.6, 72.1, 74.2])) + + +def test_build_model(df): + from clinica.pipelines.statistics_surface._model import _build_model + + model = _build_model("1 + age + sex", df) + assert isinstance(model, FixedEffect) + assert len(model.m.columns) == 4 + assert_array_equal(model.intercept, np.array([1, 1, 1, 1, 1, 1, 1])) + assert_array_equal(model.age, np.array([78.0, 73.4, 70.8, 82.3, 60.6, 72.1, 74.2])) + assert_array_equal(model.sex_Female, np.array([1, 0, 1, 1, 1, 0, 1])) + assert_array_equal(model.sex_Male, np.array([0, 1, 0, 0, 0, 1, 0])) + model = _build_model("1 + age + sex + age * sex", df) + assert isinstance(model, FixedEffect) + assert len(model.m.columns) == 6 + assert_array_equal(model.intercept, np.array([1, 1, 1, 1, 1, 1, 1])) + assert_array_equal(model.age, np.array([78.0, 73.4, 70.8, 82.3, 60.6, 72.1, 74.2])) + assert_array_equal(model.sex_Female, np.array([1, 0, 1, 1, 1, 0, 1])) + assert_array_equal(model.sex_Male, np.array([0, 1, 0, 0, 0, 1, 0])) + assert_array_equal( + getattr(model, "age*sex_Female"), + np.array([78.0, 0.0, 70.8, 82.3, 60.6, 0.0, 74.2]), + ) + assert_array_equal( + getattr(model, "age*sex_Male"), np.array([0.0, 73.4, 0.0, 0.0, 0.0, 72.1, 0.0]) + ) + + +@pytest.mark.parametrize( + "parameters", + [ + {"sizeoffwhm": 3.0}, + { + "thresholduncorrectedpvalue": 0.6, + "thresholdcorrectedpvalue": 0.8, + "clusterthreshold": 0.44, + "sizeoffwhm": 2.66, + }, + ], +) +def test_glm_instantiation(df, parameters): + from clinica.pipelines.statistics_surface._model import GLM + + model = GLM("1 + age", df, "feature_label", "age") + assert not model._two_tailed + assert model._correction == ["fdr", "rft"] + assert model.feature_label == "feature_label" + assert model.fwhm == 20 + assert model.threshold_uncorrected_pvalue == 0.001 + assert model.threshold_corrected_pvalue == 0.05 + assert model.cluster_threshold == 0.001 + assert model.contrasts == dict() + assert model.filenames == dict() + assert model.contrast_names == list() + assert isinstance(model.model, FixedEffect) + + +@pytest.mark.parametrize("contrast", ["age", "-age"]) +def test_correlation_glm_instantiation(df, contrast): + from clinica.pipelines.statistics_surface._model import CorrelationGLM + + model = CorrelationGLM("1 + age", df, "feature_label", contrast, "group_label") + assert not model.with_interaction + assert model.group_label == "group_label" + assert model.feature_label == "feature_label" + assert model.fwhm == 20 + sign = "positive" if contrast == "age" else "negative" + assert model.contrast_sign == sign + assert model.absolute_contrast_name == "age" + assert isinstance(model.contrasts, dict) + assert len(model.contrasts) == 1 + mult = 1 if sign == "positive" else -1 + assert_array_equal( + model.contrasts[contrast].values, + mult * np.array([78.0, 73.4, 70.8, 82.3, 60.6, 72.1, 74.2]), + ) + with pytest.raises(ValueError, match="Unknown contrast foo"): + model.filename_root("foo") + expected = f"group-group_label_correlation-age-{sign}_measure-feature_label_fwhm-20" + assert model.filename_root(contrast) == expected + + +def test_group_glm_instantiation(df): + from clinica.pipelines.statistics_surface._model import GroupGLM + + with pytest.raises( + ValueError, + match="Contrast should refer to a categorical variable for group comparison.", + ): + GroupGLM("1 + age", df, "feature_label", "age", "group_label") + model = GroupGLM("1 + age", df, "feature_label", "sex", "group_label") + assert not model.with_interaction + assert model.group_label == "group_label" + assert model.fwhm == 20 + assert isinstance(model.contrasts, dict) + contrast_names = ["Female-lt-Male", "Male-lt-Female"] + assert set(model.contrasts.keys()) == set(contrast_names) + for contrast_name, sign in zip(contrast_names, [-1, 1]): + assert_array_equal( + model.contrasts[contrast_name].values, + sign * np.array([1, -1, 1, 1, 1, -1, 1]), + ) + with pytest.raises(ValueError, match="Unknown contrast foo"): + model.filename_root("foo") + for contrast_name in contrast_names: + expected = f"group-group_label_{contrast_name}_measure-feature_label_fwhm-20" + assert model.filename_root(contrast_name) == expected + + +def test_group_glm_with_interaction_instantiation(df): + from clinica.pipelines.statistics_surface._model import GroupGLMWithInteraction + + with pytest.raises( + ValueError, + match=( + "The contrast must be an interaction between one continuous " + "variable and one categorical variable." + ), + ): + GroupGLMWithInteraction("1 + age", df, "feature_label", "age", "group_label") + model = GroupGLMWithInteraction( + "1 + age", df, "feature_label", "age * sex", "group_label" + ) + assert model.with_interaction + assert model.group_label == "group_label" + assert model.fwhm == 20 + assert isinstance(model.contrasts, dict) + assert len(model.contrasts) == 1 + assert_array_equal( + model.contrasts["age * sex"].values, + np.array([78.0, -73.4, 70.8, 82.3, 60.6, -72.1, 74.2]), + ) + with pytest.raises(ValueError, match="Unknown contrast foo"): + model.filename_root("foo") + assert ( + model.filename_root("age * sex") + == "interaction-age * sex_measure-feature_label_fwhm-20" + ) + + +def test_create_glm_model(df): + from clinica.pipelines.statistics_surface._model import ( + CorrelationGLM, + GroupGLM, + GroupGLMWithInteraction, + create_glm_model, + ) + + model = create_glm_model( + "correlation", "age", df, "age", feature_label="feature_label" + ) + assert isinstance(model, CorrelationGLM) + model = create_glm_model( + "group_comparison", + "age", + df, + "sex", + feature_label="feature_label", + group_label="group_label", + ) + assert isinstance(model, GroupGLM) + model = create_glm_model( + "group_comparison", + "age * sex", + df, + "age * sex", + feature_label="feature_label", + group_label="group_label", + ) + assert isinstance(model, GroupGLMWithInteraction) + + +def test_p_value_results(): + from clinica.pipelines.statistics_surface._model import PValueResults + + pvalues = np.random.random((5, 10)) + threshold = 0.3 + mask = pvalues >= threshold + results = PValueResults(pvalues, mask, threshold) + d = results.to_dict() + assert_array_equal(d["P"], pvalues) + assert_array_equal(d["mask"], mask) + assert d["thresh"] == threshold + d = results.to_json(indent=2) + assert isinstance(d, str) + for sub in ["P", "mask", "thresh"]: + assert sub in d + + +def test_statistics_results_serializer(tmp_path): + import json + + from scipy.io import loadmat + + from clinica.pipelines.statistics_surface._model import ( + CorrectedPValueResults, + PValueResults, + StatisticsResults, + StatisticsResultsSerializer, + ) + + dummy_input = np.empty([3, 6]) + uncorrected = PValueResults(*[dummy_input] * 2, 0.1) + corrected = CorrectedPValueResults(*[dummy_input] * 3, 0.2) + results = StatisticsResults(*[dummy_input] * 2, uncorrected, dummy_input, corrected) + serializer = StatisticsResultsSerializer(str(tmp_path / Path("out/dummy"))) + assert serializer.output_file == str(tmp_path / Path("out/dummy")) + assert serializer.json_extension == "_results.json" + assert serializer.json_indent == 4 + assert serializer.mat_extension == ".mat" + with pytest.raises( + NotImplementedError, match="Serializing method foo is not implemented." + ): + serializer.save(results, "foo") + serializer.save(results, "json") + assert os.path.exists(tmp_path / Path("out/dummy_results.json")) + with open(tmp_path / Path("out/dummy_results.json"), "r") as fp: + serialized = json.load(fp) + serializer.save(results, "mat") + names = [ + "coefficients", + "TStatistics", + "uncorrectedPValue", + "correctedPValue", + "FDR", + ] + keys = [ + "coef", + "tvaluewithmask", + "uncorrectedpvaluesstruct", + "correctedpvaluesstruct", + "FDR", + ] + for name, key in zip(names, keys): + assert os.path.exists(tmp_path / Path(f"out/dummy_{name}.mat")) + mat = loadmat(tmp_path / Path(f"out/dummy_{name}.mat")) + if key in ["uncorrectedpvaluesstruct", "correctedpvaluesstruct"]: + assert_array_almost_equal(mat[key]["P"][0, 0], dummy_input) + assert_array_almost_equal(mat[key]["mask"][0, 0], dummy_input) + else: + assert_array_almost_equal(mat[key], dummy_input)