From 664959c4121ba2379f3c85238061a0e0d316b017 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Tue, 2 May 2023 23:30:39 +0200 Subject: [PATCH 01/12] start working on IV --- docs/tutorial.md | 1 + pyfixest/FormulaParser.py | 86 ++++++++++++++++++++++++++++++++------- pyfixest/fixest.py | 30 ++++++++++++-- 3 files changed, 99 insertions(+), 18 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 77ab603e..961771aa 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -48,6 +48,7 @@ Supported covariance types are "iid", "HC1-3", CRV1 and CRV3 (one-way clustering `.vcov()` method: ```py + fixest.vcov({'CRV1':'group_id'}).summary() # >>> fixest.vcov({'CRV1':'group_id'}).summary() # diff --git a/pyfixest/FormulaParser.py b/pyfixest/FormulaParser.py index 4100ea3b..79524e7e 100644 --- a/pyfixest/FormulaParser.py +++ b/pyfixest/FormulaParser.py @@ -51,15 +51,45 @@ def __init__(self, fml): fml_split = fml.split('|') depvars, covars = fml_split[0].split("~") - if len(fml_split) > 1: + if len(fml_split) == 1: + fevars = "0" + endogvars = None + instruments = None + elif len(fml_split) == 2: + if "~" in fml_split[1]: + fevars = "0" + endogvars, instruments = fml_split[1].split("~") + elif len(fml_split) == 3: fevars = fml_split[1] + endogvars, instruments = fml_split[2].split("~") + + if len(endogvars) > len(instruments): + raise ValueError("The IV system is underdetermined. Only fully determined systems are allowed. Please provide as many instruments as endogenous variables.") + elif len(endogvars) < len(instruments): + raise ValueError("The IV system is overdetermined. Only fully determined systems are allowed. Please provide as many instruments as endogenous variables.") else: - fevars = "0" + pass # Parse all individual formula components into lists self.depvars = depvars.split("+") self.covars = _unpack_fml(covars) self.fevars = _unpack_fml(fevars) + # no fancy syntax for endogvars, instruments allowed + self.endogvars = endogvars + self.instruments = instruments + + if instruments is not None: + self.is_iv = True + # all rhs variables for the first stage (endog variable replaced with instrument) + first_stage_covars_list = covars.split("+") + first_stage_covars_list[first_stage_covars_list.index(endogvars)] = instruments + first_stage_covars_list = "+".join(first_stage_covars_list) + self.covars_first_stage = _unpack_fml(first_stage_covars_list) + self.depvars_first_stage = endogvars + else: + self.is_iv = False + self.covars_first_stage = None + self.depvars_first_stage = None if self.covars.get("i") is not None: self.ivars = dict() @@ -81,7 +111,7 @@ def __init__(self, fml): # Pack the formula components back into strings self.covars_fml = _pack_to_fml(self.covars) self.fevars_fml = _pack_to_fml(self.fevars) - + self.covars_first_stage_fml = _pack_to_fml(self.covars_first_stage) #if "^" in self.covars: # raise CovariateInteractionError("Please use 'i()' or ':' syntax to interact covariates.") @@ -93,28 +123,41 @@ def __init__(self, fml): - def get_fml_dict(self): + def get_fml_dict(self, iv = False): """ Returns a dictionary of all fevars & formula without fevars. The keys are the fixed effect variable combinations. The values are lists of formula strings that do not include the fixed effect variables. + Args: + iv (bool): If True, the formula dictionary will be returned for the first stage of an IV regression. + If False, the formula dictionary will be returned for the second stage of an IV regression / OLS regression. Returns: dict: A dictionary of the form {"fe1+fe2": ['Y1 ~ X', 'Y2~X'], "fe1+fe3": ['Y1 ~ X', 'Y2~X']} where the keys are the fixed effect variable combinations and the values are lists of formula strings that do not include the fixed effect variables. + If IV is True, creates an instance named fml_dict_iv. Otherwise, creates an instance named fml_dict. """ - self.fml_dict = dict() + + fml_dict = dict() for fevar in self.fevars_fml: res = [] for depvar in self.depvars: - for covar in self.covars_fml: - res.append(depvar + '~' + covar) - self.fml_dict[fevar] = res + if iv: + for covar in self.covars_first_stage_fml: + res.append(depvar + '~' + covar) + else: + for covar in self.covars_fml: + res.append(depvar + '~' + covar) + fml_dict[fevar] = res + if iv: + self.fml_dict_iv = fml_dict + else: + self.fml_dict = fml_dict - def _transform_fml_dict(self): + def _transform_fml_dict(self, iv = False): fml_dict2 = dict() @@ -129,27 +172,42 @@ def _transform_fml_dict(self): else: fml_dict2[fe][depvars].append(covars) - self.fml_dict2 = fml_dict2 + if iv: + self.fml_dict2_iv = fml_dict2 + else: + self.fml_dict2 = fml_dict2 - def get_var_dict(self): + def get_var_dict(self, iv = False): """ Create a dictionary of all fevars and list of covars and depvars used in regression with those fevars. The keys are the fixed effect variable combinations. The values are lists of variables (dependent variables and covariates) of the resespective regressions. + Args: + iv (bool): If True, the formula dictionary will be returned for the first stage of an IV regression. + Returns: dict: A dictionary of the form {"fe1+fe2": ['Y1', 'X1', 'X2'], "fe1+fe3": ['Y1', 'X1', 'X2']} where the keys are the fixed effect variable combinations and the values are lists of variables (dependent variables and covariates) used in the regression with those fixed effect variables. """ - self.var_dict = dict() - for fevar in self.fevars_fml: - self.var_dict[fevar] = _flatten_list(self.depvars) + _flatten_list(list(self.covars.values())) + var_dict = dict() + if iv: + for fevar in self.fevars_fml: + var_dict[fevar] = _flatten_list(self.depvars) + _flatten_list(list(self.covars_first_stage.values())) + + else: + for fevar in self.fevars_fml: + var_dict[fevar] = _flatten_list(self.depvars) + _flatten_list(list(self.covars.values())) + if iv: + self.var_dict_iv = var_dict + else: + self.var_dict = var_dict def _unpack_fml(x): diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index fb556e13..e44bd99b 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -77,6 +77,8 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str fe_na = None dict2fe = self.fml_dict2.get(fval) + if self.is_iv: + dict2fe_iv = self.fml_dict2_iv.get(fval) # create lookup table with NA index key # for each regression, check if lookup table already @@ -87,6 +89,7 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str lookup_demeaned_data = dict() + # loop over both dict2fe and dict2fe_iv (if the latter is not None) for depvar in dict2fe.keys(): # [(0, 'X1+X2'), (1, ['X1+X3'])] @@ -232,22 +235,41 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc fml = 'Y1 + Y2 ~ csw(X1, X2, X3) | sw(X4, X5) + X6' ''' - # no whitespace in formula - fml = re.sub(r'\s+', ' ', fml) + self.fml = fml + self.split = None + + # deparse formula, at least partially fxst_fml = FixestFormulaParser(fml) + if fxst_fml.is_iv: + self.is_iv = True + else: + self.is_iv = False + + # add function argument to these methods for IV fxst_fml.get_fml_dict() fxst_fml.get_var_dict() fxst_fml._transform_fml_dict() - self.fml = fml - self.split = None + if self.is_iv: + # create required dicts for first stage IV regressions + fxst_fml.get_fml_dict(iv = True) + fxst_fml.get_var_dict(iv = True) + fxst_fml._transform_fml_dict(iv = True) + self.fml_dict = fxst_fml.fml_dict self.var_dict = fxst_fml.var_dict self.fml_dict2 = fxst_fml.fml_dict2 + + if self.is_iv: + self.fml_dict_iv = fxst_fml.fml_dict_iv + self.var_dict_iv = fxst_fml.var_dict_iv + self.fml_dict2 = fxst_fml.fml_dict2 + self.ivars = fxst_fml.ivars + self.ssc_dict = ssc if fixef_rm == "singleton": self.drop_singletons = True From 87fdd003185ccb63659b477f6a34c22a43a4d12f Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Thu, 4 May 2023 22:45:49 +0200 Subject: [PATCH 02/12] some progress with IVs --- pyfixest/FormulaParser.py | 40 ++++++++++++++------- pyfixest/fixest.py | 76 +++++++++++++++++++++++++++------------ 2 files changed, 81 insertions(+), 35 deletions(-) diff --git a/pyfixest/FormulaParser.py b/pyfixest/FormulaParser.py index 79524e7e..45d38988 100644 --- a/pyfixest/FormulaParser.py +++ b/pyfixest/FormulaParser.py @@ -83,8 +83,8 @@ def __init__(self, fml): # all rhs variables for the first stage (endog variable replaced with instrument) first_stage_covars_list = covars.split("+") first_stage_covars_list[first_stage_covars_list.index(endogvars)] = instruments - first_stage_covars_list = "+".join(first_stage_covars_list) - self.covars_first_stage = _unpack_fml(first_stage_covars_list) + self.first_stage_covars_list = "+".join(first_stage_covars_list) + self.covars_first_stage = _unpack_fml(self.first_stage_covars_list) self.depvars_first_stage = endogvars else: self.is_iv = False @@ -160,17 +160,31 @@ def get_fml_dict(self, iv = False): def _transform_fml_dict(self, iv = False): fml_dict2 = dict() - - for fe in self.fml_dict.keys(): - - fml_dict2[fe] = dict() - - for fml in self.fml_dict.get(fe): - depvars, covars = fml.split("~") - if fml_dict2[fe].get(depvars) is None: - fml_dict2[fe][depvars] = [covars] - else: - fml_dict2[fe][depvars].append(covars) + + if iv: + + for fe in self.fml_dict_iv.keys(): + + fml_dict2[fe] = dict() + + for fml in self.fml_dict_iv.get(fe): + depvars, covars = fml.split("~") + if fml_dict2[fe].get(depvars) is None: + fml_dict2[fe][depvars] = [covars] + else: + fml_dict2[fe][depvars].append(covars) + else: + + for fe in self.fml_dict.keys(): + + fml_dict2[fe] = dict() + + for fml in self.fml_dict.get(fe): + depvars, covars = fml.split("~") + if fml_dict2[fe].get(depvars) is None: + fml_dict2[fe][depvars] = [covars] + else: + fml_dict2[fe][depvars].append(covars) if iv: self.fml_dict2_iv = fml_dict2 diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index e44bd99b..04b024a4 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -97,10 +97,22 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str covar2 = covar depvar2 = depvar - + fml = depvar2 + " ~ " + covar2 - Y, X = model_matrix(fml, data) + if self.is_iv: + instruments2 = dict2fe_iv.get(depvar)[0] + endogvar = list(set(covar2.split("+")) - set(instruments2.split("+")))[0] + instrument = list(set(instruments2.split("+")) - set(covar2.split("+")))[0] + fml2 = instrument + "+" + fml + rhs, lhs = model_matrix(fml2, data) + + Y = rhs[[depvar]] + I = rhs[[instrument]] + X = lhs + else: + Y, X = model_matrix(fml, data) + na_index = list(set(data.index) - set(Y.index)) if self.ivars is not None: @@ -109,16 +121,19 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str dep_varnames = list(Y.columns) co_varnames = list(X.columns) + iv_varnames = list(I.columns) var_names = list(dep_varnames) + list(co_varnames) - + if self.ivars is not None: self.icovars = [s for s in co_varnames if s.startswith( ivars[0]) and s.endswith(ivars[1])] else: self.icovars = None - Y = Y.to_numpy() + Y = Y.to_numpy().reshape(len(Y), 1) X = X.to_numpy() + if self.is_iv: + I = I.to_numpy().reshape(len(I), 1) if Y.shape[1] > 1: raise ValueError( @@ -131,14 +146,23 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str # drop intercept intercept_index = co_varnames.index("Intercept") X = np.delete(X, intercept_index, axis = 1) + #if self.is_iv: + # I = np.delete(I, intercept_index, axis = 1) co_varnames.remove("Intercept") var_names.remove("Intercept") + #iv_varnames.remove("Intercept") # check if variables have already been demeaned Y = np.delete(Y, fe_na, axis=0) X = np.delete(X, fe_na, axis=0) - YX = np.concatenate([Y, X], axis=1) - + if self.is_iv: + I = np.delete(I, fe_na, axis=0) + + if self.is_iv: + YXZ = np.concatenate([Y, X, I], axis = 1) + else: + YXZ = np.concatenate([Y, X], axis=1) + na_index_str = ','.join(str(x) for x in na_index) # check if looked dict has data for na_index @@ -180,23 +204,33 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str np.where(algorithm._singleton_indices))[0].tolist() na_index += dropped_singleton_indices - YX_demeaned = algorithm.residualize(YX) - YX_demeaned = pd.DataFrame(YX_demeaned) - YX_demeaned.columns = list( - dep_varnames) + list(co_varnames) + YXZ_demeaned = algorithm.residualize(YXZ) + YXZ_demeaned = pd.DataFrame(YXZ_demeaned) + + cols = list(dep_varnames) + list(co_varnames) + if self.is_iv: + cols += iv_varnames + + YXZ_demeaned.columns = cols lookup_demeaned_data[na_index_str] = [ - algorithm, YX_demeaned] + algorithm, YXZ_demeaned] else: # if no fixed effects - YX = np.concatenate([Y, X], axis=1) - YX_demeaned = pd.DataFrame(YX) - YX_demeaned.columns = list( - dep_varnames) + list(co_varnames) - - cols = list(dep_varnames) + list(co_varnames) - YX_dict[fml] = YX_demeaned[cols] + if self.is_iv: + YXZ = np.concatenate([Y, X, I], axis=1) + else: + YXZ = np.concatenate([Y, X], axis=1) + + YXZ_demeaned = pd.DataFrame(YXZ) + + cols = list(dep_varnames) + list(co_varnames) + if self.is_iv: + cols += list(iv_varnames) + YXZ_demeaned.columns = list(dep_varnames) + list(co_varnames) + list(iv_varnames) + + YX_dict[fml] = YXZ_demeaned[cols] na_dict[fml] = na_index return YX_dict, na_dict @@ -265,8 +299,8 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc if self.is_iv: self.fml_dict_iv = fxst_fml.fml_dict_iv self.var_dict_iv = fxst_fml.var_dict_iv - self.fml_dict2 = fxst_fml.fml_dict2 - + self.fml_dict2_iv = fxst_fml.fml_dict2_iv + self.ivars = fxst_fml.ivars @@ -529,8 +563,6 @@ def summary(self) -> None: None ''' - print('---') - for x in list(self.model_res.keys()): split = x.split("|") From 55cbf3f73ede519df7184d090d2575a97242dd4d Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sat, 6 May 2023 22:49:58 +0200 Subject: [PATCH 03/12] some more progress - next inference --- pyfixest/FormulaParser.py | 38 +++--- .../__pycache__/FormulaParser.cpython-310.pyc | Bin 11602 -> 13282 bytes pyfixest/__pycache__/feols.cpython-310.pyc | Bin 11328 -> 11643 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 22357 -> 23453 bytes pyfixest/feols.py | 28 +++-- pyfixest/fixest.py | 118 ++++++++++++------ 6 files changed, 122 insertions(+), 62 deletions(-) diff --git a/pyfixest/FormulaParser.py b/pyfixest/FormulaParser.py index 45d38988..e3b74035 100644 --- a/pyfixest/FormulaParser.py +++ b/pyfixest/FormulaParser.py @@ -59,16 +59,21 @@ def __init__(self, fml): if "~" in fml_split[1]: fevars = "0" endogvars, instruments = fml_split[1].split("~") + else: + fevars = fml_split[1] + endogvars = None + instruments = None elif len(fml_split) == 3: fevars = fml_split[1] endogvars, instruments = fml_split[2].split("~") - if len(endogvars) > len(instruments): - raise ValueError("The IV system is underdetermined. Only fully determined systems are allowed. Please provide as many instruments as endogenous variables.") - elif len(endogvars) < len(instruments): - raise ValueError("The IV system is overdetermined. Only fully determined systems are allowed. Please provide as many instruments as endogenous variables.") - else: - pass + if endogvars is not None: + if len(endogvars) > len(instruments): + raise ValueError("The IV system is underdetermined. Only fully determined systems are allowed. Please provide as many instruments as endogenous variables.") + elif len(endogvars) < len(instruments): + raise ValueError("The IV system is overdetermined. Only fully determined systems are allowed. Please provide as many instruments as endogenous variables.") + else: + pass # Parse all individual formula components into lists self.depvars = depvars.split("+") @@ -111,7 +116,10 @@ def __init__(self, fml): # Pack the formula components back into strings self.covars_fml = _pack_to_fml(self.covars) self.fevars_fml = _pack_to_fml(self.fevars) - self.covars_first_stage_fml = _pack_to_fml(self.covars_first_stage) + if instruments is not None: + self.covars_first_stage_fml = _pack_to_fml(self.covars_first_stage) + else: + self.covars_first_stage_fml = None #if "^" in self.covars: # raise CovariateInteractionError("Please use 'i()' or ':' syntax to interact covariates.") @@ -160,25 +168,25 @@ def get_fml_dict(self, iv = False): def _transform_fml_dict(self, iv = False): fml_dict2 = dict() - - if iv: - + + if iv: + for fe in self.fml_dict_iv.keys(): - + fml_dict2[fe] = dict() - + for fml in self.fml_dict_iv.get(fe): depvars, covars = fml.split("~") if fml_dict2[fe].get(depvars) is None: fml_dict2[fe][depvars] = [covars] else: fml_dict2[fe][depvars].append(covars) - else: + else: for fe in self.fml_dict.keys(): - + fml_dict2[fe] = dict() - + for fml in self.fml_dict.get(fe): depvars, covars = fml.split("~") if fml_dict2[fe].get(depvars) is None: diff --git a/pyfixest/__pycache__/FormulaParser.cpython-310.pyc b/pyfixest/__pycache__/FormulaParser.cpython-310.pyc index 48494aa21769bac61db87673cd86a729c962c7c2..b245695a2d555b154dbe54b8b6bbdfd08a11de7c 100644 GIT binary patch delta 3672 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 J8}?Xg;BPzCj=BH< diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index 073d15f68bca19869ce8fc4770fa09ccb45bb584..efdcfc60bcd141734da6fd5ddbc8e64426916ac7 100644 GIT binary patch delta 2739 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 NuGG~*@3wb#|2I;bJiY(` delta 6402 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 O;lq`#-_Z5cjsF2MKB05~ diff --git a/pyfixest/feols.py b/pyfixest/feols.py index d931f95c..2006cd80 100644 --- a/pyfixest/feols.py +++ b/pyfixest/feols.py @@ -22,6 +22,8 @@ class Feols: Dependent variable of the regression. X : Union[np.ndarray, pd.DataFrame] Independent variable of the regression. + Z: Union[np.ndarray, pd.DataFrame] + Instruments of the regression. Attributes ---------- @@ -29,6 +31,8 @@ class Feols: The dependent variable of the regression. X : np.ndarray The independent variable of the regression. + Z : np.ndarray + The instruments of the regression. N : int The number of observations. k : int @@ -48,7 +52,7 @@ class Feols: """ - def __init__(self, Y: np.ndarray, X: np.ndarray) -> None: + def __init__(self, Y: np.ndarray, X: np.ndarray, Z: np.ndarray) -> None: if not isinstance(Y, (np.ndarray)): raise TypeError("Y must be a numpy array.") @@ -57,9 +61,12 @@ def __init__(self, Y: np.ndarray, X: np.ndarray) -> None: self.Y = Y self.X = X + self.Z = Z if self.X.ndim != 2: raise ValueError("X must be a 2D array") + if self.Z.ndim != 2: + raise ValueError("Z must be a 2D array") self.N, self.k = X.shape @@ -68,11 +75,11 @@ def get_fit(self) -> None: Regression estimation for a single model, via ordinary least squares (OLS). ''' - self.tXX = np.transpose(self.X) @ self.X - self.tXXinv = np.linalg.inv(self.tXX) + self.tXZ = np.transpose(self.X) @ self.Z + self.tXZinv = np.linalg.inv(self.tXZ) - self.tXy = (np.transpose(self.X) @ self.Y) - beta_hat = self.tXXinv @ self.tXy + self.tZy = (np.transpose(self.Z) @ self.Y) + beta_hat = self.tXZinv @ self.tZy self.beta_hat = beta_hat.flatten() self.Y_hat = (self.X @ self.beta_hat) self.u_hat = (self.Y - self.Y_hat) @@ -150,6 +157,9 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: self.is_clustered = True + if self.is_iv: + if self.vcov_type in ["CRV3"]: + raise ValueError("CRV3 inference is not supported for IV regressions.") # compute vcov if self.vcov_type == 'iid': @@ -164,7 +174,7 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: ) # only relevant factor for iid in ssc: fixef.K - self.vcov = self.ssc * self.tXXinv * (np.sum(self.u_hat ** 2) / (self.N - 1)) + self.vcov = self.ssc * self.tXZinv * (np.sum(self.u_hat ** 2) / (self.N - 1)) elif self.vcov_type == 'hetero': @@ -180,7 +190,7 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: if vcov_type_detail in ["hetero", "HC1"]: u = self.u_hat elif vcov_type_detail in ["HC2", "HC3"]: - leverage = np.sum(self.X * (self.X @ self.tXXinv), axis=1) + leverage = np.sum(self.X * (self.X @ self.tXZinv), axis=1) if vcov_type_detail == "HC2": u = self.u_hat / np.sqrt(1 - leverage) else: @@ -188,7 +198,7 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: meat = np.transpose(self.X) * (u ** 2) @ self.X # set off diagonal elements to zero - self.vcov = self.ssc * self.tXXinv @ meat @ self.tXXinv + self.vcov = self.ssc * self.tXZinv @ meat @ self.tXZinv elif self.vcov_type == "CRV": @@ -227,7 +237,7 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: score_g = (np.transpose(Xg) @ ug).reshape((self.k, 1)) meat += np.dot(score_g, score_g.transpose()) - self.vcov = self.ssc * self.tXXinv @ meat @ self.tXXinv + self.vcov = self.ssc * self.tXZinv @ meat @ self.tXZinv elif vcov_type_detail == "CRV3": diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index 04b024a4..a3008720 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -68,6 +68,7 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str YX_dict = dict() na_dict = dict() + var_dict = dict() if fval != "0": fe, fe_na = self._clean_fe(data, fval) @@ -97,20 +98,20 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str covar2 = covar depvar2 = depvar - + fml = depvar2 + " ~ " + covar2 - if self.is_iv: - instruments2 = dict2fe_iv.get(depvar)[0] + if self.is_iv: + instruments2 = dict2fe_iv.get(depvar)[0] endogvar = list(set(covar2.split("+")) - set(instruments2.split("+")))[0] instrument = list(set(instruments2.split("+")) - set(covar2.split("+")))[0] fml2 = instrument + "+" + fml rhs, lhs = model_matrix(fml2, data) - + Y = rhs[[depvar]] I = rhs[[instrument]] X = lhs - else: + else: Y, X = model_matrix(fml, data) na_index = list(set(data.index) - set(Y.index)) @@ -121,9 +122,15 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str dep_varnames = list(Y.columns) co_varnames = list(X.columns) - iv_varnames = list(I.columns) var_names = list(dep_varnames) + list(co_varnames) - + if self.is_iv: + iv_varnames = list(I.columns) + z_varnames = list(set(co_varnames) - set([endogvar])) + z_varnames.append(instrument) + else: + iv_varnames = None + z_varnames = None + if self.ivars is not None: self.icovars = [s for s in co_varnames if s.startswith( ivars[0]) and s.endswith(ivars[1])] @@ -146,46 +153,47 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str # drop intercept intercept_index = co_varnames.index("Intercept") X = np.delete(X, intercept_index, axis = 1) - #if self.is_iv: + #if self.is_iv: # I = np.delete(I, intercept_index, axis = 1) co_varnames.remove("Intercept") var_names.remove("Intercept") - #iv_varnames.remove("Intercept") + if self.is_iv: + z_varnames.remove("Intercept") # check if variables have already been demeaned Y = np.delete(Y, fe_na, axis=0) X = np.delete(X, fe_na, axis=0) - if self.is_iv: + if self.is_iv: I = np.delete(I, fe_na, axis=0) - if self.is_iv: + if self.is_iv: YXZ = np.concatenate([Y, X, I], axis = 1) - else: + else: YXZ = np.concatenate([Y, X], axis=1) - + na_index_str = ','.join(str(x) for x in na_index) # check if looked dict has data for na_index if lookup_demeaned_data.get(na_index_str) is not None: # get data out of lookup table: list of [algo, data] - algorithm, YX_demeaned_old = lookup_demeaned_data.get( + algorithm, YXZ_demeaned_old = lookup_demeaned_data.get( na_index_str) # get not yet demeaned covariates var_diff_names = list( - set(var_names) - set(YX_demeaned_old.columns))[0] + set(var_names) - set(YXZ_demeaned_old.columns))[0] var_diff_index = list(var_names).index(var_diff_names) - var_diff = YX[:, var_diff_index] + var_diff = YXZ[:, var_diff_index] if var_diff.ndim == 1: var_diff = var_diff.reshape(len(var_diff), 1) - YX_demean_new = algorithm.residualize(var_diff) - YX_demeaned = np.concatenate( - [YX_demeaned_old, YX_demean_new], axis=1) - YX_demeaned = pd.DataFrame(YX_demeaned) + YXZ_demean_new = algorithm.residualize(var_diff) + YXZ_demeaned = np.concatenate( + [YXZ_demeaned_old, YXZ_demean_new], axis=1) + YXZ_demeaned = pd.DataFrame(YXZ_demeaned) - YX_demeaned.columns = list( - YX_demeaned_old.columns) + [var_diff_names] + YXZ_demeaned.columns = list( + YXZ_demeaned_old.columns) + [var_diff_names] else: # not data demeaned yet for NA combination @@ -206,11 +214,11 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str YXZ_demeaned = algorithm.residualize(YXZ) YXZ_demeaned = pd.DataFrame(YXZ_demeaned) - + cols = list(dep_varnames) + list(co_varnames) - if self.is_iv: + if self.is_iv: cols += iv_varnames - + YXZ_demeaned.columns = cols lookup_demeaned_data[na_index_str] = [ @@ -218,22 +226,31 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str else: # if no fixed effects - if self.is_iv: + if self.is_iv: YXZ = np.concatenate([Y, X, I], axis=1) - else: + else: YXZ = np.concatenate([Y, X], axis=1) - + YXZ_demeaned = pd.DataFrame(YXZ) - + cols = list(dep_varnames) + list(co_varnames) - if self.is_iv: + + if self.is_iv: cols += list(iv_varnames) - YXZ_demeaned.columns = list(dep_varnames) + list(co_varnames) + list(iv_varnames) + + YXZ_demeaned.columns = cols YX_dict[fml] = YXZ_demeaned[cols] na_dict[fml] = na_index + var_dict[fml] = dict({ + 'dep_varnames': dep_varnames, + 'co_varnames': co_varnames, + 'iv_varnames': iv_varnames, + 'z_varnames': z_varnames + }) - return YX_dict, na_dict + + return YX_dict, na_dict, var_dict def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc(), fixef_rm: str = "none") -> None: ''' @@ -269,7 +286,7 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc fml = 'Y1 + Y2 ~ csw(X1, X2, X3) | sw(X4, X5) + X6' ''' - self.fml = fml + self.fml = fml.replace(" ", "") self.split = None # deparse formula, at least partially @@ -300,6 +317,10 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc self.fml_dict_iv = fxst_fml.fml_dict_iv self.var_dict_iv = fxst_fml.var_dict_iv self.fml_dict2_iv = fxst_fml.fml_dict2_iv + else: + self.fml_dict_iv = self.fml_dict + self.var_dict_iv = self.var_dict + self.fml_dict2_iv = self.fml_dict2 self.ivars = fxst_fml.ivars @@ -349,6 +370,8 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc self.dropped_data_dict = dict() self.demeaned_data_dict = dict() + # names of depvar, X, Z matrices + self.yxz_name_dict = dict() estimate_full_model = True estimate_split_model = False @@ -386,23 +409,26 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc for _, fval in enumerate(fixef_keys): self.demeaned_data_dict[fval] = [] self.dropped_data_dict[fval] = [] + self.yxz_name_dict[fval] = [] data = self.data - demeaned_data, dropped_data = self._demean( + demeaned_data, dropped_data, yxz_name_dict= self._demean( data, fval, ivars, drop_ref) self.demeaned_data_dict[fval].append(demeaned_data) self.dropped_data_dict[fval].append(dropped_data) - + self.yxz_name_dict[fval].append(yxz_name_dict) # here: if estimate_split_model: for _, fval in enumerate(fixef_keys): self.demeaned_data_dict[fval] = [] self.dropped_data_dict[fval] = [] + self.yxz_name_dict[fval] = [] for x in self.split_categories: sub_data = self.data[x == self.splitvar] demeaned_data, dropped_data = self._demean( sub_data, fval, ivars, drop_ref) self.demeaned_data_dict[fval].append(demeaned_data) self.dropped_data_dict[fval].append(dropped_data) + self.yxz_name_dict[fval].append(yxz_name_dict) # estimate models based on demeaned model matrix and dependent variables for _, fval in enumerate(self.fml_dict.keys()): @@ -427,11 +453,26 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc else: split_log = None full_fml = fml2 + + name_dict = self.yxz_name_dict[fval][0][fml] + depvar_name = name_dict["dep_varnames"] + xvar_names = name_dict["co_varnames"] + if name_dict["z_varnames"] is None: + zvar_names = name_dict["co_varnames"] + else: + zvar_names = name_dict["z_varnames"] + + Y = model_frame[depvar_name] + X = model_frame[xvar_names] + Z = model_frame[zvar_names] - Y = model_frame.iloc[:, 0].to_numpy() - X = model_frame.iloc[:, 1:] colnames = X.columns + zcolnames = Z.columns + + Y = Y.to_numpy() X = X.to_numpy() + Z = Z.to_numpy() + N = X.shape[0] k = X.shape[1] @@ -444,7 +485,8 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc raise ValueError( "The design Matrix X does not have full rank for the regression with fml" + fml2 + ". The model is skipped. ") - FEOLS = Feols(Y, X) + FEOLS = Feols(Y, X, Z) + FEOLS.is_iv = self.is_iv FEOLS.fml = fml2 FEOLS.ssc_dict = self.ssc_dict FEOLS.get_fit() From c19b4aa3bec17f0fc08245477ab5e0bc0c15e64a Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Thu, 11 May 2023 22:14:05 +0200 Subject: [PATCH 04/12] finish refactoring from OLS to IV estimator --- .../__pycache__/FormulaParser.cpython-310.pyc | Bin 13282 -> 13282 bytes pyfixest/__pycache__/feols.cpython-310.pyc | Bin 11643 -> 11765 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 23453 -> 23472 bytes pyfixest/feols.py | 31 +++--- pyfixest/fixest.py | 96 ++++++++++-------- 5 files changed, 69 insertions(+), 58 deletions(-) diff --git a/pyfixest/__pycache__/FormulaParser.cpython-310.pyc b/pyfixest/__pycache__/FormulaParser.cpython-310.pyc index b245695a2d555b154dbe54b8b6bbdfd08a11de7c..98fee1c7e1d0469e88d93edebc84cc8348beefc2 100644 GIT binary patch delta 20 acmaEq{wSS0pO=@50SGFiA~$khHwFMj5(Xmx delta 20 acmaEq{wSS0pO=@50SNRLg>B@%ZVUiKtp*+d diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index efdcfc60bcd141734da6fd5ddbc8e64426916ac7..904c8ecdfe4985df18515d6ab195afc5cdb9ee30 100644 GIT binary patch delta 1823 zcmZuyO^n+_6rQmYuj3?+H~&tuNp`oJ{Y!sXXtxqQlpm=G5TX=NNn340CykPAQ`K>| z1)dv0R8)$BDyE#MkbOWsQB?K_QV$5YBE-oO5|;{z3m1?O2#Gh&(jOID@6GdjZ@%|E z&y4+duI3SbMIBak zoMOdMHDtSS*jG+aqp{?=gjFu_ucLE={piU#q23ZmEVV(<-?cMcQKPgaI6F<4$)-k<6UMA^ zF#CjK36%>yOuRHA#cg7PmZ`g5G9nyCw#%D$RsN_sIs=W==A-lPX-$^g2q;{v24&- z3A46C7LuNXZRHT5{(vVhP#}j*1qy6#C^^NuWESs|QSOya5TsLrB9w5}6ijs=MQV>R zgVjb7B{1dg_6VCdiMuDL_u7L6KY)Z&Mz9*_pa)Ap@0QDr%iT}XBv8&1rven`tU?7U z!4grV{>|oc;%0>I<$nHpAvoJ*Jgt6+b(-zqnERprSC(XyKD7H=13B0gR7Y1@|?{955#o~cdOqQe&6}J@J>R*~xr@N#Q zjnU1|iZ>v@r(9BNseR(~;V75MIj z>4kv&77dIylncG)=~my03FM$q!2TjXvrr9N$I;6_T-af}PVqM)0F|stHA&n2e!-;l zApdo7nSQ>RU20SMCBL}5Lfib-@{x=nXZ2Buf0J#AiPpP(x}J%?C(J8CjrbGw6?&Z8 O^(U1eVaUI#-~Jc8deZp- delta 1700 zcmZuyTW=dx5I$$u-mEX{-S`%-?buG7o0GKAmNpWqK!U1>i=a_URoqsQ+v8es6Q@~k zLTP7ZgoPTZ3W_*S6>ZslK=c7sg1k`m0iHqP2bd=$q)G_&4RL#6&e}>r)T=p{Z|2N= zGiP@F+u6UXu{BK#6a4*n=QR8I#V=zSmA3e_x}VDYv^uFvK$;PQ09lISO64D^-I9jp zRt$%#Y@ez2l$GUHZKctZms^`X1rdHA)Sz*GD^!jZ(Mm;;QQFsbzYBd%CF^&-5h?P! zk@--V#V<=c)Ov>(qm!NF7HN(+a%&bOme?eSzhI}DX++I|Bn^@z%w(h6k`q9yf`58J zoU>DImYER95Rc{vdKnUE9}#=h=Y$uJg3NLW^doi#ae_D}P?DV_fuJE^46{X+GOT=3 z?7}RCVI=DTt`(G!NgM@~W}X!<%SiHyJ?a)f@u)!EqDS14C&*v7HCF1<4=C!#g#Mi5 z3^}Sj4r-U8|FW&4Hv?rDCBC(fG|QMSjO#&CPkllNPWNJ9PaX+W6IY zS}~B(xL=Bg!jlv0;8byRP#uv)*%=1Ki3_qY3^6~9a1~`S|Ipil4DRs?#E7L&{s);w zBxO&6(WS@8`30<2+6fCww3>r7#64+{=Ij9J^dXUTKTGUXCxbmR@9u*nWJE7OYEL_2 zkPN{(?Dq&HAkE6G{GoJ7I!bn=^?Yl=euhnSsbkvDg2^Vkl9SydQ`sY>#0IsZc&Ur}s5zP;P5~(D z4nqM7{?$;Vcx(5Dem_Ky@FV7JUA%+6KzrS?tpYCjujW^@$Un{I6Fs_7Rafepb*t8> zR|Bi{n$3U6jz_BUa^q@`HmcGY{%7_SU(7Y=WBwrbN;)h{Qh^T3nl0RL`t2Y#d)^(z#-zKa#;yl*>v$8^yEs&+wb`FG`jgFnnVOxl zg#MZso>&HaOH0^USH6`Q-U!BQM`1Y?O+EY%}t>t>VlC-kI$dBw3Y4f`?V`f#k+N!PA+g4O)eUCoF z>-^D7N$$}l9>T}KcW1Ui>DT;^xr3DPx%sn) zFA85*a1ehAwk3F2U9k-vtJ$^V76$AEF08GsST}@fOAI&p!}){sJbyg@lHwnDpC8%x F%|B~yvrzy5 diff --git a/pyfixest/__pycache__/fixest.cpython-310.pyc b/pyfixest/__pycache__/fixest.cpython-310.pyc index f518cac087ae147eaca2fe298507ee4d0916adc5..2f48315499fddbcdf8ec5b4eb64a0ced01b0204f 100644 GIT binary patch delta 1811 zcmZ`(TTEP46utZ0d0d9!F$}MnVVD^P1_p*HwDv`*F)21k(^{>Tz9>=-P-r{Q%WVU= zr=wEiqqdG$!hQ6RiRFxgGd(CTE|0*4}5o z&%JRMZr_E{$&wO}Lcce926)qzJEi?vSqB|8S}LvS-yOoxPE|dYEip9om<}w-!#wmT z3v3{1EolMB{b4W+PL$0SmtRvxffsSlSq}N#>RuIdci`b=LruX<&VKJ)ppIYiA<41a}pk7Dv$P2KdWG!EF;C- zj9%(na~|w0L4UAvKE$#u*`&dYB82qmurJDN`0bC5xVCBy2Imn4)X#cH~KHUkx#B)SD4ZlPpaRY?s(7X9UxO zWtnaxIuXN0?xV~bcm)-|#pc*CMh$AhmWeobQlnRRHD`CO$!N4i{&@z95iq4zE)U?d^ut6^YVy2chvk1_OObGMR-+J$F&@BbIRQ1?zb2-FSRoNc&Z zE{#sC=%zNHOYVk(VXVg}Hdt6Ppu$_$VtE|k3$f(89&yhOW`<6TOfR};3XC>>dIg#r z6kk`mwuQ?rXMedNUC>5)bE`0(WEA$?k3ORsd%k>TSf#54XizT)A@%b+9xEyOb@o$F5# zv`BFrpB7N{k+@wI22FflwIiab9*}aPBWn}^opyYJuoi*49zy*rM8t89`mP06^~#YJ#+f*$Y)OHn0;;#Z`NhuAEAZA zv1;`30L_-Fdw4wCmMKM_$#^4;jwXkkH;L`x$hO3J`Mz7tO?id(1hx)tCQn_qCskiB zdBSKBw*~9F>GOCpOskw0LuHSWY_@KNcNACjK6i8^%15Th$1>5KLxw&+C)TxWf?9FB zrB-;8-@rlfL-Io9qHAbsY9zz;gzS@Sv3@|DY!%QioNaGA^-)5^`)!kOSyZN8a9xxN zm&9CZJ#&M&llmDv*2VUlDhScp>33a`;;W*svjb|a7d!7c;F{R7;b{3eiMLB~SdweP z+Asxct;UTTRnj=r6?O@UUlh5nJ~(WB+qEAEZ|v@X*RAKf6Y_vt6L86TZ)+4>*Q9P< zyu3B+{D9bZtiK-j7SMNX^g}{Fwjxh>9LavEdr%U45TBM@pCo%F`9u=i+=6(vrw^`+ z8$EIO-1@3#NQGalcyG!D=fv(^0v=kw?K%pu$J)93mW#r9u=g^R=v;p>J+j(qeYXET)FkBGC6-*kmWf+tj4d%%y7V972qGpvon26nd!7V1WIZlNQ&|>1%k9x#8P`o+ksBo+W|rU zn^CHgm;jZ7l?CY3XreJTn47@H=my>3%8+OpUx^DAE?l@UC~5uA?XfF3Gf zXw@lHatdKE>*J1~!W}1Vq1KBm`#0a-@ z=S9`1$5_$LsaK=HvV^gLJ1k3>EJ0}j1?z|_EVIki9Hm}MMr&IT%Sr)*r7$bXcnM%FZ@vk{soqltct zX$zM0bYU5nG$xBtOw+a&tHx$*S*95K?osVY|SkG&y z^Lk!O!%tcqqeM)PVKUpm?I+b$ei^t}zR|LH3eyafe4yAwVv;(hK8nqBKw1ge)^YvHOO6a#)LudL{Y{NM1X`?TdhDpo}GjwB9r;^)P@;SHyK?#_G^Wy&? zV|BfpnBjk=o5VIMAwCU{q|9JjP(eG^b`qSZ$!}i4D8?|33GTgaqZ{Io+R2@hTggu| zdn)#*aKS8AHvr6wJ2ltZ+Z>bV?aCL3G*S3Xo;Wxpu}S5(~a z?}GE@ul^U*^1t%+sL5yR*e-D()B>#nLkT-GJcd`eLyw8?LY#D+;V3*Mo(&&@5iuV= z*L;g0uPi+j^LZby!w5Yg@#QCERZfWRhyf48H<4(hP{$_B-t;?RY~3!$2P2oYV*>DFKsX@y0?r}TiIHr@p(yR#n)RVAZ@m{x2xna z-VxQTXfxtU$6n|$f9&W3(zkc6hgZyz&ZHDBZ%e|P=B;gU&}LAPn0+2Gl>bnPl Vm^?(uMGe>zaZ8M`MaC)@{{bUk@`C^X diff --git a/pyfixest/feols.py b/pyfixest/feols.py index 2006cd80..4dfb26c5 100644 --- a/pyfixest/feols.py +++ b/pyfixest/feols.py @@ -75,14 +75,14 @@ def get_fit(self) -> None: Regression estimation for a single model, via ordinary least squares (OLS). ''' - self.tXZ = np.transpose(self.X) @ self.Z - self.tXZinv = np.linalg.inv(self.tXZ) + self.tZX = np.transpose(self.Z) @ self.X + self.tZXinv = np.linalg.inv(self.tZX) self.tZy = (np.transpose(self.Z) @ self.Y) - beta_hat = self.tXZinv @ self.tZy + beta_hat = self.tZXinv @ self.tZy self.beta_hat = beta_hat.flatten() self.Y_hat = (self.X @ self.beta_hat) - self.u_hat = (self.Y - self.Y_hat) + self.u_hat = (self.Y.flatten() - self.Y_hat) def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: ''' @@ -174,8 +174,11 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: ) # only relevant factor for iid in ssc: fixef.K - self.vcov = self.ssc * self.tXZinv * (np.sum(self.u_hat ** 2) / (self.N - 1)) - + if self.is_iv == False: + self.vcov = self.ssc * self.tZXinv * (np.sum(self.u_hat ** 2) / (self.N - 1)) + else: + meat = self.Z.transpose() @ np.diag(np.sum(self.u_hat ** 2) / (self.N - 1)) @ self.Z + self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv elif self.vcov_type == 'hetero': self.ssc = get_ssc( @@ -190,15 +193,15 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: if vcov_type_detail in ["hetero", "HC1"]: u = self.u_hat elif vcov_type_detail in ["HC2", "HC3"]: - leverage = np.sum(self.X * (self.X @ self.tXZinv), axis=1) + leverage = np.sum(self.X * (self.X @ self.tZXinv), axis=1) if vcov_type_detail == "HC2": u = self.u_hat / np.sqrt(1 - leverage) else: u = self.u_hat / (1-leverage) - meat = np.transpose(self.X) * (u ** 2) @ self.X + meat = np.transpose(self.Z) * (u ** 2) @ self.Z # set off diagonal elements to zero - self.vcov = self.ssc * self.tXZinv @ meat @ self.tXZinv + self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv elif self.vcov_type == "CRV": @@ -230,14 +233,14 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: meat = np.zeros((self.k, self.k)) - for igx, g, in enumerate(clustid): + for _, g, in enumerate(clustid): - Xg = self.X[np.where(cluster_df == g)] + Zg = self.Z[np.where(cluster_df == g)] ug = self.u_hat[np.where(cluster_df == g)] - score_g = (np.transpose(Xg) @ ug).reshape((self.k, 1)) + score_g = (np.transpose(Zg) @ ug).reshape((self.k, 1)) meat += np.dot(score_g, score_g.transpose()) - self.vcov = self.ssc * self.tXZinv @ meat @ self.tXZinv + self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv elif vcov_type_detail == "CRV3": @@ -374,7 +377,7 @@ def get_wildboottest(self, B:int, cluster : Union[np.ndarray, pd.Series, pd.Data raise ValueError("Wild cluster bootstrap is not supported with fixed effects.") xnames = self.coefnames.to_list() - Y = self.Y + Y = self.Y.flatten() X = self.X # later: allow r <> 0 and custom R diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index a3008720..84bb9a77 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -66,7 +66,7 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str None ''' - YX_dict = dict() + YXZ_dict = dict() na_dict = dict() var_dict = dict() @@ -94,7 +94,7 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str for depvar in dict2fe.keys(): # [(0, 'X1+X2'), (1, ['X1+X3'])] - for c, covar in enumerate(dict2fe.get(depvar)): + for _, covar in enumerate(dict2fe.get(depvar)): covar2 = covar depvar2 = depvar @@ -120,27 +120,38 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str if drop_ref is not None: X = X.drop(drop_ref, axis=1) - dep_varnames = list(Y.columns) - co_varnames = list(X.columns) - var_names = list(dep_varnames) + list(co_varnames) + y_names = list(Y.columns) + x_names = list(X.columns) + yxz_names = list(y_names) + list(x_names) if self.is_iv: - iv_varnames = list(I.columns) - z_varnames = list(set(co_varnames) - set([endogvar])) - z_varnames.append(instrument) + iv_names = list(I.columns) + #z_varnames = list(set(x_names) - set([endogvar])) + #z_varnames.append(instrument) + x_names_copy = x_names.copy() + x_names_copy.remove(endogvar) + z_names = x_names_copy + [instrument] + cols = yxz_names + iv_names else: - iv_varnames = None - z_varnames = None + iv_names = None + z_names = None + cols = yxz_names if self.ivars is not None: - self.icovars = [s for s in co_varnames if s.startswith( + self.icovars = [s for s in x_names if s.startswith( ivars[0]) and s.endswith(ivars[1])] else: self.icovars = None - Y = Y.to_numpy().reshape(len(Y), 1) + + Y = Y.to_numpy() + #if Y.ndim != 1: + # Y = Y.reshape((len(Y), 1)) + #.reshape((len(Y), 1)) X = X.to_numpy() if self.is_iv: - I = I.to_numpy().reshape(len(I), 1) + I = I.to_numpy() + if I.ndim != 1: + I = I.reshape((len(I), 1)) if Y.shape[1] > 1: raise ValueError( @@ -151,14 +162,14 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str na_index = (na_index + fe_na) fe2 = np.delete(fe, na_index, axis=0) # drop intercept - intercept_index = co_varnames.index("Intercept") + intercept_index = x_names.index("Intercept") X = np.delete(X, intercept_index, axis = 1) #if self.is_iv: # I = np.delete(I, intercept_index, axis = 1) - co_varnames.remove("Intercept") - var_names.remove("Intercept") - if self.is_iv: - z_varnames.remove("Intercept") + x_names.remove("Intercept") + yxz_names.remove("Intercept") + if self.is_iv: + z_names.remove("Intercept") # check if variables have already been demeaned Y = np.delete(Y, fe_na, axis=0) @@ -181,8 +192,8 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str # get not yet demeaned covariates var_diff_names = list( - set(var_names) - set(YXZ_demeaned_old.columns))[0] - var_diff_index = list(var_names).index(var_diff_names) + set(yxz_names) - set(YXZ_demeaned_old.columns))[0] + var_diff_index = list(yxz_names).index(var_diff_names) var_diff = YXZ[:, var_diff_index] if var_diff.ndim == 1: var_diff = var_diff.reshape(len(var_diff), 1) @@ -215,9 +226,8 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str YXZ_demeaned = algorithm.residualize(YXZ) YXZ_demeaned = pd.DataFrame(YXZ_demeaned) - cols = list(dep_varnames) + list(co_varnames) - if self.is_iv: - cols += iv_varnames + #if self.is_iv: + # cols += iv_names YXZ_demeaned.columns = cols @@ -233,24 +243,22 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str YXZ_demeaned = pd.DataFrame(YXZ) - cols = list(dep_varnames) + list(co_varnames) - - if self.is_iv: - cols += list(iv_varnames) + #if self.is_iv: + # cols += list(iv_names) YXZ_demeaned.columns = cols - YX_dict[fml] = YXZ_demeaned[cols] + YXZ_dict[fml] = YXZ_demeaned#[cols] na_dict[fml] = na_index var_dict[fml] = dict({ - 'dep_varnames': dep_varnames, - 'co_varnames': co_varnames, - 'iv_varnames': iv_varnames, - 'z_varnames': z_varnames + 'y_names': y_names, + 'x_names': x_names, + 'iv_names': iv_names, + 'z_names': z_names }) - return YX_dict, na_dict, var_dict + return YXZ_dict, na_dict, var_dict def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc(), fixef_rm: str = "none") -> None: ''' @@ -415,7 +423,7 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc data, fval, ivars, drop_ref) self.demeaned_data_dict[fval].append(demeaned_data) self.dropped_data_dict[fval].append(dropped_data) - self.yxz_name_dict[fval].append(yxz_name_dict) + self.yxz_name_dict[fval].append(yxz_name_dict) # here: if estimate_split_model: for _, fval in enumerate(fixef_keys): @@ -424,11 +432,11 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc self.yxz_name_dict[fval] = [] for x in self.split_categories: sub_data = self.data[x == self.splitvar] - demeaned_data, dropped_data = self._demean( + demeaned_data, dropped_data, yxz_name_dict = self._demean( sub_data, fval, ivars, drop_ref) self.demeaned_data_dict[fval].append(demeaned_data) self.dropped_data_dict[fval].append(dropped_data) - self.yxz_name_dict[fval].append(yxz_name_dict) + self.yxz_name_dict[fval].append(yxz_name_dict) # estimate models based on demeaned model matrix and dependent variables for _, fval in enumerate(self.fml_dict.keys()): @@ -453,14 +461,14 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc else: split_log = None full_fml = fml2 - + name_dict = self.yxz_name_dict[fval][0][fml] - depvar_name = name_dict["dep_varnames"] - xvar_names = name_dict["co_varnames"] - if name_dict["z_varnames"] is None: - zvar_names = name_dict["co_varnames"] - else: - zvar_names = name_dict["z_varnames"] + depvar_name = name_dict["y_names"] + xvar_names = name_dict["x_names"] + if name_dict["z_names"] is None: + zvar_names = name_dict["x_names"] + else: + zvar_names = name_dict["z_names"] Y = model_frame[depvar_name] X = model_frame[xvar_names] @@ -483,7 +491,7 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc ". The model is skipped. As you are running a regression via `i()` syntax, maybe you need to drop a level via i(var1, var2, ref = ...)?") else: raise ValueError( - "The design Matrix X does not have full rank for the regression with fml" + fml2 + ". The model is skipped. ") + "The design Matrizx X does not have full rank for the regression with fml" + fml2 + ". The model is skipped. ") FEOLS = Feols(Y, X, Z) FEOLS.is_iv = self.is_iv From e56e7045ef54c0074340a96e002e4c7bfbae7eba Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sat, 13 May 2023 19:01:19 +0200 Subject: [PATCH 05/12] add unit tests - still need to fix iid and HC1 inference for IV --- pyfixest/__pycache__/feols.cpython-310.pyc | Bin 11765 -> 11739 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 23472 -> 23560 bytes pyfixest/feols.py | 4 +- pyfixest/fixest.py | 10 +- ...est_vs_fixest.cpython-310-pytest-7.3.1.pyc | Bin 6239 -> 7728 bytes tests/test_vs_fixest.py | 135 ++++++++++++++++-- 6 files changed, 138 insertions(+), 11 deletions(-) diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index 904c8ecdfe4985df18515d6ab195afc5cdb9ee30..991bb033837068de1d9ecceebd409bdc3c90b27e 100644 GIT binary patch delta 1117 zcmZuwOKTHR6ux&F$4;9`(!3{=M<01KO?}%`LOZKsa3#2R@43@b6%3p+bHDSQ?>i?q`8Dx%LZ8$14uYTY z50mWEYyGW8-?cWimy{Y}zVm$2jyc8}X{20=Il;^bi4u7hZ~TS5;Th#IweE)bax01AsN5X7(8u|^zGb0?x9>}3YatSfvEva(+HMcIcgX|d|hMRvTv_m5L$`75$i z49y^11+|f3xtTWfcw%Rr9H=gpsMGBdr^l7v&upD_uh6>`>%FpmN#T2WyWI!vE4ayI z-VUN#2%`%ljFHF5Vl1_eE|U?Qt_P=6EDa|stdV7p5}sDjsLd`)kr8tFAc|_d1DjJw zD}f3fGswUZI}wvh{f+tYY(S?=!5<<{zqDnBr>H|4*2GvVw~xP@=L6NyPhwKmylFpoD>UzR%eYQ81DOv6wXR zs>u*Z5?uU%OCSPq*2nr*m1*S!d92(#IXi40Wcd}!Q}!W9vBHYN&D~+j+rwNzYxR$H zkf3=QOh{u}1~QGqSU_{g>GPPD({L7vLrRFMe(9^OdXT2 zqvCt%A+3oU{pplPI4ir<3pJ}=YnG!{N|Ku5d4I(iSC?j|Zq%BVUt+pU-XL83=1c}$e5Q0-R0b!8YLa7N+G?xM+Ln~IR^?F}nX;!&Td20>yE->_-CC2S2Qobp P8-w$zN4+bm``-TsXV)pe delta 1047 zcmZuvO=uHA6rS0HHEFW>X|hQ-n>78)Puo=6YHbgS9t5R|(t6TbYU#E$DMqr{{;0D` z4Hc_Y3Ul?adlEbdWv_w<(Sjg~c&Z1zh(}Kz1>f6NrQpJQ^X9$peeau@{XFq=Lb@SI zO$5HvXD79B0OtdLxt#+GO9X3vTYDijJgWjW1@5K5Q z!8~C4j4tMDfbyxF5eBvhSQM-oEXM~Vxi^~23bnWH3U;N3jBRYzO*+yOkjMPsVohs49ipwgOnp$ zM9Xgol(397WD~8R5bNlF_#d;d*$PVXEVOqu6xff43*ljwWm)%nDd>3Z)WgsHbcA;( zPr@Pi$MsflJ6^3kJ@0HQLjvu0eyNT?N1d%!uTM1)atmBH)o<=DE4#}w|B&y=FJj$9 z_YdiHkvih^+vpf?E1XxCAl&iSjcKD?H_9{mbu1yLzQWfFBjPxQV|=^tXmAdpzU67X zTCUF5cf1(wh{hB)@AjQTgm`gQFVEJy<9dp(7kdR5v{g)quADpkU9p{Bb$%2tQ#$61 t_Pn8Vo<~a)GLq|c?Dv$bhK@}7eZE?f1M3(*M7P21(xT{=8a&l$3gI9PYNFD#bZt)6jI-|nc@B4kN0NYyf@EZ!_p@B z3WlLcxZZt8G5^CCKBhvA7uAJeU&*jkTU(QDV;w3mELF*5m#C}10S5WDmNYVUbS=Oz z36dS-J>KKtiWSa9?1=4QE~YNiQpA>Wt}2)-yr#GF4Q~u~_!sXL_{9(DneZ{YJr`rH zTeM2deWvr^Fn^?vLsHcA?=rj*p90?~XnZAjmj^=?*S1vF+QgI4(GaNOW9L^H!s34S zGZ*yoczooDilcbY&Y%_lqF53(0c&Jka%PyEml42RmQ^7gV zYYp$Ul?uVhD8sJIam?s8bs|WHEjP%Am3$3uLT+ksql)d$`I(;umhl7kZZxo1m92j4jewEM_iX(~C;7z@}yrtt*L92=McXfz~93&9o!jkq0P0 zJXRr9w9M>mrbFc$iD-EuFjcg&`LvZS%%<{F)^vfHLFf3Mgq%A{aXz0oU9*Tf=Dzf5eG%@7;t_@$X^=jH^;vDo0zQ5v|kTEoLrv nE07Ya;|Bnigt#66=o6oBY{9`U0tDLXZXmlzyM&NBA-?*5FKxIC delta 610 zcmXYt-)j>=5XbMkcgbBgcWGKpGyy?#q_h%{XrVRMAJD2*s78tgg$OAJ#YmN2t`+5K z)F4zL5?p){kwy@-_@FGPed|M?1b=|OD1y?0e?lKxNZd=Z%gpz)Gdt|eE_}q>4+vd1 z3@VBBU^H(fpS%lM8ve18HWwL~Hyq8Si;8R1QNgHGBl&*b(AI&2Y>ke~lWu|y2lvHp zJF#Nijk^KMXK7V=KJH3IUk!GZZR&mOP0+*!`xZQhpDdwI#gcAc(X@P5>{;YKGoyEX>r$B}`Riyh3YC9NeNwQKKTW^#VLuxgJh4X= z0|bPP2rK;-&XGhDSR{4H>pX9 None: if self.is_iv == False: self.vcov = self.ssc * self.tZXinv * (np.sum(self.u_hat ** 2) / (self.N - 1)) else: - meat = self.Z.transpose() @ np.diag(np.sum(self.u_hat ** 2) / (self.N - 1)) @ self.Z - self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv + meat = np.transpose(self.Z) * (self.u_hat ** 2) @ self.Z + self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv elif self.vcov_type == 'hetero': self.ssc = get_ssc( diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index 84bb9a77..bad81963 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -170,6 +170,7 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str yxz_names.remove("Intercept") if self.is_iv: z_names.remove("Intercept") + cols.remove("Intercept") # check if variables have already been demeaned Y = np.delete(Y, fe_na, axis=0) @@ -632,13 +633,20 @@ def summary(self) -> None: } ) + if fxst.is_iv: + estimation_method = "IV" + else: + estimation_method = "OLS" + + print('###') print('') + print('Model: ', estimation_method) + print('Dep. var.: ', depvar) if fe is not None: print('Fixed effects: ', fe) # if fxst.split_log is not None: # print('Split. var: ', self.split + ":" + fxst.split_log) - print('Dep. var.: ', depvar) print('Inference: ', fxst.vcov_log) print('Observations: ', fxst.N) print('') diff --git a/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc index 53fb61c301d4ee54b5ea04cd424c92a930d6eacc..bf87c281fad3f49ae0d0c1cccf44d906d1be6ef4 100644 GIT binary patch delta 2631 zcma)8U2M}<6!yJw94B#{kfu%Bl#>1c4K0kqpunJXZ0i14=_q3*4-2I??NZXDT$_q@ zP9sq?o+@p+(xg2gB|O2NhIpDbX)n{Hz3gd|CTr53rm54mSEOjtc8;C?q=3{|{%n8e z-t*^kj`Q2$FHh^mP$(e5@1Jin?9Q=I^$s%msQ)NAkX7c|D+$&$E3xkTq)J&2>%Akb zkaRceWBb_tJ0#u1$b^(iJRzUwUyJ+^N;f739t zoa0)+fCO4hS7EFWh#wDEq zV-I88kMfX_HAi!|vWA&4jA`B>UJfOi`*2x5LIU9s!VBU?=-^NaZx163A{+roh1_^f z!M*L}nVI=KKZ?Q^5so385I=|BgCGv-17u93^~fYT^F~9vGtu_Ld{`>=cU^wnWvLYo3E88VVA8yxs=C}=49q+ zld2>J0w$l9OfOu$t7J~G2veAEm6oU}ReTn$s8xxnxVGe}Gk#$F4kOo@05AcE@z$9j zFhPe=Obv8uD`i^pnV~tw)GJ}jR|PYcWQHmcrm+y5IvnAu!Xm43Nd+al;EYvv`#}(}C88=o=mQ6C7wm2Ut4{jKtFMKoWi?3^F4* zQ{>59!7%yFc^G?B`Q+jh&rMy+XN@G!&ho5bd{r zw*brI0P8~tZb$jXDBycgohX?TaAi@ZOGkx4?jE~L;+8o9k^MyBoH05`P%oSX@tvin+ zHw2LOVgqu10txIE7eW%uR6C5x%)oeBG%_5z^c*C}xCo21XeW(%qBKhI2vC`-gu)Re z%DW#ap=rA$~}z6C95pQr3q+g5c^@f*QAzrg|Gl9&01bm zZX~%M0a{Yh@P=;=>5Oj(zzHeSFkJ@C}DR}3*utcZ( zYGj~B`fDUrBi0%YQkx8}dEh#h@;YA-Tb?WC3brSoE!c8CXPCAJ{yRXKVM*BDoB<`m z@q=LdSQh@laKl!ni_TSsDm!8;E^Yg>g)%G7q9mtWmf0Vo+5wX{C+Ny;OeU>`sxd~<0ZqT~KPy={ AnE(I) delta 1178 zcma)*O-vI(6vz9vrQMd@ZN*|KElNQMD+Lur5V6##;0FRmgGnz9bW2jLe9RW3O_2!3 zk3^$pZpH(6H!n$C9{!_5!0DD^&T-9wrYGa9ZtQVj;3ap;Y!x9C|#Wl&I^p*7VrLla9-}XMHj@7vD zK1nk1H(I^4Nc=yQ3Y!gOkrrsCm%mgJ?kz|f;yyLfgVdi$z)~_(*@=l< zCYPNom@I-NQGubAAoD_3&1|7RcR6bo(x#bVwLGmxsvEJa83+S9u!G-I+q$+RYz5*# zn}DvC+u0*xtAeE`F6LP~#GSw{U^oA&o+Fu`)Z#S2FKeUpoxj#%Xy=>uYU>rzh-Np^ zXZVGU0k&7{I?H}F^wz&MS%Wm4z&^k(3(X9%Egu1>o%<-nM zpO02`(%|Zys+$xkcP^BEHUvEYYy#?edobD@6QS-Z+n{0Eu5=jDACn?{IvAP%-$r_{ z`2f%h90U?TAF!^?zt8;?bU(0BXEld}Vo{nM#)>1rQJ|m4!kc+#_3-#<@tVP1{r$jj zxAl^DmN)yJ&9H5%JLXl@g*|Ta%ZM6G6j+i z714fy!y>7PWB182$y7rM+4Fj%C6CYM@`c=_X(>tmFgohDU6ioXDPZv*(J|8bSY4v2 k1Cs-obeR`&)9g6j2Lae)CuE9k*}FQ868v*rpQJSY1aRl+tpET3 diff --git a/tests/test_vs_fixest.py b/tests/test_vs_fixest.py index 695a928a..0c32e098 100644 --- a/tests/test_vs_fixest.py +++ b/tests/test_vs_fixest.py @@ -172,7 +172,7 @@ def test_py_vs_r2(data, fml_multi): # suppress correction for fixed effects fixest.setFixest_ssc(fixest.ssc(True, "none", True, "min", "min", False)) - r_fml = _py_fml_to_r_fml(fml_multi) + r_fml = _py_fml_to_r_fml(fml_multi, False) pyfixest = Fixest(data = data).feols(fml_multi) py_coef = pyfixest.coef()['Estimate'] @@ -217,7 +217,7 @@ def test_py_vs_r_i(data, fml_i): # suppress correction for fixed effects fixest.setFixest_ssc(fixest.ssc(True, "none", True, "min", "min", False)) - r_fml = _py_fml_to_r_fml(fml_i) + r_fml = _py_fml_to_r_fml(fml_i, False) pyfixest = Fixest(data = data).feols(fml_i, vcov = 'iid') py_coef = pyfixest.coef()['Estimate'] @@ -319,8 +319,98 @@ def test_py_vs_r_split(data, fml_split): +@pytest.mark.parametrize("fml_iv", [ -def _py_fml_to_r_fml(py_fml): + "Y ~ X1 | X1 ~ Z1", + #"Y ~ X1 + X2 | X1 ~ Z1", + + "Y ~ X1 | X2 | X1 ~ Z1", + "Y ~ X1 | X2 + X3 | X1 ~ Z1", + #"Y ~ X1 + X2| X3 | X1 ~ Z1", + +]) + + +def test_py_vs_r_iv(data, fml_iv): + + ''' + tests for instrumental variables regressions + ''' + + np.random.seed(123) + + data["Z1"] = data["X1"] * np.random.normal(data.shape[0]) + + # iid errors + pyfixest = Fixest(data = data).feols(fml_iv, vcov = 'iid') + + py_coef = np.sort(pyfixest.coef()['Estimate']) + py_se = np.sort(pyfixest.se()['Std. Error']) + py_pval = np.sort(pyfixest.pvalue()['Pr(>|t|)']) + py_tstat = np.sort(pyfixest.tstat()['t value']) + + fml_r = _py_fml_to_r_fml(fml_iv, True) + + r_fixest = fixest.feols( + ro.Formula(fml_r), + se = 'iid', + data=data, + ssc = fixest.ssc(True, "none", True, "min", "min", False) + ) + + if not np.allclose((np.array(py_coef)), np.sort(stats.coef(r_fixest))): + raise ValueError("py_coef != r_coef") + #if not np.allclose((np.array(py_se)), np.sort(fixest.se(r_fixest))): + # raise ValueError("py_se != r_se for iid errors") + #if not np.allclose((np.array(py_pval)), np.sort(fixest.pvalue(r_fixest))): + # raise ValueError("py_pval != r_pval for iid errors") + #if not np.allclose(np.array(py_tstat), np.sort(fixest.tstat(r_fixest))): + # raise ValueError("py_tstat != r_tstat for iid errors") + + # heteroskedastic errors + pyfixest.vcov("HC1") + py_se = pyfixest.se()['Std. Error'] + py_pval = pyfixest.pvalue()['Pr(>|t|)'] + py_tstat = pyfixest.tstat()['t value'] + + r_fixest = fixest.feols( + ro.Formula(fml_r), + se = 'hetero', + data=data, + ssc = fixest.ssc(True, "none", True, "min", "min", False) + ) + + if not np.allclose((np.array(py_se)), (fixest.se(r_fixest))): + raise ValueError("py_se != r_se for HC1 errors") + #if not np.allclose((np.array(py_pval)), (fixest.pvalue(r_fixest))): + # raise ValueError("py_pval != r_pval for HC1 errors") + #if not np.allclose(np.array(py_tstat), fixest.tstat(r_fixest)): + # raise ValueError("py_tstat != r_tstat for HC1 errors") + + # cluster robust errors + pyfixest.vcov({'CRV1':'group_id'}) + py_se = pyfixest.se()['Std. Error'] + py_pval = pyfixest.pvalue()['Pr(>|t|)'] + py_tstat = pyfixest.tstat()['t value'] + + r_fixest = fixest.feols( + ro.Formula(fml_r), + cluster = ro.Formula('~group_id'), + data=data, + ssc = fixest.ssc(True, "none", True, "min", "min", False) + ) + + if not np.allclose((np.array(py_se)), (fixest.se(r_fixest))): + raise ValueError("py_se != r_se for CRV1 errors") + #if not np.allclose((np.array(py_pval)), (fixest.pvalue(r_fixest))): + # raise ValueError("py_pval != r_pval for CRV1 errors") + #if not np.allclose(np.array(py_tstat), fixest.tstat(r_fixest)): + # raise ValueError("py_tstat != r_tstat for CRV1 errors") + + + + +def _py_fml_to_r_fml(py_fml, is_iv = False): ''' pyfixest multiple estimation fml syntax to fixest multiple depvar @@ -328,11 +418,40 @@ def _py_fml_to_r_fml(py_fml): i.e. 'Y1 + X2 ~ X' -> 'c(Y1, Y2) ~ X' ''' - fml_split = py_fml.split("~") - depvars = fml_split[0] - covars = fml_split[1] - depvars = "c(" + ",".join(depvars.split("+")) + ")" - return depvars + "~" + covars + if is_iv == False: + + fml_split = py_fml.split("~") + depvars = fml_split[0] + covars = fml_split[1] + depvars = "c(" + ",".join(depvars.split("+")) + ")" + + return depvars + "~" + covars + + else: + + fml2 = py_fml.split("|") + + if len(fml2) == 2: + + covars = fml2[0].split("~")[1] + depvar = fml2[0].split("~")[0] + endogvars = fml2[1].split("~")[0] + exogvars = list(set(covars) - set(endogvars)) + if exogvars == []: + exogvars = "1" + + return depvar + "~" + exogvars + "|" + fml2[1] + + elif len(fml2) == 3: + + covars = fml2[0].split("~")[1] + depvar = fml2[0].split("~")[0] + endogvars = fml2[2].split("~")[0] + exogvars = list(set(covars) - set(endogvars)) + if exogvars == []: + exogvars = "1" + + return depvar + "~" + exogvars + "|" + fml2[1] + "|" + fml2[2] From a99ad23c1a7927b6f3795d6d756b3d5d764bf46e Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sat, 13 May 2023 19:22:59 +0200 Subject: [PATCH 06/12] fix IV iid inference --- pyfixest/__pycache__/feols.cpython-310.pyc | Bin 11739 -> 11819 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 23560 -> 23560 bytes pyfixest/feols.py | 7 ++++-- ...est_vs_fixest.cpython-310-pytest-7.3.1.pyc | Bin 7728 -> 7957 bytes tests/test_vs_fixest.py | 22 +++++++++--------- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index 991bb033837068de1d9ecceebd409bdc3c90b27e..1f57f5678b0ac85e75f4de3043375abacde53e88 100644 GIT binary patch delta 1349 zcmZuwO^91n6u$Q*lgUda$;;m)FaJN&Bs0y_PW%}KT?k4+sa>cjX-f=qGclP?+P>UL zTRqR9K}m&yf$LH+Z`(qlM!FExouDAP=qiF6cW&xJ#HHuHj58w`xPRX{_dDNr?#nM1 z?_Tm>_4zyme_wysU>Bah@4u(|i+FV7aNy|wG5tZkLupOyd0!tck4ZPil3`*|+y$8) zCrM&Dc(kie5=OLE<7c&(} zuD{XSL7JT!DQ4zK%<7RC`H7r?p{*uBP)`;zki}~`$aNn_ZBHF$y5JR@G}URc_b@C@UU0(s9bDb?xaYaKt4{)0#LlO>4yRo?DwIl{o%A9 zxTn&mMM3}6mBoLpkrQ9(V{tC=+>1pcA%PN3b#1V9b1Q_IZ**S8i(vI)R1zC~$?oX%xbd<)ek9(nM!mP? X_G3Bi3#(eATjF8$936?&`nUf8GYMyJ!$yhB5J`Zf^Q8AY{2hQPw}wA{*SyVISr163xs_l^ zrtCNq0a_Cz$t1%-TzQj9*E4+bBV`To(RFPf>}&FLq|#j=Pg(@qGpO;zHY5LKC)FAw zuXQ9;on+kP`8`bxP*%aO{zTO|DL2PW9LO*aEJi4U%6sThHpP!vV(|4GyZ=ivMQt?u z1p(?LVUr0R^;Vu2*8@cIj#F@psC%HiZpmZrxTnb9bE3So3paq`6DodD6N4h;Ok!x4 zj;daEVuTha86g?H-DRyZ&6eWXJ!(@=(0t>5<1lfr_$idOqEVxOGo?Vzu}jAZG%SWF znx(8N>NvDc8ANfIeCkwQ_C?ew;IIc6i8FUvVRF+)jACGdf;Eg{)HOZkX^V7y`>^?( zlKNLD!7#hOt1@Abo)Iw&2{l1kjG!(?388``X!ww-D#8tagdNqGY|DQn7CnvRE1p^M zq-dzPKhz=(HRcaxQPv!e;i#w4NNGZt?Y`p5C>TuBL}`LB>AlRm$1sVedIy;5M>BDj zVKnm_9>WBV@ku^;OIy+2X8YRaJMBg1I4|#l$T}x5%PYH@u=-?beKNY=x$CouG2)X$ z3v*PK$9(G~aeI@;`P7~U4D;?=9^+M$xu;&!@FvDYfxs$g9Gw;P+occNy-d<%SjaF@ zM4*}l1B+PnuLp?xPOLe^LHrS)M-+H{{0r(|-ZE4Nw69 diff --git a/pyfixest/__pycache__/fixest.cpython-310.pyc b/pyfixest/__pycache__/fixest.cpython-310.pyc index 4e7a44d0855cca7f750943bd365999b259dad7d9..466f05748dc9a84b3c144f5907cc648b2c0f2910 100644 GIT binary patch delta 98 zcmeC!!Pv2bkt?5z;Z5PGVQFS!WT;_IVJ>AXiUEr7)-Z4Ovv|!Y z&Fzv}pr=rlSfppAP{r?-S&^EekeZg3np{%6ImC*ak%NnogOQ7ohk0|l^+E*z>?Rq6 delta 98 zcmeC!!Pv2bkt?5ImC*ak%NPgi;;_&hjDYd^+E*zBzGD4 diff --git a/pyfixest/feols.py b/pyfixest/feols.py index 1340ff2b..c7acf5f3 100644 --- a/pyfixest/feols.py +++ b/pyfixest/feols.py @@ -177,8 +177,11 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: if self.is_iv == False: self.vcov = self.ssc * self.tZXinv * (np.sum(self.u_hat ** 2) / (self.N - 1)) else: - meat = np.transpose(self.Z) * (self.u_hat ** 2) @ self.Z - self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv + sigma2 = (np.sum(self.u_hat ** 2) / (self.N - 1)) + tZZinv = np.linalg.inv(np.transpose(self.Z) @ self.Z) # k x k + tXZ = np.transpose(self.X) @ self.Z + self.vcov = self.ssc * np.linalg.inv(tXZ @ tZZinv @ tXZ ) * sigma2 # + elif self.vcov_type == 'hetero': self.ssc = get_ssc( diff --git a/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc index bf87c281fad3f49ae0d0c1cccf44d906d1be6ef4..05292735df9ef38a88937e5bd191a49b0ebefd3c 100644 GIT binary patch delta 1251 zcma)*%TE(g6vlh|pbs5dN=sWi)grI7(jsU<Dsl4D-#nJ4J0J~1%@3Pz28hMQdu}ne{<%X@80>&oqIp_Z1)K(f?(0` zEA}~&e6b^J8rdPeH`a58O&Ad!^f!a*&;+`qWSZ}e_64g0d`7o&s@B$sc zC3-7_xv8;PG7CznSSI4 z0Ob`v9z~@aoPla}x=GaT0F{#=cNe$^M1e8jJ}^#kTZ+YspKKyqyornm=z$a4LZPB7 zESuVzN%iu8CrVYT&y?Oy^hEWZTAH#)SiJbg{*KvZFog}M0h%c65bK+H7|^Q?D@&$W zn}whs7@#GGKli_;Z(+y~Fbv!VMu1VEqNTq-)HLc=;G~sxV`)n)@$bT-#fWo^&C!N4 zqutWdfpb5X)#PjV-@c|VFn%{?g}iyqRABt4mDjV5r2Q3JM@3Z`$|_4)warzv$5d5i z)v2=T16MhqTGQs8NoRpE4UcHQF3jr4>T0j~!3D0ez@7BaxT{-troedBne%SyUz*A` zVD^tu?G}?8`B?Fo1sE0bs!1p!T;V&WfJq^*8iZnqE6zfZJU6Kc_@8%L{QSzM8~Nz%`t1>=QklqJsJ%)c$(P)jd~hr*W5@O9tVjQ zE1NGCJXS61ryXx&5SzE8UtCEqmvouba!H>_%h{4nPG$MqrcgAbx=ycFue_B delta 1012 zcma))PfQb05XL*DrQ61BOWTFEY>7}%7uq5M0t$%#Km;oSLh({!s!0U{SsJ5QLsZm@ z#KehSytGF>X?j#I9zA&?riqCMFM9BTcYWV(BBo;ECi~00nR)YOzW1ICzU-HmWZ7jA z-}g7^%=#;N!$GV3%+bhkDa@OW_hMC)nyjl)ZkK|kPg0VouM~47tCW3Wlimi@0|}s= zAIb3^4d#BJ12`a{$+{c%A%U`8PhY;esCUBA1#|C z=ye7Orart7*!|yA9L2t4z;WONa1s~>DrWri=B5$%06R$?gw|zB|E+YBa*Z1hFBPe1UHK*ogis(8p0a55{2{di+o#(^Qg378KWmLd4|d;Wd%x?e;!r+NKz$gGg&AbdRn7wqD}r**y8 zV&Na5Jv7Pn;i%Q+r`>D^D?uR{A>gT6wGtKa8Rh1{j*0MdjlFnY!r}>LI vLPH#j3VktIs-aKm6rA5Kal-L|rjUDhYCo&r+9JTS!18y0^7h=0UJ diff --git a/tests/test_vs_fixest.py b/tests/test_vs_fixest.py index 0c32e098..099ca7f1 100644 --- a/tests/test_vs_fixest.py +++ b/tests/test_vs_fixest.py @@ -337,7 +337,7 @@ def test_py_vs_r_iv(data, fml_iv): tests for instrumental variables regressions ''' - np.random.seed(123) + np.random.seed(1235) data["Z1"] = data["X1"] * np.random.normal(data.shape[0]) @@ -360,12 +360,12 @@ def test_py_vs_r_iv(data, fml_iv): if not np.allclose((np.array(py_coef)), np.sort(stats.coef(r_fixest))): raise ValueError("py_coef != r_coef") - #if not np.allclose((np.array(py_se)), np.sort(fixest.se(r_fixest))): - # raise ValueError("py_se != r_se for iid errors") - #if not np.allclose((np.array(py_pval)), np.sort(fixest.pvalue(r_fixest))): - # raise ValueError("py_pval != r_pval for iid errors") - #if not np.allclose(np.array(py_tstat), np.sort(fixest.tstat(r_fixest))): - # raise ValueError("py_tstat != r_tstat for iid errors") + if not np.allclose((np.array(py_se)), np.sort(fixest.se(r_fixest))): + raise ValueError("py_se != r_se for iid errors") + if not np.allclose((np.array(py_pval)), np.sort(fixest.pvalue(r_fixest))): + raise ValueError("py_pval != r_pval for iid errors") + if not np.allclose(np.array(py_tstat), np.sort(fixest.tstat(r_fixest))): + raise ValueError("py_tstat != r_tstat for iid errors") # heteroskedastic errors pyfixest.vcov("HC1") @@ -402,10 +402,10 @@ def test_py_vs_r_iv(data, fml_iv): if not np.allclose((np.array(py_se)), (fixest.se(r_fixest))): raise ValueError("py_se != r_se for CRV1 errors") - #if not np.allclose((np.array(py_pval)), (fixest.pvalue(r_fixest))): - # raise ValueError("py_pval != r_pval for CRV1 errors") - #if not np.allclose(np.array(py_tstat), fixest.tstat(r_fixest)): - # raise ValueError("py_tstat != r_tstat for CRV1 errors") + if not np.allclose((np.array(py_pval)), (fixest.pvalue(r_fixest))): + raise ValueError("py_pval != r_pval for CRV1 errors") + if not np.allclose(np.array(py_tstat), fixest.tstat(r_fixest)): + raise ValueError("py_tstat != r_tstat for CRV1 errors") From caa2009dea122d8b5850198e15d98b20c806905d Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sat, 13 May 2023 20:22:03 +0200 Subject: [PATCH 07/12] fix HC errors for IV --- pyfixest/__pycache__/feols.cpython-310.pyc | Bin 11819 -> 12039 bytes pyfixest/__pycache__/utils.cpython-310.pyc | Bin 1084 -> 1084 bytes pyfixest/feols.py | 18 +++++++++++++++--- pyfixest/utils.py | 2 +- ...est_vs_fixest.cpython-310-pytest-7.3.1.pyc | Bin 7957 -> 7957 bytes 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index 1f57f5678b0ac85e75f4de3043375abacde53e88..48a72a108527e6de35cf5ad2e3c345ec2479bf22 100644 GIT binary patch delta 1819 zcmZuxZ)h837{B+DT=Tza(zLm|bV-x6$)#!6bzR&2Lzt`JpKY=Ug3QINcWcwF$@1Q{ zo7;OvR;Lp;EPL^bASA+s;TNS}WkUo%=qEw^aER!~fg*y4AAO!nty64yfA_q<=XcNF zBp;uB>s+)Mi3A1s`~BOh{`QlfM#BN(a5eB8De#rR3;ko@^271KF+Y^HzYerS@(Vv2 zz7f79tVZ?dMRAMJ_xZ!{9RDd)X)|dxqsuP&fJvP!hz4}|g4iXtWFp#QHD7T%be@Jp3PS0H?)bUBU)pf;-3f&K%qQ% z))9!pzYoi8C@1HR;S^S4Cjh7HK^C!-U}^Rc3)z^h%!XLPtuY0B*j=SaA7Ng&kGNYJ zfj!9oV)g=~Ku<}xr+Mf}b$c2C)ihJtaJMZ&OKAwPcb7s21uBE(vowU*<1Tj}li8k> z0GzVxg_J4yP;_Rx0!uMf&+GY{;sx;t?5XuhW8T`Y7dDBVv1VCDAKMh|>~1kyub4KZ z#?M->8nIu1H&{_DOgnzI>I}fqSEU_~y zvYT$Wm+tW*Wr5{W!-8F41YSDG3asF+hirLTliTn5G!w^Mhe627GIf}9;Gg6a4dO{>0EvkdJJ9YDgX*Ox3h!E16#nnv+H-j>; zI(HC>6oQOek7+K^9A4wS>-rkSp9_kiX%=A=VGlwSAp+od%@(z263sqpm@Bo*2F<{Y zN0r&aA*6lR4B9lEfYDfAGbmK&_^zxN)Nnj{)1n35RE9{Nzo{JXkM$;21Ugg9uhNtndN`4iec(%NomB@#Q03Bw5PU}pIJa+*BgUzYz&JvQV(uezsEH^#r4*iUA7u#zWV z@u|uTsqWeFzf>eFzc)R!`Rf98bMrQ7o0-;@?z~p?A={jqoo24FWZJVe**d L3U2aClMnv_UU9^l delta 1663 zcmZuxT}&fY6rMYjp#yChV7qksvn?%@4p9DoS22;W>l$_uHzp*TRkq6%Xn_{)OcC^s zO%{L9goNz%b(7W?WA;UtWPMrn%?CF=X?&Ph6JIsam^JaibEc%b8k^j2&j0z&xikIX zjr%u!MX$G6fZtc&uIR74_=V3SlN&rFUnL2?A-~p|0GAt1103VG#?#00u1G%Svz|Nr zv1hV;B;=cQ|E72%(mz0!;K-_A$xO~i_2_2938DARSfz`}Rf5(^yed=@RRQb|O|Kq1 zBzFk-yU~ABw3@9Jvxl`Dk|SXyX|_T&1x_2Bb~s60)%|+#7`m)96#j zg|x4U(8z73u*kgd`Y;srSYGgkAxdL1^KL=}Q1pSV^FOv$&_m2uC9G8uDt%Z}SDlIq zbAzv+DNLz^szOzq5-j%#5qE#)pZXGIk^YIn7BU^M+F6U$0aDUB$7IV7iM{L`YjX;n z2fIi2IU75{cA!V9FmFDh2o@50YDt470Hbs`qfEglsxwLiq6V4D{8bSK2_6aMeEMIe z5SC#%Y~ZD?@mxmA<) zIpS8%Fm2an_Q0^Ez06iAYtSLgALb)LKe@j zVUNc7Txi0bsO>Dt%b{8RU1%QuAzH(?$PnKN50DXlFWf0U5%|OKyHZdLiyraxdZZvO z;Yw=@okB?gSkyWk()4BQZy`L5bUBd}z^`%I92_u{^XE!6L zI&X9RmA2jMS#zaOylp(-pY%ToJhOheM(_$Ib@K-UV{m=H3?#_cyg5Be*7 None: else: u = self.u_hat / (1-leverage) - meat = np.transpose(self.Z) * (u ** 2) @ self.Z - # set off diagonal elements to zero - self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv + if self.is_iv == False: + meat = np.transpose(self.Z) * (u ** 2) @ self.Z + # set off diagonal elements to zero + self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv + else: + tZZinv = np.linalg.inv(np.transpose(self.Z) @ self.Z) # k x k + tXZ = np.transpose(self.X) @ self.Z # k x k + if u.ndim == 1: + u = u.reshape((self.N,1)) + Omega = np.transpose(self.Z) @ (self.Z * (u ** 2)) # k x k + meat = tXZ @ tZZinv @ Omega @ tZZinv @ self.tZX # k x k + bread = np.linalg.inv(tXZ @ tZZinv @ self.tZX) + self.vcov = self.ssc * bread @ meat @ bread + + elif self.vcov_type == "CRV": diff --git a/pyfixest/utils.py b/pyfixest/utils.py index 926b9239..f4b9cbf2 100644 --- a/pyfixest/utils.py +++ b/pyfixest/utils.py @@ -11,7 +11,7 @@ def get_data(seed = 1234): np.random.seed(seed) - N = 1000 + N = 2000 k = 20 G = 25 X = np.random.normal(0, 1, N * k).reshape((N,k)) diff --git a/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc index 05292735df9ef38a88937e5bd191a49b0ebefd3c..93ae855d1fb3d42f1f46b5f921c06e317c345f94 100644 GIT binary patch delta 820 zcma))&ubG=5XYT1*(O^z4K-1tyHzlXt7&aoZ57-6Fyg^NpjO-TRb8S{h-uyMB1JEH zQBQ*4Q2z%{B70Q-1jU1R*gr#WJ^8+G!Ahv$9zHueGjHC^cW0}#RWg0cGWVz_{Qkjg zB}fE*;uFzaP%!I*+0!Z@CxF915t!oF*7$4z<}`2?IH%xRG6j2HA&g7!{>HkTfnydp z4_xG5)^l169;a4_O8jkPqEd#x0_ZCoWz}U>(M?6=t|4|6=r0D}0$)hmEYf#qDfpbW z>DeWCZ6F5hIspQG13-glibQnnb>#?+?h`%6Kd;}5V;UCnQ;)bYI!(*LtI;<^4L*{o z4zD65nvy%2qwfDUc$wd4oJwDtf9t%0!Xv=0!k{1WxSG!LiR^7!3tnW)gQgg06eX#c z;I9Y${7D>lfl~@~cfZypG-UH(%ioa0IA>z}%*%x?5T1w|1UZ`J-)5-cW}` zyxsHKn-U_3q1L_bW>fZrao5-Hm?||TjL0o`$jMWU3(maa1E)g;{^1-W!Q0LP75U0o d>G&M_SX2mOy-vF;m+-v|tN|WS<9B20zX5OrpQ!)< delta 876 zcma))&u3Y>sx1^0>yH|=6$MERL8uARx@0hoUhG9Z znHYVk|AR-fNA>K@c=9m+hMqh*-`%7&*n@lc?96-LnfGJfc5XYTJBFbL)K~ucQEx>^ zx=!RXQPxfArGZ3BIm9X85Rd_8_>GaCO=Ec)I0KwjuniH#I;SARqW*AWUChF84mc0Y z^H1Xit+-F46`}?HJ~BC%hrIxJAuP2jiHnMM)W7aFd`rMTm*rw+P%LvLwnk<5OU$IL zOVF7>2-q`!IQr5@2mBf$e$YG0Ahqr@uZTT^sicSQI2aJ(>F zgCq|WxD!9}-w9sEkwxGNa22=)TnGBn|GWED_(y>LcEL7wLs3#)l(4%A+ya*QXyO5_ zx-Sz81G)@Wrv*XC-^QGz4Z#WEq(aF);Dwi(XgqE?8)DcKHpb&yUbiP9+#Q)IY^Q-D zFa-Exgq8PFyHm9D3}V0X+C%ljJ?Z7orT7bkMZv&drwcZGVLc2|_KuK=q+6DabBiS<9hNUHb% From 48de79e000e3647c1acf799df55b2a74a6bc5a5e Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sat, 13 May 2023 20:57:04 +0200 Subject: [PATCH 08/12] fix CRV1 errors --- pyfixest/__pycache__/feols.cpython-310.pyc | Bin 12039 -> 12175 bytes pyfixest/feols.py | 10 +++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index 48a72a108527e6de35cf5ad2e3c345ec2479bf22..9244b9f5289f3aba4a903ce56aee0116b1cd4ad0 100644 GIT binary patch delta 191 zcmZpV>yPKl=jG*M0D|zl@hQ5l8~Ju~GRd)TKF#@@nX!BFX5Mnfos+fs>N)vR__CQM zFcmdUe#+y?&RWAFz)-_6Ih)sptA;5>2`I%})I0espCL1Ik@{pt{@IN0CeP*1Wo9lk znanHT$(X%4Tp*T*QEc*7nSGMX0!$)IB8*au5{x`dGK^A8LX2WSD8V?nLDrsm5{v%k rL$ceL7=1TaDqQAdtlaFY6~f4PZ1W=RbVkNYleu)iGL~=BV`l^au$wco delta 179 zcmeB=Z;#{4=jG*M0D>=9;!`@EH}dV~WLm_w`84NqW=7x1n|aF_t0!yo)hi2kFl32{ zFw}4eFo0MfGF~D@Ihdh_DMcxpX##VR|71^oLuRI;my>JxXESb?EGdx7%vAVoa;JbN zqweO*0Fv>7Z=8&^zp2ecR*-LI46Qk>9M#amVjD?%8 cYK1T|?%S-Tlg`L^YVsuAuZ;PdJM`EY0mb|>Z2$lO diff --git a/pyfixest/feols.py b/pyfixest/feols.py index 21db1de2..c0ffda68 100644 --- a/pyfixest/feols.py +++ b/pyfixest/feols.py @@ -246,6 +246,7 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: if vcov_type_detail == "CRV1": + meat = np.zeros((self.k, self.k)) for _, g, in enumerate(clustid): @@ -255,7 +256,14 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: score_g = (np.transpose(Zg) @ ug).reshape((self.k, 1)) meat += np.dot(score_g, score_g.transpose()) - self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv + if self.is_iv == False: + self.vcov = self.ssc * self.tZXinv @ meat @ self.tZXinv + else: + tZZinv = np.linalg.inv(np.transpose(self.Z) @ self.Z) # k x k + tXZ = np.transpose(self.X) @ self.Z # k x k + meat = tXZ @ tZZinv @ meat @ tZZinv @ self.tZX + bread = np.linalg.inv(tXZ @ tZZinv @ self.tZX) + self.vcov = self.ssc * bread @ meat @ bread elif vcov_type_detail == "CRV3": From af5b781bf9ed28dd3f95ce251b2b6804059a7908 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sat, 13 May 2023 21:15:58 +0200 Subject: [PATCH 09/12] add tests with k > 1 --- ...est_vs_fixest.cpython-310-pytest-7.3.1.pyc | Bin 7957 -> 8017 bytes tests/test_vs_fixest.py | 11 +++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc index 93ae855d1fb3d42f1f46b5f921c06e317c345f94..b3eda4f6b9828dcb08f2ed5f6068a7c457f02584 100644 GIT binary patch delta 257 zcmbPgchQb7pO=@50SFF1j8924+sG#<#V9gaL8^tZWAaj|IO(Dq))Zz*h6M~MObZ!P zSR@&0S!!5-Jobf*ll!E_Cu>VfE2J|vGfFTtGuCpXaHp^@V65R-$SBTG%TdFT&XCPi zls5T-wAADRX}fj4X^QOe|kFXUMK%Wai`Z2LNfHHK70i delta 197 zcmca;H`R_WpO=@50SIngiBG9E-N+{>#V9mcL8^r@Wb#s}IKk8!))Zz*h6M~MObZ!P zSR@%H%SjsvG&4#tG&9z6)NrITWHS{-PA-sE7hHiwsrclR($eV4rva5qZI+X9Wwe~j z$iPr+0JNTigNuoSk%Li!k%x(kg@;LqNr+L1Q3NQ$!YILn%2#1x`M!CH>?%fP9zK5n Dr>Q3d diff --git a/tests/test_vs_fixest.py b/tests/test_vs_fixest.py index 099ca7f1..0b7419fe 100644 --- a/tests/test_vs_fixest.py +++ b/tests/test_vs_fixest.py @@ -326,6 +326,8 @@ def test_py_vs_r_split(data, fml_split): "Y ~ X1 | X2 | X1 ~ Z1", "Y ~ X1 | X2 + X3 | X1 ~ Z1", + + #"Y ~ X1 + C(X4) | X2 + X3 | X1 ~ Z1", #"Y ~ X1 + X2| X3 | X1 ~ Z1", ]) @@ -434,9 +436,12 @@ def _py_fml_to_r_fml(py_fml, is_iv = False): if len(fml2) == 2: covars = fml2[0].split("~")[1] + covars = covars.split("+") depvar = fml2[0].split("~")[0] endogvars = fml2[1].split("~")[0] - exogvars = list(set(covars) - set(endogvars)) + exogvars = list(set(covars) - set([endogvars])) + exogvars = "1" + "+".join(exogvars) + if exogvars == []: exogvars = "1" @@ -445,9 +450,11 @@ def _py_fml_to_r_fml(py_fml, is_iv = False): elif len(fml2) == 3: covars = fml2[0].split("~")[1] + covars = covars.split("+") depvar = fml2[0].split("~")[0] endogvars = fml2[2].split("~")[0] - exogvars = list(set(covars) - set(endogvars)) + exogvars = list(set(covars) - set([endogvars])) + exogvars = "1" + "+".join(exogvars) if exogvars == []: exogvars = "1" From 719440ac293d5e3cc15c8575a4510bbd1c530071 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sat, 13 May 2023 21:33:47 +0200 Subject: [PATCH 10/12] update tests with k>2, fix bug for iid with k>1 --- pyfixest/__pycache__/feols.cpython-310.pyc | Bin 12175 -> 12177 bytes pyfixest/feols.py | 2 +- ...est_vs_fixest.cpython-310-pytest-7.3.1.pyc | Bin 8017 -> 8124 bytes tests/test_vs_fixest.py | 17 +++++++++-------- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index 9244b9f5289f3aba4a903ce56aee0116b1cd4ad0..777e92bd668fb651a2c1bd957de0d5c3ac7956cc 100644 GIT binary patch delta 332 zcmeB=pBT@Z&&$ij00bYO#-|u<ZN6|u#mUWl%DlEf z-Fzv0K+~9tnkGNx@tpjJPXMRo>WqDpJ^76pH73{c&t`l-SyCXM(R6aBfG1uj0%%m`ILEWfNJ?t_<-g!6*W$N&f_`xAD;kD^X0gJ z&Q$^`W-jWT?9Fe?s6M%#e>UU0$ None: sigma2 = (np.sum(self.u_hat ** 2) / (self.N - 1)) tZZinv = np.linalg.inv(np.transpose(self.Z) @ self.Z) # k x k tXZ = np.transpose(self.X) @ self.Z - self.vcov = self.ssc * np.linalg.inv(tXZ @ tZZinv @ tXZ ) * sigma2 # + self.vcov = self.ssc * np.linalg.inv(tXZ @ tZZinv @ self.tZX ) * sigma2 # elif self.vcov_type == 'hetero': diff --git a/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc index b3eda4f6b9828dcb08f2ed5f6068a7c457f02584..345a320f1c95d96da03e599519ee71b94fcbeed8 100644 GIT binary patch delta 1118 zcma))O-vI}5XU=fTb7mGmcl|mwzUunHb9jx5tSlpMMV)spg^QxR!LI?d^AQ)m54+y zCM3*-V|&oVqv=%>6TQeuJ@(GoL^zRXe6y=!8cf{H{_@|M|J!{tZ$3xg^vLtFELr%q zx|z^3ujL;lu!Ch{4eaD2;&*^(zDXL`r#5p3J52Bq+6e8qDmQmVNOlm85IQ-+GE+$R za1?ATaqIRhJ4%5r!ZAWOZpkY!l)tBp0-VH8j!3kZ;-?74FZ^5$u+yAj#r)hg%3UNB ze~iblTvhE?D0vk}oi|}P|JJF&(iw_q1S?_BGAL101$D$MMKu3C!UF~S!hNHbf9-*l z(J})v`IR)rU2PE0KXor4` za4kM_e{iry+Hn)dK)8xUaL^N4G6vxg#dn9gg(XVXivKrKV&3&A^X8u@K_Rb;Sh@1Ykrv^to;ubL*08XHJ1@pdjqX)lf_h7ViM^6Ft;Rjb@vY-7&8P*jcvXbH$F{W3JJI8A$ z8P$ie?-b)S;|wFoILjEpl>0i2m0r7puzZ|7L59NEGAv%Gii$H-2~DlMxc$=fVwtk-im;pv3&(gV+9a8K}}o6*3CV!|72X(KbHR5D=Y(0c163o7}+j5m__ z-zZM-zCnEIHAbrf`um$wta357%WE0Z|7LZU@2WmcyUKR@-}LP5SPee*4dPdyAJ$4* z<2z9Ea=~XBW)nt?o=g5B$25+adNHCQR8lHA3`A5>ETuUd*4O|9+wqOT72}BLE-mEPEhrLr;QuFE!DI<#+ zvmS2+4g3+%;0;N~x0XG#Wb4q6U7=Q(#HmnFyFiyr*=Do!b0USSp;Mn-Mj#(3&?+n6#Q-*hGZ4q6@H}+jmvCRSmktu6gtC&&%r1yAo{uxQIs}JF JyGEMlegk1n+|U33 diff --git a/tests/test_vs_fixest.py b/tests/test_vs_fixest.py index 0b7419fe..3a9b2f49 100644 --- a/tests/test_vs_fixest.py +++ b/tests/test_vs_fixest.py @@ -328,7 +328,7 @@ def test_py_vs_r_split(data, fml_split): "Y ~ X1 | X2 + X3 | X1 ~ Z1", #"Y ~ X1 + C(X4) | X2 + X3 | X1 ~ Z1", - #"Y ~ X1 + X2| X3 | X1 ~ Z1", + "Y ~ X1 + X2| X3 | X1 ~ Z1", ]) @@ -384,10 +384,10 @@ def test_py_vs_r_iv(data, fml_iv): if not np.allclose((np.array(py_se)), (fixest.se(r_fixest))): raise ValueError("py_se != r_se for HC1 errors") - #if not np.allclose((np.array(py_pval)), (fixest.pvalue(r_fixest))): - # raise ValueError("py_pval != r_pval for HC1 errors") - #if not np.allclose(np.array(py_tstat), fixest.tstat(r_fixest)): - # raise ValueError("py_tstat != r_tstat for HC1 errors") + if not np.allclose((np.array(py_pval)), (fixest.pvalue(r_fixest))): + raise ValueError("py_pval != r_pval for HC1 errors") + if not np.allclose(np.array(py_tstat), fixest.tstat(r_fixest)): + raise ValueError("py_tstat != r_tstat for HC1 errors") # cluster robust errors pyfixest.vcov({'CRV1':'group_id'}) @@ -440,10 +440,10 @@ def _py_fml_to_r_fml(py_fml, is_iv = False): depvar = fml2[0].split("~")[0] endogvars = fml2[1].split("~")[0] exogvars = list(set(covars) - set([endogvars])) - exogvars = "1" + "+".join(exogvars) - if exogvars == []: exogvars = "1" + else: + exogvars = "+".join(exogvars) return depvar + "~" + exogvars + "|" + fml2[1] @@ -454,9 +454,10 @@ def _py_fml_to_r_fml(py_fml, is_iv = False): depvar = fml2[0].split("~")[0] endogvars = fml2[2].split("~")[0] exogvars = list(set(covars) - set([endogvars])) - exogvars = "1" + "+".join(exogvars) if exogvars == []: exogvars = "1" + else: + exogvars = "+".join(exogvars) return depvar + "~" + exogvars + "|" + fml2[1] + "|" + fml2[2] From 6ea6ad9546f2e66515c36fa0091523d01c776cda Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sat, 13 May 2023 21:51:08 +0200 Subject: [PATCH 11/12] add error messages for IV --- pyfixest/__pycache__/feols.cpython-310.pyc | Bin 12177 -> 12334 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 23560 -> 23696 bytes pyfixest/feols.py | 5 ++++ pyfixest/fixest.py | 4 ++++ .../test_errors.cpython-310-pytest-7.3.1.pyc | Bin 2690 -> 3326 bytes ...est_vs_fixest.cpython-310-pytest-7.3.1.pyc | Bin 8124 -> 8160 bytes tests/test_errors.py | 22 ++++++++++++++++++ tests/test_vs_fixest.py | 3 +++ 8 files changed, 34 insertions(+) diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index 777e92bd668fb651a2c1bd957de0d5c3ac7956cc..2b044de473bddf08d92d15a5ebdd66f04da1dddb 100644 GIT binary patch delta 737 zcmZWnO=uHA6rMMm-DEe}pEhl6TGP~+{zPl7L};NE1fj+DV4|o*aKEGMCU5sQ{4UN(9Ffhz&!2$ zvd-rzja(EP$;Wii+T-qPX^P|9a1Z=By8>hWmc5%ViPC+3gHN$NzVUr+Tvo)uHh2Yj z77Jp~Kj};k4AnU>EC%Bt6T>+cOoR-(u~+=Pscf9{cbp-GBL1OM=#|8mMd+XctKEVs z`6K0W^u<}${fS&LduK&1_g}o+e|=M~+`1-L*4IX(D?J}M^!Szh2Q8(iK;ypEHwnAZ zY~KqG^S*NIU~3T=LsnyMQi6c^XUOBOMILW?N{|SdXHZ-XG_ulUCB2MH1-dlQ*oF{1 zQz&Sn5u{NGVTy@_XHmP<+ss{*8O&gsvK9g+g;v)*8||8jnn>2SfO=uqEL26R-n4B@ z2)$_sPRJVhHerZ#91|JOS-U_5w3B3W%;U170ndpbhBsUAov5LTDb$5kPc$&Pnz&aL zuZ@<2c5ozQOK~dbZqfvHYtOaz|LD1_|t<2g?JcLQmJ%ZQQ@rx zgCJ;Zb-dZb?x9yf7D4b_K`(-y#H*gggBK6#+a%(_8Q#2a-h1=CZ-#k(@o~$#W|{`0 z@%?K{96bKQdac8r=$-x(peA?HE40pJ-qQ-^wq09h_gUKzBP)DUaUVu6&0<^z=Cu4} z9W^P9T#WUSkK}oK7V2`t-YC~Z?H<3x=h-G-`?fmg&5C^;@T=Y-tcr2jbeiM)yBrvf z1#=-26Gavr2^ki!B>tUL)(*>O&V)h{x#LtzS4l_?VVDH93W7TSwMISq?Of5LtcF1}Kj?je>$3)t9R*#W@A+l_d`P|F(=;QV=eP%#Ej2fz#LS2~M zM2};n&wD}fhiE!z2l+mGuxsG0vjb2V`2X6Y<39C@!KkppSh+%SOJuv_X2RZ5{j66G zDww4g$zg7pHJs>F?W7ugtS2B7%g5Z-x?2D{03SjEhG>OZ|m4i*U@?n zv>Gc?T?vF}<@OzaLw~RFzrNMXAWQm%6Rag(sB2CT!>umVwxIzFN|U|*l-Lap z!8I`$TAp!wFj1re51i?$UZPWf=VV`TR32==1;7OFPAM2qDfOhIi3_2LB@N>U4Ytba zdOhPXCxlRrG=RJ={XV4u^(-poUhb=beH**lK2wfT9N?i#Ox~mJ7b+7_Mw0!5(=8HJOsc~L zx#qkx*c!q-jm%T~lw2+5ia;M!el2FrIYxOH$9S9|kMKUyZ_Wi^NX@oQ%h@H<1QLSxm zR&2-Q#=9kFopPpOTD(#;EwfUq8t)YBQsJ!)(4`*rf^J~%G!PFb)dR&q12A};4<;e_}pw*sf!k%ztkP~Bgrf9`?-_p^t; z^24lqWcHwsI^KKiJ9yhY@c31LkKLPdF9LkwMxJ;EV8>lP{0PAJ?uSo?yYi<9pnY7L zL((it^PDs%rMV`}r_wZ~IU#N>l;D;-eY8hDap>3*+;uM>yV(r^cX4qY2-1z0=L7Wa my_5X_AGtlR#sKEsf!BVA)C>a#7%g5Z-y~|JZSCCwA8B_$Nu7#7L+Mei1#S+tdW`EkV1JLk zo;K@)WCwZZL#Do?=r~1=k!5;To~$v-!!X|hs#l;Ke*15FXFY!r^PQot7H~^g>LkQ+ zWTtsgV*h<@8+e#UZig_xK;==}NH%n?D~(1c)zw@BO;4LDX&dYkX1#Zok`MFXb-jm; zIBCqbfCsl(7u+m0nc+c0qX-{G9CJqb046dTk7lS&^IgD@ny$_4vzWs$b)9pJdKN>N z<9?b{cPFXqC?|5=Bc8{^BOV93Ymz6SJfLCW&^l>-}*&AdyviNpkEYkF@Ht3ogPk0Y^P$@s<`kdQ{1is%My9&pjSKd_ z>b;@>x`SzV#=C=pcLg(QTj~n9-_YC&?T_$I6f2abie*lVd5>Xrn~`@GXFd8Ek^2m1 zJ4C;@7%gq88?l^xr+^lHWl;_ zpWuF4Yu`TDQpK6{JSp*Obgmi4X|!q#qc}CMHHsch%)ZbkPc7@7pv>ACcmhD1rU;JM}PK#A;*v3_rnSK%gN_- zSl&JT7&heBr*{F`^8A?#0C(lbXI}!iC!alk0^pHMz8LXYYt)v#uEZ%NE-A63#Htcs zD)EUDZ6%h)(&C%&gM7R=Ko!K3^RL2RGX3(C0O<1fOVd3P cz?}U2%5RXd7%(XB1%U07wa*yaV{CBmKR?z|4gdfE diff --git a/pyfixest/feols.py b/pyfixest/feols.py index dfd5af42..96c18017 100644 --- a/pyfixest/feols.py +++ b/pyfixest/feols.py @@ -274,6 +274,9 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: #if self.has_fixef: # raise ValueError("CRV3 inference is currently not supported with fixed effects.") + if self.is_iv: + raise ValueError("CRV3 inference is not supported with IV estimation.") + k_params = self.k beta_hat = self.beta_hat @@ -396,6 +399,8 @@ def get_wildboottest(self, B:int, cluster : Union[np.ndarray, pd.Series, pd.Data Returns: a pd.DataFrame with bootstrapped t-statistic and p-value ''' + if self.is_iv: + raise ValueError("Wild cluster bootstrap is not supported with IV estimation.") if self.has_fixef: raise ValueError("Wild cluster bootstrap is not supported with fixed effects.") diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index bad81963..f26d6761 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -105,6 +105,10 @@ def _demean(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str instruments2 = dict2fe_iv.get(depvar)[0] endogvar = list(set(covar2.split("+")) - set(instruments2.split("+")))[0] instrument = list(set(instruments2.split("+")) - set(covar2.split("+")))[0] + + if len([instrument]) > 1 or len([endogvar]) > 1: + raise ValueError("Currently, IV estimation is only supported with one endogeneous variable and one instrument.") + fml2 = instrument + "+" + fml rhs, lhs = model_matrix(fml2, data) diff --git a/tests/__pycache__/test_errors.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_errors.cpython-310-pytest-7.3.1.pyc index cf3bc0b3afd6f67ae989624dd166032ac7c68a34..316fd3ce9cafb452658e3078477f7a54f5d68612 100644 GIT binary patch delta 668 zcmaKo%}T>S5XWaWY24PNet%S|gkGc+#MEoigLe-K8uwBPQ?%7KWfK)7TCg4!DSZIj zi$}qi@z6KWgO8wY>ZM|Fhy5@6pZU#x+{}HZlAdKHAR6yQx*KmN)A-!ZJy~-!e+wc_ zxChyVm)C3F>1#{Pbp!~Y1y>LPVG07QvaUvqv=FK~u@v;Qg(#;NB8~l1VH6;Uh0ww) z42YnXkJo2*19l=~js?USBNCXp(a`I};U(O%e*S71}p)DLc zXN&yL_P77zo#bpcf4MXo804mgbAz@*-`?Hd5d27bXN_Wo_KIC90CxX3u;`XEfs`6Qn-C%ys5D~VVD delta 61 zcmew-*(A!B&&$ij00ivEy;3YVC-TWKE}N*mjFmB%K~r?&y*dsiO_|B3xnE6IWfqxy Qj)#v?X7XJgStcF<0O{2bH2?qr diff --git a/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc index 345a320f1c95d96da03e599519ee71b94fcbeed8..95b826fc06f58ece2527ffa14b75aec632683e91 100644 GIT binary patch delta 947 zcma))OHUI~6vsVnXDr2;7NkCETN=Q`2^1(4P|?0NFO#d)z;XQ(&p9>T?iW! zHzp?BPoN9q*31@HegIwHjqY5zGVHzonM6os;Vgc0UiaMdxO>STNv)}Ao@4SG{8_4e z{G^rLB+RCJk0@!5crs4^sPwTIa1MwAQ~a$Kof(5T4a@)+B@B(}kgrJyg_WK(HrOQ? zE(5bbg8$ZD(W?1e&l08hH}B}|9PIOebwx-@8FpRL(Cu^&;JX9-lPuv2I@k)&`l_^M ze)a`v=LX_}fD1UXemFYH#}Mou-1eneX%K4bh1JB7m*d2Vzt9k`KjXRHNy?jVdUuH) z^8UV5cM&0WkG$R&`R@W3aBdN}3ETpffZISv`G==pfZq#rjtjOk8A(AUwhZkaa35IV z1O7+)I-IK9TdB5XD16tS_73DD+mT!>G8~z|kc%7U7yr6b6OLSr5rQ3s82|1K@Wr#m zona&z0iqHaIL;lsv!qV{?2e zG(<&S2nEM;@{CYwZ8;f+5sTxMYHO>^+CqKYwEixca6+iIS?~{`AqBO+=U+o9O7os@ woyPdf@E{5PF1$o>{wtg~pOg`775QB4dacFQpyvVXf>nVuU+%9td-S`10B#h&o&W#< delta 888 zcma))&rcIk5XT+buBEt3#jXj^ZA}D|Ra$`xh(Fq{S`wp_10rRKG^@qfl(Nk$A(ALu zJerU&e}M7q!I-_`(TgX~J$dmj;ATAdzPkrVgNb|i?7W$I^XAvj!eK#mRW)`-e*3?w zwKrc>CrY;GMh}Vd-dL<0(lgQ~#(`lV2i)L&H8YciI0Z}tGZLmMG{^;sPDE5+HaEmg zC}x3Mz+FC4-_fG?T3aS6@{j&((SrUS;6GtVsVweGnpzO<32cvn?qJZ(^K3lHcKkUl zd0*p6+Is+P5(opQRscg+0cb-|MKpN!sZ?~7){bAsKc7E`Yd%!?Yg=3y$Wg_6KX5=~ zb2?%5t->X!k{gLj=Km%*$Db2Mu`A7!eO^J}e&E!`ARnr-71#NSzNS6HS&=iT*0;?t zALw)5AN^q{X7^Mk1WBXK3xhj*R}t?TFeXtpFZzw@D8kvSxlPdrM`hC$O=qJMX}@w> z>nHkr9rupcWdg@Zpak>+!3sh0XLP(l!2tYax**MFZ!m^6xOUZd8@f9Zb_DeZxmIt7 zGL+y?LrrqL!Qtti*l*hPs}dHk7$daGyGC++*}qe7%N7W9&pumQZ*4oGZ7VNa{~wkC zCv7EA+x*=ai6Hk6d}LTu;;B@Fvivc1SJjDmd^$gxmmXqKq7!a6>MgN^a|J-t Og#(m$D_sw1+QMHLp09)e diff --git a/tests/test_errors.py b/tests/test_errors.py index 6566552c..5bdf55f6 100644 --- a/tests/test_errors.py +++ b/tests/test_errors.py @@ -84,3 +84,25 @@ def test_depvar_numeric(): with pytest.raises(ValueError): fixest.feols('Y ~ X1') + +def test_iv_errors(): + + data = get_data() + data["Z1"] = data["X1"] + np.random.normal(0, 1, data.shape[0]) + data["Z2"] = data["X2"] + np.random.normal(0, 1, data.shape[0]) + + + fixest = Fixest(data) + with pytest.raises(ValueError): + fixest.feols('Y ~ X1 | Z1 + Z2 ~ X1 ') + with pytest.raises(ValueError): + fixest.feols('Y ~ X1 | Z1 ~ X1 + X2') + with pytest.raises(ValueError): + fixest.feols('Y ~ X1 | Z1 + Z2 ~ X1 + X2') + with pytest.raises(ValueError): + fixest.feols('Y ~ X1 | Z1 ~ X1 ', vcov = {"CRV3":"group_id"}) + + + + + diff --git a/tests/test_vs_fixest.py b/tests/test_vs_fixest.py index 3a9b2f49..812e0f44 100644 --- a/tests/test_vs_fixest.py +++ b/tests/test_vs_fixest.py @@ -330,6 +330,9 @@ def test_py_vs_r_split(data, fml_split): #"Y ~ X1 + C(X4) | X2 + X3 | X1 ~ Z1", "Y ~ X1 + X2| X3 | X1 ~ Z1", + #"Y ~ X1 + X2 | X1 + X2 ~ Z1 + Z2", + + ]) From 9b8da2a44c00c361705cb777fdeb633693eb8d81 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sat, 13 May 2023 22:05:33 +0200 Subject: [PATCH 12/12] bump to 0.5 --- poetry.lock | 2574 ++++++++++++----- pyfixest/utils.py | 2 + pyproject.toml | 2 +- readme.md | 63 +- .../test_errors.cpython-310-pytest-7.3.1.pyc | Bin 3326 -> 3326 bytes ...est_vs_fixest.cpython-310-pytest-7.3.1.pyc | Bin 8160 -> 8124 bytes 6 files changed, 1933 insertions(+), 708 deletions(-) diff --git a/poetry.lock b/poetry.lock index 852c0c13..0c5591d7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + [[package]] name = "astor" version = "0.8.1" @@ -5,6 +7,10 @@ description = "Read/rewrite/write Python ASTs" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, + {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, +] [[package]] name = "astunparse" @@ -13,11 +19,269 @@ description = "An AST unparser for Python" category = "dev" optional = false python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] [package.dependencies] six = ">=1.6.1,<2.0" wheel = ">=0.23.0,<1.0" +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "build" +version = "0.10.0" +description = "A simple, correct Python build frontend" +category = "main" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "build-0.10.0-py3-none-any.whl", hash = "sha256:af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171"}, + {file = "build-0.10.0.tar.gz", hash = "sha256:d5b71264afdb5951d6704482aac78de887c80691c52b88a9ad195983ca2c9269"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "os_name == \"nt\""} +packaging = ">=19.0" +pyproject_hooks = "*" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2021.08.31)", "sphinx (>=4.0,<5.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)"] +test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "toml (>=0.10.0)", "wheel (>=0.36.0)"] +typing = ["importlib-metadata (>=5.1)", "mypy (==0.991)", "tomli", "typing-extensions (>=3.7.4.3)"] +virtualenv = ["virtualenv (>=20.0.35)"] + +[[package]] +name = "cachecontrol" +version = "0.12.11" +description = "httplib2 caching for requests" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, + {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, +] + +[package.dependencies] +lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = "*" + +[package.extras] +filecache = ["lockfile (>=0.9)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "cleo" +version = "2.0.1" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "cleo-2.0.1-py3-none-any.whl", hash = "sha256:6eb133670a3ed1f3b052d53789017b6e50fca66d1287e6e6696285f4cb8ea448"}, + {file = "cleo-2.0.1.tar.gz", hash = "sha256:eb4b2e1f3063c11085cebe489a6e9124163c226575a3c3be69b2e51af4a15ec5"}, +] + +[package.dependencies] +crashtest = ">=0.4.1,<0.5.0" +rapidfuzz = ">=2.2.0,<3.0.0" + [[package]] name = "click" version = "8.1.3" @@ -25,6 +289,10 @@ description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -36,6 +304,10 @@ description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "contourpy" @@ -44,6 +316,63 @@ description = "Python library for calculating contours of 2D quadrilateral grids category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, + {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, + {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, + {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, + {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, + {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, + {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, + {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, + {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, + {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, +] [package.dependencies] numpy = ">=1.16" @@ -55,6 +384,60 @@ mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] test = ["Pillow", "matplotlib", "pytest"] test-no-images = ["pytest"] +[[package]] +name = "crashtest" +version = "0.4.1" +description = "Manage Python errors with ease" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, + {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, +] + +[[package]] +name = "cryptography" +version = "40.0.2" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "check-manifest", "mypy", "ruff"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] + [[package]] name = "cycler" version = "0.11.0" @@ -62,6 +445,97 @@ description = "Composable style cycles" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] + +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + +[[package]] +name = "dulwich" +version = "0.21.5" +description = "Python Git Library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dulwich-0.21.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8864719bc176cdd27847332a2059127e2f7bab7db2ff99a999873cb7fff54116"}, + {file = "dulwich-0.21.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3800cdc17d144c1f7e114972293bd6c46688f5bcc2c9228ed0537ded72394082"}, + {file = "dulwich-0.21.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2f676bfed8146966fe934ee734969d7d81548fbd250a8308582973670a9dab1"}, + {file = "dulwich-0.21.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db330fb59fe3b9d253bdf0e49a521739db83689520c4921ab1c5242aaf77b82"}, + {file = "dulwich-0.21.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e8f6d4f4f4d01dd1d3c968e486d4cd77f96f772da7265941bc506de0944ddb9"}, + {file = "dulwich-0.21.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1cc0c9ba19ac1b2372598802bc9201a9c45e5d6f1f7a80ec40deeb10acc4e9ae"}, + {file = "dulwich-0.21.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:61e10242b5a7a82faa8996b2c76239cfb633620b02cdd2946e8af6e7eb31d651"}, + {file = "dulwich-0.21.5-cp310-cp310-win32.whl", hash = "sha256:7f357639b56146a396f48e5e0bc9bbaca3d6d51c8340bd825299272b588fff5f"}, + {file = "dulwich-0.21.5-cp310-cp310-win_amd64.whl", hash = "sha256:891d5c73e2b66d05dbb502e44f027dc0dbbd8f6198bc90dae348152e69d0befc"}, + {file = "dulwich-0.21.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45d6198e804b539708b73a003419e48fb42ff2c3c6dd93f63f3b134dff6dd259"}, + {file = "dulwich-0.21.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c2a565d4e704d7f784cdf9637097141f6d47129c8fffc2fac699d57cb075a169"}, + {file = "dulwich-0.21.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:823091d6b6a1ea07dc4839c9752198fb39193213d103ac189c7669736be2eaff"}, + {file = "dulwich-0.21.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2c9931b657f2206abec0964ec2355ee2c1e04d05f8864e823ffa23c548c4548"}, + {file = "dulwich-0.21.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dc358c2ee727322a09b7c6da43d47a1026049dbd3ad8d612eddca1f9074b298"}, + {file = "dulwich-0.21.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6155ab7388ee01c670f7c5d8003d4e133eebebc7085a856c007989f0ba921b36"}, + {file = "dulwich-0.21.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a605e10d72f90a39ea2e634fbfd80f866fc4df29a02ea6db52ae92e5fd4a2003"}, + {file = "dulwich-0.21.5-cp311-cp311-win32.whl", hash = "sha256:daa607370722c3dce99a0022397c141caefb5ed32032a4f72506f4817ea6405b"}, + {file = "dulwich-0.21.5-cp311-cp311-win_amd64.whl", hash = "sha256:5e56b2c1911c344527edb2bf1a4356e2fb7e086b1ba309666e1e5c2224cdca8a"}, + {file = "dulwich-0.21.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:85d3401d08b1ec78c7d58ae987c4bb7b768a438f3daa74aeb8372bebc7fb16fa"}, + {file = "dulwich-0.21.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90479608e49db93d8c9e4323bc0ec5496678b535446e29d8fd67dc5bbb5d51bf"}, + {file = "dulwich-0.21.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a6bf99f57bcac4c77fc60a58f1b322c91cc4d8c65dc341f76bf402622f89cb"}, + {file = "dulwich-0.21.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3e68b162af2aae995355e7920f89d50d72b53d56021e5ac0a546d493b17cbf7e"}, + {file = "dulwich-0.21.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0ab86d6d42e385bf3438e70f3c9b16de68018bd88929379e3484c0ef7990bd3c"}, + {file = "dulwich-0.21.5-cp37-cp37m-win32.whl", hash = "sha256:f2eeca6d61366cf5ee8aef45bed4245a67d4c0f0d731dc2383eabb80fa695683"}, + {file = "dulwich-0.21.5-cp37-cp37m-win_amd64.whl", hash = "sha256:1b20a3656b48c941d49c536824e1e5278a695560e8de1a83b53a630143c4552e"}, + {file = "dulwich-0.21.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3932b5e17503b265a85f1eda77ede647681c3bab53bc9572955b6b282abd26ea"}, + {file = "dulwich-0.21.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6616132d219234580de88ceb85dd51480dc43b1bdc05887214b8dd9cfd4a9d40"}, + {file = "dulwich-0.21.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:eaf6c7fb6b13495c19c9aace88821c2ade3c8c55b4e216cd7cc55d3e3807d7fa"}, + {file = "dulwich-0.21.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be12a46f73023970125808a4a78f610c055373096c1ecea3280edee41613eba8"}, + {file = "dulwich-0.21.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baecef0d8b9199822c7912876a03a1af17833f6c0d461efb62decebd45897e49"}, + {file = "dulwich-0.21.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:82f632afb9c7c341a875d46aaa3e6c5e586c7a64ce36c9544fa400f7e4f29754"}, + {file = "dulwich-0.21.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82cdf482f8f51fcc965ffad66180b54a9abaea9b1e985a32e1acbfedf6e0e363"}, + {file = "dulwich-0.21.5-cp38-cp38-win32.whl", hash = "sha256:c8ded43dc0bd2e65420eb01e778034be5ca7f72e397a839167eda7dcb87c4248"}, + {file = "dulwich-0.21.5-cp38-cp38-win_amd64.whl", hash = "sha256:2aba0fdad2a19bd5bb3aad6882580cb33359c67b48412ccd4cfccd932012b35e"}, + {file = "dulwich-0.21.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fd4ad079758514375f11469e081723ba8831ce4eaa1a64b41f06a3a866d5ac34"}, + {file = "dulwich-0.21.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7fe62685bf356bfb4d0738f84a3fcf0d1fc9e11fee152e488a20b8c66a52429e"}, + {file = "dulwich-0.21.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aae448da7d80306dda4fc46292fed7efaa466294571ab3448be16714305076f1"}, + {file = "dulwich-0.21.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b24cb1fad0525dba4872e9381bc576ea2a6dcdf06b0ed98f8e953e3b1d719b89"}, + {file = "dulwich-0.21.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e39b7c2c9bda6acae83b25054650a8bb7e373e886e2334721d384e1479bf04b"}, + {file = "dulwich-0.21.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26456dba39d1209fca17187db06967130e27eeecad2b3c2bbbe63467b0bf09d6"}, + {file = "dulwich-0.21.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:281310644e02e3aa6d76bcaffe2063b9031213c4916b5f1a6e68c25bdecfaba4"}, + {file = "dulwich-0.21.5-cp39-cp39-win32.whl", hash = "sha256:4814ca3209dabe0fe7719e9545fbdad7f8bb250c5a225964fe2a31069940c4cf"}, + {file = "dulwich-0.21.5-cp39-cp39-win_amd64.whl", hash = "sha256:c922a4573267486be0ef85216f2da103fb38075b8465dc0e90457843884e4860"}, + {file = "dulwich-0.21.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e52b20c4368171b7d32bd3ab0f1d2402e76ad4f2ea915ff9aa73bc9fa2b54d6d"}, + {file = "dulwich-0.21.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeb736d777ee21f2117a90fc453ee181aa7eedb9e255b5ef07c51733f3fe5cb6"}, + {file = "dulwich-0.21.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e8a79c1ed7166f32ad21974fa98d11bf6fd74e94a47e754c777c320e01257c6"}, + {file = "dulwich-0.21.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b943517e30bd651fbc275a892bb96774f3893d95fe5a4dedd84496a98eaaa8ab"}, + {file = "dulwich-0.21.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:32493a456358a3a6c15bbda07106fc3d4cc50834ee18bc7717968d18be59b223"}, + {file = "dulwich-0.21.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa44b812d978fc22a04531f5090c3c369d5facd03fa6e0501d460a661800c7f"}, + {file = "dulwich-0.21.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f46bcb6777e5f9f4af24a2bd029e88b77316269d24ce66be590e546a0d8f7b7"}, + {file = "dulwich-0.21.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a917fd3b4493db3716da2260f16f6b18f68d46fbe491d851d154fc0c2d984ae4"}, + {file = "dulwich-0.21.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:684c52cff867d10c75a7238151ca307582b3d251bbcd6db9e9cffbc998ef804e"}, + {file = "dulwich-0.21.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9019189d7a8f7394df6a22cd5b484238c5776e42282ad5d6d6c626b4c5f43597"}, + {file = "dulwich-0.21.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:494024f74c2eef9988adb4352b3651ac1b6c0466176ec62b69d3d3672167ba68"}, + {file = "dulwich-0.21.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f9b6ac1b1c67fc6083c42b7b6cd3b211292c8a6517216c733caf23e8b103ab6d"}, + {file = "dulwich-0.21.5.tar.gz", hash = "sha256:70955e4e249ddda6e34a4636b90f74e931e558f993b17c52570fa6144b993103"}, +] + +[package.dependencies] +urllib3 = ">=1.25" + +[package.extras] +fastimport = ["fastimport"] +https = ["urllib3 (>=1.24.1)"] +paramiko = ["paramiko"] +pgp = ["gpg"] [[package]] name = "exceptiongroup" @@ -70,17 +544,41 @@ description = "Backport of PEP 654 (exception groups)" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "filelock" +version = "3.12.0" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, + {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, +] + +[package.extras] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + [[package]] name = "fonttools" -version = "4.39.3" +version = "4.39.4" description = "Tools to manipulate font files" category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "fonttools-4.39.4-py3-none-any.whl", hash = "sha256:106caf6167c4597556b31a8d9175a3fdc0356fdcd70ab19973c3b0d4c893c461"}, + {file = "fonttools-4.39.4.zip", hash = "sha256:dba8d7cdb8e2bac1b3da28c5ed5960de09e59a2fe7e63bb73f5a59e57b0430d2"}, +] [package.extras] all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] @@ -98,11 +596,15 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "formulaic" -version = "0.6.0" +version = "0.6.1" description = "An implementation of Wilkinson formulas." category = "main" optional = false python-versions = ">=3.7.2" +files = [ + {file = "formulaic-0.6.1-py3-none-any.whl", hash = "sha256:3eebbee86bfde23f66c7b86f727b52e4f2af1b08be9ea752d2ea3fe2ff951fe8"}, + {file = "formulaic-0.6.1.tar.gz", hash = "sha256:5b20b2130436dc8bf5ea604e69d88d44b3be4d8ea20bfea96d982fa1f6bb762b"}, +] [package.dependencies] astor = ">=0.8" @@ -125,6 +627,10 @@ description = "Copy your docs directly to the gh-pages branch." category = "dev" optional = false python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] [package.dependencies] python-dateutil = ">=2.8.1" @@ -139,28 +645,71 @@ description = "Backport of the Python 3.9 graphlib module for Python 3.6+" category = "main" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "graphlib_backport-1.0.3-py3-none-any.whl", hash = "sha256:24246967b9e7e6a91550bc770e6169585d35aa32790258579a8a3899a8c18fde"}, + {file = "graphlib_backport-1.0.3.tar.gz", hash = "sha256:7bb8fc7757b8ae4e6d8000a26cd49e9232aaa9a3aa57edb478474b8424bfaae2"}, +] [[package]] name = "griffe" -version = "0.27.1" +version = "0.27.5" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." category = "dev" optional = true python-versions = ">=3.7" +files = [ + {file = "griffe-0.27.5-py3-none-any.whl", hash = "sha256:15b48fc3cebfc1c1a1a2f6e8177f6644a4a54517322e08e224fdf671454b34d7"}, + {file = "griffe-0.27.5.tar.gz", hash = "sha256:96fbc7a264bdb32b4da227bed6a16f2509e028a12d7471dbb48c2785bb01817f"}, +] [package.dependencies] colorama = ">=0.4" +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + [package.extras] -async = ["aiofiles (>=0.7,<1.0)"] +all = ["chardet (>=2.2)", "genshi", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "importlib-metadata" version = "6.6.0" description = "Read metadata from Python packages" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, + {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, +] [package.dependencies] zipp = ">=0.5" @@ -177,6 +726,10 @@ description = "Read resources from Python packages" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} @@ -192,6 +745,22 @@ description = "brain-dead simple config-ini parsing" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "installer" +version = "0.7.0" +description = "A library for installing Python wheels." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, + {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, +] [[package]] name = "interface-meta" @@ -200,680 +769,119 @@ description = "`interface_meta` provides a convenient way to expose an extensibl category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "interface_meta-1.3.0-py3-none-any.whl", hash = "sha256:de35dc5241431886e709e20a14d6597ed07c9f1e8b4bfcffde2190ca5b700ee8"}, + {file = "interface_meta-1.3.0.tar.gz", hash = "sha256:8a4493f8bdb73fb9655dcd5115bc897e207319e36c8835f39c516a2d7e9d79a1"}, +] [[package]] -name = "jinja2" -version = "3.1.2" -description = "A very fast and expressive template engine." -category = "dev" +name = "jaraco-classes" +version = "3.2.3" +description = "Utility functions for Python class constructs" +category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] [package.dependencies] -MarkupSafe = ">=2.0" +more-itertools = "*" [package.extras] -i18n = ["Babel (>=2.7)"] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] -name = "kiwisolver" -version = "1.4.4" -description = "A fast implementation of the Cassowary constraint solver" +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] -[[package]] -name = "llvmlite" -version = "0.38.1" -description = "lightweight wrapper around basic LLVM functionality" -category = "main" -optional = false -python-versions = ">=3.7,<3.11" +[package.extras] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] [[package]] -name = "markdown" -version = "3.3.7" -description = "Python implementation of Markdown." +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +MarkupSafe = ">=2.0" [package.extras] -testing = ["coverage", "pyyaml"] +i18n = ["Babel (>=2.7)"] [[package]] -name = "markupsafe" -version = "2.1.2" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] -[[package]] -name = "matplotlib" -version = "3.7.1" -description = "Python plotting package" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -contourpy = ">=1.0.1" -cycler = ">=0.10" -fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -kiwisolver = ">=1.0.1" -numpy = ">=1.20" -packaging = ">=20.0" -pillow = ">=6.2.0" -pyparsing = ">=2.3.1" -python-dateutil = ">=2.7" -setuptools_scm = ">=7" - -[[package]] -name = "mergedeep" -version = "1.3.4" -description = "A deep merge function for 🐍." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "mkdocs" -version = "1.4.2" -description = "Project documentation with Markdown." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -click = ">=7.0" -colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} -ghp-import = ">=1.0" -importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} -jinja2 = ">=2.11.1" -markdown = ">=3.2.1,<3.4" -mergedeep = ">=1.3.4" -packaging = ">=20.5" -pyyaml = ">=5.1" -pyyaml-env-tag = ">=0.1" -watchdog = ">=2.0" - -[package.extras] -i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] - -[[package]] -name = "mkdocs-autorefs" -version = "0.4.1" -description = "Automatically link across pages in MkDocs." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Markdown = ">=3.3" -mkdocs = ">=1.1" - -[[package]] -name = "mkdocstrings" -version = "0.19.1" -description = "Automatic documentation from sources, for MkDocs." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -Jinja2 = ">=2.11.1" -Markdown = ">=3.3" -MarkupSafe = ">=1.1" -mkdocs = ">=1.2" -mkdocs-autorefs = ">=0.3.1" -mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} -pymdown-extensions = ">=6.3" - -[package.extras] -crystal = ["mkdocstrings-crystal (>=0.3.4)"] -python = ["mkdocstrings-python (>=0.5.2)"] -python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] - -[[package]] -name = "mkdocstrings-python" -version = "0.8.3" -description = "A Python handler for mkdocstrings." -category = "dev" -optional = true -python-versions = ">=3.7" - -[package.dependencies] -griffe = ">=0.24" -mkdocstrings = ">=0.19" - -[[package]] -name = "mkdocstrings-python-legacy" -version = "0.2.3" -description = "A legacy Python handler for mkdocstrings." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -mkdocstrings = ">=0.19" -pytkdocs = ">=0.14" - -[[package]] -name = "numba" -version = "0.55.2" -description = "compiling Python code using LLVM" -category = "main" -optional = false -python-versions = ">=3.7,<3.11" - -[package.dependencies] -llvmlite = ">=0.38.0rc1,<0.39" -numpy = ">=1.18,<1.23" -setuptools = "*" - -[[package]] -name = "numpy" -version = "1.22.4" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" -optional = false -python-versions = ">=3.8" - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pandas" -version = "1.5.3" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, -] -python-dateutil = ">=2.8.1" -pytz = ">=2020.1" - -[package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] - -[[package]] -name = "patsy" -version = "0.5.3" -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.5.0" -description = "Python Imaging Library (Fork)" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pyhdfe" -version = "0.1.2" -description = "High dimensional fixed effect absorption with Python 3" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -numpy = ">=1.12.0" -scipy = ">=1.0.0" - -[package.extras] -docs = ["astunparse", "docutils (==0.17)", "ipython", "jinja2 (>=2.11,<3.0)", "nbsphinx (==0.5.0)", "sphinx (==2.0.0)", "sphinx-rtd-theme (==0.4.3)"] -tests = ["pytest", "pytest-xdist"] - -[[package]] -name = "pymdown-extensions" -version = "9.11" -description = "Extension pack for Python Markdown." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -markdown = ">=3.2" -pyyaml = "*" - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" -optional = false -python-versions = ">=3.6.8" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pytest" -version = "7.3.1" -description = "pytest: simple powerful testing with Python" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pytkdocs" -version = "0.16.1" -description = "Load Python objects documentation." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} - -[package.extras] -numpy-style = ["docstring_parser (>=0.7)"] - -[[package]] -name = "pytz" -version = "2023.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "pyyaml-env-tag" -version = "0.1" -description = "A custom YAML tag for referencing environment variables in YAML files. " -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyyaml = "*" - -[[package]] -name = "scipy" -version = "1.8.1" -description = "SciPy: Scientific Library for Python" -category = "main" -optional = false -python-versions = ">=3.8,<3.11" - -[package.dependencies] -numpy = ">=1.17.3,<1.25.0" - -[[package]] -name = "scipy" -version = "1.10.1" -description = "Fundamental algorithms for scientific computing in Python" -category = "main" -optional = false -python-versions = "<3.12,>=3.8" - -[package.dependencies] -numpy = ">=1.19.5,<1.27.0" - -[package.extras] -dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "setuptools" -version = "67.7.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "setuptools-scm" -version = "7.1.0" -description = "the blessed package to manage your versions by scm tags" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -packaging = ">=20.0" -setuptools = "*" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} -typing-extensions = "*" - -[package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "statsmodels" -version = "0.13.5" -description = "Statistical computations and models for Python" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -numpy = [ - {version = ">=1.17", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""}, - {version = ">=1.22.3", markers = "python_version == \"3.10\" and platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""}, -] -packaging = ">=21.3" -pandas = ">=0.25" -patsy = ">=0.5.2" -scipy = [ - {version = ">=1.3", markers = "(python_version > \"3.9\" or platform_system != \"Windows\" or platform_machine != \"x86\") and python_version < \"3.12\""}, - {version = ">=1.3,<1.9", markers = "python_version == \"3.8\" and platform_system == \"Windows\" and platform_machine == \"x86\" or python_version == \"3.9\" and platform_system == \"Windows\" and platform_machine == \"x86\""}, -] - -[package.extras] -build = ["cython (>=0.29.32)"] -develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] -docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] - -[[package]] -name = "tabulate" -version = "0.9.0" -description = "Pretty-print tabular data" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -widechars = ["wcwidth"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "watchdog" -version = "3.0.0" -description = "Filesystem events monitoring" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] - -[[package]] -name = "wheel" -version = "0.40.0" -description = "A built-package format for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -test = ["pytest (>=6.0.0)"] - -[[package]] -name = "wildboottest" -version = "0.1.11" -description = "Wild Cluster Bootstrap Inference for Linear Models in Python" -category = "main" -optional = false -python-versions = ">=3.8,<3.11" -develop = false - -[package.dependencies] -numba = "^0.55" -numpy = "^1.18" -pandas = "^1.4" -pytest = "^7.2.0" -statsmodels = "^0.13" -tabulate = "^0.9.0" - -[package.source] -type = "git" -url = "https://github.com/s3alfisc/wildboottest.git" -reference = "main" -resolved_reference = "8fbdd91d0decafc03e632b302f67d044e15146c9" - -[[package]] -name = "wrapt" -version = "1.15.0" -description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[[package]] -name = "zipp" -version = "3.15.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "1.1" -python-versions = ">=3.8,<3.11" -content-hash = "d814efcfb5cbc47db937d7bc7b943fa761d624aec7b242156da157d519f2a0f3" - -[metadata.files] -astor = [ - {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, - {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, -] -astunparse = [ - {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, - {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -contourpy = [ - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, - {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, - {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, - {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, - {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, - {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, - {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, - {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, - {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, - {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, -] -cycler = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, -] -fonttools = [ - {file = "fonttools-4.39.3-py3-none-any.whl", hash = "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb"}, - {file = "fonttools-4.39.3.zip", hash = "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7"}, -] -formulaic = [ - {file = "formulaic-0.6.0-py3-none-any.whl", hash = "sha256:69d440a3152db6c1be0dd004f45735d16e2533e05688e3e193de0d3b37929a82"}, - {file = "formulaic-0.6.0.tar.gz", hash = "sha256:49c7464d6b51256b06f9fa66b700a2e57dbde21b9288dcfa89e26ac68a207d34"}, -] -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"}, -] -graphlib-backport = [ - {file = "graphlib_backport-1.0.3-py3-none-any.whl", hash = "sha256:24246967b9e7e6a91550bc770e6169585d35aa32790258579a8a3899a8c18fde"}, - {file = "graphlib_backport-1.0.3.tar.gz", hash = "sha256:7bb8fc7757b8ae4e6d8000a26cd49e9232aaa9a3aa57edb478474b8424bfaae2"}, -] -griffe = [ - {file = "griffe-0.27.1-py3-none-any.whl", hash = "sha256:867008786a17532ec529cbf58cee7c4f131b85d61f38691c2046b1883f7be253"}, - {file = "griffe-0.27.1.tar.gz", hash = "sha256:f213e87f99bf3b76d2d4da999d5a38c2ec01b9a6ce3660c5ab52b663d785edba"}, -] -importlib-metadata = [ - {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, - {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, -] -importlib-resources = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, -] -iniconfig = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] -interface-meta = [ - {file = "interface_meta-1.3.0-py3-none-any.whl", hash = "sha256:de35dc5241431886e709e20a14d6597ed07c9f1e8b4bfcffde2190ca5b700ee8"}, - {file = "interface_meta-1.3.0.tar.gz", hash = "sha256:8a4493f8bdb73fb9655dcd5115bc897e207319e36c8835f39c516a2d7e9d79a1"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +[package.dependencies] +attrs = ">=17.4.0" +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "keyring" +version = "23.13.1" +description = "Store and access your passwords safely." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, + {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, ] -kiwisolver = [ + +[package.dependencies] +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} +"jaraco.classes" = "*" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +completion = ["shtab"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "kiwisolver" +version = "1.4.4" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, @@ -943,7 +951,15 @@ kiwisolver = [ {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, ] -llvmlite = [ + +[[package]] +name = "llvmlite" +version = "0.38.1" +description = "lightweight wrapper around basic LLVM functionality" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +files = [ {file = "llvmlite-0.38.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7dd2bd1d6406e7789273e3f8a304ed5d9adcfaa5768052fca7dc233a857be98"}, {file = "llvmlite-0.38.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a5e0ed215a576f0f872f47a70b8cb49864e0aefc8586aff5ce83e3bff47bc23"}, {file = "llvmlite-0.38.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:633c9026eb43b9903cc4ffbc1c7d5293b2e3ad95d06fa9eab0f6ce6ff6ea15b3"}, @@ -973,11 +989,45 @@ llvmlite = [ {file = "llvmlite-0.38.1-cp39-cp39-win_amd64.whl", hash = "sha256:66462d768c30d5f648ca3361d657b434efa8b09f6cf04d6b6eae66e62e993644"}, {file = "llvmlite-0.38.1.tar.gz", hash = "sha256:0622a86301fcf81cc50d7ed5b4bebe992c030580d413a8443b328ed4f4d82561"}, ] -markdown = [ + +[[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] + +[[package]] +name = "markdown" +version = "3.3.7" +description = "Python implementation of Markdown." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, ] -markupsafe = [ + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markupsafe" +version = "2.1.2" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, @@ -1029,7 +1079,15 @@ markupsafe = [ {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, ] -matplotlib = [ + +[[package]] +name = "matplotlib" +version = "3.7.1" +description = "Python plotting package" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, @@ -1072,31 +1130,227 @@ matplotlib = [ {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, ] -mergedeep = [ + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.0.1" +numpy = ">=1.20" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, ] -mkdocs = [ - {file = "mkdocs-1.4.2-py3-none-any.whl", hash = "sha256:c8856a832c1e56702577023cd64cc5f84948280c1c0fcc6af4cd39006ea6aa8c"}, - {file = "mkdocs-1.4.2.tar.gz", hash = "sha256:8947af423a6d0facf41ea1195b8e1e8c85ad94ac95ae307fe11232e0424b11c5"}, + +[[package]] +name = "mkdocs" +version = "1.4.3" +description = "Project documentation with Markdown." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.4.3-py3-none-any.whl", hash = "sha256:6ee46d309bda331aac915cd24aab882c179a933bd9e77b80ce7d2eaaa3f689dd"}, + {file = "mkdocs-1.4.3.tar.gz", hash = "sha256:5955093bbd4dd2e9403c5afaf57324ad8b04f16886512a3ee6ef828956481c57"}, ] -mkdocs-autorefs = [ + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +jinja2 = ">=2.11.1" +markdown = ">=3.2.1,<3.4" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-autorefs" +version = "0.4.1" +description = "Automatically link across pages in MkDocs." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, ] -mkdocstrings = [ + +[package.dependencies] +Markdown = ">=3.3" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocstrings" +version = "0.19.1" +description = "Automatic documentation from sources, for MkDocs." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "mkdocstrings-0.19.1-py3-none-any.whl", hash = "sha256:32a38d88f67f65b264184ea71290f9332db750d189dea4200cbbe408d304c261"}, {file = "mkdocstrings-0.19.1.tar.gz", hash = "sha256:d1037cacb4b522c1e8c164ed5d00d724a82e49dcee0af80db8fb67b384faeef9"}, ] -mkdocstrings-python = [ + +[package.dependencies] +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.2" +mkdocs-autorefs = ">=0.3.1" +mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} +pymdown-extensions = ">=6.3" + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "0.8.3" +description = "A Python handler for mkdocstrings." +category = "dev" +optional = true +python-versions = ">=3.7" +files = [ {file = "mkdocstrings-python-0.8.3.tar.gz", hash = "sha256:9ae473f6dc599339b09eee17e4d2b05d6ac0ec29860f3fc9b7512d940fc61adf"}, {file = "mkdocstrings_python-0.8.3-py3-none-any.whl", hash = "sha256:4e6e1cd6f37a785de0946ced6eb846eb2f5d891ac1cc2c7b832943d3529087a7"}, ] -mkdocstrings-python-legacy = [ + +[package.dependencies] +griffe = ">=0.24" +mkdocstrings = ">=0.19" + +[[package]] +name = "mkdocstrings-python-legacy" +version = "0.2.3" +description = "A legacy Python handler for mkdocstrings." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "mkdocstrings-python-legacy-0.2.3.tar.gz", hash = "sha256:3fb58fdabe19c6b52b8bb1d3bb1540b1cd527b562865468d6754e8cd1201050c"}, {file = "mkdocstrings_python_legacy-0.2.3-py3-none-any.whl", hash = "sha256:1b04d71a4064b0bb8ea9448debab89868a752c7e7bfdd11de480dfbcb9751a00"}, ] -numba = [ + +[package.dependencies] +mkdocstrings = ">=0.19" +pytkdocs = ">=0.14" + +[[package]] +name = "more-itertools" +version = "9.1.0" +description = "More routines for operating on iterables, beyond itertools" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, +] + +[[package]] +name = "msgpack" +version = "1.0.5" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, + {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, + {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, + {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, + {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, + {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, + {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, + {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, + {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, + {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, + {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, + {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, + {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, + {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, + {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, + {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, +] + +[[package]] +name = "numba" +version = "0.55.2" +description = "compiling Python code using LLVM" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +files = [ {file = "numba-0.55.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:dd05f7c0ce64b6977596aa4e5a44747c6ef414d7989da1c7672337c54381a5ef"}, {file = "numba-0.55.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e36232eccd172c583b1f021c5c48744c087ae6fc9dc5c5f0dd2cb2286e517bf8"}, {file = "numba-0.55.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:25410557d0deb1d97397b71e142a36772133986a7dd4fe2935786e2dd149245f"}, @@ -1126,7 +1380,20 @@ numba = [ {file = "numba-0.55.2-cp39-cp39-win_amd64.whl", hash = "sha256:8d5760a1e6a48d98d6b9cf774e4d2a64813d981cca60d7b7356af61195a6ca17"}, {file = "numba-0.55.2.tar.gz", hash = "sha256:e428d9e11d9ba592849ccc9f7a009003eb7d30612007e365afe743ce7118c6f4"}, ] -numpy = [ + +[package.dependencies] +llvmlite = ">=0.38.0rc1,<0.39" +numpy = ">=1.18,<1.23" +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.22.4" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ {file = "numpy-1.22.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:ba9ead61dfb5d971d77b6c131a9dbee62294a932bf6a356e48c75ae684e635b3"}, {file = "numpy-1.22.4-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:1ce7ab2053e36c0a71e7a13a7475bd3b1f54750b4b433adc96313e127b870887"}, {file = "numpy-1.22.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7228ad13744f63575b3a972d7ee4fd61815b2879998e70930d4ccf9ec721dce0"}, @@ -1150,11 +1417,27 @@ numpy = [ {file = "numpy-1.22.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0791fbd1e43bf74b3502133207e378901272f3c156c4df4954cad833b1380207"}, {file = "numpy-1.22.4.zip", hash = "sha256:425b390e4619f58d8526b3dcf656dde069133ae5c240229821f01b5f44ea07af"}, ] -packaging = [ + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] -pandas = [ + +[[package]] +name = "pandas" +version = "1.5.3" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, @@ -1183,11 +1466,60 @@ pandas = [ {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, ] -patsy = [ + +[package.dependencies] +numpy = [ + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, +] +python-dateutil = ">=2.8.1" +pytz = ">=2020.1" + +[package.extras] +test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] + +[[package]] +name = "patsy" +version = "0.5.3" +description = "A Python package for describing statistical models and for building design matrices." +category = "main" +optional = false +python-versions = "*" +files = [ {file = "patsy-0.5.3-py2.py3-none-any.whl", hash = "sha256:7eb5349754ed6aa982af81f636479b1b8db9d5b1a6e957a6016ec0534b5c86b7"}, {file = "patsy-0.5.3.tar.gz", hash = "sha256:bdc18001875e319bc91c812c1eb6a10be4bb13cb81eb763f466179dca3b67277"}, ] -pillow = [ + +[package.dependencies] +numpy = ">=1.4" +six = "*" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "9.5.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, @@ -1255,39 +1587,358 @@ pillow = [ {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, ] -pluggy = [ + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "pkginfo" +version = "1.9.6" +description = "Query metadata from sdists / bdists / installed packages." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, + {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, +] + +[package.extras] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] + +[[package]] +name = "platformdirs" +version = "2.6.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, + {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, +] + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pyhdfe = [ + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry" +version = "1.4.2" +description = "Python dependency management and packaging made easy." +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry-1.4.2-py3-none-any.whl", hash = "sha256:c39c483cde7930915c992f932c163994ce3d870765efb8235ad0139cd65f0c5b"}, + {file = "poetry-1.4.2.tar.gz", hash = "sha256:0bd580a42482579635e774c5286ef73b8df3427567123cdb128b286cec671b3c"}, +] + +[package.dependencies] +build = ">=0.10.0,<0.11.0" +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"]} +cleo = ">=2.0.0,<3.0.0" +crashtest = ">=0.4.1,<0.5.0" +dulwich = ">=0.21.2,<0.22.0" +filelock = ">=3.8.0,<4.0.0" +html5lib = ">=1.0,<2.0" +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +installer = ">=0.7.0,<0.8.0" +jsonschema = ">=4.10.0,<5.0.0" +keyring = ">=23.9.0,<24.0.0" +lockfile = ">=0.12.2,<0.13.0" +packaging = ">=20.4" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.9.4,<2.0.0" +platformdirs = ">=2.5.2,<3.0.0" +poetry-core = "1.5.2" +poetry-plugin-export = ">=1.3.0,<2.0.0" +pyproject-hooks = ">=1.0.0,<2.0.0" +requests = ">=2.18,<3.0" +requests-toolbelt = ">=0.9.1,<0.11.0" +shellingham = ">=1.5,<2.0" +tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.11.1,<0.11.2 || >0.11.2,<0.11.3 || >0.11.3,<1.0.0" +trove-classifiers = ">=2022.5.19" +urllib3 = ">=1.26.0,<2.0.0" +virtualenv = [ + {version = ">=20.4.3,<20.4.5 || >20.4.5,<20.4.6 || >20.4.6,<21.0.0", markers = "sys_platform != \"win32\" or python_version != \"3.9\""}, + {version = ">=20.4.3,<20.4.5 || >20.4.5,<20.4.6 || >20.4.6,<20.16.6", markers = "sys_platform == \"win32\" and python_version == \"3.9\""}, +] +xattr = {version = ">=0.10.0,<0.11.0", markers = "sys_platform == \"darwin\""} + +[[package]] +name = "poetry-core" +version = "1.5.2" +description = "Poetry PEP 517 Build Backend" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry_core-1.5.2-py3-none-any.whl", hash = "sha256:832d40a1ea5fd10c0f648d0575cadddc8b79f06f91d83a1f1a73a7e1dfacfbd7"}, + {file = "poetry_core-1.5.2.tar.gz", hash = "sha256:c6556c3b1ec5b8668e6ef5a4494726bc41d31907339425e194e78a6178436c14"}, +] + +[[package]] +name = "poetry-plugin-export" +version = "1.3.1" +description = "Poetry plugin to export the dependencies to various formats" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry_plugin_export-1.3.1-py3-none-any.whl", hash = "sha256:941d7ba02a59671d6327b16dc6deecc9262477abbc120d728a500cf125bc1e06"}, + {file = "poetry_plugin_export-1.3.1.tar.gz", hash = "sha256:d949742757a8a5f0b5810495bffaf4ed8a767f2e2ffda9887cf72f896deabf84"}, +] + +[package.dependencies] +poetry = ">=1.3.0,<2.0.0" +poetry-core = ">=1.3.0,<2.0.0" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pyhdfe" +version = "0.1.2" +description = "High dimensional fixed effect absorption with Python 3" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ {file = "pyhdfe-0.1.2-py3-none-any.whl", hash = "sha256:569709e31320d899776bd00e3c9b2594baf602f30361e232ab034851855a20fe"}, {file = "pyhdfe-0.1.2.tar.gz", hash = "sha256:a906e5d0922a65503333028e944d993ce15f4ee44e2b3ace2f79049623888432"}, ] -pymdown-extensions = [ + +[package.dependencies] +numpy = ">=1.12.0" +scipy = ">=1.0.0" + +[package.extras] +docs = ["astunparse", "docutils (==0.17)", "ipython", "jinja2 (>=2.11,<3.0)", "nbsphinx (==0.5.0)", "sphinx (==2.0.0)", "sphinx-rtd-theme (==0.4.3)"] +tests = ["pytest", "pytest-xdist"] + +[[package]] +name = "pymdown-extensions" +version = "9.11" +description = "Extension pack for Python Markdown." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "pymdown_extensions-9.11-py3-none-any.whl", hash = "sha256:a499191d8d869f30339de86fcf072a787e86c42b6f16f280f5c2cf174182b7f3"}, {file = "pymdown_extensions-9.11.tar.gz", hash = "sha256:f7e86c1d3981f23d9dc43294488ecb54abadd05b0be4bf8f0e15efc90f7853ff"}, ] -pyparsing = [ + +[package.dependencies] +markdown = ">=3.2" +pyyaml = "*" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" +files = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] -pytest = [ + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyproject-hooks" +version = "1.0.0" +description = "Wrappers to call pyproject.toml-based build backend hooks." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"}, + {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"}, +] + +[package.dependencies] +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] -python-dateutil = [ + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] -pytkdocs = [ + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytkdocs" +version = "0.16.1" +description = "Load Python objects documentation." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "pytkdocs-0.16.1-py3-none-any.whl", hash = "sha256:a8c3f46ecef0b92864cc598e9101e9c4cf832ebbf228f50c84aa5dd850aac379"}, {file = "pytkdocs-0.16.1.tar.gz", hash = "sha256:e2ccf6dfe9dbbceb09818673f040f1a7c32ed0bffb2d709b06be6453c4026045"}, ] -pytz = [ + +[package.dependencies] +astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} + +[package.extras] +numpy-style = ["docstring_parser (>=0.7)"] + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" +files = [ {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] -pyyaml = [ + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, @@ -1329,11 +1980,172 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -pyyaml-env-tag = [ - {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, - {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "rapidfuzz" +version = "2.15.1" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fc0bc259ebe3b93e7ce9df50b3d00e7345335d35acbd735163b7c4b1957074d3"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d59fb3a410d253f50099d7063855c2b95df1ef20ad93ea3a6b84115590899f25"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c525a3da17b6d79d61613096c8683da86e3573e807dfaecf422eea09e82b5ba6"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4deae6a918ecc260d0c4612257be8ba321d8e913ccb43155403842758c46fbe"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2577463d10811386e704a3ab58b903eb4e2a31b24dfd9886d789b0084d614b01"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f67d5f56aa48c0da9de4ab81bffb310683cf7815f05ea38e5aa64f3ba4368339"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d7927722ff43690e52b3145b5bd3089151d841d350c6f8378c3cfac91f67573a"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6534afc787e32c4104f65cdeb55f6abe4d803a2d0553221d00ef9ce12788dcde"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d0ae6ec79a1931929bb9dd57bc173eb5ba4c7197461bf69e3a34b6dd314feed2"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be7ccc45c4d1a7dfb595f260e8022a90c6cb380c2a346ee5aae93f85c96d362b"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:8ba013500a2b68c64b2aecc5fb56a2dad6c2872cf545a0308fd044827b6e5f6a"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4d9f7d10065f657f960b48699e7dddfce14ab91af4bab37a215f0722daf0d716"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7e24a1b802cea04160b3fccd75d2d0905065783ebc9de157d83c14fb9e1c6ce2"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win32.whl", hash = "sha256:dffdf03499e0a5b3442951bb82b556333b069e0661e80568752786c79c5b32de"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d150d90a7c6caae7962f29f857a4e61d42038cfd82c9df38508daf30c648ae7"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win_arm64.whl", hash = "sha256:87c30e9184998ff6eb0fa9221f94282ce7c908fd0da96a1ef66ecadfaaa4cdb7"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6986413cb37035eb796e32f049cbc8c13d8630a4ac1e0484e3e268bb3662bd1b"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a72f26e010d4774b676f36e43c0fc8a2c26659efef4b3be3fd7714d3491e9957"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5cd54c98a387cca111b3b784fc97a4f141244bbc28a92d4bde53f164464112e"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da7fac7c3da39f93e6b2ebe386ed0ffe1cefec91509b91857f6e1204509e931f"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f976e76ac72f650790b3a5402431612175b2ac0363179446285cb3c901136ca9"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abde47e1595902a490ed14d4338d21c3509156abb2042a99e6da51f928e0c117"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca8f1747007a3ce919739a60fa95c5325f7667cccf6f1c1ef18ae799af119f5e"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35da09ab9797b020d0d4f07a66871dfc70ea6566363811090353ea971748b5a"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a3a769ca7580686a66046b77df33851b3c2d796dc1eb60c269b68f690f3e1b65"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d50622efefdb03a640a51a6123748cd151d305c1f0431af762e833d6ffef71f0"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b7461b0a7651d68bc23f0896bffceea40f62887e5ab8397bf7caa883592ef5cb"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:074ee9e17912e025c72a5780ee4c7c413ea35cd26449719cc399b852d4e42533"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7025fb105a11f503943f17718cdb8241ea3bb4d812c710c609e69bead40e2ff0"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win32.whl", hash = "sha256:2084d36b95139413cef25e9487257a1cc892b93bd1481acd2a9656f7a1d9930c"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:5a738fcd24e34bce4b19126b92fdae15482d6d3a90bd687fd3d24ce9d28ce82d"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:dc3cafa68cfa54638632bdcadf9aab89a3d182b4a3f04d2cad7585ed58ea8731"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c53d57ba7a88f7bf304d4ea5a14a0ca112db0e0178fff745d9005acf2879f7d"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6ee758eec4cf2215dc8d8eafafcea0d1f48ad4b0135767db1b0f7c5c40a17dd"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d93ba3ae59275e7a3a116dac4ffdb05e9598bf3ee0861fecc5b60fb042d539e"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c3ff75e647908ddbe9aa917fbe39a112d5631171f3fcea5809e2363e525a59d"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d89c421702474c6361245b6b199e6e9783febacdbfb6b002669e6cb3ef17a09"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f69e6199fec0f58f9a89afbbaea78d637c7ce77f656a03a1d6ea6abdc1d44f8"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:41dfea282844d0628279b4db2929da0dacb8ac317ddc5dcccc30093cf16357c1"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2dd03477feefeccda07b7659dd614f6738cfc4f9b6779dd61b262a73b0a9a178"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5efe035aa76ff37d1b5fa661de3c4b4944de9ff227a6c0b2e390a95c101814c0"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ed2cf7c69102c7a0a06926d747ed855bc836f52e8d59a5d1e3adfd980d1bd165"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a0e441d4c2025110ec3eba5d54f11f78183269a10152b3a757a739ffd1bb12bf"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-win32.whl", hash = "sha256:a4a54efe17cc9f53589c748b53f28776dfdfb9bc83619685740cb7c37985ac2f"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:bb8318116ecac4dfb84841d8b9b461f9bb0c3be5b616418387d104f72d2a16d1"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e9296c530e544f68858c3416ad1d982a1854f71e9d2d3dcedb5b216e6d54f067"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:49c4bcdb9238f11f8c4eba1b898937f09b92280d6f900023a8216008f299b41a"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebb40a279e134bb3fef099a8b58ed5beefb201033d29bdac005bddcdb004ef71"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7381c11cb590bbd4e6f2d8779a0b34fdd2234dfa13d0211f6aee8ca166d9d05"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfdcdedfd12a0077193f2cf3626ff6722c5a184adf0d2d51f1ec984bf21c23c3"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85bece1ec59bda8b982bd719507d468d4df746dfb1988df11d916b5e9fe19e8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1b393f4a1eaa6867ffac6aef58cfb04bab2b3d7d8e40b9fe2cf40dd1d384601"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53de456ef020a77bf9d7c6c54860a48e2e902584d55d3001766140ac45c54bc7"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2492330bc38b76ed967eab7bdaea63a89b6ceb254489e2c65c3824efcbf72993"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:099e4c6befaa8957a816bdb67ce664871f10aaec9bebf2f61368cf7e0869a7a1"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:46599b2ad4045dd3f794a24a6db1e753d23304699d4984462cf1ead02a51ddf3"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:591f19d16758a3c55c9d7a0b786b40d95599a5b244d6eaef79c7a74fcf5104d8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ed17359061840eb249f8d833cb213942e8299ffc4f67251a6ed61833a9f2ea20"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-win32.whl", hash = "sha256:aa1e5aad325168e29bf8e17006479b97024aa9d2fdbe12062bd2f8f09080acf8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:c2bb68832b140c551dbed691290bef4ee6719d4e8ce1b7226a3736f61a9d1a83"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3fac40972cf7b6c14dded88ae2331eb50dfbc278aa9195473ef6fc6bfe49f686"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0e456cbdc0abf39352800309dab82fd3251179fa0ff6573fa117f51f4e84be8"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:22b9d22022b9d09fd4ece15102270ab9b6a5cfea8b6f6d1965c1df7e3783f5ff"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46754fe404a9a6f5cbf7abe02d74af390038d94c9b8c923b3f362467606bfa28"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91abb8bf7610efe326394adc1d45e1baca8f360e74187f3fa0ef3df80cdd3ba6"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e40a2f60024f9d3c15401e668f732800114a023f3f8d8c40f1521a62081ff054"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a48ee83916401ac73938526d7bd804e01d2a8fe61809df7f1577b0b3b31049a3"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c71580052f9dbac443c02f60484e5a2e5f72ad4351b84b2009fbe345b1f38422"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:82b86d5b8c1b9bcbc65236d75f81023c78d06a721c3e0229889ff4ed5c858169"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fc4528b7736e5c30bc954022c2cf410889abc19504a023abadbc59cdf9f37cae"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e1e0e569108a5760d8f01d0f2148dd08cc9a39ead79fbefefca9e7c7723c7e88"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:94e1c97f0ad45b05003806f8a13efc1fc78983e52fa2ddb00629003acf4676ef"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47e81767a962e41477a85ad7ac937e34d19a7d2a80be65614f008a5ead671c56"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win32.whl", hash = "sha256:79fc574aaf2d7c27ec1022e29c9c18f83cdaf790c71c05779528901e0caad89b"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:f3dd4bcef2d600e0aa121e19e6e62f6f06f22a89f82ef62755e205ce14727874"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win_arm64.whl", hash = "sha256:cac095cbdf44bc286339a77214bbca6d4d228c9ebae3da5ff6a80aaeb7c35634"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b89d1126be65c85763d56e3b47d75f1a9b7c5529857b4d572079b9a636eaa8a7"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7460e91168229768be882ea365ba0ac7da43e57f9416e2cfadc396a7df3c2"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c33c03e7092642c38f8a15ca2d8fc38da366f2526ec3b46adf19d5c7aa48ba"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040faca2e26d9dab5541b45ce72b3f6c0e36786234703fc2ac8c6f53bb576743"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6e2a3b23e1e9aa13474b3c710bba770d0dcc34d517d3dd6f97435a32873e3f28"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e597b9dfd6dd180982684840975c458c50d447e46928efe3e0120e4ec6f6686"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d14752c9dd2036c5f36ebe8db5f027275fa7d6b3ec6484158f83efb674bab84e"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558224b6fc6124d13fa32d57876f626a7d6188ba2a97cbaea33a6ee38a867e31"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c89cfa88dc16fd8c9bcc0c7f0b0073f7ef1e27cceb246c9f5a3f7004fa97c4d"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:509c5b631cd64df69f0f011893983eb15b8be087a55bad72f3d616b6ae6a0f96"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0f73a04135a03a6e40393ecd5d46a7a1049d353fc5c24b82849830d09817991f"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99d53138a2dfe8ada67cb2855719f934af2733d726fbf73247844ce4dd6dd5"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f01fa757f0fb332a1f045168d29b0d005de6c39ee5ce5d6c51f2563bb53c601b"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60368e1add6e550faae65614844c43f8a96e37bf99404643b648bf2dba92c0fb"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785744f1270828cc632c5a3660409dee9bcaac6931a081bae57542c93e4d46c4"}, + {file = "rapidfuzz-2.15.1.tar.gz", hash = "sha256:d62137c2ca37aea90a11003ad7dc109c8f1739bfbe5a9a217f3cdb07d7ac00f6"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "requests" +version = "2.30.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, + {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, ] -scipy = [ + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "0.10.1" +description = "A utility belt for advanced users of python-requests" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, + {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "scipy" +version = "1.8.1" +description = "SciPy: Scientific Library for Python" +category = "main" +optional = false +python-versions = ">=3.8,<3.11" +files = [ {file = "scipy-1.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65b77f20202599c51eb2771d11a6b899b97989159b7975e9b5259594f1d35ef4"}, {file = "scipy-1.8.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e013aed00ed776d790be4cb32826adb72799c61e318676172495383ba4570aa4"}, {file = "scipy-1.8.1-cp310-cp310-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:02b567e722d62bddd4ac253dafb01ce7ed8742cf8031aea030a41414b86c1125"}, @@ -1357,6 +2169,19 @@ scipy = [ {file = "scipy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:1166514aa3bbf04cb5941027c6e294a000bba0cf00f5cdac6c77f2dad479b434"}, {file = "scipy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:9dd4012ac599a1e7eb63c114d1eee1bcfc6dc75a29b589ff0ad0bb3d9412034f"}, {file = "scipy-1.8.1.tar.gz", hash = "sha256:9e3fb1b0e896f14a85aa9a28d5f755daaeeb54c897b746df7a55ccb02b340f33"}, +] + +[package.dependencies] +numpy = ">=1.17.3,<1.25.0" + +[[package]] +name = "scipy" +version = "1.10.1" +description = "Fundamental algorithms for scientific computing in Python" +category = "main" +optional = false +python-versions = "<3.12,>=3.8" +files = [ {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, @@ -1379,19 +2204,80 @@ scipy = [ {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, ] -setuptools = [ + +[package.dependencies] +numpy = ">=1.19.5,<1.27.0" + +[package.extras] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "setuptools" +version = "67.7.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, ] -setuptools-scm = [ - {file = "setuptools_scm-7.1.0-py3-none-any.whl", hash = "sha256:73988b6d848709e2af142aa48c986ea29592bbcfca5375678064708205253d8e"}, - {file = "setuptools_scm-7.1.0.tar.gz", hash = "sha256:6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27"}, + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shellingham" +version = "1.5.0.post1" +description = "Tool to Detect Surrounding Shell" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.0.post1-py2.py3-none-any.whl", hash = "sha256:368bf8c00754fd4f55afb7bbb86e272df77e4dc76ac29dbcbb81a59e9fc15744"}, + {file = "shellingham-1.5.0.post1.tar.gz", hash = "sha256:823bc5fb5c34d60f285b624e7264f4dda254bc803a3774a147bf99c0e3004a28"}, ] -six = [ + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -statsmodels = [ + +[[package]] +name = "statsmodels" +version = "0.13.5" +description = "Statistical computations and models for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "statsmodels-0.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75319fddded9507cc310fc3980e4ae4d64e3ff37b322ad5e203a84f89d85203"}, {file = "statsmodels-0.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f148920ef27c7ba69a5735724f65de9422c0c8bcef71b50c846b823ceab8840"}, {file = "statsmodels-0.13.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cc4d3e866bfe0c4f804bca362d0e7e29d24b840aaba8d35a754387e16d2a119"}, @@ -1418,19 +2304,155 @@ statsmodels = [ {file = "statsmodels-0.13.5-cp39-cp39-win_amd64.whl", hash = "sha256:2ff331e508f2d1a53d3a188305477f4cf05cd8c52beb6483885eb3d51c8be3ad"}, {file = "statsmodels-0.13.5.tar.gz", hash = "sha256:593526acae1c0fda0ea6c48439f67c3943094c542fe769f8b90fe9e6c6cc4871"}, ] -tabulate = [ + +[package.dependencies] +numpy = [ + {version = ">=1.17", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""}, + {version = ">=1.22.3", markers = "python_version == \"3.10\" and platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""}, +] +packaging = ">=21.3" +pandas = ">=0.25" +patsy = ">=0.5.2" +scipy = [ + {version = ">=1.3", markers = "python_version > \"3.9\" and python_version < \"3.12\" or platform_system != \"Windows\" and python_version < \"3.12\" or platform_machine != \"x86\" and python_version < \"3.12\""}, + {version = ">=1.3,<1.9", markers = "python_version == \"3.8\" and platform_system == \"Windows\" and platform_machine == \"x86\" or python_version == \"3.9\" and platform_system == \"Windows\" and platform_machine == \"x86\""}, +] + +[package.extras] +build = ["cython (>=0.29.32)"] +develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, ] -tomli = [ + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -typing-extensions = [ + +[[package]] +name = "tomlkit" +version = "0.11.8" +description = "Style preserving TOML library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, + {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, +] + +[[package]] +name = "trove-classifiers" +version = "2023.5.2" +description = "Canonical source for classifiers on PyPI (pypi.org)." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "trove-classifiers-2023.5.2.tar.gz", hash = "sha256:c46d6e40a9581599b16c712e0164fec3764872a4085c673c07559787caedb867"}, + {file = "trove_classifiers-2023.5.2-py3-none-any.whl", hash = "sha256:0f3eceb7d16186211bcd7edafc7b7934399f738ed985998e4e557e52fe136a71"}, +] + +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, ] -watchdog = [ + +[[package]] +name = "urllib3" +version = "1.26.15" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "virtualenv" +version = "20.16.5" +description = "Virtual Python Environment builder" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "virtualenv-20.16.5-py3-none-any.whl", hash = "sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27"}, + {file = "virtualenv-20.16.5.tar.gz", hash = "sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da"}, +] + +[package.dependencies] +distlib = ">=0.3.5,<1" +filelock = ">=3.4.1,<4" +platformdirs = ">=2.4,<3" + +[package.extras] +docs = ["proselint (>=0.13)", "sphinx (>=5.1.1)", "sphinx-argparse (>=0.3.1)", "sphinx-rtd-theme (>=1)", "towncrier (>=21.9)"] +testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "virtualenv" +version = "20.21.1" +description = "Virtual Python Environment builder" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.21.1-py3-none-any.whl", hash = "sha256:09ddbe1af0c8ed2bb4d6ed226b9e6415718ad18aef9fa0ba023d96b7a8356049"}, + {file = "virtualenv-20.21.1.tar.gz", hash = "sha256:4c104ccde994f8b108163cf9ba58f3d11511d9403de87fb9b4f52bf33dbc8668"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.4.1,<4" +platformdirs = ">=2.4,<4" + +[package.extras] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, @@ -1459,12 +2481,70 @@ watchdog = [ {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, ] -wheel = [ + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "wheel" +version = "0.40.0" +description = "A built-package format for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, ] -wildboottest = [] -wrapt = [ + +[package.extras] +test = ["pytest (>=6.0.0)"] + +[[package]] +name = "wildboottest" +version = "0.1.13" +description = "Wild Cluster Bootstrap Inference for Linear Models in Python" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +files = [] +develop = false + +[package.dependencies] +numba = "^0.55" +numpy = "^1.18" +pandas = "^1.4" +poetry = "^1.4.2" +pytest = "^7.2.0" +statsmodels = "^0.13" +tabulate = "^0.9.0" + +[package.source] +type = "git" +url = "https://github.com/s3alfisc/wildboottest.git" +reference = "main" +resolved_reference = "5e7723d611102da6bb892a9370d6c5ef7e99822f" + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, @@ -1541,7 +2621,109 @@ wrapt = [ {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] -zipp = [ + +[[package]] +name = "xattr" +version = "0.10.1" +description = "Python wrapper for extended filesystem attributes" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "xattr-0.10.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:16a660a883e703b311d1bbbcafc74fa877585ec081cd96e8dd9302c028408ab1"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1e2973e72faa87ca29d61c23b58c3c89fe102d1b68e091848b0e21a104123503"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:13279fe8f7982e3cdb0e088d5cb340ce9cbe5ef92504b1fd80a0d3591d662f68"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1dc9b9f580ef4b8ac5e2c04c16b4d5086a611889ac14ecb2e7e87170623a0b75"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:485539262c2b1f5acd6b6ea56e0da2bc281a51f74335c351ea609c23d82c9a79"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:295b3ab335fcd06ca0a9114439b34120968732e3f5e9d16f456d5ec4fa47a0a2"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a126eb38e14a2f273d584a692fe36cff760395bf7fc061ef059224efdb4eb62c"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:b0e919c24f5b74428afa91507b15e7d2ef63aba98e704ad13d33bed1288dca81"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:e31d062cfe1aaeab6ba3db6bd255f012d105271018e647645941d6609376af18"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:209fb84c09b41c2e4cf16dd2f481bb4a6e2e81f659a47a60091b9bcb2e388840"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4120090dac33eddffc27e487f9c8f16b29ff3f3f8bcb2251b2c6c3f974ca1e1"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e739d624491267ec5bb740f4eada93491de429d38d2fcdfb97b25efe1288eca"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2677d40b95636f3482bdaf64ed9138fb4d8376fb7933f434614744780e46e42d"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40039f1532c4456fd0f4c54e9d4e01eb8201248c321c6c6856262d87e9a99593"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:148466e5bb168aba98f80850cf976e931469a3c6eb11e9880d9f6f8b1e66bd06"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0aedf55b116beb6427e6f7958ccd80a8cbc80e82f87a4cd975ccb61a8d27b2ee"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3024a9ff157247c8190dd0eb54db4a64277f21361b2f756319d9d3cf20e475f"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f1be6e733e9698f645dbb98565bb8df9b75e80e15a21eb52787d7d96800e823b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7880c8a54c18bc091a4ce0adc5c6d81da1c748aec2fe7ac586d204d6ec7eca5b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c93b42c3ba8aedbc29da759f152731196c2492a2154371c0aae3ef8ba8301b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b905e808df61b677eb972f915f8a751960284358b520d0601c8cbc476ba2df6"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ef954d0655f93a34d07d0cc7e02765ec779ff0b59dc898ee08c6326ad614d5"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:199b20301b6acc9022661412346714ce764d322068ef387c4de38062474db76c"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec0956a8ab0f0d3f9011ba480f1e1271b703d11542375ef73eb8695a6bd4b78b"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffcb57ca1be338d69edad93cf59aac7c6bb4dbb92fd7bf8d456c69ea42f7e6d2"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f0563196ee54756fe2047627d316977dc77d11acd7a07970336e1a711e934db"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc354f086f926a1c7f04886f97880fed1a26d20e3bc338d0d965fd161dbdb8ab"}, + {file = "xattr-0.10.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0cd2d02ef2fb45ecf2b0da066a58472d54682c6d4f0452dfe7ae2f3a76a42ea"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49626096ddd72dcc1654aadd84b103577d8424f26524a48d199847b5d55612d0"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceaa26bef8fcb17eb59d92a7481c2d15d20211e217772fb43c08c859b01afc6a"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c014c371391f28f8cd27d73ea59f42b30772cd640b5a2538ad4f440fd9190b"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:46c32cd605673606b9388a313b0050ee7877a0640d7561eea243ace4fa2cc5a6"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:772b22c4ff791fe5816a7c2a1c9fcba83f9ab9bea138eb44d4d70f34676232b4"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:183ad611a2d70b5a3f5f7aadef0fcef604ea33dcf508228765fd4ddac2c7321d"}, + {file = "xattr-0.10.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8068df3ebdfa9411e58d5ae4a05d807ec5994645bb01af66ec9f6da718b65c5b"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bc40570155beb85e963ae45300a530223d9822edfdf09991b880e69625ba38a"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:436e1aaf23c07e15bed63115f1712d2097e207214fc6bcde147c1efede37e2c5"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7298455ccf3a922d403339781b10299b858bb5ec76435445f2da46fb768e31a5"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:986c2305c6c1a08f78611eb38ef9f1f47682774ce954efb5a4f3715e8da00d5f"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5dc6099e76e33fa3082a905fe59df766b196534c705cf7a2e3ad9bed2b8a180e"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:042ad818cda6013162c0bfd3816f6b74b7700e73c908cde6768da824686885f8"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9d4c306828a45b41b76ca17adc26ac3dc00a80e01a5ba85d71df2a3e948828f2"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a606280b0c9071ef52572434ecd3648407b20df3d27af02c6592e84486b05894"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5b49d591cf34cda2079fd7a5cb2a7a1519f54dc2e62abe3e0720036f6ed41a85"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8705ac6791426559c1a5c2b88bb2f0e83dc5616a09b4500899bfff6a929302"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5ea974930e876bc5c146f54ac0f85bb39b7b5de2b6fc63f90364712ae368ebe"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f55a2dd73a12a1ae5113c5d9cd4b4ab6bf7950f4d76d0a1a0c0c4264d50da61d"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:475c38da0d3614cc5564467c4efece1e38bd0705a4dbecf8deeb0564a86fb010"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:925284a4a28e369459b2b7481ea22840eed3e0573a4a4c06b6b0614ecd27d0a7"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa32f1b45fed9122bed911de0fcc654da349e1f04fa4a9c8ef9b53e1cc98b91e"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c5d3d0e728bace64b74c475eb4da6148cd172b2d23021a1dcd055d92f17619ac"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8faaacf311e2b5cc67c030c999167a78a9906073e6abf08eaa8cf05b0416515c"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc6b8d5ca452674e1a96e246a3d2db5f477aecbc7c945c73f890f56323e75203"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3725746a6502f40f72ef27e0c7bfc31052a239503ff3eefa807d6b02a249be22"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:789bd406d1aad6735e97b20c6d6a1701e1c0661136be9be862e6a04564da771f"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9a7a807ab538210ff8532220d8fc5e2d51c212681f63dbd4e7ede32543b070f"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e5825b5fc99ecdd493b0cc09ec35391e7a451394fdf623a88b24726011c950d"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80638d1ce7189dc52f26c234cee3522f060fadab6a8bc3562fe0ddcbe11ba5a4"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3ff0dbe4a6ce2ce065c6de08f415bcb270ecfd7bf1655a633ddeac695ce8b250"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5267e5f9435c840d2674194150b511bef929fa7d3bc942a4a75b9eddef18d8d8"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b27dfc13b193cb290d5d9e62f806bb9a99b00cd73bb6370d556116ad7bb5dc12"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:636ebdde0277bce4d12d2ef2550885804834418fee0eb456b69be928e604ecc4"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d60c27922ec80310b45574351f71e0dd3a139c5295e8f8b19d19c0010196544f"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b34df5aad035d0343bd740a95ca30db99b776e2630dca9cc1ba8e682c9cc25ea"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f24a7c04ff666d0fe905dfee0a84bc899d624aeb6dccd1ea86b5c347f15c20c1"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3878e1aff8eca64badad8f6d896cb98c52984b1e9cd9668a3ab70294d1ef92d"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4abef557028c551d59cf2fb3bf63f2a0c89f00d77e54c1c15282ecdd56943496"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0e14bd5965d3db173d6983abdc1241c22219385c22df8b0eb8f1846c15ce1fee"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f9be588a4b6043b03777d50654c6079af3da60cc37527dbb80d36ec98842b1e"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bc4ae264aa679aacf964abf3ea88e147eb4a22aea6af8c6d03ebdebd64cfd6"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:827b5a97673b9997067fde383a7f7dc67342403093b94ea3c24ae0f4f1fec649"}, + {file = "xattr-0.10.1.tar.gz", hash = "sha256:c12e7d81ffaa0605b3ac8c22c2994a8e18a9cf1c59287a1b7722a2289c952ec5"}, +] + +[package.dependencies] +cffi = ">=1.0" + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.8,<3.11" +content-hash = "d814efcfb5cbc47db937d7bc7b943fa761d624aec7b242156da157d519f2a0f3" diff --git a/pyfixest/utils.py b/pyfixest/utils.py index f4b9cbf2..9e43831f 100644 --- a/pyfixest/utils.py +++ b/pyfixest/utils.py @@ -39,6 +39,8 @@ def get_data(seed = 1234): data['Y'][0] = np.nan data['X1'][1] = np.nan + + data["Z1"] = data["X1"] + np.random.normal(0, 1, data.shape[0]) #data['X2'][2] = np.nan diff --git a/pyproject.toml b/pyproject.toml index b937fe86..9ee9c9ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pyfixest" -version = "0.4.1.9" +version = "0.5" description = "Experimental draft package for high dimensional fixed effect estimation" authors = ["Alexander Fischer "] license = "MIT" diff --git a/readme.md b/readme.md index 1a4cd817..701b66ca 100644 --- a/readme.md +++ b/readme.md @@ -20,40 +20,81 @@ from pyfixest.utils import get_data data = get_data() fixest = pf.Fixest(data = data) +# OLS Estimation fixest.feols("Y~X1 | csw0(X2, X3)", vcov = {'CRV1':'group_id'}) fixest.summary() # ### # +# Model: OLS +# Dep. var.: Y +# Inference: {'CRV1': 'group_id'} +# Observations: 1998 +# +# Estimate Std. Error t value Pr(>|t|) +# Intercept -3.941395 0.221365 -17.804976 2.442491e-15 +# X1 -0.273096 0.165154 -1.653580 1.112355e-01 # --- # ### # +# Model: OLS # Dep. var.: Y +# Fixed effects: X2 # Inference: {'CRV1': 'group_id'} -# Observations: 998 +# Observations: 1998 # -# Estimate Std. Error t value Pr(>|t|) -# Intercept 6.648203 0.220649 30.130262 0.00000 -# X1 -0.141200 0.211081 -0.668937 0.50369 +# Estimate Std. Error t value Pr(>|t|) +# X1 -0.260472 0.163874 -1.589472 0.125042 # --- # ### # -# Fixed effects: X2 +# Model: OLS # Dep. var.: Y +# Fixed effects: X2+X3 # Inference: {'CRV1': 'group_id'} -# Observations: 998 +# Observations: 1998 # -# Estimate Std. Error t value Pr(>|t|) -# X1 -0.142274 0.210556 -0.675707 0.499383 +# Estimate Std. Error t value Pr(>|t|) +# X1 0.03975 0.107003 0.371481 0.713538 # --- + + +# IV Estimation +fixest = pf.Fixest(data = data) +fixest.feols("Y~X1 | csw0(X2, X3) | X1 ~ Z1", vcov = {'CRV1':'group_id'}) +fixest.summary() # ### # -# Fixed effects: X2+X3 +# Model: IV +# Dep. var.: Y +# Inference: {'CRV1': 'group_id'} +# Observations: 1998 +# +# Estimate Std. Error t value Pr(>|t|) +# Intercept -3.941293 0.221354 -17.805377 2.442491e-15 +# X1 -0.265817 0.261940 -1.014803 3.203217e-01 +# --- +# ### +# +# Model: IV # Dep. var.: Y +# Fixed effects: X2 # Inference: {'CRV1': 'group_id'} -# Observations: 998 +# Observations: 1998 # # Estimate Std. Error t value Pr(>|t|) -# X1 -0.096317 0.204801 -0.470296 0.638247 +# X1 -0.259964 0.264817 -0.981674 0.336054 +# --- +# ### +# +# Model: IV +# Dep. var.: Y +# Fixed effects: X2+X3 +# Inference: {'CRV1': 'group_id'} +# Observations: 1998 +# +# Estimate Std. Error t value Pr(>|t|) +# X1 0.041142 0.201983 0.203688 0.840315 +# --- ``` diff --git a/tests/__pycache__/test_errors.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_errors.cpython-310-pytest-7.3.1.pyc index 316fd3ce9cafb452658e3078477f7a54f5d68612..0a80ddba835ae826af8e1d081cd26c9ef17fd7b7 100644 GIT binary patch delta 18 Ycmew-`A?EFpO=@50SE*(a(?9j05QV^mH+?% delta 18 Xcmew-`A?EFpO=@50R%R3e&qoGF>?fl diff --git a/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_vs_fixest.cpython-310-pytest-7.3.1.pyc index 95b826fc06f58ece2527ffa14b75aec632683e91..c832b2ac71c157b1ca28500462097e3c296725b1 100644 GIT binary patch delta 33 ncmaE0zsH_8pO=@50SJ;_#;2^@$lD^y$TE47sN3d0qE9#ht&Ix* delta 49 zcmdmE|G=I%pO=@50SJ_z$EU2=$lD^y$U1qFs2jghq(YrSgrS1Ag0n`1iRR|RqCYtS DRd5aV