From 775c1989912c71c93e521f9f7970d75f106193d7 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Sun, 4 Jun 2023 16:26:04 +0200 Subject: [PATCH 01/13] some tweaks to demean --- pyfixest/demean.py | 152 ++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 77 deletions(-) diff --git a/pyfixest/demean.py b/pyfixest/demean.py index c81335d1..ee35c019 100644 --- a/pyfixest/demean.py +++ b/pyfixest/demean.py @@ -1,56 +1,113 @@ import numpy as np import scipy.sparse as sp -from numba import njit, prange +from numba import njit, prange, types, typed, float64, int64 from formulaic import model_matrix +#@njit(float64[:](float64[:], int64[:], float64[:])) +@njit +def _ave3(x, f, w): + + N = len(x) + + #wx_dict = {} + #w_dict = {} + + wx_dict = typed.Dict.empty(key_type=types.int64, value_type=types.float64) + w_dict = typed.Dict.empty(key_type=types.int64, value_type=types.float64) + + # Compute weighted sums using a dictionary + for i in range(N): + j = f[i] + if j in wx_dict: + wx_dict[j] += w[i] * x[i] + else: + wx_dict[j] = w[i] * x[i] + if j in w_dict: + w_dict[j] += w[i] + else: + w_dict[j] = w[i] -@njit(parallel = True, cache = False, fastmath = False) -def demean(cx, flist, weights, tol = 1e-08, maxiter = 2000): + wxw_vec = np.zeros_like(f, dtype=x.dtype) + + for i in range(N): + j = f[i] + wxw_vec[i] = wx_dict[j] / w_dict[j] + + return wxw_vec + + +#@njit(float64[:,:](float64[:,:], int64[:,:], float64[:,:], float64, int64)) +@njit(parallel = True) +def demean(cx, fmat, weights, tol = 1e-08, maxiter = 2000): ''' - Demean a Matrix cx by fixed effects in flist. + Demean a Matrix cx by fixed effects in fmat. The fixed effects are weighted by weights. Convervence tolerance is set to 1e-08 for the sum of absolute differences. Args: - cx: Matrix to be demeaned - flist: Matrix of fixed effects + x: Matrix to be demeaned + fmat: Matrix of fixed effects weights: Weights for fixed effects tol: Convergence tolerance. 1e-08 by default. Returns res: Demeaned matrix of dimension cx.shape ''' - N = cx.shape[0] - fixef_vars = flist.shape[1] - K = cx.shape[1] - res = np.zeros((N,K)) + #cx = x.copy() + fixef_vars = fmat.shape[1] + K = cx.shape[1] + + res = np.zeros_like(cx) for k in prange(K): cxk = cx[:,k].copy() oldxk = cxk - 1 - converged = False - for _ in range(maxiter): + # initiate + weighted_ave = np.empty_like(cxk) + fvec = np.empty_like(cxk) - oldxk = cxk.copy() + for _ in range(maxiter): for i in range(fixef_vars): - fmat = flist[:,i] - weighted_ave = _ave3(cxk, fmat, weights) - cxk = cxk - weighted_ave + fvec = fmat[:,i] + weighted_ave[:] = _ave3(cxk, fvec, weights) + cxk -= weighted_ave - if np.sum(np.abs(cxk - oldxk)) < tol: - converged = True + if (np.abs(cxk - oldxk)).max() < tol: break + oldxk = cxk.copy() + + res[:,k] = cxk return res +@njit +def _ave2(x, f, w): + + N = len(x) + weighted_ave = np.zeros(N) + uvals = _unique2(f) + + for j in uvals: + selector = f == j + cxkj = x[selector] + wj = w[selector] + wsum = np.zeros(1) + wx = np.zeros(1) + for l in range(len(cxkj)): + wsum += wj[l] + wx += wj[l] * cxkj[l] + weighted_ave[selector] = wx / wsum + + return weighted_ave + @njit def _unique2(x): @@ -91,65 +148,6 @@ def _ave(x, f, w): return wxw_long -from numba import njit, prange -from numba.typed import Dict - -@njit -def _ave3(x, f, w): - - N = len(x) - - wx_dict = {} - w_dict = {} - - # Compute weighted sums using a dictionary - for i in range(N): - j = f[i] - if j in wx_dict: - wx_dict[j] += w[i] * x[i] - else: - wx_dict[j] = w[i] * x[i] - - if j in w_dict: - w_dict[j] += w[i] - else: - w_dict[j] = w[i] - - # Convert the dictionaries to arrays - wx = np.zeros_like(f, dtype=x.dtype) - w = np.zeros_like(f, dtype=w.dtype) - - for i in range(N): - j = f[i] - wx[i] = wx_dict[j] - w[i] = w_dict[j] - - # Compute the average - wxw_long = wx / w - - return wxw_long - -@njit -def _ave2(x, f, w): - - N = len(x) - weighted_ave = np.zeros(N) - uvals = _unique2(f) - - for j in uvals: - selector = f == j - cxkj = x[selector] - wj = w[selector] - wsum = np.zeros(1) - wx = np.zeros(1) - for l in range(len(cxkj)): - wsum += wj[l] - wx += wj[l] * cxkj[l] - weighted_ave[selector] = wx / wsum - - return weighted_ave - - def getfe(uhat, fe_fml, data): ''' From b337b55a7b06b5f2a4b292ce2274ec6b0f489bac Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Fri, 14 Jul 2023 22:27:40 +0200 Subject: [PATCH 02/13] add wildboottest to test requirements --- .../__pycache__/FormulaParser.cpython-310.pyc | Bin 14525 -> 14525 bytes pyfixest/__pycache__/demean.cpython-310.pyc | Bin 3878 -> 3903 bytes pyfixest/__pycache__/feols.cpython-310.pyc | Bin 15434 -> 15434 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 31056 -> 31056 bytes pyfixest/__pycache__/utils.cpython-310.pyc | Bin 1211 -> 1211 bytes requirements_test.txt | 3 ++- .../test_demean.cpython-310-pytest-7.3.1.pyc | Bin 1605 -> 1605 bytes .../test_errors.cpython-310-pytest-7.3.1.pyc | Bin 3842 -> 3842 bytes ...est_vs_fixest.cpython-310-pytest-7.3.1.pyc | Bin 7120 -> 7120 bytes 9 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pyfixest/__pycache__/FormulaParser.cpython-310.pyc b/pyfixest/__pycache__/FormulaParser.cpython-310.pyc index 33d507f424c0cad166fadd61c03d2072d0019cc8..c141c45e2908bdda43f216d1d5a2a0073e234d51 100644 GIT binary patch delta 65 zcmdm6xVMlypO=@50SMN7s@ce`&B*Ay*_`o?He=Lg5#2wWj9HTf&6o52VvH_g1ga?# R1QNd{A2TllO4wR7004=#6Ttug delta 65 zcmdm6xVMlypO=@50SMT$@-}j7GcqP`HfOw}&3J3Gi0&Uw#_Y+0=F9nRF-8|L0@V}= Q0*PCbkC~SNC2TDk0A3&x=l}o! diff --git a/pyfixest/__pycache__/demean.cpython-310.pyc b/pyfixest/__pycache__/demean.cpython-310.pyc index 6a54703a4a345791fcaa158cea68a256502b9232..f8174e0a080fb34bee8971400c74ca76e875aeb5 100644 GIT binary patch delta 1886 zcmZuy&2Jk;6rY*>UauV|aYI5&C?7qnDwXv6L!m-yI8+FO1QODs%4|I2WSw1mGrNv$ zG?o!5>V;OIJ;1R&6sZResDD8J0wlQ3u^b>ruAF$YE@_Fn*1Y-6doyp|=lG}9C#$FX z)vAl&`|;;r=;k~^f2hTapAL)nU}WEYfBMuku>(7C0w-|;H>m^_j3}a7>?PHpiV-uZ zPL11W9|twSCbjNj+Mq72+{VD01D;2#rMwQfM(0XA54cX}OT0iA=;Cb@EK>Xl@{b)T zQ<}ah^#$j2$mW)qcGC+>&&r3=!CdNBD|dP$$MxRr!Ck49}xX?gZJ zFk3Kgz{vgrk|O~IPqZ9&NmtADt^vcO_%4~~M|mfKY2=pB_VEU~b!B1-EX)-&v4kb` zJ;W~-zgt(QO<@SjKr2WPCB2L^w2pR9%vMUKR=M4E;56#Glz>+IP;31Kt-7#43!GR% z$C0pw2`58gLu9n3Po%xW#w`^I>F$N`fR)&vVrfvt^(#_~S&tjwrPMc~b}kK;r1_Yu zq;eGnZYr5E3o7ZQ(*2V0e%6Yk9mXpl^Bsvt5_cpXO56;r;iyGHQD6?sS>j0Iu3`^c zd#wEk@nrAa423z6BkYx!hsW&L*(VA(95%HlPX}N z#LJVKz|Zv5l%9zPNpyrK$i5~jAo&okSVzFBT!9OAFM~oGR_-zwbl-V^gtmkDEsT0_ zVQGZBdlux@bK@Z2i^5X*4j&fB$r?$*qDhM4DS1;tOM5asz~Fn+ccqbShbiNASaRrO z#8uf#z1>g8(k=5oOREZ88EL77o0-&-aOBTP(jEnR2O36NLl$jq=OD@Zv9v%O<%|bz zCmOL%YcJ%P#2-kFL;vBOV5+r8JAu)U>1aoKv!jfvyi2_UB_VN(FR2@s56OzM%cLw} zVb2Ggy$!@&aIp)O09Aoq&BY$zI&NSWFA*Ii3mVkN8QA#0Zmy!@rt@&R3Vh$-9!#bG z(kRPV+O0t^+8wZSTsiGm`GVT9s7OPRV~U&xB8>rbP{vZGiw&D$OuWS&#a9d3#WunFN7^j?K6V zz{>)}*FccM$W%g2N5^&S;TrtNR}hJ{A~)}BJ$KmNjC$?2`Qjy|Kme4*Q`vUwdo%F`V!TKcTF6P2q+# zdV?e#&ob&|?I<0e$>3$k7++VrZUQOyY=)dDhAQ~k+om3h@@*?$Iq7uzJQ>7c)aJI5 zsCT9;CVo*N73z=pH3gLwFIZWIqpVkZ9sW`VF}tqXEmH+&BM+a1oDis1`wf`Sx|lRz J%tQ4y{snaZxHSL( delta 1823 zcmZuy&2QX96rUN7y|&}sY(gk0fi|?XVpa8nw)9I;MMYGpLad5fkQ#(mj%PM;;`MIE z-s}dvTBHPV>H+!0iG~BBTzlYD^}paSS2$1(`~e&)-kWWq6vmq8-@Nzcy|?ef`{>a3 zhfZ{>RiD7}9)2!&pgQPug-lwVFjw*L_VtFP-Cn4|B$0`> zqcB>R+HHqf4hrk#VQXPL1BP7K@4?P~22zj>BIrRfvI`1`0dfovQ6;DMSYa2HHruBo zH@Aw)E?p*{Hb-6o84=c(tnk{Pd5`atkze?N&6ClT;G-b73vP5zkE(@l)IbdljHYv^@Qdk!?OLNcpgI`xx2`|{7=#O)sd=(b_i15m64es+D4-;zTW3Jx z{u9a)*?P5bA!$zd10}>?gtaU?GE5i4#Sg-AiN9_oaaMl9OB$7b@FV6lYd^ZFK%G2B z(!74V;b}Wt4|`Ixw5RRQr0QnM0-5Gfx3{BhQvhwZ!fkm@TUo!Ot#CDK%xD%3wcSP+ zi_ZKHFGJ65gBIiiVro?j{0WUeryurCO6h)0U>O=545$4hAw_ zThFCHH}{Ep69V}2d{q9(&R=na`BhlU>@6Vvv`>9nV}UitT*_HMT^6u94S+k(IOUW* zndO|R;|~tIhpEt3B2x%j2Kg!7(>C%Deu;#~08b)qFXQ@(7FdY~id|V4J4@ z6+jMcze`6}Ohz2GokLfdzPtp@PYVZIzo-;^o2X-DN-vME;t<&6ASoD1FA|GDrv;M} z%J7u44GV6Q4KC|r}-Am$J@$$FonG4!!%T~LSsAUwYLC1y7TyYybcN diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index fc70776a09c6c5dcf10d61cca9bb2dcbebd14047..7dced1b5e884b2773065c42f6ff9d35d50b5e643 100644 GIT binary patch delta 20 acmX?AajJqlpO=@50SIQS-MEq4-Ua|iLIzL( delta 20 acmX?AajJqlpO=@50SNl8WpCuRw*de~lm;mP diff --git a/pyfixest/__pycache__/fixest.cpython-310.pyc b/pyfixest/__pycache__/fixest.cpython-310.pyc index 8714087acb2e297d5b179a55f5b28c922b538584..9e12c067925818b60c0961813a80bbe2c9f109b0 100644 GIT binary patch delta 2635 zcma);Yj9IV6vx>-ZWBtOmA);IA|ff)mUcR#0uDt`huVUaSnfd6G`Yb{Z*s%trj%+6 zKCps{!m6VPMRat0f#StCA`e9!6)K;c>tj?vM#pi44?0ty=f45e3?J-=U(cR%_U!IC zXZL34G#fh2a*e#akt68uksZ5sE83n^eausi}%1WlYSwP%aaW(4|n<|pb z5YBN^S)WxijyZGB#o;aDDqpoffQ3BKxE_qe!X{sgWo`l10G9%*fj+U(H(gl-F)5Dt zN{VlVxDqHPsIHi9g!vNjyYE(I09r%zS5{3C1BAOnIa@sUs0pkNud!lKbv~gV( zhbwERm@uRXHd9qk*wEz}Rd4TEk>3lC`^4ml#}vfn1J;;}Qe%8~k?gOubGVk&Lt%|e z+eA2w0v3rU>KYc`4KWTZB&fM(PaKSOtGV4FE{{(G-U^?Yzxn$PK>@I=P=&kZuR=AlOP&F2D`zm-;xnWPPVSHxJE=yhIJAN4cZzHWrfXx#LV&W_xV$n}5*2&;WoxwCjJ zWhu!#2pumji$ya>n+ zjzN;gMoXz;X=5czSpAKUvN8eFGlXXue;NNWdE>i9?KMs8Rnd3N=}FS(SvbB1ybg># zheAj@gqYhv?jO$mDPOuj2W`e(te#t-m4Y&c&0FWl$Vo zZ)RTUbr-R>tr^$taTdJ;&%MAtU_Y>1g+W{qx!{svfKw2W^H;pfn6J>~f zP|Dc{M1NDcvK!-r)?m{wj@UuS=UoVfcYy;0Y8JT&ipAdp4ngb9v{2SkAH)6$fT{e< za(}cOb1%R_Rd33qYeTmuOkw36`4oOKkupzc7d{Pu)juk$FYKI~L#dEya{ig94HVa% zYdlq1r12O%pA9t4X07}sOwX5_v{@sU%N!-0NCe8q>>`0*3_MM+#rD8hMRw9o@n)cV z;ajlmAv9+?*ROD?`Ve}w@>zXOGe1JZRz3t}YpdVK^WjqfTmaMqnz-$z($&2X?*#Br zWZnfABscH`unmwetpZ8r{S`=W0RQcJ+b!>-?Kaa%U9+9BgvmdE+hKz3>NE_Ue~Gc| zwXq{aY1{RaWX)w&&R6(M&8@X<3zZ9{9e0MyOYspT^jRzaK%8nnS|ST?kmCCYfvWi< zJoXAZIN_3vNaJSP$+bwYgKoG}I;dVfmY~;jm9CMmucJzl>o5vgQNX`Nh-1KU;H21= zQ=&ZRB=HBaxud)yKw8_;ld_fWke;Sudr6@>lgTL8#ZX6N%KteYrii7XaaG8vs)UV1 zG^n5XpUzyRGZ~|G3(1Ec5>JNiV~4D1oliPEwwn@NUuRoiMB16-uMyUa=%8!zujEHp zq8;wlfV?OwBza-~fb{34u5pdqAr%90U=46Pa0fxnlg~dsUHDLDzS3E{85F^;7B*2~Rub46|j!>`M9m zQ}GudwoJueBvHG_9m+hs57R6lYp+|y5%XfURqW3xw7lsu=Eqkw+i45wTCgMB7|%%B zkArU!dkRWLxcf9aAp$F}UfM>c4)}OT7)3rK;RUVV)!aN!UTJ?7kCK9)AlU9iI!?d4 zP)Suuh7yrbO5S93Bz^Uhx?$?EPVRvF&*Id|UDGv)UjttO-vEaI9F`9P>j0#WZw0Vz N-X`+eO2nz2;NSSAnS=lU delta 2674 zcma);Yiv|S6vsRJxZQ0jw$e9+wt$tb)B;T-z93XVklHGi(p;h2?LKhn-M#DV?Sm=> zv|vO)%U}%h5{<@36yZjEAr=LB7@*?&YN8Q@kQfsB!4LR6|G7N0iN^i#+cRg*oS8Xu z&dePcWCMdNUC+o!OQBzWJiar%(ZPadtK(o6Q_b>h7h{&F%xPn)*pyS@zLTs}aWtoZ zI?v>InQsm$crCQvC0*VAcpw%|^1IL;)@8T+K|QgA*O>)*Q`~Hxm|HZBb&B;x38o3> zsOwm_SviV1(=Yqsb>ild3g0|(VR<4k%^!*e4c>rhx`3s?1mGc{TlAGoQRYI7iQ^@C zxl14#KrX>@MKwLho5XJ=4=KISYNDsKyevkdnjX_bVa*@mv}hhj=Q^l8k#>!=G0hUk zN+*tg03DoQF;(>hbxrP3^>$wp`D$1^F3QH7RN$BQnpcfYURCl4$-Yu6m4_2rAQggt!>Eo1ms&+Oa>{p{92PxZFN9_`R^X6?l|jW%@&0PxzD3_#!QA z={z7kd`YR z?lS0Tj4<~(Nq1_U_CxJ-ze5iFJl|Uo73kkXd-R5v!bHHmo?O*JZib~zqy6K*MQf79l#ra z%-}_k8TTHyYmc1>O-aa@^+Pn2)DyRFnDP8Rsgb`76-=t2x%U%Rv@<#HpFr(YVYzzO~1_`k&*lrM>pJ{8?k! z2j(ra_BeC)VN5^pA@C8fTV&K07t6DiN8JJ?Hpu1j9)r{*=G2bP>4zv?Tp7Jz^wbtA zyU}yN+*s@ieWYOG@rxo7r>XmSHRc6H^4678sJ5ODz-O{P-MdG5brj2 z-19zq_7dvs1otUisy>09{Y{@*$3LZJ13v*}LxZn`XTl~6xEiPeLSn`I{AHaGR{*$A z?CZk?$qj4=wgSC?0?5O73(|YQKa0b1%d)lHMtedFTh3_Q;74FKK(Jh`x~}o>(H>z# zXH2(i=4?e_#z^HP>R8@j{ zJmS|b{+=qe>ZU+fO;*kCLe0#P!pvJDTU})r$QRW~ zGyU-jKvs_mNmlV6kp5iXHmc@XNV&jbU@5Q+SWZwgZ8YT_z{47g5r>dj9w)c>XmGjnADnWZr3m1J7)6(qi4&Un*#d{ z1bPvo94}gU=SoH4_LcK6Dfk(J<&L+<=<^IG zX(@?7JQPUEO19GI;~=5wh8At*4ww&$^PM}VgdqM1`~aK;aCLHQmT!Ty3PAYyW&q3P N^F>Beo;cs-{|n9yogn}K diff --git a/pyfixest/__pycache__/utils.cpython-310.pyc b/pyfixest/__pycache__/utils.cpython-310.pyc index f13d3d69631efecfee8023414b00d809546ec266..f69f22667070f286d39af289bafb195cebc2241e 100644 GIT binary patch delta 109 zcmdnZxto(apO=@50SH!ns@cdb!_0VVvIcV-qvYiE%=+xQK=EJ3&Xb=q*V*U;*_w<+ sOdyK&7HeK`7AO3IT;ts diff --git a/requirements_test.txt b/requirements_test.txt index e2e412fb..01b76113 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -1 +1,2 @@ -rpy2>=3.5.3 \ No newline at end of file +rpy2>=3.5.3 +wildboottest \ No newline at end of file diff --git a/tests/__pycache__/test_demean.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_demean.cpython-310-pytest-7.3.1.pyc index bed5fc634f7bf7991fb98b7b0377a06f3aa405e4..3045172104ef67f1dbf436910bedf82c200441eb 100644 GIT binary patch delta 20 acmX@gbCicWpO=@50SMN7s@ceG#RdR4H3e4y delta 20 acmX@gbCicWpO=@50SKy8syA|5u>k-v{sdM4 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 e194927b0f96005c018510ba840a8a384da8fd01..8bb603fbaa16a58e5e11611c3e7f5987f1682dc5 100644 GIT binary patch delta 20 acmZpYYm(#6=jG*M0D?82YBq9z=K}yTO$E9D delta 20 acmZpYYm(#6=jG*M0D?;{RU5g#^8o-aIR!8P 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 6a32b49084fd8d11e486de1698262e180b7654a3..94c8dd791da57b6dc7c2feb6e139905649aacf52 100644 GIT binary patch delta 59 zcmca$e!-kOpO=@50SH!ns@cf>SduYn@_WhkjJGDwm(l`~r=(;AZt)fsR2u0O-+mSns&`Mu Date: Sun, 16 Jul 2023 17:32:35 +0200 Subject: [PATCH 03/13] finish initial refactoring of estimation in feols --- pyfixest/__pycache__/feols.cpython-310.pyc | Bin 15434 -> 15421 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 31056 -> 32251 bytes pyfixest/feols.py | 2 +- pyfixest/fixest.py | 755 +++++++++--------- .../test_ses.cpython-310-pytest-7.3.1.pyc | Bin 2711 -> 2719 bytes tests/test_ses.py | 6 +- 6 files changed, 386 insertions(+), 377 deletions(-) diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index 7dced1b5e884b2773065c42f6ff9d35d50b5e643..ba49ef37c92d398ec1c271948e403dbe67080add 100644 GIT binary patch delta 582 zcmYL_%WD%s9LIOEk0iULDAv^A4d@>J$W$gL}-nTOtxC(H}oJ< z5LPjBFhZ-lzV#;SRSzD$2p$CY>>uDk@BU`9&>80Q`|^7;-_}2`+a23B6+8|56P^5M zKdzH`@w~owgPWkNXrUe{+(KpWlAjL?ei6)jBqH3VD%fC#Ca4jaQ>exr$WeVwVGF(m zC9p8+0D(L;0)xBYu9U!_`G61wwGBEgWZD6Z76&?XBPES{v}RIEI%$b}t7mb6A$;XA zh3EWXadoP)F#-nYP=F$J0xd173>sZg`4CAMw&fwRv^Ae{KNpY#uy0+T9(dxz@8utk? z;=>1m9C;|d9Q;*(kY=1~`ppXrQxa{l(`mCn7C(~c_2#Pa_d_Ep>5Jb-zD_?w=X=6V z%GjtxRU$(CAt+v;xVvARnyHGPm0|I3=JND5x)O~pFZryW%Jy>CPqgc;JKe;%)oib| zy6mNB&yJH<@#bu#?c2gEb`&vxv5{x8oV}KKBk@+^okTyrbnJG{O5+pK@kIPMzD+j8 H%@fIgv9g^~ delta 592 zcmYL_O>5LZ7{@bt-Ay(-Y1P)&s$HwlQWUiZMMadVM^7Gl5X!o#>HnS0%i6&jpT2^eM@=!UlB1&;txZpk{36VZCzy~+>z(~kBjhV6vI&#T6m!nnd)#9xBqUG(kbgClS7Gc(yrL-1ZMRdQzDYToN)_MLir zt=Zx4qveH3@*%yykeIW5WpWB}?dqJv)ph<+;giB=g>8jix_J7o?&bX{RoIMvp6Qdv IQR8g(58A1sU;qFB diff --git a/pyfixest/__pycache__/fixest.cpython-310.pyc b/pyfixest/__pycache__/fixest.cpython-310.pyc index 9e12c067925818b60c0961813a80bbe2c9f109b0..8e6bf99732cbaba32514b6737a4baa0ea7be6449 100644 GIT binary patch delta 10408 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 ZuIc(qx*mSXp0PXatL%Qe&rU_!{tL0Y None: ''' self.data = data - self.model_res = dict() - - def _clean_fe(self, data, fval): - - fval_list = fval.split("+") - - # find interacted fixed effects via "^" - interacted_fes = [x for x in fval_list if len(x.split('^')) > 1] - - varying_slopes = [x for x in fval_list if len(x.split('/')) > 1] - - for x in interacted_fes: - vars = x.split("^") - data[x] = data[vars].apply(lambda x: '^'.join( - x.dropna().astype(str)) if x.notna().all() else np.nan, axis=1) - - fe = data[fval_list] - # all fes to factors / categories - - if varying_slopes != []: - - for x in varying_slopes: - mm_vs = model_matrix("-1 + " + x, data) - - fe = pd.concat([fe, mm_vs], axis = 1) - - fe_na = fe.isna().any(axis=1) - fe = fe.apply(lambda x: pd.factorize(x)[0]) - fe = fe.to_numpy() - - return fe, fe_na - - def _demean_model(self, data: pd.DataFrame, fval: str, ivars: List[str], drop_ref: str) -> None: - ''' - Demean all regressions for a specification of fixed effects. - - Args: - data: The input pd.DataFrame for the object. Either self.data or a subset thereof (for split sample estimation). - fval: A specification of fixed effects. A string indicating the fixed effects to be demeaned, - such as "X4" or "X3 + X2". - ivars: A list of strings indicating the interacted variables via i(). - drop_ref: A string indicating the reference category for the interacted variables. The reference - category is dropped from the regression. - - Returns: - None - ''' - - YXZ_dict = dict() - na_dict = dict() - var_dict = dict() - - if fval != "0": - fe, fe_na = self._clean_fe(data, fval) - fe_na = list(fe_na[fe_na == True]) - else: - fe = None - 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 - # populated with "demeaned" data for some (or all) - # variables of the model. if demeaned variable for - # NA key already exists -> use it. else rerun demeaning - # algorithm - - 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'])] - for _, covar in enumerate(dict2fe.get(depvar)): - - covar2 = covar - depvar2 = depvar - - fml = depvar2 + " ~ " + covar2 - - if self.is_iv: - instruments2 = dict2fe_iv.get(depvar)[0] - endogvar_list = list(set(covar2.split("+")) - set(instruments2.split("+")))#[0] - instrument_list = list(set(instruments2.split("+")) - set(covar2.split("+")))#[0] - - fml2 = "+".join(instrument_list) + "+" + fml - - else: - fml2 = fml - - lhs, rhs = model_matrix(fml2, data) - - untransformed_depvar = _find_untransformed_depvar(depvar2) - - Y = lhs[[depvar]] - X = rhs - if self.is_iv: - I = lhs[instrument_list] - - # get NA index before converting Y to numpy array - na_index = list(set(data.index) - set(Y.index)) - - # drop variables before collecting variable names - if self.ivars is not None: - if drop_ref is not None: - X = X.drop(drop_ref, axis=1) - - y_names = list(Y.columns) - x_names = list(X.columns) - yxz_names = list(y_names) + list(x_names) - if self.is_iv: - iv_names = list(I.columns) - x_names_copy = x_names.copy() - x_names_copy = [x for x in x_names_copy if x not in endogvar_list] - z_names = x_names_copy + instrument_list - cols = yxz_names + iv_names - else: - iv_names = None - z_names = None - cols = yxz_names - - if self.ivars is not None: - 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() - X = X.to_numpy() - if self.is_iv: - I = I.to_numpy() - - if Y.shape[1] > 1: - raise ValueError( - "Dependent variable must be a single column. Please make sure that the dependent variable" + depvar2 + "is of a numeric type (int or float).") - - # variant 1: if there are fixed effects to be projected out - if fe is not None: - na_index = (na_index + fe_na) - fe2 = np.delete(fe, na_index, axis=0) - # drop intercept - intercept_index = x_names.index("Intercept") - X = np.delete(X, intercept_index, axis = 1) - x_names.remove("Intercept") - 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) - X = np.delete(X, fe_na, axis=0) - 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 - if lookup_demeaned_data.get(na_index_str) is not None: - # get data out of lookup table: list of [algo, data] - algorithm, YXZ_demeaned_old = lookup_demeaned_data.get( - na_index_str) - - # get not yet demeaned covariates - var_diff_names = list( - 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) - - 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) - - YXZ_demeaned.columns = list( - YXZ_demeaned_old.columns) + [var_diff_names] - - else: - # not data demeaned yet for NA combination - algorithm = pyhdfe.create( - ids=fe2, - residualize_method='map', - drop_singletons=self.drop_singletons, - ) - - if self.drop_singletons == True and algorithm.singletons != 0 and algorithm.singletons is not None: - print(algorithm.singletons, "columns are dropped due to singleton fixed effects.") - dropped_singleton_indices = ( - np.where(algorithm._singleton_indices))[0].tolist() - na_index += dropped_singleton_indices - - YXZ_demeaned = algorithm.residualize(YXZ) - YXZ_demeaned = pd.DataFrame(YXZ_demeaned) - - YXZ_demeaned.columns = cols - - lookup_demeaned_data[na_index_str] = [ - algorithm, YXZ_demeaned] - - else: - # if no fixed effects - 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) - - YXZ_demeaned.columns = cols - - YXZ_dict[fml] = YXZ_demeaned - na_dict[fml] = na_index - var_dict[fml] = dict({ - 'y_names': y_names, - 'x_names': x_names, - 'iv_names': iv_names, - 'z_names': z_names - }) - - - return YXZ_dict, na_dict, var_dict - - def _demean_all_models(self, fixef_keys, ivars, drop_ref, estimate_full_model, estimate_split_model): - - ''' - demean multiple models. essentially, the function loops - over all split var and fixed effects variables and demeans the - specified dependend variables and covariates - Args: - fixef_keys: fixed effect variables - ivars: interaction variables - drop_ref: drop reference category - estimate_full_model: boolean, whether to estimate the full model - estimate_split_model: boolean, whether to estimate the split model - ''' - - if estimate_full_model: - 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, yxz_name_dict= self._demean_model( - 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) - - 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, yxz_name_dict = self._demean_model( - 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) - - def _estimate_all_models(self, vcov): - - # estimate models based on demeaned model matrix and dependent variables - for _, fval in enumerate(self.fml_dict.keys()): - model_splits = self.demeaned_data_dict[fval] - for x, _ in enumerate(model_splits): - model_frames = model_splits[x] - for _, fml in enumerate(model_frames): - - # get the (demeaned) model frame. key is fml without fixed effects - model_frame = model_frames[fml] - - # update formula with fixed effect. fval is "0" for no fixed effect - if fval == "0": - fml2 = fml - else: - fml2 = fml + "|" + fval - - # formula log: add information on sample split - if self.splitvar is not None: - split_log = str(self.split_categories[x]) - full_fml = fml2 + "| split =" + split_log - else: - split_log = None - full_fml = fml2 - - name_dict = self.yxz_name_dict[fval][0][fml] - 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] - Z = model_frame[zvar_names] - - 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] - - # check for multicollinearity - _multicollinearity_checks(X, Z, self.ivars, fml2) - - FEOLS = Feols(Y, X, Z) - FEOLS.is_iv = self.is_iv - FEOLS.fml = fml2 - FEOLS.ssc_dict = self.ssc_dict - if self.is_iv: - FEOLS.get_fit(estimator = "2sls") - else: - FEOLS.get_fit(estimator = "ols") - FEOLS.na_index = self.dropped_data_dict[fval][x][fml] - FEOLS.data = self.data.iloc[~self.data.index.isin( - FEOLS.na_index), :] - FEOLS.N = N - FEOLS.k = k - if fval != "0": - FEOLS.has_fixef = True - FEOLS.fixef = fval - else: - FEOLS.has_fixef = False - - vcov_type = _get_vcov_type(vcov, fval) - - FEOLS.vcov_log = vcov_type - FEOLS.split_log = x - FEOLS.get_vcov(vcov=vcov_type) - FEOLS.get_inference() - FEOLS.coefnames = colnames - if self.icovars is not None: - FEOLS.icovars = self.icovars - self.model_res[full_fml] = FEOLS - + self.all_fitted_models = dict() def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc(), fixef_rm: str = "none") -> None: @@ -449,6 +97,7 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc self.fml = fml.replace(" ", "") self.split = None + self.method = "feols" # deparse formula, at least partially fxst_fml = FixestFormulaParser(fml) @@ -492,7 +141,7 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc # get all fixed effects combinations fixef_keys = list(self.var_dict.keys()) - ivars, drop_ref = _clean_ivars(self.ivars, self.data) + self.ivars, self.drop_ref = _clean_ivars(self.ivars, self.data) # dropped_data_dict and demeaned_data_dict are # dictionaries with keys for each fixed effects combination and @@ -514,10 +163,10 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc # currently no fsplit allowed fsplit = None - self.splitvar, _, estimate_split_model, estimate_full_model = _prepare_split_estimation(self.split, fsplit, self.data, self.var_dict) + self.splitvar, _, self.estimate_split_model, self.estimate_full_model = _prepare_split_estimation(self.split, fsplit, self.data, self.var_dict) # demean all models: based on fixed effects x split x missing value combinations - self._demean_all_models(fixef_keys, ivars, drop_ref, estimate_full_model, estimate_split_model) + self._estimate_all_models2(vcov, fixef_keys) # create self.is_fixef_multi flag self._is_multiple_estimation() @@ -525,12 +174,367 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc if self.is_fixef_multi and self.is_iv: raise ValueError("Multiple Estimations is currently not supported with IV. This is mostly due to insufficient testing and will be possible with the next release of PyFixest.") - # estimate all regression models based on demeaned data - self._estimate_all_models(vcov = vcov) - return self + def _clean_fe(self, data, fval): + + ''' + Function that transform and cleans fixed effects. + ''' + + fval_list = fval.split("+") + + # find interacted fixed effects via "^" + interacted_fes = [x for x in fval_list if len(x.split('^')) > 1] + + varying_slopes = [x for x in fval_list if len(x.split('/')) > 1] + + for x in interacted_fes: + vars = x.split("^") + data[x] = data[vars].apply(lambda x: '^'.join( + x.dropna().astype(str)) if x.notna().all() else np.nan, axis=1) + + fe = data[fval_list] + # all fes to factors / categories + + if varying_slopes != []: + + for x in varying_slopes: + mm_vs = model_matrix("-1 + " + x, data) + + fe = pd.concat([fe, mm_vs], axis = 1) + + fe_na = fe.isna().any(axis=1) + fe = fe.apply(lambda x: pd.factorize(x)[0]) + fe = fe.to_numpy() + + return fe, fe_na + + + def _model_matrix_fixest(self, depvar, covar, fval): + + ''' + Create model matrices for fixed effects estimation. Preprocesses the data and then calls + formulaic.model_matrix() to create the model matrices. + + Args: + depvar: dependent variable. string. E.g. "Y" + covar: covariates. string. E.g. "X1 + X2" + fval: fixed effects. string. E.g. "fe1 + fe2". "0" if no fixed effects. + Returns: + Y: a pd.DataFrame of the dependent variable. + X: a pd.DataFrame of the covariates + I: a pd.DataFrame of the Instruments. None if no IV. + fe: a pd.DataFrame of the fixed effects. None if no fixed effects specified. + na_index: a np.array with indices of dropped columns. + fe_na: a np.array with indices of dropped columns due to fixed effect singletons / NaNs in the fixed effects + na_index_str: na_index, but as a comma separated string. Used for caching of demeaned variables + z_names: names of all covariates, minus the endogeneous variables, plus the instruments. None if no IV. + ''' + + depvar_list = depvar.split("+") + covar_list = covar.split("+") + fval_list = fval.split("+") + + if fval != "0": + fe, fe_na = self._clean_fe(self.data, fval) + fe_na = list(fe_na[fe_na == True]) + fe = pd.DataFrame(fe) + else: + fe = None + fe_na = None + + + #dict2fe = self.fml_dict2.get(fval) + + if self.is_iv: + dict2fe_iv = self.fml_dict2_iv.get(fval) + + covar2 = covar + depvar2 = depvar + + fml = depvar2 + " ~ " + covar2 + + if self.is_iv: + instruments2 = dict2fe_iv.get(depvar)[0] + endogvar_list = list(set(covar2.split("+")) - set(instruments2.split("+")))#[0] + instrument_list = list(set(instruments2.split("+")) - set(covar2.split("+")))#[0] + + fml2 = "+".join(instrument_list) + "+" + fml + + else: + fml2 = fml + + lhs, rhs = model_matrix(fml2, self.data) + + Y = lhs[[depvar]] + X = pd.DataFrame(rhs) + if self.is_iv: + I = lhs[instrument_list] + I = pd.DataFrame(I) + else: + I = None + + # get NA index before converting Y to numpy array + na_index = list(set(self.data.index) - set(Y.index)) + + # drop variables before collecting variable names + if self.ivars is not None: + if self.drop_ref is not None: + X = X.drop(self.drop_ref, axis=1) + + y_names = list(Y.columns) + x_names = list(X.columns) + yxz_names = list(y_names) + list(x_names) + if self.is_iv: + iv_names = list(I.columns) + x_names_copy = x_names.copy() + x_names_copy = [x for x in x_names_copy if x not in endogvar_list] + z_names = x_names_copy + instrument_list + cols = yxz_names + iv_names + else: + iv_names = None + z_names = None + cols = yxz_names + + if self.ivars is not None: + self.icovars = [s for s in x_names if s.startswith( + self.ivars[0]) and s.endswith(self.ivars[1])] + else: + self.icovars = None + + if Y.shape[1] > 1: + raise ValueError( + "Dependent variable must be a single column. Please make sure that the dependent variable" + depvar2 + "is of a numeric type (int or float)." + ) + + if fe is not None: + na_index = (na_index + fe_na) + fe = fe.drop(na_index, axis=0) + # drop intercept + intercept_index = x_names.index("Intercept") + X = X.drop('Intercept', axis = 1) + x_names.remove("Intercept") + yxz_names.remove("Intercept") + if self.is_iv: + z_names.remove("Intercept") + cols.remove("Intercept") + + # check if variables have already been demeaned + Y = Y.drop(fe_na, axis=0) + X = X.drop(fe_na, axis=0) + if self.is_iv: + I = I.drop(fe_na, axis=0) + + na_index_str = ','.join(str(x) for x in na_index) + + return Y, X, I, fe, na_index, fe_na, na_index_str, z_names + + + def _demean_model2(self, Y, X, I, fe, lookup_demeaned_data, na_index_str): + + ''' + Demeans a single regression model. If the model has fixed effects, the fixed effects are demeaned using the PyHDFE package. + Prior to demeaning, the function checks if some of the variables have already been demeaned and uses values from the cache + `lookup_demeaned_data` if possible. If the model has no fixed effects, the function does not demean the data. + + Args: + Y: a pd.DataFrame of the dependent variable. + X: a pd.DataFrame of the covariates + I: a pd.DataFrame of the Instruments. None if no IV. + fe: a pd.DataFrame of the fixed effects. None if no fixed effects specified. + lookup_demeaned_data: a dictionary with keys for each fixed effects combination and potentially values of demeaned data.frames. + The function checks this dictionary to see if some of the variables have already been demeaned. + na_index_str: a string with indices of dropped columns. Used for caching of demeaned variables. + + Returns: + Yd: a pd.DataFrame of the demeaned dependent variable. + Xd: a pd.DataFrame of the demeaned covariates + Id: a pd.DataFrame of the demeaned Instruments. None if no IV. + ''' + + if I is not None: + YXZ = pd.concat([Y, X, I], axis = 1) + else: + YXZ = pd.concat([Y, X], axis = 1) + + yxz_names = YXZ.columns + YXZ = YXZ.to_numpy() + + if fe is not None: + + # 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, YXZ_demeaned_old = lookup_demeaned_data.get(na_index_str) + + # get not yet demeaned covariates + var_diff_names = list(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) + + 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) + + YXZ_demeaned.columns = list(YXZ_demeaned_old.columns) + [var_diff_names] + + else: + + # not data demeaned yet for NA combination + algorithm = pyhdfe.create( + ids=fe, + residualize_method='map', + drop_singletons=self.drop_singletons, + ) + + if self.drop_singletons == True and algorithm.singletons != 0 and algorithm.singletons is not None: + print(algorithm.singletons, "columns are dropped due to singleton fixed effects.") + dropped_singleton_indices = np.where(algorithm._singleton_indices)[0].tolist() + na_index += dropped_singleton_indices + + YXZ_demeaned = algorithm.residualize(YXZ) + YXZ_demeaned = pd.DataFrame(YXZ_demeaned) + + YXZ_demeaned.columns = yxz_names + + lookup_demeaned_data[na_index_str] = [algorithm, YXZ_demeaned] + + else: + # nothing to demean here + pass + + YXZ_demeaned = pd.DataFrame(YXZ) + YXZ_demeaned.columns = yxz_names + + # get demeaned Y, X, I (if no fixef, equal to Y, X, I) + Yd = YXZ_demeaned[Y.columns] + Xd = YXZ_demeaned[X.columns] + Id = None + if I is not None: + Id = YXZ_demeaned[I.columns] + + + return Yd, Xd, Id + + + + def _estimate_all_models2(self, vcov, fixef_keys): + + ''' + demean multiple models. essentially, the function loops + over all split var and fixed effects variables and demeans the + specified dependend variables and covariates + Args: + fixef_keys: fixed effect variables + ivars: interaction variables + drop_ref: drop reference category + estimate_full_model: boolean, whether to estimate the full model + estimate_split_model: boolean, whether to estimate the split model + ''' + + + if self.estimate_full_model: + + for _, fval in enumerate(fixef_keys): + + + data = self.data + dict2fe = self.fml_dict2.get(fval) + + # dictionary to cache demeaned data + # index: na_index_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'])] + for _, covar in enumerate(dict2fe.get(depvar)): + + if self.method == "feols": + + + + # get Y, X, Z, fe, NA indices for model + Y, X, I, fe, na_index, fe_na, na_index_str, z_names = self._model_matrix_fixest(depvar, covar, fval) + + y_names = Y.columns.tolist() + x_names = X.columns.tolist() + + fml = get_fml(y_names, x_names, fval) + + # demean Y, X, Z, if not already done in previous estimation + Yd, Xd, Id = self._demean_model2(Y, X, I, fe, lookup_demeaned_data, na_index_str) + if self.is_iv: + Zd = pd.concat([Xd, Id], axis = 1)[z_names] + else: + Zd = Xd + + Yd = Yd.to_numpy() + Xd = Xd.to_numpy() + Zd = Zd.to_numpy() + + # check for multicollinearity + _multicollinearity_checks(Xd, Zd, self.ivars, fml) + + # initiate OLS class + FEOLS = Feols(Y = Yd, X = Xd, Z = Zd) + + # estimation + if self.is_iv: + FEOLS.get_fit(estimator = "2sls") + FEOLS.is_iv = True + else: + FEOLS.get_fit(estimator = "ols") + FEOLS.is_iv = False + + # some bookkeeping + FEOLS.fml = fml + FEOLS.ssc_dict = self.ssc_dict + FEOLS.na_index = na_index + # data never makes it to Feols() class. needed for ex post + # clustered vcov estimation when clustervar not in model params + FEOLS.data = self.data.iloc[~self.data.index.isin(na_index)] + if fval != "0": + FEOLS.has_fixef = True + FEOLS.fixef = fval + else: + FEOLS.has_fixef = False + FEOLS.fixef = None + #FEOLS.split_log = x + + + # inference + vcov_type = _get_vcov_type(vcov, fval) + + FEOLS.vcov_log = vcov_type + FEOLS.get_vcov(vcov=vcov_type) + FEOLS.get_inference() + FEOLS.coefnames = x_names + if self.icovars is not None: + FEOLS.icovars = self.icovars + else: + FEOLS.icovars = None + + + #self.all_fitted_models[full_fml] = FEOLS + self.all_fitted_models[fml] = FEOLS + + elif self.method == "fepois": + + # estimation via FEPOIS + pass + + else: + + raise ValueError("Estimation method not supported. Please use 'feols' or 'fepois'.") + + + + def _is_multiple_estimation(self): ''' @@ -562,9 +566,9 @@ def vcov(self, vcov: Union[str, Dict[str, str]]) -> None: self.vcov_log = vcov - for model in list(self.model_res.keys()): + for model in list(self.all_fitted_models.keys()): - fxst = self.model_res[model] + fxst = self.all_fitted_models[model] fxst.vcov_log = vcov fxst.get_vcov(vcov=vcov) @@ -593,9 +597,9 @@ def tidy(self, type: Optional[str] = None) -> Union[pd.DataFrame, str]: ''' res = [] - for x in list(self.model_res.keys()): + for x in list(self.all_fitted_models.keys()): - fxst = self.model_res[x] + fxst = self.all_fitted_models[x] res.append( pd.DataFrame( @@ -626,7 +630,7 @@ def summary(self) -> None: None ''' - for x in list(self.model_res.keys()): + for x in list(self.all_fitted_models.keys()): split = x.split("|") if len(split) > 1: @@ -634,7 +638,7 @@ def summary(self) -> None: else: fe = None depvar = split[0].split("~")[0] - fxst = self.model_res[x] + fxst = self.all_fitted_models[x] df = pd.DataFrame( { '': fxst.coefnames, @@ -729,12 +733,6 @@ def iplot(self, alpha: float = 0.05, figsize: tuple = (10, 10), yintercept: Unio raise ValueError( "The estimated models did not have ivars / 'i()' model syntax. In consequence, the '.iplot()' method is not supported.") - ivars_keys = self.ivars.keys() - if ivars_keys is not None: - ref = list(ivars_keys)[0] - else: - ref = None - if "Intercept" in ivars: ivars.remove("Intercept") @@ -803,9 +801,9 @@ def wildboottest(self, B, param: Union[str, None] = None, weights_type: str = 'r res = [] - for x in list(self.model_res.keys()): + for x in list(self.all_fitted_models.keys()): - fxst = self.model_res[x] + fxst = self.all_fitted_models[x] if hasattr(fxst, 'clustervar'): cluster = fxst.clustervar @@ -1013,6 +1011,17 @@ def _prepare_split_estimation(split, fsplit, data, var_dict): return splitvar, splitvar_name, estimate_split_model, estimate_full_model + +def get_fml(y_names, x_names, fval): + + y_names = y_names[0] + fml = y_names + " ~ " + "+".join(x_names) + if fval != "0": + fml += " | " + fval + + return fml.replace(" ", "") + + def _multicollinearity_checks(X, Z, ivars, fml2): ''' diff --git a/tests/__pycache__/test_ses.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_ses.cpython-310-pytest-7.3.1.pyc index 59d6e041daf38dcafa33d264f67eed2500c5455f..f52e8f0e7deca122532770c54e0100807598b24b 100644 GIT binary patch delta 45 zcmbO(I$xAGpO=@50SIoq+MMFFkyn#hP%tqkCq6B+q$D*ZJ~uxlHD|Lua|Am8EVm8> delta 37 rcmbO)I$e}EpO=@50SMTSd!=Y? Date: Mon, 17 Jul 2023 17:23:07 +0200 Subject: [PATCH 04/13] add post estimation methods for OLS and fetch_model for Fixest --- docs/tutorial.md | 18 +++- pyfixest/__pycache__/feols.cpython-310.pyc | Bin 15421 -> 17257 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 32251 -> 32707 bytes pyfixest/feols.py | 79 ++++++++++++-- pyfixest/fixest.py | 102 ++++++++---------- .../test_ses.cpython-310-pytest-7.3.1.pyc | Bin 2719 -> 2747 bytes ...est_vs_fixest.cpython-310-pytest-7.3.1.pyc | Bin 7120 -> 7866 bytes ..._wildboottest.cpython-310-pytest-7.3.1.pyc | Bin 1038 -> 1071 bytes tests/test_ses.py | 4 +- tests/test_vs_fixest.py | 72 ++++++------- tests/test_wildboottest.py | 6 +- 11 files changed, 170 insertions(+), 111 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index 66ce9c47..e5966934 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -72,7 +72,8 @@ fixest.vcov({'CRV1':'group_id'}).summary() # --- ``` -It is also possible to run a wild (cluster) bootstrap after estimation (via the [wildboottest module](https://github.com/s3alfisc/wildboottest)): +It is also possible to run a wild (cluster) bootstrap after estimation (via the [wildboottest module](https://github.com/s3alfisc/wildboottest), only for Python +versions smaller than `3.11`): ```py fixest = Fixest(data = data) @@ -169,6 +170,21 @@ fixest.feols("Y~X1 | csw0(X3, X4)", vcov = "HC1").summary() ``` +You can access an individual model by its name - i.e. a formula - via the `all_fitted_models` attribure. + +```py +fixest.all_fitted_models["Y~X1"] +``` + +or equivalently via the `fetch_model` method: + +```py +fixest.fetch_method(0) +``` + +Here, `0` simply fetches the first model stored in the `all_fitted_models` dictionary, `1` the second etc. + + # TWFE Event Study Here, we follow an example from the [LOST](https://lost-stats.github.io/Model_Estimation/Research_Design/event_study.html) library of statistical techniques. diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index ba49ef37c92d398ec1c271948e403dbe67080add..ef28e908976be6abc451918a4f936b973445974b 100644 GIT binary patch delta 2580 zcmah~TWl0n7~V5GJ3HNO%aj&M+bxW8>-4fvDp(8j0;M7-qQzUIuH&BBGIhJVo|y{W zY~2tp!I+5gcqOQUE%Rp<6*;SJvC826|IjZ>JrgH<$HJ+68)xr{jK6x()OQ z=;A~G^zF18^j0d3`m|kcV8lo#EnN|v?ZS~Nl63Ob`vfxYd{;9=$W=bL>etqtb~kM} zO=cqYj$DMUIW5ez+FEY)X)^44YAf$odU;lfwY-+|P1NQ{gD>Zc)zkV>UukHK&fm&V z&>2|A1hUteZw?a@alUEk5Y&4iK(0(peLS7glT1U^AF~X$5hW?c<@H)~FqU~iPfi(3 z_NFtLgd5Nq)2ChM(E827ru)F`y}$-hszwMS)FQMYBsf<)$)NMCIxnlPRNOC*Q!fH& z8w#%uqhWww&^AgBp?H*E*B+4eqPU+|xA$&LfauC6be1wxPK}wn+wD1&~eAIs_I7enkj?BtboFkCQK=!AQTKqk1*i$T}>Z)zhX*ENm!@8}H zFn!WEpq?=8GBd` z@w(84JnkK%3AL?qf2~g)TKUz*k1}JN8J1tv_eyG`A+6P9?yfSTcRWV2kQhCIjB!W?B_HjC)p< zW8s+#g=4}Dn?RUE$ao7a!;YCLYMj&rwgxO?!J^A-EogZUStBkLapGs7Z{dt6i-JfB zf0@Wc{7<|Y3TH#!L5t$jB}IT+`zic`DT4{K1?^HRmk374p2F*5b@Ex!A!#{ zM7ESf3PCN$H=Z^U2{UdQsU<;v9lmgxuuJe@7Z8y0qAzR=)Enpuata4Zv~jm3v>&bH z&EAE@!1c*nbFHAdtjN@K!YjtI2mG%{eM6~^*&E31Jp?>G^?AWE7T~)#JZ@rEE`-!F zmN2^&u_taz%5L#u%r^kfox5|f#S>x z4>0MT2a@N(1o9@?i3;9G8`_wfP8ljSCyf+#Aw8+4GEwg~S!`0x(3(s-h3uCX0+wf8 ziM&SG7G&<#<~;%Lt%ee1Nh}qBXNR>-uoha$DtH_LbsSYPqOIqR(Xq!8xRH%84dD7A zfL_01FQe@u+Qetm=_Gpv^;Z!%f_IMb%(C|p<`BG#=mV5KzDoH^|O!(LV)png7_mMd%Xv&F+ip=kN~n2Jgc2stLOry8;l!LYn7a?Kt(|XP~+w zHRCqB?1@RZAzbk}W7=}1!u`M;obc<(B>0P$dc~GkQT6uS15!lbFZHNokMnWQ^J4x} zoVy#~*b%q_@I&kx!WRf%B3wtn&oaELVUf4{02&4nh7hn0*fxZH2+PhzKiGOOOS?b_ zDGFIlLPWyBFZQ;Re&_q%e~9XRJc6%(1mIR3o6Z>C^}`OLahSV(ZG>|F?lB3k6?UG- dcb}EeCDzaX*xfZe6$vjkMTT6GDMR&^(R2kA1?I41|S+x+1Q$Y~pv z7!PY&yKN5OEnThr>g_DFsg4Dh^Ay^P9(DTyKj$sT#cc~Pz#Wn4OMBR$I^FcUeWLDG zkvnZGf`cn^$EwxpaqjOcyR?a_Xt}v0#Pfyplu}4(%Pzu0ujZ%|0VJ*7)5QCR*wiIK zO)HbxX(dBsH2HjrG@vM>8K3Mn<<2RYvne8=%aF^RER`vQD6>iJmCw&xhM8LrCsF!Y za=|41B{f4-^Vh!-ykr`8=Mfheq#6$Y6>!Ns{nI)r|K2ab` zG}rAKd4vvwlF6{i@wfk%{}@fZNDou%tVrI)gv(+E5BS(JL#<9b7=Igq^k^TuXN+g= zVOl3cVpJ|C*pNIyJVmS^o*|YHcmpg*Z`_9t{a#|I1`w@?euRFaf5(b2-xko-NH0XR zjmQ>AdLs{p-eD+JBxZA|I3Za=_M$URjj5q X09au*aq<~C6X@Qmz&@a9c+6G9c6iPc&!O${kX=z~s!?aApOx*WYPVDBR zgFOD-``CT^_TBD#?>_p7JU2~(nX)odf!|^CadzuNj|QKmq%I)q#O>-P zvR=HdwvkQ|)|QbCVvV-8{tDZ$>uhg=)+!0gKE>MiYtbgA_9&5!g`2f@i#%93xcDz- z-5{9e*CFgiSb>m67!c2_Xd@}{;fibgdr>fgFeW^5SAe9Ly+rD0#)?(+fH9%AkFU*UtZlExCvxYEt$^5Vd=lG zj*=nK(bjg=S8-An!9keg39{P}a3;SV0sZ1*2rfbnp#ec4+<|as;Yizgo&{e6I->LY zP$c(UiBex&k(uI(Swfz;r?1OBrdpkK*RM{$)D$ugyn%7;=6d}qUpW{s#E@hOd6EyE*glYYBisYzEm}fWTZ7xlj zOlRH+(xVjKS$je)FYSQ9>ilYiDbd{Cw90>)+eOVuvXP>n+gS)}a*)}3<;0>M8yd0) z8SjO;;sZj;( zSlr-2J^W|i05~l)w&>_+A9Fo<55xl^kka`@OwV}-Df8yMj+YtZ5EFR%W}c?&9j8*_ zcQvG3m8rvocf*)~tIp`kz>+aT2Z8p@&@)zC9U?f7g(ir!I?v0>k=Wyvr@x}myl#Mm zqjb|XQFY7ao>6ttqD6cGIDcFmUcX`008pc9OG``S^a%6CpyIe!85F)0sR@MpM67dp zP##hYBYy-y+|}8O`Xk74LOcU4C>l*qPjGXPwsU@W4Qf zkHqn1pZp;WW@L~*2ms+Kd1Xprq*j5;Oh^A9CO3w~jtz$@i^lq_lN^XS_JgG4qAg~#l+}a(wX-*y%IX^b*vj=>0x`;O4#pYotX0g*x)}C?|r)QtX?em%)CThs?K%uZ+dbGXSv2){u1B?7*{qLIw@C5O@(Ct~s;lwOK} zS)df$?;|yZ@C}3p(bU~2+PlM{Um@F!fOhy{cnP&NPk`51JTiK~pp;OeO&coQBXN88 z=jLAs^3rR~6Yv$irkF^;Ypq~hwSf*EMoZ^%l|PSKTsGpF8pXY-c9pIB>lA4{$^;>hvC)Cn5D*15A-;QFZ_W~oz&9E%2I zD&mlF%6$%`-f@y64yJJpQx$L^b99%ElieQP2+4=IEzZN6)l18XQ@ zy1GmmGs=xc#$F?8>{&Q(VV$`s6bTt2f5^PpT)z0S`nuJ;3I=y_nJMHomX};!_u0%= z$`s;~?F&Qyh6{oPdz>(`TjS4*-P@OpJ-nUf%$(mPm`?K^23-pzQ$KVl0XM*OIQC_3 z8BpF@sM~o1E{4jCdZk90B4NN>@Z8#JB{vUd`f8PwFKzL&=2%Q0Ffxl{$KbG@v7 z0(zM}HLR*faY%|n|2KbvK%|YF&sA6hM0F*8)TXvYD*jypL)wk4(2{ReD3orB?q?WuOvPwRV*X}0>zd^vN z-ph}OZ|}U3@;Bi&R+EJIWW1wV-lnyneVYM5`TGEe9}>64o0gSG;JdJ`W}_5(NL3Dq z`qIfkD1aky^$&?xLk<51aqV9_kny;<%9BB~AzC5pQ2kg|MI>}PD-$4LcpY9iTRq_MrFO8XrY87xss z#WI^k^>}75(U+ci4#PJHWT;ixR$Kw@WvsyJfTk{89~4dKFn>_4gv2hcdC;h;YV6(9up z9~aQ4wP~&wjwSEcmYx7Dv^KIg>jIj~hG!5d`85ZZSm7S=*kFeING#609&%BYL)ePY zfIF$Z2gtwTVkQs;RGnZr?6(|W_A7^9EnT78y`XXZUoul4dZni2fSAeyF~&?vvRFnPli zY*t)2(n6LNc8v5B(ph+Zw2qK>#nGFhk!x|X0agO0hP9FM5NtN0b#--?%3d@75@`9m zBH^}@55=ACqwOga97XsW!rKV=8aZT7g}ys0EV>+F)ZN9x}AHQoOQbIi9t<%i^_X zufyWpWr@h2O0|L*NYen#8mTGIq;#v&7bzianxrb}LwR%?wWUp(M53)k)K)cB-E(F) z*d|c*PraJ&o;hdc%*;14=Zs&RCO2;qf86IY75MA%ev7^N>;?a2O3sMaXolP`M%0C5 zqd2T?AuZxX7wI$!gnD=5mq7WMu>^m zS2dG}@HIW)-HVDO!agzFROdYaVo2@Y72+xJWYc40JX^c^dCiq?Ca$eH(jc8xVvi<- zdk`K)kmEfLQqDaTw)+P6#Q0Hha_vrQ9CRTq5{nPO(EnZ=B5~2(-2B-?*oh+~5N6E; zt33$VllLMVK-iD)2!ex9i*Oi0ARNhFYcAIpei`JTi=RN1Tyqsla;{%R>1k29VJNMG zXhCU(l6V+kNJ&v!ag->@&`ISW*`)N=q*SasYL$}G9GX#WEu%ZCqeWd%+)xZC9w;Uw z$6b?Tk`QIoV{1{bLm6f21kG4XnzLvU8{@a$BbM=pm zgohdL!Zs0v3_#9!C~WuleWBmZ(L^|>+X)*)*NAj4`db!M=)4*me;pgEJe=U|SbauZ z>n>fX*%7v{l>%8yK&h3L5R+&`*#p-BX(4HT3gb# zo^d%k@TdciI`F7RO(j7QSA`eUM6xsK)8XAJd;#^yG^fH`N&~=h1I^IEslGz9yBGUNiAX$jly2w9?a~-O>Np` zxJZueHaO&$#OAFF zaM`!!l-&Ay!3Az4zpD$}n=5%2`?oD7m&M6#-GqsMZCkw{<#yl~#mL~ABoHaE=E}H% zP{TH|JGSR&It<;rg6^DaPn?Bg34R3!dja7^gdZVX1jreYL|a{Y6$UC^;6W7S$cN|{{>XL z_%Bh})fKE0mwVr>K3v9Z`l8X;qJQPHAm zb7f$4zzkRcYn`=xNlOjKPVHQt4|%@sbV%~&L*#lF1>T1p#e8rOqRnm%PNVhUJ?XPO zG-al|4#{Ya7lOa#SWK@{qI$~b_&|1{Y{Ru;kdB$VMyXULNf}_u|KIEtN~#EY8`wKz zz?BR*F6Mzm-0K(_4>K`gGcU8!k10-I6HEyjcpMX&n@+%i9K!spXhMU$GNUb$T1XeH zWWqJa;=iNC3!eN=zE|ml4m~th207|P!6#%cmY&DTnaV2UP`WgqE0}$b&SqQXL^6I> ziF41l$rK@HAJrh2RXJ`}Jpt)(w33x|DmIByc#zag5MbFzc^rk!hd?!p?ezbb?n8u^ z%_6*(S+n^DuG6=XE$ROl(Ng;{lHsv+M}lF{ZH_03^v>o_vJ19uu-)QzV}W|l46!q$ z&L-3*nc_(WUK}J-f?uRJxS+pW6|wE>MRR{k_R;>!v_@WmnWw_f@Tz41y7;T2pY5&8 zk;tt3C$HXSFh|4<)>*iU zV%)x17}_2V-%GBDOW{RRga;XSN^cpd7&Qc*lOZ~l`Y=4djJbII3W zg5&Egq>hXX^2f#YL6-hsZnx|*7#YgZ{$xIkehpOy8|;&LPe!YdYal*6*cU5&$0RMc zbAc(N6{eUt0D@Iw(k1ZFoTkK_4yYzI2_@A;o2C@ePYvB9eo}6V&Y|Gyw*o5-if!uQ z=Z8ls+Dfc)QclX?>4Q%tET}c$`NUtzo*(+NO3sU8yK4x^Uflh(w)CGcDr78~dpkhR z=P~*3O%qn95ftH!#DU}MBX7I%|B{HSqqPgZ0=9qP)J+f!c$yi+A{OPSAJ9Z^vNF4n z_p570&ZIouBvpgM7fsSb6;@G|9DX}YAo1Gr3rsSlkPS)zj!B#8Q zCu_*@?5^Y_B}7b(H;{GN<&O*zvMYPYsV3w-aW)kSM&M1AFrd9 f#rK97NZ&_3DNdv-ilW9mV~t@N^Nkv#-YWhN^$&^m diff --git a/pyfixest/feols.py b/pyfixest/feols.py index 84c3421c..bcb0955b 100644 --- a/pyfixest/feols.py +++ b/pyfixest/feols.py @@ -292,7 +292,7 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: data = self.data[~np.equal(ixg, group)] model = Fixest_(data) model.feols(self.fml, vcov = "iid") - beta_jack[ixg,:] = model.coef()["Estimate"].to_numpy() + beta_jack[ixg,:] = model.coef().to_numpy() # optional: beta_bar in MNW (2022) @@ -325,25 +325,25 @@ def get_inference(self, alpha = 0.95): ''' - self.se = ( + self._se = ( np.sqrt(np.diagonal(self.vcov)) ) - self.tstat = ( - self.beta_hat / self.se + self._tstat = ( + self.beta_hat / self._se ) if self.vcov_type in ["iid", "hetero"]: df = self.N - self.k else: df = self.G - 1 - self.pvalue = ( - 2*(1-t.cdf(np.abs(self.tstat), df)) + self._pvalue = ( + 2*(1-t.cdf(np.abs(self._tstat), df)) ) z = norm.ppf(1 - (alpha / 2)) self.conf_int = ( - np.array([z * self.se - self.beta_hat, z * self.se + self.beta_hat]) + np.array([z * self._se - self.beta_hat, z * self._se + self.beta_hat]) ) @@ -474,6 +474,68 @@ def get_performance(self): self.adj_r_squared = (self.N - 1) / (self.N - self.k) * self.r_squared + def tidy(self) -> pd.DataFrame: + + ''' + Return a tidy pd.DataFrame with the point estimates, standard errors, t statistics and p-values. + Returns: + tidy_df (pd.DataFrame): A tidy pd.DataFrame with the regression results. + ''' + + tidy_df = pd.DataFrame( + { + 'coefnames': self.coefnames, + 'Estimate': self.beta_hat, + 'Std. Error': self._se, + 't value': self._tstat, + 'Pr(>|t|)': self._pvalue, + 'confint_lower': self.conf_int[0], + 'confint_upper': self.conf_int[1] + } + ) + + return tidy_df.set_index("coefnames") + + def coef(self) -> pd.Series: + + ''' + Return a pd.Series with estimated regression coefficients. + ''' + return self.tidy()['Estimate'] + + def se(self) -> pd.Series: + ''' + Return a pd.Series with standard errors of the estimated regression model. + ''' + return self.tidy()['Std. Error'] + + def tstat(self) -> pd.Series: + ''' + Return a pd.Series with t-statistics of the estimated regression model. + ''' + return self.tidy()['t value'] + + def pvalue(self) -> pd.Series: + ''' + Return a pd.Series with p-values of the estimated regression model. + ''' + return self.tidy()['Pr(>|t|)'] + + def confint(self) -> pd.DataFrame: + + ''' + Return a pd.DataFrame with confidence intervals for the estimated regression model. + ''' + return self.tidy()[['confint_lower', 'confint_upper']] + + + def resid(self) -> np.ndarray: + ''' + Returns a one dimensional np.array with the residuals of the estimated regression model. + ''' + return self.u_hat + + def _check_vcov_input(vcov, data): @@ -572,3 +634,6 @@ def _feols_input_checks(Y, X, Z): raise ValueError("Z must be a 2D array") + + + diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index 44c5776f..8a2a30c9 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -600,21 +600,12 @@ def tidy(self, type: Optional[str] = None) -> Union[pd.DataFrame, str]: for x in list(self.all_fitted_models.keys()): fxst = self.all_fitted_models[x] + df = fxst.tidy().reset_index() + df["fml"] = fxst.fml + res.append(df) - res.append( - pd.DataFrame( - { - 'fml': x, - 'coefnames': fxst.coefnames, - 'Estimate': fxst.beta_hat, - 'Std. Error': fxst.se, - 't value': fxst.tstat, - 'Pr(>|t|)': fxst.pvalue - } - ) - ) - res = pd.concat(res, axis=0).set_index('fml') + res = pd.concat(res, axis=0).set_index(['fml', 'coefnames']) if type == "markdown": return res.to_markdown(floatfmt=".3f") else: @@ -639,22 +630,14 @@ def summary(self) -> None: fe = None depvar = split[0].split("~")[0] fxst = self.all_fitted_models[x] - df = pd.DataFrame( - { - '': fxst.coefnames, - 'Estimate': fxst.beta_hat, - 'Std. Error': fxst.se, - 't value': fxst.tstat, - 'Pr(>|t|)': fxst.pvalue - } - ) + + df = fxst.tidy() if fxst.is_iv: estimation_method = "IV" else: estimation_method = "OLS" - print('###') print('') print('Model: ', estimation_method) @@ -675,9 +658,7 @@ def coef(self) -> pd.DataFrame: Returns: A pd.DataFrame with coefficient names and Estimates. The key indicates which models the estimated statistic derives from. ''' - - df = self.tidy() - return df[['coefnames', 'Estimate']] + return self.tidy()["Estimate"] def se(self)-> pd.DataFrame: ''' @@ -687,9 +668,8 @@ def se(self)-> pd.DataFrame: A pd.DataFrame with coefficient names and standard error estimates. The key indicates which models the estimated statistic derives from. ''' + return self.tidy()["Std. Error"] - df = self.tidy() - return df[['coefnames', 'Std. Error']] def tstat(self)-> pd.DataFrame: ''' @@ -699,9 +679,7 @@ def tstat(self)-> pd.DataFrame: A pd.DataFrame with coefficient names and estimated t-statistics. The key indicates which models the estimated statistic derives from. ''' - - df = self.tidy() - return df[['coefnames', 't value']] + return self.tidy()["t value"] def pvalue(self) -> pd.DataFrame: ''' @@ -711,9 +689,7 @@ def pvalue(self) -> pd.DataFrame: A pd.DataFrame with coefficient names and p-values. The key indicates which models the estimated statistic derives from. ''' - - df = self.tidy() - return df[['coefnames', 'Pr(>|t|)']] + return self.tidy()["Pr(>|t|)"] def iplot(self, alpha: float = 0.05, figsize: tuple = (10, 10), yintercept: Union[int, str, None] = None, xintercept: Union[int, str, None] = None, rotate_xticks: int = 0) -> None: ''' @@ -736,10 +712,10 @@ def iplot(self, alpha: float = 0.05, figsize: tuple = (10, 10), yintercept: Unio if "Intercept" in ivars: ivars.remove("Intercept") - df = self.tidy() + df = self.tidy().reset_index() df = df[df.coefnames.isin(ivars)] - models = df.index.unique() + models = df.fml.unique() _coefplot( models=models, @@ -764,8 +740,8 @@ def coefplot(self, alpha: float = 0.05, figsize: tuple = (5, 2), yintercept: int None ''' - df = self.tidy() - models = df.index.unique() + df = self.tidy().reset_index() + models = df.fml.unique() _coefplot( models=models, @@ -832,13 +808,34 @@ def wildboottest(self, B, param: Union[str, None] = None, weights_type: str = 'r return res + def fetch_model(self, i: Union[int, str]): + + ''' + Utility method to fetch a model of class Feols from the Fixest class. + Args: + i (int or str): The index of the model to fetch. + Returns: + A Feols object. + ''' + + if isinstance(i, str): + i = int(i) + + keys = list(self.all_fitted_models.keys()) + if i >= len(keys): + raise IndexError(f"Index {i} is larger than the number of fitted models.") + key = keys[i] + print("Model: ", key) + model = self.all_fitted_models[key] + return model + def _coefplot(models: List, df: pd.DataFrame, figsize: Tuple[int, int], alpha: float, yintercept: Optional[int] = None, xintercept: Optional[int] = None, is_iplot: bool = False, rotate_xticks: float = 0) -> None: """ Plot model coefficients with confidence intervals. Args: - models (list): A list of fitted models. + models (list): A list of fitted models indices. figsize (tuple): The size of the figure. alpha (float): The significance level for the confidence intervals. yintercept (int or None): The value at which to draw a horizontal line on the plot. @@ -857,12 +854,12 @@ def _coefplot(models: List, df: pd.DataFrame, figsize: Tuple[int, int], alpha: f for x, model in enumerate(models): - df_model = df.xs(model) - coef = df_model["Estimate"].values + df_model = df.reset_index().set_index("fml").xs(model) + coef = df_model["Estimate"] conf_l = coef - \ - df_model["Std. Error"].values * norm.ppf(1 - alpha / 2) + df_model["Std. Error"] * norm.ppf(1 - alpha / 2) conf_u = coef + \ - df_model["Std. Error"].values * norm.ppf(1 - alpha / 2) + df_model["Std. Error"] * norm.ppf(1 - alpha / 2) coefnames = df_model["coefnames"].values.tolist() # could be moved out of the for loop, as the same ivars for all @@ -873,13 +870,6 @@ def _coefplot(models: List, df: pd.DataFrame, figsize: Tuple[int, int], alpha: f coefnames = [(i) for string in coefnames for i in re.findall( r'\[T\.([\d\.\-]+)\]', string)] - # in the future: add reference category - # if ref is not None: - # coef = np.append(coef, 0) - # conf_l = np.append(conf_l, 0) - # conf_u = np.append(conf_u, 0) - # coefnames = np.append(coefnames, ref) - ax[x].scatter(coefnames, coef, color="b", alpha=0.8) ax[x].scatter(coefnames, conf_u, color="b", alpha=0.8, marker="_", s=100) @@ -903,7 +893,8 @@ def _coefplot(models: List, df: pd.DataFrame, figsize: Tuple[int, int], alpha: f model = models[0] - df_model = df.xs(model) + df_model = df.reset_index().set_index("fml").xs(model) + coef = df_model["Estimate"].values conf_l = coef - df_model["Std. Error"].values * norm.ppf(1 - alpha / 2) conf_u = coef + df_model["Std. Error"].values * norm.ppf(1 - alpha / 2) @@ -914,15 +905,6 @@ def _coefplot(models: List, df: pd.DataFrame, figsize: Tuple[int, int], alpha: f coefnames = [(i) for string in coefnames for i in re.findall( r'\[T\.([\d\.\-]+)\]', string)] - # in the future: add reference category - # if ref is not None: - # coef = np.append(coef, 0) - # conf_l = np.append(conf_l, 0) - # conf_u = np.append(conf_u, 0) - # coefnames = np.append(coefnames, ref) - - # c = next(color) - ax.scatter(coefnames, coef, color="b", alpha=0.8) ax.scatter(coefnames, conf_u, color="b", alpha=0.8, marker="_", s=100) ax.scatter(coefnames, conf_l, color="b", alpha=0.8, marker="_", s=100) diff --git a/tests/__pycache__/test_ses.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_ses.cpython-310-pytest-7.3.1.pyc index f52e8f0e7deca122532770c54e0100807598b24b..5b4e863551355509012060de2acc7d38e7d3ffca 100644 GIT binary patch delta 230 zcmbO)x?7YtpO=@50SNB@*^(l+k#{OP#t}6wZZ= zwM-=pS&TIdDU7|0wahilSxhNhlfSXc+j1=6tYJ#wmSm`50g(%tirq@MQh1sfn;1(V za=c(UAPJNU0m|`#u(fQ6yG~L@12>Q-L~5|P~|lR3RHn&Dfp;V5eo9E7MhBkC2U*zxHHv4X0wSX z-$;n}4{-KRFpV+M1i$)-#!tqKiJ!s57!#r&gy=bU+I`eomH5G(%x}-!d*yQC9-+SOQx*tO#|u=E?`EdnnYaGQZtMmy=Np&Te>0+--< z;FV%m#IDj!unhEv$!*sx6OxF-n9LMKupk7mB(M~2$-X*Cd@a-i7|FGQ1dN-4c1uqX~o`w9gu%mI;QL;q=g0Ql;C99J++fGGez41O}n(MMgyoLlHa&Ay^#0Vh&H8I zf<@qBpJ^KJLz{O0xgB)7w)^8JV_&M9jzD;dVVEsuTib=-i0r^%Emahl$ z4KkP*JAP3pDn%8#Q{_Zx0GDQHl@o!|nkZ`3)-VmKBB9M@(yb$zKymeE6l5w$g&8*m zmf>f^2Dlpo;59HnOTOO}E2z?gnMs670RGVbHuRgAjrl&;f_$Xer$*nVMp!Ft0ys)- zKu4e!wzMFm0a%xk+kcOM6&Vw=`OB9J6NUVY@6lHDXag8_a#X{9)64ru3yXQrANRZo z+QKfF?WJyX+lA1Kum@o;K&0ho7Ov*$B|jgDe!;yKrDz@o7%$AY`9(f;BrnVq<`?pj zR%wrfMK4Oy#a_At2kJ$50^vyj$Bbhi06UWC_~on9bi;n^J%G@M(2sp&F(Tvf>K>XW zx{*f_Zh>Tp{Lq$jLJKlWEI}t(K_&Pk{4U<7rO{yOZ6u9;>k2n%-JcLA6zu z5B&p{(}4y&>VfWRz`Y3nI{Zt49NNHls=~MJ8pt;=&+9_b^fO@=?uH8UZ~BcT*W%Rn zyJ?`-riWpjXXz?(X$Dh}MaUr>L3kSB8H8sMI7`Uwu+zk8rO#nA*TW!MBEp|oEkPsF zN}oqKiZFzL5~43497A{sVJ+&cn7T9Ae;i>A-slPJ7)Id3ou!pjME+U{?t63MB2 zU@JKm+BtHTeP|DocY(Jf3M5#BV#BE1UHq4G=txnF` zd4b?~T2`$YH=tOv>h^f$=b$B$=dN+pu9*QgklmZaiZh>WBqQu*cFZ#1CA^U$&xYzV z5Ni_FH_*^s(qU&v-I73;+H&<7s_0UO>H`&M(g@Av>LWn)!B#5}KyO;0xdzvz=9 zRagwKMX_8ThexPNye3QD+;qXGo3TlZrCP04qxfE}q*0Sx(@5BL3v%n_H+2ncqWJGL z{yPF6LD%>VIz~+ID;OMC?fSy5(KPF5+SgMrX_d&o*=i1Uqc!W(g{4x{DFQpe|MxVr z{=wi8&M_au9$#~giH|X*>Vd%f0vy&m$9xC<|J^wzKE}L=C&Km5F*%ra{d3GV@Zjf| zbRSqX=NR@)?%+P$tgH3Bu4eJtj+*D&Gi^t!1EG^0Y2I1dhURtz2VmIA)Rc5yrgmaq zb<6I-$K43H%U5^scu%Nq!IhfEzg0(#g?|y>sntAuu=F4{K84WFK56c$J71x))m7)K zv88h@Q)D;pQuhRaVJAuPbC1Ny*}_beoX*ccJvh%>VAt=Z__;;wr`8rS$keutfZN-y zr1|RbeVPOqW$(2OwU3%~?pkjToqc^WKjC|kx?<5ijIT)=AamQN{{Ze##f<;} delta 2503 zcmb7FU2GIp6rMXfGdnXoGduf7ySv>&4HUK_e@6cQrGNq}NI|5O(sq`(w6x{U6pK!? z5g&{(B_uZ{#weM66MZs$Fd=GuR3C^wIuAbZLePX5jnRMx&zV`4-GU+PWWJm^=kC38 zzwf(eu5I~YoiU;7DhIz$es`^YWlOPSONA>|lPrz7ZC&CKCvNFX6S~CLATrpukb4uNIJ@1} z)qe>h^KEjGz+$GAs1d?FSawE$xW3?w2ywU+HzPUn8R96O>XI6U0mO4uaQTto@LjCoP3$sJ+N2~ULbhb z1P^(5hg=#e`{AJjU&AUK=8Bzf{KaOqE|!sgDf)7+?NrVVIpsU*VaHmrsF%_SdPhD; zmu+<&w|FP&EIL0lHdUUxC#@!=z*ftn{M7`zA{R&p`%+#4sT*>)kOqlaS{aQd`6Pjh z{hV7UY6LF!sgkcp-zyzt$J|ZjG9fa1I#por$2#LEF|Z%0GtREX7FXrj2oSHj(%WPg zH_&^6pNY=MFeFyv&S;)q6xNeMHa;VR%G)m7_Lso)U~M3lU^8?}@+bXm-ed2vgH zNOMdt0e8|BfKaW*+vl8=6+?FJR~ETqjX0babz?OG1KxrG8V)$O+0ubPgT1G%@6W=P zX%1jFO<C=^wN_pI|X(tvJ0+g<%se*OgE<3v`(`DNk zwCxdEU@P@}W)%*57NG-SEy6lBsAmSm%D7dY_NA%u%DJhs&rjQagif!at8vJBgbfHA z0g8I~E;}LiMLKx;>=@mI#mxv?5ViyOWZI8_&OWKIoBDwSDkl(`@SvsiuPG(jl}tN1 z%1#Ay8xmXfhgOoIEZ4>=V2p#biOP}++zx%ArQ^u<1U0=1mt&LAWMnvhPY^iq`iX0 zmk=I789j)FLkKS;97gCvIKn{-noPB(aPC zFl4oycq(L6bcLWF0i%}^-Bn~XifsVySYS`h6WwTF&wY*_`q$!s2d(r39H13pw`fAT z2LU}x1%wv+9lGy7tjx0+w)fC$a!A{&knp9+3xV1Gk3RO9*~vagn(gy>YLCi9xJUch zH^~7*hp9BUQCd3KQ8ZjF_i2^$f^(dZTBA z)4^w?-ZKpFq0#W6Va0=<5%)|d?j;)Td)-Nf9}~!$)u0si45{8T-hly$z@9q;S(2@? z48VrMwh{Pq89YMUz%J^G_T*T_X>w~3i$d518jXdX#2G>lix_q?FP*NY9(9Qki1lHpSEk|Qv*iM48;gi9KPexznxlF6#GLi0@a@b%_&3%zM zNTSq)iHn`=Vs^u-1g`O@Gu(!Sc7PVU=h<)B<$c{)TZ(|hQY4V}AS_3C24Mw2iLL}J z)@?h4>6YDabSvhzA#7(?b1NSEbsL`BmLDZml;su=P%1_Op?u-YL}lEMjFrbh$>UJ* z1!%=rI zPG#Kowe4`~hNoDua3~&#hwnfm06u%Su!s2U$3m8@Wxp1-F4=*lqgWE`(aIz}hR^*7 Nrx1n__Oepv*njd>8qWX# diff --git a/tests/__pycache__/test_wildboottest.cpython-310-pytest-7.3.1.pyc b/tests/__pycache__/test_wildboottest.cpython-310-pytest-7.3.1.pyc index da8771865ec9c32efb242e75d09f693bd9472331..5ff00799f66494138fccd13f95e153b9003b6d03 100644 GIT binary patch delta 334 zcmeC$#Y?7$q3R7>lGP z`!UHfdQHw@Qq_WbffeipHnn@*HL(HYt!oxye_UEg3lh|KC}p delta 262 zcmZ3_(Z|7?&&$ij00hhj{Zb4z@>(-8I!yLtl+~zZssX|*mK3IJCP@Y$k1>lig(-zO zg{7A%g%v2moWc;ypvg9Q0;A~U4UBS(Y?IG3N^5c^=clISCFZ6U-{L9H%t=Yg&o3!S zEiPHfQp5(d|t|)']) - py_tstat = np.sort(pyfixest.tstat()['t value']) + py_coef = np.sort(pyfixest.coef()) + py_se = np.sort(pyfixest.se()) + py_pval = np.sort(pyfixest.pvalue()) + py_tstat = np.sort(pyfixest.tstat()) r_fixest = fixest.feols( ro.Formula(fml), @@ -94,9 +94,9 @@ def test_py_vs_r(data, fml): # heteroskedastic errors pyfixest.vcov("HC1") - py_se = pyfixest.se()['Std. Error'] - py_pval = pyfixest.pvalue()['Pr(>|t|)'] - py_tstat = pyfixest.tstat()['t value'] + py_se = pyfixest.se().values + py_pval = pyfixest.pvalue().values + py_tstat = pyfixest.tstat().values r_fixest = fixest.feols( ro.Formula(fml), @@ -114,9 +114,9 @@ def test_py_vs_r(data, fml): # 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'] + py_se = pyfixest.se() + py_pval = pyfixest.pvalue() + py_tstat = pyfixest.tstat() r_fixest = fixest.feols( ro.Formula(fml), @@ -175,18 +175,18 @@ def test_py_vs_r2(data, fml_multi): r_fml = _py_fml_to_r_fml(fml_multi) pyfixest = Fixest(data = data).feols(fml_multi) - py_coef = pyfixest.coef()['Estimate'] - py_se = pyfixest.se()['Std. Error'] + py_coef = pyfixest.coef() + py_se = pyfixest.se() r_fixest = fixest.feols( ro.Formula(r_fml), data=data, ssc = fixest.ssc(True, "none", True, "min", "min", False) ) - for x, val in enumerate(r_fixest): + for x, _ in enumerate(r_fixest): - i = pyfixest.tidy().index.unique()[x] - ix = pyfixest.tidy().xs(i) + fml = pyfixest.tidy().reset_index().fml.unique()[x] + ix = pyfixest.tidy().reset_index().set_index("fml").xs(fml) py_coef = ix['Estimate'] py_se = ix['Std. Error'] @@ -220,8 +220,8 @@ def test_py_vs_r_i(data, fml_i): r_fml = _py_fml_to_r_fml(fml_i) pyfixest = Fixest(data = data).feols(fml_i, vcov = 'iid') - py_coef = pyfixest.coef()['Estimate'] - py_se = pyfixest.se()['Std. Error'] + py_coef = pyfixest.coef() + py_se = pyfixest.se() r_fixest = fixest.feols( ro.Formula(r_fml), se = 'iid', @@ -229,10 +229,10 @@ def test_py_vs_r_i(data, fml_i): ssc = fixest.ssc(True, "none", True, "min", "min", False) ) - for x, val in enumerate(r_fixest): + for x, _ in enumerate(r_fixest): - i = pyfixest.tidy().index.unique()[x] - ix = pyfixest.tidy().xs(i) + fml = pyfixest.tidy().reset_index().fml.unique()[x] + ix = pyfixest.tidy().xs(fml) py_coef = ix['Estimate'] py_se = ix['Std. Error'] @@ -263,8 +263,8 @@ def test_py_vs_r_C(data, fml_C): py_fml, r_fml = fml_C pyfixest = Fixest(data = data).feols(py_fml, vcov = 'iid') - py_coef = pyfixest.coef()['Estimate'] - py_se = pyfixest.se()['Std. Error'] + py_coef = pyfixest.coef() + py_se = pyfixest.se() r_fixest = fixest.feols( ro.Formula(r_fml), se = 'iid', @@ -292,8 +292,8 @@ def test_py_vs_r_split(data, fml_split): fml = "Y ~ X1 | X2 + X3" pyfixest = Fixest(data = data).feols(fml_split, vcov = 'iid', split = "group_id") - py_coef = pyfixest.coef()['Estimate'] - py_se = pyfixest.se()['Std. Error'] + py_coef = pyfixest.coef() + py_se = pyfixest.se() r_fixest = fixest.feols( ro.Formula(fml_split), se = 'iid', @@ -304,8 +304,8 @@ def test_py_vs_r_split(data, fml_split): for x, _ in enumerate(r_fixest): - i = pyfixest.tidy().index.unique()[x] - ix = pyfixest.tidy().xs(i) + fml = pyfixest.tidy().reset_index().fml.unique()[x] + ix = pyfixest.tidy().xs(fml) py_coef = ix['Estimate'] py_se = ix['Std. Error'] @@ -381,10 +381,10 @@ def test_py_vs_r_iv(data, fml_iv): # 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']) + py_coef = np.sort(pyfixest.coef()) + py_se = np.sort(pyfixest.se()) + py_pval = np.sort(pyfixest.pvalue()) + py_tstat = np.sort(pyfixest.tstat()) r_fixest = fixest.feols( ro.Formula(fml_iv), @@ -404,9 +404,9 @@ def test_py_vs_r_iv(data, fml_iv): # heteroskedastic errors pyfixest.vcov("HC1") - py_se = pyfixest.se()['Std. Error'] - py_pval = pyfixest.pvalue()['Pr(>|t|)'] - py_tstat = pyfixest.tstat()['t value'] + py_se = pyfixest.se() + py_pval = pyfixest.pvalue() + py_tstat = pyfixest.tstat() r_fixest = fixest.feols( ro.Formula(fml_iv), @@ -424,9 +424,9 @@ def test_py_vs_r_iv(data, fml_iv): # 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'] + py_se = pyfixest.se() + py_pval = pyfixest.pvalue() + py_tstat = pyfixest.tstat() r_fixest = fixest.feols( ro.Formula(fml_iv), diff --git a/tests/test_wildboottest.py b/tests/test_wildboottest.py index b9f880c5..432ba112 100644 --- a/tests/test_wildboottest.py +++ b/tests/test_wildboottest.py @@ -12,8 +12,7 @@ def test_hc_equivalence(data): fixest = pf.Fixest(data) fixest.feols("Y~csw(X1, X2, X3)") - tstat = fixest.tstat() - tstat = tstat[tstat.coefnames == "X1"] + tstat = fixest.tstat().reset_index().set_index("coefnames").xs("X1") boot_tstat = fixest.wildboottest(param = "X1", B = 999)["t value"] #np.allclose(tstat, boot_tstat) @@ -22,8 +21,7 @@ def test_crv1_equivalence(data): fixest = pf.Fixest(data) fixest.feols("Y~csw(X1, X2, X3)", vcov = {"CRV1":"group_id"}) - tstat = fixest.tstat() - tstat = tstat[tstat.coefnames == "X1"] + tstat = fixest.tstat().reset_index().set_index("coefnames").xs("X1") boot_tstat = fixest.wildboottest(param = "X1", B = 999)["t value"] #np.allclose(tstat, boot_tstat) From 1baacbd151e03fac8291b45fbcdbdf3b74ddb495 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Mon, 17 Jul 2023 17:23:55 +0200 Subject: [PATCH 05/13] bump to 0.7.0 --- poetry.lock | 1107 ++++++++++++++++++++++++++---------------------- pyproject.toml | 2 +- 2 files changed, 602 insertions(+), 507 deletions(-) diff --git a/poetry.lock b/poetry.lock index 01dec969..a517a5f7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -73,14 +73,14 @@ virtualenv = ["virtualenv (>=20.0.35)"] [[package]] name = "cachecontrol" -version = "0.12.11" +version = "0.12.14" 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"}, + {file = "CacheControl-0.12.14-py2.py3-none-any.whl", hash = "sha256:1c2939be362a70c4e5f02c6249462b3b7a24441e4f1ced5e9ef028172edf356a"}, + {file = "CacheControl-0.12.14.tar.gz", hash = "sha256:d1087f45781c0e00616479bfd282c78504371ca71da017b49df9f5365a95feba"}, ] [package.dependencies] @@ -183,87 +183,87 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.2.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"}, + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] [[package]] @@ -284,14 +284,14 @@ rapidfuzz = ">=2.2.0,<3.0.0" [[package]] name = "click" -version = "8.1.3" +version = "8.1.5" 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"}, + {file = "click-8.1.5-py3-none-any.whl", hash = "sha256:e576aa487d679441d7d30abb87e1b43d24fc53bffb8758443b1a9e1cee504548"}, + {file = "click-8.1.5.tar.gz", hash = "sha256:4be4b1af8d665c6d942909916d31a213a106800c47d0eeba73d34da3cbc11367"}, ] [package.dependencies] @@ -311,78 +311,62 @@ files = [ [[package]] name = "contourpy" -version = "1.0.7" +version = "1.1.0" 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"}, + {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, + {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, + {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, + {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, + {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, + {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, + {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, ] [package.dependencies] numpy = ">=1.16" [package.extras] -bokeh = ["bokeh", "chromedriver", "selenium"] +bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] -test = ["Pillow", "matplotlib", "pytest"] -test-no-images = ["pytest"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "crashtest" @@ -398,31 +382,35 @@ files = [ [[package]] name = "cryptography" -version = "41.0.1" +version = "41.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, - {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, - {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, - {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58"}, + {file = "cryptography-41.0.2-cp37-abi3-win32.whl", hash = "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76"}, + {file = "cryptography-41.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0"}, + {file = "cryptography-41.0.2.tar.gz", hash = "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c"}, ] [package.dependencies] @@ -452,14 +440,14 @@ files = [ [[package]] name = "distlib" -version = "0.3.6" +version = "0.3.7" 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"}, + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, ] [[package]] @@ -539,14 +527,14 @@ pgp = ["gpg"] [[package]] name = "exceptiongroup" -version = "1.1.1" +version = "1.1.2" 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"}, + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, ] [package.extras] @@ -554,30 +542,62 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.12.0" +version = "3.12.2" 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"}, + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, ] [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)"] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "fonttools" -version = "4.39.4" +version = "4.41.0" 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"}, + {file = "fonttools-4.41.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ba2a367ff478cd108d5319c0dc4fd4eb4ea3476dbfc45b00c45718e889cd9463"}, + {file = "fonttools-4.41.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69178674505ec81adf4af2a3bbacd0cb9a37ba7831bc3fca307f80e48ab2767b"}, + {file = "fonttools-4.41.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86edb95c4d1fe4fae2111d7e0c10c6e42b7790b377bcf1952303469eee5b52bb"}, + {file = "fonttools-4.41.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50f8bdb421270f71b54695c62785e300fab4bb6127be40bf9f3084962a0c3adb"}, + {file = "fonttools-4.41.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c890061915e95b619c1d3cc3c107c6fb021406b701c0c24b03e74830d522f210"}, + {file = "fonttools-4.41.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b329ae7ce971b5c4148d6cdb8119c0ce4587265b2330d4f2f3776ef851bee020"}, + {file = "fonttools-4.41.0-cp310-cp310-win32.whl", hash = "sha256:bc9e7b1e268be7a23fc66471b615c324e99c5db39ce8c49dd6dd8e962c7bc1b8"}, + {file = "fonttools-4.41.0-cp310-cp310-win_amd64.whl", hash = "sha256:f3fe90dfb297bd8265238c06787911cd81c2cb89ac5b13e1c911928bdabfce0f"}, + {file = "fonttools-4.41.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e38bd91eae257f36c2b7245c0278e9cd9d754f3a66b8d2b548c623ba66e387b6"}, + {file = "fonttools-4.41.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:415cf7c806a3f56fb280dadcf3c92c85c0415e75665ca957b4a2a2e39c17a5c9"}, + {file = "fonttools-4.41.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:381558eafffc1432d08ca58063e71c7376ecaae48e9318354a90a1049a644845"}, + {file = "fonttools-4.41.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ee75b8ca48f6c48af25e967dce995ef94e46872b35c7d454b983c62c9c7006d"}, + {file = "fonttools-4.41.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d45f28c20bb67dee0f4a4caae709f40b0693d764b7b2bf2d58890f36b1bfcef0"}, + {file = "fonttools-4.41.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5448a87f6ed57ed844b64a05d3792827af584a8584613f6289867f4e77eb603b"}, + {file = "fonttools-4.41.0-cp311-cp311-win32.whl", hash = "sha256:69dbe0154e15b68dd671441ea8f23dad87488b24a6e650d45958f4722819a443"}, + {file = "fonttools-4.41.0-cp311-cp311-win_amd64.whl", hash = "sha256:ea879afd1d6189fca02a85a7868560c9bb8415dccff6b7ae6d81e4f06b3ab30d"}, + {file = "fonttools-4.41.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8f602dd5bcde7e4241419924f23c6f0d66723dd5408a58c3a2f781745c693f45"}, + {file = "fonttools-4.41.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06eac087ea55b3ebb2207d93b5ac56c847163899f05f5a77e1910f688fe10030"}, + {file = "fonttools-4.41.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e22d0144d735f6c7df770509b8c0c33414bf460df0d5dddc98a159e5dbb10eb"}, + {file = "fonttools-4.41.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19d461c801b8904d201c6c38a99bfcfef673bfdfe0c7f026f582ef78896434e0"}, + {file = "fonttools-4.41.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:72d40a32d6443871ea0d147813caad58394b48729dfa4fbc45dcaac54f9506f2"}, + {file = "fonttools-4.41.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0614b6348866092d00df3dfb37e037fc06412ca67087de361a2777ea5ed62c16"}, + {file = "fonttools-4.41.0-cp38-cp38-win32.whl", hash = "sha256:e43f6c7f9ba4f9d29edee530e45f9aa162872ec9549398b85971477a99f2a806"}, + {file = "fonttools-4.41.0-cp38-cp38-win_amd64.whl", hash = "sha256:eb9dfa87152bd97019adc387b2f29ef6af601de4386f36570ca537ace96d96ed"}, + {file = "fonttools-4.41.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d2dae84a3d0f76884a6102c62f2795b2d6602c2c95cfcce74c8a590b6200e533"}, + {file = "fonttools-4.41.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc3324e4159e6d1f55c3615b4c1c211f87cc96cc0cc7c946c8447dc1319f2e9d"}, + {file = "fonttools-4.41.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c654b1facf1f3b742e4d9b2dcdf0fa867b1f007b1b4981cc58a75ef5dca2a3c"}, + {file = "fonttools-4.41.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:560ea1a604c927399f36742abf342a4c5f3fee8e8e8a484b774dfe9630bd9a91"}, + {file = "fonttools-4.41.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9387b09694fbf8ac7dcf887069068f81fb4124d05e09557ac7daabfbec1744bd"}, + {file = "fonttools-4.41.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:465d0f24bf4f75160f441793b55076b7a080a57d3a1f738390af2c20bee24fbb"}, + {file = "fonttools-4.41.0-cp39-cp39-win32.whl", hash = "sha256:841c491fa3e9c54e8f9cd5dae059e88f45e086aea090c28be9d42f59c8b99e01"}, + {file = "fonttools-4.41.0-cp39-cp39-win_amd64.whl", hash = "sha256:efd59e83223cb77952997fb850c7a7c2a958c9af0642060f536722c2a9e9d53b"}, + {file = "fonttools-4.41.0-py3-none-any.whl", hash = "sha256:5b1c2b21b40229166a864f2b0aec06d37f0a204066deb1734c93370e0c76339d"}, + {file = "fonttools-4.41.0.tar.gz", hash = "sha256:6faff25991dec48f8cac882055a09ae1a29fd15bc160bc3d663e789e994664c2"}, ] [package.extras] @@ -596,14 +616,14 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "formulaic" -version = "0.6.1" +version = "0.6.4" 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"}, + {file = "formulaic-0.6.4-py3-none-any.whl", hash = "sha256:570b3c7ab15fe8095e0dc86a4f71217102b23ce7e715053751a6cdcc580d7767"}, + {file = "formulaic-0.6.4.tar.gz", hash = "sha256:a8c84b6fa6df9216dbeaddcfa3f097bd5efe88e340211ac34c18cffe133cdb78"}, ] [package.dependencies] @@ -652,14 +672,14 @@ files = [ [[package]] name = "griffe" -version = "0.29.0" +version = "0.32.3" 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" +python-versions = ">=3.8" files = [ - {file = "griffe-0.29.0-py3-none-any.whl", hash = "sha256:e62ff34b04630c2382e2e277301cb2c29221fb09c04028e62ef35afccc64344b"}, - {file = "griffe-0.29.0.tar.gz", hash = "sha256:6fc892aaa251b3761e3a8d2f5893758e1850ec5d81d4605c4557be0666202a0b"}, + {file = "griffe-0.32.3-py3-none-any.whl", hash = "sha256:d9471934225818bf8f309822f70451cc6abb4b24e59e0bb27402a45f9412510f"}, + {file = "griffe-0.32.3.tar.gz", hash = "sha256:14983896ad581f59d5ad7b6c9261ff12bdaa905acccc1129341d13e545da8521"}, ] [package.dependencies] @@ -701,14 +721,14 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.6.0" +version = "6.8.0" description = "Read metadata from Python packages" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" 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"}, + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] [package.dependencies] @@ -717,26 +737,26 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "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 (>=0.9.2)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.0.0" description = "Read resources from Python packages" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" 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"}, + {file = "importlib_resources-6.0.0-py3-none-any.whl", hash = "sha256:d952faee11004c045f785bb5636e8f885bed30dc3c940d5d42798a2a4541c185"}, + {file = "importlib_resources-6.0.0.tar.gz", hash = "sha256:4cf94875a8368bd89531a756df9a9ebe1f150e0f885030b461237bc7f2d905f2"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -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)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "iniconfig" @@ -776,22 +796,22 @@ files = [ [[package]] name = "jaraco-classes" -version = "3.2.3" +version = "3.3.0" description = "Utility functions for Python class constructs" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" 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"}, + {file = "jaraco.classes-3.3.0-py3-none-any.whl", hash = "sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb"}, + {file = "jaraco.classes-3.3.0.tar.gz", hash = "sha256:c063dd08e89217cee02c8d5e5ec560f2c8ce6cdc2fcdc2e68f7b2e5547ed3621"}, ] [package.dependencies] more-itertools = "*" [package.extras] -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)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "jeepney" @@ -829,26 +849,44 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "4.17.3" +version = "4.18.3" description = "An implementation of JSON Schema validation for Python" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, - {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, + {file = "jsonschema-4.18.3-py3-none-any.whl", hash = "sha256:aab78b34c2de001c6b692232f08c21a97b436fe18e0b817bf0511046924fceef"}, + {file = "jsonschema-4.18.3.tar.gz", hash = "sha256:64b7104d72efe856bea49ca4af37a14a9eba31b40bb7238179f3803130fd34d9"}, ] [package.dependencies] -attrs = ">=17.4.0" +attrs = ">=22.2.0" importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +jsonschema-specifications = ">=2023.03.6" 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" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" [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 = "jsonschema-specifications" +version = "2023.6.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.6.1-py3-none-any.whl", hash = "sha256:3d2b82663aff01815f744bb5c7887e2121a63399b49b104a3c96145474d091d7"}, + {file = "jsonschema_specifications-2023.6.1.tar.gz", hash = "sha256:ca1c4dd059a9e7b34101cf5b3ab7ff1d18b139f35950d598d629837ef66e8f28"}, +] + +[package.dependencies] +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +referencing = ">=0.28.0" + [[package]] name = "keyring" version = "23.13.1" @@ -954,40 +992,36 @@ files = [ [[package]] name = "llvmlite" -version = "0.38.1" +version = "0.40.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"}, - {file = "llvmlite-0.38.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b98da8436dbc29013ea301f1fdb0d596ab53bf0ab65c976d96d00bb6faa0b479"}, - {file = "llvmlite-0.38.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0adce1793d66d009c554809f27baeb6258bf13f6fbaa12eff7443500caec25"}, - {file = "llvmlite-0.38.1-cp310-cp310-win32.whl", hash = "sha256:8c64c90a8b0b7b7e1ed1912ba82c1a3f43cf25affbe06aa3c56c84050edee8ac"}, - {file = "llvmlite-0.38.1-cp310-cp310-win_amd64.whl", hash = "sha256:ab070266f0f51304789a6c20d4be91a9e69683ad9bd4861eb89980e8eb613b3a"}, - {file = "llvmlite-0.38.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ed7528b8b85de930b76407e44b080e4f376b7a007c2879749599ff8e2fe32753"}, - {file = "llvmlite-0.38.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7db018da2863034ad9c73c946625637f3a89635bc70576068bab4bd085eea90d"}, - {file = "llvmlite-0.38.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1e5805c92e049b4956ed01204c6647de6160ab9aefb0d67ea83ca02a1d889a"}, - {file = "llvmlite-0.38.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5559e46c79b4017c3c25edc3b9512d11adc3689b9046120c685b0905c08d48a5"}, - {file = "llvmlite-0.38.1-cp37-cp37m-win32.whl", hash = "sha256:ef9aa574eff2e15f8c47b255da0db5dab326dc7f76384c307ae35490e2d2489a"}, - {file = "llvmlite-0.38.1-cp37-cp37m-win_amd64.whl", hash = "sha256:84d5a0163c172db2b2ae561d2fc0866fbd9f716cf13f92c0d41ca4338e682672"}, - {file = "llvmlite-0.38.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a263252a68d85450110ec1f2b406c0414e49b04a4d216d31c0515ea1d59c3882"}, - {file = "llvmlite-0.38.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:de8bd61480173930f2a029673e7cd0738fbbb5171dfe490340839ad7301d4cf0"}, - {file = "llvmlite-0.38.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbfbe546394c39db39a6898a51972aa131c8d6b0628517728b350552f58bdc19"}, - {file = "llvmlite-0.38.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c4f26c6c370e134a909ac555a671fa1376e74c69af0208f25c0979472577a9d"}, - {file = "llvmlite-0.38.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f95f455697c44d7c04ef95fdfce04629f48df08a832d0a0d9eb2363186dbb969"}, - {file = "llvmlite-0.38.1-cp38-cp38-win32.whl", hash = "sha256:41e638a71c85a9a4a33f279c4cd812bc2f84122505b1f6ab8984ec7debb8548b"}, - {file = "llvmlite-0.38.1-cp38-cp38-win_amd64.whl", hash = "sha256:5c07d63df4578f31b39b764d3b4291f70157af7f42e171a8884ae7aaf989d1f7"}, - {file = "llvmlite-0.38.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4e11bd9929dcbd55d5eb5cd7b08bf71b0097ea48cc192b69d102a90dd6e9816f"}, - {file = "llvmlite-0.38.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:edfa2c761cfa56cf76e783290d82e117f829bb691d8d90aa375505204888abac"}, - {file = "llvmlite-0.38.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e609f7312a439b53b6f622d99180c3ff6a3e1e4ceca4d18aca1c5b46f4e3664"}, - {file = "llvmlite-0.38.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f53c3448410cc84d0e1af84dbc0d60ad32779853d40bcc8b1ee3c67ebbe94b1"}, - {file = "llvmlite-0.38.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8fac4edbadefa4dddf5dc6cca76bc2ae81df211dcd16a6638d60cc41249e56"}, - {file = "llvmlite-0.38.1-cp39-cp39-win32.whl", hash = "sha256:3d76c0fa42390bef56979ed213fbf0150c3fef36f5ea68d3d780d5d725da8c01"}, - {file = "llvmlite-0.38.1-cp39-cp39-win_amd64.whl", hash = "sha256:66462d768c30d5f648ca3361d657b434efa8b09f6cf04d6b6eae66e62e993644"}, - {file = "llvmlite-0.38.1.tar.gz", hash = "sha256:0622a86301fcf81cc50d7ed5b4bebe992c030580d413a8443b328ed4f4d82561"}, +python-versions = ">=3.8" +files = [ + {file = "llvmlite-0.40.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ce9b1c7a59936382ffde7871978cddcda14098e5a76d961e204523e5c372fb"}, + {file = "llvmlite-0.40.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3673c53cb21c65d2ff3704962b5958e967c6fc0bd0cff772998face199e8d87b"}, + {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba2747cf5b4954e945c287fe310b3fcc484e2a9d1b0c273e99eb17d103bb0e6"}, + {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd5e82cc990e5a3e343a3bf855c26fdfe3bfae55225f00efd01c05bbda79918"}, + {file = "llvmlite-0.40.1-cp310-cp310-win32.whl", hash = "sha256:09f83ea7a54509c285f905d968184bba00fc31ebf12f2b6b1494d677bb7dde9b"}, + {file = "llvmlite-0.40.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b37297f3cbd68d14a97223a30620589d98ad1890e5040c9e5fc181063f4ed49"}, + {file = "llvmlite-0.40.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a66a5bd580951751b4268f4c3bddcef92682814d6bc72f3cd3bb67f335dd7097"}, + {file = "llvmlite-0.40.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:467b43836b388eaedc5a106d76761e388dbc4674b2f2237bc477c6895b15a634"}, + {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c23edd196bd797dc3a7860799054ea3488d2824ecabc03f9135110c2e39fcbc"}, + {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36d9f244b6680cb90bbca66b146dabb2972f4180c64415c96f7c8a2d8b60a36"}, + {file = "llvmlite-0.40.1-cp311-cp311-win_amd64.whl", hash = "sha256:5b3076dc4e9c107d16dc15ecb7f2faf94f7736cd2d5e9f4dc06287fd672452c1"}, + {file = "llvmlite-0.40.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a7525db121f2e699809b539b5308228854ccab6693ecb01b52c44a2f5647e20"}, + {file = "llvmlite-0.40.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:84747289775d0874e506f907a4513db889471607db19b04de97d144047fec885"}, + {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e35766e42acef0fe7d1c43169a8ffc327a47808fae6a067b049fe0e9bbf84dd5"}, + {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda71de10a1f48416309e408ea83dab5bf36058f83e13b86a2961defed265568"}, + {file = "llvmlite-0.40.1-cp38-cp38-win32.whl", hash = "sha256:96707ebad8b051bbb4fc40c65ef93b7eeee16643bd4d579a14d11578e4b7a647"}, + {file = "llvmlite-0.40.1-cp38-cp38-win_amd64.whl", hash = "sha256:e44f854dc11559795bcdeaf12303759e56213d42dabbf91a5897aa2d8b033810"}, + {file = "llvmlite-0.40.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f643d15aacd0b0b0dc8b74b693822ba3f9a53fa63bc6a178c2dba7cc88f42144"}, + {file = "llvmlite-0.40.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39a0b4d0088c01a469a5860d2e2d7a9b4e6a93c0f07eb26e71a9a872a8cadf8d"}, + {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9329b930d699699846623054121ed105fd0823ed2180906d3b3235d361645490"}, + {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2dbbb8424037ca287983b115a29adf37d806baf7e1bf4a67bd2cffb74e085ed"}, + {file = "llvmlite-0.40.1-cp39-cp39-win32.whl", hash = "sha256:e74e7bec3235a1e1c9ad97d897a620c5007d0ed80c32c84c1d787e7daa17e4ec"}, + {file = "llvmlite-0.40.1-cp39-cp39-win_amd64.whl", hash = "sha256:ff8f31111bb99d135ff296757dc81ab36c2dee54ed4bd429158a96da9807c316"}, + {file = "llvmlite-0.40.1.tar.gz", hash = "sha256:5cdb0d45df602099d833d50bd9e81353a5e036242d3c003c5b294fc61d1986b4"}, ] [[package]] @@ -1082,53 +1116,53 @@ files = [ [[package]] name = "matplotlib" -version = "3.7.1" +version = "3.7.2" 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"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, - {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, - {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, - {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, - {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, - {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, - {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, - {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, - {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, - {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, + {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:2699f7e73a76d4c110f4f25be9d2496d6ab4f17345307738557d345f099e07de"}, + {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a8035ba590658bae7562786c9cc6ea1a84aa49d3afab157e414c9e2ea74f496d"}, + {file = "matplotlib-3.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f8e4a49493add46ad4a8c92f63e19d548b2b6ebbed75c6b4c7f46f57d36cdd1"}, + {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71667eb2ccca4c3537d9414b1bc00554cb7f91527c17ee4ec38027201f8f1603"}, + {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:152ee0b569a37630d8628534c628456b28686e085d51394da6b71ef84c4da201"}, + {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070f8dddd1f5939e60aacb8fa08f19551f4b0140fab16a3669d5cd6e9cb28fc8"}, + {file = "matplotlib-3.7.2-cp310-cp310-win32.whl", hash = "sha256:fdbb46fad4fb47443b5b8ac76904b2e7a66556844f33370861b4788db0f8816a"}, + {file = "matplotlib-3.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:23fb1750934e5f0128f9423db27c474aa32534cec21f7b2153262b066a581fd1"}, + {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:30e1409b857aa8a747c5d4f85f63a79e479835f8dffc52992ac1f3f25837b544"}, + {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:50e0a55ec74bf2d7a0ebf50ac580a209582c2dd0f7ab51bc270f1b4a0027454e"}, + {file = "matplotlib-3.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac60daa1dc83e8821eed155796b0f7888b6b916cf61d620a4ddd8200ac70cd64"}, + {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305e3da477dc8607336ba10bac96986d6308d614706cae2efe7d3ffa60465b24"}, + {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c308b255efb9b06b23874236ec0f10f026673ad6515f602027cc8ac7805352d"}, + {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60c521e21031632aa0d87ca5ba0c1c05f3daacadb34c093585a0be6780f698e4"}, + {file = "matplotlib-3.7.2-cp311-cp311-win32.whl", hash = "sha256:26bede320d77e469fdf1bde212de0ec889169b04f7f1179b8930d66f82b30cbc"}, + {file = "matplotlib-3.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4860132c8c05261a5f5f8467f1b269bf1c7c23902d75f2be57c4a7f2394b3e"}, + {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:a1733b8e84e7e40a9853e505fe68cc54339f97273bdfe6f3ed980095f769ddc7"}, + {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d9881356dc48e58910c53af82b57183879129fa30492be69058c5b0d9fddf391"}, + {file = "matplotlib-3.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f081c03f413f59390a80b3e351cc2b2ea0205839714dbc364519bcf51f4b56ca"}, + {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cd120fca3407a225168238b790bd5c528f0fafde6172b140a2f3ab7a4ea63e9"}, + {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c1590b90aa7bd741b54c62b78de05d4186271e34e2377e0289d943b3522273"}, + {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d2ff3c984b8a569bc1383cd468fc06b70d7b59d5c2854ca39f1436ae8394117"}, + {file = "matplotlib-3.7.2-cp38-cp38-win32.whl", hash = "sha256:5dea00b62d28654b71ca92463656d80646675628d0828e08a5f3b57e12869e13"}, + {file = "matplotlib-3.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f506a1776ee94f9e131af1ac6efa6e5bc7cb606a3e389b0ccb6e657f60bb676"}, + {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6515e878f91894c2e4340d81f0911857998ccaf04dbc1bba781e3d89cbf70608"}, + {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:71f7a8c6b124e904db550f5b9fe483d28b896d4135e45c4ea381ad3b8a0e3256"}, + {file = "matplotlib-3.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12f01b92ecd518e0697da4d97d163b2b3aa55eb3eb4e2c98235b3396d7dad55f"}, + {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7e28d6396563955f7af437894a36bf2b279462239a41028323e04b85179058b"}, + {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbcf59334ff645e6a67cd5f78b4b2cdb76384cdf587fa0d2dc85f634a72e1a3e"}, + {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:318c89edde72ff95d8df67d82aca03861240512994a597a435a1011ba18dbc7f"}, + {file = "matplotlib-3.7.2-cp39-cp39-win32.whl", hash = "sha256:ce55289d5659b5b12b3db4dc9b7075b70cef5631e56530f14b2945e8836f2d20"}, + {file = "matplotlib-3.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:2ecb5be2b2815431c81dc115667e33da0f5a1bcf6143980d180d09a717c4a12e"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdcd28360dbb6203fb5219b1a5658df226ac9bebc2542a9e8f457de959d713d0"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3cca3e842b11b55b52c6fb8bd6a4088693829acbfcdb3e815fa9b7d5c92c1b"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf577c7a6744e9e1bd3fee45fc74a02710b214f94e2bde344912d85e0c9af7c"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:936bba394682049919dda062d33435b3be211dc3dcaa011e09634f060ec878b2"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bc221ffbc2150458b1cd71cdd9ddd5bb37962b036e41b8be258280b5b01da1dd"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35d74ebdb3f71f112b36c2629cf32323adfbf42679e2751252acd468f5001c07"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717157e61b3a71d3d26ad4e1770dc85156c9af435659a25ee6407dc866cb258d"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f844d6be031948148ba49605c8b96dfe7d3711d1b63592830d650622458c11"}, + {file = "matplotlib-3.7.2.tar.gz", hash = "sha256:a8cdb91dddb04436bd2f098b8fdf4b81352e68cf4d2c6756fcc414791076569b"}, ] [package.dependencies] @@ -1140,7 +1174,7 @@ kiwisolver = ">=1.0.1" numpy = ">=1.20" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.3.1" +pyparsing = ">=2.3.1,<3.1" python-dateutil = ">=2.7" [[package]] @@ -1345,77 +1379,79 @@ files = [ [[package]] name = "numba" -version = "0.55.2" +version = "0.57.1" 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"}, - {file = "numba-0.55.2-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:676c081162cc9403706071c1d1d42e479c0741551ab28096ba13859a2e3e9b80"}, - {file = "numba-0.55.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2665ef28e900b3a55bf370daa81c12ebc64cd434116accd60c38a95a159a3182"}, - {file = "numba-0.55.2-cp310-cp310-win32.whl", hash = "sha256:d7ac9ea5feef9536ab8bfbbb3ded1a0617ea8794d7547800d535b7857800f996"}, - {file = "numba-0.55.2-cp310-cp310-win_amd64.whl", hash = "sha256:29b89a68af162acf87adeb8fbf01f6bb1effae4711b28146f95108d82e905624"}, - {file = "numba-0.55.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:6e0f9b5d1c8ea1bdef39b0ad921a9bbf0cc4a88e76d722d756c68f1653787c35"}, - {file = "numba-0.55.2-cp37-cp37m-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:135fb7694928f9f57b4ff5b1be58f20f4771fedd1680636a9affdead96051959"}, - {file = "numba-0.55.2-cp37-cp37m-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:de1f93bd7e2d431451aec20a52ac651a020e98a4ba46797fad860bba338a7e64"}, - {file = "numba-0.55.2-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3eaf53e73e700370163e58257257299ac0d46fea4f244bf5476e4635bc31d808"}, - {file = "numba-0.55.2-cp37-cp37m-win32.whl", hash = "sha256:da4485e0f0b9562f39c78887149b33d13d787aa696553c9257b95575122905ed"}, - {file = "numba-0.55.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5559c6684bf6cce7a22c656d8fef3e7c38ff5fec5153abef5955f6f7cae9f102"}, - {file = "numba-0.55.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a85779adc5234f7857615d1bd2c7b514314521f9f0163c33017707ed9816e6e6"}, - {file = "numba-0.55.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:16a52a0641c342b09b39f6762dcbe3846e44aa9baaaf4703b2ca42a3aee7346f"}, - {file = "numba-0.55.2-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:46715180f87d5a1f3e4077d207ade66c96fc01159f5b7d49cee2d6ffb9e6539f"}, - {file = "numba-0.55.2-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d1c3cef3289fefb5673ceae32024ab5a8a08d4f4380bcb8348d01f1ba570ccff"}, - {file = "numba-0.55.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68bb33eaef1d6155fc1ae4fa6c915b8a42e5052c89a58742254eaad072eab118"}, - {file = "numba-0.55.2-cp38-cp38-win32.whl", hash = "sha256:dfddd633141608a09cbce275fb9fe7aa514918625ace20b0e587898a2d93c030"}, - {file = "numba-0.55.2-cp38-cp38-win_amd64.whl", hash = "sha256:a669212aa66ffee4ad778016ac3819add33f9bcb96b4c384d3099531dd175085"}, - {file = "numba-0.55.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:dcde1a1a3a430fb5f83c7e095b0b6ac7adb5595f50a3ee05babb2964f31613c4"}, - {file = "numba-0.55.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69b2e823efa40d32b259f5c094476dde2226b92032f17015d8cd7c10472654ce"}, - {file = "numba-0.55.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:20de0139d2267c8f0e2470d4f88540446cd1bf40de0f29f31b7ab9bf25d49b45"}, - {file = "numba-0.55.2-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:09ff4d690abb05ffbb8a29a96d1cf35b46887a26796d3670de104beeec73d639"}, - {file = "numba-0.55.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1105449247f338e49d63eb04a4aaa5c440bb5435df00f718c8e6e7afad841bb0"}, - {file = "numba-0.55.2-cp39-cp39-win32.whl", hash = "sha256:32649584144c35ced239937ab2c416ab22bbc1490ef8d90609c30fff9f6aa1b8"}, - {file = "numba-0.55.2-cp39-cp39-win_amd64.whl", hash = "sha256:8d5760a1e6a48d98d6b9cf774e4d2a64813d981cca60d7b7356af61195a6ca17"}, - {file = "numba-0.55.2.tar.gz", hash = "sha256:e428d9e11d9ba592849ccc9f7a009003eb7d30612007e365afe743ce7118c6f4"}, +python-versions = ">=3.8" +files = [ + {file = "numba-0.57.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db8268eb5093cae2288942a8cbd69c9352f6fe6e0bfa0a9a27679436f92e4248"}, + {file = "numba-0.57.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:643cb09a9ba9e1bd8b060e910aeca455e9442361e80fce97690795ff9840e681"}, + {file = "numba-0.57.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e9fab973d9e82c9f8449f75994a898daaaf821d84f06fbb0b9de2293dd9306"}, + {file = "numba-0.57.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0602e4f896e6a6d844517c3ab434bc978e7698a22a733cc8124465898c28fa8"}, + {file = "numba-0.57.1-cp310-cp310-win32.whl", hash = "sha256:3d6483c27520d16cf5d122868b79cad79e48056ecb721b52d70c126bed65431e"}, + {file = "numba-0.57.1-cp310-cp310-win_amd64.whl", hash = "sha256:a32ee263649aa3c3587b833d6311305379529570e6c20deb0c6f4fb5bc7020db"}, + {file = "numba-0.57.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c078f84b5529a7fdb8413bb33d5100f11ec7b44aa705857d9eb4e54a54ff505"}, + {file = "numba-0.57.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e447c4634d1cc99ab50d4faa68f680f1d88b06a2a05acf134aa6fcc0342adeca"}, + {file = "numba-0.57.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4838edef2df5f056cb8974670f3d66562e751040c448eb0b67c7e2fec1726649"}, + {file = "numba-0.57.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b17fbe4a69dcd9a7cd49916b6463cd9a82af5f84911feeb40793b8bce00dfa7"}, + {file = "numba-0.57.1-cp311-cp311-win_amd64.whl", hash = "sha256:93df62304ada9b351818ba19b1cfbddaf72cd89348e81474326ca0b23bf0bae1"}, + {file = "numba-0.57.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8e00ca63c5d0ad2beeb78d77f087b3a88c45ea9b97e7622ab2ec411a868420ee"}, + {file = "numba-0.57.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff66d5b022af6c7d81ddbefa87768e78ed4f834ab2da6ca2fd0d60a9e69b94f5"}, + {file = "numba-0.57.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:60ec56386076e9eed106a87c96626d5686fbb16293b9834f0849cf78c9491779"}, + {file = "numba-0.57.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c057ccedca95df23802b6ccad86bb318be624af45b5a38bb8412882be57a681"}, + {file = "numba-0.57.1-cp38-cp38-win32.whl", hash = "sha256:5a82bf37444039c732485c072fda21a361790ed990f88db57fd6941cd5e5d307"}, + {file = "numba-0.57.1-cp38-cp38-win_amd64.whl", hash = "sha256:9bcc36478773ce838f38afd9a4dfafc328d4ffb1915381353d657da7f6473282"}, + {file = "numba-0.57.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae50c8c90c2ce8057f9618b589223e13faa8cbc037d8f15b4aad95a2c33a0582"}, + {file = "numba-0.57.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9a1b2b69448e510d672ff9a6b18d2db9355241d93c6a77677baa14bec67dc2a0"}, + {file = "numba-0.57.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3cf78d74ad9d289fbc1e5b1c9f2680fca7a788311eb620581893ab347ec37a7e"}, + {file = "numba-0.57.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f47dd214adc5dcd040fe9ad2adbd2192133c9075d2189ce1b3d5f9d72863ef05"}, + {file = "numba-0.57.1-cp39-cp39-win32.whl", hash = "sha256:a3eac19529956185677acb7f01864919761bfffbb9ae04bbbe5e84bbc06cfc2b"}, + {file = "numba-0.57.1-cp39-cp39-win_amd64.whl", hash = "sha256:9587ba1bf5f3035575e45562ada17737535c6d612df751e811d702693a72d95e"}, + {file = "numba-0.57.1.tar.gz", hash = "sha256:33c0500170d213e66d90558ad6aca57d3e03e97bb11da82e6d87ab793648cb17"}, ] [package.dependencies] -llvmlite = ">=0.38.0rc1,<0.39" -numpy = ">=1.18,<1.23" -setuptools = "*" +importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} +llvmlite = ">=0.40.0dev0,<0.41" +numpy = ">=1.21,<1.25" [[package]] name = "numpy" -version = "1.22.4" -description = "NumPy is the fundamental package for array computing with Python." +version = "1.24.4" +description = "Fundamental package for array computing in 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"}, - {file = "numpy-1.22.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43a8ca7391b626b4c4fe20aefe79fec683279e31e7c79716863b4b25021e0e74"}, - {file = "numpy-1.22.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a911e317e8c826ea632205e63ed8507e0dc877dcdc49744584dfc363df9ca08c"}, - {file = "numpy-1.22.4-cp310-cp310-win32.whl", hash = "sha256:9ce7df0abeabe7fbd8ccbf343dc0db72f68549856b863ae3dd580255d009648e"}, - {file = "numpy-1.22.4-cp310-cp310-win_amd64.whl", hash = "sha256:3e1ffa4748168e1cc8d3cde93f006fe92b5421396221a02f2274aab6ac83b077"}, - {file = "numpy-1.22.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:59d55e634968b8f77d3fd674a3cf0b96e85147cd6556ec64ade018f27e9479e1"}, - {file = "numpy-1.22.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c1d937820db6e43bec43e8d016b9b3165dcb42892ea9f106c70fb13d430ffe72"}, - {file = "numpy-1.22.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4c5d5eb2ec8da0b4f50c9a843393971f31f1d60be87e0fb0917a49133d257d6"}, - {file = "numpy-1.22.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64f56fc53a2d18b1924abd15745e30d82a5782b2cab3429aceecc6875bd5add0"}, - {file = "numpy-1.22.4-cp38-cp38-win32.whl", hash = "sha256:fb7a980c81dd932381f8228a426df8aeb70d59bbcda2af075b627bbc50207cba"}, - {file = "numpy-1.22.4-cp38-cp38-win_amd64.whl", hash = "sha256:e96d7f3096a36c8754207ab89d4b3282ba7b49ea140e4973591852c77d09eb76"}, - {file = "numpy-1.22.4-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:4c6036521f11a731ce0648f10c18ae66d7143865f19f7299943c985cdc95afb5"}, - {file = "numpy-1.22.4-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:b89bf9b94b3d624e7bb480344e91f68c1c6c75f026ed6755955117de00917a7c"}, - {file = "numpy-1.22.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2d487e06ecbf1dc2f18e7efce82ded4f705f4bd0cd02677ffccfb39e5c284c7e"}, - {file = "numpy-1.22.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eb268dbd5cfaffd9448113539e44e2dd1c5ca9ce25576f7c04a5453edc26fa"}, - {file = "numpy-1.22.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37431a77ceb9307c28382c9773da9f306435135fae6b80b62a11c53cfedd8802"}, - {file = "numpy-1.22.4-cp39-cp39-win32.whl", hash = "sha256:cc7f00008eb7d3f2489fca6f334ec19ca63e31371be28fd5dad955b16ec285bd"}, - {file = "numpy-1.22.4-cp39-cp39-win_amd64.whl", hash = "sha256:f0725df166cf4785c0bc4cbfb320203182b1ecd30fee6e541c8752a92df6aa32"}, - {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"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, ] [[package]] @@ -1514,78 +1550,68 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "9.5.0" +version = "10.0.0" description = "Python Imaging Library (Fork)" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" 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"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, + {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, + {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, + {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, + {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, + {file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, + {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, + {file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, + {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, + {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, + {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, ] [package.extras] @@ -1621,30 +1647,30 @@ files = [ [[package]] name = "platformdirs" -version = "3.5.1" +version = "3.9.1" 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-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, - {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, + {file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, + {file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, ] [package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] [package.extras] @@ -1767,14 +1793,14 @@ tests = ["pytest", "pytest-xdist"] [[package]] name = "pymdown-extensions" -version = "10.0.1" +version = "10.1" description = "Extension pack for Python Markdown." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pymdown_extensions-10.0.1-py3-none-any.whl", hash = "sha256:ae66d84013c5d027ce055693e09a4628b67e9dec5bce05727e45b0918e36f274"}, - {file = "pymdown_extensions-10.0.1.tar.gz", hash = "sha256:b44e1093a43b8a975eae17b03c3a77aad4681b3b56fce60ce746dbef1944c8cb"}, + {file = "pymdown_extensions-10.1-py3-none-any.whl", hash = "sha256:ef25dbbae530e8f67575d222b75ff0649b1e841e22c2ae9a20bad9472c2207dc"}, + {file = "pymdown_extensions-10.1.tar.gz", hash = "sha256:508009b211373058debb8247e168de4cbcb91b1bff7b5e961b2c3e864e00b195"}, ] [package.dependencies] @@ -1811,53 +1837,16 @@ files = [ [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" +version = "7.4.0" 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"}, + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, ] [package.dependencies] @@ -1869,7 +1858,7 @@ 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"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "python-dateutil" @@ -1918,14 +1907,14 @@ files = [ [[package]] name = "pywin32-ctypes" -version = "0.2.0" -description = "" +version = "0.2.2" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" 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"}, + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, ] [[package]] @@ -2098,6 +2087,22 @@ files = [ [package.extras] full = ["numpy"] +[[package]] +name = "referencing" +version = "0.29.1" +description = "JSON Referencing + Python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.29.1-py3-none-any.whl", hash = "sha256:d3c8f323ee1480095da44d55917cfb8278d73d6b4d5f677e3e40eb21314ac67f"}, + {file = "referencing-0.29.1.tar.gz", hash = "sha256:90cb53782d550ba28d2166ef3f55731f38397def8832baac5d45235f1995e35e"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.31.0" @@ -2135,6 +2140,113 @@ files = [ [package.dependencies] requests = ">=2.0.1,<3.0.0" +[[package]] +name = "rpds-py" +version = "0.8.11" +description = "Python bindings to Rust's persistent data structures (rpds)" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.8.11-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2708cb3df058446c9aaee8213ad472cbf6be798fa05baf81e2b1b0b67abadfa2"}, + {file = "rpds_py-0.8.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:53467e07da630e31bcbe741616b2a006c11236e63688ad69324b8f71bf035b8b"}, + {file = "rpds_py-0.8.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e9244d1f115f29f14a261b8a03f2d8932a8dc1ff066c5b362df2d56c0e5109"}, + {file = "rpds_py-0.8.11-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e1c542d43857f75209e3f36354ad6846d143cfc0fe71886d661cd9ec5388cdef"}, + {file = "rpds_py-0.8.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9763c409a2aa111fc0f7bb8cda00e2e3bcbac64830f9f529753d635d1ee8d56"}, + {file = "rpds_py-0.8.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f3da48aee9e0e5567a3bd23a5ee5cc9457fb60cf7af2ecb8b64317fedfc95231"}, + {file = "rpds_py-0.8.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af1a820a8046bad8e326db5a829057b2eb601127ee33360056158ef7c437460b"}, + {file = "rpds_py-0.8.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ea3d22795f09e8cd4c4ac5ff2fe50fa32bd01fa2b48ac5d46479082325d40680"}, + {file = "rpds_py-0.8.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:de5ffed29aa4461e269a7567211e730ec20eec0b47a87854639cd69fbe8c3e9f"}, + {file = "rpds_py-0.8.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:96628ba384dc07af9df51d8ee0828ed0118b9229d9a78c1b70198313ec621033"}, + {file = "rpds_py-0.8.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2a7eb90d7df5a1a268cef733d2798dca39cf63dfb2d296356cd0e938e6c2090d"}, + {file = "rpds_py-0.8.11-cp310-none-win32.whl", hash = "sha256:67768f54ee4ff5c6811d505d14d22bc5e98b04743a12ee79637e06caec4cc7db"}, + {file = "rpds_py-0.8.11-cp310-none-win_amd64.whl", hash = "sha256:bb02e326d3e925d2f22c7ea6db495b59cf81b8e0f9f841d72bc0eab7be59a08c"}, + {file = "rpds_py-0.8.11-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:05d7fba86f453e68e8c08b1db6c7462fff8f4773e190b11a2b841b090abf67ff"}, + {file = "rpds_py-0.8.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e47f484e7302c804fb002f8a7b9749e4a51a412449b6a39ca31ff23b889d3fc3"}, + {file = "rpds_py-0.8.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5e71fffd7ef3716d7df4338432dbd60ca2d81ad2830ff97ed4c6aea563f47d3"}, + {file = "rpds_py-0.8.11-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5b3ffee8a0f48cfb6670533463efd0aa529833bfb747e6c7077229e1a253a7c1"}, + {file = "rpds_py-0.8.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07a87f9d4be317d567422553f3a5b54bb068f5c28e7271e04914c011c373b5f6"}, + {file = "rpds_py-0.8.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c755419ba9fbcd87a62837b6388456b3684c5efc41df03ac3f4c42229e84459"}, + {file = "rpds_py-0.8.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a3407643acbcf697309b3b7d346f59d9ba4527a2a02a4fc1417766a2e2af8a"}, + {file = "rpds_py-0.8.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4a7b21de1684a2ebbeb2fbd9b03495a9d7787305e46c6ec42c6340fc647e37d5"}, + {file = "rpds_py-0.8.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c988766c3076ca2360ba7b41ed4df903a810e20e84b58fd00878865558dafe6f"}, + {file = "rpds_py-0.8.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e835aa2c484ac5d8d1b6c2efefbbbf1bbe2f48ed8adec9c42d6f2df2eb07f93d"}, + {file = "rpds_py-0.8.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:99a586d7dbad835352d6c3b6c4ae56c9fdffda800c74d2986513a2c514a35c6c"}, + {file = "rpds_py-0.8.11-cp311-none-win32.whl", hash = "sha256:2ee70fa6b3151e0da19185802e8bacddc8b24d6bdac5e1c85072acae19ec734a"}, + {file = "rpds_py-0.8.11-cp311-none-win_amd64.whl", hash = "sha256:a51d5a83213c05fb975dbdedd4406c165c7657eabe92cb1f9441e881bfd17874"}, + {file = "rpds_py-0.8.11-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:43745fcd13243ba67a4617bfede75bc81c2e990cfac7581b4aa8b7f43ac16b80"}, + {file = "rpds_py-0.8.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5acc515aef399ddcfb59d1e6414f8ae9fc559d8068319cad6e4154d2348ea68"}, + {file = "rpds_py-0.8.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:946c98e168fe2c54335915ed1d82a162257d9943e84af1e8ddc741bdfba78c23"}, + {file = "rpds_py-0.8.11-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96d247ea2a18e2307e3fd0b3860e1bca847df534d7f4cd2fc3525eaa10c71571"}, + {file = "rpds_py-0.8.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e722759a66aa571c801cec3777412f1172380c5d5761637f22d920893d24d194"}, + {file = "rpds_py-0.8.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e0207dc216dc04b70781c84ddaa198caff01ced30307340cc5878f69ef4bb72"}, + {file = "rpds_py-0.8.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee7d4acb2cb1ccda55db9cf2087b7ed3f38175228feddd63a3c334c786e8248"}, + {file = "rpds_py-0.8.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5843b827d48d16e1f0d2c8e93c62a10cda71f509b5a49947bb61fcb19d7abce"}, + {file = "rpds_py-0.8.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1906f35d7becb01b10b1feb0906a7c5d4634dc70ba2ef92e664c6001658d36f0"}, + {file = "rpds_py-0.8.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:33169a32e8996086f5270de1b51c8fc699aefd5d7a0288f747c7ffd72acc6c83"}, + {file = "rpds_py-0.8.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:26da604ae094924ad522a083d90cf030c9578a1b9611cdecd19d689a645d042d"}, + {file = "rpds_py-0.8.11-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:8a40d5a10a7a6ae5c379f9ac099f55eab9dac4dcfed79b34df37ad84137dc6a7"}, + {file = "rpds_py-0.8.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8b3b0ff70afe08d5e7a719e69bc48ae4643fa7301cdab642bddbdf014190b651"}, + {file = "rpds_py-0.8.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddd2fc8b37641d7ac0c6bd085bc6c036b64337a2b7065044c5cc76e74824c36e"}, + {file = "rpds_py-0.8.11-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfb6a285c9a803540dcf3d1d4dfb99420c8ea0cf5fce89bf89abddd79b630252"}, + {file = "rpds_py-0.8.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07a485449b0f4819a6aaa6d8e290841239eed2fff1e3065a45a437da597bdb14"}, + {file = "rpds_py-0.8.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:948ab99c751149a612a3b432d400d5f26819589598eab75e083c3e98858f13b0"}, + {file = "rpds_py-0.8.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a77de26a65ec87b2ec981b9fc50527e43238f0cc840fec3a8ba9789112a77cad"}, + {file = "rpds_py-0.8.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:41b8c08eef01d6183a942567e2069966d53b826abdd3076e4cabd02cf158b338"}, + {file = "rpds_py-0.8.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ae19845478ed4f307560b72608e723b5ea1702cb87c1c1479e372d1787203dda"}, + {file = "rpds_py-0.8.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d744dfc4841022505279a7d33c19247f93570e023c15202b2c32e98f61eeaed3"}, + {file = "rpds_py-0.8.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b27d5267d92b2741d4864a463ad9f1c941aa44b6f8dce420bc620946169a1cac"}, + {file = "rpds_py-0.8.11-cp38-none-win32.whl", hash = "sha256:fde3feff99b8d83708cd828efc0603e7d92e447bf01b30b72448e411645cc8e8"}, + {file = "rpds_py-0.8.11-cp38-none-win_amd64.whl", hash = "sha256:1af977101487862222be5f526cd9921a2070805acedc9b46cf4268d5dc8a915b"}, + {file = "rpds_py-0.8.11-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:b47fa4aa6cb0a7e0a09822e7f362a14afd9786d030e8485b92aa10ad13732e34"}, + {file = "rpds_py-0.8.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0af4dad7ffaa29ca1fd048b667a1b3db46ce1353f01d606b3d03d18649adab5a"}, + {file = "rpds_py-0.8.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acdd9d5f39e12a6519a38609a144ccee67d24a9991f21c64d4f92806503a3e1a"}, + {file = "rpds_py-0.8.11-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb586379ddb3418099fce5949fae1377ecc47139aa34c450d7018ff9a995aeb7"}, + {file = "rpds_py-0.8.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e1a12c4a2dc42c74981b39f35ebf8372dc78281ea7d5ded9ef91ed3e6501bce"}, + {file = "rpds_py-0.8.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f64fdf846e42d77e0dd4dfb90b335f01b2b35aef470b81393c71ce0dd2781eab"}, + {file = "rpds_py-0.8.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83de7177df8d47263494c03670e3b8a8e7b99864c1123c1efb836f6c96755cc"}, + {file = "rpds_py-0.8.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b5546bc4c2c0c0d71859f6db1f150634d481252b40842157aff5a082a5dd999"}, + {file = "rpds_py-0.8.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a1cdb85c001a021634ea326c095cc2cf08a287ae55ad1e9376be5ff6e9ab7e30"}, + {file = "rpds_py-0.8.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3104cd647da83001d608165e0dc0b5747ce8ea12c96d6b83fb2c43fa68135018"}, + {file = "rpds_py-0.8.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:82a9ff8ec847ffba78087dfcc42e78869d7c19f89f91e838d2ad35e70b00a51f"}, + {file = "rpds_py-0.8.11-cp39-none-win32.whl", hash = "sha256:aa9308649feff2acf29057fbc7bc26cfd0482b80060375e12fe2dfae4a6c2eb8"}, + {file = "rpds_py-0.8.11-cp39-none-win_amd64.whl", hash = "sha256:6d59b7f535c6e9ce10fbdb09e31589fa5aba19e867275578087bd1a243b47b56"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0ea0c01d22aae66b4fd3e3ead0abbe6a6bace032441c281687906ab723e7b00a"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47aba4c789842d9e408162d483ba9fa7f681fa996607e935cbdcb3b23b16dab9"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33d8868898bbbf8f6ae28af8659eb6b182ae1599feb3ef47237c6393366fbc9"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c63b4add6cb4dc9d2998ab523c259a30b6f1d28651b39a10e0b128abd05544b4"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4907793f6186df1ed20a828d8315bfd25376924b92bc8bf7ae27548e498bd567"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364f70d9802ef628c13a04a6636e0bbe7f1a58c2560955da17c7117ed1ee8762"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:018b2820e01fe1bbcfb7ecb9d8e42beda2d5e8c68dddb8331085c069496ee7b4"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:96349901b73c0f21e9eee04b0422ca122772d9b7e71afe0535ce464c0fa046cf"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa01d4c2bfb7b6f78d0ac7e5796cdc7dcd93cb74d0f6eefa14f0ce15ffdc287c"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:45cb51ac40c48cdcaaf873a7a7cb9231e3a3f561c5cc4af6e8ab43bf7601c02a"}, + {file = "rpds_py-0.8.11-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:888f166b3feb1a19a1d616fe799ad648d1be85586cb49480e4b65c3f6b217d5a"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:18667ccf333fc615a63203be08262ce58c2bdf135c9c2fa245556f5d20d14028"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:4017d2920e8e3f936e6fc3b65e60a655c690c472901f0ff1a8f62ee21c493f19"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6616eaa330fc925f15bc796efefeb45fb262213422d1274656d062359cf707c0"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:71e47154e72eadd210b204c696b6ab65fd685ea08aabb6e434dc8060220168f3"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be18700d55e63a7cdc9e92a5592196105b8787859f21058f7972989e9c7153a1"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a49829d460f6b089c245de3e69b2b22c5ec783e53e70a4116b8cc3cf490047c"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f177934d33c7b649dc99663642b1a33094af3447e00eb9a1e3eebd9b02ac2158"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d1830d31db000bec0599665349e026614676432c87aeef98cac970254d4e36f"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1b56e340ef68f12566e4094df317b1afc62e93db236916a2c653c1ace0c06d50"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:fa6f798ae72572d35eddd3bed98c91d7c74b218d4ed6ce8d729639dcb7d063af"}, + {file = "rpds_py-0.8.11-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4b40fc5904e8053ac9e4f5b0e9af949bc276098f14a46e992ab072a3d706675a"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:760b994c3ddc68e6c5e750484e4c6a687e5b1c2f73d791834feb1ca6a9efc79c"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b9ece08b4a0df42002ebf9f23e521c74ec924f3d1542254056efc271fe611b91"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ff2b6d317eea667260c7265977575f49116781e4fcc4973360b84aec24644e3"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd817f2d213c6f1ee104f4805812c6e348984769f15404382ab885a9f2a9e56f"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c51adab2bb16850f4bc6ac51c7d753d3f7d08ad6005802bd31e4657873f5c94c"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d9b1a38b5f1346c19b6fc5595998435b0327426a6f54597653eb4fe24f737c6"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c42d44ed2fdf14b5ba3fc1461bc124031de59ee2750642205a55820f81c17ea"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9ec03f7f2c62fd7c8516448ded95c022d83b802a847e1d5c5da30b602f481f5e"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:be73e5592a392fcb255d1e161cdfa4e78e0f9d3a9da6d9cf1cb3a2e11d110763"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:38208701e09e77c1158b1538c687c5b0a6a894a689bbd1f6eafc5cd31a7cd59d"}, + {file = "rpds_py-0.8.11-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:444ea661de45cf0334131904d717254462d8c974d551caac795f4232920bdb47"}, + {file = "rpds_py-0.8.11.tar.gz", hash = "sha256:ef29fa64514a17bbc104693acf094e3fef5e98c2ddf58e9777f673fc6b0c5e97"}, +] + [[package]] name = "scipy" version = "1.8.1" @@ -2226,23 +2338,6 @@ files = [ cryptography = ">=2.0" jeepney = ">=0.6" -[[package]] -name = "setuptools" -version = "67.8.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, - {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, -] - -[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-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-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "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" @@ -2361,26 +2456,26 @@ files = [ [[package]] name = "trove-classifiers" -version = "2023.5.24" +version = "2023.7.6" description = "Canonical source for classifiers on PyPI (pypi.org)." category = "main" optional = false python-versions = "*" files = [ - {file = "trove-classifiers-2023.5.24.tar.gz", hash = "sha256:fd5a1546283be941f47540a135bdeae8fb261380a6a204d9c18012f2a1b0ceae"}, - {file = "trove_classifiers-2023.5.24-py3-none-any.whl", hash = "sha256:d9d7ae14fb90bf3d50bef99c3941b176b5326509e6e9037e622562d6352629d0"}, + {file = "trove-classifiers-2023.7.6.tar.gz", hash = "sha256:8a8e168b51d20fed607043831d37632bb50919d1c80a64e0f1393744691a8b22"}, + {file = "trove_classifiers-2023.7.6-py3-none-any.whl", hash = "sha256:b420d5aa048ee7c456233a49203f7d58d1736af4a6cde637657d78c13ab7969b"}, ] [[package]] name = "typing-extensions" -version = "4.6.3" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, - {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] @@ -2402,24 +2497,24 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.23.0" +version = "20.24.0" description = "Virtual Python Environment builder" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, - {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, + {file = "virtualenv-20.24.0-py3-none-any.whl", hash = "sha256:18d1b37fc75cc2670625702d76849a91ebd383768b4e91382a8d51be3246049e"}, + {file = "virtualenv-20.24.0.tar.gz", hash = "sha256:e2a7cef9da880d693b933db7654367754f14e20650dc60e8ee7385571f8593a3"}, ] [package.dependencies] distlib = ">=0.3.6,<1" -filelock = ">=3.11,<4" -platformdirs = ">=3.2,<4" +filelock = ">=3.12,<4" +platformdirs = ">=3.5.1,<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)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] [[package]] name = "watchdog" @@ -2490,19 +2585,19 @@ test = ["pytest (>=6.0.0)"] [[package]] name = "wildboottest" -version = "0.1.10" +version = "0.1.17" description = "Wild Cluster Bootstrap Inference for Linear Models in Python" category = "main" optional = false -python-versions = ">=3.7,<3.11" +python-versions = ">=3.8,<3.11" files = [ - {file = "wildboottest-0.1.10-py3-none-any.whl", hash = "sha256:b7aad4fe357af49bd130491ce9332bceac9c0e47b0d467a93b0e125d1c659853"}, - {file = "wildboottest-0.1.10.tar.gz", hash = "sha256:c2f2653ecf588768b4946f1127d22bb39d8cf68b4f288cf92b8b0e46ec34f7ed"}, + {file = "wildboottest-0.1.17-py3-none-any.whl", hash = "sha256:2d1781cb04e3bda911833f1baff568c8578edcc880e3e49c81f8a0c955fd9230"}, + {file = "wildboottest-0.1.17.tar.gz", hash = "sha256:eb4b839433b249fe8e4b0683fd5674e63979ee0fd53769376ad37cc9771a4610"}, ] [package.dependencies] -numba = ">=0.55,<0.56" -numpy = ">=1.18,<2.0" +numba = ">=0.55" +numpy = ">=1.18" pandas = ">=1.4,<2.0" poetry = ">=1.4.2,<2.0.0" pytest = ">=7.2.0,<8.0.0" @@ -2681,19 +2776,19 @@ cffi = ">=1.0" [[package]] name = "zipp" -version = "3.15.0" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] [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)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" diff --git a/pyproject.toml b/pyproject.toml index 4e0cda79..6eabc41e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pyfixest" -version = "0.6.4" +version = "0.7.0" description = "Experimental draft package for high dimensional fixed effect estimation. Supports OLS and IV estimation." authors = ["Alexander Fischer "] From cf99b1d6b96cb242e1b326360e9b2ab0523bc995 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Mon, 17 Jul 2023 18:14:43 +0200 Subject: [PATCH 06/13] minor cleanups --- pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 32707 -> 32531 bytes pyfixest/fixest.py | 25 +++----------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/pyfixest/__pycache__/fixest.cpython-310.pyc b/pyfixest/__pycache__/fixest.cpython-310.pyc index 0316331d22a4020ffc5c1c76776f6a2635bc6d8f..3c141f0888b1f7b9389705ea68a7d6386e37ec19 100644 GIT binary patch delta 3103 zcma)8du)@}75DjGe#D8Lr(=geLedm34GHalv|5-(+t5%JRuOH)P4K*YcIL#f!}S*k z^qQ~+2`X&@amNZRtPWEPUB*`Wjh40RHp&KT$J&i)Rb@>pRO+;D(4zjaPMroj=bA?* zb@#$+Iu0mO+wAACkzoxIBF!vulUgk8)+_=^8yBELg2D{1d!2_n6 zb6O$p7*V(ru?9cSv^Jn|N3<^ILY#+RJ$K~ibA=l-3OJBnFyo+gq=6kn)Y&ns(cbHP zrxX_2tXczcsAd-2q9@QU9t||ZYH=j6LRB@@z7jYI@FVeTa1$IC4WU^$As7`atci@M!YgHAFVQI z1#(MGbpqH?q{@mE_mBAG&S|>7rR4nBH{XaKQ>;YFFR3b|D$$oR#jB@u2G6S#B1%?f~8t{0Xq76KT#XDH88-TW-G*z zCI(d^)O;T5#pUK}&?zq8_IVf-cedQAHKU3cYUypPV<999h8Z8<6k`Q_D1!^@Cl3!3 z42UZ&vw?y)9g8N@W_&W5wHT{JNmyZD6{l}+DtQezS&rbU79Zc<1&Ua@s97mf?7>AF zoS`vtvYudspq*fpASM3Tz8sRGwByT5Hxpx$U<&~SE>xv5nbC>ys2LxN$I@{#YR0S> z+m51$+P^-+a${^aN6hYZdDr}N2RdA4w0^GS&%4M z#CM5$O4N3BK#kqgby|bGC|$Ybjw8q~s4Sjk-K6mhZ51;i&#DMj#6ODAVL!j}Lj_Xe z@cqqxVz3s1ZxS35Z{6SImq#z_B|q$#aCa|;b#`a>SHO@4rnuN&X=p>4c!G-`u37@N zxUlM~ae}m^OjEM)9pYaPw48}vN z`kV;z*ndqTx+P(^yllmUr6-y78zg^|fb8eQ_qeFPRK;2Q3+vA43tvHb#7*5xX07B< zSS!xeAIR(_f}e_Te_L&V)ciEqo0BQ?YnhB?#qrvHU!?nkm9r=e`-`_8Rx+{``}!9w z`T^N@6VQ6nK7m0X&-!_yULZJ0@G=3_QqU8rOw20i*2H)! z&fX>d>jb|ep@wy**gLd;kD&6up~@jP4+h<;tI1`#BCc_9V6eVfj)&fMh30@@lEkPckkG(Ep<|JGYAI1Z)PJCqEJ1B>|3x)5S2zc@z;UXsqFGGxt z#u*!uf{3% zDsQtqqKGk+NhhMI>+6K<$DH2FH;nF58>W=qj)b?uqlot59K2>98@{ZGtzTuKGFzzbf55r0S%gOjy(Ba5k@9Vcswh=(*u^mhp4(_#^IYmj6yPayA4 z;)RJ;ctWh7thcXCTn7C2b$Rn0a9D&U>y3k`@K05AO@`p0y?zpZA?xCkt!+?gFM4Dc z;4XU)4*^^fv$;t4J`MA8p@G+DG0NeRSiEg9{6h?GJH9eW u3_1LNA?mLL)M2JmbM7LFN@SEMqh#0;f;Iy3&MM_4ADX%w=8Hp9E&l<{%`X@L delta 3280 zcma)8du&tJ8NcWH`ufIp94B#b?7V^IEpAcWRwA3xZ-#Paa`u9$r_PJD_2c}N=*1?zGX*a56 zJU7`!!j!YTmYYYS{YElw$5?`*2CApq?v_GX6md= zAj-_5SqaDC#q365ELK(<_#W;&S0V0%X7kTgwTuFN=@3*xvkimt%sDV7EvD(wbz&1m3B ztdc1v!>$p_!#uh(C^2_Xvb@4N74VP#m!G}hs_%9)>$?F5#r5EYa|mX#u*L!j{i z9}s*1_&`R6ssgw)Mi};r#42zUi&g)?~RLJ+BU%ZPj75`dqD6CGb_q!)2&0 zN>fC_+91?=R&!lhdtIu4u-aVM3Ji9ACJsfU5SYgX^s*VZ?$^urN~{XYf+Xr0c(MR< zVX~~A)g-msq)0_#sUk`ChxJR9a=IG2zd$;BqyKU&+_R7p-rh(_GoNjIowRea=@YVv zo6T#~CNQJh_~XrA z4zSLa*It&%D8I74$&UnWK{$Z$FmKt==odX9>cu$pQQp6yoh0r38*V46a4>jRf2FDn zWsT&0{8~>JJm8(*xTZdd)RSbI%`JUG>7b05h#Ml|7R%8A{^m=h&J+%q5=PlIBiA15cC|D=yHlEPulI9-;jIG zA^*SDq`yNg28lT5Eh0|-_o#XaRV6gcKZsUVy^72q5yY}LR&;B)shE1fzJJS$&c)Ax zQLF^F46bi#D54ab>Cfo)**{P1ArodxAgL7xJA1WyD{6 zA;?<(eqTdd0bNfa^dN|SaSf%%^6&t}H1v;SGvVs=8Q6-2OqLcr!MI7W;~`Uq|uzjv#bwDQASJJ#NbrZNq}5Cxa#(fU_7iBbXs^tqtUBag(V zyempyhiNbU6W0dn;HhXCSUj~2t;8KZgi<%cR}ktER0MIrHcC$+oI!X70c$BZlj&^2 zEI7@vT-u=TApbJLYp7J9?lgT9=YL12{44|{er_OCQm!>>6Ix8$!7mKdHHoGW=l6M? zQEUo(>EL#Cq0ozdcmm@-jqnNrHexS*nV%k-AaC(CMvx@=T7BK1=S09fbD~E+F6zQx!MoODJK96ceSG4DCW_L%`^?Qe1L-&kEATFYRgh4<#dCnE(I) diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index 8a2a30c9..38edd8f9 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -143,23 +143,9 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc self.ivars, self.drop_ref = _clean_ivars(self.ivars, self.data) - # dropped_data_dict and demeaned_data_dict are - # dictionaries with keys for each fixed effects combination and - # has values of lists of demeaned dataframes - # the list is a singelton list unless split sample estimation is used - # e.g it looks like this (without split estimation): - # {'fe1': [demeaned_data_df], 'fe1+fe2': [demeaned_data_df]} - # and like this (with split estimation): - # {'fe1': [demeaned_data_df1, demeaned_data_df2], 'fe1+fe2': [demeaned_data_df1, demeaned_data_df2]} - # the lists are sorted in the order of the split variable - - 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 # currently no fsplit allowed fsplit = None @@ -233,10 +219,6 @@ def _model_matrix_fixest(self, depvar, covar, fval): z_names: names of all covariates, minus the endogeneous variables, plus the instruments. None if no IV. ''' - depvar_list = depvar.split("+") - covar_list = covar.split("+") - fval_list = fval.split("+") - if fval != "0": fe, fe_na = self._clean_fe(self.data, fval) fe_na = list(fe_na[fe_na == True]) @@ -287,6 +269,7 @@ def _model_matrix_fixest(self, depvar, covar, fval): y_names = list(Y.columns) x_names = list(X.columns) yxz_names = list(y_names) + list(x_names) + if self.is_iv: iv_names = list(I.columns) x_names_copy = x_names.copy() @@ -313,7 +296,6 @@ def _model_matrix_fixest(self, depvar, covar, fval): na_index = (na_index + fe_na) fe = fe.drop(na_index, axis=0) # drop intercept - intercept_index = x_names.index("Intercept") X = X.drop('Intercept', axis = 1) x_names.remove("Intercept") yxz_names.remove("Intercept") @@ -449,15 +431,14 @@ def _estimate_all_models2(self, vcov, fixef_keys): # index: na_index_str lookup_demeaned_data = dict() - # loop over both dict2fe and dict2fe_iv (if the latter is not None) + # loop over both dictfe and dictfe_iv (if the latter is not None) for depvar in dict2fe.keys(): - # [(0, 'X1+X2'), (1, ['X1+X3'])] + for _, covar in enumerate(dict2fe.get(depvar)): if self.method == "feols": - # get Y, X, Z, fe, NA indices for model Y, X, I, fe, na_index, fe_na, na_index_str, z_names = self._model_matrix_fixest(depvar, covar, fval) From 3b54b473e48a756a21ac608317000dac9e04e11c Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Mon, 17 Jul 2023 22:02:50 +0200 Subject: [PATCH 07/13] add new fml_dict method --- pyfixest/FormulaParser.py | 78 ++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/pyfixest/FormulaParser.py b/pyfixest/FormulaParser.py index 1d348d95..9d6421d2 100644 --- a/pyfixest/FormulaParser.py +++ b/pyfixest/FormulaParser.py @@ -50,7 +50,7 @@ def __init__(self, fml): # Split the formula string into its components fml_split = fml.split('|') depvars, covars = fml_split[0].split("~") - + if len(fml_split) == 1: fevars = "0" endogvars = None @@ -60,19 +60,19 @@ def __init__(self, fml): fevars = "0" endogvars, instruments = fml_split[1].split("~") # add endogeneous variable to "covars" - yes, bad naming - - - # check if any of the instruments or endogeneous variables are also specified + + + # check if any of the instruments or endogeneous variables are also specified # as covariates if any(element in covars.split("+") for element in endogvars.split("+")): raise ValueError("Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed.") - + if any(element in covars.split("+") for element in instruments.split("+")): raise ValueError("Instruments are specified as covariates in the first part of the three-part formula. This is not allowed.") - - if covars == "1": + + if covars == "1": covars = endogvars - else: + else: covars = endogvars + "+" + covars else: fevars = fml_split[1] @@ -82,18 +82,18 @@ def __init__(self, fml): fevars = fml_split[1] endogvars, instruments = fml_split[2].split("~") - # check if any of the instruments or endogeneous variables are also specified + # check if any of the instruments or endogeneous variables are also specified # as covariates if any(element in covars.split("+") for element in endogvars.split("+")): raise ValueError("Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed.") - + if any(element in covars.split("+") for element in instruments.split("+")): raise ValueError("Instruments are specified as covariates in the first part of the three-part formula. This is not allowed.") # add endogeneous variable to "covars" - yes, bad naming - if covars == "1": + if covars == "1": covars = endogvars - else: + else: covars = endogvars + "+" + covars if endogvars is not None: @@ -112,6 +112,7 @@ def __init__(self, fml): self.endogvars = endogvars self.instruments = instruments + # clean instruments if instruments is not None: self.is_iv = True # all rhs variables for the first stage (endog variable replaced with instrument) @@ -124,7 +125,8 @@ def __init__(self, fml): self.is_iv = False self.covars_first_stage = None self.depvars_first_stage = None - + + # parse i() syntax if self.covars.get("i") is not None: self.ivars = dict() i_split = self.covars.get("i")[-1].split("=") @@ -145,16 +147,34 @@ 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) - if instruments is not None: + if instruments is not None: self.covars_first_stage_fml = _pack_to_fml(self.covars_first_stage) - else: + else: self.covars_first_stage_fml = None - #if "^" in self.covars: - # raise CovariateInteractionError("Please use 'i()' or ':' syntax to interact covariates.") + + def get_new_fml_dict(self, iv = False): + + fml_dict = dict() + + for fevar in self.fevars_fml: + res = dict() + for depvar in self.depvars: + res[depvar] = [] + if iv: + for covar in self.covars_first_stage_fml: + res[depvar].append(depvar + '~' + covar) + else: + for covar in self.covars_fml: + res[depvar].append(depvar + '~' + covar) + fml_dict[fevar] = res + + if iv: + self.fml_dict_new_iv = fml_dict + else: + self.fml_dict_new = fml_dict - #for x in ["i", ":"]: - # if x in self.fevars: - # raise FixedEffectInteractionError("Interacting fixed effects via", x, " is not allowed. Please use '^' to interact fixed effects.") + + @@ -318,14 +338,14 @@ def _unpack_fml(x): # Check if this variable contains a switch varlist, sw_type = _find_sw(var) - + # If there's no switch, just add the variable to the list if sw_type is None: if _is_varying_slopes(var): varlist, sw_type = _transform_varying_slopes(var) - for x in varlist.split("+"): + for x in varlist.split("+"): res_s['constant'].append(x) - else: + else: res_s['constant'].append(varlist) # If there'_ a switch, unpack it and add it to the list @@ -333,7 +353,7 @@ def _unpack_fml(x): if sw_type in ['sw', 'sw0', 'csw', 'csw0', 'i']: _check_duplicate_key(res_s, sw_type) res_s[sw_type] = varlist - elif sw_type == "varying_slopes": + elif sw_type == "varying_slopes": res_s[sw_type] = varlist else: raise ValueError("Unsupported switch type") @@ -530,17 +550,17 @@ def _check_duplicate_key(my_dict, key): raise DuplicateKeyError("Duplicate key found: " + key + ". Multiple estimation syntax can only be used once on the rhs of the two-sided formula.") else: None - - -def _is_varying_slopes(x): - + + +def _is_varying_slopes(x): + pattern = r'\[.*\]' match = re.search(pattern, x) if match: return True else: return False - + def _transform_varying_slopes(x): parts = x.split('[') a = parts[0] From a394d3f3ee8f12e8a871d41b41fcb83d7250b65f Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Mon, 17 Jul 2023 23:00:03 +0200 Subject: [PATCH 08/13] first attempt at more streamlied formula parsing --- pyfixest/FormulaParser.py | 131 +++--------------- .../__pycache__/FormulaParser.cpython-310.pyc | Bin 14525 -> 14907 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 32531 -> 32474 bytes pyfixest/fixest.py | 45 +++--- 4 files changed, 39 insertions(+), 137 deletions(-) diff --git a/pyfixest/FormulaParser.py b/pyfixest/FormulaParser.py index 9d6421d2..a52f45f1 100644 --- a/pyfixest/FormulaParser.py +++ b/pyfixest/FormulaParser.py @@ -125,7 +125,7 @@ def __init__(self, fml): self.is_iv = False self.covars_first_stage = None self.depvars_first_stage = None - + # parse i() syntax if self.covars.get("i") is not None: self.ivars = dict() @@ -151,134 +151,47 @@ def __init__(self, fml): self.covars_first_stage_fml = _pack_to_fml(self.covars_first_stage) else: self.covars_first_stage_fml = None - - def get_new_fml_dict(self, iv = False): - - fml_dict = dict() - - for fevar in self.fevars_fml: - res = dict() - for depvar in self.depvars: - res[depvar] = [] - if iv: - for covar in self.covars_first_stage_fml: - res[depvar].append(depvar + '~' + covar) - else: - for covar in self.covars_fml: - res[depvar].append(depvar + '~' + covar) - fml_dict[fevar] = res - - if iv: - self.fml_dict_new_iv = fml_dict - else: - self.fml_dict_new = fml_dict - - - + def get_new_fml_dict(self, iv = False): + ''' + Get a nested dictionary of all formulas. + Parameters: + iv: bool (default: False) + If True, the formulas for the first stage are returned. Otherwise, the formulas for the second stage are returned. + Returns: + fml_dict: dict + A nested dictionary of all formulas. The dictionary has the following structure: first, a dictionary with the + fixed effects combinations as keys. Then, for each fixed effect combination, a dictionary with the dependent variables + as keys. Finally, for each dependent variable, a list of formulas as values. - def get_fml_dict(self, iv = False): + Here is an example: + fml = Y1 + Y2 ~ X1 + X2 | FE1 + FE2 is transformed into: {"FE1 + FE2": {"Y1": "Y2 ~X1+X2", "Y2":"X1+X2"}} - """ - 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. - """ + ''' fml_dict = dict() + for fevar in self.fevars_fml: - res = [] + res = dict() for depvar in self.depvars: + res[depvar] = [] if iv: for covar in self.covars_first_stage_fml: - res.append(depvar + '~' + covar) + res[depvar].append(depvar + '~' + covar) else: for covar in self.covars_fml: - res.append(depvar + '~' + covar) + res[depvar].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, iv = False): - - fml_dict2 = dict() - - 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 - else: - self.fml_dict2 = fml_dict2 - - - - 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. - - """ - 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 + self.fml_dict_new_iv = fml_dict else: - self.var_dict = var_dict + self.fml_dict_new = fml_dict def _unpack_fml(x): diff --git a/pyfixest/__pycache__/FormulaParser.cpython-310.pyc b/pyfixest/__pycache__/FormulaParser.cpython-310.pyc index c141c45e2908bdda43f216d1d5a2a0073e234d51..42f5529023d885ea41bc78f5be8b60a3c93fac11 100644 GIT binary patch delta 1198 zcmaJ>&uesaWk9X;si1_ z6sV&d8hYrhjMQGLsuco>Q-!vb`a?Z&?5(|7{Rfb^RlOk8_PuqDdg`w9?f1U<-j5lN z{PWgN4d-eiVKaOR_rH^OijSNnKKmwyJ}ZG_B`%?4NG^?CRua;Y5ozv1DS|92Eo3IL zn6!~ak#)&9GD{}rnb#dW;KT8xVS>#ah~sO4$xSe!$Iwrmg`Ll^OM`vHwt17i4=363 z#I_N}0%MMGemkmWLqYdoyCBaP08k2$fCp^@-xcC@$_Qv&`9^%My)KXtBvxe|3SHWqZR+J@Gz>5 zqqD_v!RjpNd%gJucinHNbkr}Qv+w4wkxZR8;#EXrrCL6XEVv zm@rRSCv_o{gTM4#W(H#V)672iG|6uhoF#Zi|Cq@O`$Kzg@Fc@yFr}Xku0S@J8@g>C zKTnPUgl90R7V#Uls#e~s`Km-~3j`Ms&Zw6VJs!GL>2CfkNL|do45#$9d>X#dpXB}5 zCAlpEpJ44p7$dfh@CfiX;Yd$D&cTX)Fnl_)giF8ZKZZS63bIGPgj9{Z=MY+^ zf3x9lN>wCfO8+);xS!}V8ZnMU^jLUZT!?c4su*OC{RwV(9$~xo?0R5qH(N$?5;s+M zkhlpKEN)?*;NrO|>&Ihr?j|m@%(`DutCu}Pt?1nNV0szF0;SRaf#7kxo%nLKte3{G zr!Jz1M?_bp6;=MVT4mMuBAEJQ{Mi0WsE&40>0-O!AS%+mgraupik_YrNYeh>JESQU m^;DPit%+B1dy!hq<*wlxj$k`%$Lg`(wHB?zR=?F3kNpG6HVRAt delta 854 zcmX|9O-vI}5Z-y+F0ZBCY%rxjp(4s*Ln+k)QX*n78We1e$WIG~7Iu*;3ceyyLgIy! z*EwMbiP576%_d%qp7dbi&5P+-4@OTWdN3ZGDdKMOy>Di|H}9L>_iFw19dk7t4r=r~ z`?2L@b1%#}ajKs}S1W*{6@&u?pCcUKwpP%ckmGlZZ7BGO)j5)wK`h_|iPbsv6Pg|N zo{Qt5h%g{1ObF2{!Jx>127$lKY44kr(0i*!X>HBD?I=E}TEBE_W!@<-uFsb@s`4PP z>r{rTqP(GoiQsvw3r8bic;Zb(mY~ZPS!Ge)4yZIO>NJb>o9_LJI>B)h!w|zTer`Nw zoMAeOW^@qVc^9H79jdq)i|^-in2NLoHcG1I<14<6odt=qHC}&?w_RkojQy=$y7nOG z^W0VufFWG&EQ0jjcWxS)E3D`s_zi<!%1#IW!`3@}?H*ac0i2qI0~j5|}a$K6FJp-9?(mORB& zG7sbUFqvw0STMriGSu4i5xeGnOvZJKE$@4*xxI>zZihMSNRRqwsPqz7(>Ba_JLx@W zT4wDyLDg{Yt@Cdjii_y+4D1UkP$ zN>v3bhPle`vb8l#YfasO5%~| gAq)?i@fONS%@UT+@|koaDe37 zq~|sr;z$u%g`-rojEU$dNC$B#ASf1jI|$+*4(y=7C`bVrMw!upf${s!Hl@?S8QZzP z{l4G#oyR@rd)$c6N$xXJkPZaAF8H_M-qZB8`yMPPHHaqajhcmjuqoGk)q)Fu z6V>bppw5oiHQ5>W8v#-)qGgx#7Vfv~;gmHsJUX5nrtuLw>R*(Q&Y6o^G`J{9_xO!D z-y)IyPnkuQt$|}ISZ@%6n5vRwPfJad1Ls&0f3-2K7MPp?b=@spRC0?^T85`e6W9uImhblYC29d4Y z)76i@7fo~}a4*1=-xZ-Be#7)CjxgP3i{847(h!t=Jy!2F9~M<_O5%MY#g*^A?x1pXV<0MZ4ppo_R0# z!EBz8i^JpiQwsMue%r_WM@fQU6gUApiZfelb~lCV=C z733vem=Xn_1{q& zo`u(==9u;^!VJ5V7H~70+)Wg1nd-)O$>EG+dY#QdkzW zLRhMd7A|0dlr2iIEgi;p@QOu-htEqvm`h)MZn7Xw#`SYr;kkkR@E%{VMYL$%ON(iV zc(HaVDb0RZyH*S3$RHzdr=O6+`2g$23*IF@I#eNc)vqKy!l_@PV{lc9h5FljFbE@R z&YQ7g%+5^3?HgDGsGMn~s8k~g+l&Os+)G#`Ncs3WAEWicZg}0;frcIoOrNKFzm>8M zPO$ash26N}%4^Y7j?jXz8zATDjoGn278|!%6Ot>CR3Rhtv8iT2+J*)U&zv4lQR|@G z7h5HirU>a0E1Q=2u0fAMgs2#78qnEwAd8}YF(!K`gl2d=@U5Dp^X z^10GvIz2WyF-)y-E0(h8FooA+vtWvMi&W9W?1H`R_;Wx~KfH;AYsFGMcU&Dh7BbQD#1zQc4oX1K{LjJ^TE1zADHRpMqHb*%1U8|HskEjqMQn8v8c#GAX}E6U>lYczAp=X~#!I@tTratPu9q)7L6C`yB_Zm@&U@*o#lDF=L&}TYH5pG? zF~%~;eo4l$X*5I;Fw2;OFoSRi0k`63x1)Fmf)MSUk;V=X?}jtZBtbBP#R@cOVrYJ~ zT=BwxlN2bms+jKVGyRI9nws)J_PI`jgz+*4`XdJG#JR9KFnQLk;+?K`eGTYE+3K~; zYUoZ7!R>DJkhLz1QmeSG`*Kp3y{r2PjqDP8HZ}P!G~TkQ!N{Mq$Zl$ZCj8c>I&yhd z>A6`6;>!K9oXfBfclPdYxL_>KF7HzA>8Gg5i@Q}U-BRo8J#QWq+qbMEd$UKkOcL^S z@p)f6`Gr_@#pmQ9@n&Czrev(+V#n4tAP;T*cb@d?Hbjhl7gQ$ps5r5$8H`VDdpmCo z7!x&b7j|J;5;ZGIBhJcICCgr^Wr0p!ehW;i~POxqDJOC#GQ9_sHV zXT%5n6+RhE=*FJG4&v6O=c#P#m9HwPXORD2^Rj2r`ZPd9XYv56o3`4)@mTmnz(Cl4=vj`s`e98Wf zsK9>+#z`_=q=>=>}R955waosjT@?z5^O0sEd`&Aa7g8#u!wjxaVfb& zyq~BdYSumW1FiW};2{Ulm+eH5gd*%RSo!o}cEM2yE*(iN4LqeV_8tNNv=u12^_ zs1vL8b`XCex+iv!c5!rq4(vr!H^LCWj9SO*SRJZM0pP&5pM^KT|eh34-Wo!C~@URd`L`9e9EJH`q9S(A3ykb(JLU=?(grDRU*>Nj)IlF z2awa@%VlC(-cHn*h^1&OldpW<@tBQ~m5lFW&|F;XV{yuPc-@;Q{te+B1Pl*`ug36l g7#<<}9>Pfk+&{x@%N?*1Y$+mpcr95W{&BeJziO}`EdT%j delta 4315 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 Date: Tue, 18 Jul 2023 12:14:01 +0200 Subject: [PATCH 09/13] rename (some) exceptions --- pyfixest/FormulaParser.py | 29 +++-------- .../__pycache__/FormulaParser.cpython-310.pyc | Bin 14907 -> 12618 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1715 bytes pyfixest/__pycache__/feols.cpython-310.pyc | Bin 17257 -> 17362 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 32474 -> 32402 bytes pyfixest/exceptions.py | 35 +++++++++++++ pyfixest/feols.py | 15 +++--- pyfixest/fixest.py | 15 +++--- .../test_errors.cpython-310-pytest-7.3.1.pyc | Bin 3842 -> 4021 bytes tests/test_errors.py | 46 ++++++++++-------- 10 files changed, 84 insertions(+), 56 deletions(-) create mode 100644 pyfixest/__pycache__/exceptions.cpython-310.pyc create mode 100644 pyfixest/exceptions.py diff --git a/pyfixest/FormulaParser.py b/pyfixest/FormulaParser.py index a52f45f1..453fd63a 100644 --- a/pyfixest/FormulaParser.py +++ b/pyfixest/FormulaParser.py @@ -1,14 +1,5 @@ import re - -class FixedEffectInteractionError(Exception): - pass - -class CovariateInteractionError(Exception): - pass - -class DuplicateKeyError(Exception): - pass - +from pyfixest.exceptions import DuplicateKeyError, EndogVarsAsCovarsError, InstrumentsAsCovarsError, UnderDeterminedIVError, UnsupportedMultipleEstimationSyntax class FixestFormulaParser: @@ -40,6 +31,7 @@ def __init__(self, fml): Returns: None + """ #fml =' Y + Y2 ~ i(X1, X2) |csw0(X3, X4)' @@ -65,10 +57,10 @@ def __init__(self, fml): # check if any of the instruments or endogeneous variables are also specified # as covariates if any(element in covars.split("+") for element in endogvars.split("+")): - raise ValueError("Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed.") + raise EndogVarsAsCovarsError("Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed.") if any(element in covars.split("+") for element in instruments.split("+")): - raise ValueError("Instruments are specified as covariates in the first part of the three-part formula. This is not allowed.") + raise InstrumentsAsCovarsError("Instruments are specified as covariates in the first part of the three-part formula. This is not allowed.") if covars == "1": covars = endogvars @@ -85,10 +77,10 @@ def __init__(self, fml): # check if any of the instruments or endogeneous variables are also specified # as covariates if any(element in covars.split("+") for element in endogvars.split("+")): - raise ValueError("Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed.") + raise EndogVarsAsCovarsError("Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed.") if any(element in covars.split("+") for element in instruments.split("+")): - raise ValueError("Instruments are specified as covariates in the first part of the three-part formula. This is not allowed.") + raise InstrumentsAsCovarsError("Instruments are specified as covariates in the first part of the three-part formula. This is not allowed.") # add endogeneous variable to "covars" - yes, bad naming if covars == "1": @@ -98,9 +90,7 @@ def __init__(self, fml): 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.") + raise UnderDeterminedIVError("The IV system is underdetermined. Only fully determined systems are allowed. Please provide as many instruments as endogenous variables.") else: pass @@ -169,9 +159,6 @@ def get_new_fml_dict(self, iv = False): Here is an example: fml = Y1 + Y2 ~ X1 + X2 | FE1 + FE2 is transformed into: {"FE1 + FE2": {"Y1": "Y2 ~X1+X2", "Y2":"X1+X2"}} - - - ''' fml_dict = dict() @@ -269,7 +256,7 @@ def _unpack_fml(x): elif sw_type == "varying_slopes": res_s[sw_type] = varlist else: - raise ValueError("Unsupported switch type") + raise UnsupportedMultipleEstimationSyntax("Unsupported switch type") # Sort the list by type (strings first, then lists) #res_s.sort(key=lambda x: 0 if isinstance(x, str) else 1) diff --git a/pyfixest/__pycache__/FormulaParser.cpython-310.pyc b/pyfixest/__pycache__/FormulaParser.cpython-310.pyc index 42f5529023d885ea41bc78f5be8b60a3c93fac11..6091e641676cb117e4ac4f4a15a99cacce537209 100644 GIT binary patch delta 2972 zcma)8&2JmW72jDdcbA_cC0So~-3==yVk}XX1lN%w%Q0-pwrtC7Y&kL0biL*brH#oY zF}t)Sm#T`&L49Zd$Acb%0D*mJV4#Np0*U}V_0j;jv_R3K*h4Qpg=M@^E+5?4ZJ8H?GQK~;sN+va^2{J}wG!8OO6Eq1jK~pph zGD&-A24sq6X)nk$CD)Wf-&aUur4S9X=eC=Ts#|sfc8P5+a$e`*z@kU%Yd0M3pYhMu z?}BWv4_);9fH!N*3l3-oRz1r2ITkQpb3H~c-e`M#Z`JdgjYgdZj9zJ01GiCSi+)cF zhf3Rb%K*L6GM=Pc(Whiyp@}C-%aAd9Ad>Q4kBpU(v9ex_9y*Th)Bwy#%z{zuNiQ9E zN?vU7dDT1EQe7u(B23@7-R*6*@4lcyQBOu{}N5qIG{O z2D*scyFWODdP#9Wj^lDX*gfujxtfuyL)6GzQ=}sdA-Ti%|1J*2{vy7LJtWV>3|UBq zvH3OTv5f{_cwPJ=zCbeK5AnwnX}B!jgOEk&Ll{69LKsFE0a(DnVex+A(eZETaaDQ% zh=s(+x83H=_BOvvetc>;)ZVMR9`A*vFj8e+7;(H!9zhEYA&LrvvIZ7)n6R5(!ztgf zE43;g6i#ZHl*DgRAFhs~?aK(SAdDd#11K4;?L)T&VT7|vDds{LyXrzy$dk();PFG# zwq4H+Y#Z182LS1ec$_{<)ZM?PH6kk6%y0o{#jO{A=UHGmmdAW(6!BrSKV9dwX4UbF zacLrccC>%HW9#0Xvu@YxRcnm0iUVCWXDvBZpB1{%I+hnJ)^*-w<5sZFtjdd!IA|}p z+z%{2aMqaRaAt89G&wYH(Ygxu{GRLom*=SCcU^r}u6y)<_=>mszWWNK)2412cp-j+ z)tP@*TG67p?2-%o~^VnNwbe_;yy9#-9EUXi&UfH_`h;Y}bHd*JAJGX}N0)q>2;Q*e+Hk=wfn{#{T z&hE2>TwA9s@oDTk+h`wf$Mf-~AtSCA)aR_9W`4ZcbZ2eS7NI z+taymoaE+m?b+5=cN>nMs+EGtCqVKk1lbqUFbZ|2feGQqand6%TnuN1epE2{3@)ke z-O%jRK`B~ckO^!WKh)dZ7e>qYWob7~_uU9HYb>xmb`M)p*3e^!=34-IulOKyPG2dI zrGhRrGI}~RY@620w#~l}dVU%~M%n}U78#(x?)OaqQ_&)3HhrHPyLXP1O?c7%IGQI% z#Xmc~kLhW&PVox$@!J6}i}iizuDCqI4Yz#e(9|6CDY=8Gi1`>*`6 zK6?&>9R+w!=J;sRi_c?;LH#!tmW4jSUPu47{u++1cc(Hft1!JxAT25khH!r*)8>{Gzn-|f zki@xUA~(Sx1vQL8>-zy-P?+qTNWP$5CLBXw7srd^y|Q+YdKiVuTw^>ZyyA!+YDiUl zP<+`!uR?_10MS0sTR4&oCt;Kle=agIxjQ@gd1MOH*v^~GpyZ3WSSdt8m9x;OxE_UO zlplbC&R0ZkX0~7Q+9S6N4i!3^<=2yh&*REWC7ZjoHGl!SgA&o0I zH5y2sdtnrQXO-6v2E7C}Utmyda7|4T4gXbsN&M|KHiqT)oV?4iS)P+gei0PcR4l}$70}kcl;ItW`-}}QDpReXYAf|XwKK_v{_{fKuPiO>uf4VNLp34%@gLT OdDEOU51WI@*na?NoYzJG delta 4931 zcmcf_OKcojv0ryjch5KD@n`JV+3nbIlJPor>}(QZ94pzxhJ>sWln=>ll1XRY8@rQn zkNvux?>M8Z6YYvqmPSZu5!i=4_yR%}Xn_M4E`S6F#HA&~0dd$H(n<)z3aEPRvB&wa zfdgZ8b=7#34Z+_{fIt3BT0WkqVcB!aReUsT>w;~q%7s7 zFG*CU$|H#?j4Ud78EBP8fQ|@S0a~Lv(7K>ipbZ)YI=U$5BQ!?ikEFat6SS5DM5igb z1>Oct(8-E0dBk+8h0KlX?p;BHJ zE99Va!oI`kc&WsS-U-KJ+$wr@#Tn-sukgtg#s6DoM|?%%1}sJ3?}?7pxB?VDpP~;8 zNhMY&kjTI99o3aoh6PCRM13qoj2$YgiP=;s7*6FdBlgK37rG@%h=ZT?9p6 zVRy&*e^!8A5t@Voq>3Ljbxa%qWW!l`C5&rcg^)z3_J}~VQdFk~U>aai8UqXi7N-fo z44Q9>skC{Kyi1}|Raqi5zD%l8A>wK8ON)ro-_W>h0U zN2?mZSQQSW*^Hi z7JGgSM`+uqo+0;SBHK(U;= zLF|H6o@e4T2Rdc5kV9F^@`fdO_Gs9p4e zNQr?dXq6ji;r4<^5er5`SrC?`rm6i#S=33^G zFdup8{EoTdWK{*%D5KJx2I3A2H)&K}cNkzf#d-)8G-ifB|ERjdPpBP9^V~EuZ?e0t zX>sNcDO;P(VrAyK?O0fr-2t({A8PIDDOLE)eAzM~a<((&n%=bKnY3a$70vAv%pu*yJ&D(alY+h$3XWl$_7)73t z*XFJV8m%d2R!XMjm?tg(*A&Feg|(q|Yg=k~&7j5!tL**{DqU8rIP~Q@%|Y|@sk4nn z_z#WOYPg#b^QhUdD=@geU-N!sQ$RI)>xA_vZ*LjNtyVi8^w)6PXluEoIrV|#1!OX67D z>|AgtxZZZx0$Jn?E<2FwKRnH}O1SE(Am!R2MOK{9QNb)6lS%PF8T2OF2%u6w@RF!2c0X>lZkmi&u zlgsi#1d<+d7w$O)uT(0{OMIxRO%WKa!EiMKX`KyOs&EM|MXH*p3)#7ta}We;FHxw0 zz*kjhuPLnSJ00q)ZBlr8?k%V;_hD+S2n)=>a?B5dKXTEq7M}n-Q1Ni`VL-*T5(W)D z79{FU9fl(kMAxZYSf%+}xaMu-lxro%N01bieH&uW#J0KMam#V>JgPg(@KH zXQ2yY4$;oQIl$ttED}%lu<%Egv}I_%7O}{ORoigdUdTO;?D});uR|CPtvMh1aDhd` z{@VIGTt(}J;+V)%|1V0H&(!gjdWAgKP&=^Xr#2Oi0sqa`9vBJ9@@=8 z=~$PI1qjM8b7!HGw{Ia)FUv080aK{$|8NKRHN*UGt1njGi$ekqzo7bVo_@vZyZPP> ztFM2c)l98>3>_leI`pht=UphAwj;{*h8y8p^rm5~;xhlCoP~nCE^0Ct+vt0OWT8~H zJdZhHUxmpMsG`LhLR1TH0FL>Sk7N6VmlP(SQ73Y$=#awPI}3dLID$>dHUO!Mm9)O* zpTOZ_hpMHqj&@@WRlCWi`dR0l%#jHw4_Gz1__o3ZDbNcAS}7I^d=$sOjNl}K(+JKX z*f2m~Sk8G806uOC0DKE7MpNv5tSi=?+9BqO`1u+BR_*5V26W#)@9ZVr{+~MsHEePD zK7VW1;V!&Jf|f#Ynn5>9>)&q$s9Suu?{*EhZYURe`+$EN@qgMiK>Aic={l($x`4vE z0X!um{1S>ohuYTlGUKAX7LEBun3&{k0CTe7;(5Q^bMgp|a4II7aFXy|c&*5MD^8%; z6~f06U*CHW8^y3fgEl+%1OKl*?2EWQoM(uY)=6RV6p%jzceqd#q;}Mg#)P(I{BP|z zHI_kISR$055cqD6LJQ=IJ2ObscZB72!xE07f8v|H{Tb1Jqv=5eO7RrqJN>J@TO<6d zFyuez-D#raoWiH!74FAIOc=NyG5;66jO<_S+xf9FgkI#rZNh=VTy(``P6=er0=;BA z)GC+7rIOS5HNUy

