From db8561746827c5a9d679e14a8edd2b8ff264e8ed Mon Sep 17 00:00:00 2001
From: Lars Reimann NeuralNetworkClassifier
return a new NeuralNetworkClassifier
. The original NeuralNetworkClassifier
will not be changed.\n",
"
date | value |
---|---|
str | f64 |
"1947-01-01" | 21.48 |
"1947-02-01" | 21.62 |
"1947-03-01" | 22.0 |
"1947-04-01" | 22.0 |
"1947-05-01" | 21.95 |
… | … |
"1947-11-01" | 23.06 |
"1947-12-01" | 23.41 |
"1948-01-01" | 23.68 |
"1948-02-01" | 23.67 |
"1948-03-01" | 23.5 |
date | value |
---|---|
date | f64 |
1947-01-01 | 21.48 |
1947-02-01 | 21.62 |
1947-03-01 | 22.0 |
1947-04-01 | 22.0 |
1947-05-01 | 21.95 |
… | … |
1947-11-01 | 23.06 |
1947-12-01 | 23.41 |
1948-01-01 | 23.68 |
1948-02-01 | 23.67 |
1948-03-01 | 23.5 |
D)LKbhH6f1SsHmok|`*~2{shaoZ`*u0W&cJRG^(~IDX78KQ z&bxDMsKJ+VY2J0=Nz@5ZN11*!K2Mu9k)r($g-2DHUVx$(Nt0^7EKG)Z5C#ggGQNA3 zdDtxFpJaieBAsfTS+pJmH{}WHHwB8O_tUeBMQsSyf;Y5rvj zS*%y-Y7@4qa-BD=;b;lfAYqeec4@1cDQ+=5Qnj9IzlptX&$-qmtb)bCfb!@TaUAe= z*g?qLdCi_64xgY%Knls5fl5oo0x7{9tG9xQD&d8<+}_5~0LG}@`U(&fA@XD`uJ7^n zGcB|F@%t@ha1vPvJ|oD-A(Xn=giR6t$T0TdfjEpp9eptJ4jf4wq`4U*bHd7JCGUNi z0q}Oc ljvJNDVM`gF3=^d4AqA;xwGG`HAIF (vq^e5sbr2K+B|w6 z#-qnMHn{)kA-BOMst||Tnxx_bx#8T(dm)4N=db62<9!V&E7RL;<=tAkhl+#H3`yHG z?wb%mg|*zHXfQW*Zso(Fy@43q*GCU@bKfY59nXh+v{pH&Q+&4f==FifOM%F1+?m-t zdf5W=V{1s7;ibE2THRKfMXa4>L|g`ENYT-+jdRC&;d9O1@A6Zrus$;SsL@8Cp7k@q zm$TPHwnp)H)QP0{4(S{GI^Z #Gz+p|QZ#;Mp+)p7k1g+3g!`GLW7D@iqQ6-rxW3p>iZSXBjDbPF zjr*HO|2FY2QdJ|RuRY@<4ndJG18550XJZ%elu%KJ2Ok52?p73cY|^#^ROuV|9t|h8 zez&sW6?*O?sWT}_zHiI=7TUXU6OboKN2N6JnUXd7F!u|i9}##>z8c?-ZoZx2#+$wv zOuQ7q_Mh)`VqB{bR*;N%?$B7z!1wIPNS%mW(#9mO$Rc@UpigTll2;OC!`!&nL#oZ-#=8gKx3X(*P+#d9I z*eOeKttIX|2^(pBFGWg*5V;S5@dlyznM_Yq!Q>YO8R7S<-L8J|ulFUp W3&pndx&(bJaOo4-iO$qq_!ww8 hrR z`hI@Auiw3Qt^5Byv*w(&=KS`andjMO@3S9GRa7(*00saH001xmigfzn8Yln&78(FR zjQqq{*4fD&;^c0w>*E4(Gv)Snbf`)i(s&CZkUvrSA-lr$e7;@^>;6v208tw|oyAvW zs|g;Txv?v8;*&b5d{R5XIxF~`n>c^Y@PkPb`^d7+%Bl1?LzL=cmG&m9-00?m1k&^( zoiT4r(%D<}(}%~8>!&b!Lh5Pst5olbVF!C)>NB38P-hEBfHO7(n;2ofcZ~^73O|OH zb*g^R&hWkcAiG0~$$*u#hH7R(ILacP6yDyGqsL1T^085EMYk&ZT>kC}nns2&hA7Q` ztOJNwY2)D)2I9L!nSd52`x;+~m+fHq)SYiT%LhXjERtM&U&aJqR7;=vLdtJZ%c7On zqAE@9cR)ECMNcJq;l1n!d|mYkSAj;SF>!L27zy2J#xTAoPt%()_GcjQf>PM08lOWH zTPV|y+`u~{676`*XuP&U`0JWUadI!uqib+4+qLsBrWm`IH-SiSudh)7n*V^mQ4hp) zh}==T1pwe8S92)D!HtLe=UkPj{_rgbFMLnwM+EF-Vm_WgM%7DNshvSL@Tu|~u<=D9 zGu3=I8#RG0Whkm*P-oze_p|e2FScL|$6p1iqKQaEnVP&_g{PgndSG&}LQ@r7tCso* zJtvMPjx!WheAqoZ<2Wi?%JNkQ7nu~szsc1Rz_|@5v5AYR!^y-mg2C_9jTWp JQ>QHFT2w{Uwb? zK$I6==$Yznslnr2d`_md?FZ*8{6q1{mB~l=I8Eq}$f1m>y R9g*cUF1ZLgD2e;XH*T(4ztA=PD@ucTLf{yj&61MDMy`t|}k zE8h)G>}Tk5&%O`VLg)tG7x6y44>6#+t-mh|`dA1j-B`D<;dJW-rbX3`y??`)!(
Oi&->Dfw zWFuNcPv`Ib2IHybehU++B2Ud+exUAVw_-ZKFcoBZh2|yG{iCx)$)L;#_S;51&PUql z=LQO|-^RS_ie*kd=bB(L#2wr=C#2@}=nFPHZPIb#L|+^k3tON(dFExh$wS(^J9&MN z^=pL|O2z3T&!PYZLZ`0~Oi>sY5v7PNZ{i149@5;!t%J;r}w|{c@66nL66ywbB{Y z4Z}D{E`JUNB<+bbvoYlXAqV#(OZT7qzaIVn>HmhnKeNn>h#8kJ zNC#ZVEJKN0y&ZV|N;F>1P 93@dFl6^D*N0t&rU!_7;uI&trjuow`Y! jj8)hFI}d zKM3_IvSbW5Jv*(vEb3Jf=`*D>EG8SE6iL_*hcy*`bXh}f6|nWEeo=JC81Egenrh47 zck-BP(LAwj-3zen+-G=R#a-ru9j8Ts&SEd;I40rNr&6i5O5~a;QCv~s-B~P(JwvA> z;@=W;!t~FnUCpBH@%zPTx&p*p6qzdr>idNrl2M3VtQ?TvgdYjucY+yTWTp9t#3UIL z0J!}ZE^h8V4iL9rWlvAlX%<8 TPu9}u-k#* 1jMkk>(sit7t{ma`DghCG^_1Oy#KKRgtDt z3aZ 6{O zV_{vCX!wkW9HWnA!$gWGre;Cqb8 akT0z+>N(L5p{U6R5`#@I==n3 zqu3Ll^*f+$#l4u66g5aCd@g%p!UV*yd-?iOKbza%n4vMD)x8-KZb^8$=Ak&cKuh)f zolUC_U!T*KTIcpPZ@!~P2+=;KLu1SM*zpmA -5*s3OFq}1YG9*>oL6Z(-ZXBlt)ObbLgt_-3u zXO_;9`(`Efa*^4GFFv*7A($kQ-B;e2&&`CdSMT#`b+ar_1Nm^Xom%HyTgKhG3(4`J zAY^3!XK@vII-m9q8TZ!Qe_i~LIl WiBhx~&f%o27QK|89q>#Ldxm7gd_yylODomE zseYPy!#B8*3))2y$WM)Ldv&os6q@vMCk^M(j2@k*Ue*HXk%Ww37byqZ+|IvDX zdE5uUWO2Vrxh`j0q<6^@1G(njhsTdXUL-sdaQ1)PWB)4u;Zg>h_o;wghGq~usinL` zVsgL=E LUEVtbDJTw%o2pdvs|q4yhvOdn~dTw5Hh{ZP%8}PvV0i> zb(wy8Z%Fx62(E&*mSdCx?DEW;pJb^16<8D(>YGRetkMu43PF6nXbj}SO?;j#Bvmko z=AR;~Fs9u;jyOczn^KFs?XChT>F@Nd0e^_lkaozcyf|~5J>a1eL9YvLI+g`um}0g1 zZ;
Nm( KAM(4s7H)2n(cr ;(Zzf z@H1Rs%zOeVtW5WD`nXm`k_emwua0x+y7{iIc1i`|-9vT!w|kNRH9?o>M|3=J2mnN> zbGdavUK14bZ7ah0>U^~|_NpoFo$?u>E3e@07ye}lw_sWt{QapQ#mI!v$XmhGqt%5S zz$+D%1tW$EmZ{!~b=vb<3p-_6ZaU6o8j&k)0vc;)(P~DY;X6AZ^SHIyv5se@imJ}l zwl&>qI17p!x K2~#me(7H *lIs+&%z5@99(jSwzj@I_Ni9dnd3+*~oJ zK^XYK_S@Qu%Tmw4@FC9Rt`utFx&)3cg#@uV(Gng_!&5w6jqG>TN2=I4w#{R24MF&r zbi(ve)fuRRw8vnTu22g1P1@JC-dHBwL#T`QZY9bj&?_>M-J3oSahYP0321B!PmW0* z**}P2ZXY3DU#1{~`@l*Yjt+#xf%iE|^=^AIKIzMv^eE!a8K;LzplfG3%i77}J1=&$ z0JPuIe;C1qw!Klli+E*R;ux%KL2~a) %N76!)$d zVv^ckW%u=l25UAhR)o^G;#ID&@$XgW9Hr7GkI}3Xvu$kVq;;sdB(xEzwZ5$xl|HdQ z3R`3`w#+=6j9v)}^l{Vc^6 zy^`4ks*psE_x3XEao$=ctrJ++dTze~N-5(S{2v zFrgh}5Q(q{5HGEhnB`e3-fzKoo8~ &P^F> zoi)EUsZn4~qcEQpnXPRRXzNu=WqbBd%qX|F+R1c!_3P0ZSXMzEK8!RF%Up_rIpNc% zaL+PS9tQJqSQ93aF@JKfE_>|I9E3$PtuL2a%c6FW&o9pZ&V6%HF}@$+YoxH0>~cEa zMjgJA-18zwed11O%coeq((s21me^zOCGug~a^(2Wn*wKMlQpODF?#Z;aO&IpCE)j7 zEw9lZ=*H+SlL4L$d2<6PJQa4X`l{P?mHa&Of`vuFOp=ebv?I9us?DEL?D1q?c%F}i ztbBYrx4cfq-D@)$z0!n!f!V$=S5$DiEa{~Ts^BLr;u#wbU%x{k?6lKz)J_tEyHlc} zd}mV!*Drfyj5f|mEd+FB7;8^dErfYrC0><$4dcvrn6OmYAWK%wBTQr1q=R$e+U%~h zhWe8jdyOOtMf*y3loh2&n$i}~HaDU{q2j&q<43b=!(zkv2U;%tMxBCqWOd)H%W8dH z#+{VW lmxZnyr zUZ4D{r~WBPAj|&Wn}DjMk=St%!NA@HN$OttvcO1_));BAysivZe!ZV3acSLF9L&>( zvoFc@OM*8#>tG4VaXqGgl=$(F$5;GG=8}PrflpXI8aQQxL @ofoUACTmrD5bd4Y<4^wo7) zDb;IpoXQ0twMZ+O<>2_4&mc9usE`` wTeqM4e;En=%Xn zKZdaGL(Lf71SjB(VN+V(x!MyZiYA^>6_QCIoipq_So{iZrvP&@eqx#zmcBmrAYH^5 z)1&}h#+Hn746|FH4i0>Xn$1Ok?JBLeX{3Ub$jO#kk%1N7Q+GG_9*0jqc++b%mKUQ# z<7@ob_V? iwQik+?ue5|%*Yn8 zM?Lv0wUVo3B#GW^>4!QNfbQu4FJ2+RsG&-AWFuzE#F?6MJYx%jMi1h!;u0(b_@*&~ zM>p@I2OiU9bra%Xd;%vdI}6}1&P7BEVF`{K5x~i{Kyjs7`wz?%Gp8>fcN&d!U0)x2 zt?ue$5U0dK_Ru~JpJzk*39owL9bjHeYgfJbb^_Q{>-v0?L23eF{SRc<^Utf{W@NvD zf(r_+KQcygkgd_3n;3Dkfk52dcz!Lv?uRjBBghU35Aek=S7x*`b^O&fWgj*MTCXoV z$YFc8L2Xus`D1)~iBA*Fv65fdM^9qBjbcHa5{Z4qprC6bN3#$EczS)I;ikNnUD!wM zWh;Zt(%klKI2aN>^|UlHMZ$72^JrpA$u`$dPXAV)$!3m^A!U+d912t#RpD%08>fe; z sa#LR<4_x_WK=`ud7nLpCm^MAr6m>!7uE~qK>VPL#b10p0%1}#28Jf z51pp!hH_Dh1(hxvxSPUd=2Zr)YlhYu`W+xGA*6!M*J%yt;jM2_MEsw9YE4fW@O ~8xTp@BIX5 g<6<8;3dm%FWLkD`+}3h8P!^hFezm9@}b8pvz~#7aCE@(yQQ&mgO+5?I;5 z!{>TF5D`Q5o)g#Jn4;D!B>I-J=zH~8`~|A#b<3EV!z{h|p)HkFRuW=6v{din9Dv@* zB|23-{JmmtZ-X9)6Pm_{oG5*F93rC^3MV45*#jwKU48eheLwGLlM<|>9Q44lRCSKQ zcwYlC&&K9wZTeYR+{yac5451_g@su?>+(!vS1EZ`p;fZ<8i%^a3-7JNF^kvyS=<6i zxjU2SbKvsfd!NvpWxd!5v?8V3M-3pNfj;y1w0KnpnKepXMW*8^SlmPc&+QZz4h8Gl zLfY`I$XzAq%}`8tXKOTnAkq8_Ym{4Dfd5%DM*{x0@!u%unyUYF@Tcl~V;zJf@oyUN zZ^NI0#ZSHLPet^`Fbnxx|IPZp^wGbp|7W%B#ySwG{{N}H{r>LXG4`j3bYs1W{=Z2| zzy19F4}Xd-H-0WLe)+kPVE#1yvuC|AJ;VNG`ez6Gr-MJM-;INP N$N~WV3$z%=ZU6uP diff --git a/tests/resources/emptytable.json b/tests/resources/emptytable.json deleted file mode 100644 index 0967ef424..000000000 --- a/tests/resources/emptytable.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/tests/resources/json/empty.json b/tests/resources/json/empty.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/tests/resources/json/empty.json @@ -0,0 +1 @@ +[] diff --git a/tests/resources/json/non-empty.json b/tests/resources/json/non-empty.json new file mode 100644 index 000000000..0a99ca9a0 --- /dev/null +++ b/tests/resources/json/non-empty.json @@ -0,0 +1,6 @@ +[ + { + "A": 1, + "B": 2 + } +] diff --git a/tests/resources/table.json b/tests/resources/json/special-character.json similarity index 100% rename from tests/resources/table.json rename to tests/resources/json/special-character.json diff --git a/tests/resources/parquet/empty.parquet b/tests/resources/parquet/empty.parquet new file mode 100644 index 0000000000000000000000000000000000000000..af10173c5bff93e8800ea46b0ff46770927f830b GIT binary patch literal 135 zcmWG=3^EjDl9cgaDay|;5oKTyW02&Ll#$?Z3<~lOw<=D~NX<=@@X-f>Dn}4-1rZiy zKz>Caln)m2c62Oubar$E(t(cJ0YLfka*({IqhmT$9f)$YWsqPC$j?bEDwgD7sAgbb I2mm?(0G}QqAOHXW literal 0 HcmV?d00001 diff --git a/tests/resources/parquet/non-empty.parquet b/tests/resources/parquet/non-empty.parquet new file mode 100644 index 0000000000000000000000000000000000000000..1bc948e353f14fe82d1640e0d10702a2561ffa25 GIT binary patch literal 844 zcmb7Du}T9$5S?2u;ffRyGRrMoA%Y=bAPQ1ZB8m>j&dk1fZ{HqlO!ZlGF^`iws1N{3kCo2}j{qEQBoG8G zGn&UNW`hMNc`4=(Djpm#6*tO(F?7v5Wb?*%2y 4qa9SpCpx3d(b6^7fs`@1=v$E-4v|1f> z0o^IZKPAZ_Xk`LZE #N;d1-v 8a2b&fb9Sr#w3zp5p@-P$H<(;5-y8coNHce{db5jB%JE-BoV zCX{9Gnuivxs2~*DxlqPgabI*e*Au?w5v|WKsbWv=TVd*{=y4VwAzL7-%K6t;&n_FX zNs(YR3b$mQb0mH_tWTo&fJsYshf$6utyv2!A$=4P_}RF1*0^Y!asa>|yzz60`5k=$ D&?bPi literal 0 HcmV?d00001 diff --git a/tests/resources/parquet/special-character.parquet b/tests/resources/parquet/special-character.parquet new file mode 100644 index 0000000000000000000000000000000000000000..25a441cf7e49eca7a39ff82e9403fca588badede GIT binary patch literal 791 zcmb7DPfHs?6n`_jY;y>bLf)_gdkBI{XalKWjY=rIsfz}cY*I?E4N@$$C6I`=9((Sw zC((;1kG=RAgno=3Joy1iLGitDlcvx^JBK&(-uwM|v%}`pU&IjSu(pjF0ib@-ys14{ z1qe9#arzYjD>&caW(6aRl4Ym|T#hA7;3WdkoM;6BmhDrBDmGSxWuwi3IaX<@{U?nb zS#;KMBEc%~7t4~!%ZjHbPW-GBrZ*2K=FXdcQRbUUua($OiL(;+p|<`i_YuJw0AHNK z?QeY1PK?9Xj02mPbB+6QL~Yxf;b=JA#}Kf*p!xm_u$@RNl+1zAHnENLOeO#Hjm%Yu zRdXBQBS=qz1poJH=2wWuoQL=f%x7(MS~A~tRfdks)bDp+t&MlzzWFeSf2yXeR)=_H z5>^g4|JW;XU)mxX({m!;d-OQx{^6nYnY35ngzt7FaT2;m3|d)|qgQqw=LF7*FGPp; ze!=%VqV*?CYI^7UQJDHp^mvy!9FIWM68}%$--~WYk+PQ@dgMBS=RK2od3hXB?&o0< cRu_XTBZ#AX_ None: + assert _get_similar_column_names(table.schema, name) == expected diff --git a/tests/safeds/data/image/typing/test_image_size.py b/tests/safeds/data/image/typing/test_image_size.py index f8622c2de..dd51a5ede 100644 --- a/tests/safeds/data/image/typing/test_image_size.py +++ b/tests/safeds/data/image/typing/test_image_size.py @@ -2,11 +2,11 @@ from typing import Any import pytest +from torch.types import Device + from safeds.data.image.containers import Image from safeds.data.image.typing import ImageSize from safeds.exceptions import OutOfBoundsError -from torch.types import Device - from tests.helpers import ( configure_test_with_device, get_devices, diff --git a/tests/safeds/data/labeled/containers/_tabular_dataset/test_extras.py b/tests/safeds/data/labeled/containers/_tabular_dataset/test_extras.py index 1c380af59..a8b6ae192 100644 --- a/tests/safeds/data/labeled/containers/_tabular_dataset/test_extras.py +++ b/tests/safeds/data/labeled/containers/_tabular_dataset/test_extras.py @@ -15,7 +15,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", ), Table({}), ), @@ -27,7 +27,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", extra_names=["A", "C"], ), Table({"A": [1, 4], "C": [3, 6]}), diff --git a/tests/safeds/data/labeled/containers/_tabular_dataset/test_features.py b/tests/safeds/data/labeled/containers/_tabular_dataset/test_features.py index 446664c36..73a3e8c96 100644 --- a/tests/safeds/data/labeled/containers/_tabular_dataset/test_features.py +++ b/tests/safeds/data/labeled/containers/_tabular_dataset/test_features.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TabularDataset from safeds.data.tabular.containers import Table @@ -14,7 +15,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", ), Table({"A": [1, 4], "B": [2, 5], "C": [3, 6]}), ), @@ -26,7 +27,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", extra_names=["B"], ), Table({"A": [1, 4], "C": [3, 6]}), diff --git a/tests/safeds/data/labeled/containers/_tabular_dataset/test_hash.py b/tests/safeds/data/labeled/containers/_tabular_dataset/test_hash.py index c40d6c43a..7e7f580dd 100644 --- a/tests/safeds/data/labeled/containers/_tabular_dataset/test_hash.py +++ b/tests/safeds/data/labeled/containers/_tabular_dataset/test_hash.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TabularDataset diff --git a/tests/safeds/data/labeled/containers/_tabular_dataset/test_init.py b/tests/safeds/data/labeled/containers/_tabular_dataset/test_init.py index 93d5f6681..52ada3350 100644 --- a/tests/safeds/data/labeled/containers/_tabular_dataset/test_init.py +++ b/tests/safeds/data/labeled/containers/_tabular_dataset/test_init.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TabularDataset from safeds.data.tabular.containers import Table from safeds.exceptions import ColumnNotFoundError @@ -153,7 +154,7 @@ def test_should_raise_error( error_msg: str | None, ) -> None: with pytest.raises(error, match=error_msg): - TabularDataset(data, target_name=target_name, extra_names=extra_names) + TabularDataset(data, target_name, extra_names=extra_names) @pytest.mark.parametrize( @@ -240,7 +241,7 @@ def test_should_create_a_tabular_dataset( target_name: str, extra_names: list[str] | None, ) -> None: - tabular_dataset = TabularDataset(data, target_name=target_name, extra_names=extra_names) + tabular_dataset = TabularDataset(data, target_name, extra_names=extra_names) if not isinstance(data, Table): data = Table(data) @@ -250,5 +251,5 @@ def test_should_create_a_tabular_dataset( assert isinstance(tabular_dataset, TabularDataset) assert tabular_dataset._extras.column_names == extra_names assert tabular_dataset._target.name == target_name - assert tabular_dataset._extras == data.remove_columns_except(extra_names) + assert tabular_dataset._extras == data.select_columns(extra_names) assert tabular_dataset._target == data.get_column(target_name) diff --git a/tests/safeds/data/labeled/containers/_tabular_dataset/test_into_dataloader.py b/tests/safeds/data/labeled/containers/_tabular_dataset/test_into_dataloader.py index 43329ec8f..d99eb7734 100644 --- a/tests/safeds/data/labeled/containers/_tabular_dataset/test_into_dataloader.py +++ b/tests/safeds/data/labeled/containers/_tabular_dataset/test_into_dataloader.py @@ -1,9 +1,9 @@ import pytest -from safeds._config import _get_device -from safeds.data.tabular.containers import Table from torch.types import Device from torch.utils.data import DataLoader +from safeds._config import _get_device +from safeds.data.tabular.containers import Table from tests.helpers import configure_test_with_device, get_devices, get_devices_ids diff --git a/tests/safeds/data/labeled/containers/_tabular_dataset/test_repr_html.py b/tests/safeds/data/labeled/containers/_tabular_dataset/test_repr_html.py index f369c7c04..64c233d4d 100644 --- a/tests/safeds/data/labeled/containers/_tabular_dataset/test_repr_html.py +++ b/tests/safeds/data/labeled/containers/_tabular_dataset/test_repr_html.py @@ -1,13 +1,14 @@ import re import pytest + from safeds.data.labeled.containers import TabularDataset @pytest.mark.parametrize( "tabular_dataset", [ - TabularDataset({"a": [1, 2], "b": [3, 4]}, target_name="b"), + TabularDataset({"a": [1, 2], "b": [3, 4]}, "b"), ], ids=[ "non-empty", @@ -21,7 +22,7 @@ def test_should_contain_tabular_dataset_element(tabular_dataset: TabularDataset) @pytest.mark.parametrize( "tabular_dataset", [ - TabularDataset({"a": [1, 2], "b": [3, 4]}, target_name="b"), + TabularDataset({"a": [1, 2], "b": [3, 4]}, "b"), ], ids=[ "non-empty", @@ -35,7 +36,7 @@ def test_should_contain_th_element_for_each_column_name(tabular_dataset: Tabular @pytest.mark.parametrize( "tabular_dataset", [ - TabularDataset({"a": [1, 2], "b": [3, 4]}, target_name="b"), + TabularDataset({"a": [1, 2], "b": [3, 4]}, "b"), ], ids=[ "non-empty", diff --git a/tests/safeds/data/labeled/containers/_tabular_dataset/test_sizeof.py b/tests/safeds/data/labeled/containers/_tabular_dataset/test_sizeof.py index 1edcc1163..2f36c9461 100644 --- a/tests/safeds/data/labeled/containers/_tabular_dataset/test_sizeof.py +++ b/tests/safeds/data/labeled/containers/_tabular_dataset/test_sizeof.py @@ -1,6 +1,7 @@ import sys import pytest + from safeds.data.labeled.containers import TabularDataset diff --git a/tests/safeds/data/labeled/containers/_tabular_dataset/test_target.py b/tests/safeds/data/labeled/containers/_tabular_dataset/test_target.py index e7b49ac93..d6bb24887 100644 --- a/tests/safeds/data/labeled/containers/_tabular_dataset/test_target.py +++ b/tests/safeds/data/labeled/containers/_tabular_dataset/test_target.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TabularDataset from safeds.data.tabular.containers import Column @@ -14,7 +15,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", ), Column("T", [0, 1]), ), diff --git a/tests/safeds/data/labeled/containers/_tabular_dataset/test_to_table.py b/tests/safeds/data/labeled/containers/_tabular_dataset/test_to_table.py index 17cb64b3c..f96527b57 100644 --- a/tests/safeds/data/labeled/containers/_tabular_dataset/test_to_table.py +++ b/tests/safeds/data/labeled/containers/_tabular_dataset/test_to_table.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TabularDataset from safeds.data.tabular.containers import Table @@ -47,6 +48,5 @@ ids=["normal", "table_with_extra_column"], ) def test_should_return_table(tabular_dataset: TabularDataset, expected: Table) -> None: - table = tabular_dataset.to_table() - assert table.schema == expected.schema - assert table == expected + actual = tabular_dataset.to_table() + assert actual == expected diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_continuous.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_continuous.py index eae4dd23e..3a6892b67 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_continuous.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_continuous.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TimeSeriesDataset @@ -13,7 +14,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", window_size=1, continuous=True, ), @@ -27,7 +28,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", window_size=1, extra_names=["A", "C"], continuous=False, diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_extras.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_extras.py index 3aae37aaa..ad36e7661 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_extras.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_extras.py @@ -15,7 +15,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", window_size=1, ), Table({}), @@ -28,7 +28,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", window_size=1, extra_names=["A", "C"], ), diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_features.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_features.py index b36270725..59955c574 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_features.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_features.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TimeSeriesDataset from safeds.data.tabular.containers import Table @@ -14,7 +15,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", extra_names=["C"], window_size=1, ), @@ -29,7 +30,7 @@ "T": [0, 1], "time": [0, 0], }, - target_name="T", + "T", window_size=1, extra_names=["B"], ), diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_hash.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_hash.py index 546c6b532..7143a3c82 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_hash.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_hash.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TimeSeriesDataset diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_init.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_init.py index 43700bb6b..f9aeff8ba 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_init.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_init.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TimeSeriesDataset from safeds.data.tabular.containers import Table from safeds.exceptions import ColumnNotFoundError @@ -109,7 +110,7 @@ def test_should_raise_error( error_msg: str | None, ) -> None: with pytest.raises(error, match=error_msg): - TimeSeriesDataset(data, target_name=target_name, window_size=1, extra_names=extra_names) + TimeSeriesDataset(data, target_name, window_size=1, extra_names=extra_names) @pytest.mark.parametrize( @@ -204,7 +205,7 @@ def test_should_create_a_tabular_dataset( ) -> None: tabular_dataset = TimeSeriesDataset( data, - target_name=target_name, + target_name, window_size=1, extra_names=extra_names, ) @@ -217,5 +218,5 @@ def test_should_create_a_tabular_dataset( assert isinstance(tabular_dataset, TimeSeriesDataset) assert tabular_dataset._extras.column_names == extra_names assert tabular_dataset._target.name == target_name - assert tabular_dataset._extras == data.remove_columns_except(extra_names) + assert tabular_dataset._extras == data.select_columns(extra_names) assert tabular_dataset._target == data.get_column(target_name) diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_into_dataloader.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_into_dataloader.py index b430f4a7a..1c4e03743 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_into_dataloader.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_into_dataloader.py @@ -1,12 +1,12 @@ import pytest import torch +from torch.types import Device +from torch.utils.data import DataLoader + from safeds._config import _get_device from safeds.data.labeled.containers import TimeSeriesDataset from safeds.data.tabular.containers import Table from safeds.exceptions import OutOfBoundsError -from torch.types import Device -from torch.utils.data import DataLoader - from tests.helpers import configure_test_with_device, get_devices, get_devices_ids @@ -36,7 +36,13 @@ def test_should_create_dataloader( device: Device, ) -> None: configure_test_with_device(device) - tabular_dataset = Table.from_dict(data).to_time_series_dataset( + # tabular_dataset = Table.from_dict(data).to_time_series_dataset( + # target_name, + # window_size=1, + # extra_names=extra_names, + # ) + tabular_dataset = TimeSeriesDataset( + Table.from_dict(data), target_name, window_size=1, extra_names=extra_names, @@ -74,7 +80,13 @@ def test_should_create_dataloader_predict( device: Device, ) -> None: configure_test_with_device(device) - tabular_dataset = Table.from_dict(data).to_time_series_dataset( + # tabular_dataset = Table.from_dict(data).to_time_series_dataset( + # target_name, + # window_size=1, + # extra_names=extra_names, + # ) + tabular_dataset = TimeSeriesDataset( + Table.from_dict(data), target_name, window_size=1, extra_names=extra_names, @@ -89,42 +101,78 @@ def test_should_create_dataloader_predict( ("data", "window_size", "forecast_horizon", "error_type", "error_msg"), [ ( - Table( - { - "A": [1, 4], - "B": [2, 5], - "C": [3, 6], - "T": [0, 1], - }, - ).to_time_series_dataset(target_name="T", window_size=1), + # Table( + # { + # "A": [1, 4], + # "B": [2, 5], + # "C": [3, 6], + # "T": [0, 1], + # }, + # ).to_time_series_dataset("T", window_size=1), + TimeSeriesDataset( + Table( + { + "A": [1, 4], + "B": [2, 5], + "C": [3, 6], + "T": [0, 1], + }, + ), + "T", + window_size=1, + ), 1, 2, ValueError, r"Can not create windows with window size less then forecast horizon \+ window_size", ), ( - Table( - { - "A": [1, 4], - "B": [2, 5], - "C": [3, 6], - "T": [0, 1], - }, - ).to_time_series_dataset(target_name="T", window_size=1), + # Table( + # { + # "A": [1, 4], + # "B": [2, 5], + # "C": [3, 6], + # "T": [0, 1], + # }, + # ).to_time_series_dataset("T", window_size=1), + TimeSeriesDataset( + Table( + { + "A": [1, 4], + "B": [2, 5], + "C": [3, 6], + "T": [0, 1], + }, + ), + "T", + window_size=1, + ), 1, 0, OutOfBoundsError, None, ), ( - Table( - { - "A": [1, 4], - "B": [2, 5], - "C": [3, 6], - "T": [0, 1], - }, - ).to_time_series_dataset(target_name="T", window_size=1), + # Table( + # { + # "A": [1, 4], + # "B": [2, 5], + # "C": [3, 6], + # "T": [0, 1], + # }, + # ).to_time_series_dataset("T", window_size=1), + TimeSeriesDataset( + Table( + { + "A": [1, 4], + "B": [2, 5], + "C": [3, 6], + "T": [0, 1], + }, + ), + "T", + window_size=1, + ), 0, 1, OutOfBoundsError, @@ -155,43 +203,79 @@ def test_should_create_dataloader_invalid( ("data", "window_size", "forecast_horizon", "error_type", "error_msg"), [ ( - Table( - { - "A": [1, 4], - "B": [2, 5], - "C": [3, 6], - "T": [0, 1], - }, - ).to_time_series_dataset(target_name="T", window_size=1), + # Table( + # { + # "A": [1, 4], + # "B": [2, 5], + # "C": [3, 6], + # "T": [0, 1], + # }, + # ).to_time_series_dataset("T", window_size=1), + TimeSeriesDataset( + Table( + { + "A": [1, 4], + "B": [2, 5], + "C": [3, 6], + "T": [0, 1], + }, + ), + "T", + window_size=1, + ), 1, 2, ValueError, r"Can not create windows with window size less then forecast horizon \+ window_size", ), ( - Table( - { - "A": [1, 4], - "B": [2, 5], - "C": [3, 6], - "T": [0, 1], - }, - ).to_time_series_dataset(target_name="T", window_size=1), + # Table( + # { + # "A": [1, 4], + # "B": [2, 5], + # "C": [3, 6], + # "T": [0, 1], + # }, + # ).to_time_series_dataset("T", window_size=1), + TimeSeriesDataset( + Table( + { + "A": [1, 4], + "B": [2, 5], + "C": [3, 6], + "T": [0, 1], + }, + ), + "T", + window_size=1, + ), 1, 0, OutOfBoundsError, None, ), ( - Table( - { - "A": [1, 4], - "B": [2, 5], - "C": [3, 6], - "T": [0, 1], - }, - ).to_time_series_dataset( - target_name="T", + # Table( + # { + # "A": [1, 4], + # "B": [2, 5], + # "C": [3, 6], + # "T": [0, 1], + # }, + # ).to_time_series_dataset( + # "T", + # window_size=1, + # ), + TimeSeriesDataset( + Table( + { + "A": [1, 4], + "B": [2, 5], + "C": [3, 6], + "T": [0, 1], + }, + ), + "T", window_size=1, ), 0, @@ -225,9 +309,17 @@ def test_should_create_dataloader_predict_invalid( def test_continues_dataloader() -> None: - ts = Table( - {"a": [1, 2, 3, 4, 5, 6, 7], "b": [1, 2, 3, 4, 5, 6, 7], "c": [1, 2, 3, 4, 5, 6, 7]}, - ).to_time_series_dataset("a", window_size=1, forecast_horizon=2) + # ts = Table( + # {"a": [1, 2, 3, 4, 5, 6, 7], "b": [1, 2, 3, 4, 5, 6, 7], "c": [1, 2, 3, 4, 5, 6, 7]}, + # ).to_time_series_dataset("a", window_size=1, forecast_horizon=2) + ts = TimeSeriesDataset( + Table( + {"a": [1, 2, 3, 4, 5, 6, 7], "b": [1, 2, 3, 4, 5, 6, 7], "c": [1, 2, 3, 4, 5, 6, 7]}, + ), + "a", + window_size=1, + forecast_horizon=2, + ) dl = ts._into_dataloader_with_window(1, 2, 1, continuous=True) dl_2 = ts._into_dataloader_with_window(1, 2, 1, continuous=False) assert len(dl_2.dataset.Y) == len(dl.dataset.Y) diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_repr_html.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_repr_html.py index 2e589b00b..950ffb93a 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_repr_html.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_repr_html.py @@ -1,13 +1,14 @@ import re import pytest + from safeds.data.labeled.containers import TimeSeriesDataset @pytest.mark.parametrize( "tabular_dataset", [ - TimeSeriesDataset({"a": [1, 2], "b": [3, 4]}, target_name="b", window_size=1), + TimeSeriesDataset({"a": [1, 2], "b": [3, 4]}, "b", window_size=1), ], ids=[ "non-empty", @@ -21,7 +22,7 @@ def test_should_contain_tabular_dataset_element(tabular_dataset: TimeSeriesDatas @pytest.mark.parametrize( "tabular_dataset", [ - TimeSeriesDataset({"a": [1, 2], "b": [3, 4]}, target_name="b", window_size=1), + TimeSeriesDataset({"a": [1, 2], "b": [3, 4]}, "b", window_size=1), ], ids=[ "non-empty", @@ -35,7 +36,7 @@ def test_should_contain_th_element_for_each_column_name(tabular_dataset: TimeSer @pytest.mark.parametrize( "tabular_dataset", [ - TimeSeriesDataset({"a": [1, 2], "b": [3, 4]}, target_name="b", window_size=1), + TimeSeriesDataset({"a": [1, 2], "b": [3, 4]}, "b", window_size=1), ], ids=[ "non-empty", diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_sizeof.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_sizeof.py index da73db266..598c3ba7b 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_sizeof.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_sizeof.py @@ -1,6 +1,7 @@ import sys import pytest + from safeds.data.labeled.containers import TimeSeriesDataset diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_target.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_target.py index fe840c2b0..469d7cc81 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_target.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_target.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TimeSeriesDataset from safeds.data.tabular.containers import Column @@ -14,7 +15,7 @@ "C": [3, 6], "T": [0, 1], }, - target_name="T", + "T", window_size=1, ), Column("T", [0, 1]), diff --git a/tests/safeds/data/labeled/containers/_time_series_dataset/test_to_table.py b/tests/safeds/data/labeled/containers/_time_series_dataset/test_to_table.py index b33734595..e03240cdd 100644 --- a/tests/safeds/data/labeled/containers/_time_series_dataset/test_to_table.py +++ b/tests/safeds/data/labeled/containers/_time_series_dataset/test_to_table.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.labeled.containers import TimeSeriesDataset from safeds.data.tabular.containers import Table @@ -13,7 +14,7 @@ "feature_2": [6, 12, 9], "target": [1, 3, 2], }, - target_name="target", + "target", window_size=1, ), Table( @@ -32,7 +33,7 @@ "other": [3, 9, 12], "target": [1, 3, 2], }, - target_name="target", + "target", window_size=1, extra_names=["other"], ), @@ -49,6 +50,5 @@ ids=["normal", "table_with_extra_column"], ) def test_should_return_table(tabular_dataset: TimeSeriesDataset, expected: Table) -> None: - table = tabular_dataset.to_table() - assert table.schema == expected.schema - assert table == expected + actual = tabular_dataset.to_table() + assert actual == expected diff --git a/tests/safeds/data/labeled/containers/test_image_dataset.py b/tests/safeds/data/labeled/containers/test_image_dataset.py index c38b5fa0b..c3d70223b 100644 --- a/tests/safeds/data/labeled/containers/test_image_dataset.py +++ b/tests/safeds/data/labeled/containers/test_image_dataset.py @@ -19,9 +19,9 @@ from safeds.exceptions import ( IndexOutOfBoundsError, NonNumericColumnError, + NotFittedError, OutOfBoundsError, OutputLengthMismatchError, - TransformerNotFittedError, ) from tests.helpers import ( configure_test_with_device, @@ -384,7 +384,6 @@ def test_get_batch_device(self, device: Device) -> None: @pytest.mark.parametrize("device", get_devices(), ids=get_devices_ids()) @pytest.mark.parametrize("shuffle", [True, False]) class TestSplit: - @pytest.mark.parametrize( "output", [ @@ -530,7 +529,7 @@ class TestColumnAsTensor: ValueError, r"Tensor has an invalid amount of dimensions. Needed 2 dimensions but got 3.", ), - (torch.randn(10, 10), OneHotEncoder(), TransformerNotFittedError, r""), + (torch.randn(10, 10), OneHotEncoder(), NotFittedError, r""), ( torch.randn(10, 10), OneHotEncoder().fit(Table({"b": ["a", "b", "c"]})), diff --git a/tests/safeds/data/tabular/containers/_cell/test_add.py b/tests/safeds/data/tabular/containers/_cell/test_add.py index 429653cf3..9a2d59a39 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_add.py +++ b/tests/safeds/data/tabular/containers/_cell/test_add.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_and.py b/tests/safeds/data/tabular/containers/_cell/test_and.py index 23fddc3bc..ffbe3786f 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_and.py +++ b/tests/safeds/data/tabular/containers/_cell/test_and.py @@ -2,8 +2,8 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_div.py b/tests/safeds/data/tabular/containers/_cell/test_div.py index 80260de30..1aa8ab692 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_div.py +++ b/tests/safeds/data/tabular/containers/_cell/test_div.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_eq.py b/tests/safeds/data/tabular/containers/_cell/test_eq.py index 97c60a3d6..0cd8e0b02 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_eq.py +++ b/tests/safeds/data/tabular/containers/_cell/test_eq.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_first_not_none.py b/tests/safeds/data/tabular/containers/_cell/test_first_not_none.py index de68cc994..91f38f4b5 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_first_not_none.py +++ b/tests/safeds/data/tabular/containers/_cell/test_first_not_none.py @@ -2,6 +2,7 @@ import polars as pl import pytest + from safeds.data.tabular.containers._cell import Cell from safeds.data.tabular.containers._lazy_cell import _LazyCell diff --git a/tests/safeds/data/tabular/containers/_cell/test_floordiv.py b/tests/safeds/data/tabular/containers/_cell/test_floordiv.py index 3296a3f97..e2b2316bb 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_floordiv.py +++ b/tests/safeds/data/tabular/containers/_cell/test_floordiv.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_ge.py b/tests/safeds/data/tabular/containers/_cell/test_ge.py index e1406f027..2269066c7 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_ge.py +++ b/tests/safeds/data/tabular/containers/_cell/test_ge.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_gt.py b/tests/safeds/data/tabular/containers/_cell/test_gt.py index 2d7bef1b4..4c39978d3 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_gt.py +++ b/tests/safeds/data/tabular/containers/_cell/test_gt.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_le.py b/tests/safeds/data/tabular/containers/_cell/test_le.py index 0880eec3f..2f4e43806 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_le.py +++ b/tests/safeds/data/tabular/containers/_cell/test_le.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_lt.py b/tests/safeds/data/tabular/containers/_cell/test_lt.py index 60550bc1d..45280e2cd 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_lt.py +++ b/tests/safeds/data/tabular/containers/_cell/test_lt.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_mod.py b/tests/safeds/data/tabular/containers/_cell/test_mod.py index fd323daec..f1d960e62 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_mod.py +++ b/tests/safeds/data/tabular/containers/_cell/test_mod.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_mul.py b/tests/safeds/data/tabular/containers/_cell/test_mul.py index 021a62723..279522aa1 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_mul.py +++ b/tests/safeds/data/tabular/containers/_cell/test_mul.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_ne.py b/tests/safeds/data/tabular/containers/_cell/test_ne.py index 3c8fdb195..be55a9c41 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_ne.py +++ b/tests/safeds/data/tabular/containers/_cell/test_ne.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_or.py b/tests/safeds/data/tabular/containers/_cell/test_or.py index 4f6ceb0f2..6220b4011 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_or.py +++ b/tests/safeds/data/tabular/containers/_cell/test_or.py @@ -2,8 +2,8 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_pow.py b/tests/safeds/data/tabular/containers/_cell/test_pow.py index ef07ed74e..a977b5e92 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_pow.py +++ b/tests/safeds/data/tabular/containers/_cell/test_pow.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_sizeof.py b/tests/safeds/data/tabular/containers/_cell/test_sizeof.py index 1043ed5df..3bd544fc5 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_sizeof.py +++ b/tests/safeds/data/tabular/containers/_cell/test_sizeof.py @@ -2,6 +2,7 @@ from typing import TYPE_CHECKING, Any import polars as pl + from safeds.data.tabular.containers._lazy_cell import _LazyCell if TYPE_CHECKING: diff --git a/tests/safeds/data/tabular/containers/_cell/test_sub.py b/tests/safeds/data/tabular/containers/_cell/test_sub.py index 57bb0035a..15593ae79 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_sub.py +++ b/tests/safeds/data/tabular/containers/_cell/test_sub.py @@ -1,7 +1,7 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_cell/test_xor.py b/tests/safeds/data/tabular/containers/_cell/test_xor.py index 8e852dd9a..e62398512 100644 --- a/tests/safeds/data/tabular/containers/_cell/test_xor.py +++ b/tests/safeds/data/tabular/containers/_cell/test_xor.py @@ -2,8 +2,8 @@ import polars as pl import pytest -from safeds.data.tabular.containers._lazy_cell import _LazyCell +from safeds.data.tabular.containers._lazy_cell import _LazyCell from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_column/test_all.py b/tests/safeds/data/tabular/containers/_column/test_all.py index ac6b825c0..4caea54b9 100644 --- a/tests/safeds/data/tabular/containers/_column/test_all.py +++ b/tests/safeds/data/tabular/containers/_column/test_all.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_any.py b/tests/safeds/data/tabular/containers/_column/test_any.py index 440be41c3..23976665c 100644 --- a/tests/safeds/data/tabular/containers/_column/test_any.py +++ b/tests/safeds/data/tabular/containers/_column/test_any.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_contains.py b/tests/safeds/data/tabular/containers/_column/test_contains.py index b84a16432..0d37d4418 100644 --- a/tests/safeds/data/tabular/containers/_column/test_contains.py +++ b/tests/safeds/data/tabular/containers/_column/test_contains.py @@ -1,6 +1,7 @@ from typing import Any import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_correlation_with.py b/tests/safeds/data/tabular/containers/_column/test_correlation_with.py index e62fe92d9..15347cbf2 100644 --- a/tests/safeds/data/tabular/containers/_column/test_correlation_with.py +++ b/tests/safeds/data/tabular/containers/_column/test_correlation_with.py @@ -1,8 +1,9 @@ import pytest + from safeds.data.tabular.containers import Column from safeds.exceptions import ( - ColumnLengthMismatchError, ColumnTypeError, + LengthMismatchError, MissingValuesColumnError, ) @@ -49,7 +50,7 @@ def test_should_raise_if_columns_are_not_numeric(values1: list, values2: list) - def test_should_raise_if_column_lengths_differ() -> None: column1 = Column("A", [1, 2, 3, 4]) column2 = Column("B", [2]) - with pytest.raises(ColumnLengthMismatchError): + with pytest.raises(LengthMismatchError): column1.correlation_with(column2) diff --git a/tests/safeds/data/tabular/containers/_column/test_count_if.py b/tests/safeds/data/tabular/containers/_column/test_count_if.py index 82825dd33..c68815026 100644 --- a/tests/safeds/data/tabular/containers/_column/test_count_if.py +++ b/tests/safeds/data/tabular/containers/_column/test_count_if.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_distinct_value_count.py b/tests/safeds/data/tabular/containers/_column/test_distinct_value_count.py index 0d72ba09e..96bef2de6 100644 --- a/tests/safeds/data/tabular/containers/_column/test_distinct_value_count.py +++ b/tests/safeds/data/tabular/containers/_column/test_distinct_value_count.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_from_polars_series.py b/tests/safeds/data/tabular/containers/_column/test_from_polars_series.py index dd016e1ed..0751716b2 100644 --- a/tests/safeds/data/tabular/containers/_column/test_from_polars_series.py +++ b/tests/safeds/data/tabular/containers/_column/test_from_polars_series.py @@ -1,5 +1,6 @@ import polars as pl import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_get_distinct_values.py b/tests/safeds/data/tabular/containers/_column/test_get_distinct_values.py index a2d70cdb4..db6bc82d4 100644 --- a/tests/safeds/data/tabular/containers/_column/test_get_distinct_values.py +++ b/tests/safeds/data/tabular/containers/_column/test_get_distinct_values.py @@ -3,6 +3,7 @@ from typing import TYPE_CHECKING import pytest + from safeds.data.tabular.containers import Column if TYPE_CHECKING: diff --git a/tests/safeds/data/tabular/containers/_column/test_get_value.py b/tests/safeds/data/tabular/containers/_column/test_get_value.py index 34ee47ad0..72564a100 100644 --- a/tests/safeds/data/tabular/containers/_column/test_get_value.py +++ b/tests/safeds/data/tabular/containers/_column/test_get_value.py @@ -1,6 +1,7 @@ from typing import Any import pytest + from safeds.data.tabular.containers import Column from safeds.exceptions import IndexOutOfBoundsError diff --git a/tests/safeds/data/tabular/containers/_column/test_getitem.py b/tests/safeds/data/tabular/containers/_column/test_getitem.py index 9a5c1d6f0..9443bd610 100644 --- a/tests/safeds/data/tabular/containers/_column/test_getitem.py +++ b/tests/safeds/data/tabular/containers/_column/test_getitem.py @@ -1,6 +1,7 @@ from typing import Any import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_hash.py b/tests/safeds/data/tabular/containers/_column/test_hash.py index 8783118b6..cfb4d5fb6 100644 --- a/tests/safeds/data/tabular/containers/_column/test_hash.py +++ b/tests/safeds/data/tabular/containers/_column/test_hash.py @@ -6,8 +6,8 @@ @pytest.mark.parametrize( ("column", "expected"), [ - (Column("a", []), 1581717131331298536), - (Column("a", [1, 2, 3]), 239695622656180157), + (Column("a", []), 570351198003906119), + (Column("a", [1, 2, 3]), 1036496604269026516), ], ids=[ "empty", diff --git a/tests/safeds/data/tabular/containers/_column/test_idness.py b/tests/safeds/data/tabular/containers/_column/test_idness.py index 99a1db29c..e3563a804 100644 --- a/tests/safeds/data/tabular/containers/_column/test_idness.py +++ b/tests/safeds/data/tabular/containers/_column/test_idness.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_is_numeric.py b/tests/safeds/data/tabular/containers/_column/test_is_numeric.py deleted file mode 100644 index 0a8267efb..000000000 --- a/tests/safeds/data/tabular/containers/_column/test_is_numeric.py +++ /dev/null @@ -1,23 +0,0 @@ -import pytest -from safeds.data.tabular.containers import Column - - -@pytest.mark.parametrize( - ("column", "expected"), - [ - (Column("a", []), False), - (Column("a", [0]), True), - (Column("a", [0.5]), True), - (Column("a", [0, None]), True), - (Column("a", ["a", "b"]), False), - ], - ids=[ - "empty", - "int", - "float", - "numeric with missing", - "non-numeric", - ], -) -def test_should_return_whether_column_is_numeric(column: Column, expected: bool) -> None: - assert column.is_numeric == expected diff --git a/tests/safeds/data/tabular/containers/_column/test_is_temporal.py b/tests/safeds/data/tabular/containers/_column/test_is_temporal.py deleted file mode 100644 index b2606e0ef..000000000 --- a/tests/safeds/data/tabular/containers/_column/test_is_temporal.py +++ /dev/null @@ -1,29 +0,0 @@ -from datetime import UTC, datetime - -import pytest -from safeds.data.tabular.containers import Column - -now = datetime.now(UTC) - - -@pytest.mark.parametrize( - ("column", "expected"), - [ - (Column("a", []), False), - (Column("a", [now]), True), - (Column("a", [now.date()]), True), - (Column("a", [now.time()]), True), - (Column("a", [now, None]), True), - (Column("a", ["a", "b"]), False), - ], - ids=[ - "empty", - "datetime", - "date", - "time", - "operator with missing", - "non-operator", - ], -) -def test_should_return_whether_column_is_temporal(column: Column, expected: bool) -> None: - assert column.is_temporal == expected diff --git a/tests/safeds/data/tabular/containers/_column/test_iter.py b/tests/safeds/data/tabular/containers/_column/test_iter.py index 2e3fcc9a9..bfb15ec22 100644 --- a/tests/safeds/data/tabular/containers/_column/test_iter.py +++ b/tests/safeds/data/tabular/containers/_column/test_iter.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_len.py b/tests/safeds/data/tabular/containers/_column/test_len.py index 16be0e173..2f2cb750c 100644 --- a/tests/safeds/data/tabular/containers/_column/test_len.py +++ b/tests/safeds/data/tabular/containers/_column/test_len.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_max.py b/tests/safeds/data/tabular/containers/_column/test_max.py index f40f06d13..a88b9dd7d 100644 --- a/tests/safeds/data/tabular/containers/_column/test_max.py +++ b/tests/safeds/data/tabular/containers/_column/test_max.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_mean.py b/tests/safeds/data/tabular/containers/_column/test_mean.py index 382de2380..c84b6428a 100644 --- a/tests/safeds/data/tabular/containers/_column/test_mean.py +++ b/tests/safeds/data/tabular/containers/_column/test_mean.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column from safeds.exceptions import ColumnTypeError diff --git a/tests/safeds/data/tabular/containers/_column/test_median.py b/tests/safeds/data/tabular/containers/_column/test_median.py index 9a0ceb637..27f6b0799 100644 --- a/tests/safeds/data/tabular/containers/_column/test_median.py +++ b/tests/safeds/data/tabular/containers/_column/test_median.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column from safeds.exceptions import ColumnTypeError diff --git a/tests/safeds/data/tabular/containers/_column/test_min.py b/tests/safeds/data/tabular/containers/_column/test_min.py index 86397da13..f55359eb2 100644 --- a/tests/safeds/data/tabular/containers/_column/test_min.py +++ b/tests/safeds/data/tabular/containers/_column/test_min.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_missing_value_count.py b/tests/safeds/data/tabular/containers/_column/test_missing_value_count.py index e6696ac5a..a4764120d 100644 --- a/tests/safeds/data/tabular/containers/_column/test_missing_value_count.py +++ b/tests/safeds/data/tabular/containers/_column/test_missing_value_count.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_missing_value_ratio.py b/tests/safeds/data/tabular/containers/_column/test_missing_value_ratio.py index 64a859933..198d08cd7 100644 --- a/tests/safeds/data/tabular/containers/_column/test_missing_value_ratio.py +++ b/tests/safeds/data/tabular/containers/_column/test_missing_value_ratio.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_mode.py b/tests/safeds/data/tabular/containers/_column/test_mode.py index 459827c88..78cef40f0 100644 --- a/tests/safeds/data/tabular/containers/_column/test_mode.py +++ b/tests/safeds/data/tabular/containers/_column/test_mode.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_none.py b/tests/safeds/data/tabular/containers/_column/test_none.py index ade98c699..4795cd1ca 100644 --- a/tests/safeds/data/tabular/containers/_column/test_none.py +++ b/tests/safeds/data/tabular/containers/_column/test_none.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_plot_box_plot.py b/tests/safeds/data/tabular/containers/_column/test_plot_box_plot.py index 089e4f7fe..6c11d99c7 100644 --- a/tests/safeds/data/tabular/containers/_column/test_plot_box_plot.py +++ b/tests/safeds/data/tabular/containers/_column/test_plot_box_plot.py @@ -1,7 +1,8 @@ import pytest +from syrupy import SnapshotAssertion + from safeds.data.tabular.containers import Column from safeds.exceptions import ColumnTypeError -from syrupy import SnapshotAssertion @pytest.mark.parametrize( diff --git a/tests/safeds/data/tabular/containers/_column/test_plot_histogram.py b/tests/safeds/data/tabular/containers/_column/test_plot_histogram.py index 032fe2155..be508a112 100644 --- a/tests/safeds/data/tabular/containers/_column/test_plot_histogram.py +++ b/tests/safeds/data/tabular/containers/_column/test_plot_histogram.py @@ -1,7 +1,8 @@ import pytest -from safeds.data.tabular.containers import Column from syrupy import SnapshotAssertion +from safeds.data.tabular.containers import Column + @pytest.mark.parametrize( "column", diff --git a/tests/safeds/data/tabular/containers/_column/test_plot_lag_plot.py b/tests/safeds/data/tabular/containers/_column/test_plot_lag_plot.py index 429aa3f97..6a123953c 100644 --- a/tests/safeds/data/tabular/containers/_column/test_plot_lag_plot.py +++ b/tests/safeds/data/tabular/containers/_column/test_plot_lag_plot.py @@ -1,7 +1,8 @@ import pytest +from syrupy import SnapshotAssertion + from safeds.data.tabular.containers import Column from safeds.exceptions import ColumnTypeError -from syrupy import SnapshotAssertion @pytest.mark.parametrize( diff --git a/tests/safeds/data/tabular/containers/_column/test_plot_violin_plot.py b/tests/safeds/data/tabular/containers/_column/test_plot_violin_plot.py index e3dabb212..bf7a14df8 100644 --- a/tests/safeds/data/tabular/containers/_column/test_plot_violin_plot.py +++ b/tests/safeds/data/tabular/containers/_column/test_plot_violin_plot.py @@ -1,7 +1,8 @@ import pytest +from syrupy import SnapshotAssertion + from safeds.data.tabular.containers import Column from safeds.exceptions import ColumnTypeError -from syrupy import SnapshotAssertion @pytest.mark.parametrize( diff --git a/tests/safeds/data/tabular/containers/_column/test_repr.py b/tests/safeds/data/tabular/containers/_column/test_repr.py index dc4c6989b..301461e8c 100644 --- a/tests/safeds/data/tabular/containers/_column/test_repr.py +++ b/tests/safeds/data/tabular/containers/_column/test_repr.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_repr_html.py b/tests/safeds/data/tabular/containers/_column/test_repr_html.py index 0f94355a6..7f610e883 100644 --- a/tests/safeds/data/tabular/containers/_column/test_repr_html.py +++ b/tests/safeds/data/tabular/containers/_column/test_repr_html.py @@ -1,5 +1,6 @@ import pytest import regex as re + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_row_count.py b/tests/safeds/data/tabular/containers/_column/test_row_count.py index 2829d798d..ce5c93b41 100644 --- a/tests/safeds/data/tabular/containers/_column/test_row_count.py +++ b/tests/safeds/data/tabular/containers/_column/test_row_count.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_sizeof.py b/tests/safeds/data/tabular/containers/_column/test_sizeof.py index 1517e6ce0..49535ef5a 100644 --- a/tests/safeds/data/tabular/containers/_column/test_sizeof.py +++ b/tests/safeds/data/tabular/containers/_column/test_sizeof.py @@ -1,6 +1,7 @@ import sys import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_stability.py b/tests/safeds/data/tabular/containers/_column/test_stability.py index 611e1c025..a2f4c2d1d 100644 --- a/tests/safeds/data/tabular/containers/_column/test_stability.py +++ b/tests/safeds/data/tabular/containers/_column/test_stability.py @@ -1,6 +1,7 @@ from typing import Any import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_standard_deviation.py b/tests/safeds/data/tabular/containers/_column/test_standard_deviation.py index 924614286..5aa642e9d 100644 --- a/tests/safeds/data/tabular/containers/_column/test_standard_deviation.py +++ b/tests/safeds/data/tabular/containers/_column/test_standard_deviation.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column from safeds.exceptions import ColumnTypeError diff --git a/tests/safeds/data/tabular/containers/_column/test_str.py b/tests/safeds/data/tabular/containers/_column/test_str.py index dc4c6989b..301461e8c 100644 --- a/tests/safeds/data/tabular/containers/_column/test_str.py +++ b/tests/safeds/data/tabular/containers/_column/test_str.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_summarize_statistics.py b/tests/safeds/data/tabular/containers/_column/test_summarize_statistics.py index 2ec858b6d..d59f1a43f 100644 --- a/tests/safeds/data/tabular/containers/_column/test_summarize_statistics.py +++ b/tests/safeds/data/tabular/containers/_column/test_summarize_statistics.py @@ -1,136 +1,181 @@ +import datetime from statistics import stdev import pytest + from safeds.data.tabular.containers import Column, Table +_HEADERS = [ + "min", + "max", + "mean", + "median", + "standard deviation", + "missing value ratio", + "stability", + "idness", +] +_EMPTY_COLUMN_RESULT = [ + None, + None, + None, + None, + None, + 1.0, + 1.0, + 1.0, +] + @pytest.mark.parametrize( ("column", "expected"), [ - ( # boolean - Column("col", [True, False, True]), + # no rows + ( + Column("col1", []), Table( { - "metric": [ - "min", - "max", - "mean", - "median", - "standard deviation", - "distinct value count", - "idness", - "missing value ratio", - "stability", - ], - "col": [ - "False", - "True", - "-", - "-", - "-", - "2", - str(2 / 3), - "0.0", - str(2 / 3), - ], + "statistic": _HEADERS, + "col1": _EMPTY_COLUMN_RESULT, }, ), ), - ( # ints - Column("col", [1, 2, 1]), + # null column + ( + Column("col1", [None, None, None]), Table( { - "metric": [ - "min", - "max", - "mean", - "median", - "standard deviation", - "distinct value count", - "idness", - "missing value ratio", - "stability", + "statistic": _HEADERS, + "col1": [ + None, + None, + None, + None, + None, + 1.0, + 1.0, + 1 / 3, ], - "col": [ + }, + ), + ), + # numeric column + ( + Column("col1", [1, 2, 1, None]), + Table( + { + "statistic": _HEADERS, + "col1": [ 1, 2, 4 / 3, 1, stdev([1, 2, 1]), - 2, - 2 / 3, - 0, + 1 / 4, 2 / 3, + 3 / 4, ], }, ), ), - ( # strings - Column("col", ["a", "b", "c"]), + # temporal column + ( + Column( + "col1", + [ + datetime.time(1, 2, 3), + datetime.time(4, 5, 6), + datetime.time(7, 8, 9), + None, + ], + ), Table( { - "metric": [ - "min", - "max", - "mean", - "median", - "standard deviation", - "distinct value count", - "idness", - "missing value ratio", - "stability", + "statistic": _HEADERS, + "col1": [ + "01:02:03", + "07:08:09", + None, + None, + None, + "0.25", + "0.3333333333333333", + "1.0", ], - "col": [ + }, + ), + ), + # string column + ( + Column("col1", ["a", "b", "c", None]), + Table( + { + "statistic": _HEADERS, + "col1": [ "a", "c", - "-", - "-", - "-", - "3", + None, + None, + None, + "0.25", + "0.3333333333333333", "1.0", - "0.0", - str(1.0 / 3), ], }, ), ), - ( # only missing - Column("col", [None, None]), + # boolean column + ( + Column("col1", [True, False, True, None]), Table( { - "metric": [ - "min", - "max", - "mean", - "median", - "standard deviation", - "distinct value count", - "idness", - "missing value ratio", - "stability", - ], - "col": [ - "-", - "-", - "-", - "-", - "-", - "0", - "0.5", - "1.0", - "1.0", + "statistic": _HEADERS, + "col1": [ + "false", + "true", + None, + None, + None, + "0.25", + "0.6666666666666666", + "0.75", ], }, ), ), ], ids=[ - "boolean", - "ints", - "strings", - "only missing", + "no rows", + "null column", + "numeric column", + "temporal column", + "string column", + "boolean column", ], ) def test_should_summarize_statistics(column: Column, expected: Table) -> None: - assert column.summarize_statistics().schema == expected.schema - assert column.summarize_statistics() == expected + actual = column.summarize_statistics() + assert actual == expected + + +@pytest.mark.parametrize( + ("column", "expected"), + [ + # statistic column + ( + Column("statistic", []), + Table( + { + "statistic_": _HEADERS, + "statistic": _EMPTY_COLUMN_RESULT, + }, + ), + ), + ], + ids=[ + "statistic column", + ], +) +def test_should_ensure_new_column_has_unique_name(column: Column, expected: Table) -> None: + actual = column.summarize_statistics() + assert actual == expected diff --git a/tests/safeds/data/tabular/containers/_column/test_to_list.py b/tests/safeds/data/tabular/containers/_column/test_to_list.py index cb386a43f..ef3d5d7d5 100644 --- a/tests/safeds/data/tabular/containers/_column/test_to_list.py +++ b/tests/safeds/data/tabular/containers/_column/test_to_list.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_to_table.py b/tests/safeds/data/tabular/containers/_column/test_to_table.py index f8f2c2c5c..be711087a 100644 --- a/tests/safeds/data/tabular/containers/_column/test_to_table.py +++ b/tests/safeds/data/tabular/containers/_column/test_to_table.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column, Table diff --git a/tests/safeds/data/tabular/containers/_column/test_transform.py b/tests/safeds/data/tabular/containers/_column/test_transform.py index a59d8799d..3801906de 100644 --- a/tests/safeds/data/tabular/containers/_column/test_transform.py +++ b/tests/safeds/data/tabular/containers/_column/test_transform.py @@ -1,6 +1,7 @@ from typing import Any import pytest + from safeds.data.tabular.containers import Column diff --git a/tests/safeds/data/tabular/containers/_column/test_type.py b/tests/safeds/data/tabular/containers/_column/test_type.py index f335c1ec2..749f95a0c 100644 --- a/tests/safeds/data/tabular/containers/_column/test_type.py +++ b/tests/safeds/data/tabular/containers/_column/test_type.py @@ -5,4 +5,4 @@ def test_should_return_the_type() -> None: column: Column[Any] = Column("a", []) - assert str(column.type) == "Null" + assert str(column.type) == "null" diff --git a/tests/safeds/data/tabular/containers/_column/test_variance.py b/tests/safeds/data/tabular/containers/_column/test_variance.py index 10b19c217..1a63b4671 100644 --- a/tests/safeds/data/tabular/containers/_column/test_variance.py +++ b/tests/safeds/data/tabular/containers/_column/test_variance.py @@ -1,4 +1,5 @@ import pytest + from safeds.data.tabular.containers import Column from safeds.exceptions import ColumnTypeError diff --git a/tests/safeds/data/tabular/containers/_row/test_get_column_type.py b/tests/safeds/data/tabular/containers/_row/test_get_column_type.py index c0af9aeaf..2cf29bfab 100644 --- a/tests/safeds/data/tabular/containers/_row/test_get_column_type.py +++ b/tests/safeds/data/tabular/containers/_row/test_get_column_type.py @@ -2,20 +2,20 @@ from safeds.data.tabular.containers import Table from safeds.data.tabular.containers._lazy_vectorized_row import _LazyVectorizedRow -from safeds.data.tabular.typing import DataType +from safeds.data.tabular.typing import ColumnType @pytest.mark.parametrize( ("table", "column_name", "expected"), [ - (Table({"col1": ["A"]}), "col1", "String"), - (Table({"col1": ["a"], "col2": [1]}), "col2", "Int64"), + (Table({"col1": ["A"]}), "col1", ColumnType.string()), + (Table({"col1": ["a"], "col2": [1]}), "col2", ColumnType.int64()), ], ids=[ "one column", "two columns", ], ) -def test_should_return_the_type_of_the_column(table: Table, column_name: str, expected: DataType) -> None: +def test_should_return_the_type_of_the_column(table: Table, column_name: str, expected: ColumnType) -> None: row = _LazyVectorizedRow(table=table) - assert str(row.get_column_type(column_name)) == expected + assert row.get_column_type(column_name) == expected diff --git a/tests/safeds/data/tabular/containers/_string_cell/test_sizeof.py b/tests/safeds/data/tabular/containers/_string_cell/test_sizeof.py index 43df6affb..d01d9b0f7 100644 --- a/tests/safeds/data/tabular/containers/_string_cell/test_sizeof.py +++ b/tests/safeds/data/tabular/containers/_string_cell/test_sizeof.py @@ -1,6 +1,7 @@ import sys import polars as pl + from safeds.data.tabular.containers._lazy_string_cell import _LazyStringCell diff --git a/tests/safeds/data/tabular/containers/_string_cell/test_substring.py b/tests/safeds/data/tabular/containers/_string_cell/test_substring.py index 1305e76b3..ab2496486 100644 --- a/tests/safeds/data/tabular/containers/_string_cell/test_substring.py +++ b/tests/safeds/data/tabular/containers/_string_cell/test_substring.py @@ -1,6 +1,6 @@ import pytest -from safeds.exceptions import OutOfBoundsError +from safeds.exceptions import OutOfBoundsError from tests.helpers import assert_cell_operation_works diff --git a/tests/safeds/data/tabular/containers/_table/__snapshots__/test_hash.ambr b/tests/safeds/data/tabular/containers/_table/__snapshots__/test_hash.ambr new file mode 100644 index 000000000..f079fdc47 --- /dev/null +++ b/tests/safeds/data/tabular/containers/_table/__snapshots__/test_hash.ambr @@ -0,0 +1,10 @@ +# serializer version: 1 +# name: TestContract.test_should_return_same_hash_in_different_processes[empty] + 1789859531466043636 +# --- +# name: TestContract.test_should_return_same_hash_in_different_processes[no rows] + 585695607399955642 +# --- +# name: TestContract.test_should_return_same_hash_in_different_processes[with data] + 909875695937937648 +# --- diff --git a/tests/safeds/data/tabular/containers/_table/__snapshots__/test_plot_boxplots/test_should_match_snapshot[four columns (all numeric)].png b/tests/safeds/data/tabular/containers/_table/__snapshots__/test_plot_boxplots/test_should_match_snapshot[four columns (all numeric)].png deleted file mode 100644 index 796fca5e8a2695e836df31a38e9330136606a664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20427 zcmd6P2V9PO|Nos(W;tXxkc?DTMO$W4NsA^T?Tm(Yh>%1|lon~Kq`i~TA<^DL(zu(_ zzFWWd_s%%ydCqyBbDrPt`M>_XICZ@4uKT*L>-+tD-s^K+J1D<*&djAVDHO^anSHws zQ7DYg6v~vt%+v8NBCpm~Qz!}^GP`ytpMTI<>u9dr?>Es?{>8}S_+}>`87FSHSyMMU z>#Ud8A68^s5xk*tK$bVxH2b2l`1752qb+lF*lw|Jcy?7slWXRlw%2RdH;g= {*nJ8$eI-ly#CJ|!_&Hz@9JH=5r3 zKBN3|zfHyzoD^lTe89m) dOd`MzDAn{Zv& z_H)gx?vA6nVX};r?SAs&U$Plfo9=3y5b|Z? AC&aH*0*vte?$Y zzAdo7y}bSNn>$rWW&wKdAB5M`)ExA7;do0fP!RtVeYu@GFMay-Nm)@bNN0jpzF$tR z^aYFL^0sG`#T7VRi=I!r*%mDtshZ0v@ub^vVnoDoJl!;NxVeChDZ8Ngy zQ3;QT*x#Kw61{ozX3zWg!+m^w4th_|4jh`s7QIM~xlq@nK2uA_zTfN0T=q7jUYm@~ zzWG(@)^Qsa$}&eX9zDUxG`HmHyj6DX0_k5aZdmB*k2@wl{Q1s`C$pUt-Ii}Z#B)c6 z)9%ZTFxegV8fLDr369C6?H9G`D!DRenO%L3nu-c_V!VDLGH9nuo0ppQ42x@&kGh-h zmxL;C+T)r9@lSKwF=xr u7YJ|=|S!iw0(}W;()%6xDRjj;x4C(^ 4oyzp_UhFugSVdRL>xwwEjz1TF~(4wOZbv%9uC&oDr`CRzC^%rSoU#n zuzuN-BkTG2O7HS%NNaJ}tgYKQxf@@x{k`pW*@UalCgW^c?Wd?E6q{dO^H9X+>CSg5 zb2i~hH>Y~w^7Ct@E@(SM$##jIA*JxLVrrn^v1RlvPVw9M_qM)rwp8-TyoHZLLe`6j zs23I%KC3jg8R<-7>^fZ@t+iC#CVu70m0L|~wq^8}X*dMfW@w9#4>ewQbyYfXBDkoy zxW8~Or^WaI3YU{bd)b>4o7V{l#FR=*n>KCp{R0lNyLRmwWShbDWRuwx)|*qN=QO-< zF{(|qh W_~Oi&(TNyN n!y;!sIX{bw^YZhHYHKsp z38)`!7Pc9vJe6S4u8Qq;0IN}X&z>v%I+@FBwlF$PSdI>zF{w_J3l9%B8F0IKQ&mgL z&kX-Vy)u)bZ~8l5it}nSra2s96(c#b1mcG(6&$|KH&a!;t5fZ{PAPrj3(Leu)Q-C5 zW<4`w<0n>QwEoNw0@~@Vg1-56YTDM1cUmNC^2cz; xhnIXSti1S4 K#hj z+R QQG!{4zgenHohY7%iXcq8g=Ms+ux%x2j5=Pa| @}&^ zYfT477Up+a@=8c#Y8Wx^oiSs^+YcXDESC7GDk(imFe-1my_ZAr`0?XmdDM7kXXk_7 z1?_&KR`R^6PY%k+$fRYd#8( 1Oqp*MfAuL`U&ZO!n+`k0chz%u~!>ZQ8Ti#y`)qj2c*=my{Dhi?^ zF0JpegEUzuG3&3v^}A+ML@rv-ck<`|$R?du8~yIxfz{mHtwoPz*KgRMeB{Xef$n+% znYVA=6h1xn;`8Zk+%mY91%1@wgkvwJ0|tbLh3&&l&y?-f$ztqyvnHVA*W0UbPQkex zwg+~)%vG_pv@G{uN7;Gp`t?Km_g~kk&c48C(dZ^jtI86;5~ZD?ZdGR;y648?AlF3# zhS+-%;o*gN_p}TLN`nhd?DT?-tp2!Q+qZ8AGPv{VxFVJlPAcX|oSqCV&n?NGHrl^Z zS6$s_=B!!$t&iN>8eBNba1tt-njOOHY+Hj|&`-in=G~>D{nP3OGehl126{eoQEI!Y zbt_PF%6@qY=)&0NgP zKG(%GYs_-@?%nHnc=l9QRs!OfXS2V*w`nKO9jec2Uf#U&Q$3$vmD@=GWPE%uk3x}R z-be~JZ5j<%=F;2z{L;>(`e@SHStLiF>V5E!8mxEJK{Yl$<11Wmr=%9G*%Rg1^J>vj zNr&`>8xDUgH+%nJyAA%qzFjXaWlIZCDC;3|Q6D*7I9;D<@6e7;asApg#giu=hsgPs zeG=MvWp nKw`?gbDJf~oMCC*0HM{2S zZe~WM1pa7u0!Op7(ku=7S_`jVy;_ibrm+w8) gFThn9-XFM<6Uc7{??1vzTGs* z_xT*DwB?cxn$?LWc%fmo1Nu*4&gEH6r?>UJ;2b}A`SRtr@86f%c4w4#&0weOBNy4- zQfq}~rd 9ZK{5uVm#HJopqPiia~6rAz}GjHJQ6f2(=Q5^LE$ HfwPV!syamd;YSSz}W;3i_y*j}*H_fusBe${egTp|a& XIP5b*p}9gbIxSI+SYr(Vkoz)Pk+R=V-lC zduu3*H5C22|br4jtql1^WqleLO1o1tyyE4r4K zH!Xy3`}UMllU1u$B{)uu52!Fv%EO;MJJj+apgdUSj-3f0hKPCVEg`eI4eq&*GVMob zCi9mqi=@$PvJz=Dnp5}qr{{AhnXk!l4F{F>FmOGnu_)IPLH*aMMz@YEe6+V+EsItv zc d0eyt0576-28y;_3xPrncA1%=!`> zN3{LfcvbajeblO_$1Xj4_DmV;3lO@grNzp23`Daws8%3^$*C?RF;Nx#F0&szkZs|@ z^^%f0jk)gS?J-%=pFSP0+X1+2!xzmuW#bLA`n2Mr46#`YHxyi)HY+uh3oMqkapwP1 zwmW6Iw9AX2YO^dYMMXtYq%18Hf%e!>yZnT=&N`ei<&n9Zj+*HF*KgcVwy{Z-ptU}F zA20_+=PJE?0{32GVp$KMw%46QMMmaYw01^BW!$OA*w{@U 6;K{bD85SIUm(9^9FF^qVFJzMRD!yFK*Gz$o?jb# zhRSM9t!!nxJ+W%*oo*Hk(^|IFk1v@c{o;76X0PyU$`Eg}9P{dCIdNHq0O15t*5>AB zQn<0_=2m>ri+iINH(XX+RJ2v^-C{xpjLM#*bV;M@0k2xrR_nOqxMLmN=gj-BhjzYi zU1(GuJ;!3ktrAD4BLWkar`)m6xjgR)2dz0;SF)wA&sr&MN&~KYf>pOR(I`+ny9*d- zgWWOL=C5gccYlk==MgtMd;1JX4R&K~?d^ica-3BMb(5+S&Nl6@Pp$4$wX?HxF{G{q zij7ngqkX+gHN5%MoEqzNy0GP$EUkA(ie@y2=u-x%wVTY2*G;wKTiz_kz!(H}&&VPc zSes@Q`Q*s~U{-bsDJ7*l1jV6d?DxRe0_<(HsCubp%QTCQicPhS6Jt?bDBpR;LRLdV z&kL3xQ|!(5l|E~Xe#>!Bcx+lP4_7*>b4p4IKwXKyxa|Tqwx*G&RDdb)IPP_8*6e+8 zWzL-!4Y#=e9FeUaYm!mNy|;lDBY5`nK2VY%WJJ04%6l?d4FYXayEzN$h0^*qjPl znWD*`4}5{Wk=azLrqkaa9u=iR$k`ZLS1R-fa zc>DJ4Xqm8SO_ YZr|U z_gZ{ {v+W<-fKG(3dP0>(GS(LHW*L3?iPQV_YM>dquoL+4pjRyb)B z1uM1T$}*^9{jNHr(rH%R18D*+zL^f&`*45yzUB!;g2WjZ7|{BP6&N{QG@SnRc &6v+a3bIXazOV)U8UZ&j zxF1WZZaSM{mxpzf`bin5k~(#ebxLc(^x2C8=dIea&x1$7{|PFxQE`Zz$rUkbmG{mh z9?xzXM8wt&^tud+Y%S(***`{WD!^UU(qzNAw4T1qDiw1gsoD$5lC$$vtyFUv;1P87 z;_ zG &Z(CU88^(DwX)hmh#@S`lw%ZS8V^Dtoh1l4TWnq*jirG*~_W3Uqpt7 z_l&HO&O09at6{>G)Y%kfUI?SiTl)L^X_fUYt!-=yVY1I1HPS3i!epI-#~I(*3@3@s zxJ)TvpudjaTUIURd|wk^aq047Gc2}Cxfguj*!)md%_&f2bCl0H@6Km5n`r?A%XMR# zUD%Bm4Fv>7hlQ;rfK^mfBUB+^Zt{zk07vcmiSa?f^Iwiat2himWCIOgjJ5$VgXhj0 zv-?|4$+vufF3q)Ta*r`K0GfIE`bIw5>mCstyh|-cyR@S+t`vZ|O$aEG2!eIiE$m+2 z-k{6cai>0%p|>>CK{?Q9FJDah*Zrs8qw8`_ojjuB=2U2vS^XC;PQkf_0b*b!7@hHT zoEUT*)NpLLyr>T?KP*088DuQe@*6mhS_W{w_Zv7Dch-^oWcTZ>6`gg>S>x?l=Gb>e ziR*ZIl@1)Z;c@4V1y*Uht3W1mGUv}N(WgxC>Lp9294xS=rY3{7l5og;27?R^{gFBb zz)lc21``MXg{Y_uaoFFcZ5_MV`GfcG-^Xq qV5MOgTi@%qzhiWy#hixD}hhRx=aBTnwCXVw`*!Zeo*(mE(3B^R|Qctst zBJ{S}G%YHBJivh#4mL9j8e~F@AwC$#6*?#WGV>Tng|@@+NrI#%F)? GWd7zKIx zn;n*EW@F)@{zba(;zXlvO{*V^HuHr%By$J?IS0gAc5xf!0K2c(fc69($L-t}Z<2=o zs%7qj)6{bP#=K2Y 6lH<7(U#gpN3GQ c@e$XCt`y&>BKg6w0USKgH? zr9q;KHOw+f }=O zBhPlNk$-Ry@DAJoOQkm7i;+Sx=Oks?pf26oN7O2M&&}oGijVdfbXFyhs%;Lsw{XO) zDqiMX^Si=JED~XxbYJV|`w04MHShooulda(V#32^fSC=AjXm@AjA9k6ty2J|#;PF2 zD{E`lv9Bg)yDK~N#uTY-qCn)p-$dtIW}3VMYoiQ3QKO^XT;ybe`dAhC$piUQ*}CV& zIIP7u2+HWPYryTQb>?-Z*hGE)d;;PQ6~B@?F+P%@U$`;@-*<>#L1TY)yoax+r)Nj4 zB-XMToS`3eU;pdpH)ppkC!}4-q^jijKL}ewA2(q!LBBKGZq=n(&<5<-YKQ`OrLd-^ zW3czV8Pr3_-u*_r>(&|c`@e{}pRZRR$(N~(^U9e<8jKfyA3WOY)~!I$?C_^g58|$q z!vA~VaX3~QO}8ADfv1<(6?oGgrZNI*^j-d z#fe9sPvJZKG|+WD>2ub}lPm5oduf1de^k*;&xL~b7Qv`tn>R1$Oyg^6R8rm7ks82_ zo?K2f?4^~fR(bjRN5hf`J9i3i%_{v(8Tl@@U|FjiI`lA7Eyi%5qY~@K*urzd5TSNBmeYeG? zuW&D^6f#Bc{Y0@IA+SAxej&QJ1v|DN>U&p80_>A1y0v1bdgoshyEWJ=Ab;YIS#77K zRdAm?wYTY&sp!Ij;+{bYrSk>ht)t@cqO3x~!n^_k3Lqvb`}gmU90Qa1M%lfJseSh2 z78*wO>Ypa5^uXO^%C}FkT>hMl1}8==2>vQ|=AYfb>ZEwov+7QV`oNT0(^t8 oafIXlAI!^<7bcv}pi6hhgOP>(>#P znRPKynVH(Lv9UxccXf5`ZQnvC1V%!>Cxv{gl}rl+_s%`^1C?vv6UG_k$Y9&sWN7p0 zWNMPV4o(eGs-$_Y$s`A_!iPK&SIG?)AamW#t-rl-67cJAq7j^?UzVBYFK-031m3EO zJLUfH;X}JD6}SlCqMqCUTKW}Fk6~|n1pgUBm-PT?1as^Ad`H3X^RKt@j`WrRr*6Hd zXxc0VAiTi#??e`I=RObklnv$M&~OYP7kUK42k58vmd|nnRwe9$kWLp)hr?K^%4g2R z*3T(r5%0SNFq~jqxmhdyykh-G-5~KqckkLYl^Rc0=68Li&nCm9EAYva4xhwnvli+< zzc?+*6gFYJO}`;%Nowaz6oMSe Zqpnm6iZ!74yyrxkFM==)>JfRVob!Q;mterjwa`^rzmV*OFapRj0> zDa3#VfOYwZSVSB;bV$9^`@w@JXz2PM{KbjiTv}7}1bT`+bhRi`s7TPo>|{Yb)gGXx zNO^Oi{`Q}pgg{swPGe{ |vE%x^s~=BQGW-_-f1d8E#7uGz^P zsHX8vMEtho*{c$vLiubv^APH8u_5QA(^0t@S3>$C=|iglZ3sph?5Y(x{m}`~MkL)m zB!tIL%=!>v4F^}?%v#S7*5C>Fnv)~lSsAw%DhrGz4{q024}bl2pUfeE7_ Uem!iWr}Vr*)m$C^Lu%2oVN2C+~d~F zk*+(%)Dno 2sC_qc>#@n2md`6ckh; zsu9*X$xZ-n1;4W2zI<+!dO`$m9>ID`@EN6p@*Fm|_1h%q=FS}(tDndKDP?`y9k}Dt zR>P9De%sH5luB5pY4LmKB|Q+e;;&c@h~_*Mr68#2 +DqNVrCpU(IoYr0Et_akIEHOfVmurkQ=yTQ85`-L4D60|TXS z>B_~ZZ=23ik&r2X$Dv-+5*pwTf!}Wf3o6JLu7A>P-)&3k3<;sUe?Z)deWY8NR?T(> z?7mgrZqna-@#00JD) jD;E>mRbxIpNrfrm^Z#ZN$RrbRr(jF} z@YmyEvJ{)y;~bQaG+=G61H1jj7qtC?x45^8b&AwI+GYbEpH)oY&4GJc(Hb+k8JyZ- zZWZw2R%Q%0`_evMVu2t}GCssR*)K0YH@P-iE3L0W*PRM)x)6>W{$0VKt0tvZ*&=uA zw|1z79m1?DraT?uz?Y9Z5R_>HXd>XFG*V5_cEDIrNGLHi|4+fX+ay?rJkjcfd-u11 zO&Na-F_zL$ihfq*Nz~HUXP%XK Z<7I zbeF5@=){21t0u)(cOog2*;JEqZbvxb+@f?+^v{+{id()ONl@u%Ky5Y_(ul174FPSq zh_%wU|Mya08cV_P*tMHCAMzmL(Xkg--ZY%v=b`%Ka1gaP)Ckfb2s4qiKr}rA0yv-b z;)1m9H_=`p2HOE3F%)p&?TO9d2+JIufE9QDK#0*@GfB^elotPDtE>?%^m=_nXo#XA zYO#{?MGjQ%c3u;y)^LJaG_>veRdfOXB}hdiGA@Deqoa1DT*hRLry_B}C~ JkXsV# z(vhSjYiq|O !v~ z=ab&eO@)_- $Oq3$4ojG3d`p|7=_t1LCionj+`-N!YAGL@kOxI0yx^)-S= zP%KhA6RSV>obN+=MIYvyh-Jq;9yy<2yzPXtl9H0Efa5qepL%T!;7x=| -hyE{m{1y7>}Jj`wWtdeLGPZhZ@}z(DTLy zlCm dc-Byy zZtB)KM`x#ppQ2KGLrkqZU$R@(1VMR`^)OAP@<1I(dLiH_ HU#*dhNxHkxfXeuqAef99t8(;6N#6kU9`_P zOk>}6S}F@|&3@!?%Gt*Y`P74 <8|{z3yI%#^*Tnf^&4Br#N6-d7_7NB8XT;kZI=g z94LT;Gjt96pV^4;zGZik#LdjQF4UMNq0EDA*Sl&KirNn~xDXv20h?hyF`M|V#lD&2 zw))FQk_ k?L?~TjW^F NhN)A98mBt6Nm z{pFx&+oHB9l)%X4@JZUsW7Od0x3#s!+YXw7oF-Le!N I;UXb(q>uJy*%r z_KOq8r7R{&vINdDLseJz(Q9|kn1G4V7FwaZLrGUB+_oqP{q;5n4jfSPw5r90p|Na~ zb(C1#cF2k2@dSnB6R~KVo=T$;8J(O&NH40PT_Ul$ d63 zU3es_jJ_`}gGbbF1}uiKg67|PZH<2cl1dt#?MN8*oVSAupC-B=k*JfOsxNW#@F4G` z7{m`(bgofv&}Nsp>_zF;y<5#&58gk(gU}{Z$3(NQnIZh%R5V96c6L7B{18NYM*6Kk zU0ZWv^Zn7g;P+N-yC{Kiu#iYW$>@2#%m%@j1xU*-*`n79W7f!G8St;`t4|uB2x+m$ zzsZLvQA7RW+a_@&9gq45%9>^L--YHb2pmM Obb z=O&PN3xq1i%f}~2;#r8!2$|MEH2w*&qL=YbFDNFo&y@Hnd%K@oH{U-sS~k(7Grrq) zprdeNynaGs{u=qwc3{u;+X|hGPG+f%H$|t&r@zySd#86!SaoXP8e%ch(TT6GuLZSe zHMZr;m@zQKBA7-Nd3;GEWuRzcVv;=uNeetYYZ@h0T}8zUmqZ%K;1Z0Nz%&bME<4bh zQta`7(a&o#6W1w)gaKS3NKp(why>{DCr0Ya!3Wf9Sq7<;)-dRtP{K&+m7cG|&%->2 z@bQRlJ^n$g_XZS|M_80$z_TD%gr XJ6#1LnVgQ2>$D(s1M5OIHUnzWW0Dsn?O}j@tNyJ$ zZc882^BFE9<`nZ1bWE@mjj{B=z-+UzAQz6Joh;%duT&Va>8h$1|L~hu-k9` Q*s_B3i5#AKayP%nrcpQ04>FYI#Bdg)ZBC^1xqJC`Gu#kv5F)&aqfe7 zc{DrBLih(q2=xGy@$~i%#WpaU7$3`&KvFA0HCi*A#NchZGX}RhjGiZP0(hO}jy#kv zd|I0v7^JvJ`|))!vH11fJ7uuUG^=D3Bbd7ez H9kj z>T8GA%Sl47G>X*PctM=VQ^I--u`WB-Vzot 0rY(uWx)t*E$YGZzexilcdKj+I_w13~egANW3VR_j} z+}zyGsZ-+vqk1A&|9lUJcfK|YzolZQiL+K23(-^9Cb&1y+&zLxG!@!C#CL=&6S>17 z6d_-$o@r+tIfCpmK-P2qq;l7*S3fRe3-qg6nx&poVQ# F((8W@qBXqo8a;pRTiG<)&K3^bN>Vzoyukc0xj`= +BD)pQXG%OzYxg8Ha%TEB z!!I*wuGF-=a+bXoX|*e&r%I_Izv}Vk1dLqvoQkP^4mXhRe%Q|Ln Pz$YOgQL>uS zy0T&Dd>MDl`)IQk8#cKlW9wya0XrL#RTxa8@#}6?&q7s$|NrsZ6o`vb8smC$& zvuqi!%u*p^I#&_xPFEsf S &YsK!lg~hr8f^Rpn$6#s!orGy<`1yb zQ${2{;9uNz0j*S`d}8sCxhi}y%l=pke{rTGERZSZM=bUCQy5QW$!(-eEfBaTDvB`{ z1lU86Y84vUvv+ShvfP;#cit>`hv_$bnJ`zeBH&Mi zK7b%1jlnur1qPM(6L}2bGbz~(cPh8BCn~MB>!@d4yH=*%5vY{_+w~r|Ze`oY;h4-R z@=Q5II0b5eR%9?ZwfqkwU UGLWQ z8D=!iJSHdSRu-)lxtGIw7dUMYe`s;CG**d|e_*j1b9ZVxKP2#?m`-F)$p{y+4Py~n z$DYC #m8$!N2~M|L{cX3llvpF;HKAm$raY{X)g zDQYW?v_O?L#Joc4`JRVmF*-5eJbYTI@o`P$PEe}Wg<*g|?weQ2C?}wq97uZk&%BKV zR8BW`(L_-a@S{-HG7qv|xnA9Q_to(R4(UrnUtX{f8;9dH%mvC+#e#1$PRs)T9qja9 z8fZi_jYcW}Lu i_;ip1O9MI zsqN@pQvE2*T>2ND1_kXHtU2dS`XZ7%+m6;FooPUl@L!%Y2_o?pbtG;Nna%-(zN7-} z9ID5h9kWO}kH~D8L-V!I%gc+Qdc(ejHAhz!zXjPTkZ1d6y_San+=o>}McwRd>;7Fj zAhLSfq`0nRL2eRdJOXR)gP&+9EWp fvgTWQ>7oI(!aG*L$7 zb^epFli$XRzge3i8k3*jPsIN6Mx Hy6Z>PVpC280i zhY-h3O% RA{WcjmUUcb4{-*PbzA3gdeG@w7Hm5%?+DepQ3X$@cI2eaOH z9ffVJo@DBWWW+i+b>7-GGPvR8$hDe7E=Ww4GdGWi^wOyzeE)zSAAMOD?7+M9Hs|+h z=pdbxXk7Ua`z3KHvm8BeENZJy4lcE3YClH~mJFPbaBvhM->A}mP83gzqc=S%QFGeN zAZ}s_BFp0~pi?$SxQ3)&jXEk~`3B_V<;$S0BI>yw`B^w7>d+`LDCl{Gg|n`0)6cX3 z(<9=-P&PgZ)Ld~uUS1X20e&xpz)&(bhVS*qbs)Vwc(7dV-o_myVB%|*8IHe4kcpgi ze)dm&<&vTZIn-j+gHsxu7#PW*fSkYB5hTk9+k$sfm0$v1C3xo3F8EPAM ^Bp9+X9rJ~b!AOW&1?s~xXM98*O*1*4YK>&`^23gMj*Tf z4p0ETM$~S|=AHFfI=@%oW3;0PbXv9NMgazq6CB2DFpZ)QiNKF {O)82avB- ~rXG)zOF7zf{!H*wy~$6b&Ldv;Sm& z5$6GFh55Jex_Z3+?K*_mk9Jh$nkFHhOE<-*Sxk@ a7Cvjf_3$0;h(?1OYfmq2-brA zOP+dQ* LO|BINdLDf4?LiOq}oX{{Wj$x`W^ON{CcM_5pmDq zD6^Vm#bv^#9UYS`$&a-U(NXd~IgI~bE_32}$H8A&MH!g4BAQx-m&d-%Q zgZSwe`{GThin%&Ga!Thu2f}0OW46ys|J9otpDANkC_Oexpa@1Pr4W5a3cFZILHzOO z&!3&D2_tbAAGjwm{CPfkyoQ2!zbCnym1k3To%_rs$dbNpQWlXqXh93w%*4W>j5PR7 z4)F*Nk6*MhY*Y~ThoPn$S-l(~Cq$o0JXXt^W4;B394|%=;92_dA>aipEKgLkIn8q? z8YRbfZrZeo484+B+~WZO<9(q>otEHnB=#m`NE?Igfk;y)wr~5bz_ufNtoqw1^Z_^B z383d}$M)i(fTcs@6NkQQr)SAq&Di1C>73W(!3`TIxK!fz%CL20^$!aOFFrkXaVaxY zGUP8p!<9nUuU`GQ)B!YAHL^4&-!S1V)jToP?KiRJNFvNoZmbQvK;n@2d}wDgn@v~C z{PeW=TXV^4D63{v8Lhc1pc9Sfs E1Cpmk7a~HHw&R!u@gD71F@6XgEg7upsd&t$4P=JY z1aV4a%yyh&fmZ_6Nq&dpB#z?}LyiRh^554Q=^gh!eL7Ku&PL0#$lgWiWNDK;Kcq;E z8I#E~LlQZGE#K=i0PcsHKmAc~AVL*C9A*p)ty=rTH~HW=er~LFucYCiCG=-iupKjT z9v+^>O;g=)j}Voheqh4WbqXH!aUO;4F@ucmP+Efnr{>_<2r!u~&!-_cJ!k3GwToAq z&%juvw_} ~#AIw45)ny_+(p(v zYroAqqcvm@ogT3J(D^gxFRV&04;c#kx>t bhMO7uK)Tv`RzcfS^K$&hnSXX z1q&7)D`~A@G`HY&VA3cA58l}CL4p+MN>oh6mm=fTj}S{MqUp4;Zb!}=q%0ud&FU$2 zSW&TI@FB@i?Drr!jK31BP`5iGPJTbo=w7;ZjBv?rO_ro;KG#>+E=_}HZTsXo9fpEn z5QiX0q%BI8_*5Bp>o9un47B|}dngt;g?}Ni|F0JPcL9ve^AB>TzSZcQWF5fiS-R=C zGw{?!#Yqh5hoy!|e?d5Y;?SZx+Z=I+kase`JQ9HSAv^-%F25EbicF8bb@M*RN@Pmo z{{70XaSR}1_P_&JmrG{p7QGwfVObcZT#pg-#jEMftqM1-Lh-jXTw7b4Uc ~cyF7jP GN)?Fl3L|5f?_T~j+idopZ;}=Bey%4NOTyD$h^Qb_goGIRfjnZ#BN(MD zYmF8UwhjVxeh8rx`_`o5=?)ZuDKQVoDLR>+_zEZO;G#3)KXOA5fp%)qPt)1&7UJ9F zb XvpXF8$hIH&0Op2b(L9;9PS|1w^ulznH> zt<3fpwO0Ld&%DO@{YRc$I6~Z9>(H;>zfLHUSl{0D#&`Fvgf&~*UZkfWLXgUH{i0Y{ zlce#L%6$lOj+TfF{;0p73;yPPGz E~+Y1%z_V*`;GM4R$BxP09)y?rZOAZVs zq|r!OO6qa6^VdTPp$B4*^F=fsK72Tkd36r2e&+h~4hE;bH?H$V*H4~287|_K;lp|L z`p4s3&W{QPTx7jTDb=oC{hiTm@sj00sV0R_b-N+a DkyZX4|-<4c=5}GpilL0xjkw5 z=H2yovYoSp5p1L0?lR3IA0Jor(V|tCebxx;gXRq(+*(Dp@iMZqQ4NVP9w~5d+2(je zH0G!z&2sB?rm4l@>a7|ckKrk$ma3)wWDLDcQ6j7GBJAw!$yGrqdOKffWZ-+x1c-ip zGmY3A<>%+;^jM^%rYaj6#@pK38suxO=Ee|iK7IN$8biqtSy!cy-SR*#LQrmXb=75$ zuzqS*#Ae9r 5B;BRdo=u1tB@34-rcH?8k+D)c?4!((5&5b5TWAmBlCwY0)iQ zKup*($u%aLqJnDfv=-S-h++?WVIFQ%c!ezYqPMpw{zWX03+kuqRp`QUm)F-rD=I49 zzI(R{AyznNv%NM)C+eK#=H|xlwqY~Zo8MqqQ9azk*DU&OXh?r^Yl}lrP)*NmsU}$O zkQc_h#+QmW?52#gv}ukU#NAESpoXs_Bkdm7_Dw4Fk)(MLwoKt89PI3h_wHq*kt7!* zj=lbz-ZYO;?!Ju%1`7+zRLh$yGB wP=pFVvu!f$PFr@nprz9>@kehvf2{uZh*`cNU3dokkf z-`Zq(z8`cs8g>E#0=-3ciFSB21&*GPGO2z{4zO_e(4p450b&WYOrAP{1_gL3TH2&% z&yF-k3gy-~z@FFL$^K+j&@ec-XNw_{JgbPsroTLMecGvFJ1W|9_r5>v`OB&5nO1q0 z@b*edO7?5BJ!&xl=vkO8(WVs_3mY05CMP6FwYIkU qoD9*nGR;ee%m-{~z*SaC_E-o`>@pPybSAJvM5m;uJ7lP zLS$C zp@|FdO?12lPtcP!YzPr>IkFzrHB#Pw@7|y(Q>YjTCj{PwLAPAE{zYF879SiQKD{g( zZ5-pS*3;9o^{riDwNqVhYCOWa>&+D({yQHI8b>UR)S7>Ia#SnVNG@o?ayH1o#Dwkc zZ(6Z@?t!BBm*YZs^fJ!IxGCMfeLEU6;kzWA*8?BuGO+ryRH<5o0wIWQnVA#pqJ7&Ud*RK_80r)IJBNx&`) zp3!CUH*!W%jf&mXOzjgH)6>)T8;iI5T^GvaaKq*8E`3fdokiptrlzL80Rif;DGu{} zLWV|091;?GB~A+=%q*;|Db|DKIa=v~agWGo%yu@GP{>S>k4i~P g 8^Z0OvT8U0a&W_+i$-?PMY93544zWY;Kx<$-0ffyR6M7&t#M|6%i8G6XRt= zr=N?=w|Ef|L)dGULB0vYo{l#~;pbP0CwCzK+Y=Qy&!1PMqN2*t;PQR;tYf~vM8LF- zSz5xab|4);==p^9`0;n2Ki?Ev?NE04`t&Tn&5)#_v2jV?K^h+2wD52`;7JAJ=IG8S zr-9_iNP0%~edjt978C~E*P|FcHf}?tug>>tzmxKB13c+<7iIU#7|yBHcR2C+db VQbw-$Mfe?AE;V+u@!nM=4C_O@Hkv%knnFd}nQ z7|2EVNC6S&*|W8VVrR}=AtE9IKyEF(H$o?tpb#UDnE?nW9uGIC+YjNG78@Je)o}z^ z cm;b1dmEiWGK8sc}FiO923nTlN(y0xMeK=kNszxkinE=z$ar!f|jj3o~<4T3T8Z z$AOmMJT`r9jVwtKr}+-x4V2~blSUv|0qar1>A_v-w-3sw*mVJPPOB3%%GKQ6-Nlf3 zWuzAuYf*|Wdg;2aszTi2E%5^8T_&LOwDL?|K0b2tEdZbC=%<%jC61ONs${X8_fBQe zQ}|GGX~d#H|1LmW$=TW2Ph_Cny~NDie09j1QV_p3lUdOf#%Fwjp1$wvF43<-LYkmG zRV^$maxKZo$WG`S~dW!UffyTRSdk4sZc6)m!Y4%FD+$HZgHFqLDSCF#!-s1kcRM z%E8T@UX=|Z4YI$*p&L7qQwEFnqvlppRD3BPdGSqYsVGX~#3V;<>F7jW0+pHDP+#9x z UofL&ssEvpP6S{J4d(u5N~}@8Qsq z=Zs=0Wv=UjTdVr(^Zlz65__8H!2w;w#l 6r11I CN97o2W@b_W#0%1d5tFOZ(of}M#8K)NF6iv+ zGzFavdz=n?*jeW46ngjJ!-p!Gno~LHIXP`}Zf-`oVU!+-)+4}*Md9^6y8sF%@wB!! zr3qWSWx><~QpQ_=xZXA_(m?AduJ?pQM5InmPOfpBlBD^%c8D6Wzv|)PK|Ve*)03N+ zQ8F()vG(D^RZ!vGLQ>|#?;p`gc$BJT=p+LVLSo3))YSCmnJSlbQ^u~09HRD;pGq9L za`(=iS7Bkvpf=e#IAp9V2sq#-ZP9zYhz>=xKGEa}4`If4>urNhXWBDu@Z0Xx0C7 zRr4C}1&1o&^37y(bCdnoUnLJ6Iwb7!EeTJ-$IA=qU5A>9i78Z&!skk}=*qK)-ri%d z>0iERxG&YvsCx(i@-TSey;N`AiiI2n7GS?{K|K_MZ5yo%QdL$S!6|!sdaA0ZTnr65 zt57`a33sj5b7rE_thd6m0%aReO4vf1;rh(KVItqZ!dSRylL0R~8(UJVJFEocSeLSb zSo~CbqHG|}qUS9LBA^uW@y}tQuH@*F>J9y?a`1D3apLY 9VrUJ$n4uZ0p+; zs&(uJK{goX_MA9%YNpR9TZ7-|GcD*aU3nq&?m+xmjlHDua$QJuI>_(G ?0 O3KPnGqC8x z(S{O8);d_KV+nqbNHG044coj@LR$<e=X^kuiWQV@dLdW-M=Z$eaXH8A#|9M zvSRjlM`tHmnH8@OxUxtO4-Z3ysswDncMBeE3K}L{!qX#&@Ve0`tZ}?SyyEDzJ6FoW z{j%##aC)Ty_)GJDfnSY9<@Qrb?i<5CTTpS^FAiN2+ZgixsZBVieDr7&;^HPzz2iyf z_C%K=bMvOkjT=vZnR~}Mi0nB4tJDn);&upxv4w?9kf-iY?aJY->vr4_edYp%tgcKw z9_jFNw;wjF0n=jb#y`Jg4h{`X)h?)*$Xh7imZy~1$+8fPa9N*ES9~XBI#}*rJQkuI zX-WO3vc}38(Tame(aOH_h=hWk&8Pa!g#qU)AfLKXDQiF3A{DT-zU~yp)?>h%uU>={ z#~M|fwvhMmC~w$GQBBP=>*Oe?eSMRa8(XX*8;Y?kzl>}=HEmBQO5@Qh*Fj%LQBg67 zsG%Qy0set&2P;zn27xkVp)SHy= wr>7=82<6-=L_-^8zGVdb9X;S}P6^5q7iV$ TnjWmEfMP!pv?XwyIgm=A$LpBPpHdipT=-wo74!Z5p%gD|0^|sO z{W=MVNt28Env|3o+#Swu8W`8r*i4E@oz^E>6b6E{S}!p25J%1(yZc``NA3KGB&o8d zCKOilQ@o28&MHLPZ}JF}_|>2Yr4ZW63`M{FuK)%vi|S8{?XwLt3757t|2cu ZH z|CnP5HWbq}y(2fGx^Q>NUP#iXW9}h#D@D?=BnmtLlOh);ziC(9g(+SnFA!2jEmig1 z^?;C=n3#S0_Pu)XA{Krto?C>1sT1qeA3sp$n(DML;Op;?8a6t;pTqdBvj)`}hVdHK z2kSxJNsZ4i>)CCC5`o_ji(Et4Rmkl~QI{5G3gh+&giw}_4)p+#i5dcIdVEk(1 zg~7tS2wp>94i1jUh6w9&)6Y~O5}jY;GY{I?+Uj%xjhy)9m)O9-WB#WuWVGJhUG$MC zOsiPyHFueaa)RP95omM5@uw{9f`zo)#&(HnNbFh^f^_8;AJ6n8q++ne9Ye2ocH9o^ z-_LgX^kvX8-5`ki)=;E{iYpXMk=Qe4_bO8|Gu35ed_O*CNWESCIDcb5T31mWJN6bh zYXZlvoL~Z$5)gVj8Bb~K!-xB7YHL$7GBWBsAU3(E{p=2rlUv?HIb<%mrsDL?zhg80 zYm<7K#v7=pAlMpeYio<#fo_`in8e)*PoFvCu+n$|)y<$J6yCYV$H%h^2y_ 9|o~X)UH^wr${1qK5^UV-DHu>*r_wu3 id;Fs0xb*kfV!^Qny<*SjkVBI}b V&HQ|oF9CZ6Q@ z4jp->?e+_0>t;ih575=4{sIc1kTL!^y<8)Iv^2ZsM{WA)#cx_Ti!iC@^vU3I;_Swd z;=|~2)zsA!A&MZUz(go+6@*;EWX=S}{V U#& zTCqiHTAIqOTQBf-z}BpiBrO~uL0i~6y1P?xI9#jyALKE9^ffn9s07!C9NOC2PB1ZL z?h>|Vpd_sS{8 WIG*Grt0RVpkj%w;+`@!N;v3MOzY^-WD(S+}c29S$MFLg+>Y zMMuv&?kNnu Vgi3wDqz4_*$ z4IYr4#?kkss;a7%S687lODo^_>c?4f4C0mIy=5f_8`~{g+Z kJhCm zCz~$6cHdqz?Ml;>k&$TwDS#q36r(^ALikd6gv(g4dfx4764X-?b6rz`iVR3wzb_a? z*(dn>Szu!SE6T$2-l1Rz$r~64B_}G&Aq_e~%7QDO=dx;s`Z3|+?#0Ze0EiGyDvpjg zqozpH4-V*qKmS2M^Y xm#QDEu) zkLpedoVX@}gcTVDg`+9ooexh~x8-DImCejj?8;J7WZt}a!_B_u8%4>K=rX7~XN#%C z+lzRHQ2vH29=9S60Vf=4@DvcqYyjsVT^k)~0al h06 z6C#Ee2}Vuq&6SA@J()cgA%J34EGIJu3PMqSerZRHAPXac`YdP9a`N#h19(L5?CeC| zjRU@Mb9ZNv{;!gP8QM$iEG*ZWCH6`|Kqf6N+K3UpwS&8@c=__>Q@R|$;M+E*{*!Lq zqdotp+2VMTw!(So4nUF#7`ei(YiaYPEAnHbqo081VjF #J#KyuN(pih%o;J%f;KoLD_^%K;Qc^S8EK;IvI o;A+i>50l`@SS`PXDi6-Thzn^s=7wr+IAlP~o388g4tNYi3gBbY>g(6E z o$ku_hoKER6qQDAYhQ%TZX zL*W$mGZ_2^sLB+;yFiOpX1|)#dU|@&N_XzO-CCRDOzq^5h67EWFC3vDr#&Z$8nd!I zWpS|gX7hbTj3pFE6b%uXSGQ(`M;Wu}``-^?@OqvEhelA7fhyqj04R$e{#vq7-d;^9 z!3C}p=uUGWm)-*F7^|YOknjG 9s&uoNZm+b3#Owww8Z>G z@-(>63TAb7*1{dMfy?9@9~}j^PSsL-DtNYxr8o&EIHiDwhsnt7dUk7Q^w^l0ucCG! zqw^3EREQ;WK28q-L# l}&8d@NhxvZixq+xAi!@2SG`72;QfNE(6cl5g>4-q1_ zRwGh{sv?uzr&0_QK7!T*X?lcd_374kK6o75-xhnxyRY0n_~)vO6tbWkx1arT9vX83 zcpP|tdLEncVC~>j=;1kz?G}|OkQ}C_$ rd13=19A`Dr?6^Vs8%z`E)|%x{gM#gx zi1EZg0-=ELh(`Aobl34CIP1ah4VJU=kuBhhucF#|z;(egF@;B=%$lcjy>y`65HVpP zDI#7JK5*aw>HvZDYHMfbFxAE)7cHs@CA%DBE^H@+uB^1Qw6Oi;3s9n{Hpt1zaZIC^ zRIfUYmcsvPmC=d8{t1LbMMll7#Vn0#Pst_cHLw`JpNyKP8w}=O`E<_u#<;3?9fGOf+BuvwUddUkrsd zX7w~lOVM`_{kv!1uvp&S)&`x|s0J`Yk4TVuH9b8KkL`MRfGp2$LVm6%_c~!~)ebMn z#&!dA4+f7~QzuSzjGhNy-6*%`g%*)L_jg(OuTFVx?bYkoIeB=R4YjSTGQc~-r`$xa z8W1F40EY`&h66c*jrl4nY7XZP8uTWsviDfx2z^(&cH$}PQblobaXLPuXB6}oZLZPm zi=DY4FW&{%04CWbBqX5u1plHWJO_GMq00r9aMLRE*f`Ffz0Rqg(E*2_0q7$S=B`$j z{)4k<|F|2nCplSBMdcMd#z~WbNz6qBe9 UrNY-P~?K+#a- z93!HY+H+n591&;`R?I#p-nXv<98#%u!dgK^C!lbe52MSCKvYAP?d@*&mfp|xScw?a zSt~;9xhZ_!^$3D(M~*|m1@)P|eUVDl2>&X&^LKuSMWDSrLi65EfZcYDAC0P#(pO$4 zIp~(6&Z(m~9i*G}?TyTX-rnB%@CE&jcuQzTcS1#!aOgOz3DhBUz^uE2d)uDS>Nd9* z4@dP&ork%(xhnKqb*!5Y?G 0+! zgnCzGgFzcDLoBJ@g&|7K%Toba9~g%^SwLlQAj$yAaZI`nFGE8o)+XAb!xwqZoqOSV zQ8*UvC#U281o@4$BpDH_IXL7$XAl|JkpRUEaN3!uz_hwBs0Wd>1#Rp+!v<>Uw&~7P zv?mMVe;S(iE_3 7cvHv*6Bj~v~czpT)!S5qdw=&3oXD` z&NRRMdyV&R#ou3FD5-BhfK-n4<{Ag+x=gVIzj}qf3~G5m9tX{>tgHy!`}% rA-zWqptbTBCu!!-OUs|Zg zut%Y4Np*c4pLrPOYM=?)U(MxL^L2_h{3?1sOt(-mF?sgXg4L9yo~iqh#vm5#J4*tA zx@V4I@3@Qlz2#A9ZZKUH#5d#Kzke@^rPzh>4mRkCwHxw3^*RvSKnuwOohJc{FXzO- z5<;5@__aR_YUDdS4fHsu$*{@vJcEOa>!vpe`Lg}V#bY2u2I18c WgXeHuXYB+zE7$U^Bm z0Ax96L6cH4+Pg+}ng!R~xrc!QXinukVhupGbuX>D*kMMiV;Bl4e#mr~29gC;5PtFA zTXYRqd?<>(OQrAT9w<3&rvpgKGtk2Xd<7vw%AYPCq%GPNfqsQnzF9DS1k&tpNZ*@$ z2N}rd$vnv8lvWKfj_ukTk=VV0%IMwgial+ZNShf%r4_?kw+JF!0a~f7htlyo<`+eA z>}v_j+Z5G+F)U%H`AAT1BRK@HyKaGtZv{S?*kUCy%(*z>6)Y{&fvt3?5tDSVs= Ub*lY3VS8O21W@_r_$kYtoNH~A3SHIJ)dHYEp?h^HvurI~ zd~5Oy+LDMa-j77-fPMpK8ir)9qA%Rw#<#Z-d>1+n=p-3{L>VYIsQAtDGV}8I;}a5u zyTQh!wK;6B2xNje?z8J`{rc}RX?R&>=WC6h%WQV-H!xf$!_6}k;ZeIAwGx8Dn`{W} zo5p==YHA@cn2`#7ZJ49!vc&6_xtO-ZUc$uO@bu081@YhqdrpY{IqSNyfk9y!k8Y_3 zICEAbDag=5ufdTnux^u4q5!N&fZ35=i|y%YGk4g)XFh;5QI~TSvM^3*SAc;~R|#!u z!#LCT5(4DU#H%&%g$vP`fp>EU{B>FDF-9A&phZ%-GmauiELLE9e`;Z&1{`~;o$sTL z4wZhFnRJ)&Fk|NADh(eH`RL4}I+!Hixet&q%CdZS%N&(J(C*zD j7{mX$BK>Pn`itq1KdVx# zaP3f%`O^z2K{%t0bSWt*Z^4*qnWthNg1uHGzb=}H10vuK_m{rk!3 Z5k~tq*N^qNWpvN|TaC+E> zsp|@**r@0@%w2Ya4ZIpLxRW5zO%zLJ>bHFip{-jyj~f5bKyc`xrlCoMAz10QpPHa8 zLA$^Ty@De`&ImZ^?L*$dY0ub#cmnUI*n$lFC2&caVk9!r))^G3{ X7&31 zPzIvd$LatH-KF (zawj1crEetSr1|$BB87 z^jddPEH>A>4~EoKwX{+IiKHcV`ik=MIyU=%R%20fO!r5Rf?1%hRqC8AzPDpXn0KmZ z*S0Q;_XL7>!byYNOwBA$L5oSx%?3Sw&s{fgdM m3Zr*pLp3x3ZLM1tp5MgCoy1O+)zJ g7{pw@+4OmA&pn5( z-nh)Y+XZ-rKzhd#Le6vIAwutTc?bQx2%=RFjw5~aQ%Cg#u-~Ztu0g>EyB&=om87Y3 zCzX_4!k}8_&!)3=`GU3;2p0uo)YTEJ4|KM`%&Bc^b|;;5(Q+MJ>h(fr;iT`V8OD+= zeal>jxmm1&`GSb9h};z@S;`4(+5w(#543oQ64sl(-?Y6xpN~$2$G*GsLgfETz+~-F Z>Il8>9wa3Rhxb6FugPD{xUB#1e*o``Dt`a~ diff --git a/tests/safeds/data/tabular/containers/_table/__snapshots__/test_plot_boxplots/test_should_match_snapshot[one column].png b/tests/safeds/data/tabular/containers/_table/__snapshots__/test_plot_boxplots/test_should_match_snapshot[one column].png deleted file mode 100644 index 4c5b2c817a257cd9390adf10e4967653a485beea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7951 zcmcIp2Q*yYx*t8lkRgQ8qKi&QM2%j9Ac)?g6TO${BYH#-od}|h=)FaTh=}ODNAwac z>f7_b?SJoG_r6=+TZ^@< 5~>5~L^>c6yp; z?3wl~RkD3P=x9CNcW>sjzW;nGv8CSCDqNmk@dY*m14i_o8 )-g@-t(azqUl# z(=jsq+KlNy{J_9KkeKh`O%4u%TeohpadPgvDGPkyMOt@{HG1;ARY?u*?pEM5ZlM p>yi zU%rHQnY9;}x2(-?Sr^uQ8H8TLn4L8=Z1EePr*C9ZRA)~*UN^qHnxwSc4sMuJmfEZ9 zP3FlfEWE ~~hUWGJ-c@X(`Bi@mD0*0+I-p+PPb%E _P=@e8IB<5t@C_V%5F z16e64Ow~+L?*knvna<3?w%5F-n3?{EkB3G^7LIopkAL+C#xg6vnoCp@U#-6QF_5RA ztlatTQSnYY9^L)oVX5Nb+?E!jvhgY#QX{`zS^L=*8bLup3Nar65>nEE@$q{|9XXlK zxFI!jRBV#R#@N7mi|=-`j*_CH^B6f5703DayR8XKiZ2=(8}qZXZ?67Y$x1$|t*%y7 z%Ga1^_VsK%0f$Zk=`pL=|9KUmpyeph364ohQ4!z%4%NcKf=_ADyLVDjQo)@yA3n%v zJ$i%zdHwpe$(=MBTP=1nGjsE0I74nrUHbR+#W)E$0|RPd5fOBGnq6L;*KO8J`jiT$ z^<5z(bQ>e5ptw>w&bfVQs&6dlUop9foZQ@N7`AmEK0yqRk4Jw0ZmCwww-6Q{-ho1) z1|0}FxUo3+`AOW}-N6!%Q4$wH(b0rjT3Y**dLdmVye6ID(9!+$Tw6y+IZMm81(OuJ zdq01|V6gesJKLCc$)F^Y*S7!b=Z>5)e>zQp>qj$O(;%|m&2*x0U=mX;Dt>gnsl zu3u+DFUiRXDg8i2C3;YN-$%^F)pgmuc=&mI{574;IE9>?obLYqBR49Yjs4ZZu{vi) z+Q2jC(6BJ?h71mJIDBoDJUk b{dUNO71`51369ITaVj|;H5w{=lXP-GlMX4nv zC3)d7F83doY7Y$!fgbH$^-fY^eyQ{%aFQm$&(ANsOYIPeM4CF&2sowVzA`G8cX8pD zl9nErnTcIkFiTNkd6}Gy1^G5O==`(qZl?(^Ks>)4NlslP1l?R38XD>v8o`UGxL%1( zva2{QE-pKtZ}*$*E%jU>CPp>5uV)WfXAj%r9VtaBc&TEogKkq$Q o$4uiJ$LlM$?KljGE7QEkX^NydD}!1YU^d z=H*qmt!hLxym`a4F;T5-v~t}@X6gB08#@Pwt1b^GXQ*DOoPz_`_x`Nebv_IX45D>r zX6Cy2a4H|{R~khxS+$uNT;y9bO&@cTL&T(eQiFprr#xr<#kRUtSV+O585kK8l9IxH zuJnu0pd4#EZL5VjWdz>W(dbT3Pj~n9w1X3)`A+Hf9pGPKc{vIY0Zk1nGc(x66}dcE zzt|BqJ3D)PdU|wOS(!MBpMp@mNNcadW-U^VwzlBi=&Bp~QwfanQ?yNhJO&HYP#fcw zG&Qqe5qnt$YFV)W;HG@mOL Hq-y(kPdYGTyzbV^phGO30N9`&cScvaw-LE#w4= zAg22micdNPAG55?dGiLlSi98av5516Of=P9qL`Q%{}Hw%C2;&A=p6_(cLMCS8!2hO zI6pPzPrXJ ps|&lPv2KT95T;p8IeK= 9MrZ o96+LStiNCMKr2rJh8cKtUOSl6%mS=g+VHa1++j z(OLYOBVFgVN AcGn!B)$vlI z8n0;wc1oWm %-E&}`0<{$t!|h+A+vLENRobCmO)2Lf42V+(~yci z=^d)IKc{1}?c1MwBz>f-tBanSTh%D*wiQvpVP)2QezH-=pqhk#R}7pG*M1B+|2%HH zd}KtM^U__I+pwyU`>kY!^P-$uEiZ%NcIgMZa&l q#HeJAUJ1xZB z6qS+gDO4rck;UO8kMas)RwNlIc^q z1_T7`-DXKr!T~h}x$om6?AY?ll7bKy(nfc&gE!^9l93`{LozWjv2*sbe-RL)ZnKZz zv+Y^Q&j6}!_lt(~B(gFB;#(gn4Ux+W(k`a?pv=rL04lPnNfdJ5$TT(6G_NwCgz; z geLw(VmHZ0z>J_->JPBeGt$;U0!Ogbjojg%P@r1gb={;X0}U2Qtk z JK%jtQ+4=c1M6WblyI59QI%E*TIN;ZlDfdxB z^wvJc(nN)ZVpEHFe9o~1FF~E{I*~G9r(t6#3~Hx}Rh*lPDV#wxJUlGq_Tw72VMAzF z)QwKd$^-A{9t$ZwJvb4ac=Wq>?4hBdCc6t=LcWJ3(uNuuBzk&!OHYorrm 07P z30<3QYg=1#s;Wfazhp$&48E=R4+b!L9Ug;=kB`4s19 FWW5m@2R}-ne{*F z3Csjy8)z1%_0rl73;y}7#_cV4&Ss;ysVM_=oAXy8 QYIyN?D6{ArU+S=OMDJ8=gH7LTV_yTF!2j7@&rDI9N zpP!$1gf`d=ve-}6!Iqbo>lR~03`Vm4!dt$Eqyvbh|CP6li~_gnSCEd=!W&cdq_tBn zQGO}_3?bQhd026xdsp5S7dx*F-2w-~`S?9{BFh6QGqZ)8hAc2Bo+=gx4-YW_gWcWT zD?~)El7ZLj76c4tZDZps^nIZ#>Ug+3VA<*O_r5d?h>?-e@sGSXCm;)MGB98Qg6{a7 zdV6;}@RCX?-zA *t?T}ehi~%pO^4q-I-Uz524Xj7 z*!H2ZG0&*|KO#5kIu6EMQ+fLOpHY*St>vv3aL^=VWMscJiD2(5u8=;<&LAwjB?r$L zZ&ouiGo=5ihr$c&7`c!LTAwS#5@)=SHnWPGyu8=K!or9WON7n;gh04YVmm-}-MoF9 zv}STk^5};%mbmzUy1?IIP|jbNF}wdY=;#QWRg9Z_d@x}DA +0Z&p28ynND z4@VT S*|M_fGQz=sc>g0%k&d;! z>!3lWN6J4H5;%-50rqHDzdYUYFj;jI9vU58>`q_|8CT09#KpQ}Kjzfezdotu-Pf-u z)9m`U)TL?{5*++>Vqy(hT3t;BSby(=uIAj!_5_gNhYuh2@09`5;^ a%O8%je11Pv1!RCe0#E_` zQPZ#QX#i~#v-pa%*pE+6F#iRo#3&&_2gz1vi%(1pvC8zuMLQfXFQJiAeY_YstWs?e zM6!}ht}9&E+uIxR?D*I#V)L(+<67X;J6}?7;{mPUwGhd=GiDxV3Jez;7ni%2daK8# z-kALz3row~(o*Qp?|ssbA5#LohWq0^!dhr;bOjks5 &fLE_o)E^P@r~L- OY;2R&Z}~*-ngy!vg+GU|OJ$gdl1YnLSXmkG z-5cM;c*IVo#h%n;1j3xBt>@$%I%RI6yY8bsiSI~Y_2yr*Ov$caze!JzVQOkhG^v&; ziVu1yl9YAf;&fZy)wOcadBa1bM7tP`zP;JFBRa vc|77Gczl|_er++Y8GjYTA;~84_6Rr vt&>#%Cuc=9j&b}g+e41%jS69ViIoR0l+uL&jD?MU93lgztAkx!?-LJ~W z(RT3!{!;ex_NM3J+GOX6K!o20C>=*95gSHub~9>O}sl~NaQM?6ze|2aS_u^P}R zen-=u{ Uw%>RWla+k~!-8 zx&W!9r)wN0oqD-y+fXRHii!#$kYPPCyaIy;{=OF1N85nw0X&y*qgsz^d$Q7s7-TfN zK<+P`AI-|UxuMfA=dG#w3u6pe3 Y|4(bF^#nhDqTsSIHSHCK=+DH%a!AbB7JWA z9@+!xgbm?!oDu@Hlv7 E|`42#(@`(fR;gG8;~c`V8f8M$w{i)R$oE~tV6YnaUdX@?F9HOBGTB;_Yxgy zEmvFXfWS}4;t~~u4LTk)(T*FHKxiFdNo*{Uz@0mv) vtWMqJ_18>Iv$PjJK_b5R9cXxNU(RfY;jaOQk1A+$3zt f zzJJoY100$8`N;t=9f-(CNdVK^mWb|KVIVgxNUI~!E+%77x(XWY;^HFHF#`81fUWq{ z)X1|lzZNDYy#J?2i&8f!DM{hMgD_y8q;l@t*c1((+@0~liX!Lg03AKQy&YFqCj>G< zks;B8Ax*S>=zV!hvusTYVSNlb9mI2BATU jRijB)oXB@V*5o^Q^#&djJ&h@@N>~ECw^C?rv^EQ@;cR z1#`;Eh(OeL1qux_Do25me5j>`J$ITML`g|G*5J+o0& `K~qV1S+O*@upMgVa0nSUhw#fT4z9UvF(NVzdF1g-JCB6xsc zN#-#QS1kZth-?xCGS{Uq^|n>~t5@M*wlf9ZD>@HTH#Cd^k0IVafDQ02>=AK@i_^Yf zI;d|&BEOnWTkzM5+9)bU_JZU-Yrzvg^8YNX`b~atV->%DPXaaxax+krXf1TFu*aff zvv!s!Un3Gk@(0JIZy-pA$vaany<9uHyOMwkV*zq9pOX$;S>Q*4$pboU1vk{<+S}TK z`PWr)ZUY3M(xs&(lY_NkHXfd2yTgs~5McL2e=Q|?U7jDoXlP= ^yg<1ogj@`<8!t(Gh+aMK_EAHjAR@fN~QY>ALhl! z$KM>i20O59vkJKLyKx5?ArRc)o|}ByDyyTTQ!a=$vRR80e@>%_>=!!~tgH$;hwO6i z`JYsE2FjAb;aBPC=)feTgm6OZ0ITm0ke}%&eFZqZ?$4k1!5G3}@ncM; JV5fBRE{HEmOo*%h%&&n4Vq)Tj(1G)@5eDSGD^Q-QvB529Z$}w`*krT zC557Aa#H`bkaKPocsT9i#WGJ|0^k L2Swg`Pa zuOC!$) z3J&IMyTdxhhRzzK2`dJxt@@@w)yvU}yRrUfA@J@cWIKy!Fd^3cCm3`?6lGOq%A`z! F{|6Zwp(y|W diff --git a/tests/safeds/data/tabular/containers/_table/__snapshots__/test_plot_correlation_heatmap/test_should_match_snapshot[normal].png b/tests/safeds/data/tabular/containers/_table/__snapshots__/test_plot_correlation_heatmap/test_should_match_snapshot[normal].png deleted file mode 100644 index eedf2950c2e44e59527ed382a7f6900babc2dce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11831 zcmcI~cQ}^q|Nl)y3VF&%Mny?>$X;35GPCt~64^r8l2DPdv-chqvf`G?NVx5?HOQ8| zec#uOC;EOq-@ksp 7cO?yY;I}(d!Ui$P9N#p~K3Lp;|J3;&bnda-*0Z zs)kJ`60uvJ`k<<6%X^K{mD4K&Cxx{kXxjAcsTY@VdOluoO6Kx+GcfUfp@TUi%Nj=X zd?xy7g5;IqHCdH(Ww}#NSN^dsX|5Gm3N4*0jbAJMl<2;+P#W(_>wzBNfC+u}l#y8idwJ%@xrXlfrZ8PA}XyP>4ojUEgwPs(c zKQ@3ycjg;;N=J8OYiHk??tc^zpdl~+=wm~Jq}bhe=TSJQDy7WVueIL!61R 7~Cm1_>SNPr~E9r7u(!pD=14~$XB~iA- zwAK%amX4x$-bH>b&hI<_UU7YTd74{T_l2 9;5eBlB+JG+^YzJ5$r zcJ{(Tm(lpdmx8SPe4E0?oAK_QU+0R?DNuUBiyR1#j?RvWiAiv0k6=+uHZMn3(d&e= zY+boSseTQSXmL+&R#sMmyQZe*qbE (rW)<*doV0C6tBCGoDoK>BJ^W;BcQIN6i7lZO0(?t zy^ajtOol~Q-fI6+WqNO~KCO_G;z>U1P)4QbOG?>Vxvenug@X7EMWH)W?XRtR<~#Ll z@K@{L&85hN@VG78o@HXPSegBim7A-nrKOc^WTc>q!bPDNXbz@%<=58Id*--Kl`_q& za4eB1NAbvwcjar}xRLsVPK0{7QYBv0WjwcdzFl2q)M#tLXrXV~Lz@G={;IXD?SNHH z;K}q5CY1{u94dzS+7BN-gcn`*_jUgcomBy^9NdFBL7G+KJx8BtR-rfF_MM)dOW(55 zu3IZ)_)8pxGL|YiCe9NmeF}v_U6RBlM4>(r&Yd~R6Nq~hg`#?U{DtGyC^%W4j~s$4 zV8fllDZGGu4;6hH*(x&pG2a!nq;Zh%8I$?n*n6?J^r=p1 niGK=i z Fxji8K6fSK}vVQ<% zo?eYlv1@ymB*F12@)LI??rT>0+i;WJY2Q5(aN`;Br=2JB=G&dzeP-i^y_3UJuj>53 z0c)`P7<30r432vt4@6*t`;s-y3wD;JFWylUDst%5%~uyZPW&FnmUL$Z3^a;3dKBm* zC{#&iu3?2P93ZWK{z-wor(tN=|4&c(bfq4N-?v9r^FLeeU4qwH`E@NIAfU4(^eJ|s zO|Kaf-QC85s}d6T;CqE`EB2}B>EoD0$+0g5Bjl5wYdr&Ft*Hw4n$uO{J6~LXH;<7d z#V=~8tHZG5zxiuy*|WsJlYDTjr5;mqbgoUK^Vg=zRTdT&_% 3MhK0 z`{vkYd3E(=;u9C8>g($z)@p<3>6ho8o|fcs_^G-u-lbCRG^wVm8};m^4>fkjzZ)W4 z8MZGyPD@K$$g7ERn(j9sBO?Q_A?h~L)I3|< *#3CWTXbkL`LFP(rtrHu)MrH?iw{UwT7BnQhR%QHr-mcMSlIrocY)H54(h$ zwT;|UVOdy2MFGtzm64q`m=+cil3Zlbbqk7y;N6)7Wa+xQb#L6bAs2j+n>#Ez+Vz9o zg9i_&xlIGg9LFgN(P?Qi=;aR_^RPyvL7wZ$FzEc?ebOw?txb6q6`L>%BK#@j0Gsw! zndn`%>MgMobe>I_ot^!@;1U)YnUR!~R8{>nSvKh73Sa%#L`lE-w*>S*WAF5rCZYZP z2`2~8Mkg;>VoGn1gg$+m@QgwB)=>2Wt1%rf67;|{>C&mFS61&0hUjp;EPmQ5v=^Pk zAuQ+mU{ky*a7T=b;k)~$?T4(VOXjlMn{mA2CTXr87IEwtY^KD=6ZU|EZwMYH>k0zj z+lP#5$o46>4*B+u0f5?vImqGt8UfetAPe3SN_PiyH1{9lBWYf2kN*X^Uk#{#p#ZrD zwhsR9dk{$IQKky~3ozU?j9yy%AkHr&ralW>oybU#0a|I`u$dyW_d2l)0K4c^LVzjT zE@W?rnqDp6fEnyO;oEYr+{Xx@?0l7sWD2K{l}H>g=%9Mle#}dQOSd26!XKatSMK0e z&EYB)(Ute}%rJ9&ftV*xZTS9P80#48D=$97zz`N3oCGiaTu+`6+K|ML!R&EBz>!bI=zDgG)8}GTfLLA7ZA8_1@l3gDY#cL576O(iOo$qsgd{}QmKkoS+ z$L=!6Y E@jFw{4L+PT3TANa&nGX8hNbTz$__*v$i}UXVFkq zO?dU{qO`O$vxtbnfZJT7V-Sb_WnI)%e}!JiIVCkWw>RPJ23fAt725Rf^H xkMv<&dtU4ADY_>ggY+h}O*x2xvn<{`Bm?d?COH>alCv$Z)ymIv>z&bO%? z7@!rfmom)f%V>^_qypZhU!;<4eii5L*2a=Wl^0Go+7lhlVU!2ZXz}A?7+-tD4(rnD z!eD}jV8=u&nk;x@ku_62UBk$TK6Fq{4cO8fL!0E a+uJp6n3`VT;<_rf+7dM1Gq9;8;xdmxZ>^#ICTO%UNw_oj zNkuUa4pWAPhNgsu9?#V+l22ETElaGlzkS;g_+5gPV)Y%pi^3?>QDxw1#WiCOdV70i zR0b+s??_8YWn^VtF!R*Z4C}SNQ^1}GFQaT@vBz #uE8EOb24I&P=IYEq36mJ#0+TW*>SC6(7u$~swYvB z;OyD6nLzel