pertpy 0.7.0__py3-none-any.whl → 0.8.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- pertpy/__init__.py +2 -1
- pertpy/data/__init__.py +61 -0
- pertpy/data/_dataloader.py +27 -23
- pertpy/data/_datasets.py +58 -0
- pertpy/metadata/__init__.py +2 -0
- pertpy/metadata/_cell_line.py +39 -70
- pertpy/metadata/_compound.py +3 -4
- pertpy/metadata/_drug.py +2 -6
- pertpy/metadata/_look_up.py +38 -51
- pertpy/metadata/_metadata.py +7 -10
- pertpy/metadata/_moa.py +2 -6
- pertpy/plot/__init__.py +0 -5
- pertpy/preprocessing/__init__.py +2 -0
- pertpy/preprocessing/_guide_rna.py +2 -3
- pertpy/tools/__init__.py +42 -4
- pertpy/tools/_augur.py +14 -15
- pertpy/tools/_cinemaot.py +2 -2
- pertpy/tools/_coda/_base_coda.py +118 -142
- pertpy/tools/_coda/_sccoda.py +16 -15
- pertpy/tools/_coda/_tasccoda.py +21 -22
- pertpy/tools/_dialogue.py +18 -23
- pertpy/tools/_differential_gene_expression/__init__.py +20 -0
- pertpy/tools/_differential_gene_expression/_base.py +657 -0
- pertpy/tools/_differential_gene_expression/_checks.py +41 -0
- pertpy/tools/_differential_gene_expression/_dge_comparison.py +86 -0
- pertpy/tools/_differential_gene_expression/_edger.py +125 -0
- pertpy/tools/_differential_gene_expression/_formulaic.py +189 -0
- pertpy/tools/_differential_gene_expression/_pydeseq2.py +95 -0
- pertpy/tools/_differential_gene_expression/_simple_tests.py +162 -0
- pertpy/tools/_differential_gene_expression/_statsmodels.py +72 -0
- pertpy/tools/_distances/_distance_tests.py +21 -16
- pertpy/tools/_distances/_distances.py +406 -70
- pertpy/tools/_enrichment.py +10 -15
- pertpy/tools/_kernel_pca.py +1 -1
- pertpy/tools/_milo.py +76 -53
- pertpy/tools/_mixscape.py +15 -11
- pertpy/tools/_perturbation_space/_clustering.py +5 -2
- pertpy/tools/_perturbation_space/_comparison.py +112 -0
- pertpy/tools/_perturbation_space/_discriminator_classifiers.py +20 -22
- pertpy/tools/_perturbation_space/_perturbation_space.py +23 -21
- pertpy/tools/_perturbation_space/_simple.py +3 -3
- pertpy/tools/_scgen/__init__.py +1 -1
- pertpy/tools/_scgen/_base_components.py +2 -3
- pertpy/tools/_scgen/_scgen.py +33 -28
- pertpy/tools/_scgen/_utils.py +2 -2
- {pertpy-0.7.0.dist-info → pertpy-0.8.0.dist-info}/METADATA +22 -13
- pertpy-0.8.0.dist-info/RECORD +57 -0
- {pertpy-0.7.0.dist-info → pertpy-0.8.0.dist-info}/WHEEL +1 -1
- pertpy/plot/_augur.py +0 -171
- pertpy/plot/_coda.py +0 -601
- pertpy/plot/_guide_rna.py +0 -64
- pertpy/plot/_milopy.py +0 -209
- pertpy/plot/_mixscape.py +0 -355
- pertpy/tools/_differential_gene_expression.py +0 -325
- pertpy-0.7.0.dist-info/RECORD +0 -53
- {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
|
pertpy-0.7.0.dist-info/RECORD
DELETED
@@ -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,,
|
File without changes
|