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.
Files changed (36) hide show
  1. py2ls/.git/COMMIT_EDITMSG +1 -1
  2. py2ls/.git/FETCH_HEAD +1 -1
  3. py2ls/.git/index +0 -0
  4. py2ls/.git/logs/HEAD +1 -0
  5. py2ls/.git/logs/refs/heads/main +1 -0
  6. py2ls/.git/logs/refs/remotes/origin/HEAD +2 -0
  7. py2ls/.git/logs/refs/remotes/origin/main +1 -0
  8. py2ls/.git/objects/12/c2808a1b3a4d0892a4154dfba1e2ae3770fa73 +0 -0
  9. py2ls/.git/objects/1c/9314c5f69b9390068a2a8616875d974849d71f +0 -0
  10. py2ls/.git/objects/2a/ae95d517d213b660bf4f65a4e0cfae7bb893eb +0 -0
  11. py2ls/.git/objects/34/9e31b6a3634cea102ce5588b98c11cc1738605 +0 -0
  12. py2ls/.git/objects/45/b1b6178bacbfc997811a998b5cc60c1ea7fac8 +0 -0
  13. py2ls/.git/objects/57/63d0c52f5c9c69e89d514a1f96034947abe21a +0 -0
  14. py2ls/.git/objects/59/380c4c26bdcd4d9b71ae3e2e35f05b3f26c5ab +0 -0
  15. py2ls/.git/objects/66/6227eeeba24073e63811e89f1449f3d958f183 +0 -0
  16. py2ls/.git/objects/66/c998778721d424bd0aae80602dabbffa93af2e +0 -0
  17. py2ls/.git/objects/6d/c2cdf4a84e538e5d4777486aeff87e42f41799 +2 -0
  18. py2ls/.git/objects/72/245a05b0966011cb381e6b32b0465000e969ab +0 -0
  19. py2ls/.git/objects/72/e4179337639859678ddaecf38b16f33aaec8e1 +0 -0
  20. py2ls/.git/objects/a1/906da89d1174f74867800c74c43af36253bd5e +0 -0
  21. py2ls/.git/objects/d2/992df305f4b56a466a2f221aeb182ddd20f418 +0 -0
  22. py2ls/.git/objects/dc/c2bdbafb3296e09d9ee4955cfa55d275825f94 +5 -0
  23. py2ls/.git/objects/dc/cdbd4266765d840be2ae35ab1752a0fa312c16 +0 -0
  24. py2ls/.git/objects/e2/f2f8f4c25e62a297fc55f36acc6b01cfbab76f +3 -0
  25. py2ls/.git/objects/ea/3a18cc75e53792744ef754e05d3f4481768c13 +0 -0
  26. py2ls/.git/objects/ec/40fd8bf8e4c342534a9fc020289e402ba6bc9d +0 -0
  27. py2ls/.git/objects/f4/ba7f815b886797b73fede071d86e0c134d2bc7 +0 -0
  28. py2ls/.git/objects/f6/44a8ff56fa035105fc517cbb1ac46c3d8e349a +0 -0
  29. py2ls/.git/refs/heads/main +1 -1
  30. py2ls/.git/refs/remotes/origin/main +1 -1
  31. py2ls/netfinder.py +0 -8
  32. py2ls/plot.py +188 -45
  33. py2ls/stats.py +118 -97
  34. {py2ls-0.1.9.2.dist-info → py2ls-0.1.9.4.dist-info}/METADATA +1 -1
  35. {py2ls-0.1.9.2.dist-info → py2ls-0.1.9.4.dist-info}/RECORD +36 -15
  36. {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 ips
1
+ update
py2ls/.git/FETCH_HEAD CHANGED
@@ -1 +1 @@
1
- a15389729850729fc7bd78a54f26fce77f30be12 branch 'main' of https://github.com/Jianfengliu0413/py2ls
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
@@ -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
@@ -0,0 +1,2 @@
1
+ x��M
2
+ � F��� AǟQ(���KLtL���`�_7�@7��x|ik�v /�`���*9(.��#�����K���h�fMb���.I;"B N�- 猁�-�Kb�b������Yi-�.����UOe�y,��gJ[�K�`��ʫ�İ�f���3u_ �FS
@@ -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
@@ -0,0 +1,3 @@
1
+ xe��
2
+ �0 D;�+�
3
+ �� ����Y����@���x�q7�q{�/)���J�2be��uT[����d������<0~��I{���L�#�.�Z�8��<V�y�������:k
@@ -1 +1 @@
1
- a15389729850729fc7bd78a54f26fce77f30be12
1
+ 6dc2cdf4a84e538e5d4777486aeff87e42f41799
@@ -1 +1 @@
1
- a15389729850729fc7bd78a54f26fce77f30be12
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
- # figsets
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(data=df, dv=y, factor=hue)
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
- display_output(res)
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
- res = FuncMultiCmpt(data=df, dv=y, factor=x, **stats_param)
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
- res = FuncMultiCmpt(data=df, dv=y, factor=x)
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
- xticks = np.arange(1, data.shape[1] + 1).tolist()
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
- default_colors = get_color(len(xticks))
562
- legend_hue = None
563
- xangle = 0
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
- ax = kwargs.get("ax", None)
584
- if "ax" not in locals() or ax is None:
585
- ax = plt.gca()
586
- opt.setdefault("c", default_colors)
587
- # if len(opt["c"]) < data.shape[1]:
588
- # additional_colors = plt.cm.winter(
589
- # np.linspace(0, 1, data.shape[1] - len(opt["c"]))
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", opt["c"])
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", opt["c"])
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", opt["c"])
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", opt["c"])
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
- label_which = kwargs.get("label_which", "barplot")
727
- if "b" in label_which:
728
- legend_which = "b"
729
- elif "s" in label_which:
730
- legend_which = "s"
731
- elif "bx" in label_which:
732
- legend_which = "bx"
733
- elif "e" in label_which:
734
- legend_which = "e"
735
- elif "v" in label_which:
736
- legend_which = "v"
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.06, 0.06],
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 = np.min(ylim) + yscale * (np.max(ylim) - np.min(ylim))
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
- plt.text(
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
- plt.text(
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
- plt.text(
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
- plt.text(
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: # and 0 < pval <= 0.05:
105
- print(pval)
106
- print(linego)
109
+ if linego and 0 < pval <= 0.05:
107
110
  # horizontal line
108
- if yscale < 0.99:
109
- plt.plot(
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
- plt.plot(
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
- plt.plot(
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
- plt.plot(
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
- plt.plot(
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
- plt.plot(
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
- plt.text(
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
- plt.text(
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
- cfg_pmc = None
216
- if pmc.lower() in {"pmc", "parametric"} and pmc.lower() not in {
217
- "npmc",
218
- "nonparametric",
219
- "non-parametric",
220
- }:
221
- cfg_pmc = "parametric"
222
- elif pmc.lower() in {
223
- "npmc",
224
- "nonparametric",
225
- "non-parametric",
226
- } and pmc.lower() not in {"pmc", "parametric"}:
227
- cfg_pmc = "non-parametric"
228
- else:
229
- cfg_pmc = "auto"
230
- return cfg_pmc
231
-
232
- def corr_pair(pair):
233
- cfg_pair = None
234
- if "pa" in pair.lower() and "np" not in pair.lower():
235
- cfg_pair = "paired"
236
- elif "np" in pair.lower():
237
- cfg_pair = "unpaired"
238
- return cfg_pair
239
-
240
- def check_normality(data, verbose=True):
241
- stat_shapiro, pval_shapiro = stats.shapiro(data)
242
- if pval_shapiro > 0.05:
243
- Normality = True
244
- else:
245
- Normality = False
246
- if verbose:
247
- (
248
- print(f"\n normally distributed\n")
249
- if Normality
250
- else print(f"\n NOT normally distributed\n")
251
- )
252
- return Normality
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, 5)},p={round(pval, 5)}"
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, 5)},p={round(pval, 5)}"
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, 5)},p={round(pval, 5)}"
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, 5)},p={round(pval, 5)}"
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, 5)},p={round(pval, 5)}"
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, 5)},p={round(pval, 5)}"
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, 5)},p={round(pval, 5)}"
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=5):
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], 5)},p={round(res_tab["p-unc"][0], 5)}'
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], 5)},p={round(res_tab["p-unc"][0], 5)}'
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("display.max_columns", None)
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
- # res_keys = list(output.keys())
621
- # display(res_keys)
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("APA:")
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("posthoc:")
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
- print(f"\n normally distributed\n")
658
- if Normality
659
- else print(f"\n NOT normally distributed\n")
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], 5)},p={round(res_tab["p-unc"][irow], 5)}'
695
- notes_APA.append([note_tmp])
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], 5)},p={round(res_tab["p-unc"][irow], 5)}'
699
- notes_APA.append([note_tmp])
700
- notes_APA.append(["NaN"])
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], 5)},p={round(res_tab["p-unc"][irow], 5)}'
704
- notes_APA.append([note_tmp])
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
  Metadata-Version: 2.1
