pertpy 0.7.0__py3-none-any.whl → 0.8.0__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 (56) hide show
  1. pertpy/__init__.py +2 -1
  2. pertpy/data/__init__.py +61 -0
  3. pertpy/data/_dataloader.py +27 -23
  4. pertpy/data/_datasets.py +58 -0
  5. pertpy/metadata/__init__.py +2 -0
  6. pertpy/metadata/_cell_line.py +39 -70
  7. pertpy/metadata/_compound.py +3 -4
  8. pertpy/metadata/_drug.py +2 -6
  9. pertpy/metadata/_look_up.py +38 -51
  10. pertpy/metadata/_metadata.py +7 -10
  11. pertpy/metadata/_moa.py +2 -6
  12. pertpy/plot/__init__.py +0 -5
  13. pertpy/preprocessing/__init__.py +2 -0
  14. pertpy/preprocessing/_guide_rna.py +2 -3
  15. pertpy/tools/__init__.py +42 -4
  16. pertpy/tools/_augur.py +14 -15
  17. pertpy/tools/_cinemaot.py +2 -2
  18. pertpy/tools/_coda/_base_coda.py +118 -142
  19. pertpy/tools/_coda/_sccoda.py +16 -15
  20. pertpy/tools/_coda/_tasccoda.py +21 -22
  21. pertpy/tools/_dialogue.py +18 -23
  22. pertpy/tools/_differential_gene_expression/__init__.py +20 -0
  23. pertpy/tools/_differential_gene_expression/_base.py +657 -0
  24. pertpy/tools/_differential_gene_expression/_checks.py +41 -0
  25. pertpy/tools/_differential_gene_expression/_dge_comparison.py +86 -0
  26. pertpy/tools/_differential_gene_expression/_edger.py +125 -0
  27. pertpy/tools/_differential_gene_expression/_formulaic.py +189 -0
  28. pertpy/tools/_differential_gene_expression/_pydeseq2.py +95 -0
  29. pertpy/tools/_differential_gene_expression/_simple_tests.py +162 -0
  30. pertpy/tools/_differential_gene_expression/_statsmodels.py +72 -0
  31. pertpy/tools/_distances/_distance_tests.py +21 -16
  32. pertpy/tools/_distances/_distances.py +406 -70
  33. pertpy/tools/_enrichment.py +10 -15
  34. pertpy/tools/_kernel_pca.py +1 -1
  35. pertpy/tools/_milo.py +76 -53
  36. pertpy/tools/_mixscape.py +15 -11
  37. pertpy/tools/_perturbation_space/_clustering.py +5 -2
  38. pertpy/tools/_perturbation_space/_comparison.py +112 -0
  39. pertpy/tools/_perturbation_space/_discriminator_classifiers.py +20 -22
  40. pertpy/tools/_perturbation_space/_perturbation_space.py +23 -21
  41. pertpy/tools/_perturbation_space/_simple.py +3 -3
  42. pertpy/tools/_scgen/__init__.py +1 -1
  43. pertpy/tools/_scgen/_base_components.py +2 -3
  44. pertpy/tools/_scgen/_scgen.py +33 -28
  45. pertpy/tools/_scgen/_utils.py +2 -2
  46. {pertpy-0.7.0.dist-info → pertpy-0.8.0.dist-info}/METADATA +22 -13
  47. pertpy-0.8.0.dist-info/RECORD +57 -0
  48. {pertpy-0.7.0.dist-info → pertpy-0.8.0.dist-info}/WHEEL +1 -1
  49. pertpy/plot/_augur.py +0 -171
  50. pertpy/plot/_coda.py +0 -601
  51. pertpy/plot/_guide_rna.py +0 -64
  52. pertpy/plot/_milopy.py +0 -209
  53. pertpy/plot/_mixscape.py +0 -355
  54. pertpy/tools/_differential_gene_expression.py +0 -325
  55. pertpy-0.7.0.dist-info/RECORD +0 -53
  56. {pertpy-0.7.0.dist-info → pertpy-0.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,325 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING, Literal
4
-
5
- import decoupler as dc
6
- import numpy as np
7
- import numpy.typing as npt
8
- import pandas as pd
9
- from scipy.stats import kendalltau, pearsonr, spearmanr
10
- from statsmodels.stats.multitest import fdrcorrection
11
-
12
- if TYPE_CHECKING:
13
- from anndata import AnnData
14
-
15
-
16
- class DifferentialGeneExpression:
17
- """Support for differential gene expression for scverse."""
18
-
19
- def get_pseudobulk(
20
- self,
21
- adata: AnnData,
22
- sample_col: str,
23
- groups_col: str,
24
- obs: pd.DataFrame = None,
25
- layer: str = None,
26
- use_raw: bool = False,
27
- mode: str = "sum",
28
- min_cells=10,
29
- min_counts: int = 1000,
30
- dtype: npt.DTypeLike = np.float32,
31
- skip_checks: bool = False,
32
- ) -> AnnData:
33
- """Summarizes expression profiles across cells per sample and group.
34
-
35
- Generates summarized expression profiles across cells per sample (e.g. sample id) and group (e.g. cell type) based on the metadata found in .obs.
36
- To ensure a minimum quality control, this function removes genes that are not expressed enough across cells (min_prop) or samples (min_smpls),
37
- and samples with not enough cells (min_cells) or gene counts (min_counts).
38
-
39
- By default this function expects raw integer counts as input and sums them per sample and group (mode='sum'), but other modes are available.
40
-
41
- This function produces some quality control metrics to assess if is necessary to filter some samples.
42
- The number of cells that belong to each sample is stored in `.obs['psbulk_n_cells']`,
43
- the total sum of counts per sample in .obs['psbulk_counts'], and the proportion of cells that express a given gene in `.layers[‘psbulk_props’]`.
44
-
45
- Wraps decoupler's `get_pseudobulk` function.
46
- See: https://decoupler-py.readthedocs.io/en/latest/generated/decoupler.get_pseudobulk.html#decoupler.get_pseudobulk
47
- for more details.
48
-
49
- Args:
50
- adata: Input AnnData object.
51
- sample_col: Column of obs where to extract the samples names.
52
- groups_col: Column of obs where to extract the groups names.
53
- obs: If provided, metadata DataFrame.
54
- layer: If provided, which layer to use.
55
- use_raw: Use raw attribute of the AnnData object if present.
56
- mode: How to perform the pseudobulk.
57
- Available options are 'sum', 'mean' or 'median'. Also accepts callback functions to perform custom aggregations.
58
- Additionally, it is also possible to provide a dictionary of different callback functions, each one stored in a different resulting `.layer`.
59
- In this case, the result of the first callback function of the dictionary is stored in .X by default.
60
- min_cells: Filter to remove samples by a minimum number of cells in a sample-group pair.
61
- min_counts: Filter to remove samples by a minimum number of summed counts in a sample-group pair.
62
- dtype: Type of float used.
63
- skip_checks: Whether to skip input checks.
64
- Set to True when working with positive and negative data, or when counts are not integers.
65
-
66
- Returns:
67
- Returns new AnnData object with unormalized pseudobulk profiles per sample and group.
68
- """
69
- pseudobulk_adata = dc.get_pseudobulk(
70
- adata,
71
- sample_col=sample_col,
72
- groups_col=groups_col,
73
- obs=obs,
74
- layer=layer,
75
- use_raw=use_raw,
76
- mode=mode,
77
- min_counts=min_counts,
78
- dtype=dtype,
79
- min_cells=min_cells,
80
- skip_checks=skip_checks,
81
- )
82
-
83
- return pseudobulk_adata
84
-
85
- def filter_by_expr(
86
- self,
87
- adata: AnnData,
88
- obs: pd.DataFrame = None,
89
- group: str | None = None,
90
- lib_size: int | float | None = None,
91
- min_count: int = 10,
92
- min_total_count: int = 15,
93
- large_n: int = 10,
94
- min_prop: float = 0.7,
95
- ) -> AnnData:
96
- """Filter AnnData by which genes have sufficiently large counts to be retained in a statistical analysis.
97
-
98
- Wraps decoupler's `filter_by_expr` function.
99
- See https://decoupler-py.readthedocs.io/en/latest/generated/decoupler.filter_by_expr.html#decoupler.filter_by_expr
100
- for more details.
101
-
102
- Args:
103
- adata: AnnData obtained after running `get_pseudobulk`.
104
- obs: Metadata dataframe, only needed if `adata` is not an `AnnData`.
105
- group: Name of the `.obs` column to group by. If None, assumes all samples belong to one group.
106
- lib_size: Library size. Defaults to the sum of reads per sample if None.
107
- min_count: Minimum count required per gene for at least some samples.
108
- min_total_count: Minimum total count required per gene across all samples.
109
- large_n: Number of samples per group considered to be "large".
110
- min_prop: Minimum proportion of samples in the smallest group that express the gene.
111
-
112
- Returns:
113
- AnnData with only the genes that are to be kept.
114
- """
115
- genes = dc.filter_by_expr(
116
- adata=adata,
117
- obs=obs,
118
- group=group,
119
- lib_size=lib_size,
120
- min_count=min_count,
121
- min_total_count=min_total_count,
122
- large_n=large_n,
123
- min_prop=min_prop,
124
- )
125
- filtered_adata = adata[:, genes].copy()
126
-
127
- return filtered_adata
128
-
129
- def filter_by_prop(self, adata: AnnData, min_prop: float = 0.2, min_samples: int = 2) -> AnnData:
130
- """Determine which genes are expressed in a sufficient proportion of cells across samples.
131
-
132
- This function selects genes that are sufficiently expressed across cells in each sample and that this condition
133
- is met across a minimum number of samples.
134
-
135
- Args:
136
- adata: AnnData obtained after running `get_pseudobulk`. It requieres `.layer['psbulk_props']`.
137
- min_prop: Minimum proportion of cells that express a gene in a sample.
138
- min_samples: Minimum number of samples with bigger or equal proportion of cells with expression than `min_prop`.
139
-
140
- Returns:
141
- AnnData with only the genes that are to be kept.
142
- """
143
- genes = dc.filter_by_prop(adata=adata, min_prop=min_prop, min_smpls=min_samples)
144
- filtered_adata = adata[:, genes].copy()
145
-
146
- return filtered_adata
147
-
148
- def calculate_correlation(
149
- self,
150
- de_res_1: pd.DataFrame,
151
- de_res_2: pd.DataFrame,
152
- method: Literal["spearman", "pearson", "kendall-tau"] = "spearman",
153
- ) -> pd.DataFrame:
154
- """Calculate the Spearman correlation coefficient for 'pvals_adj' and 'logfoldchanges' columns.
155
-
156
- Args:
157
- de_res_1: A DataFrame with DE result columns.
158
- de_res_2: Another DataFrame with the same DE result columns.
159
- method: The correlation method to apply. One of `spearman`, `pearson`, `kendall-tau`.
160
- Defaults to `spearman`.
161
-
162
- Returns:
163
- A DataFrame with the Spearman correlation coefficients for 'pvals_adj' and 'logfoldchanges'.
164
- """
165
- columns_of_interest = ["pvals_adj", "logfoldchanges"]
166
- correlation_data = {}
167
- for col in columns_of_interest:
168
- match method:
169
- case "spearman":
170
- correlation, _ = spearmanr(de_res_1[col], de_res_2[col])
171
- case "pearson":
172
- correlation, _ = pearsonr(de_res_1[col], de_res_2[col])
173
- case "kendall-tau":
174
- correlation, _ = kendalltau(de_res_1[col], de_res_2[col])
175
- case _:
176
- raise ValueError("Unknown correlation method.")
177
- correlation_data[col] = correlation
178
-
179
- return pd.DataFrame([correlation_data], columns=columns_of_interest)
180
-
181
- def calculate_jaccard_index(self, de_res_1: pd.DataFrame, de_res_2: pd.DataFrame, threshold: float = 0.05) -> float:
182
- """Calculate the Jaccard index for sets of significantly expressed genes/features based on a p-value threshold.
183
-
184
- Args:
185
- de_res_1: A DataFrame with DE result columns, including 'pvals'.
186
- de_res_2: Another DataFrame with the same DE result columns.
187
- threshold: A threshold for determining significant expression (default is 0.05).
188
-
189
- Returns:
190
- The Jaccard index.
191
- """
192
- significant_set_1 = set(de_res_1[de_res_1["pvals"] <= threshold].index)
193
- significant_set_2 = set(de_res_2[de_res_2["pvals"] <= threshold].index)
194
-
195
- intersection = significant_set_1.intersection(significant_set_2)
196
- union = significant_set_1.union(significant_set_2)
197
-
198
- return len(intersection) / len(union) if union else 0
199
-
200
- def calculate_cohens_d(self, de_res_1: pd.DataFrame, de_res_2: pd.DataFrame) -> pd.Series:
201
- """Calculate Cohen's D for the logfoldchanges.
202
-
203
- Args:
204
- de_res_1: A DataFrame with DE result columns, including 'logfoldchanges'.
205
- de_res_2: Another DataFrame with the same DE result columns.
206
-
207
- Returns:
208
- A pandas Series containing Cohen's D for each gene/feature.
209
- """
210
- means_1 = de_res_1["logfoldchanges"].mean()
211
- means_2 = de_res_2["logfoldchanges"].mean()
212
- sd_1 = de_res_1["logfoldchanges"].std()
213
- sd_2 = de_res_2["logfoldchanges"].std()
214
-
215
- pooled_sd = np.sqrt((sd_1**2 + sd_2**2) / 2)
216
- cohens_d = (means_1 - means_2) / pooled_sd
217
-
218
- return cohens_d
219
-
220
- def de_res_to_anndata(
221
- self,
222
- adata: AnnData,
223
- de_res: pd.DataFrame,
224
- *,
225
- groupby: str,
226
- gene_id_col: str = "gene_symbols",
227
- score_col: str = "scores",
228
- pval_col: str = "pvals",
229
- pval_adj_col: str | None = "pvals_adj",
230
- lfc_col: str = "logfoldchanges",
231
- key_added: str = "rank_genes_groups",
232
- ) -> None:
233
- """Add tabular differential expression result to AnnData as if it was produced by `scanpy.tl.rank_genes_groups`.
234
-
235
- Args:
236
- adata:
237
- Annotated data matrix
238
- de_res:
239
- Tablular de result
240
- groupby:
241
- Column in `de_res` that indicates the group. This column must also exist in `adata.obs`.
242
- gene_id_col:
243
- Column in `de_res` that holds the gene identifiers
244
- score_col:
245
- Column in `de_res` that holds the score (results will be ordered by score).
246
- pval_col:
247
- Column in `de_res` that holds the unadjusted pvalue
248
- pval_adj_col:
249
- Column in `de_res` that holds the adjusted pvalue.
250
- If not specified, the unadjusted pvalues will be FDR-adjusted.
251
- lfc_col:
252
- Column in `de_res` that holds the log fold change
253
- key_added:
254
- Key under which the results will be stored in `adata.uns`
255
- """
256
- if groupby not in adata.obs.columns or groupby not in de_res.columns:
257
- raise ValueError("groupby column must exist in both adata and de_res.")
258
- res_dict = {
259
- "params": {
260
- "groupby": groupby,
261
- "reference": "rest",
262
- "method": "other",
263
- "use_raw": True,
264
- "layer": None,
265
- "corr_method": "other",
266
- },
267
- "names": [],
268
- "scores": [],
269
- "pvals": [],
270
- "pvals_adj": [],
271
- "logfoldchanges": [],
272
- }
273
- df_groupby = de_res.groupby(groupby)
274
- for _, tmp_df in df_groupby:
275
- tmp_df = tmp_df.sort_values(score_col, ascending=False)
276
- res_dict["names"].append(tmp_df[gene_id_col].values) # type: ignore
277
- res_dict["scores"].append(tmp_df[score_col].values) # type: ignore
278
- res_dict["pvals"].append(tmp_df[pval_col].values) # type: ignore
279
- if pval_adj_col is not None:
280
- res_dict["pvals_adj"].append(tmp_df[pval_adj_col].values) # type: ignore
281
- else:
282
- res_dict["pvals_adj"].append(fdrcorrection(tmp_df[pval_col].values)[1]) # type: ignore
283
- res_dict["logfoldchanges"].append(tmp_df[lfc_col].values) # type: ignore
284
-
285
- for key in ["names", "scores", "pvals", "pvals_adj", "logfoldchanges"]:
286
- res_dict[key] = pd.DataFrame(
287
- np.vstack(res_dict[key]).T,
288
- columns=list(df_groupby.groups.keys()),
289
- ).to_records(index=False, column_dtypes="O")
290
- adata.uns[key_added] = res_dict
291
-
292
- def de_analysis(
293
- self,
294
- adata: AnnData,
295
- groupby: str,
296
- method: Literal["t-test", "wilcoxon", "pydeseq2", "deseq2", "edger"],
297
- *formula: str | None,
298
- contrast: str | None,
299
- inplace: bool = True,
300
- key_added: str | None,
301
- ) -> pd.DataFrame:
302
- """Perform differential expression analysis.
303
-
304
- Args:
305
- adata: single-cell or pseudobulk AnnData object
306
- groupby: Column in adata.obs that contains the factor to test, e.g. `treatment`.
307
- For simple statistical tests (t-test, wilcoxon), it is sufficient to specify groupby.
308
- Linear models require to specify a formula.
309
- In that case, the `groupby` column is used to compute the contrast.
310
- method: Which method to use to perform the DE test.
311
- formula: model specification for linear models. E.g. `~ treatment + sex + age`.
312
- MUST contain the factor specified in `groupby`.
313
- contrast: See e.g. https://www.statsmodels.org/devel/contrasts.html for more information.
314
- inplace: if True, save the result in `adata.varm[key_added]`
315
- key_added: Key under which the result is saved in `adata.varm` if inplace is True.
316
- If set to None this defaults to `de_{method}_{groupby}`.
317
- Returns:
318
- Depending on the method a Pandas DataFrame containing at least:
319
- * gene_id
320
- * log2 fold change
321
- * mean expression
322
- * unadjusted p-value
323
- * adjusted p-value
324
- """
325
- raise NotImplementedError
@@ -1,53 +0,0 @@
1
- pertpy/__init__.py,sha256=HI_6a6S0V2YQmRZrlopJ9fxrHVEsBc0GhcX-fZZQCWk,600
2
- pertpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- pertpy/data/__init__.py,sha256=zj4jWyw_Dr6HJvdznQi9QUkZCoFN6vdFRhFF_tw4jts,1275
4
- pertpy/data/_dataloader.py,sha256=UTIFK2pofjO6HJjj1dJRbZiQ04_Sslg0d6ggBRkaTnk,2325
5
- pertpy/data/_datasets.py,sha256=78RQb4lGFhCDQdAwb8p_MYy4ZxFjRhhfAsKkuWMl5EQ,63179
6
- pertpy/metadata/__init__.py,sha256=9FC_FfcpGTsc3j5orjr3USkfsT63REnQBy4r7_VRjco,171
7
- pertpy/metadata/_cell_line.py,sha256=tA17gWp9uY0jn36S5bt5lfc9zU2HC2DxZ6x5jVRUosU,40644
8
- pertpy/metadata/_compound.py,sha256=Y1oaV_Nq4-wDVFPQhenJTjvOlY4HYi8bCxUUN3VNbMc,4861
9
- pertpy/metadata/_drug.py,sha256=q3snazwU_wTLC3Js-9pr_CvfBCRGuFBLlHSFVV-h3ko,9357
10
- pertpy/metadata/_look_up.py,sha256=Tb9BHZVc05aH4Kg2KLcfrgvra8gEV5aBqwAZ433krMc,29476
11
- pertpy/metadata/_metadata.py,sha256=h_m5bjn_DvCOuiie_q_DB6eM9ermJKXSnLJ0i84AGqI,3419
12
- pertpy/metadata/_moa.py,sha256=gLjM59ANqK5Ov-Y-v6COr5Bz4nI2O_LEBfJ2jRpR5U8,4941
13
- pertpy/plot/__init__.py,sha256=ZbOAZMpnnAy8GR8oSXJhuwA3gr9GDqgzx0fEkz0TFaE,257
14
- pertpy/plot/_augur.py,sha256=uHBoKVeNMcQUV23eHX_k3KQ4sa7wJUxn8VYgoGM0XSw,6713
15
- pertpy/plot/_coda.py,sha256=qZfkfFT61pwf-rlOYPwJiYDkx_1DTkT4TfG9fObQWoc,26891
16
- pertpy/plot/_guide_rna.py,sha256=iIjkOus7tftIv01zaCTamSX2q8bHBI8O4dxv6QDRVM0,2702
17
- pertpy/plot/_milopy.py,sha256=LGMJ4UQFAoRXtBC5LrUtskCU3YEQLzGvMOPuxBg1Tak,7414
18
- pertpy/plot/_mixscape.py,sha256=wKsY1efBP9VtQptAq79w5-ODcgzomD3QgW8iOF-5LZY,14862
19
- pertpy/preprocessing/__init__.py,sha256=uja9T469LLYQAGgrTyFa4MudXci6NXnAgOn97FHXcxA,40
20
- pertpy/preprocessing/_guide_rna.py,sha256=9FSu0QCxZujGPxhl-PcU4yRR7ZSGhgg99eJaLmf8hRA,7713
21
- pertpy/tools/__init__.py,sha256=zs_xmmmefEFbOQFMFhh_ds9StyuZ1iiSDdk4qhNlQq4,931
22
- pertpy/tools/_augur.py,sha256=Lws7-oSjSFGRupoloj7yIA3YNvVt_dcjSnQ8_Ctt2u0,55797
23
- pertpy/tools/_cinemaot.py,sha256=EbnucYl-Q3sfPDL9RiA-cXjpGFJYvfF4CaDEkyr7Snc,39501
24
- pertpy/tools/_dialogue.py,sha256=u98h147h2PwhWxFQo8limNmt20e2r5La9-wZvS6tXjo,52143
25
- pertpy/tools/_differential_gene_expression.py,sha256=eqit0SJ_fIpSYRS5grYZxEln_JkpXyng-q3LUw9ArY8,14360
26
- pertpy/tools/_enrichment.py,sha256=U2WY7t--FCQFZsXXBLZYBwF4WO9t5WToWjCGn_-tP6I,21922
27
- pertpy/tools/_kernel_pca.py,sha256=3S1D_wrp4vlHUPiRbCAoRbUyY-rVs112Qh-BZHSmTxE,1578
28
- pertpy/tools/_milo.py,sha256=SxpEjhvn2FOYQcQ56tG9ts8fS2vpp4DsB3V7lr8QHbc,43388
29
- pertpy/tools/_mixscape.py,sha256=5s0BrLsv1uv1tbZkZnNXN2qUzWjxvIuGe2iu9czBIxA,52500
30
- pertpy/tools/decoupler_LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
31
- pertpy/tools/transferlearning_MMD_LICENSE,sha256=MUvDA-o_j9htRpI8fStVdCRuyLdPkQUuIH0a_EIc57w,1069
32
- pertpy/tools/_coda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- pertpy/tools/_coda/_base_coda.py,sha256=L6OEz7PHDve_geS6JdyjMC5fSMNitZ4pYQOyMjSW04E,115262
34
- pertpy/tools/_coda/_sccoda.py,sha256=K_zsU8z_YP1hwJV1Urug4fd7kS-q23eLkcSsX_hxqYg,22849
35
- pertpy/tools/_coda/_tasccoda.py,sha256=xTe89TMtbUkw7WAEAvWzOQsMotdekP3Vs5zhMtB2t6c,31033
36
- pertpy/tools/_distances/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- pertpy/tools/_distances/_distance_tests.py,sha256=aC4zspn4nJ2JRk56c76xTgSxl9znY7QI7zLktwsQ8SY,13604
38
- pertpy/tools/_distances/_distances.py,sha256=_dB9dyqWvg_yJBMJTuruFw5w-CLtQWqol-28KVifPBM,35619
39
- pertpy/tools/_perturbation_space/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- pertpy/tools/_perturbation_space/_clustering.py,sha256=a1p0vzjN9nsmtWXWaKIeR3To3mL-7mzqD3HTTiHCpRk,3470
41
- pertpy/tools/_perturbation_space/_discriminator_classifiers.py,sha256=JYDPJlyqxeFbBqWqXk0el6ClXIwrUIYTye5ehmQvmao,22080
42
- pertpy/tools/_perturbation_space/_metrics.py,sha256=y8-baP8WRdB1iDgvP3uuQxSCDxA2lcxvEHHM2C_vWHY,3248
43
- pertpy/tools/_perturbation_space/_perturbation_space.py,sha256=VwwYjQ8-VfRHp8_97Id320xd3tnvv-wea6iLFkRE0RY,18868
44
- pertpy/tools/_perturbation_space/_simple.py,sha256=37zZweW-50Oa8pTQyC53KyNZQH157HurSc8qXZZt7JA,12681
45
- pertpy/tools/_scgen/__init__.py,sha256=neOj3JEcXxnIvgSMrSuPaUSGl1upo7yQ7K_NXHb8Rb8,45
46
- pertpy/tools/_scgen/_base_components.py,sha256=dIw-_7Z8iCietPF4tnpM7bFHtDksjnaHXwUjp9GoCIQ,2936
47
- pertpy/tools/_scgen/_scgen.py,sha256=qPu_zWCdLvcuOqSDNb2FLzxE5Y1uH0uSbpPGu7kOKks,30705
48
- pertpy/tools/_scgen/_scgenvae.py,sha256=v_6tZ4wY-JjdMH1QVd_wG4_N0PoaqB-FM8zC2JsDu1o,3935
49
- pertpy/tools/_scgen/_utils.py,sha256=y0LGS1OLmIVUBq2ZYySM2Up51o3c08-yjTvUkFb3E0U,2841
50
- pertpy-0.7.0.dist-info/METADATA,sha256=tSfWThb8uxC4jwbO5VfOIikt8DRBpO4UdHdFde0al3w,5782
51
- pertpy-0.7.0.dist-info/WHEEL,sha256=as-1oFTWSeWBgyzh0O_qF439xqBe6AbBgt4MfYe5zwY,87
52
- pertpy-0.7.0.dist-info/licenses/LICENSE,sha256=OZ-ZkXM5CmExJiEMM90b_7dGNNvRpj7kdE-49AnrLuI,1070
53
- pertpy-0.7.0.dist-info/RECORD,,