py2ls 0.2.4.2__py3-none-any.whl → 0.2.4.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/netfinder.py CHANGED
@@ -742,7 +742,18 @@ def downloader(
742
742
  counter_ = str(counter)
743
743
  new_filename = f"{base}_{counter_}{ext}"
744
744
  counter += 1
745
- return new_filename
745
+ return new_filename
746
+
747
+ if url.startswith("ftp"):
748
+ import urllib.request
749
+
750
+ if dir_save is None:
751
+ dir_save = "./"
752
+ dir_save+= os.path.basename(url)
753
+ print(dir_save)
754
+ urllib.request.urlretrieve(url, dir_save)
755
+ print(f"Downloaded file to: {dir_save}")
756
+ return None
746
757
 
747
758
  fpath_tmp, corrected_fname = None, None
748
759
  if not isinstance(kind, list):
py2ls/plot.py CHANGED
@@ -11,12 +11,14 @@ import logging
11
11
  import os
12
12
  import re
13
13
  from typing import Union
14
- from .ips import fsave, fload, mkdir, listdir, figsave, strcmp, unique, get_os, ssplit,plt_font
14
+ from .ips import fsave, fload, mkdir, listdir, figsave, strcmp, unique, get_os, ssplit,plt_font,flatten
15
15
  from .stats import *
16
16
  from .netfinder import get_soup, fetch
17
17
 
18
18
  # Suppress INFO messages from fontTools
19
- logging.getLogger("fontTools").setLevel(logging.WARNING)
19
+ logging.getLogger("fontTools").setLevel(logging.ERROR)
20
+ logging.getLogger('matplotlib').setLevel(logging.ERROR)
21
+
20
22
 
21
23
 
22
24
  def add_text(ax=None, height_offset=0.5, fmt=".1f", **kwargs):
@@ -1895,6 +1897,16 @@ def figsets(*args, **kwargs):
1895
1897
  if ("fo" in key) and (("size" in key) or ("sz" in key)):
1896
1898
  fontsize = value
1897
1899
  plt.rcParams.update({"font.size": fontsize})
1900
+ # Customize tick labels
1901
+ ax.tick_params(axis='both', which='major', labelsize=fontsize)
1902
+ for label in ax.get_xticklabels() + ax.get_yticklabels():
1903
+ label.set_fontname(fontname)
1904
+
1905
+ # Optionally adjust legend font properties if a legend is included
1906
+ if ax.get_legend():
1907
+ for text in ax.get_legend().get_texts():
1908
+ text.set_fontsize(fontsize)
1909
+ text.set_fontname(fontname)
1898
1910
  # style
1899
1911
  if "st" in key.lower() or "th" in key.lower():
1900
1912
  if isinstance(value, str):
@@ -3143,15 +3155,20 @@ def plotxy(
3143
3155
  return g, ax
3144
3156
  return ax
3145
3157
 
3158
+ def norm_cmap(data, cmap="coolwarm", min_max=[0, 1]):
3159
+ norm_ = plt.Normalize(min_max[0], min_max[1])
3160
+ colormap = plt.get_cmap(cmap)
3161
+ return colormap(norm_(data))
3146
3162
 
3147
3163
  def volcano(
3148
3164
  data:pd.DataFrame,
3149
3165
  x:str,
3150
3166
  y:str,
3151
- gene_col=None,
3152
- top_genes=5,
3153
- thr_x=np.log2(1.5),
3167
+ gene_col:str=None,
3168
+ top_genes=[5, 5], # [down-regulated, up-regulated]
3169
+ thr_x=np.log2(1.5), # default: 0.585
3154
3170
  thr_y=-np.log10(0.05),
3171
+ sort_xy="x", #'y'
3155
3172
  colors=("#00BFFF", "#9d9a9a", "#FF3030"),
3156
3173
  s=20,
3157
3174
  fill=True, # plot filled scatter
@@ -3163,7 +3180,11 @@ def volcano(
3163
3180
  ax=None,
3164
3181
  verbose=False,
3165
3182
  kws_text=dict(fontsize=10, color="k"),
3166
- kws_arrow=dict(style="-", color="k", lw=0.5),
3183
+ kws_bbox=dict(facecolor='none',
3184
+ alpha=0.5,
3185
+ edgecolor='black',
3186
+ boxstyle='round,pad=0.3'),# '{}' to hide
3187
+ kws_arrow=dict(color="k", lw=0.5),# '{}' to hide
3167
3188
  **kwargs,
3168
3189
  ):
3169
3190
  """
@@ -3179,7 +3200,7 @@ def volcano(
3179
3200
  Column name for y-axis values (e.g., -log10(FDR)).
3180
3201
  gene_col : str, optional
3181
3202
  Column name for gene names. If provided, gene names will be displayed. Default is None.
3182
- top_genes : int, optional
3203
+ top_genes : int, list, optional
3183
3204
  Number of top genes to label based on y-axis values. Default is 5.
3184
3205
  thr_x : float, optional
3185
3206
  Threshold for x-axis values. Default is 0.585.
@@ -3233,21 +3254,39 @@ def volcano(
3233
3254
  kws_figsets = v_arg
3234
3255
  kwargs.pop(k_arg, None)
3235
3256
  break
3236
- # Color-coding based on thresholds using np.where
3237
- data["color"] = np.where(
3257
+
3258
+ data=data.copy()
3259
+ # filter nan
3260
+ data = data.dropna(subset=[x, y]) # Drop rows with NaN in x or y
3261
+ data.loc[:,"color"] = np.where(
3238
3262
  (data[x] > thr_x) & (data[y] > thr_y),
3239
3263
  colors[2],
3240
- np.where((data[x] < -thr_x) & (data[y] > thr_y), colors[0], colors[1]),
3241
- )
3242
-
3243
- # Selecting top significant points for labeling
3244
- sele_gene = (
3245
- data.query("color != @colors[2]") # Exclude gray points
3246
- .groupby("color", axis=0)
3247
- .apply(lambda x: x.sort_values(y, ascending=False).head(top_genes))
3248
- .droplevel(level=0)
3264
+ np.where((data[x] < -thr_x) & (data[y] > thr_y),
3265
+ colors[0],
3266
+ colors[1]),
3249
3267
  )
3250
- palette = {colors[0]: colors[0], colors[1]: colors[1], colors[2]: colors[2]}
3268
+ top_genes=[top_genes, top_genes] if isinstance(top_genes,int) else top_genes
3269
+
3270
+ # could custom how to select the top genes, x: x has priority
3271
+ sort_by_x_y=[x,y] if sort_xy=="x" else [y,x]
3272
+ ascending_up=[True, True] if sort_xy=="x" else [False, True]
3273
+ ascending_down=[False, True] if sort_xy=="x" else [False, False]
3274
+
3275
+ down_reg_genes = data[
3276
+ (data["color"] == colors[0]) &
3277
+ (data[x].abs() > thr_x) &
3278
+ (data[y] > thr_y)
3279
+ ].sort_values(by=sort_by_x_y, ascending=ascending_up).head(top_genes[0])
3280
+ up_reg_genes = data[
3281
+ (data["color"] == colors[2]) &
3282
+ (data[x].abs() > thr_x) &
3283
+ (data[y] > thr_y)
3284
+ ].sort_values(by=sort_by_x_y, ascending=ascending_down).head(top_genes[1])
3285
+ sele_gene = pd.concat([down_reg_genes, up_reg_genes])
3286
+
3287
+ palette = {colors[0]: colors[0],
3288
+ colors[1]: colors[1],
3289
+ colors[2]: colors[2]}
3251
3290
  # Plot setup
3252
3291
  if ax is None:
3253
3292
  ax = plt.gca()
@@ -3265,7 +3304,7 @@ def volcano(
3265
3304
  data=data,
3266
3305
  x=x,
3267
3306
  y=y,
3268
- # hue="color",
3307
+ hue="color",
3269
3308
  palette=palette,
3270
3309
  s=s,
3271
3310
  linewidths=edgelinewidth,
@@ -3277,66 +3316,64 @@ def volcano(
3277
3316
  )
3278
3317
 
3279
3318
  # Add threshold lines for x and y axes
3280
- plt.axhline(y=thr_y, color="black", linestyle="--")
3281
- plt.axvline(x=-thr_x, color="black", linestyle="--")
3282
- plt.axvline(x=thr_x, color="black", linestyle="--")
3319
+ ax.axhline(y=thr_y, color="black", linestyle="--",lw=1)
3320
+ ax.axvline(x=-thr_x, color="black", linestyle="--",lw=1)
3321
+ ax.axvline(x=thr_x, color="black", linestyle="--",lw=1)
3283
3322
 
3284
3323
  # Add gene labels for selected significant points
3285
3324
  if gene_col:
3286
3325
  texts = []
3287
- if kws_text:
3288
- fontname = kws_text.pop("fontname", "Arial")
3289
- textcolor = kws_text.pop("color", "k")
3290
- fontsize = kws_text.pop("fontsize", 10)
3291
- for i in range(sele_gene.shape[0]):
3292
- if isinstance(textcolor, list): # be consistant with dots's color
3293
- textcolor = colors[0] if sele_gene[x].iloc[i] > 0 else colors[1]
3294
- texts.append(
3295
- plt.text(
3296
- x=sele_gene[x].iloc[i],
3297
- y=sele_gene[y].iloc[i],
3298
- s=sele_gene[gene_col].iloc[i],
3299
- fontdict={
3300
- "fontsize": fontsize,
3301
- "color": textcolor,
3302
- "fontname": fontname,
3303
- },
3304
- )
3305
- )
3306
-
3307
- arrowstyles = [
3308
- "-",
3309
- "->",
3310
- "-[",
3311
- "|->",
3312
- "<-",
3313
- "<->",
3314
- "<|-",
3315
- "<|-|>",
3316
- "-|>",
3317
- "-[ ",
3318
- "fancy",
3319
- "simple",
3320
- "wedge",
3321
- ]
3322
- arrowstyle = kws_arrow.pop("style", "-")
3323
- arrowcolor = kws_arrow.pop("color", "0.5")
3324
- arrowlinewidth = kws_arrow.pop("lw", 0.5)
3325
- shrinkA = kws_arrow.pop("shrinkA", 5)
3326
- shrinkB = kws_arrow.pop("shrinkB", 5)
3327
- arrowstyle = strcmp(arrowstyle, arrowstyles)[0]
3328
- adjust_text(
3329
- texts,
3330
- expand_text=(1.05, 1.2),
3331
- arrowprops=dict(
3332
- arrowstyle=arrowstyle,
3333
- color=arrowcolor,
3334
- lw=arrowlinewidth,
3335
- shrinkA=shrinkA,
3336
- shrinkB=shrinkB,
3337
- **kws_arrow,
3338
- ),
3326
+ # if kws_text:
3327
+ fontname = kws_text.pop("fontname", "Arial")
3328
+ textcolor = kws_text.pop("color", "k")
3329
+ fontsize = kws_text.pop("fontsize", 10)
3330
+ arrowstyles = [
3331
+ "->","<-","<->","<|-","-|>","<|-|>",
3332
+ "-","-[","-[",
3333
+ "fancy","simple","wedge",
3334
+ ]
3335
+ arrowstyle = kws_arrow.pop("style", "<|-")
3336
+ arrowstyle = strcmp(arrowstyle, arrowstyles,scorer='strict')[0]
3337
+ expand=kws_arrow.pop("expand",(1.05,1.1))
3338
+ arrowcolor = kws_arrow.pop("color", "0.4")
3339
+ arrowlinewidth = kws_arrow.pop("lw", 0.75)
3340
+ shrinkA = kws_arrow.pop("shrinkA", 0)
3341
+ shrinkB = kws_arrow.pop("shrinkB", 0)
3342
+ mutation_scale = kws_arrow.pop("head", 10)
3343
+ arrow_fill=kws_arrow.pop("fill", False)
3344
+ for i in range(sele_gene.shape[0]):
3345
+ if isinstance(textcolor, list): # be consistant with dots's color
3346
+ textcolor = colors[0] if sele_gene[x].iloc[i] > 0 else colors[1]
3347
+ texts.append(
3348
+ ax.text(
3349
+ x=sele_gene[x].iloc[i],
3350
+ y=sele_gene[y].iloc[i],
3351
+ s=sele_gene[gene_col].iloc[i],
3352
+ bbox=kws_bbox if kws_bbox else None,
3353
+ fontdict={
3354
+ "fontsize": fontsize,
3355
+ "color": textcolor,
3356
+ "fontname": fontname,
3357
+ },
3339
3358
  )
3359
+ )
3360
+ print(arrowstyle)
3361
+ adjust_text(
3362
+ texts,
3363
+ expand=expand,
3364
+ min_arrow_len=5,
3365
+ ax=ax,
3366
+ arrowprops=dict(
3367
+ arrowstyle=arrowstyle,
3368
+ fill=arrow_fill,
3369
+ color=arrowcolor,
3370
+ lw=arrowlinewidth,
3371
+ shrinkA=shrinkA,
3372
+ shrinkB=shrinkB,
3373
+ mutation_scale=mutation_scale,
3374
+ **kws_arrow,
3375
+ )
3376
+ )
3340
3377
 
3341
3378
  figsets(**kws_figsets)
3342
3379
 
@@ -3426,3 +3463,181 @@ def sns_func_info(dir_save=None):
3426
3463
  dir_save + "sns_info.json",
3427
3464
  sns_info,
3428
3465
  )
3466
+
3467
+
3468
+
3469
+
3470
+
3471
+
3472
+ def venn(
3473
+ lists:list,
3474
+ labels:list,
3475
+ ax=None,
3476
+ colors=None,
3477
+ edgecolor="0.25",
3478
+ alpha=0.75,
3479
+ linewidth=.75,
3480
+ linestyle="-",
3481
+ fontname='Arial',
3482
+ fontsize=11,
3483
+ fontweight="normal",
3484
+ fontstyle="normal",
3485
+ label_align="center",
3486
+ label_baseline="center",
3487
+ subset_fontsize=9,
3488
+ subset_fontweight="normal",
3489
+ subset_fontstyle="normal",
3490
+ subset_label_format="{:d}",
3491
+ shadow=False,
3492
+ custom_texts=None,
3493
+ hatches=None,
3494
+ per_circle_styles=None,
3495
+ **kwargs
3496
+ ):
3497
+ """
3498
+ Advanced Venn diagram plotting function with extensive customization options.
3499
+
3500
+ Parameters:
3501
+ lists: list of sets, 2 or 3 sets
3502
+ labels: list of strings, labels for the sets
3503
+ ax: matplotlib axis, optional
3504
+ colors: list of colors, colors for the Venn diagram patches
3505
+ edgecolor: string, color of the circle edges
3506
+ alpha: float, transparency level for the patches
3507
+ linewidth: float, width of the circle edges
3508
+ linestyle: string, line style for the circles
3509
+ fontname: string, font for set labels
3510
+ fontsize: int, font size for set labels
3511
+ fontweight: string, weight of the set label font (e.g., 'bold', 'light')
3512
+ fontstyle: string, style of the set label font (e.g., 'italic')
3513
+ label_align: string, horizontal alignment of set labels ('left', 'center', 'right')
3514
+ label_baseline: string, vertical alignment of set labels ('top', 'center', 'bottom')
3515
+ subset_fontsize: int, font size for subset labels (the numbers)
3516
+ subset_fontweight: string, weight of subset label font
3517
+ subset_fontstyle: string, style of subset label font
3518
+ subset_label_format: string, format for subset labels (e.g., "{:.2f}" for floats)
3519
+ shadow: bool, add shadow effect to the patches
3520
+ custom_texts: list of custom texts to replace the subset labels
3521
+ hatches: list of hatch patterns for the patches
3522
+ per_circle_styles: dict, custom styles for each circle (e.g., {'circle_1': {'color': 'red'}})
3523
+ **kwargs: additional keyword arguments passed to venn2 or venn3
3524
+ """
3525
+ if ax is None:
3526
+ ax = plt.gca()
3527
+ lists=[set(flatten(i, verbose=False)) for i in lists]
3528
+ # Function to apply text styles to labels
3529
+ def apply_text_style(text, fontname, fontsize, fontweight, fontstyle):
3530
+ if text: # Ensure text exists
3531
+ if fontname:
3532
+ text.set_fontname(fontname)
3533
+ if fontsize:
3534
+ text.set_fontsize(fontsize)
3535
+ if fontweight:
3536
+ text.set_fontweight(fontweight)
3537
+ if fontstyle:
3538
+ text.set_fontstyle(fontstyle)
3539
+ # Alignment customization
3540
+ text.set_horizontalalignment(label_align)
3541
+ text.set_verticalalignment(label_baseline)
3542
+
3543
+ if len(lists) == 2:
3544
+ from matplotlib_venn import venn2, venn2_circles
3545
+ v = venn2(subsets=lists, set_labels=labels, ax=ax, **kwargs)
3546
+ venn_circles = venn2_circles(subsets=lists, ax=ax,color=edgecolor)
3547
+ if not isinstance(linewidth,list):
3548
+ linewidth=[linewidth]
3549
+ if isinstance(linestyle,str):
3550
+ linestyle=[linestyle]
3551
+ linewidth=linewidth*2 if len(linewidth)==1 else linewidth
3552
+ linestyle=linestyle*2 if len(linestyle)==1 else linestyle
3553
+ for i in range(2):
3554
+ venn_circles[i].set_lw(linewidth[i])
3555
+ venn_circles[i].set_ls(linestyle[i])
3556
+ # Apply styles to set labels
3557
+ for i, text in enumerate(v.set_labels):
3558
+ apply_text_style(text, fontname, fontsize, fontweight, fontstyle)
3559
+
3560
+ # Apply styles to subset labels
3561
+ for i, text in enumerate(v.subset_labels):
3562
+ if text: # Ensure text exists
3563
+ if custom_texts: # Custom text handling
3564
+ text.set_text(custom_texts[i])
3565
+ else: # Default subset label formatting
3566
+ subset_size = (
3567
+ len(lists[i % 2])
3568
+ if i in [0, 1]
3569
+ else len(lists[0].intersection(lists[1]))
3570
+ )
3571
+ text.set_text(subset_label_format.format(subset_size))
3572
+ apply_text_style(
3573
+ text, None, subset_fontsize, subset_fontweight, subset_fontstyle
3574
+ )
3575
+ elif len(lists) == 3:
3576
+ from matplotlib_venn import venn3, venn3_circles
3577
+ v = venn3(
3578
+ subsets=lists, set_labels=labels, set_colors=colors, ax=ax, **kwargs
3579
+ )
3580
+ venn_circles = venn3_circles(
3581
+ subsets=lists, ax=ax,color=edgecolor
3582
+ )
3583
+ if not isinstance(linewidth,list):
3584
+ linewidth=[linewidth]
3585
+ if isinstance(linestyle,str):
3586
+ linestyle=[linestyle]
3587
+ linewidth=linewidth*3 if len(linewidth)==1 else linewidth
3588
+ linestyle=linestyle*3 if len(linestyle)==1 else linestyle
3589
+ for i in range(3):
3590
+ venn_circles[i].set_lw(linewidth[i])
3591
+ venn_circles[i].set_ls(linestyle[i])
3592
+
3593
+ # Apply styles to set labels
3594
+ for i, text in enumerate(v.set_labels):
3595
+ apply_text_style(text, fontname, fontsize, fontweight, fontstyle)
3596
+
3597
+ # Apply styles to subset labels
3598
+ for i, text in enumerate(v.subset_labels):
3599
+ if text: # Ensure text exists
3600
+ if custom_texts: # Custom text handling
3601
+ text.set_text(custom_texts[i])
3602
+ else: # Default subset label formatting
3603
+ subset_size = (
3604
+ len(lists[i])
3605
+ if i < 3
3606
+ else len(lists[0].intersection(lists[1], lists[2]))
3607
+ )
3608
+ text.set_text(subset_label_format.format(subset_size))
3609
+ apply_text_style(
3610
+ text, None, subset_fontsize, subset_fontweight, subset_fontstyle
3611
+ )
3612
+ else:
3613
+ raise ValueError("只支持2或者3个list")
3614
+ # Set circle and patch customizations (edge color, transparency, hatches)
3615
+ for i, patch in enumerate(v.patches):
3616
+ if patch:
3617
+ if colors:
3618
+ patch.set_facecolor(colors[i % len(colors)])
3619
+ patch.set_edgecolor("none")
3620
+ patch.set_alpha(alpha)
3621
+ if hatches:
3622
+ patch.set_hatch(hatches[i % len(hatches)])
3623
+ if shadow:
3624
+ from matplotlib.patches import Shadow
3625
+ shadow_patch = Shadow(patch, -0.02, -0.02, alpha=0.2)
3626
+ ax.add_patch(shadow_patch)
3627
+ # # usage:
3628
+ # venn(
3629
+ # [rf_features, svm_features, lasso_features],
3630
+ # ["Random Forest", "SVM-RFE", "a"],
3631
+ # ax=axs[0], # Specify the axes
3632
+ # colors=["#BDC8E0", "#E5C0C1", "#D0E9CB"],
3633
+ # edgecolor="r",
3634
+ # alpha=1,
3635
+ # linewidth=[1, 2, 18],# 分别设置字体大小
3636
+ # linestyle=["-", "--", ":"],
3637
+ # fontsize=20,
3638
+ # label_baseline="top",
3639
+ # subset_label_format="{:.2f}%",
3640
+ # subset_fontsize=18,
3641
+ # shadow=False,
3642
+ # # custom_texts=["a", "b", "c"],
3643
+ # )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: py2ls
3
- Version: 0.2.4.2
3
+ Version: 0.2.4.4
4
4
  Summary: py(thon)2(too)ls
5
5
  Author: Jianfeng
6
6
  Author-email: Jianfeng.Liu0413@gmail.com
@@ -1,4 +1,4 @@
1
- py2ls/.DS_Store,sha256=9qxq9N5T7k6muGHxG5s6yEdEEYqEh8eDGT3w7LokxsU,6148
1
+ py2ls/.DS_Store,sha256=JdpMN4cmDCbGxELP0b4LUPASIOzoxopMYybGVl8zlZ0,6148
2
2
  py2ls/.git/COMMIT_EDITMSG,sha256=AdtqRHle5Ej2EBNPJY79v-SB454v5UK4wuPCPFELiFQ,11
3
3
  py2ls/.git/FETCH_HEAD,sha256=VM-2Jiw6iPaGu0ftg9xwq76OyNPWV0iT1nL0VWiL1zI,100
4
4
  py2ls/.git/HEAD,sha256=KNJb-Cr0wOK3L1CVmyvrhZ4-YLljCl6MYD2tTdsrboA,21
@@ -17,7 +17,7 @@ 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=YCofugnXLz17aY5kqXGtUpV8FzXPdgQdEwcjQ8bHDfg,4232
20
+ py2ls/.git/index,sha256=O4t8fvweL1JsEypzrWigO2hAxCpfQwC4VOW3q8panRk,4232
21
21
  py2ls/.git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
22
22
  py2ls/.git/logs/HEAD,sha256=8ID7WuAe_TlO9g-ARxhIJYdgdL3u3m7-1qrOanaIUlA,3535
23
23
  py2ls/.git/logs/refs/heads/main,sha256=8ID7WuAe_TlO9g-ARxhIJYdgdL3u3m7-1qrOanaIUlA,3535
@@ -173,7 +173,7 @@ py2ls/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
173
173
  py2ls/README.md,sha256=CwvJWAnSXnCnrVHlnEbrxxi6MbjbE_MT6DH2D53S818,11572
174
174
  py2ls/__init__.py,sha256=Nn8jTIvySX7t7DMJ8VNRVctTStgXGjHldOIdZ35PdW8,165
175
175
  py2ls/batman.py,sha256=E7gYofbDzN7S5oCmO_dd5Z1bxxhoYMJSD6s-VaF388E,11398
176
- py2ls/bio.py,sha256=5q7T_LXmDg0MJoKXwO0kWnfbpshXNvUR5kCnYyLqm2w,10711
176
+ py2ls/bio.py,sha256=J-zGAgHiSQwDyUvjMKDOsJZoeTkqGaXcHDYHtMd84SQ,53879
177
177
  py2ls/brain_atlas.py,sha256=w1o5EelRjq89zuFJUNSz4Da8HnTCwAwDAZ4NU4a-bAY,5486
178
178
  py2ls/chat.py,sha256=Yr22GoIvoWhpV3m4fdwV_I0Mn77La346_ymSinR-ORA,3793
179
179
  py2ls/correlators.py,sha256=RbOaJIPLCHJtUm5SFi_4dCJ7VFUPWR0PErfK3K26ad4,18243
@@ -182,6 +182,7 @@ py2ls/data/db2ls_sql_chtsht.json,sha256=ls9d7Sm8TLeujanWHfHlWhU85Qz1KnAizO_9X3wU
182
182
  py2ls/data/docs_links.json,sha256=kXgbbWo0b8bfV4n6iuuUNLnZipIyLzokUO6Lzmf7nO4,101829
183
183
  py2ls/data/email/email_html_template.html,sha256=UIg3aixWfdNsvVx-j2dX1M5N3G-6DgrnV1Ya1cLjiUQ,2809
184
184
  py2ls/data/lang_code_iso639.json,sha256=qZiU7H2RLJjDMXK22C-jhwzLJCI5vKmampjB1ys4ek4,2157
185
+ py2ls/data/mygenes_fields_241022.txt,sha256=-7htEdtmqbSRTUKHHVmjUFLBwZZg9u3LFpn9OZMb1qg,11348
185
186
  py2ls/data/sns_info.json,sha256=pEzdg2bhMkwQHZpXx02_7zAP7NvRoCc0Le8PN6Uv0Vk,4074
186
187
  py2ls/data/styles/example/style1.pdf,sha256=Pt_qQJ5kiCSIPiz3TWSwEffHUdj75kKXnZ4MPqpEx4I,29873
187
188
  py2ls/data/styles/example/style2.pdf,sha256=0xduPLPulET38LEP2V2H_q70wqlrrBEo8ttqO-FMrfQ,25449
@@ -213,15 +214,16 @@ py2ls/export_requirements.py,sha256=x2WgUF0jYKz9GfA1MVKN-MdsM-oQ8yUeC6Ua8oCymio,
213
214
  py2ls/fetch_update.py,sha256=9LXj661GpCEFII2wx_99aINYctDiHni6DOruDs_fdt8,4752
214
215
  py2ls/freqanalysis.py,sha256=F4218VSPbgL5tnngh6xNCYuNnfR-F_QjECUUxrPYZss,32594
215
216
  py2ls/ich2ls.py,sha256=3E9R8oVpyYZXH5PiIQgT3CN5NxLe4Dwtm2LwaeacE6I,21381
216
- py2ls/ips.py,sha256=46nrt6RRl8Lc-tMh03dRqxF4nUlLfMElnETE1ipu-DM,210309
217
- py2ls/netfinder.py,sha256=LwBkGITB_4BTNtY6RlKdEZVFW6epzMWlnqy2g03KtyU,56117
217
+ py2ls/ips.py,sha256=USmQKEZuqnjJyP5dhXzFG8yMrhrH6L8yt9jFtttuqLI,227772
218
+ py2ls/ml2ls.py,sha256=XSe2-sLNzUVSvVRkeRGfhrB_q8C49SDK1sekYC1Bats,50277
219
+ py2ls/netfinder.py,sha256=RJFr80tGEJiuwEx99IBOhI5-ZuXnPdWnGUYpF7XCEwI,56426
218
220
  py2ls/ocr.py,sha256=5lhUbJufIKRSOL6wAWVLEo8TqMYSjoI_Q-IO-_4u3DE,31419
219
- py2ls/plot.py,sha256=A4NiRDItVyrc80qPtLgT1mpzvebU_iMVVownjsu_YFc,135976
221
+ py2ls/plot.py,sha256=MepTGqtxqHnc_pTixvEXjQHGPTETcTeI1FGXMxBB8L8,144556
220
222
  py2ls/setuptools-70.1.0-py3-none-any.whl,sha256=2bi3cUVal8ip86s0SOvgspteEF8SKLukECi-EWmFomc,882588
221
223
  py2ls/sleep_events_detectors.py,sha256=bQA3HJqv5qnYKJJEIhCyhlDtkXQfIzqksnD0YRXso68,52145
222
224
  py2ls/stats.py,sha256=DMoJd8Z5YV9T1wB-4P52F5K5scfVK55DT8UP4Twcebo,38627
223
225
  py2ls/translator.py,sha256=zBeq4pYZeroqw3DT-5g7uHfVqKd-EQptT6LJ-Adi8JY,34244
224
226
  py2ls/wb_detector.py,sha256=7y6TmBUj9exCZeIgBAJ_9hwuhkDh1x_-yg4dvNY1_GQ,6284
225
- py2ls-0.2.4.2.dist-info/METADATA,sha256=_YQg86nAdjPWqkaIrH6p9nSPhjNHbY1AU0BGV6o3wU0,20038
226
- py2ls-0.2.4.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
227
- py2ls-0.2.4.2.dist-info/RECORD,,
227
+ py2ls-0.2.4.4.dist-info/METADATA,sha256=OS59HPIjSXN6Zdy5X0AxSfyvQba6SuK66h74n7nVDno,20038
228
+ py2ls-0.2.4.4.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
229
+ py2ls-0.2.4.4.dist-info/RECORD,,