2
2
  Name: py2ls
3
- Version: 0.1.9.2
3
+ Version: 0.1.9.4
4
4
  Summary: py(thon)2(too)ls
5
5
  Author: Jianfeng
6
6
  Author-email: Jianfeng.Liu0413@gmail.com
@@ -1,6 +1,6 @@
1
1
  py2ls/.DS_Store,sha256=l7m93mLt2ckidOORlgzbfdGcDJ5emCexs-GHEiKbEaQ,6148
2
- py2ls/.git/COMMIT_EDITMSG,sha256=EBFQ6F6FLLKqdBpaLROBL68CNyHmTvOC--uM_TlZ6KI,11
3
- py2ls/.git/FETCH_HEAD,sha256=ZYJf1HGynl3E4z5mK-iNYPEV63GUwDCoI31sbgjlgL0,100
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=XDvwp0KaZw_2pZgn1OPTmqBe78Abnq6O-xcw_aZuOB8,1855
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=0Al8yWeB2OiUKgtEdzKf8Kx9p8_1WI1Mx_X2DXQCbU0,3227
23
- py2ls/.git/logs/refs/heads/main,sha256=0Al8yWeB2OiUKgtEdzKf8Kx9p8_1WI1Mx_X2DXQCbU0,3227
24
- py2ls/.git/logs/refs/remotes/origin/HEAD,sha256=Ofz2UGxUefJXTI9_-ai1ypszAHLZDEmoOEgG0MK7dRk,23038
25
- py2ls/.git/logs/refs/remotes/origin/main,sha256=oKNSm-3X1G53hmgJH1DL6RHf4sTppI3Xe-ljAB2ETJA,2888
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=CSr78UjXX9GHyP0VKBW6on894mO_XNGeh-8R5NFTGqA,41
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=CSr78UjXX9GHyP0VKBW6on894mO_XNGeh-8R5NFTGqA,41
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=OMStrwMAASf1ajlyEfseoaEygo7G5WKBAFRE0LY15Lw,49477
145
- py2ls/plot.py,sha256=4vB2uT7RCZZejS4e3_fuR7qd7CWGwzkMatJWWVRbEzo,63454
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=_d_Uee-6DQQavxAjieKnFEJuKu5CNvFPjEPygd-DeYM,47222
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.2.dist-info/METADATA,sha256=Z45KdY73Mk_IfBDplBdsKk2udIvRFjVh_HRbzMH31B4,20017
152
- py2ls-0.1.9.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
153
- py2ls-0.1.9.2.dist-info/RECORD,,
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,,