py2ls 0.1.9.2__py3-none-any.whl → 0.1.9.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- py2ls/.git/COMMIT_EDITMSG +1 -1
- py2ls/.git/FETCH_HEAD +1 -1
- py2ls/.git/index +0 -0
- py2ls/.git/logs/HEAD +1 -0
- py2ls/.git/logs/refs/heads/main +1 -0
- py2ls/.git/logs/refs/remotes/origin/HEAD +2 -0
- py2ls/.git/logs/refs/remotes/origin/main +1 -0
- py2ls/.git/objects/12/c2808a1b3a4d0892a4154dfba1e2ae3770fa73 +0 -0
- py2ls/.git/objects/1c/9314c5f69b9390068a2a8616875d974849d71f +0 -0
- py2ls/.git/objects/2a/ae95d517d213b660bf4f65a4e0cfae7bb893eb +0 -0
- py2ls/.git/objects/34/9e31b6a3634cea102ce5588b98c11cc1738605 +0 -0
- py2ls/.git/objects/45/b1b6178bacbfc997811a998b5cc60c1ea7fac8 +0 -0
- py2ls/.git/objects/57/63d0c52f5c9c69e89d514a1f96034947abe21a +0 -0
- py2ls/.git/objects/59/380c4c26bdcd4d9b71ae3e2e35f05b3f26c5ab +0 -0
- py2ls/.git/objects/66/6227eeeba24073e63811e89f1449f3d958f183 +0 -0
- py2ls/.git/objects/66/c998778721d424bd0aae80602dabbffa93af2e +0 -0
- py2ls/.git/objects/6d/c2cdf4a84e538e5d4777486aeff87e42f41799 +2 -0
- py2ls/.git/objects/72/245a05b0966011cb381e6b32b0465000e969ab +0 -0
- py2ls/.git/objects/72/e4179337639859678ddaecf38b16f33aaec8e1 +0 -0
- py2ls/.git/objects/a1/906da89d1174f74867800c74c43af36253bd5e +0 -0
- py2ls/.git/objects/d2/992df305f4b56a466a2f221aeb182ddd20f418 +0 -0
- py2ls/.git/objects/dc/c2bdbafb3296e09d9ee4955cfa55d275825f94 +5 -0
- py2ls/.git/objects/dc/cdbd4266765d840be2ae35ab1752a0fa312c16 +0 -0
- py2ls/.git/objects/e2/f2f8f4c25e62a297fc55f36acc6b01cfbab76f +3 -0
- py2ls/.git/objects/ea/3a18cc75e53792744ef754e05d3f4481768c13 +0 -0
- py2ls/.git/objects/ec/40fd8bf8e4c342534a9fc020289e402ba6bc9d +0 -0
- py2ls/.git/objects/f4/ba7f815b886797b73fede071d86e0c134d2bc7 +0 -0
- py2ls/.git/objects/f6/44a8ff56fa035105fc517cbb1ac46c3d8e349a +0 -0
- py2ls/.git/refs/heads/main +1 -1
- py2ls/.git/refs/remotes/origin/main +1 -1
- py2ls/netfinder.py +0 -8
- py2ls/plot.py +188 -45
- py2ls/stats.py +118 -97
- {py2ls-0.1.9.2.dist-info → py2ls-0.1.9.4.dist-info}/METADATA +1 -1
- {py2ls-0.1.9.2.dist-info → py2ls-0.1.9.4.dist-info}/RECORD +36 -15
- {py2ls-0.1.9.2.dist-info → py2ls-0.1.9.4.dist-info}/WHEEL +0 -0
py2ls/.git/COMMIT_EDITMSG
CHANGED
@@ -1 +1 @@
|
|
1
|
-
update
|
1
|
+
update
|
py2ls/.git/FETCH_HEAD
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
6dc2cdf4a84e538e5d4777486aeff87e42f41799 branch 'main' of https://github.com/Jianfengliu0413/py2ls
|
py2ls/.git/index
CHANGED
Binary file
|
py2ls/.git/logs/HEAD
CHANGED
@@ -18,3 +18,4 @@ d84688b54c0040a30976b3a6540bc47adf7ce680 32fd627b62fad7cf3b2f9e34ab9777126a0987a
|
|
18
18
|
32fd627b62fad7cf3b2f9e34ab9777126a0987ad 1c3f92adda34344bcbbbf9d409c79855ae2aaea8 Jianfeng <Jianfeng.Liu0413@gmail.com> 1720709655 +0200 commit: Delete dbhandler.py
|
19
19
|
1c3f92adda34344bcbbbf9d409c79855ae2aaea8 bf67907e337021ebff434e02b19b30a741c144af Jianfeng <Jianfeng.Liu0413@gmail.com> 1720948339 +0200 commit: update
|
20
20
|
bf67907e337021ebff434e02b19b30a741c144af a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng <Jianfeng.Liu0413@gmail.com> 1721137352 +0200 commit: update ips
|
21
|
+
a15389729850729fc7bd78a54f26fce77f30be12 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng <Jianfeng.Liu0413@gmail.com> 1723527985 +0200 commit: update
|
py2ls/.git/logs/refs/heads/main
CHANGED
@@ -18,3 +18,4 @@ d84688b54c0040a30976b3a6540bc47adf7ce680 32fd627b62fad7cf3b2f9e34ab9777126a0987a
|
|
18
18
|
32fd627b62fad7cf3b2f9e34ab9777126a0987ad 1c3f92adda34344bcbbbf9d409c79855ae2aaea8 Jianfeng <Jianfeng.Liu0413@gmail.com> 1720709655 +0200 commit: Delete dbhandler.py
|
19
19
|
1c3f92adda34344bcbbbf9d409c79855ae2aaea8 bf67907e337021ebff434e02b19b30a741c144af Jianfeng <Jianfeng.Liu0413@gmail.com> 1720948339 +0200 commit: update
|
20
20
|
bf67907e337021ebff434e02b19b30a741c144af a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng <Jianfeng.Liu0413@gmail.com> 1721137352 +0200 commit: update ips
|
21
|
+
a15389729850729fc7bd78a54f26fce77f30be12 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng <Jianfeng.Liu0413@gmail.com> 1723527985 +0200 commit: update
|
@@ -135,3 +135,5 @@ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be1
|
|
135
135
|
a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721322143 +0200 remote set-head
|
136
136
|
a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721324108 +0200 remote set-head
|
137
137
|
a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721326072 +0200 remote set-head
|
138
|
+
a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@jflmbp.speedport.ip> 1723527981 +0200 remote set-head
|
139
|
+
6dc2cdf4a84e538e5d4777486aeff87e42f41799 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng Liu <macjianfeng@jflmbp.speedport.ip> 1723527990 +0200 remote set-head
|
@@ -17,3 +17,4 @@ d84688b54c0040a30976b3a6540bc47adf7ce680 32fd627b62fad7cf3b2f9e34ab9777126a0987a
|
|
17
17
|
32fd627b62fad7cf3b2f9e34ab9777126a0987ad 1c3f92adda34344bcbbbf9d409c79855ae2aaea8 Jianfeng <Jianfeng.Liu0413@gmail.com> 1720709657 +0200 update by push
|
18
18
|
1c3f92adda34344bcbbbf9d409c79855ae2aaea8 bf67907e337021ebff434e02b19b30a741c144af Jianfeng <Jianfeng.Liu0413@gmail.com> 1720948342 +0200 update by push
|
19
19
|
bf67907e337021ebff434e02b19b30a741c144af a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng <Jianfeng.Liu0413@gmail.com> 1721137354 +0200 update by push
|
20
|
+
a15389729850729fc7bd78a54f26fce77f30be12 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng <Jianfeng.Liu0413@gmail.com> 1723527989 +0200 update by push
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,5 @@
|
|
1
|
+
x�VQo�6�s~ᢐ��Ρ�^�y����ð=��pl:QkK�$7���������Ö�ؔD�#�}��;���dg���ݪ������e�0ڧ��������B�&��ժ������wqcJȣ���[we� Kՠگ�����z/��߭͋?hEw�[G)9�ھ�|S�F�-+m���/����K)4����
|
2
|
+
��=*�J`Η���iA#[ZW5TZ=!����~����hPը*�.[�
|
3
|
+
+(4Jv�}�d�:N�K2�trB�9�J��J�����Y?���|#��d*=v@�B�w�@��'���Y82��x��̄�d�lE�ݼ����"i��z�ַ��Q
|
4
|
+
���<"�������@��|±�?��.��R��m�.m�ax���l�M�QEC9��Sܐŧ"~��9E�iTe�!窷��S�':fJ�d^���?n����:f"L݂{4M��o��/^�!�2B
|
5
|
+
�?�짲m��0�{k��D��)�D��Ю���t�K��# �v�8g��WA~�m��r�ڰ��1i�E���<nd����}���Ae��W�#�Iǩ�b
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
py2ls/.git/refs/heads/main
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
6dc2cdf4a84e538e5d4777486aeff87e42f41799
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
6dc2cdf4a84e538e5d4777486aeff87e42f41799
|
py2ls/netfinder.py
CHANGED
@@ -126,10 +126,8 @@ def extract_text_from_content(
|
|
126
126
|
search_kwargs["class"] = what
|
127
127
|
if "attrs" in kwargs:
|
128
128
|
result_set = content.find_all(where, **search_kwargs)
|
129
|
-
print(f"attrs =>{search_kwargs}")
|
130
129
|
else:
|
131
130
|
result_set = content.find_all(where, attrs=dict(**search_kwargs))
|
132
|
-
print(f"{search_kwargs}")
|
133
131
|
|
134
132
|
if not result_set:
|
135
133
|
print("Failed: check the 'attrs' setting: attrs={'id':'xample'}")
|
@@ -594,7 +592,6 @@ def downloader(
|
|
594
592
|
kind[i] = "." + kind[i]
|
595
593
|
file_links_all = []
|
596
594
|
for kind_ in kind:
|
597
|
-
print(kind_)
|
598
595
|
if isinstance(contains, str):
|
599
596
|
contains = [contains]
|
600
597
|
if isinstance(url, str):
|
@@ -709,7 +706,6 @@ def find_img(url, driver="request", dir_save="images", rm_folder=False, verbose=
|
|
709
706
|
if rm_folder:
|
710
707
|
ips.rm_folder(dir_save)
|
711
708
|
content_type, content = fetch_all(url, driver=driver)
|
712
|
-
print(content_type)
|
713
709
|
if "html" in content_type.lower():
|
714
710
|
# Create the directory if it doesn't exist
|
715
711
|
os.makedirs(dir_save, exist_ok=True)
|
@@ -913,7 +909,6 @@ def fetch(
|
|
913
909
|
output="text",
|
914
910
|
**kws,
|
915
911
|
):
|
916
|
-
print(f"output is {output}")
|
917
912
|
if "xt" in output.lower():
|
918
913
|
for attempt in range(retry):
|
919
914
|
if verbose and attempt == 0:
|
@@ -973,7 +968,6 @@ def fetch(
|
|
973
968
|
try:
|
974
969
|
content_type, content = fetch_all(url, parser="html.parser", driver=driver)
|
975
970
|
search_kwargs = {**kws}
|
976
|
-
print(search_kwargs)
|
977
971
|
if "class_" in search_kwargs:
|
978
972
|
search_kwargs["class"] = search_kwargs["class_"]
|
979
973
|
del search_kwargs["class_"]
|
@@ -981,10 +975,8 @@ def fetch(
|
|
981
975
|
search_kwargs["class"] = what
|
982
976
|
if "attrs" in kws:
|
983
977
|
result_set = content.find_all(where, **search_kwargs)
|
984
|
-
print(f"attrs =>{search_kwargs}")
|
985
978
|
else:
|
986
979
|
result_set = content.find_all(where, attrs=dict(**search_kwargs))
|
987
|
-
print(f"{search_kwargs}")
|
988
980
|
return result_set
|
989
981
|
except:
|
990
982
|
print("got nothing")
|
py2ls/plot.py
CHANGED
@@ -467,9 +467,12 @@ def catplot(data, *args, **kwargs):
|
|
467
467
|
# custom_order = ['s', 'bx', 'e']
|
468
468
|
# full_order = sort_catplot_layers(custom_order)
|
469
469
|
|
470
|
+
ax = kwargs.get("ax", None)
|
470
471
|
col = kwargs.get("col", None)
|
471
472
|
if not col:
|
472
|
-
|
473
|
+
if "ax" not in locals() or ax is None:
|
474
|
+
ax = plt.gca()
|
475
|
+
|
473
476
|
kw_figsets = kwargs.get("figsets", None)
|
474
477
|
# check the data type
|
475
478
|
if isinstance(data, pd.DataFrame):
|
@@ -478,6 +481,7 @@ def catplot(data, *args, **kwargs):
|
|
478
481
|
y = kwargs.get("y", None)
|
479
482
|
hue = kwargs.get("hue", None)
|
480
483
|
data = df2array(data=data, x=x, y=y, hue=hue)
|
484
|
+
y_max_loc = np.max(data, axis=0)
|
481
485
|
xticklabels = []
|
482
486
|
if hue is not None:
|
483
487
|
# for i in df[x].unique().tolist():
|
@@ -496,8 +500,9 @@ def catplot(data, *args, **kwargs):
|
|
496
500
|
# ! stats info
|
497
501
|
stats_param = kwargs.get("stats", False)
|
498
502
|
res = pd.DataFrame() # Initialize an empty DataFrame to store results
|
503
|
+
ihue = 1
|
499
504
|
for i in df[x].unique().tolist():
|
500
|
-
print(i)
|
505
|
+
print(i) # to indicate which 'x'
|
501
506
|
if hue and stats_param:
|
502
507
|
if isinstance(stats_param, dict):
|
503
508
|
if "factor" in stats_param.keys():
|
@@ -507,15 +512,17 @@ def catplot(data, *args, **kwargs):
|
|
507
512
|
data=df[df[x] == i], dv=y, factor=hue, **stats_param
|
508
513
|
)
|
509
514
|
elif bool(stats_param):
|
510
|
-
res_tmp = FuncMultiCmpt(
|
515
|
+
res_tmp = FuncMultiCmpt(
|
516
|
+
data=df[df[x] == i], dv=y, factor=hue
|
517
|
+
)
|
511
518
|
else:
|
512
519
|
res_tmp = "did not work properly"
|
513
520
|
display_output(res_tmp)
|
514
|
-
res_tmp = [{"x": i, **res_tmp}]
|
515
521
|
res = pd.concat(
|
516
|
-
[res, pd.DataFrame([res_tmp])], ignore_index=True
|
522
|
+
[res, pd.DataFrame([res_tmp])], ignore_index=True, axis=0
|
517
523
|
)
|
518
|
-
|
524
|
+
ihue += 1
|
525
|
+
|
519
526
|
else:
|
520
527
|
# ! stats info
|
521
528
|
stats_param = kwargs.get("stats", False)
|
@@ -529,9 +536,22 @@ def catplot(data, *args, **kwargs):
|
|
529
536
|
res = None
|
530
537
|
if x and stats_param:
|
531
538
|
if isinstance(stats_param, dict):
|
532
|
-
|
539
|
+
if len(xticklabels) > 2:
|
540
|
+
res = FuncMultiCmpt(data=df, dv=y, factor=x, **stats_param)
|
541
|
+
else:
|
542
|
+
res = FuncCmpt(
|
543
|
+
x1=df.loc[df[x] == xticklabels[0], y].tolist(),
|
544
|
+
x2=df.loc[df[x] == xticklabels[1], y].tolist(),
|
545
|
+
**stats_param,
|
546
|
+
)
|
533
547
|
elif bool(stats_param):
|
534
|
-
|
548
|
+
if len(xticklabels) > 2:
|
549
|
+
res = FuncMultiCmpt(data=df, dv=y, factor=x)
|
550
|
+
else:
|
551
|
+
res = FuncCmpt(
|
552
|
+
x1=df.loc[df[x] == xticklabels[0], y].tolist(),
|
553
|
+
x2=df.loc[df[x] == xticklabels[1], y].tolist(),
|
554
|
+
)
|
535
555
|
else:
|
536
556
|
res = "did not work properly"
|
537
557
|
display_output(res)
|
@@ -556,11 +576,28 @@ def catplot(data, *args, **kwargs):
|
|
556
576
|
"xangle": xangle,
|
557
577
|
}
|
558
578
|
else:
|
559
|
-
|
579
|
+
if isinstance(data, np.ndarray):
|
580
|
+
df = array2df(data)
|
581
|
+
x = "group"
|
582
|
+
y = "value"
|
583
|
+
xticklabels = []
|
584
|
+
stats_param = kwargs.get("stats", False)
|
585
|
+
for i in df[x].unique().tolist():
|
586
|
+
xticklabels.append(i)
|
587
|
+
xticks = np.arange(1, len(xticklabels) + 1).tolist()
|
588
|
+
xticks_x_loc = np.arange(1, len(xticklabels) + 1).tolist()
|
589
|
+
legend_hue = xticklabels
|
590
|
+
default_colors = get_color(len(xticklabels))
|
560
591
|
default_x_width = 0.5
|
561
|
-
|
562
|
-
|
563
|
-
|
592
|
+
res = None
|
593
|
+
if x and stats_param:
|
594
|
+
if isinstance(stats_param, dict):
|
595
|
+
res = FuncMultiCmpt(data=df, dv=y, factor=x, **stats_param)
|
596
|
+
elif bool(stats_param):
|
597
|
+
res = FuncMultiCmpt(data=df, dv=y, factor=x)
|
598
|
+
else:
|
599
|
+
res = "did not work properly"
|
600
|
+
display_output(res)
|
564
601
|
|
565
602
|
# full_order
|
566
603
|
opt = kwargs.get("opt", {})
|
@@ -580,15 +617,13 @@ def catplot(data, *args, **kwargs):
|
|
580
617
|
opt.update(style_load)
|
581
618
|
except:
|
582
619
|
print(f"cannot find the style'{style_name}'")
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
# if len(
|
588
|
-
#
|
589
|
-
|
590
|
-
# )
|
591
|
-
# opt["c"] = np.vstack([opt["c"], additional_colors[:, :3]])
|
620
|
+
|
621
|
+
color_custom = kwargs.get("c", default_colors)
|
622
|
+
if not isinstance(color_custom, list):
|
623
|
+
color_custom = list(color_custom)
|
624
|
+
# if len(color_custom) < data.shape[1]:
|
625
|
+
# color_custom.extend(get_color(data.shape[1]-len(color_custom),cmap='tab20'))
|
626
|
+
opt.setdefault("c", color_custom)
|
592
627
|
|
593
628
|
opt.setdefault("loc", {})
|
594
629
|
opt["loc"].setdefault("go", 0)
|
@@ -597,15 +632,12 @@ def catplot(data, *args, **kwargs):
|
|
597
632
|
# export setting
|
598
633
|
opt.setdefault("style", {})
|
599
634
|
opt["style"].setdefault("export", None)
|
600
|
-
print(opt["style"])
|
601
|
-
|
602
|
-
# opt.setdefault('layer', {})
|
603
635
|
opt.setdefault("layer", ["b", "bx", "e", "v", "s", "l"])
|
604
636
|
|
605
637
|
opt.setdefault("b", {})
|
606
638
|
opt["b"].setdefault("go", 1)
|
607
639
|
opt["b"].setdefault("loc", "c")
|
608
|
-
opt["b"].setdefault("FaceColor",
|
640
|
+
opt["b"].setdefault("FaceColor", color_custom)
|
609
641
|
opt["b"].setdefault("FaceAlpha", 1)
|
610
642
|
opt["b"].setdefault("EdgeColor", "k")
|
611
643
|
opt["b"].setdefault("EdgeAlpha", 1)
|
@@ -626,7 +658,7 @@ def catplot(data, *args, **kwargs):
|
|
626
658
|
opt["e"].setdefault("LineColor", "k")
|
627
659
|
opt["e"].setdefault("LineJoin", "round")
|
628
660
|
opt["e"].setdefault("MarkerSize", "auto")
|
629
|
-
opt["e"].setdefault("FaceColor",
|
661
|
+
opt["e"].setdefault("FaceColor", color_custom)
|
630
662
|
opt["e"].setdefault("MarkerEdgeColor", "none")
|
631
663
|
opt["e"].setdefault("Visible", True)
|
632
664
|
opt["e"].setdefault("Orientation", "vertical")
|
@@ -656,7 +688,7 @@ def catplot(data, *args, **kwargs):
|
|
656
688
|
opt.setdefault("bx", {})
|
657
689
|
opt["bx"].setdefault("go", 0)
|
658
690
|
opt["bx"].setdefault("loc", "r")
|
659
|
-
opt["bx"].setdefault("FaceColor",
|
691
|
+
opt["bx"].setdefault("FaceColor", color_custom)
|
660
692
|
opt["bx"].setdefault("EdgeColor", "k")
|
661
693
|
opt["bx"].setdefault("FaceAlpha", 0.85)
|
662
694
|
opt["bx"].setdefault("EdgeAlpha", 1)
|
@@ -700,7 +732,7 @@ def catplot(data, *args, **kwargs):
|
|
700
732
|
opt["v"].setdefault("x_width", 0.3)
|
701
733
|
opt["v"].setdefault("loc", "r")
|
702
734
|
opt["v"].setdefault("EdgeColor", "none")
|
703
|
-
opt["v"].setdefault("FaceColor",
|
735
|
+
opt["v"].setdefault("FaceColor", color_custom)
|
704
736
|
opt["v"].setdefault("FaceAlpha", 0.3)
|
705
737
|
opt["v"].setdefault("BandWidth", "scott")
|
706
738
|
opt["v"].setdefault("Function", "pdf")
|
@@ -723,17 +755,18 @@ def catplot(data, *args, **kwargs):
|
|
723
755
|
xloc = opt["loc"]["xloc"]
|
724
756
|
layers = sort_catplot_layers(opt["layer"])
|
725
757
|
|
726
|
-
|
727
|
-
if
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
758
|
+
label = kwargs.get("label", "bar")
|
759
|
+
if label:
|
760
|
+
if "b" in label:
|
761
|
+
legend_which = "b"
|
762
|
+
elif "s" in label:
|
763
|
+
legend_which = "s"
|
764
|
+
elif "bx" in label:
|
765
|
+
legend_which = "bx"
|
766
|
+
elif "e" in label:
|
767
|
+
legend_which = "e"
|
768
|
+
elif "v" in label:
|
769
|
+
legend_which = "v"
|
737
770
|
else:
|
738
771
|
legend_which = None
|
739
772
|
for layer in layers:
|
@@ -770,6 +803,63 @@ def catplot(data, *args, **kwargs):
|
|
770
803
|
show_legend = kwargs.get("show_legend", True)
|
771
804
|
if show_legend:
|
772
805
|
ax.legend()
|
806
|
+
# ! add asterisks in the plot
|
807
|
+
if stats_param:
|
808
|
+
if len(xticklabels) >= 1:
|
809
|
+
if hue is None:
|
810
|
+
add_asterisks(
|
811
|
+
ax, res, xticks_x_loc, xticklabels, y_loc=np.max(data)
|
812
|
+
)
|
813
|
+
else: # hue is not None
|
814
|
+
ihue = 1
|
815
|
+
for i in df[x].unique().tolist():
|
816
|
+
if stats_param:
|
817
|
+
if isinstance(stats_param, dict):
|
818
|
+
if "factor" in stats_param.keys():
|
819
|
+
res_tmp = FuncMultiCmpt(
|
820
|
+
data=df, dv=y, **stats_param
|
821
|
+
)
|
822
|
+
else:
|
823
|
+
res_tmp = FuncMultiCmpt(
|
824
|
+
data=df[df[x] == i],
|
825
|
+
dv=y,
|
826
|
+
factor=hue,
|
827
|
+
**stats_param,
|
828
|
+
)
|
829
|
+
elif bool(stats_param):
|
830
|
+
res_tmp = FuncMultiCmpt(
|
831
|
+
data=df[df[x] == i], dv=y, factor=hue
|
832
|
+
)
|
833
|
+
else:
|
834
|
+
res_tmp = "did not work properly"
|
835
|
+
xloc_curr = hue_len * (ihue - 1)
|
836
|
+
|
837
|
+
add_asterisks(
|
838
|
+
ax,
|
839
|
+
res_tmp,
|
840
|
+
xticks[xloc_curr : xloc_curr + hue_len],
|
841
|
+
legend_hue,
|
842
|
+
y_loc=np.max(data),
|
843
|
+
)
|
844
|
+
ihue += 1
|
845
|
+
else: # 240814: still has some bugs
|
846
|
+
if isinstance(res, dict):
|
847
|
+
tab_res = pd.DataFrame(res[1], index=[0])
|
848
|
+
x1 = df.loc[df[x] == xticklabels[0], y].tolist()
|
849
|
+
x2 = df.loc[df[x] == xticklabels[1], y].tolist()
|
850
|
+
tab_res[f"{xticklabels[0]}(mean±sem)"] = [str_mean_sem(x1)]
|
851
|
+
tab_res[f"{xticklabels[1]}(mean±sem)"] = [str_mean_sem(x2)]
|
852
|
+
add_asterisks(
|
853
|
+
ax, res[1], xticks_x_loc, xticklabels, y_loc=np.max([x1, x2])
|
854
|
+
)
|
855
|
+
elif isinstance(res, pd.DataFrame):
|
856
|
+
display(res)
|
857
|
+
print("still has some bugs")
|
858
|
+
x1 = df.loc[df[x] == xticklabels[0], y].tolist()
|
859
|
+
x2 = df.loc[df[x] == xticklabels[1], y].tolist()
|
860
|
+
add_asterisks(
|
861
|
+
ax, res, xticks_x_loc, xticklabels, y_loc=np.max([x1, x2])
|
862
|
+
)
|
773
863
|
|
774
864
|
style_export = kwargs.get("style_export", None)
|
775
865
|
if style_export and (style_export != style_use):
|
@@ -806,6 +896,11 @@ def get_cmap():
|
|
806
896
|
|
807
897
|
|
808
898
|
def read_mplstyle(style_file):
|
899
|
+
"""
|
900
|
+
example usage:
|
901
|
+
style_file = "/ std-colors.mplstyle"
|
902
|
+
style_dict = read_mplstyle(style_file)
|
903
|
+
"""
|
809
904
|
# Load the style file
|
810
905
|
plt.style.use(style_file)
|
811
906
|
|
@@ -820,11 +915,6 @@ def read_mplstyle(style_file):
|
|
820
915
|
return style_dict
|
821
916
|
|
822
917
|
|
823
|
-
# #example usage:
|
824
|
-
# style_file = "/ std-colors.mplstyle"
|
825
|
-
# style_dict = read_mplstyle(style_file)
|
826
|
-
|
827
|
-
|
828
918
|
def figsets(*args, **kwargs):
|
829
919
|
"""
|
830
920
|
usage:
|
@@ -900,7 +990,6 @@ def figsets(*args, **kwargs):
|
|
900
990
|
def set_step_1(ax, key, value):
|
901
991
|
if ("fo" in key) and (("size" in key) or ("sz" in key)):
|
902
992
|
fontsize = value
|
903
|
-
print(fontsize)
|
904
993
|
plt.rcParams.update({"font.size": fontsize})
|
905
994
|
# style
|
906
995
|
if "st" in key.lower() or "th" in key.lower():
|
@@ -1146,6 +1235,10 @@ def figsets(*args, **kwargs):
|
|
1146
1235
|
if legend_kws:
|
1147
1236
|
# https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html
|
1148
1237
|
ax.legend(**legend_kws)
|
1238
|
+
else:
|
1239
|
+
legend = ax.get_legend()
|
1240
|
+
if legend is not None:
|
1241
|
+
legend.remove()
|
1149
1242
|
|
1150
1243
|
for arg in args:
|
1151
1244
|
if isinstance(arg, matplotlib.axes._axes.Axes):
|
@@ -1620,3 +1713,53 @@ def remove_colors_in_dict(
|
|
1620
1713
|
if "loc" in data:
|
1621
1714
|
del data["loc"]
|
1622
1715
|
return data
|
1716
|
+
|
1717
|
+
|
1718
|
+
def add_asterisks(ax, res, xticks_x_loc, xticklabels, **kwargs_funcstars):
|
1719
|
+
if len(xticklabels) > 2:
|
1720
|
+
if isinstance(res, dict):
|
1721
|
+
pval_groups = res["res_tab"]["p-unc"].tolist()[0]
|
1722
|
+
else:
|
1723
|
+
pval_groups = res["res_tab"]["PR(>F)"].tolist()[0]
|
1724
|
+
if pval_groups <= 0.05:
|
1725
|
+
A_list = res["res_posthoc"]["A"].tolist()
|
1726
|
+
B_list = res["res_posthoc"]["B"].tolist()
|
1727
|
+
xticklabels_array = np.array(xticklabels)
|
1728
|
+
yscal_ = 0.99
|
1729
|
+
for A, B, P in zip(
|
1730
|
+
res["res_posthoc"]["A"].tolist(),
|
1731
|
+
res["res_posthoc"]["B"].tolist(),
|
1732
|
+
res["res_posthoc"]["p-unc"].tolist(),
|
1733
|
+
):
|
1734
|
+
index_A = np.where(xticklabels_array == A)[0][0]
|
1735
|
+
index_B = np.where(xticklabels_array == B)[0][0]
|
1736
|
+
FuncStars(
|
1737
|
+
ax=ax,
|
1738
|
+
x1=xticks_x_loc[index_A],
|
1739
|
+
x2=xticks_x_loc[index_B],
|
1740
|
+
pval=P,
|
1741
|
+
yscale=yscal_,
|
1742
|
+
**kwargs_funcstars,
|
1743
|
+
)
|
1744
|
+
if P <= 0.05:
|
1745
|
+
yscal_ -= 0.075
|
1746
|
+
else:
|
1747
|
+
if isinstance(res, tuple):
|
1748
|
+
res = res[1]
|
1749
|
+
pval_groups = res["pval"]
|
1750
|
+
FuncStars(
|
1751
|
+
ax=ax,
|
1752
|
+
x1=1,
|
1753
|
+
x2=2,
|
1754
|
+
pval=pval_groups,
|
1755
|
+
**kwargs_funcstars,
|
1756
|
+
)
|
1757
|
+
else:
|
1758
|
+
pval_groups = res["pval"]
|
1759
|
+
FuncStars(
|
1760
|
+
ax=ax,
|
1761
|
+
x1=1,
|
1762
|
+
x2=2,
|
1763
|
+
pval=pval_groups,
|
1764
|
+
**kwargs_funcstars,
|
1765
|
+
)
|
py2ls/stats.py
CHANGED
@@ -12,12 +12,13 @@ warnings.filterwarnings("ignore", category=RuntimeWarning)
|
|
12
12
|
|
13
13
|
# FuncStars --v 0.1.1
|
14
14
|
def FuncStars(
|
15
|
-
ax,
|
15
|
+
ax=None,
|
16
16
|
pval=None,
|
17
17
|
ylim=None,
|
18
18
|
xlim=None,
|
19
19
|
symbol="*",
|
20
20
|
yscale=0.95,
|
21
|
+
y_loc=None,
|
21
22
|
x1=0,
|
22
23
|
x2=1,
|
23
24
|
alpha=0.05,
|
@@ -32,7 +33,7 @@ def FuncStars(
|
|
32
33
|
linewidth=0.8,
|
33
34
|
nsshow="off",
|
34
35
|
symbolcolor="k",
|
35
|
-
tailindicator=[0.
|
36
|
+
tailindicator=[0.05, 0.05],
|
36
37
|
report=None,
|
37
38
|
report_scale=-0.1,
|
38
39
|
report_loc=None,
|
@@ -48,14 +49,18 @@ def FuncStars(
|
|
48
49
|
if report_scale > 0:
|
49
50
|
report_scale = -np.abs(report_scale)
|
50
51
|
yscale = np.float64(yscale)
|
51
|
-
y_loc
|
52
|
+
if y_loc is None:
|
53
|
+
y_loc = np.min(ylim) + yscale * (np.max(ylim) - np.min(ylim))
|
54
|
+
else:
|
55
|
+
y_loc=y_loc+(1-yscale) * np.abs(np.diff(ylim))+0.1 *y_loc
|
52
56
|
xcenter = np.mean([x1, x2])
|
57
|
+
|
53
58
|
# ns / *
|
54
59
|
if alpha < pval:
|
55
60
|
if nsshow == "on":
|
56
61
|
ns_str = f"p={round(pval, 3)}" if pval < 0.9 else "ns"
|
57
62
|
color = "m" if pval < 0.1 else "k"
|
58
|
-
|
63
|
+
ax.text(
|
59
64
|
xcenter,
|
60
65
|
y_loc,
|
61
66
|
ns_str,
|
@@ -68,45 +73,43 @@ def FuncStars(
|
|
68
73
|
# bbox=dict(facecolor=None, edgecolor=None, color=None, linewidth=None)
|
69
74
|
)
|
70
75
|
elif 0.01 < pval <= alpha:
|
71
|
-
|
76
|
+
ax.text(
|
72
77
|
xcenter,
|
73
78
|
y_loc,
|
74
79
|
symbol,
|
75
80
|
ha="center",
|
76
|
-
va="center_baseline",
|
81
|
+
va="top",#"center_baseline",
|
77
82
|
fontsize=fontsize,
|
78
83
|
fontname=fontname,
|
79
84
|
color=symbolcolor,
|
80
85
|
)
|
81
86
|
elif 0.001 < pval <= 0.01:
|
82
|
-
|
87
|
+
ax.text(
|
83
88
|
xcenter,
|
84
89
|
y_loc,
|
85
90
|
symbol * 2,
|
86
91
|
ha="center",
|
87
|
-
va="center_baseline",
|
92
|
+
va="top",#"center_baseline",
|
88
93
|
fontsize=fontsize,
|
89
94
|
fontname=fontname,
|
90
95
|
color=symbolcolor,
|
91
96
|
)
|
92
97
|
elif 0 < pval <= 0.001:
|
93
|
-
|
98
|
+
ax.text(
|
94
99
|
xcenter,
|
95
100
|
y_loc,
|
96
101
|
symbol * 3,
|
97
102
|
ha="center",
|
98
|
-
va="center_baseline",
|
103
|
+
va="top",#"center_baseline",
|
99
104
|
fontsize=fontsize,
|
100
105
|
fontname=fontname,
|
101
106
|
color=symbolcolor,
|
102
107
|
)
|
103
108
|
# lines indicators
|
104
|
-
if linego
|
105
|
-
print(pval)
|
106
|
-
print(linego)
|
109
|
+
if linego and 0 < pval <= 0.05:
|
107
110
|
# horizontal line
|
108
|
-
if yscale
|
109
|
-
|
111
|
+
if yscale <= 0.99:
|
112
|
+
ax.plot(
|
110
113
|
[x1 + np.abs(np.diff(xlim)) * 0.01, x2 - np.abs(np.diff(xlim)) * 0.01],
|
111
114
|
[
|
112
115
|
y_loc - np.abs(np.diff(ylim)) * 0.03,
|
@@ -117,7 +120,7 @@ def FuncStars(
|
|
117
120
|
linewidth=linewidth,
|
118
121
|
)
|
119
122
|
# vertical line
|
120
|
-
|
123
|
+
ax.plot(
|
121
124
|
[x1 + np.abs(np.diff(xlim)) * 0.01, x1 + np.abs(np.diff(xlim)) * 0.01],
|
122
125
|
[
|
123
126
|
y_loc - np.abs(np.diff(ylim)) * tailindicator[0],
|
@@ -127,7 +130,7 @@ def FuncStars(
|
|
127
130
|
color=linecolor,
|
128
131
|
linewidth=linewidth,
|
129
132
|
)
|
130
|
-
|
133
|
+
ax.plot(
|
131
134
|
[x2 - np.abs(np.diff(xlim)) * 0.01, x2 - np.abs(np.diff(xlim)) * 0.01],
|
132
135
|
[
|
133
136
|
y_loc - np.abs(np.diff(ylim)) * tailindicator[1],
|
@@ -138,7 +141,7 @@ def FuncStars(
|
|
138
141
|
linewidth=linewidth,
|
139
142
|
)
|
140
143
|
else:
|
141
|
-
|
144
|
+
ax.plot(
|
142
145
|
[x1 + np.abs(np.diff(xlim)) * 0.01, x2 - np.abs(np.diff(xlim)) * 0.01],
|
143
146
|
[
|
144
147
|
np.min(ylim)
|
@@ -153,7 +156,7 @@ def FuncStars(
|
|
153
156
|
linewidth=linewidth,
|
154
157
|
)
|
155
158
|
# vertical line
|
156
|
-
|
159
|
+
ax.plot(
|
157
160
|
[x1 + np.abs(np.diff(xlim)) * 0.01, x1 + np.abs(np.diff(xlim)) * 0.01],
|
158
161
|
[
|
159
162
|
np.min(ylim)
|
@@ -167,7 +170,7 @@ def FuncStars(
|
|
167
170
|
color=linecolor,
|
168
171
|
linewidth=linewidth,
|
169
172
|
)
|
170
|
-
|
173
|
+
ax.plot(
|
171
174
|
[x2 - np.abs(np.diff(xlim)) * 0.01, x2 - np.abs(np.diff(xlim)) * 0.01],
|
172
175
|
[
|
173
176
|
np.min(ylim)
|
@@ -182,7 +185,7 @@ def FuncStars(
|
|
182
185
|
linewidth=linewidth,
|
183
186
|
)
|
184
187
|
if values_below is not None:
|
185
|
-
|
188
|
+
ax.text(
|
186
189
|
xcenter,
|
187
190
|
y_loc * (-0.1),
|
188
191
|
values_below,
|
@@ -194,7 +197,7 @@ def FuncStars(
|
|
194
197
|
)
|
195
198
|
# report / comments
|
196
199
|
if report is not None:
|
197
|
-
|
200
|
+
ax.text(
|
198
201
|
xcenter,
|
199
202
|
report_loc,
|
200
203
|
report,
|
@@ -211,45 +214,45 @@ def FuncCmpt(x1, x2, pmc="auto", pair="unpaired", verbose=True):
|
|
211
214
|
|
212
215
|
# pmc correction: 'parametric'/'non-parametric'/'auto'
|
213
216
|
# meawhile get the opposite setting (to compare the results)
|
214
|
-
def corr_pmc(pmc):
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
def corr_pair(pair):
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
def check_normality(data, verbose=True):
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
217
|
+
# def corr_pmc(pmc):
|
218
|
+
# cfg_pmc = None
|
219
|
+
# if pmc.lower() in {"pmc", "parametric"} and pmc.lower() not in {
|
220
|
+
# "npmc",
|
221
|
+
# "nonparametric",
|
222
|
+
# "non-parametric",
|
223
|
+
# }:
|
224
|
+
# cfg_pmc = "parametric"
|
225
|
+
# elif pmc.lower() in {
|
226
|
+
# "npmc",
|
227
|
+
# "nonparametric",
|
228
|
+
# "non-parametric",
|
229
|
+
# } and pmc.lower() not in {"pmc", "parametric"}:
|
230
|
+
# cfg_pmc = "non-parametric"
|
231
|
+
# else:
|
232
|
+
# cfg_pmc = "auto"
|
233
|
+
# return cfg_pmc
|
234
|
+
|
235
|
+
# def corr_pair(pair):
|
236
|
+
# cfg_pair = None
|
237
|
+
# if "pa" in pair.lower() and "np" not in pair.lower():
|
238
|
+
# cfg_pair = "paired"
|
239
|
+
# elif "np" in pair.lower():
|
240
|
+
# cfg_pair = "unpaired"
|
241
|
+
# return cfg_pair
|
242
|
+
|
243
|
+
# def check_normality(data, verbose=True):
|
244
|
+
# stat_shapiro, pval_shapiro = stats.shapiro(data)
|
245
|
+
# if pval_shapiro > 0.05:
|
246
|
+
# Normality = True
|
247
|
+
# else:
|
248
|
+
# Normality = False
|
249
|
+
# if verbose:
|
250
|
+
# (
|
251
|
+
# print(f"\n normally distributed\n")
|
252
|
+
# if Normality
|
253
|
+
# else print(f"\n NOT normally distributed\n")
|
254
|
+
# )
|
255
|
+
# return Normality
|
253
256
|
|
254
257
|
def sub_cmpt_2group(x1, x2, cfg_pmc="pmc", pair="unpaired", verbose=True):
|
255
258
|
output = {}
|
@@ -261,7 +264,7 @@ def FuncCmpt(x1, x2, pmc="auto", pair="unpaired", verbose=True):
|
|
261
264
|
x1, x2, center="median", proportiontocut=0.05
|
262
265
|
)
|
263
266
|
VarType = True if pval_lev > 0.05 and nX1 == nX2 else False
|
264
|
-
|
267
|
+
# print(pair)
|
265
268
|
if "np" in pair: # 'unpaired'
|
266
269
|
if VarType and Normality:
|
267
270
|
# The independent t-test requires that the dependent variable is approximately normally
|
@@ -278,7 +281,7 @@ def FuncCmpt(x1, x2, pmc="auto", pair="unpaired", verbose=True):
|
|
278
281
|
)
|
279
282
|
notes_stat = "unpaired t test"
|
280
283
|
notes_APA = (
|
281
|
-
f"t({nX1+nX2-2})={round(stat_value,
|
284
|
+
f"t({nX1+nX2-2})={round(stat_value,3)},p={round(pval,3)}"
|
282
285
|
)
|
283
286
|
else:
|
284
287
|
# If the Levene's Test for Equality of Variances is statistically significant,
|
@@ -297,7 +300,7 @@ def FuncCmpt(x1, x2, pmc="auto", pair="unpaired", verbose=True):
|
|
297
300
|
notes_stat = "Welchs t-test"
|
298
301
|
# note: APA FORMAT
|
299
302
|
notes_APA = (
|
300
|
-
f"t({nX1+nX2-2})={round(stat_value,
|
303
|
+
f"t({nX1+nX2-2})={round(stat_value,3)},p={round(pval,3)}"
|
301
304
|
)
|
302
305
|
elif "pa" in pair and "np" not in pair: # 'paired'
|
303
306
|
# the paired-samples t-test is considered “robust” in handling violations of normality
|
@@ -309,7 +312,7 @@ def FuncCmpt(x1, x2, pmc="auto", pair="unpaired", verbose=True):
|
|
309
312
|
notes_stat = "paired t test"
|
310
313
|
# note: APA FORMAT
|
311
314
|
notes_APA = (
|
312
|
-
f"t({sum([nX1-1])})={round(stat_value,
|
315
|
+
f"t({sum([nX1-1])})={round(stat_value,3)},p={round(pval,3)}"
|
313
316
|
)
|
314
317
|
elif cfg_pmc == "non-parametric":
|
315
318
|
if "np" in pair: # Perform Mann-Whitney
|
@@ -318,18 +321,18 @@ def FuncCmpt(x1, x2, pmc="auto", pair="unpaired", verbose=True):
|
|
318
321
|
)
|
319
322
|
notes_stat = "Mann-Whitney U"
|
320
323
|
if nX1 == nX2:
|
321
|
-
notes_APA = f"U(n={nX1})={round(stat_value,
|
324
|
+
notes_APA = f"U(n={nX1})={round(stat_value,3)},p={round(pval,3)}"
|
322
325
|
else:
|
323
|
-
notes_APA = f"U(n1={nX1},n2={nX2})={round(stat_value,
|
326
|
+
notes_APA = f"U(n1={nX1},n2={nX2})={round(stat_value,3)},p={round(pval,3)}"
|
324
327
|
elif "pa" in pair and "np" not in pair: # Wilcoxon signed-rank test
|
325
328
|
stat_value, pval = stats.wilcoxon(
|
326
329
|
x1, x2, method="exact", nan_policy="omit"
|
327
330
|
)
|
328
331
|
notes_stat = "Wilcoxon signed-rank"
|
329
332
|
if nX1 == nX2:
|
330
|
-
notes_APA = f"Z(n={nX1})={round(stat_value,
|
333
|
+
notes_APA = f"Z(n={nX1})={round(stat_value,3)},p={round(pval,3)}"
|
331
334
|
else:
|
332
|
-
notes_APA = f"Z(n1={nX1},n2={nX2})={round(stat_value,
|
335
|
+
notes_APA = f"Z(n1={nX1},n2={nX2})={round(stat_value,3)},p={round(pval,3)}"
|
333
336
|
|
334
337
|
# filling output
|
335
338
|
output["stat"] = stat_value
|
@@ -383,7 +386,7 @@ def FuncCmpt(x1, x2, pmc="auto", pair="unpaired", verbose=True):
|
|
383
386
|
# =============================================================================
|
384
387
|
|
385
388
|
|
386
|
-
def str_mean_sem(data: list, delimit=
|
389
|
+
def str_mean_sem(data: list, delimit=3):
|
387
390
|
mean_ = np.nanmean(data)
|
388
391
|
sem_ = np.nanstd(data, ddof=1) / np.sqrt(sum(~np.isnan(data)))
|
389
392
|
return str(round(mean_, delimit)) + "±" + str(round(sem_, delimit))
|
@@ -404,6 +407,7 @@ def FuncMultiCmpt(
|
|
404
407
|
subject=None,
|
405
408
|
group=None,
|
406
409
|
verbose=True,
|
410
|
+
post_hoc=False
|
407
411
|
):
|
408
412
|
if group is None:
|
409
413
|
group = factor
|
@@ -515,12 +519,12 @@ def FuncMultiCmpt(
|
|
515
519
|
if "np" in cfg_pair: # 'unpaired'
|
516
520
|
res_tab = run_kruskal(data, dv, factor)
|
517
521
|
notes_stat = f"Non-parametric Kruskal: {data[factor].nunique()} Way ANOVA"
|
518
|
-
notes_APA = f'H({res_tab.ddof1[0]},n={data.shape[0]})={round(res_tab.H[0],
|
522
|
+
notes_APA = f'H({res_tab.ddof1[0]},n={data.shape[0]})={round(res_tab.H[0],3)},p={round(res_tab["p-unc"][0],3)}'
|
519
523
|
|
520
524
|
elif "pa" in cfg_pair and "np" not in cfg_pair: # 'paired'
|
521
525
|
res_tab = run_friedman(data, dv, factor, subject, method="chisq")
|
522
526
|
notes_stat = f"Non-parametric {data[factor].nunique()} Way Friedman repeated measures ANOVA"
|
523
|
-
notes_APA = f'X^2({res_tab.ddof1[0]})={round(res_tab.Q[0],
|
527
|
+
notes_APA = f'X^2({res_tab.ddof1[0]})={round(res_tab.Q[0],3)},p={round(res_tab["p-unc"][0],3)}'
|
524
528
|
|
525
529
|
# =============================================================================
|
526
530
|
# # Post-hoc
|
@@ -535,7 +539,10 @@ def FuncMultiCmpt(
|
|
535
539
|
go_mix_between = None if ("pa" in cfg_pair) or ("np" not in cfg_pair) else factor
|
536
540
|
go_mix_within = within if ("mix" in cfg_pair) or ("both" in cfg_pair) else None
|
537
541
|
go_mix_within = factor if ("pa" in cfg_pair) or ("np" not in cfg_pair) else None
|
542
|
+
|
538
543
|
if res_tab["p-unc"][0] <= 0.05:
|
544
|
+
post_hoc=True
|
545
|
+
if post_hoc:
|
539
546
|
# Pairwise Comparisons
|
540
547
|
method_post_hoc = [
|
541
548
|
"bonf", # 'bonferroni', # : one-step correction
|
@@ -602,7 +609,10 @@ def FuncMultiCmpt(
|
|
602
609
|
# # filling output
|
603
610
|
# =============================================================================
|
604
611
|
|
605
|
-
pd.set_option(
|
612
|
+
pd.set_option('display.max_columns', None) # Show all columns
|
613
|
+
pd.set_option('display.max_colwidth', None) # No limit on column width
|
614
|
+
pd.set_option('display.expand_frame_repr', False) # Prevent line-wrapping
|
615
|
+
|
606
616
|
output["stat"] = notes_stat
|
607
617
|
# print(output['APA'])
|
608
618
|
output["APA"] = notes_APA
|
@@ -616,21 +626,21 @@ def FuncMultiCmpt(
|
|
616
626
|
def display_output(output: dict):
|
617
627
|
if isinstance(output, pd.DataFrame):
|
618
628
|
output = output.to_dict(orient="list")
|
619
|
-
# ['res_posthoc', 'stat', 'APA', 'pval', 'res_tab']
|
620
|
-
|
621
|
-
#
|
629
|
+
# ['res_posthoc', 'stat', 'APA', 'pval', 'res_tab']
|
630
|
+
|
631
|
+
# ? show APA
|
632
|
+
# print(f"\n\ndisplay stat_output")
|
633
|
+
# try:
|
634
|
+
# print(f"APA: {output["APA"]}")
|
635
|
+
# except:
|
636
|
+
# pass
|
622
637
|
try:
|
623
|
-
print("
|
624
|
-
display(output["APA"])
|
625
|
-
except:
|
626
|
-
pass
|
627
|
-
try:
|
628
|
-
print("results table:")
|
638
|
+
print("stats table: ⤵")
|
629
639
|
display(output["res_tab"])
|
630
640
|
except:
|
631
641
|
pass
|
632
642
|
try:
|
633
|
-
print("
|
643
|
+
print(f"APA ⤵\n{output["APA"][0]} ⤵\npost-hoc analysis ⤵")
|
634
644
|
display(output["res_posthoc"])
|
635
645
|
except:
|
636
646
|
pass
|
@@ -647,17 +657,18 @@ def corr_pair(pair):
|
|
647
657
|
return cfg_pair
|
648
658
|
|
649
659
|
|
650
|
-
def check_normality(data):
|
660
|
+
def check_normality(data, verbose=True):
|
651
661
|
stat_shapiro, pval_shapiro = stats.shapiro(data)
|
652
662
|
if pval_shapiro > 0.05:
|
653
663
|
Normality = True
|
654
664
|
else:
|
655
665
|
Normality = False
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
666
|
+
if verbose:
|
667
|
+
(
|
668
|
+
print(f"\n normally distributed\n")
|
669
|
+
if Normality
|
670
|
+
else print(f"\n NOT normally distributed\n")
|
671
|
+
)
|
661
672
|
return Normality
|
662
673
|
|
663
674
|
|
@@ -691,17 +702,17 @@ def extract_apa(res_tab):
|
|
691
702
|
notes_APA = []
|
692
703
|
if "ddof1" in res_tab:
|
693
704
|
for irow in range(res_tab.shape[0]):
|
694
|
-
note_tmp = f'{res_tab.Source[irow]}:F{round(res_tab.ddof1[irow]),round(res_tab.ddof2[irow])}={round(res_tab.F[irow],
|
695
|
-
notes_APA.append(
|
705
|
+
note_tmp = f'{res_tab.Source[irow]}:F{round(res_tab.ddof1[irow]),round(res_tab.ddof2[irow])}={round(res_tab.F[irow],3)},p={round(res_tab["p-unc"][irow],3)}'
|
706
|
+
notes_APA.append(note_tmp)
|
696
707
|
elif "DF" in res_tab:
|
697
708
|
for irow in range(res_tab.shape[0] - 1):
|
698
|
-
note_tmp = f'{res_tab.Source[irow]}:F{round(res_tab.DF[irow]),round(res_tab.DF[res_tab.shape[0]-1])}={round(res_tab.F[irow],
|
699
|
-
notes_APA.append(
|
700
|
-
notes_APA.append(
|
709
|
+
note_tmp = f'{res_tab.Source[irow]}:F{round(res_tab.DF[irow]),round(res_tab.DF[res_tab.shape[0]-1])}={round(res_tab.F[irow],3)},p={round(res_tab["p-unc"][irow],3)}'
|
710
|
+
notes_APA.append(note_tmp)
|
711
|
+
notes_APA.append(np.nan)
|
701
712
|
elif "DF1" in res_tab: # in 'mix' case
|
702
713
|
for irow in range(res_tab.shape[0]):
|
703
|
-
note_tmp = f'{res_tab.Source[irow]}:F{round(res_tab.DF1[irow]),round(res_tab.DF2[irow])}={round(res_tab.F[irow],
|
704
|
-
notes_APA.append(
|
714
|
+
note_tmp = f'{res_tab.Source[irow]}:F{round(res_tab.DF1[irow]),round(res_tab.DF2[irow])}={round(res_tab.F[irow],3)},p={round(res_tab["p-unc"][irow],3)}'
|
715
|
+
notes_APA.append(note_tmp)
|
705
716
|
return notes_APA
|
706
717
|
|
707
718
|
|
@@ -1130,7 +1141,17 @@ def df2array(data: pd.DataFrame, x, y, hue=None, sort=False):
|
|
1130
1141
|
a = padcat(a, new_, axis=0)
|
1131
1142
|
return sort_rows_move_nan(a).T
|
1132
1143
|
|
1133
|
-
|
1144
|
+
def array2df(data: np.ndarray):
|
1145
|
+
df = pd.DataFrame()
|
1146
|
+
df["group"] = (
|
1147
|
+
np.tile(
|
1148
|
+
["group" + str(i) for i in range(1, data.shape[1] + 1)], [data.shape[0], 1]
|
1149
|
+
)
|
1150
|
+
.reshape(-1, 1, order="F")[:, 0]
|
1151
|
+
.tolist()
|
1152
|
+
)
|
1153
|
+
df["value"] = data.reshape(-1, 1, order="F")
|
1154
|
+
return df
|
1134
1155
|
def padcat(*args, fill_value=np.nan, axis=1, order="row"):
|
1135
1156
|
"""
|
1136
1157
|
Concatenate vectors with padding.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
py2ls/.DS_Store,sha256=l7m93mLt2ckidOORlgzbfdGcDJ5emCexs-GHEiKbEaQ,6148
|
2
|
-
py2ls/.git/COMMIT_EDITMSG,sha256=
|
3
|
-
py2ls/.git/FETCH_HEAD,sha256=
|
2
|
+
py2ls/.git/COMMIT_EDITMSG,sha256=5xj-jWMbrdOc9m7gSn-UcsAQ9FMNvWSbLWSsrOUIO5w,7
|
3
|
+
py2ls/.git/FETCH_HEAD,sha256=6cJaQzb6VhkvNNm-KsABX6R28FNKZB8qMmqacDEP_dQ,100
|
4
4
|
py2ls/.git/HEAD,sha256=KNJb-Cr0wOK3L1CVmyvrhZ4-YLljCl6MYD2tTdsrboA,21
|
5
5
|
py2ls/.git/config,sha256=CL7WR7jU8VRchJwRooCBkXUMvuRoPdf3FWIBAOlap1c,378
|
6
6
|
py2ls/.git/description,sha256=ZzMxc0Ca26m45Twn1DDnOHqin5VHEZ9uOTBrScIXSjE,16
|
@@ -17,25 +17,29 @@ py2ls/.git/hooks/pre-receive.sample,sha256=pMPSuce7P9jRRBwxvU7nGlldZrRPz0ndsxAlI
|
|
17
17
|
py2ls/.git/hooks/prepare-commit-msg.sample,sha256=6d3KpBif3dJe2X_Ix4nsp7bKFjkLI5KuMnbwyOGqRhk,1492
|
18
18
|
py2ls/.git/hooks/push-to-checkout.sample,sha256=pT0HQXmLKHxt16-mSu5HPzBeZdP0lGO7nXQI7DsSv18,2783
|
19
19
|
py2ls/.git/hooks/update.sample,sha256=jV8vqD4QPPCLV-qmdSHfkZT0XL28s32lKtWGCXoU0QY,3650
|
20
|
-
py2ls/.git/index,sha256=
|
20
|
+
py2ls/.git/index,sha256=B5IywwCaOb2OVM4Y6a-PbFrE0dw5kWJNBmS_pt5rX64,2663
|
21
21
|
py2ls/.git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
|
22
|
-
py2ls/.git/logs/HEAD,sha256=
|
23
|
-
py2ls/.git/logs/refs/heads/main,sha256=
|
24
|
-
py2ls/.git/logs/refs/remotes/origin/HEAD,sha256=
|
25
|
-
py2ls/.git/logs/refs/remotes/origin/main,sha256=
|
22
|
+
py2ls/.git/logs/HEAD,sha256=PxF4A3pZNQ0cmb9tDaWdAqUEQAjdzttQQPRzs_rZ2_Q,3379
|
23
|
+
py2ls/.git/logs/refs/heads/main,sha256=PxF4A3pZNQ0cmb9tDaWdAqUEQAjdzttQQPRzs_rZ2_Q,3379
|
24
|
+
py2ls/.git/logs/refs/remotes/origin/HEAD,sha256=VZ_d8iu4auJbbS2EiAF5JWG39Zwp02nsOZ9vTBrHyOw,23362
|
25
|
+
py2ls/.git/logs/refs/remotes/origin/main,sha256=X52i-ullLIOoYAPiBN7ngbschyk88soEX4fCNjw2fGk,3040
|
26
26
|
py2ls/.git/objects/01/d5bd8065e6860c0bd23ff9fa57161806a099e1,sha256=hEQ8nqJnGsfFsuV5wc4cZas58rehXvT0v5ANx1zmMAY,584
|
27
27
|
py2ls/.git/objects/09/08da26de58c114225ad81f484b80bf5d351b34,sha256=NOyYvrJxATpK3aDdP1_stwkqOQRDwJn7DSy6isyKImE,925
|
28
28
|
py2ls/.git/objects/0b/409e1bc918277010f5679b402d1d1dda53e15c,sha256=y5S1XaGxJz1NXi-SPWjPC_NKIqqSbZv9oOg74MzBihY,156
|
29
|
+
py2ls/.git/objects/12/c2808a1b3a4d0892a4154dfba1e2ae3770fa73,sha256=KCfdXBjfmuZQ992RB3GeaVtOeqfj-UnlTqHXywPgVP8,786
|
29
30
|
py2ls/.git/objects/14/449a0e6ba4ea2f1a73acf63ef91c9c6193f9ed,sha256=PomZFmCUCQM1ii0wH-OJGSHLQCTqRtIwE5w3C0TtzSY,171
|
30
31
|
py2ls/.git/objects/15/a8e468aacfcb440e090020f36d0b985d45da23,sha256=xiRunMcN5I_B2hHgBUFupR-F0b8H_CQTmmAZG9XkZik,3215
|
31
32
|
py2ls/.git/objects/1a/b4585881a6a42889f01aa0cfe25fd5acfaf46f,sha256=iQsKMPNKUs4WQwhiLgXmG5V3xKyIgxmc13ZwbBATvhQ,165
|
32
33
|
py2ls/.git/objects/1c/3f92adda34344bcbbbf9d409c79855ae2aaea8,sha256=DkqkGgVpp0Zdj20Cfr_ptCecgY-inluZoOabSa7S1Is,170
|
34
|
+
py2ls/.git/objects/1c/9314c5f69b9390068a2a8616875d974849d71f,sha256=DD_vukOgPoVEIxtm13zC8HHqd2kfF6w4yiDRt-5TLBk,15678
|
33
35
|
py2ls/.git/objects/1d/fe9d9633b24ea560354f4f93d39c6e5f163ea0,sha256=mV_84wLqIitnSYmzfrNpTzwVP9AmksiRI0Fjltwl0Pg,8872
|
34
36
|
py2ls/.git/objects/20/72c28e83f4347959d29f7b3a6c1fc3e4ee6b59,sha256=85riTUsfNmOwOoolBNgC0HegJ6LajYl5vFDl_l3W19Y,9947
|
35
37
|
py2ls/.git/objects/24/6b368b986f758630c46dc02b7fa512b53422f7,sha256=sw7ERFCFu7m6fnURAqQfQ4GWShaARr-Vc6GRnlOPkxU,8512
|
36
38
|
py2ls/.git/objects/25/b796accd261b9135fd32a2c00785f68edf6c46,sha256=4ic5vOwEdfbGL8oARSVEeAnSoDs14-gggGZEL-61nYE,564
|
39
|
+
py2ls/.git/objects/2a/ae95d517d213b660bf4f65a4e0cfae7bb893eb,sha256=V0MJF1QXVSLDntEWS1n3_lErS_faBLwlP67fXv_Bysk,776
|
37
40
|
py2ls/.git/objects/30/a2f8da47ee947811dc8d993f5a06a45de374f4,sha256=u5W33_qNtTs1-U8Fardx-zB_udqKvuCm5kiw1mQGdsU,3218
|
38
41
|
py2ls/.git/objects/32/fd627b62fad7cf3b2f9e34ab9777126a0987ad,sha256=_QlClFT2799H_igDlGPr6Uz3SqoPN5v-hehesdIj18U,164
|
42
|
+
py2ls/.git/objects/34/9e31b6a3634cea102ce5588b98c11cc1738605,sha256=drNtu4yQrw0rWqk6SmHnsW0ZA3Jtvut8WG9S15gyTwk,1219
|
39
43
|
py2ls/.git/objects/36/b4a1b7403abc6c360f8fe2cb656ab945254971,sha256=X18sHo17gQTxusNptoILoWxSfU0ulrsZvbETlBtV5aY,2327
|
40
44
|
py2ls/.git/objects/36/e56a361f526eafa59c5235a5c990bf288b5f9c,sha256=7L1L-iqVvuufrlfEE2myD0-QnAPueFMySKetu08W-Pc,34216
|
41
45
|
py2ls/.git/objects/36/ef43e50009e59db11812c258846d9e38718173,sha256=0nwCwQSuQAdGyD2NfEK-_L12ydE9nGVKBXOfFq_Lndc,169
|
@@ -45,13 +49,16 @@ py2ls/.git/objects/3c/bbe5f4173d165127b9ad96119f1ec24c306ffc,sha256=S1BXemROYtzR
|
|
45
49
|
py2ls/.git/objects/3f/d6561300938afbb3d11976cf9c8f29549280d9,sha256=91oqbTWfUE1d_hT_1ptYmRUb5pOQ1X4oxQxpF6NXjKU,8501
|
46
50
|
py2ls/.git/objects/41/dcf4b3bf0460946b2da93776cf9e836d62178f,sha256=jdsIHuNTgeely4JL072ktLgpDHB-97GDL7unti8TLrw,93
|
47
51
|
py2ls/.git/objects/43/dbd49b2ee367c5434dd545e3b5795434f2ef0b,sha256=DAzt0dWp2KsuuImCKp7N9ia7KaCDNqwB-tYIx3Wf_c0,565
|
52
|
+
py2ls/.git/objects/45/b1b6178bacbfc997811a998b5cc60c1ea7fac8,sha256=7Oea5ZA0nNs6-jQV0yCSr4ZSCcm7m_z3UYVLNmDBj2w,167
|
48
53
|
py2ls/.git/objects/48/a88fc5806305d0bb0755ee6801161b79696972,sha256=f3JStE39k_hPGE-WRwqZtDTjQkfOmBVb_6-ELBbScjI,203
|
49
54
|
py2ls/.git/objects/4f/7afb40dff2153d857fc85748c2eecb85125042,sha256=QnSXlNWzKLoMzDHNAiwe06vqJEQj9xu0q-9PvCUbtbM,39680
|
50
55
|
py2ls/.git/objects/50/08ddfcf53c02e82d7eee2e57c38e5672ef89f6,sha256=p0M2WLqiTe6X2FI_k5Aj0IEsE85jqLa58sVdmV8x1vU,255
|
51
56
|
py2ls/.git/objects/53/e0deb1cb4c2c606bced6e7f9a66b0fda60980d,sha256=muq6m7_XRSFPzypW-m9mhpKfsomCr4s7GfkgM3gh2pc,482344
|
52
57
|
py2ls/.git/objects/56/e4e8b2d5545e0256090f45aa8fc42c5fe067d0,sha256=VsjKo1biAzCV-iIfwCDTPzyfP63K43hdZqJpDP70Iik,529
|
58
|
+
py2ls/.git/objects/57/63d0c52f5c9c69e89d514a1f96034947abe21a,sha256=paeSWaNvwGxgiAgIVnaubJ-HfOcdF02Z16CXV5JAra0,765
|
53
59
|
py2ls/.git/objects/57/bd1c0199483ab316235b094543b85edec6c35e,sha256=Kj4KKk20OkXuVwBUvNU0Pfd65tWhzpPly2eKy9fMqLs,6656
|
54
60
|
py2ls/.git/objects/58/20a729045d4dc7e37ccaf8aa8eec126850afe2,sha256=3Pf6NS8OTK4EdHZGVeJ421BtK7w4WJncQDBauZI_wW4,34
|
61
|
+
py2ls/.git/objects/59/380c4c26bdcd4d9b71ae3e2e35f05b3f26c5ab,sha256=rRWGHESg9_bbuU2TSBZQdnNG857XWmNeQRi3NM5w3MI,207
|
55
62
|
py2ls/.git/objects/5a/192565abf89c9d765af846ce6d53a92b1ce7ad,sha256=dQIPEX4XIxu728xyhDpZLTbx8Jb060sefP2MbdjaF38,2039
|
56
63
|
py2ls/.git/objects/60/f273eb1c412d916fa3f11318a7da7a9911b52a,sha256=aJD9iF_LmYSrqDepXFBZKN1yMYbQczVkN_wnrDosBdI,5620
|
57
64
|
py2ls/.git/objects/61/570cec8c061abe74121f27f5face6c69b98f99,sha256=IQZi5MkbRu3ToRUPsRcXuh1Xa3pkAz_HDRCVhNL89ds,5753
|
@@ -60,13 +67,18 @@ py2ls/.git/objects/62/7c81b23b4e56e87b042b650b0103653cc9e34a,sha256=pv9wgBxnvJUF
|
|
60
67
|
py2ls/.git/objects/62/d90ccf8cbefdc2e4fd475e7c6f4f76e9fdf801,sha256=1L473QanNpnumCkE8tG6wtbvLqFtNeoagL9SJmasXNY,155
|
61
68
|
py2ls/.git/objects/63/100154b27846e8010e55b6bf4b3d7762c14c5f,sha256=PvZvwq6vF9B86JlC0w307d9jtFgzBSKYVT2CL3WyO6I,673
|
62
69
|
py2ls/.git/objects/64/27a4edff08f93d98f511418423f09f2ab90bcd,sha256=RyNngwk9fvdvvvywmNfllnim718fWNjVauH9U2y8Q2s,258
|
70
|
+
py2ls/.git/objects/66/6227eeeba24073e63811e89f1449f3d958f183,sha256=2572ZYxgtgCTb0-YSgg4uGdJK1FtRcrw_IMGkc2XIF0,16300
|
71
|
+
py2ls/.git/objects/66/c998778721d424bd0aae80602dabbffa93af2e,sha256=EBxxQDGdWJ_-SoTfES1Vsri0o5ocxpa2NhXtfltJ69A,776
|
63
72
|
py2ls/.git/objects/68/6df3072c8b025fb18106ed2df505994ad062a9,sha256=H8lEzgzSfk-ojjgXYAgIkLlSguSo-vnQHO9y4pb8Kzc,28575
|
64
73
|
py2ls/.git/objects/69/13c452ca319f7cbf6a0836dc10a5bb033c84e4,sha256=NYLQQZTfd0htZst42ALS2dmryv1q_l1N19ZfHEbz_38,3193
|
65
74
|
py2ls/.git/objects/6a/52e747a2b349b128d1490d9e896d2323818eb7,sha256=Qc_B3_xxlWmjooFu274r82b583uf_HpIpDBldr9fqVI,34966
|
66
75
|
py2ls/.git/objects/6b/7fde264d93a7a0986d394c46c7650d0ce2ab92,sha256=iIl0-RF0wd6BSEjzczgUyApxc899PbdTl04JbDn6_-Q,166
|
67
76
|
py2ls/.git/objects/6c/cebb29b7f3f5b0c889f6dadbf9ff066554587d,sha256=UylkFWAfhStNVQRQuC9CzpaWaT9uHCVs1mn7ecOma8I,609
|
77
|
+
py2ls/.git/objects/6d/c2cdf4a84e538e5d4777486aeff87e42f41799,sha256=42KVrSIdWJa1wDByhA3dZsTRsAO_u34yOR-C0hV9YUo,158
|
68
78
|
py2ls/.git/objects/6d/ee29dbdcc84edeeacede105110446f3ccac963,sha256=-4Bi-tw0O-EbKxwJfMk_zHznNy0jvOK9G8hrXzz8AdA,9538
|
69
79
|
py2ls/.git/objects/71/36b2074a2754be8b58127d82250e5b37e3c373,sha256=cbVFQaBx0Q5QkZ1wQle-iIxNx14JxGSx3G8aQ7EbbAA,586
|
80
|
+
py2ls/.git/objects/72/245a05b0966011cb381e6b32b0465000e969ab,sha256=Jph97UOQ6ZXwAEIZHkd037rPpoj_hbs74kMIj1nmIVc,14013
|
81
|
+
py2ls/.git/objects/72/e4179337639859678ddaecf38b16f33aaec8e1,sha256=bdgg9rmPgKP3UH1-QDqIrCgzmrFVRgdByrgYuQkzVJg,436
|
70
82
|
py2ls/.git/objects/78/3d4167bc95c9d2175e0df03ef1c1c880ba75ab,sha256=SK2QDjDBiDhVMG1I5p19g4RbEm2Rax7mYnxawmVZYxs,15523
|
71
83
|
py2ls/.git/objects/79/7ae089b2212a937840e215276005ce76881307,sha256=lQOKF2pb1JvipI3eT79X0-TuMGWsy1A-Yw4BCgKZNOM,33472
|
72
84
|
py2ls/.git/objects/7e/5956c806b5edc344d46dab599dec337891ba1f,sha256=sfqJBiSNj-gyJo4D7xkmRAo76mC2ztjqeZZsl4ifULA,162
|
@@ -80,6 +92,7 @@ py2ls/.git/objects/94/74152b4b463d70ae5ad07f0c658be3e296026b,sha256=jmA6qTuUVlds
|
|
80
92
|
py2ls/.git/objects/97/1aef09ea939f46b60b9646f8d524c78a9220f4,sha256=lWu9FuqxnDT-H_jZGYlA0Tbx6NdH7bScu5EVl3BoAxU,2532
|
81
93
|
py2ls/.git/objects/9d/0df52899fe95279059286d9c0ec42287edc168,sha256=67nV3TLo-fwe4lt0wwvxoDnVNHc1IpapRyAY2STP3iI,564
|
82
94
|
py2ls/.git/objects/a1/5389729850729fc7bd78a54f26fce77f30be12,sha256=iNB4jWPKwQfHJSwbGiXz7UgC5J-LbLZu19ylWNr2COs,159
|
95
|
+
py2ls/.git/objects/a1/906da89d1174f74867800c74c43af36253bd5e,sha256=vKUcX4zLVSvZ2Z_FXP-1czZF9MkVMsFidtg43CEhxkQ,780
|
83
96
|
py2ls/.git/objects/a4/63fdd23e5efd713db8a71f316f3a1c7bd60916,sha256=1D3vdbuPXEOyMwYX537RKT7CnjTFVpDhjjGY6Cf87vs,697
|
84
97
|
py2ls/.git/objects/a5/ec8f74642fbba27f7ea78c53b372ae0c7dedce,sha256=Sl17Ka_UfjSZyEVDLv3yz8TjXL3O1u3gqOn8sXFPvTM,565
|
85
98
|
py2ls/.git/objects/a7/3e13eafee65c5b8d73ad2d3ea46d0eee82f0d3,sha256=iv3uTzna5XBzTTwF5ZTOpdrCiv0wqz1fuDpZ-m8QO2I,565
|
@@ -97,6 +110,7 @@ py2ls/.git/objects/c6/7f17e5707313600efcb85e9a3fedea35dba591,sha256=TL7rDIWiaWlk
|
|
97
110
|
py2ls/.git/objects/c6/f32aced880bd165a251cb52b26b0c1107e2141,sha256=ybarsWjoo-JCb8gnxsG6VKt6Sal2VwQiOEZYxQl8DcE,29556
|
98
111
|
py2ls/.git/objects/cd/822b3574a88ebdd1ed82fd6983f37e626d52b4,sha256=MJbPJ-8vpfVTUMhzyzTp5qGmZYgsgrG-7nwwzDdODlQ,617
|
99
112
|
py2ls/.git/objects/cf/0c0d9c6fb09473aaeb7f7e2edbd770c3f2ef3d,sha256=T_nV0GrgpVu3mOJ4fYcCW98oCunzgqy0DnSX0luy04Q,183
|
113
|
+
py2ls/.git/objects/d2/992df305f4b56a466a2f221aeb182ddd20f418,sha256=6zInwArNx-uw1OzxOIhTAZiKpelI3cyhW7Z-dj-Ws2I,9546
|
100
114
|
py2ls/.git/objects/d6/9ab1c4aadf279936dd778e8346ba60f74705b6,sha256=WcfdSMKqfiWT5TOWVUcDj0XDaD2hYxDnyIRNlYGutL8,34976
|
101
115
|
py2ls/.git/objects/d8/4688b54c0040a30976b3a6540bc47adf7ce680,sha256=1gJp1iTVAooc5PZZsiIj215-J1RtJ-_zy22_9jZ8jAY,160
|
102
116
|
py2ls/.git/objects/d9/005f2cc7fc4e65f14ed5518276007c08cf2fd0,sha256=IJIoz93V7pf9yx43U1JdN8gBq_LWtw8A9Z2YMPnq_B0,1450
|
@@ -104,20 +118,27 @@ py2ls/.git/objects/d9/c2403fd166ce791b4e9d0c6792ed8342c71fcd,sha256=uD7BsKdrmN-9
|
|
104
118
|
py2ls/.git/objects/d9/dfa5aee51e92a541b707e8e7baea6f06deff98,sha256=jMdhZ1i_L5q_UgjOtjLN15PCSCz3pE51FhD3z74ZUr8,163
|
105
119
|
py2ls/.git/objects/db/141dbaa93594df2a8156182f361ee4db829359,sha256=TpKTLvbDc4Blzrp1Pq9JijqDROJyBJ7sCQQBmIuYKZo,845984
|
106
120
|
py2ls/.git/objects/db/ffa8ea7bda721d0cee7b9e4ce5b2ef927733ff,sha256=GhDkvP6JYV26qVg5ETPys1ZEnGlsct9hiXCc24Ky4Xg,565
|
121
|
+
py2ls/.git/objects/dc/c2bdbafb3296e09d9ee4955cfa55d275825f94,sha256=EwQROBwhbTP2VbODehfMwXhSoDC1LknvxBtDkCOCTco,988
|
122
|
+
py2ls/.git/objects/dc/cdbd4266765d840be2ae35ab1752a0fa312c16,sha256=ABBvXL3TWBRyx_q5XQLgg-k0EU2rvMKv3HIXpk73I8c,12583
|
107
123
|
py2ls/.git/objects/dd/87fb5f606fe380d81e6fe3a2c98f9f99e3e09b,sha256=gBHzzOxwRhDCCwm6WWSyN51RSENJhwEojekygZj8qsc,1424
|
108
124
|
py2ls/.git/objects/df/e0770424b2a19faf507a501ebfc23be8f54e7b,sha256=vCdlxwEidekh8i-5TVMVgSLGk9DPZCZAbWqvGYSKQ9c,76
|
125
|
+
py2ls/.git/objects/e2/f2f8f4c25e62a297fc55f36acc6b01cfbab76f,sha256=OnyaP4aCH8kHPj2ZcRsBnUQOGYLmX0OOG8uYtDClmB8,113
|
109
126
|
py2ls/.git/objects/e3/1356f90ea6dd0577b5e0b40b206319adcbf085,sha256=I9_QNwmmtoqSwq29Ixdfv_PgF2x14u2M6sX1eQumwoY,161
|
110
127
|
py2ls/.git/objects/e3/5a4dafc50850cacac7bf76c56db2715cbda2c4,sha256=GAcBj3YSEbm6tm7fGD6al16uBo8LtEtjZ2Hi-UgIsUg,3290
|
111
128
|
py2ls/.git/objects/e9/391ffe371f1cc43b42ef09b705d9c767c2e14f,sha256=RWTy2n8L2XxZQknBFyPczA0Aa_4gSG_Ybcr8e8v4ccc,10264
|
129
|
+
py2ls/.git/objects/ea/3a18cc75e53792744ef754e05d3f4481768c13,sha256=p-Ny3qYi1akV2i58-Fxr0c0c8lhaEVrbr6ek7-v21jM,9369
|
130
|
+
py2ls/.git/objects/ec/40fd8bf8e4c342534a9fc020289e402ba6bc9d,sha256=ptkoZH3jOT5PLgsYhxSutkPvtJ4TUlcD5H5JVJIu_AA,28992
|
112
131
|
py2ls/.git/objects/f1/e50757fddc28b445545dc7e2759b54cdd0f42e,sha256=2NG4lzk2IPOZfJ4tRHvxla63yQTcY_YTOprG1tzK-IY,40554
|
113
132
|
py2ls/.git/objects/f4/b64d3107b39e3ad6f540c6607004ea34e6c024,sha256=0egAtqc0x8hc7U1z91tIjcRhSd_BT2a_gxZxo_7NTJA,564
|
133
|
+
py2ls/.git/objects/f4/ba7f815b886797b73fede071d86e0c134d2bc7,sha256=UispRfx4EvDFujmyICYgMz4gZHqZhO_dbNfiL3MFTNw,332
|
134
|
+
py2ls/.git/objects/f6/44a8ff56fa035105fc517cbb1ac46c3d8e349a,sha256=a_5p_uf5YsJVFzXNWAAQptZr8l7rGNLLxasotb9q0OU,777
|
114
135
|
py2ls/.git/objects/f7/c98ba5c2f903e603b1f5e63d49fbc8a43815cc,sha256=tYbi3A7irrIPB_11bwItuof0Vc9a0MDuLFMNAzRsG3A,33467
|
115
136
|
py2ls/.git/objects/f9/045a08e96eb76848fc4d68e3e3e687cca39a2d,sha256=u29Cwu3SL3HlagZIal5ueGZ3miqgZAtuDbtP8-fUVvE,141
|
116
137
|
py2ls/.git/objects/fa/147e6bb78a2e8db241d231295fd7f1ed061af8,sha256=G9pg5LXv7AdxnPIQsTm2AF3Un314dLRJQYwxmZem9rQ,574
|
117
138
|
py2ls/.git/objects/fc/292e793ecfd42240ac43be407023bd731fa9e7,sha256=hGIYoxKWNT3IPwk3DE4l3FLBbUYF-kXcHcx7KrH9uS0,1971
|
118
|
-
py2ls/.git/refs/heads/main,sha256=
|
139
|
+
py2ls/.git/refs/heads/main,sha256=3R7BfzmwaGeSA28_orvfyaZoX75EId2y8ANpCMQo6TM,41
|
119
140
|
py2ls/.git/refs/remotes/origin/HEAD,sha256=K7aiSqD8bEhBAPXVGim7rYQc0sdV9dk_qiBOXbtOsrQ,30
|
120
|
-
py2ls/.git/refs/remotes/origin/main,sha256=
|
141
|
+
py2ls/.git/refs/remotes/origin/main,sha256=3R7BfzmwaGeSA28_orvfyaZoX75EId2y8ANpCMQo6TM,41
|
121
142
|
py2ls/.gitattributes,sha256=Gh2-F2vCM7SZ01pX23UT8pQcmauXWfF3gwyRSb6ZAFs,66
|
122
143
|
py2ls/.gitignore,sha256=y7GvbD_zZkjPVVIue8AyiuFkDMuUbvMaV65Lgu89To8,2763
|
123
144
|
py2ls/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
|
@@ -141,13 +162,13 @@ py2ls/doc.py,sha256=xN3g1OWfoaGUhikbJ0NqbN5eKy1VZVvWwRlhHMgyVEc,4243
|
|
141
162
|
py2ls/export_requirements.py,sha256=x2WgUF0jYKz9GfA1MVKN-MdsM-oQ8yUeC6Ua8oCymio,2325
|
142
163
|
py2ls/freqanalysis.py,sha256=F4218VSPbgL5tnngh6xNCYuNnfR-F_QjECUUxrPYZss,32594
|
143
164
|
py2ls/ips.py,sha256=N7MdOCgJXDQu73YkJQTtDN3RSntzXX7V0MOJ1NYBLEk,100572
|
144
|
-
py2ls/netfinder.py,sha256=
|
145
|
-
py2ls/plot.py,sha256=
|
165
|
+
py2ls/netfinder.py,sha256=KJIvg3JZSsy1dJZHNJvd9Y3oyYG0mbdTjtXimdRs8e8,49182
|
166
|
+
py2ls/plot.py,sha256=ytJf3sWUg-52n5A2RsKd9jfCw3f1sYLPIDc0eOvaQRg,69606
|
146
167
|
py2ls/setuptools-70.1.0-py3-none-any.whl,sha256=2bi3cUVal8ip86s0SOvgspteEF8SKLukECi-EWmFomc,882588
|
147
168
|
py2ls/sleep_events_detectors.py,sha256=bQA3HJqv5qnYKJJEIhCyhlDtkXQfIzqksnD0YRXso68,52145
|
148
|
-
py2ls/stats.py,sha256=
|
169
|
+
py2ls/stats.py,sha256=gPlnPkyLDZnBlWXZ4atCC5_Q0S1nbXwyxL7FGROLq5Q,48025
|
149
170
|
py2ls/translator.py,sha256=bc5FB-wqC4TtQz9gyCP1mE38HqNRJ_pmuRIgKnAlMzM,30581
|
150
171
|
py2ls/wb_detector.py,sha256=7y6TmBUj9exCZeIgBAJ_9hwuhkDh1x_-yg4dvNY1_GQ,6284
|
151
|
-
py2ls-0.1.9.
|
152
|
-
py2ls-0.1.9.
|
153
|
-
py2ls-0.1.9.
|
172
|
+
py2ls-0.1.9.4.dist-info/METADATA,sha256=-idfSTkT2AmukiwTq4TLQM2xEjZgnG5X9hhYW0xpfcg,20017
|
173
|
+
py2ls-0.1.9.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
174
|
+
py2ls-0.1.9.4.dist-info/RECORD,,
|
File without changes
|