Zl#03r1jyf_WcyN0Ab zi&@T{ATncl#p!2-UICtd6pH^>P~`-)H}EI(EB@~W*={^zPstUIS@V<(@^|132cjKb zfzH`%*($PJ1RQ#8Z*T1xbFTu^{<`ECK~qxzIgaO&9Bt({5hw`oA1EBXAkvXz-f$6U zj7#Ww+&@Qqg@}fYgh9l%AuvW~Ds;Zg#xS4VE&zsmCQTcGgaoT@SR;f`QInzwH493+s3KV-&lFj8#%9K@k~Lg| z1M~u%fKz145xQf=?~PR#RH6Y#Gn&t_-sd;-{Ni@I!Env|Z{lm2u^$A#UlqV1hWU=^ zEfY+XzF_Q0E>3a(nNfNP=-u3O#!H$)TMw7dy!i8i=x zxeDGA+u&`>HE>6C!ClLB@Q&z#dzKsEzSsrtT5f^|Vh_A$xh3{b*}*VCCVyNd&>_Zc z3zK9QCBZJrqJ(G5t4GJ-LW=R_r3})EN~PvO8pdj@b*!g1-m2#NiqEC*uNuBTk3|;I zy5;+yG9Kms+%R25U_1SMarAO_W~4SV9?1otjp87iOO={gvb==Kr1uNC2xLMw^E_E< zoDQQmy`>|mu}aC_S(}WeXOY10D8A-8pm`XkzgqgNP-oW|jK5MO^-CUP35r*~>sW|Y;S@DRB@HXY>hKb|fk4+{^G(=#~X zsSX#g9A{DVo~tWYGCK(SxR4MzCH*N^6Ll122GxM_b}8sgo)iiqr($m;6ZC+IK_*ia zw+;iBrH{Bz3k%WopuMV(?>dt0J+@6~`g%2eUD|#HRGXU0McaC%jn=dg+7=T<`di0Y W)n4Vz^EI_CvyZ96I^M%y-}?m>=PWD$ literal 0 HcmV?d00001 diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index ef28e908976be6abc451918a4f936b973445974b..db0fd6deacb4cfd9338ecfb41e84ec4b8c3c621b 100644 GIT binary patch delta 3151 zcmaJ@Yit}>6`ngg-uJH8&)v1xPvY3Kw%4!NiQUwWokwX&SHy{;){wdr-&tp!_3rx4 z*tN}UUE;J6Y9eA?o~_#26jgGdDRd!##2@~k!cSC$7@_{)@dF773GoBOk8sW%$#zZ1 zuI8J2&z$p}bI(2Z%>4B=@|#;ETnL5y68t7#ct97P-wG$ly{&HJB$cQqSHBpYi7v)w zVnljMqF(B|DN*01JQJsW8n`LVG|(Uo!M%}&X(ikflw6e5$kwmvkSg2p%X5X5OKU|v zT`(^$7mEdE>hvsQ1!mW#wfxih)465C)Y)Z?328Y+9#)KmAr@AN5CO0&jB8p^w@KP2 z*Hy(<3_X`&pVrxxSd7nkrpSr%d!B%cH1ZGqQ-MaLNC@B${q+%K6TG&|oOzCgc}F1K z6-5_5-7vF@npt2hhDrkB_{1}>o3oj$dAj^&;3IkC2(8>CH;CD~-C=om$QR|3ujDt6 zTK-L9Nwb}%-;x#ra0THC!PQ9>8ln|<-0(CEb2p7#m+unxdl)Acx~LMDN&z#nty%#q zkdb#tslrSm+ZpLfpI}F(1ZZ?yUMmR3I|NLSx*CQ2A7PdB@I>YNb-kr3%U`O7C!M7l z%Uh~NTK-Ap@Uy9iREh#^wV*u?w6PM>#zCXcidnTgGH}L0lKPaS0cMR>e1}+ZU}!WW z3$@$*{KZJ)#=wqb)mbrGLu+1@GxAC4uDle@51WIuc9WD6=8%=3b(?ajY0qoto>#K( zqf!FD%~q4u3|1{x%fc~;VVJsT{T-P|R?GItj-h`OUNXdQN1Mn9zZZQ==>ahhM%(#2T{ZlbSd+UO1nMY%H#SKI z_+MguS6Kip@jS3T1cwMlw#zW)*k@4I>`a#zSr<-`gS8>FBXlAhMQBC9LWZJUVkT?B zd4!kZ!wD8du`i>|LD6N`b=#HG^Q<2gYWc6??XeCVVwKw!`qHwNvz1~tzrv1iSHp2P z7A@=Mry3aP;N^xF$po)$?2I3(T`$(|3Y@_C@})(T$#%^eI>R_@_pE7{n#l&xZZ9LOpWkR69S|p|LdzAeX|_x=Hd#M>h(Z`h zHlNX%o}bgl%71JACD{-$5F~sOAgxB6v?_(XZm@ckKZ79hFomNKf;ji$ASZD;k8mje znB^Jwxmk=@^)e?{sD~^znYPK2tz6{;ZSjUf3G-o`=S*k@vt`moCmPo7j>4^4Yig<`5%+r&1@5-Gw#&`yn<4!;wC@Z-8Q75or~#)?FN{o znZp|&!Gyk)&C#ocf{A%uE3bF=kiHA(RfLMgv`d^#I_s zR-6T@ud1?G_Ke5O(zQnCn@ZSxjyl;bsDz87!@AtRy)Zl3Hn~$}t5bc4; zz`et_29x0I=YvSz_RJOXnQYz+@%m%;pAkF%h&9_4 zP>fkx2h;{!l3Q61oYM6O5R)hab{l1HqD+C3&#|xKd<)@g2x6OXOV~ETcM!x0d{=6N z;dgPqUzcKpUm>FPh54U{dr7EVJ<=h&pFn93fAYi+o~VW)d}{f#Mm7&!14@_O1JSN* z%c*{wtQ;T|Uo^gx^Lk!iEwb?x?;3r*U)U4OZEkrnZ?F&0m@v^P_9OTZqH-lI3ESLl!gp#<~A8c61?7T}~eqtyR3&4tb~n1D*FywYYJlHu34H zt{PFR?xF_OYB+`W6@F)G<7K<1xR%MTLZeOTt8;qM%obor17Ik=H=I`}=9-;CK*j?r v+FO?GJ-Jw*%Q<}m(>))A5ps93-_QLV|FGUDAg0_tto$!GZq*xt7mS delta 2957 zcmaJ@Yit}>6`ni0-uK$;c%BZII}g4+kjL`8(m5vB4C4xutcktO$(ww5JCd}RVqSASHMqDB`OdF2_d0y&K+tS z6XMl;bI+N39&^rj&-mRhkoT^W)>HSmz6`L)0^k``E# z=eo3@7J5dSOK4#&0{5gA)mq`6(#RP}X}iI-<|T5cB^&`iG>Xv5uKH7ZcF3UIlxP?G zu78>wZNBFZdq|4?Jv3cR;r8^0FssD4Y}R?urmAVxYnD!1@fkYh9((RAjj#*h+5S$H zgSurKRn@Lh+J&10B=CuULAOg~!=7&bKKx6$7}VO<$Tec`U%%f8Y>+49Mz9gG4>+MU z;z*@~cF2(y!*E65io$h}{ibzq{*dNPNsX`_Tkm(mPPi;@kVcEGpw%hq+>r2s7Co>d z%Q9^pB+EwI6p~}5wpTj`8tqP~u?M|1I-Ecwj(%7sHfrQ!QX>I=_6R>m!B4V*ep0Yw z&`CP+4H@F5K$HJ3O&X+bC$&MG6nN;iV~g?iA*ajfPD-FlY&}iKq@)y+)(h+>v4m38 z;%lVQV-Gt$TIZVF*t-?^&{kxEaoC+$qH_eI9@acs*Yh%woZj`(4Qc%d%e8k$`<<8* z6Ez^V!p^iGf;L`l-|zEvVCmy*BatUX_D*6iIn3Tq-125Y%^pqkvDcFYp8|q%jQt^b zk_@r_)X*vqeM+q?=^vpKnuq+Oc?8!NthmRr=4l3XJ+8P^r3X<&SF{&lKf(co`w{jb z2%dPYOVp-&QAYA`uc;YT?x(tSL9Oe&MYGvEson$+meqM6kFlb2PenKBAX@BUp>$vJ zK3pPwd5eB&Nv&{i-7uGFA3K#k>O=BTg*~07ZS`qKaJtZJN=D~d>+p<-g4x!yviRd8v z*}k!&I0-FkrG7!>vR39~W%pr-Vj_lF)~RmJ>toG)@6XAq$bq24;{b5%+&X(}rf$(V z>K{fBb(q3c7(pCpaUlCqEFl{Xh5M!eI62M9CGI`XXeO23Rj?rD zIb*}2{%rG=%$NM*TRF}uK6k8$_{+i(r7P(5^8gB=tM2V7_tsz+mHh=Vh=j#eP*XJ9 zVdE7x6fNk}2-n!#%IsMOmOO~b8!%kvxv##AMBU!3^olp3r_knv*gap<%cfd|!ii{o z_(TLp>e5djJjT@Q$9)gr@_V*oF+v4>&DweE7pyD)50@_m*fOgGUCz$nesLtx757$k)#O21vf#W>UE3z=TvXK- zOWO}#*b1~AtqoJH>$F^>RTWtJE1;$ofQ_-1Gzr}4Yd$}Cngj+wq4?=__Q#<|^y?@D z-RcETskS;pp$8PzE^Q55Eh1DA>HyGLaTYZFvLcJup7Yy=cI7U`^P>KD?B&8M2fhN9 zP^E96m%AiS=itEyOf41yw_v5nD^IXL7c%U}#fiR`(B_-}$B@gG{!f-19{kYmGs3Pm zJeK|HJ?&b=JdkAYz0Tep&XQZ~U&H76U%r7 zno6m9g(fi(F;iM#1=HWA)Q>tJLK(qExB|dEkdx>;eGYXuQRfAYSLl~fei4Boh>l@* z=(i9y5X6!Dwv>V8cTnD@{T3U=tc$V(NAg~rdMp;`Y+gJPm3?DqkY!IDd;NF}mWs?n zhGm#AEr7Cg6I7crmj?@+Ebs6uj#F@AK{xfwbvl`6#@KVC!k%D>D@#?=qOYMbp<+U8 zC-Mep2eD^AfW=Cd-5N`WEfY65k}d?@$ty3u;gCNn78RBdt*GAZKA@X zRw~c|F{-yi+(t9Zj!ppdun)#FWTM%5{4Gxg11R4A34wdXCv1fMY4Yac_fb9y@c1ko zOAJllM0g9~hX_AHz`}@m37bR;I5z1N!byY&5rz<^5w<%ba+?I*2>Z*46J)YknEELp z1@_mIBM*ycNFw?@03Lk&O8r0oPJ9%VIGz=cJLRIN5MQlbuG`^(#+IggeYjH6?B;ZT zhaje}t^zeJmt|jMzn)$_=Y9dPQWR67XtE>Mt)}t7M75?ZRrE=iVUpDc5Rn1|e=#{i U;v_~Qq}3y>y1zh2AQ3748@M#1p#T5? diff --git a/pyfixest/__pycache__/fixest.cpython-310.pyc b/pyfixest/__pycache__/fixest.cpython-310.pyc index ae6fae5bd680ef8d5c5dc53ceae7a470e9dd6be7..0eda2e7381e911887a842b0576981bcd0ae59692 100644 GIT binary patch delta 4971 zcmai2dvH|M8Q**Ny_6kN&-teu6#o$Q?CDipSJ?QHLqbcJh-=sP2dxFGjGo54L(-OTi8Ti&6{ancY2(}TUkBP zCo?Tm$EL8Uhl0sAHjOnL@+I5Zbk;~?2b;lW(%8x7&0f0L>3rB-{LoCR`w`rPB9tz3uK}A1UniXDIt$Fgg`XgGSj8A^N7OK4n6Lvl& zct()Q$={eMYKfYNiYYXRM!*a}4Pd7H%9M_!Q!!OA4YOu~7Wz4h2x?Y@w2&6@hxCX> zKYv6I=~Y?`bDEVtnsSepXd}79x~I?Y^0c9{qA_h=Y?);`ZraY~SKKF`p0=UqQj$*S z|JD|W?%v)!EG`3=kR0()&U=g9{e znrB@G;d3>4k!6;V-OY>@56eF_^k~cFhS2kCNB+Z~rdJmL3Z zj%x_l*>Ac7Vh*;C@ElW*30f@_0uJCHs3F7i+s@OJ`;(&OxW!4X*M& zQrN4Pt7g}0PnJrZ+rnMSnVTV?f#=T}d2*KDWKOb9aK~f?!=fxmWw|?GGci{#nZLT{ zYRKmS+W{8fLO>RfBk%$_W@f!GsTeTwT&yHoQa(1nNgI@}% #dFLtb9*fA+Bu4S zUYI%83+^A_f+y=zV=U?b%uI8~3%NFmB{8{tlwG7j8~}_0-~q4RvhBe_KE-&JGKRAh zGbrdc6D#T8u{|kngizG5_DHs1wCf@ThtQ0j;4K-PBY}GMVpHk(~}qFxk8o;!{y}^>4da$T|H*= z0PPTrnRIx{)?AvGy^7irhXBgwUxHAW5-OF+TH-FyRidHdgbEF!;x(kQ=(uUyk|!2V zOd#h)oFG|VYP#iqmjGS4B4Ao}TI6J;J6RN|tKQfH>JorTJ*0awOd)bF z%5ZTz==(s5k#Q-@%yG)m{h;mwoEtE;uh!k>k7AXd z^a$1MAHk!}GL_~94-=!cbYk@_dK28(H=ff;ef_qif72CPNBnJVZK6rKmv1bhs7L(s z=FLmQD}AHVQ#l_x%ei{&q%uvdL*1%`5wKKzpCCDrJFb~E zT+_~-={wWTO#(0M6tZ;k;WedgYd)(rsf{yGP$3sc+dPw#FRopvJuXkKJvsA92z{EQ z?(luGVci0fTfgq3j`PX|T`EoYCY{v$Q1bP2N&b%Yf9X80e2AJgwel~P7u>s{O?$TV z%!XV1JNA$z{fV#_Qc2{9W3cS!fL{Qf1Hc_##B@?--m=|9OsKjjA{l@E`9~5a9U99c6aGNeXr|9C2&65#Pe7Vm5Jb4#;AmU z0j%R-oxWaGSo1RYuK<)u=dq@W&W{-4{7;oqTb>IRe@bhTQAB}W2WFZoQtkH|RQ(9> z6TnzwR@_8YMb>)Z0mCs|SBO7CT`k(_e$!&RZQFGz|HOBp1TEDIZRNtGdb%19T7OX- zp-G}vWwNJTCe+5igZS?OuLIrycz{0uz6Thq$7DEd6&&hI$q2Ti>!>4eDDh)JMKG$) zw(3>NqEg$A=d~hkU*y=YVZ}xQdS&O_iZiN?=*8CKhM}$!0%b{&QpxdWELEM-kB0bd zJXY)-&u}+AP=5c#{B+$zvya6hT8$jMrgeh}ZMv95Lmz2VZUEE(a5fPD1Od%}YXOGtfN`g&nR*FLBnF(} zbP_~-^?G-8#F3BgY+3-$+HzT`l>W5R8LJvGsr2E_OH0&8TH^%hm(EuqJE7y;GGhcu{G zL(PX?A6y8o7|FnJ*31Eop>d%;yiVANPQBl+sL3ea>yA52&V%k`RWDU&#!Q<$=a%0) zlonSJ$BPKtjjB$b(8MwMDr?>H9yb3w;C;Y90H0#|fS>69Bqm+>@N)6|dCT=8PGL7% zfg`?(b*l9pk?Z&z`qaCgZ!34J|L=FtpE37%I-OD#C2~I*VVQEKtCUIN(@zi|!&umXqU=GGdM_?wzva zTvc9GDm}o{gDDdqMI+D&*_wEb7SU?8fTo|)wa}@+DN$WIvG;+%wLy(M6IHh}aRs!h zcB}4(>cSEyzNi9hfdTPex_9oO54yBr(XuwIxCEdqLK2IG0Nhl?Me+r^qw?C-MV#BE zKfh7ylAH3ZKLyF9fa?fG{LQ1yViq2o2q^sPFmJ^?pssY~8{H02Rf?Z`e(`l;94m#d zztg|Sfy{*R$^)3+4N$MFAqjNfxyXtF77MY`@gKOS`MxLa^F>c zuSQ$~WozME)J{fy*;Vc^pSVG}a->C@Uou9fX)EYvcjkMjf31=xvuBc2<;n|)))Al- z3DG1HBg=GgLFvf@el2p^o)6@+qg`ix9Z!>=j5clW#+nGNsiHM8tZG!&_Vuk*{W)== z_yV^3fPnslP{`(oRc?8qypdyuQ%A^E@tcj*6)IbBjQW6spg^h1t7+zX4EB0v;5|HkA_s;T4F6fWrjNuFO8m iDJpd6dGyB&x=a=1jW@JS)N1^`;`o1kl014t=YIh#=9(!0 delta 4944 zcmai23y@UB6`l9q{P!cDWq+{jf8l|<3kZt}F8{>^Yvi-F!UG(J>7LyOGxNrtx3If{ zOO=!+l|LOT(fFa%XizK@M>NJ5KS_*OF~n#ReU(I0ri@xvewANoQI&goki`)yv-Qrq zeQ)>e+qdt%-EWVc(Y!NSrBhK6_0ey|@ssS$hrU*MVq(3IMOgHRk45>+n+Yv(84=L_`N`W-aud!&+Gzz2~xa) zDx$n_JZ@)gHy*E%*}xXvugMnzs~UZK17hyMz}_GWu+Wz@%|~?Tpf4Ui2+3kOD=0&U z6@9qyL~uogX32j~KcO|q`>IY(!8Bf&2`3j9JSA%7@Qi!gyy##eJ;K!j%!sIm6%Byd zfJ#84oKxMtytpK^VV`IrXrm|JLr~cp)Ph>r20JvvZS<^*h^6#-(dB77?w1Ya!&V^cxY>kfB+_Zmzt^#|mh7r)n!OesKdr?JFHa{jdsw3PX_>BD zs;!Xs*Il#8ilh=r*AezO7qQO{64w&%6g_#Jpps@3SfUq5NJ zc$SamL~pMgXQoq75;diq&uWL3r) z&mgoi4&&)XYYGo^-|ug3fkIS45eKMf+eDOUh~lhr-{R)TPU6HU1ZK(>E@?Co zhoX$Y3Q<7BQ?^?ySM$KfQZ2uoc9J43?_Od}IN;U+5Dw<7;#R8Cb_KZ004fY%s}*8) z(p{9|;w#__u%f9R#S*dSS_$lW@XR-2p0TdkRX)!B8W|D*K>=0FYWu!7qjoXfn2p9oN#Ut{WwKcV$ z-f=IKAIZ=%$95GyTzj3?sAgg4UDD5=ba?6(xuxkE8#E z2I+bJW%=m(ZtXGo*82anU$kGqrId4TrxQzjUw(Y`{7`p{fG=g;#KFjbMjjN+$&68{F236B(x z#@^5;RELWhEMCNLs5ArTS*Q}>XAr#vQHeQct$79VUjURz7qO7<^NWFr zAJP~rf?c8`+fGuZs`-8eRZjt)1|Zml%0o!a@{(xwLc@uC!gYmslf>2()XD>Pn(c8M z*X0z&4`KWk$bwtx21|K1Kn+hDm=F&WVNOvI?rE!qn)o$ze;x2^z;6J*1-t<`0ay!A zc^XQlNAgs!tT3jd%Vu6+QQ`-HlFcYT->MHOvH36-ZawDV3XVVW_I01`6f3(JYy}EXCdAaPi!0G3YWhjXFi6VXabXJ6iY< zwCSRTUNO@83^e=*jbf3ZN~KsYgRh;(55>eUsW~8C1#@7)Y!Xw@2Oj|fQxvNpj(IUt z-nFB4q6Op*z+u4G0XQF2JulwGgJ`NG`5vf~fF}XUscGZJFg1TJ?Zy*+L}~X6~qNnBAx*J9B_BB=zHe=I|{e!|4)WTzO;6*jKZAz&!36~O_Y zcgM(W&|;OZp;D8wlQz$~#RG`qU^66P;kXgXOebq<;(2+9wQTt_@x^<9_W>UQE@1j$ z3NY~(5}GrLfotT_t`*LY>_JV-i*I1ualpg!?`$r8xz+Q*VtM-i{==MN|l8O zb}P(M#n4v4V&Nks6;Gdik0{@l+KF=RF{9{hqRXpnba3GZAIaup_zIg zN;X|e=yFbuucn5owpPeq5O>FNoQQ>rDADbe$CJZ6xi4D_es!%Y-s-LcS4DNn zZr@IV-xa=_J8CS>p$`^DBM*SS4PXLXK*`8Ei1%(`zuTj4h9#C^+pK69t)6bSYqkt7 zq`1S9Ng=Lg#mnoxkcNx5Lb|<{XuXr9x?i5zU$5O+s6FsieI*VLiv3O~P%bt|KWS8k z!Hvj}l=_+~Rn|??2KnAtv({aRj@N3vbX3ueD9v3bJJ6?klZ8}KKC`&_#JkE*!G%&5 zj`}sfF6I|@-)Lyzv-W%-_Z?hNcAoX}frE|PVi*&qG37KSicuBH+E}blm0feb_#CGD zfWQmT$472VAdIYFE|F!4d@*XGnS_f(OWS({oiaZ0PuXzDq%2#1sE6>TL(5W;b)!k1 zLvE}8(5PxCZ1jB_@F&2#0Hle4%LF1xV7~>nPQcRw9uiorvhzIusfAU^uA4fi8kK(E N#N?koSEg_3_#YQMav=Z! diff --git a/pyfixest/exceptions.py b/pyfixest/exceptions.py new file mode 100644 index 00000000..16ec37a4 --- /dev/null +++ b/pyfixest/exceptions.py @@ -0,0 +1,35 @@ +class FixedEffectInteractionError(Exception): + pass + +class CovariateInteractionError(Exception): + pass + +class DuplicateKeyError(Exception): + pass + +class EndogVarsAsCovarsError(Exception): + pass + +class InstrumentsAsCovarsError(Exception): + pass + +class UnderDeterminedIVError(Exception): + pass + +class UnsupportedMultipleEstimationSyntax(Exception): + pass + +class VcovTypeNotSupportedError(Exception): + pass + +class MultiEstNotSupportedError(Exception): + pass + +class MatrixNotFullRankError(Exception): + pass + +class NanInClusterVarError(Exception): + pass + +class DepvarIsNotNumericError(Exception): + pass diff --git a/pyfixest/feols.py b/pyfixest/feols.py index bcb0955b..d8290f47 100644 --- a/pyfixest/feols.py +++ b/pyfixest/feols.py @@ -8,6 +8,7 @@ from typing import Union, List, Dict from scipy.stats import norm, t from pyfixest.ssc_utils import get_ssc +from pyfixest.exceptions import VcovTypeNotSupportedError, NanInClusterVarError class Feols: @@ -144,7 +145,7 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: if self.is_iv: if self.vcov_type in ["CRV3"]: - raise ValueError("CRV3 inference is not supported for IV regressions.") + raise VcovTypeNotSupportedError("CRV3 inference is not supported for IV regressions.") # compute vcov if self.vcov_type == 'iid': @@ -207,7 +208,7 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: cluster_df = pd.Categorical(cluster_df) if cluster_df.isna().any(): - raise ValueError("CRV inference not supported with missing values in the cluster variable. Please drop missing values before running the regression.") + raise NanInClusterVarError("CRV inference not supported with missing values in the cluster variable. Please drop missing values before running the regression.") _, clustid = pd.factorize(cluster_df) @@ -252,7 +253,7 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: # 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.") + raise VcovTypeNotSupportedError("CRV3 inference is not supported with IV estimation.") k_params = self.k @@ -396,9 +397,9 @@ def get_wildboottest(self, B:int, cluster : Union[np.ndarray, pd.Series, pd.Data ''' if self.is_iv: - raise ValueError("Wild cluster bootstrap is not supported with IV estimation.") + raise VcovTypeNotSupportedError("Wild cluster bootstrap is not supported with IV estimation.") if self.has_fixef: - raise ValueError("Wild cluster bootstrap is not supported with fixed effects.") + raise VcovTypeNotSupportedError("Wild cluster bootstrap is not supported with fixed effects.") xnames = self.coefnames Y = self.Y.flatten() @@ -594,9 +595,9 @@ def _deparse_vcov_input(vcov, has_fixef, is_iv): is_clustered = False if vcov_type_detail in ["HC2", "HC3"]: if has_fixef: - raise ValueError("HC2 and HC3 inference types are not supported for regressions with fixed effects.") + raise VcovTypeNotSupportedError("HC2 and HC3 inference types are not supported for regressions with fixed effects.") if is_iv: - raise ValueError("HC2 and HC3 inference types are not supported for IV regressions.") + raise VcovTypeNotSupportedError("HC2 and HC3 inference types are not supported for IV regressions.") elif vcov_type_detail in ["CRV1", "CRV3"]: vcov_type = "CRV" is_clustered = True diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index 4414a065..90267457 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -12,10 +12,7 @@ from pyfixest.feols import Feols from pyfixest.FormulaParser import FixestFormulaParser, _flatten_list from pyfixest.ssc_utils import ssc - - -class DepvarIsNotNumericError(Exception): - pass +from pyfixest.exceptions import MatrixNotFullRankError, MultiEstNotSupportedError class Fixest: @@ -143,7 +140,7 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc self._is_multiple_estimation() if self.is_fixef_multi and self.is_iv: - raise ValueError("Multiple Estimations is currently not supported with IV. This is mostly due to insufficient testing and will be possible with the next release of PyFixest.") + raise MultiEstNotSupportedError("Multiple Estimations is currently not supported with IV. This is mostly due to insufficient testing and will be possible with the next release of PyFixest.") return self @@ -988,18 +985,18 @@ def _multicollinearity_checks(X, Z, ivars, fml2): if np.linalg.matrix_rank(X) < min(X.shape): if ivars is not None: - raise ValueError("The design Matrix X does not have full rank for the regression with fml" + fml2 + + raise MatrixNotFullRankError("The design Matrix X does not have full rank for the regression with fml" + fml2 + ". 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( + raise MatrixNotFullRankError( "The design Matrizx X does not have full rank for the regression with fml" + fml2 + ". The model is skipped. ") if np.linalg.matrix_rank(Z) < min(Z.shape): if ivars is not None: - raise ValueError("The design Matrix Z does not have full rank for the regression with fml" + fml2 + + raise MatrixNotFullRankError("The design Matrix Z does not have full rank for the regression with fml" + fml2 + ". 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( + raise MatrixNotFullRankError( "The design Matrix Z does not have full rank for the regression with fml" + fml2 + ". The model is skipped. ") def _get_vcov_type(vcov, fval): 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 8bb603fbaa16a58e5e11611c3e7f5987f1682dc5..461e18a5f440052e832d0dfaf2a0cef61fd0aef2 100644 GIT binary patch delta 1374 zcmZ`&&yU+g6!th-$4+d=c5FAhO_OxH-EGR!?UEumAW^#Am6jhX(3Y)geu$7UC{=7n zW2fy(Rf~Wt(AE3{UG>DN2L$&X=!pY8a3JD(PAgdFK1xJdfY| zwEk_wObnwa!Sh!59evf_Gi&7W-ZNM4Ms{FFPT)k9pc1)(8+m~j`GHR)D$$w#v8WnU z!B=SEb19gmD%HTw(IPE@Jx+CMfUQxJmcgE&7PZ0FsY5GZ8`Py9*e3PqF|a2o*_K+> z-!YG^78xlUdw)203nTmTaM15{J6ZTzxVz3+!bbjjOp}jyIxKx9T}y6&9j{k6<1}N# zD2%iJ?f7rUG-Q{SJ-9fVs+wmlpS5|)K@vh~KWpIz#$r`hzL zyVZ#|Q@siG{oKlt)T-Y0F|3H~ z^T)Xdiiz)Kp5&KG<23Qz=KJ|mq`|+>|4pj=(aik9n1*{;I_x+?4dJk;pe&O!-&_C$ zRi{utq*9MoJt(Y_W&Ts)PxBOzwptp?A^9|aqRzDr&K;@$7Q_*UyW082b0F-(Ja}aA z@aQ#|=^ftHz9dEdm)0gFzF2H~`ab!}Cem$kUBf!2dXG?p|624~_ihp*;kX7fQ|=cs zIK?)BZA{qKKHO}VGLf!A zr{!UMmLpQEtxESuIyV&=mDYjMn^sb3TN2tA`H!VFa)G=0v-~}M9{$NE`s-TbTC;hl zx!SzVpXg_u7F-NF3(zW$uYHlLMswrf+F1b!;&&_P%^={7j`W+oKK(FBvJ85FX}CUB z5P|W+`I1X&PxYKHP)C#xVa_6TSh2{$Q}!~%XwCCS#+5lde>4*hqrom)L|++nV%kaB z3STjoo*z{PyB~?>I~U&ShJ&n^#3>UkClVB?ip)jbiR6mBXVxxZM=}S&Meqw9F+W-In delta 1196 zcma)5O=uHQ5ZA;avx(Ab3+9n;X5P$vGwjTJv+qV!tE;Mq zW4{;Q+qkWDv$rT2$gxyT~u?Ndc2C#xvCWBbR zI+G!6U@wz{*oRFf!*~GunH<6a9Aq-m*^EU{H#k*lTq%;1&0M{eTd0;udG0tNb&}xe zJLEUJ-l>H~r94+`l}?qGY!BVw2kBQ-^NFlm;$*PS5gBxuR{8Ttr5nO9a?vk*+%MVJ zJ3*l@g%CX^h@u7#y&pa=OzasR?S&fs&~L)QJwroECIGZHx0mJ}PeeD^o`=r3-0Kod zg{GY`6lVTm+H`(GCOs?eAMHhg-w$9D1wq@M_((i}VvzXyv#6u2$^5yla3Y&YxQM`v zu82v!Q7aN2GXIP6kd#7kyO$Md<4hD76KAliGx>biXkWjYyoTmI*nxFy^y29)87e=PGYmh-nd$AlnQN?a zp1lAEJ1YX>YVH*G05wCq)-d`Vu|3BcJ*5ny!?dJiQHriB<3r(DYuTDfS#7J3vXWLI z-7}NcOqzaFVr&C`DyN-8vzE0?bLyBn%07HT?hRpt-d3&jE~D%!i{%QwP_MUIrDlu# zvn!kGkx4;8ku60SurUD0+c$qO%5Drax!&552M4mzSorr|Xb`(3J_=>P_R7a$A}1Be5R13=Af>uoQ(La*yq TKtTpC@sh(niX=&fWGMPCaK!nw diff --git a/tests/test_errors.py b/tests/test_errors.py index 10251162..1c50acdb 100644 --- a/tests/test_errors.py +++ b/tests/test_errors.py @@ -3,9 +3,9 @@ import pandas as pd from pyfixest import Fixest from pyfixest.utils import get_data -from pyfixest.fixest import DepvarIsNotNumericError +from pyfixest.exceptions import DuplicateKeyError, EndogVarsAsCovarsError, InstrumentsAsCovarsError, UnderDeterminedIVError, VcovTypeNotSupportedError, MultiEstNotSupportedError, NanInClusterVarError -from pyfixest.FormulaParser import FixestFormulaParser, DuplicateKeyError +from pyfixest.FormulaParser import FixestFormulaParser def test_formula_parser(): with pytest.raises(DuplicateKeyError): @@ -52,7 +52,7 @@ def test_cluster_na(): data['X3'][5] = np.nan fixest = Fixest(data) - with pytest.raises(ValueError): + with pytest.raises(NanInClusterVarError): fixest.feols('Y ~ X1', vcov = {'CRV1': 'X3'}) def test_error_hc23_fe(): @@ -63,10 +63,10 @@ def test_error_hc23_fe(): data = get_data().dropna() fixest = Fixest(data) - with pytest.raises(ValueError): + with pytest.raises(VcovTypeNotSupportedError): fixest.feols('Y ~ X1 | X2', vcov = "HC2") - with pytest.raises(ValueError): + with pytest.raises(VcovTypeNotSupportedError): fixest.feols('Y ~ X1 | X2', vcov = "HC3") @@ -95,32 +95,40 @@ def test_iv_errors(): fixest = Fixest(data) # under determined - with pytest.raises(ValueError): - fixest.feols('Y ~ X1 | Z1 + Z2 ~ X1 ') + with pytest.raises(UnderDeterminedIVError): + fixest.feols('Y ~ X1 | Z1 + Z2 ~ X4 ') # instrument specified as covariate - with pytest.raises(ValueError): + with pytest.raises(InstrumentsAsCovarsError): fixest.feols('Y ~ X1 | Z1 ~ X1 + X2') # endogeneous variable specified as covariate - with pytest.raises(ValueError): + with pytest.raises(EndogVarsAsCovarsError): fixest.feols('Y ~ Z1 | Z1 ~ X1') # instrument specified as covariate - with pytest.raises(ValueError): - fixest.feols('Y ~ X1 | Z1 + Z2 ~ X1 + X2') + #with pytest.raises(InstrumentsAsCovarsError): + # fixest.feols('Y ~ X1 | Z1 + Z2 ~ X3 + X4') + # underdetermined IV + #with pytest.raises(UnderDeterminedIVError): + # fixest.feols('Y ~ X1 + X2 | X1 + X2 ~ X4 ') + #with pytest.raises(UnderDeterminedIVError): + # fixest.feols('Y ~ X1 | Z1 + Z2 ~ X2 + X3 ') # CRV3 inference - with pytest.raises(ValueError): + with pytest.raises(VcovTypeNotSupportedError): fixest.feols('Y ~ 1 | Z1 ~ X1 ', vcov = {"CRV3":"group_id"}) # wild bootstrap - with pytest.raises(ValueError): + with pytest.raises(VcovTypeNotSupportedError): fixest.feols('Y ~ 1 | Z1 ~ X1 ').wildboottest(param = "Z1", B = 999) - with pytest.raises(ValueError): + # multi estimation error + with pytest.raises(MultiEstNotSupportedError): fixest.feols('Y + Y2 ~ 1 | Z1 ~ X1 ') - with pytest.raises(ValueError): + with pytest.raises(MultiEstNotSupportedError): fixest.feols('Y ~ 1 | sw(X2, X3) | Z1 ~ X1 ') - with pytest.raises(ValueError): - fixest.feols('Y ~ csw(X2, X3) | Z1 ~ X1 ') - with pytest.raises(ValueError): + with pytest.raises(MultiEstNotSupportedError): + fixest.feols('Y ~ 1 | csw(X2, X3) | Z1 ~ X1 ') + # unsupported HC vcov + with pytest.raises(VcovTypeNotSupportedError): fixest.feols('Y ~ 1 | Z1 ~ X1', vcov = "HC2") - + with pytest.raises(VcovTypeNotSupportedError): + fixest.feols('Y ~ 1 | Z1 ~ X1', vcov = "HC3") From 16f1dab32fa7039e384cdd12c5ec470b4c740583 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Tue, 18 Jul 2023 12:35:53 +0200 Subject: [PATCH 10/13] more cleanups for exceptions --- pyfixest/FormulaParser.py | 36 +++++++--- .../__pycache__/FormulaParser.cpython-310.pyc | Bin 12618 -> 12648 bytes pyfixest/__pycache__/feols.cpython-310.pyc | Bin 17362 -> 17389 bytes pyfixest/__pycache__/fixest.cpython-310.pyc | Bin 32402 -> 32641 bytes pyfixest/feols.py | 29 ++++++-- pyfixest/fixest.py | 65 +++++++++++------- 6 files changed, 90 insertions(+), 40 deletions(-) diff --git a/pyfixest/FormulaParser.py b/pyfixest/FormulaParser.py index 453fd63a..e1c43423 100644 --- a/pyfixest/FormulaParser.py +++ b/pyfixest/FormulaParser.py @@ -1,5 +1,11 @@ import re -from pyfixest.exceptions import DuplicateKeyError, EndogVarsAsCovarsError, InstrumentsAsCovarsError, UnderDeterminedIVError, UnsupportedMultipleEstimationSyntax +from pyfixest.exceptions import ( + DuplicateKeyError, + EndogVarsAsCovarsError, + InstrumentsAsCovarsError, + UnderDeterminedIVError, + UnsupportedMultipleEstimationSyntax +) class FixestFormulaParser: @@ -57,10 +63,14 @@ def __init__(self, fml): # check if any of the instruments or endogeneous variables are also specified # as covariates if any(element in covars.split("+") for element in endogvars.split("+")): - raise EndogVarsAsCovarsError("Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed.") + raise EndogVarsAsCovarsError( + "Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed." + ) if any(element in covars.split("+") for element in instruments.split("+")): - raise InstrumentsAsCovarsError("Instruments are specified as covariates in the first part of the three-part formula. This is not allowed.") + raise InstrumentsAsCovarsError( + "Instruments are specified as covariates in the first part of the three-part formula. This is not allowed." + ) if covars == "1": covars = endogvars @@ -77,10 +87,14 @@ def __init__(self, fml): # check if any of the instruments or endogeneous variables are also specified # as covariates if any(element in covars.split("+") for element in endogvars.split("+")): - raise EndogVarsAsCovarsError("Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed.") + raise EndogVarsAsCovarsError( + "Endogeneous variables are specified as covariates in the first part of the three-part formula. This is not allowed." + ) if any(element in covars.split("+") for element in instruments.split("+")): - raise InstrumentsAsCovarsError("Instruments are specified as covariates in the first part of the three-part formula. This is not allowed.") + raise InstrumentsAsCovarsError( + "Instruments are specified as covariates in the first part of the three-part formula. This is not allowed." + ) # add endogeneous variable to "covars" - yes, bad naming if covars == "1": @@ -90,7 +104,9 @@ def __init__(self, fml): if endogvars is not None: if len(endogvars) > len(instruments): - raise UnderDeterminedIVError("The IV system is underdetermined. Only fully determined systems are allowed. Please provide as many instruments as endogenous variables.") + raise UnderDeterminedIVError( + "The IV system is underdetermined. Only fully determined systems are allowed. Please provide as many instruments as endogenous variables." + ) else: pass @@ -443,11 +459,15 @@ def _check_duplicate_key(my_dict, key): ''' if key == 'i' and 'i' in my_dict: - raise DuplicateKeyError("Duplicate key found: " + key + ". Fixed effect syntax i() can only be used once in the input formula.") + raise DuplicateKeyError( + "Duplicate key found: " + key + ". Fixed effect syntax i() can only be used once in the input formula." + ) else: for key in ['sw', 'csw', 'sw0', 'csw0']: if key in my_dict: - raise DuplicateKeyError("Duplicate key found: " + key + ". Multiple estimation syntax can only be used once on the rhs of the two-sided formula.") + raise DuplicateKeyError( + "Duplicate key found: " + key + ". Multiple estimation syntax can only be used once on the rhs of the two-sided formula." + ) else: None diff --git a/pyfixest/__pycache__/FormulaParser.cpython-310.pyc b/pyfixest/__pycache__/FormulaParser.cpython-310.pyc index 6091e641676cb117e4ac4f4a15a99cacce537209..72ee0a247100db4713ab7396788c4ec7435d1806 100644 GIT binary patch delta 274 zcmX?=^dgBbpO=@50SM-1Y)g6RvXL)?lhJWvDTC#%(U=W@ciO z1F9>YF}Zf?^QC!N9`IA;?hA$GSOEIG&U7#O9qcHtdX1lfNmqGsaA= zQ(4HEGFd@&F{A9}BdW7m7|S*%Xvs1$F5O(GvzST#03*;CF`zL5yiAN-KwCIiIDoc+ tSS&0ozb0Ggw=v$HykGw&yE>vDTC25m0qW@ciO z0IDl)ncToDt;fMA!^FYJ!NkVM$Hc+J!pO$R!^puX#3;i8m0<>o0A&P#qD)Mi@ABSa zVVpF1htLv17LXwvK!SsTg_%Q;uWEC?a6BjDj?L#~Y}gsSCiAGYGx|)PqOy=NWU`s+ zVn*K0w^V1dFs5xT(~@OkoVt06&SECX4U9lT_<)88@B(cBxvlkvjj?FI`3nHcIhOgTb1B02Oqq&dWSI05pyIAZ_+ diff --git a/pyfixest/__pycache__/feols.cpython-310.pyc b/pyfixest/__pycache__/feols.cpython-310.pyc index db0fd6deacb4cfd9338ecfb41e84ec4b8c3c621b..3dbdcbbac1bb06463004eba35f3b3ab9f81ab386 100644 GIT binary patch delta 281 zcmccA&iJ;SkuRT@mx}=iW~6URnHaT^?~^!V<77q&kIh~Z{>&nefHFMl3QTNFT#QUW z$nu|yb@EE-5Do~3k99Jmi~*Fx#xmJd#+td8MSpX#%uXgo$IZI(rhSDsX&uV)xGG5*+rkl>lcz<)9o&*!)%gNIXPBQ+VoM^ZWX!&GG zqs@#wlg}EhXB3)TYkZSYVsg02Sw@A;s-~ih?9p7R0a6^nn;p&6nHeo7XIgG$w3;k$ zb(v9P^Jl9+ENu2nK&$O0f3;T@f>_A{wVJ7cgL$)(Ll6^V$>vh02u4;p4sjk+0B)#8 A@Bjb+ delta 273 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 None: if self.is_iv: if self.vcov_type in ["CRV3"]: - raise VcovTypeNotSupportedError("CRV3 inference is not supported for IV regressions.") + raise VcovTypeNotSupportedError( + "CRV3 inference is not supported for IV regressions." + ) # compute vcov if self.vcov_type == 'iid': @@ -208,7 +210,10 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: cluster_df = pd.Categorical(cluster_df) if cluster_df.isna().any(): - raise NanInClusterVarError("CRV inference not supported with missing values in the cluster variable. Please drop missing values before running the regression.") + raise NanInClusterVarError( + "CRV inference not supported with missing values in the cluster variable." + "Please drop missing values before running the regression." + ) _, clustid = pd.factorize(cluster_df) @@ -253,7 +258,9 @@ def get_vcov(self, vcov: Union[str, Dict[str, str], List[str]]) -> None: # raise ValueError("CRV3 inference is currently not supported with fixed effects.") if self.is_iv: - raise VcovTypeNotSupportedError("CRV3 inference is not supported with IV estimation.") + raise VcovTypeNotSupportedError( + "CRV3 inference is not supported with IV estimation." + ) k_params = self.k @@ -397,9 +404,13 @@ def get_wildboottest(self, B:int, cluster : Union[np.ndarray, pd.Series, pd.Data ''' if self.is_iv: - raise VcovTypeNotSupportedError("Wild cluster bootstrap is not supported with IV estimation.") + raise VcovTypeNotSupportedError( + "Wild cluster bootstrap is not supported with IV estimation." + ) if self.has_fixef: - raise VcovTypeNotSupportedError("Wild cluster bootstrap is not supported with fixed effects.") + raise VcovTypeNotSupportedError( + "Wild cluster bootstrap is not supported with fixed effects." + ) xnames = self.coefnames Y = self.Y.flatten() @@ -595,9 +606,13 @@ def _deparse_vcov_input(vcov, has_fixef, is_iv): is_clustered = False if vcov_type_detail in ["HC2", "HC3"]: if has_fixef: - raise VcovTypeNotSupportedError("HC2 and HC3 inference types are not supported for regressions with fixed effects.") + raise VcovTypeNotSupportedError( + "HC2 and HC3 inference types are not supported for regressions with fixed effects." + ) if is_iv: - raise VcovTypeNotSupportedError("HC2 and HC3 inference types are not supported for IV regressions.") + raise VcovTypeNotSupportedError( + "HC2 and HC3 inference types are not supported for IV regressions." + ) elif vcov_type_detail in ["CRV1", "CRV3"]: vcov_type = "CRV" is_clustered = True diff --git a/pyfixest/fixest.py b/pyfixest/fixest.py index 90267457..ee798dec 100644 --- a/pyfixest/fixest.py +++ b/pyfixest/fixest.py @@ -140,7 +140,10 @@ def feols(self, fml: str, vcov: Union[None, str, Dict[str, str]] = None, ssc=ssc self._is_multiple_estimation() if self.is_fixef_multi and self.is_iv: - raise MultiEstNotSupportedError("Multiple Estimations is currently not supported with IV. This is mostly due to insufficient testing and will be possible with the next release of PyFixest.") + raise MultiEstNotSupportedError( + "Multiple Estimations is currently not supported with IV." + "This is mostly due to insufficient testing and will be possible with the next release of PyFixest." + ) return self @@ -209,9 +212,6 @@ def _model_matrix_fixest(self, depvar, covar, fval): fe = None fe_na = None - - #dict2fe = self.fml_dict2.get(fval) - if self.is_iv: dict2fe_iv = self.fml_dict_iv.get(fval) @@ -271,7 +271,8 @@ def _model_matrix_fixest(self, depvar, covar, fval): if Y.shape[1] > 1: raise ValueError( - "Dependent variable must be a single column. Please make sure that the dependent variable" + depvar2 + "is of a numeric type (int or float)." + "Dependent variable must be a single column." + "Please make sure that the dependent variable" + depvar2 + "is of a numeric type (int or float)." ) if fe is not None: @@ -405,12 +406,9 @@ def _estimate_all_models2(self, vcov, fixef_keys): for _, fval in enumerate(fixef_keys): - - data = self.data dict2fe = self.fml_dict.get(fval) - # dictionary to cache demeaned data - # index: na_index_str + # dictionary to cache demeaned data with index: na_index_str lookup_demeaned_data = dict() # loop over both dictfe and dictfe_iv (if the latter is not None) @@ -426,7 +424,7 @@ def _estimate_all_models2(self, vcov, fixef_keys): covar = fml_linear.split("~")[1] # get Y, X, Z, fe, NA indices for model - Y, X, I, fe, na_index, fe_na, na_index_str, z_names = self._model_matrix_fixest(depvar, covar, fval) + Y, X, I, fe, na_index, _, na_index_str, z_names = self._model_matrix_fixest(depvar, covar, fval) y_names = Y.columns.tolist() x_names = X.columns.tolist() @@ -486,8 +484,6 @@ def _estimate_all_models2(self, vcov, fixef_keys): else: FEOLS.icovars = None - - #self.all_fitted_models[full_fml] = FEOLS self.all_fitted_models[fml] = FEOLS elif self.method == "fepois": @@ -497,7 +493,9 @@ def _estimate_all_models2(self, vcov, fixef_keys): else: - raise ValueError("Estimation method not supported. Please use 'feols' or 'fepois'.") + raise ValueError( + "Estimation method not supported. Please use 'feols' or 'fepois'." + ) @@ -674,7 +672,9 @@ def iplot(self, alpha: float = 0.05, figsize: tuple = (10, 10), yintercept: Unio if ivars is None: raise ValueError( - "The estimated models did not have ivars / 'i()' model syntax. In consequence, the '.iplot()' method is not supported.") + "The estimated models did not have ivars / 'i()' model syntax." + "In consequence, the '.iplot()' method is not supported." + ) if "Intercept" in ivars: ivars.remove("Intercept") @@ -929,7 +929,8 @@ def _prepare_split_estimation(split, fsplit, data, fml_dict): if split is not None: if fsplit is not None: raise ValueError( - "Cannot specify both split and fsplit. Please specify only one of the two.") + "Cannot specify both split and fsplit. Please specify only one of the two." + ) else: splitvar = data[split] estimate_full_model = False @@ -950,11 +951,15 @@ def _prepare_split_estimation(split, fsplit, data, fml_dict): if splitvar is not None: split_categories = np.unique(splitvar) if splitvar_name not in data.columns: - raise ValueError("Split variable " + - splitvar + " not found in data.") + raise ValueError( + "Split variable " + + splitvar + " not found in data." + ) if splitvar_name in fml_dict.keys(): - raise ValueError("Split variable " + splitvar + - " cannot be a fixed effect variable.") + raise ValueError( + "Split variable " + splitvar + + " cannot be a fixed effect variable." + ) if splitvar.dtype.name != "category": splitvar = pd.Categorical(splitvar) @@ -985,19 +990,29 @@ def _multicollinearity_checks(X, Z, ivars, fml2): if np.linalg.matrix_rank(X) < min(X.shape): if ivars is not None: - raise MatrixNotFullRankError("The design Matrix X does not have full rank for the regression with fml" + fml2 + - ". 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 = ...)?") + raise MatrixNotFullRankError( + 'The design Matrix X does not have full rank for the regression with fml" + fml2 + "."' + '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 MatrixNotFullRankError( - "The design Matrizx X does not have full rank for the regression with fml" + fml2 + ". The model is skipped. ") + 'The design Matrix X does not have full rank for the regression with fml" + fml2 + "."' + 'The model is skipped. ' + ) if np.linalg.matrix_rank(Z) < min(Z.shape): if ivars is not None: - raise MatrixNotFullRankError("The design Matrix Z does not have full rank for the regression with fml" + fml2 + - ". 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 = ...)?") + raise MatrixNotFullRankError( + 'The design Matrix Z does not have full rank for the regression with fml" + fml2 + "."' + '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 MatrixNotFullRankError( - "The design Matrix Z does not have full rank for the regression with fml" + fml2 + ". The model is skipped. ") + 'The design Matrix Z does not have full rank for the regression with fml" + fml2 + "."' + 'The model is skipped.' + ) def _get_vcov_type(vcov, fval): From 791fcba08a46f9672c5a7488dad501267513eb4f Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Tue, 18 Jul 2023 12:37:05 +0200 Subject: [PATCH 11/13] update lock file --- poetry.lock | 94 ++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/poetry.lock b/poetry.lock index a517a5f7..fab30655 100644 --- a/poetry.lock +++ b/poetry.lock @@ -849,14 +849,14 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "4.18.3" +version = "4.18.4" description = "An implementation of JSON Schema validation for Python" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.18.3-py3-none-any.whl", hash = "sha256:aab78b34c2de001c6b692232f08c21a97b436fe18e0b817bf0511046924fceef"}, - {file = "jsonschema-4.18.3.tar.gz", hash = "sha256:64b7104d72efe856bea49ca4af37a14a9eba31b40bb7238179f3803130fd34d9"}, + {file = "jsonschema-4.18.4-py3-none-any.whl", hash = "sha256:971be834317c22daaa9132340a51c01b50910724082c2c1a2ac87eeec153a3fe"}, + {file = "jsonschema-4.18.4.tar.gz", hash = "sha256:fb3642735399fa958c0d2aad7057901554596c63349f4f6b283c493cf692a25d"}, ] [package.dependencies] @@ -1919,52 +1919,52 @@ files = [ [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" 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"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] @@ -2089,14 +2089,14 @@ full = ["numpy"] [[package]] name = "referencing" -version = "0.29.1" +version = "0.29.3" description = "JSON Referencing + Python" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.29.1-py3-none-any.whl", hash = "sha256:d3c8f323ee1480095da44d55917cfb8278d73d6b4d5f677e3e40eb21314ac67f"}, - {file = "referencing-0.29.1.tar.gz", hash = "sha256:90cb53782d550ba28d2166ef3f55731f38397def8832baac5d45235f1995e35e"}, + {file = "referencing-0.29.3-py3-none-any.whl", hash = "sha256:7e059500cac23dc5d7d11687291ab60ba1e77ccdf9739b039c1177c06304e98c"}, + {file = "referencing-0.29.3.tar.gz", hash = "sha256:ebd2f5fe533001edaca3eae6caf09de0d70b6a3c78ebe34c98d26526e6fad3aa"}, ] [package.dependencies] From b94eee07a54d5e7e4d2ad5ce65fd7e0e02196036 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Tue, 18 Jul 2023 13:56:41 +0200 Subject: [PATCH 12/13] update lock --- poetry.lock | 251 ++++++++++++++++++++++------------------------------ 1 file changed, 107 insertions(+), 144 deletions(-) diff --git a/poetry.lock b/poetry.lock index 51cfdfb4..86208574 100644 --- a/poetry.lock +++ b/poetry.lock @@ -721,23 +721,14 @@ files = [ [[package]] name = "importlib-metadata" -<<<<<<< HEAD version = "6.8.0" -======= -version = "6.7.0" ->>>>>>> 4a8d2fa02716ea1b68cf6042685fcf5c779af05d description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.8" files = [ -<<<<<<< HEAD {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, -======= - {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, - {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, ->>>>>>> 4a8d2fa02716ea1b68cf6042685fcf5c779af05d ] [package.dependencies] @@ -808,7 +799,7 @@ name = "jaraco-classes" version = "3.3.0" description = "Utility functions for Python class constructs" category = "main" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "jaraco.classes-3.3.0-py3-none-any.whl", hash = "sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb"}, @@ -861,7 +852,7 @@ name = "jsonschema" version = "4.18.4" description = "An implementation of JSON Schema validation for Python" category = "main" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "jsonschema-4.18.4-py3-none-any.whl", hash = "sha256:971be834317c22daaa9132340a51c01b50910724082c2c1a2ac87eeec153a3fe"}, @@ -885,7 +876,7 @@ name = "jsonschema-specifications" version = "2023.6.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" category = "main" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "jsonschema_specifications-2023.6.1-py3-none-any.whl", hash = "sha256:3d2b82663aff01815f744bb5c7887e2121a63399b49b104a3c96145474d091d7"}, @@ -1004,7 +995,7 @@ name = "llvmlite" version = "0.40.1" description = "lightweight wrapper around basic LLVM functionality" category = "main" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "llvmlite-0.40.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ce9b1c7a59936382ffde7871978cddcda14098e5a76d961e204523e5c372fb"}, @@ -1391,7 +1382,7 @@ name = "numba" version = "0.57.1" description = "compiling Python code using LLVM" category = "main" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "numba-0.57.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db8268eb5093cae2288942a8cbd69c9352f6fe6e0bfa0a9a27679436f92e4248"}, @@ -1475,96 +1466,6 @@ files = [ {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] -[[package]] -name = "pandas" -version = "1.5.1" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pandas-1.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0a78e05ec09731c5b3bd7a9805927ea631fe6f6cb06f0e7c63191a9a778d52b4"}, - {file = "pandas-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5b0c970e2215572197b42f1cff58a908d734503ea54b326412c70d4692256391"}, - {file = "pandas-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f340331a3f411910adfb4bbe46c2ed5872d9e473a783d7f14ecf49bc0869c594"}, - {file = "pandas-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8c709f4700573deb2036d240d140934df7e852520f4a584b2a8d5443b71f54d"}, - {file = "pandas-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32e3d9f65606b3f6e76555bfd1d0b68d94aff0929d82010b791b6254bf5a4b96"}, - {file = "pandas-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a52419d9ba5906db516109660b114faf791136c94c1a636ed6b29cbfff9187ee"}, - {file = "pandas-1.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:66a1ad667b56e679e06ba73bb88c7309b3f48a4c279bd3afea29f65a766e9036"}, - {file = "pandas-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:36aa1f8f680d7584e9b572c3203b20d22d697c31b71189322f16811d4ecfecd3"}, - {file = "pandas-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcf1a82b770b8f8c1e495b19a20d8296f875a796c4fe6e91da5ef107f18c5ecb"}, - {file = "pandas-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c25e5c16ee5c0feb6cf9d982b869eec94a22ddfda9aa2fbed00842cbb697624"}, - {file = "pandas-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:932d2d7d3cab44cfa275601c982f30c2d874722ef6396bb539e41e4dc4618ed4"}, - {file = "pandas-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:eb7e8cf2cf11a2580088009b43de84cabbf6f5dae94ceb489f28dba01a17cb77"}, - {file = "pandas-1.5.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cb2a9cf1150302d69bb99861c5cddc9c25aceacb0a4ef5299785d0f5389a3209"}, - {file = "pandas-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81f0674fa50b38b6793cd84fae5d67f58f74c2d974d2cb4e476d26eee33343d0"}, - {file = "pandas-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:17da7035d9e6f9ea9cdc3a513161f8739b8f8489d31dc932bc5a29a27243f93d"}, - {file = "pandas-1.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:669c8605dba6c798c1863157aefde959c1796671ffb342b80fcb80a4c0bc4c26"}, - {file = "pandas-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683779e5728ac9138406c59a11e09cd98c7d2c12f0a5fc2b9c5eecdbb4a00075"}, - {file = "pandas-1.5.1-cp38-cp38-win32.whl", hash = "sha256:ddf46b940ef815af4e542697eaf071f0531449407a7607dd731bf23d156e20a7"}, - {file = "pandas-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:db45b94885000981522fb92349e6b76f5aee0924cc5315881239c7859883117d"}, - {file = "pandas-1.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:927e59c694e039c75d7023465d311277a1fc29ed7236b5746e9dddf180393113"}, - {file = "pandas-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e675f8fe9aa6c418dc8d3aac0087b5294c1a4527f1eacf9fe5ea671685285454"}, - {file = "pandas-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04e51b01d5192499390c0015630975f57836cc95c7411415b499b599b05c0c96"}, - {file = "pandas-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cee0c74e93ed4f9d39007e439debcaadc519d7ea5c0afc3d590a3a7b2edf060"}, - {file = "pandas-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b156a971bc451c68c9e1f97567c94fd44155f073e3bceb1b0d195fd98ed12048"}, - {file = "pandas-1.5.1-cp39-cp39-win32.whl", hash = "sha256:05c527c64ee02a47a24031c880ee0ded05af0623163494173204c5b72ddce658"}, - {file = "pandas-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:6bb391659a747cf4f181a227c3e64b6d197100d53da98dcd766cc158bdd9ec68"}, - {file = "pandas-1.5.1.tar.gz", hash = "sha256:249cec5f2a5b22096440bd85c33106b6102e0672204abd2d5c014106459804ee"}, -] - -[package.dependencies] -numpy = {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 = "pandas" -version = "1.5.2" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72"}, - {file = "pandas-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2"}, - {file = "pandas-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0"}, - {file = "pandas-1.5.2-cp38-cp38-win32.whl", hash = "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5"}, - {file = "pandas-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e"}, - {file = "pandas-1.5.2-cp39-cp39-win32.whl", hash = "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090"}, - {file = "pandas-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f"}, - {file = "pandas-1.5.2.tar.gz", hash = "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b"}, -] - -[package.dependencies] -numpy = {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 = "pandas" version = "1.5.3" @@ -1606,6 +1507,7 @@ files = [ numpy = [ {version = ">=1.20.3", markers = "python_version < \"3.10\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] python-dateutil = ">=2.8.1" pytz = ">=2020.1" @@ -2009,7 +1911,7 @@ name = "pywin32-ctypes" version = "0.2.2" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" category = "main" -optional = false +optional = true python-versions = ">=3.6" files = [ {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, @@ -2191,7 +2093,7 @@ name = "referencing" version = "0.29.3" description = "JSON Referencing + Python" category = "main" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "referencing-0.29.3-py3-none-any.whl", hash = "sha256:7e059500cac23dc5d7d11687291ab60ba1e77ccdf9739b039c1177c06304e98c"}, @@ -2244,7 +2146,7 @@ name = "rpds-py" version = "0.8.11" description = "Python bindings to Rust's persistent data structures (rpds)" category = "main" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "rpds_py-0.8.11-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2708cb3df058446c9aaee8213ad472cbf6be798fa05baf81e2b1b0b67abadfa2"}, @@ -2346,38 +2248,6 @@ files = [ {file = "rpds_py-0.8.11.tar.gz", hash = "sha256:ef29fa64514a17bbc104693acf094e3fef5e98c2ddf58e9777f673fc6b0c5e97"}, ] -[[package]] -name = "scipy" -version = "1.6.1" -description = "SciPy: Scientific Library for Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"}, - {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"}, - {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"}, - {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"}, - {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"}, - {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"}, - {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"}, - {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"}, - {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"}, - {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"}, - {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"}, - {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"}, - {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"}, - {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"}, - {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"}, - {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"}, - {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"}, - {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"}, - {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"}, -] - -[package.dependencies] -numpy = ">=1.16.5" - [[package]] name = "scipy" version = "1.9.3" @@ -2457,6 +2327,98 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "statsmodels" +version = "0.13.2" +description = "Statistical computations and models for Python" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "statsmodels-0.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e7ca5b7e678c0bb7a24f5c735d58ac104a50eb61b17c484cce0e221a095560f"}, + {file = "statsmodels-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:066a75d5585378b2df972f81a90b9a3da5e567b7d4833300c1597438c1a35e29"}, + {file = "statsmodels-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f15f38dfc9c5c091662cb619e12322047368c67aef449c7554d9b324a15f7a94"}, + {file = "statsmodels-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c4ccc6b4744613367e8a233bd952c8a838db8f528f9fe033bda25aa13fc7d08"}, + {file = "statsmodels-0.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:855b1cc2a91ab140b9bcf304b1731705805ce73223bf500b988804968554c0ed"}, + {file = "statsmodels-0.13.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b69c9af7606325095f7c40c581957bad9f28775653d41537c1ec4cd1b185ff5b"}, + {file = "statsmodels-0.13.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab31bac0f72b83bca1f217a12ec6f309a56485a50c4a705fbdd63112213d4da4"}, + {file = "statsmodels-0.13.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d680b910b57fc0aa87472662cdfe09aae0e21db4bdf19ccd6420fd4dffda892"}, + {file = "statsmodels-0.13.2-cp37-cp37m-win32.whl", hash = "sha256:9e9a3f661d372431850d55157d049e079493c97fc06f550d23d8c8c70805cc48"}, + {file = "statsmodels-0.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c9f6326870c095ef688f072cd476b932aff0906d60193eaa08e93ec23b29ca83"}, + {file = "statsmodels-0.13.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bc050f25f1ba1221efef9ea01b751c60935ad787fcd4259f4ece986f2da9141"}, + {file = "statsmodels-0.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:426b1c8ea3918d3d27dbfa38f2bee36cabf41d32163e2cbb3adfb0178b24626a"}, + {file = "statsmodels-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b80fac4a63308b1e93fa9dc27a8598930fd5dfd77c850ca077bb850254c6d7"}, + {file = "statsmodels-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ee69ec0e0f79f627245c65f8a495b8581c2ea19084aac63941815feb15dcf3"}, + {file = "statsmodels-0.13.2-cp38-cp38-win32.whl", hash = "sha256:20483cc30e11aa072b30d307bb80470f86a23ae8fffa51439ca54509d7aa9b05"}, + {file = "statsmodels-0.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:bf43051a92231ccb9de95e4b6d22d3b15e499ee5ee9bff0a20e6b6ad293e34cb"}, + {file = "statsmodels-0.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bf0dfed5f5edb59b5922b295392cd276463b10a5e730f7e57ee4ff2d8e9a87e"}, + {file = "statsmodels-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a403b559c5586dab7ac0fc9e754c737b017c96cce0ddd66ff9094764cdaf293d"}, + {file = "statsmodels-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f23554dd025ea354ce072ba32bfaa840d2b856372e5734290e181d27a1f9e0c"}, + {file = "statsmodels-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815f4df713e3eb6f40ae175c71f2a70d32f9219b5b4d23d4e0faab1171ba93ba"}, + {file = "statsmodels-0.13.2-cp39-cp39-win32.whl", hash = "sha256:461c82ab2265fa8457b96afc23ef3ca19f42eb070436e0241b57e58a38863901"}, + {file = "statsmodels-0.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:39daab5a8a9332c8ea83d6464d065080c9ba65f236daf6a64aa18f64ef776fad"}, + {file = "statsmodels-0.13.2.tar.gz", hash = "sha256:77dc292c9939c036a476f1770f9d08976b05437daa229928da73231147cde7d4"}, +] + +[package.dependencies] +numpy = ">=1.17" +packaging = ">=21.3" +pandas = ">=0.25" +patsy = ">=0.5.2" +scipy = ">=1.3" + +[package.extras] +build = ["cython (>=0.29.26)"] +develop = ["cython (>=0.29.26)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + +[[package]] +name = "statsmodels" +version = "0.13.3" +description = "Statistical computations and models for Python" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "statsmodels-0.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b71bb64c6d4087dd6192eadfad390fbeb4074f676ef34c7e56579cead8c478e7"}, + {file = "statsmodels-0.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:658b634c273c2f287a0086e56a5d6b95ec3ddac991cbb020b34f731e932de0bd"}, + {file = "statsmodels-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab9f63f432889b179967ab645aea7480e28731823a3b99850d7f7a561b624f93"}, + {file = "statsmodels-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f432fb7f54ce5edccc83aa36566653cd04ee35bbbefdf0a2b7bd9c97c5da443"}, + {file = "statsmodels-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:4cd64076c3ad366b10fd4e6f8ca6aeb1e398ec5480bddb65fba8889dd9eb550d"}, + {file = "statsmodels-0.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33f9caff2dbdfef22505678407d2f549b32a4a2729eb8675b60eb2932fc0e883"}, + {file = "statsmodels-0.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:393f6a7ec85f65be9ac1a13be152dd14c65084436c48bcdf94cb21ef0b6cb79c"}, + {file = "statsmodels-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12b56d13d9a2af7a1aadc3fe9f3d3c18a5727a651323d94e7c2047177adfb9ce"}, + {file = "statsmodels-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a61e0652f62b01981d8e857aa77550b42cf316c9d8e569b559869c248e3de834"}, + {file = "statsmodels-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:5368bccd471bb8cef0a8957ba5f2a3e5b5ecc433b0783d9f602039df45c780d3"}, + {file = "statsmodels-0.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1ecfb191958de187ba44b93316f4953b8b6588b5f68dcab218f76498a862dd7c"}, + {file = "statsmodels-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea2b481b15e9e501904a1c36efc5f9a202f87529e600a99c364fd7e4598ae88"}, + {file = "statsmodels-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d270a11aac6720a8024e1136ab44036d0878f62995617bb5b9fc5c77ea3d3b8"}, + {file = "statsmodels-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2185ed356823cd1c258c09b790f0c21d2fd49321e82c79f8f6dc546f1c671d7a"}, + {file = "statsmodels-0.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9da39a36d114abcdcf8ebd351ed69229e23cb12b8a607996cb6511fa88e78b4d"}, + {file = "statsmodels-0.13.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3b3a9942d0b462af4c68c3895095d304869cbec9d97f3c268f19a6ba7ba294dc"}, + {file = "statsmodels-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fff0316420bc4f6fbd80dd77eb74f3834fcd0e4ca98ba9611b8a6d41ebbb979"}, + {file = "statsmodels-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352041bc04eaf90232e54a86861a460365ef45f34f58529578487e6f640dadf3"}, + {file = "statsmodels-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:61a0f39848ebacf5560e1539ca0037b8fc25cc9d1d7444bbef5bdc0a3c56087b"}, + {file = "statsmodels-0.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:78cd12b0ee543fa955d2bace18518fc7d2b57f13c65929b54445bf3e54955b08"}, + {file = "statsmodels-0.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:afccb80e3ddc969bfb5285f846ac2622861ffe192423087214d60e4c6e40e384"}, + {file = "statsmodels-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3609824e1ced44722bd905564d8ce94df29d24e32a6dd67cc9255932aedcd7b"}, + {file = "statsmodels-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81f8e71963a7bd169338fbb1472e34ec85ae4447414ac37bdae5cf6d1ac223bb"}, + {file = "statsmodels-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:000c7a1ce6780834f5fbb63f9ae07a00863a00f602c7c470c942153692f5bbc3"}, + {file = "statsmodels-0.13.3.tar.gz", hash = "sha256:ed71df887334b1d332e71d33215122bdd54494dcb2248606b30bcfa6112e860a"}, +] + +[package.dependencies] +numpy = {version = ">=1.17", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""} +packaging = ">=21.3" +pandas = ">=0.25" +patsy = ">=0.5.2" +scipy = {version = ">=1.3", markers = "python_version > \"3.7\" and python_version < \"3.12\" or platform_system != \"Windows\" and python_version < \"3.12\" or platform_machine != \"x86\" and python_version < \"3.12\""} + +[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 = "statsmodels" version = "0.13.5" @@ -2500,10 +2462,7 @@ numpy = [ 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\""}, -] +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\""} [package.extras] build = ["cython (>=0.29.32)"] @@ -2600,6 +2559,10 @@ python-versions = ">=3.7" files = [ {file = "virtualenv-20.24.0-py3-none-any.whl", hash = "sha256:18d1b37fc75cc2670625702d76849a91ebd383768b4e91382a8d51be3246049e"}, {file = "virtualenv-20.24.0.tar.gz", hash = "sha256:e2a7cef9da880d693b933db7654367754f14e20650dc60e8ee7385571f8593a3"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" filelock = ">=3.12,<4" platformdirs = ">=3.5.1,<4" @@ -2679,7 +2642,7 @@ name = "wildboottest" version = "0.1.17" description = "Wild Cluster Bootstrap Inference for Linear Models in Python" category = "main" -optional = false +optional = true python-versions = ">=3.8,<3.11" files = [ {file = "wildboottest-0.1.17-py3-none-any.whl", hash = "sha256:2d1781cb04e3bda911833f1baff568c8578edcc880e3e49c81f8a0c955fd9230"}, From 9e0cb0a9b139e620d620594035fb83028b000306 Mon Sep 17 00:00:00 2001 From: Alexander Fischer Date: Tue, 18 Jul 2023 14:06:57 +0200 Subject: [PATCH 13/13] poetry buidl --- dist/pyfixest-0.7.0-py3-none-any.whl | Bin 0 -> 27172 bytes dist/pyfixest-0.7.0.tar.gz | Bin 0 -> 24912 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 dist/pyfixest-0.7.0-py3-none-any.whl create mode 100644 dist/pyfixest-0.7.0.tar.gz diff --git a/dist/pyfixest-0.7.0-py3-none-any.whl b/dist/pyfixest-0.7.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..8e87d0d98594b6625e91f5226ea97f399ab06feb GIT binary patch literal 27172 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 literal 0 HcmV?d00001