pertpy 1.0.1__py3-none-any.whl → 1.0.3__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.
@@ -6,7 +6,6 @@ import numpy as np
6
6
  import pandas as pd
7
7
  from anndata import AnnData
8
8
  from lamin_utils import logger
9
- from rich import print
10
9
  from scipy.stats import entropy
11
10
 
12
11
  if TYPE_CHECKING:
@@ -27,6 +26,7 @@ class PerturbationSpace:
27
26
  def compute_control_diff( # type: ignore
28
27
  self,
29
28
  adata: AnnData,
29
+ *,
30
30
  target_col: str = "perturbation",
31
31
  group_col: str = None,
32
32
  reference_key: str = "control",
@@ -41,8 +41,8 @@ class PerturbationSpace:
41
41
 
42
42
  Args:
43
43
  adata: Anndata object of size cells x genes.
44
- target_col: .obs column name that stores the label of the perturbation applied to each cell.
45
- group_col: .obs column name that stores the label of the group of each cell. If None, ignore groups.
44
+ target_col: `.obs` column name that stores the label of the perturbation applied to each cell.
45
+ group_col: `.obs` column name that stores the label of the group of each cell. If None, ignore groups.
46
46
  reference_key: The key of the control values.
47
47
  layer_key: Key of the AnnData layer to use for computation.
48
48
  new_layer_key: the results are stored in the given layer.
@@ -146,6 +146,7 @@ class PerturbationSpace:
146
146
  def add(
147
147
  self,
148
148
  adata: AnnData,
149
+ *,
149
150
  perturbations: Iterable[str],
150
151
  reference_key: str = "control",
151
152
  ensure_consistency: bool = False,
@@ -157,8 +158,8 @@ class PerturbationSpace:
157
158
  adata: Anndata object of size n_perts x dim.
158
159
  perturbations: Perturbations to add.
159
160
  reference_key: perturbation source from which the perturbation summation starts.
160
- ensure_consistency: If True, runs differential expression on all data matrices to ensure consistency of linear space.
161
- target_col: .obs column name that stores the label of the perturbation applied to each cell.
161
+ ensure_consistency: Whether to run differential expression on all data matrices to ensure consistency of linear space.
162
+ target_col: `.obs` column name that stores the label of the perturbation applied to each cell.
162
163
 
163
164
  Returns:
164
165
  Anndata object of size (n_perts+1) x dim, where the last row is the addition of the specified perturbations.
@@ -255,6 +256,7 @@ class PerturbationSpace:
255
256
  def subtract(
256
257
  self,
257
258
  adata: AnnData,
259
+ *,
258
260
  perturbations: Iterable[str],
259
261
  reference_key: str = "control",
260
262
  ensure_consistency: bool = False,
@@ -266,8 +268,8 @@ class PerturbationSpace:
266
268
  adata: Anndata object of size n_perts x dim.
267
269
  perturbations: Perturbations to subtract.
268
270
  reference_key: Perturbation source from which the perturbation subtraction starts.
269
- ensure_consistency: If True, runs differential expression on all data matrices to ensure consistency of linear space.
270
- target_col: .obs column name that stores the label of the perturbation applied to each cell.
271
+ ensure_consistency: Whether to run differential expression on all data matrices to ensure consistency of linear space.
272
+ target_col: `.obs` column name that stores the label of the perturbation applied to each cell.
271
273
 
272
274
  Returns:
273
275
  Anndata object of size (n_perts+1) x dim, where the last row is the subtraction of the specified perturbations.
@@ -361,13 +363,15 @@ class PerturbationSpace:
361
363
 
362
364
  return new_perturbation
363
365
 
364
- def label_transfer(
366
+ def label_transfer( # noqa: D417
365
367
  self,
366
368
  adata: AnnData,
367
- column: str = "perturbation",
369
+ *,
370
+ target_column: str = "perturbation",
368
371
  column_uncertainty_score_key: str = "perturbation_transfer_uncertainty",
369
372
  target_val: str = "unknown",
370
373
  neighbors_key: str = "neighbors",
374
+ **kwargs,
371
375
  ) -> None:
372
376
  """Impute missing values in the specified column using KNN imputation in the space defined by `use_rep`.
373
377
 
@@ -377,7 +381,7 @@ class PerturbationSpace:
377
381
 
378
382
  Args:
379
383
  adata: The AnnData object containing single-cell data.
380
- column: The column name in adata.obs to perform imputation on.
384
+ target_column: The column name in adata.obs to perform imputation on.
381
385
  column_uncertainty_score_key: The column name in adata.obs to store the uncertainty score of the label transfer.
382
386
  target_val: The target value to impute.
383
387
  neighbors_key: The key in adata.uns where the neighbors are stored.
@@ -399,12 +403,16 @@ class PerturbationSpace:
399
403
  if neighbors_key not in adata.uns:
400
404
  raise ValueError(f"Key {neighbors_key} not found in adata.uns. Please run `sc.pp.neighbors` first.")
401
405
 
402
- labels = adata.obs[column].astype(str)
406
+ # backwards compatibility
407
+ if "column" in kwargs:
408
+ target_column = kwargs.pop("column")
409
+
410
+ labels = adata.obs[target_column].astype(str)
403
411
  target_cells = labels == target_val
404
412
 
405
413
  connectivities = adata.obsp[adata.uns[neighbors_key]["connectivities_key"]]
406
414
  # convert labels to an incidence matrix
407
- one_hot_encoded_labels = adata.obs[column].astype(str).str.get_dummies()
415
+ one_hot_encoded_labels = adata.obs[target_column].astype(str).str.get_dummies()
408
416
  # convert to distance-weighted neighborhood incidence matrix
409
417
  weighted_label_occurence = pd.DataFrame(
410
418
  (one_hot_encoded_labels.values.T * connectivities).T,
@@ -413,8 +421,8 @@ class PerturbationSpace:
413
421
  )
414
422
  # choose best label for each target cell
415
423
  best_labels = weighted_label_occurence.drop(target_val, axis=1)[target_cells].idxmax(axis=1)
416
- adata.obs[column] = labels
417
- adata.obs.loc[target_cells, column] = best_labels
424
+ adata.obs[target_column] = labels
425
+ adata.obs.loc[target_cells, target_column] = best_labels
418
426
 
419
427
  # calculate uncertainty
420
428
  uncertainty = np.zeros(adata.n_obs)
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  from typing import Literal
4
4
 
5
5
  import numpy as np
6
+ import pandas as pd
6
7
  import scanpy as sc
7
8
  from anndata import AnnData
8
9
  from sklearn.cluster import DBSCAN, KMeans
@@ -29,8 +30,8 @@ class CentroidSpace(PerturbationSpace):
29
30
  target_col: .obs column that stores the label of the perturbation applied to each cell.
30
31
  layer_key: If specified pseudobulk computation is done by using the specified layer. Otherwise, computation is done with .X
31
32
  embedding_key: `obsm` key of the AnnData embedding to use for computation. Defaults to the 'X' matrix otherwise.
32
- keep_obs: Whether .obs columns in the input AnnData should be kept in the output pseudobulk AnnData. Only .obs columns with the same value for
33
- each cell of one perturbation are kept.
33
+ keep_obs: Whether .obs columns in the input AnnData should be kept in the output pseudobulk AnnData.
34
+ Only .obs columns with the same value for each cell of one perturbation are kept.
34
35
 
35
36
  Returns:
36
37
  AnnData object with one observation per perturbation, storing the embedding data of the
@@ -170,10 +171,15 @@ class PseudobulkSpace(PerturbationSpace):
170
171
  if mode in ps_adata.layers:
171
172
  ps_adata.X = ps_adata.layers[mode]
172
173
 
173
- for col in original_obs.columns:
174
- if col not in ps_adata.obs.columns:
175
- grouped_values = original_obs.groupby(grouping_cols)[col].first()
176
- ps_adata.obs[col] = grouped_values.reindex(ps_adata.obs.index).values
174
+ missing_cols = [col for col in original_obs.columns if col not in ps_adata.obs.columns]
175
+ new_cols_data = {}
176
+
177
+ for col in missing_cols:
178
+ grouped_values = original_obs.groupby(grouping_cols, observed=False)[col].first()
179
+ new_cols_data[col] = grouped_values.reindex(ps_adata.obs.index).values
180
+
181
+ if new_cols_data:
182
+ ps_adata.obs = pd.concat([ps_adata.obs, pd.DataFrame(new_cols_data, index=ps_adata.obs.index)], axis=1)
177
183
 
178
184
  ps_adata.obs[target_col] = ps_adata.obs[target_col].astype("category")
179
185
 
@@ -4,7 +4,8 @@ import flax.linen as nn
4
4
  import jax.numpy as jnp
5
5
  import numpyro.distributions as dist
6
6
  from scvi import REGISTRY_KEYS
7
- from scvi.module.base import JaxBaseModuleClass, LossOutput, flax_configure
7
+ from scvi.module._jaxvae import LossOutput
8
+ from scvi.module.base import JaxBaseModuleClass, flax_configure
8
9
 
9
10
  from ._base_components import FlaxDecoder, FlaxEncoder
10
11
 
pertpy/tools/core.py ADDED
@@ -0,0 +1,18 @@
1
+ import numpy as np
2
+ from scipy import sparse
3
+
4
+
5
+ def _is_raw_counts(X: np.ndarray | sparse.spmatrix) -> bool:
6
+ """Check if data appears to be raw counts."""
7
+ if sparse.issparse(X):
8
+ sample = X[:1000, :1000] if X.shape[0] > 1000 else X
9
+ data = sample.data
10
+ else:
11
+ sample = X[:1000, :1000] if X.shape[0] > 1000 else X
12
+ data = sample.ravel()
13
+
14
+ non_zero_data = data[data > 0]
15
+ if len(non_zero_data) == 0:
16
+ return True
17
+
18
+ return np.all(data >= 0) and np.all(data == np.round(data))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pertpy
3
- Version: 1.0.1
3
+ Version: 1.0.3
4
4
  Summary: Perturbation Analysis in the scverse ecosystem.
5
5
  Project-URL: Documentation, https://pertpy.readthedocs.io
6
6
  Project-URL: Source, https://github.com/scverse/pertpy
@@ -50,8 +50,11 @@ Requires-Dist: adjusttext
50
50
  Requires-Dist: arviz
51
51
  Requires-Dist: blitzgsea
52
52
  Requires-Dist: fast-array-utils[accel,sparse]
53
+ Requires-Dist: flax
54
+ Requires-Dist: funsor
53
55
  Requires-Dist: lamin-utils
54
56
  Requires-Dist: mudata
57
+ Requires-Dist: numpyro
55
58
  Requires-Dist: openpyxl
56
59
  Requires-Dist: ott-jax
57
60
  Requires-Dist: pubchempy
@@ -61,8 +64,15 @@ Requires-Dist: rich
61
64
  Requires-Dist: scanpy
62
65
  Requires-Dist: scikit-learn>=1.4
63
66
  Requires-Dist: scikit-misc
64
- Requires-Dist: scvi-tools
65
67
  Requires-Dist: sparsecca
68
+ Provides-Extra: all
69
+ Requires-Dist: ete4; extra == 'all'
70
+ Requires-Dist: formulaic; extra == 'all'
71
+ Requires-Dist: formulaic-contrasts>=0.2.0; extra == 'all'
72
+ Requires-Dist: pydeseq2>=v0.5.0; extra == 'all'
73
+ Requires-Dist: pyqt6; extra == 'all'
74
+ Requires-Dist: scvi-tools[jax]; extra == 'all'
75
+ Requires-Dist: toytree>=3.0; extra == 'all'
66
76
  Provides-Extra: de
67
77
  Requires-Dist: formulaic; extra == 'de'
68
78
  Requires-Dist: formulaic-contrasts>=0.2.0; extra == 'de'
@@ -90,6 +100,8 @@ Requires-Dist: sphinx-remove-toctrees; extra == 'doc'
90
100
  Requires-Dist: sphinx>=8.1; extra == 'doc'
91
101
  Requires-Dist: sphinxcontrib-bibtex>=1.0.0; extra == 'doc'
92
102
  Requires-Dist: sphinxext-opengraph; extra == 'doc'
103
+ Provides-Extra: scgen
104
+ Requires-Dist: scvi-tools[jax]; extra == 'scgen'
93
105
  Provides-Extra: tcoda
94
106
  Requires-Dist: ete4; extra == 'tcoda'
95
107
  Requires-Dist: pyqt6; extra == 'tcoda'
@@ -1,34 +1,35 @@
1
- pertpy/__init__.py,sha256=R-RrfgZrhMfn7G60kmTDN88ECqS90AyY9Ed5615hQEg,972
1
+ pertpy/__init__.py,sha256=hrz1ULRH4dscWdjRR-qELR8RJAGHCsOGcQswOodD8Z8,972
2
2
  pertpy/_doc.py,sha256=j5TMNC-DA9yIMqIIUNpjpcVgWfRqyBBfvbRjnCM_OLs,427
3
3
  pertpy/_types.py,sha256=IcHCojCUqx8CapibNkcYf2TUqjBFP2ujeELvn_IBSBQ,154
4
4
  pertpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  pertpy/data/__init__.py,sha256=ah3yvoxkgbdMUNAWxS3SyqcUuVamBOSeuWkF2QRAEwM,2703
6
- pertpy/data/_dataloader.py,sha256=Cb08iJj7vH-VishU4NJ5nzPPgviFLY1f5p3K4eVvTeg,4679
7
- pertpy/data/_datasets.py,sha256=4IceyYURpstZSFRrD6gBjoYg8uRbEPo1QLXTt-SwB5k,65507
6
+ pertpy/data/_dataloader.py,sha256=1xiux3_eb4-0ZeirM0L7VAhTg_Tos0t_d8oBLIBTCrs,4679
7
+ pertpy/data/_datasets.py,sha256=5HF7k2snJFUveidgRdLeaiane43FI2OAgwB6gl2Vp8Q,66301
8
8
  pertpy/metadata/__init__.py,sha256=wROPCXmJX2v5schJaBTPQtGW-FGCNWPfO_6bpnXwk-c,276
9
- pertpy/metadata/_cell_line.py,sha256=hKmaZvjIsQ3wHo__0aKo3JlWvsf8-4OD-gIBNQnW8_E,42716
9
+ pertpy/metadata/_cell_line.py,sha256=dtHjyFPtVzA31fib3IdURCBbsHDjbKyGDrJo9veSEU8,42854
10
10
  pertpy/metadata/_compound.py,sha256=JsAv_KCcNkgVVrXTyhu-BeM8rBX8a93Wq5Z6avpxN7Y,4764
11
- pertpy/metadata/_drug.py,sha256=8QDSyxiFl25JdS80EQJC_krg6fEe5LIQEE6BsV1r8nY,9006
11
+ pertpy/metadata/_drug.py,sha256=vfd6I3a9nc7vvB4Z4KVgdBIFMyCPdsQ8-cqO46b_2sA,9062
12
12
  pertpy/metadata/_look_up.py,sha256=0nrI_xy-qBZ3tyt4dwhEBwm0A9WP95ZaDiUQFf_88FU,28663
13
13
  pertpy/metadata/_metadata.py,sha256=hzaLHRyf6YtEMdkZ7_fqTvnlYhSmjQINHz42FqVYrSU,2805
14
14
  pertpy/metadata/_moa.py,sha256=kMpjqReu-WV_tbVJLrKe7gc-WyGkkEX-59V-ZUY3X5g,4536
15
15
  pertpy/plot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  pertpy/preprocessing/__init__.py,sha256=VAPFaeq2_qCvdFkQTCj_Hm460HC4Tersu8Rig_tnp_Y,71
17
- pertpy/preprocessing/_guide_rna.py,sha256=ijL-bjQ-9qn4r3DlhBxzsqk-bD4RqPsFlok-Otj4hg8,15872
18
- pertpy/preprocessing/_guide_rna_mixture.py,sha256=pT_YkjmN4iEJ-THBROu_dpbr8E6u8GJw36YoGseikD0,6422
19
- pertpy/tools/__init__.py,sha256=oOhB99SZBx1XUohaqXV7T_hZoN6xf-WMOpqgvw5gn1I,2073
20
- pertpy/tools/_augur.py,sha256=tc1YKyc0BwzrEGgctsfyy7DsTNKxyvy7ZvWraTWCc1A,55262
17
+ pertpy/preprocessing/_guide_rna.py,sha256=eJ4ARuVsNJ3t3TFXeHGjbbd3UxBAwomPDR1gGlL-3yo,16107
18
+ pertpy/preprocessing/_guide_rna_mixture.py,sha256=tLFcgeNOe5K6dNUzXN2rJ4JzYW0d6q9sjEHpULB04FI,6799
19
+ pertpy/tools/__init__.py,sha256=kIYPSixvRYqprWnS09JCS2gJXd822tmbZP1xQDcyWzs,2387
20
+ pertpy/tools/_augur.py,sha256=8DPFLPoP-CTJC8ODCadhCIybEaSgp-XnqtfzUMDOGr0,56138
21
21
  pertpy/tools/_cinemaot.py,sha256=54-rS0AEj31dMe7iU4kEmLoAunq3jNuhsBE3IEp9hrI,38071
22
22
  pertpy/tools/_dialogue.py,sha256=xWW5XiQUEHTvB7WURzndmm-EF4EhLeEnOV_-7NP6heU,52360
23
23
  pertpy/tools/_enrichment.py,sha256=55mwotLH9DXQOhl85MCkxXu-MX0RysLyrPheJysAnF0,21369
24
24
  pertpy/tools/_milo.py,sha256=PfLgEsYa5i35j25BNgGEkXk9UPM-ZhFxQbEWDA1e_fc,48192
25
- pertpy/tools/_mixscape.py,sha256=HfrpBeRlxHXaOpZkF2FmX7dg35kUB1rL0_-n2aSi2_0,57905
25
+ pertpy/tools/_mixscape.py,sha256=uL6iotgBc5qcmUamhTg4iirp7GxPKqyJurVzKTN2wuU,58413
26
+ pertpy/tools/core.py,sha256=hr4aIPJlWy4Q0rJXPghNGwhwpjyQRz9tUnVprf792JM,526
26
27
  pertpy/tools/decoupler_LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
27
28
  pertpy/tools/transferlearning_MMD_LICENSE,sha256=MUvDA-o_j9htRpI8fStVdCRuyLdPkQUuIH0a_EIc57w,1069
28
29
  pertpy/tools/_coda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
30
  pertpy/tools/_coda/_base_coda.py,sha256=2YIB7rVf9CxwYyQCpC8e3VYCxfurvyAqUs-4qJ5pubg,111817
30
- pertpy/tools/_coda/_sccoda.py,sha256=FaXn20K4ROYtbrZop_dWRokfwX0vlCizKV02V3Cf7zo,24611
31
- pertpy/tools/_coda/_tasccoda.py,sha256=BTaOAmL458zQ_og3x4ENlDnJHD6_F4YkdCoXWsF4i1U,30465
31
+ pertpy/tools/_coda/_sccoda.py,sha256=TRNJhY5IonCMsyvnGwRBK8w8fYqPH_hjWiT7zL25RiI,22948
32
+ pertpy/tools/_coda/_tasccoda.py,sha256=AdJTtBBFj5fUBKUSmbuu67nkFSO2cVp53Lyt7t-HBlE,30866
32
33
  pertpy/tools/_differential_gene_expression/__init__.py,sha256=8_u7nsHY5GfFITT0Rs3v1p1vXpsGIWcBzwipuhXM3Ww,1653
33
34
  pertpy/tools/_differential_gene_expression/_base.py,sha256=GbBi8o7rTA3wH5DZJ9C1QzfqB5yak4r3xMvKQrizsTY,38274
34
35
  pertpy/tools/_differential_gene_expression/_checks.py,sha256=hH_GP0lWGO-5zrCFX4YiIVCZBCuK0ZJ0jFmdlx2Qm4k,1639
@@ -42,17 +43,17 @@ pertpy/tools/_distances/_distance_tests.py,sha256=wDDRkM-WmcfT5m5Zat-3ianGU1aC6H
42
43
  pertpy/tools/_distances/_distances.py,sha256=iJNqMc9CxgZfEMHcxIocKGc4X4S2dJsRy3YerxVnFKo,51003
43
44
  pertpy/tools/_perturbation_space/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
45
  pertpy/tools/_perturbation_space/_clustering.py,sha256=pNx_SpPkZfCbgF7vzHWqAaiiHdbxPaA-L-hTWTbzFhI,3528
45
- pertpy/tools/_perturbation_space/_comparison.py,sha256=-NzCPRT-IlhJ9hOz7NQLSk0riIzr2C0yZvX6zm3kon4,4291
46
- pertpy/tools/_perturbation_space/_discriminator_classifiers.py,sha256=ARdNatcmsz370CF-PexDHPwUrih7KW4A5URzHVDNrcw,23126
46
+ pertpy/tools/_perturbation_space/_comparison.py,sha256=2sxlnHu-kEn8jApl8uZ8AIwV_gAnIf7SmuOjLaN0kgw,4291
47
+ pertpy/tools/_perturbation_space/_discriminator_classifiers.py,sha256=4nX_PwQp3JvWPeN8FADaukPfNF87Bn1r2IvZKCy3n8I,20076
47
48
  pertpy/tools/_perturbation_space/_metrics.py,sha256=y8-baP8WRdB1iDgvP3uuQxSCDxA2lcxvEHHM2C_vWHY,3248
48
- pertpy/tools/_perturbation_space/_perturbation_space.py,sha256=Vyh15wWw9dcu2YUWhziQd2mA9-4IY8EC5dzkBT9HaIo,19457
49
- pertpy/tools/_perturbation_space/_simple.py,sha256=xS7Lrq3RzJC8IgVKKs2Utqbs7iJ5L1DANquCRcS3Fhg,13109
49
+ pertpy/tools/_perturbation_space/_perturbation_space.py,sha256=xqSC_jLzsIl4Y_uxVJX7-m3z2HWy5ZVPOAmWMno1xoQ,19677
50
+ pertpy/tools/_perturbation_space/_simple.py,sha256=8qq1skSnsvxkV9sRgDip-E-_suy2dAs7Fgu9JgHeCkQ,13349
50
51
  pertpy/tools/_scgen/__init__.py,sha256=uERFlFyF88TH0uLiwmsUGEfHfLVCiZMFuk8gO5f7164,45
51
52
  pertpy/tools/_scgen/_base_components.py,sha256=Qq8myRUm43q9XBrZ9gBggfa2cSV2wbz_KYoLgH7iF1A,3009
52
53
  pertpy/tools/_scgen/_scgen.py,sha256=AQNGsDe-9HEqli3oq7UBDg68ofLCoXm-R_jnLFQ-rlc,30856
53
- pertpy/tools/_scgen/_scgenvae.py,sha256=bPk4v7EdJc7ROdLuDitHiX_Pvwa7Flw2qHRUwBvjLJY,3889
54
+ pertpy/tools/_scgen/_scgenvae.py,sha256=L6Jfssqo7eNoZPTk4560XIU_ocvhoCpQJFb0DqWC-Nc,3920
54
55
  pertpy/tools/_scgen/_utils.py,sha256=qz5QUn_Bvk2NGyYVzp3jgjWTFOMt1YyHwUo6HWtoThY,2871
55
- pertpy-1.0.1.dist-info/METADATA,sha256=U9XINrPTrqx9UfLIsUt1X9p6LQLvNSV89GGAZnEHnks,8939
56
- pertpy-1.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
- pertpy-1.0.1.dist-info/licenses/LICENSE,sha256=XuiT2hxeRInhquEIBKMZ5M21n5syhDQ4XbABoposIAg,1100
58
- pertpy-1.0.1.dist-info/RECORD,,
56
+ pertpy-1.0.3.dist-info/METADATA,sha256=vPEEe65P5kDErs7u0hByiNenDuPG15uqpkYIXhw4hGA,9380
57
+ pertpy-1.0.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
58
+ pertpy-1.0.3.dist-info/licenses/LICENSE,sha256=XuiT2hxeRInhquEIBKMZ5M21n5syhDQ4XbABoposIAg,1100
59
+ pertpy-1.0.3.dist-info/RECORD,,
File without changes