pythonflex 0.3.3__py3-none-any.whl → 0.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.
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import pandas as pd
3
3
  import numpy as np
4
- from .utils import dsave, dload
4
+ from .utils import dsave, dload, normalize_analysis_genes
5
5
  from tqdm import tqdm
6
6
  from .logging_config import log
7
7
  tqdm.pandas()
@@ -68,7 +68,16 @@ def _load_file(filepath, ext):
68
68
  def load_datasets(files, continue_with_common_genes=False):
69
69
  config = dload("config")
70
70
  preprocessing = config["preprocessing"]
71
- use_common_genes = config.get("use_common_genes", True)
71
+ analysis_genes_raw = config.get("analysis_genes", "")
72
+ analysis_genes_missing = (
73
+ analysis_genes_raw is None or str(analysis_genes_raw).strip() == ""
74
+ )
75
+ analysis_genes = normalize_analysis_genes(
76
+ analysis_genes_raw,
77
+ legacy_use_common_genes=(
78
+ config.get("use_common_genes") if analysis_genes_missing else None
79
+ ),
80
+ )
72
81
  data_dict= {}
73
82
 
74
83
  for filename, meta in files.items():
@@ -103,14 +112,16 @@ def load_datasets(files, continue_with_common_genes=False):
103
112
 
104
113
  common_genes = get_common_genes(data_dict)
105
114
 
106
- # Apply common gene filtering only if use_common_genes is True
107
- if use_common_genes and (continue_with_common_genes or use_common_genes):
108
- log.info(f"Applying common gene filtering: {len(common_genes)} genes")
109
- for filename, df in data_dict.items():
110
- if df.index.isin(common_genes).any():
111
- data_dict[filename] = df.loc[common_genes]
112
- elif not use_common_genes:
113
- log.info(f"Skipping common gene filtering (use_common_genes=False). Common genes found: {len(common_genes)}")
115
+ # Apply common gene filtering only when analysis_genes='shared' (or forced by arg)
116
+ if analysis_genes == "shared" or continue_with_common_genes:
117
+ log.info(f"Applying common gene filtering: {len(common_genes)} genes")
118
+ for filename, df in data_dict.items():
119
+ if df.index.isin(common_genes).any():
120
+ data_dict[filename] = df.loc[common_genes]
121
+ else:
122
+ log.info(
123
+ f"Skipping common gene filtering (analysis_genes='dataset_specific'). Common genes found: {len(common_genes)}"
124
+ )
114
125
 
115
126
  dsave({
116
127
  "datasets": data_dict,
@@ -175,7 +186,7 @@ def filter_matrix_by_genes(matrix, genes_present_in_terms):
175
186
  genes = matrix.index.intersection(genes_present_in_terms)
176
187
  matrix = matrix.loc[genes, genes]
177
188
  log.done(f"Filtering matrix: {matrix.shape}")
178
- return matrix.loc[genes, genes]
189
+ return matrix
179
190
 
180
191
 
181
192
 
@@ -185,11 +196,25 @@ def load_gold_standard():
185
196
  package_dir = return_package_dir()
186
197
  data_dir_path = os.path.join(package_dir, 'data')
187
198
 
188
- config = dload("config")
189
- use_common_genes = config.get("use_common_genes", True)
199
+ config = dload("config")
200
+ analysis_genes_raw = config.get("analysis_genes", "")
201
+ analysis_genes_missing = (
202
+ analysis_genes_raw is None or str(analysis_genes_raw).strip() == ""
203
+ )
204
+ analysis_genes = normalize_analysis_genes(
205
+ analysis_genes_raw,
206
+ legacy_use_common_genes=(
207
+ config.get("use_common_genes") if analysis_genes_missing else None
208
+ ),
209
+ )
190
210
 
191
211
  gold_standard_source = config['gold_standard']
192
- log.started(f"Loading gold standard: {gold_standard_source}, Min complex size: {config['min_genes_in_complex']}, Jaccard filtering: {config['jaccard']}, use_common_genes: {use_common_genes}")
212
+ jaccard_enabled = bool(config.get("jaccard", False))
213
+ log.done(
214
+ f"Loading gold standard: {gold_standard_source}, Min complex size: {config['min_genes_in_complex']}, "
215
+ f"Jaccard filtering: {jaccard_enabled} (exact duplicate used_genes after dataset filtering), "
216
+ f"analysis_genes: {analysis_genes}"
217
+ )
193
218
 
194
219
  # Define gold standard file paths for predefined sources
195
220
  gold_standard_files = {
@@ -217,34 +242,12 @@ def load_gold_standard():
217
242
 
218
243
  # Store raw gold standard for later per-dataset filtering
219
244
  terms["all_genes"] = terms["Genes"].apply(lambda x: list(set(x.split(";"))))
220
- log.info(f"Gold standard loaded with {len(terms)} terms")
245
+ log.done(f"Gold standard loaded with {len(terms)} terms")
221
246
 
222
247
  # Basic filtering by minimum complex size (before gene filtering)
223
248
  terms["n_all_genes"] = terms["all_genes"].apply(len)
224
249
  terms = terms[terms["n_all_genes"] >= config['min_genes_in_complex']]
225
- log.info(f"After min_genes_in_complex filtering: {len(terms)} terms")
226
-
227
- if config['jaccard']:
228
- log.info("Applying Jaccard filtering. Remove terms with identical gene sets.")
229
- # Use all genes for jaccard filtering
230
- terms["gene_set"] = terms["all_genes"].map(lambda x: frozenset(x))
231
- grouped = terms.groupby("gene_set", sort=False)
232
- duplicate_clusters = []
233
- for _, group in grouped:
234
- if len(group) > 1:
235
- duplicate_clusters.append(group["ID"].values if "ID" in group.columns else group.index.values)
236
-
237
- keep_ids = set(terms["ID"] if "ID" in terms.columns else terms.index)
238
- for cluster in duplicate_clusters:
239
- sorted_ids = sorted(cluster)
240
- keep_ids.difference_update(sorted_ids[1:])
241
-
242
- if "ID" in terms.columns:
243
- terms = terms[terms["ID"].isin(keep_ids)].copy()
244
- else:
245
- terms = terms[terms.index.isin(keep_ids)].copy()
246
- terms.drop(columns=["gene_set"], inplace=True, errors='ignore')
247
- log.info(f"After Jaccard filtering: {len(terms)} terms")
250
+ log.done(f"After min_genes_in_complex filtering: {len(terms)} terms")
248
251
 
249
252
  # if there is column called "ID", set it as index
250
253
  if "ID" in terms.columns:
@@ -258,31 +261,30 @@ def load_gold_standard():
258
261
 
259
262
 
260
263
 
261
- def filter_duplicate_terms(terms):
262
- log.started("Filtering duplicate terms using optimized method.")
263
-
264
- # Precompute frozen gene sets and hash them
264
+ def filter_duplicate_terms(terms: pd.DataFrame) -> pd.DataFrame:
265
+ """Backward-compatible wrapper for exact-duplicate filtering.
266
+
267
+ This removes exact duplicate `used_genes` sets and keeps the smallest ID.
268
+ """
269
+ log.started("Filtering duplicate terms using exact used_genes sets.")
270
+ before = len(terms)
265
271
  terms = terms.copy()
266
272
  terms["gene_set"] = terms["used_genes"].map(lambda x: frozenset(x))
267
-
268
- # Group by identical gene sets
269
273
  grouped = terms.groupby("gene_set", sort=False)
270
-
271
- # Identify duplicate clusters (groups with >1 term)
272
- duplicate_clusters = []
274
+
275
+ id_values = terms["ID"] if "ID" in terms.columns else terms.index
276
+ keep_ids = set(id_values)
273
277
  for _, group in grouped:
274
- if len(group) > 1:
275
- duplicate_clusters.append(group["ID"].values)
276
-
277
- # Determine which IDs to keep (smallest ID in each duplicate cluster)
278
- keep_ids = set(terms["ID"])
279
- for cluster in duplicate_clusters:
278
+ if len(group) <= 1:
279
+ continue
280
+ cluster = group["ID"].values if "ID" in group.columns else group.index.values
280
281
  sorted_ids = sorted(cluster)
281
- keep_ids.difference_update(sorted_ids[1:]) # Remove all but smallest ID
282
-
283
- # Filter and clean up
284
- filtered = terms[terms["ID"].isin(keep_ids)].copy()
285
- filtered.drop(columns=["gene_set"], inplace=True)
286
-
287
- log.done(f"{len(terms) - len(filtered)} terms removed due to identical gene sets.")
282
+ keep_ids.difference_update(sorted_ids[1:])
283
+
284
+ if "ID" in terms.columns:
285
+ filtered = terms[terms["ID"].isin(keep_ids)].copy()
286
+ else:
287
+ filtered = terms[terms.index.isin(keep_ids)].copy()
288
+ filtered.drop(columns=["gene_set"], inplace=True, errors="ignore")
289
+ log.done(f"{before - len(filtered)} terms removed due to identical gene sets.")
288
290
  return filtered
pythonflex/utils.py CHANGED
@@ -5,12 +5,39 @@ import joblib
5
5
  import numpy as np
6
6
  import pandas as pd
7
7
 
8
+ from .logging_config import log
9
+
8
10
  # Constants
9
11
  TMP_ROOT = ".tmp"
10
- VALID_EXTS = {".parquet", ".npy", ".pkl"} # Removed .feather
11
-
12
- # Helper to sanitize names (make filesystem-safe)
13
- def _sanitize(name):
12
+ VALID_EXTS = {".parquet", ".npy", ".pkl"} # Removed .feather
13
+
14
+ ANALYSIS_GENES_ALIASES = {
15
+ "shared": "shared",
16
+ "common": "shared",
17
+ "dataset_specific": "dataset_specific",
18
+ "dataset": "dataset_specific",
19
+ }
20
+
21
+
22
+ def normalize_analysis_genes(value=None, legacy_use_common_genes=None):
23
+ """Normalize analysis_genes config values while keeping legacy names working."""
24
+ if value is None or str(value).strip() == "":
25
+ if legacy_use_common_genes is not None:
26
+ return "shared" if bool(legacy_use_common_genes) else "dataset_specific"
27
+ value = "shared"
28
+
29
+ key = str(value).strip().lower().replace("-", "_").replace(" ", "_")
30
+ if key not in ANALYSIS_GENES_ALIASES:
31
+ raise ValueError(
32
+ "config['analysis_genes'] must be one of "
33
+ "['shared', 'dataset_specific'] "
34
+ "(legacy aliases ['common', 'dataset'] are also supported), "
35
+ f"got {value!r}"
36
+ )
37
+ return ANALYSIS_GENES_ALIASES[key]
38
+
39
+ # Helper to sanitize names (make filesystem-safe)
40
+ def _sanitize(name):
14
41
  if not name:
15
42
  return "data"
16
43
  # Replace forbidden/problematic chars with '_', collapse multiples, strip edges
@@ -59,7 +86,7 @@ def dload(category, name=None, path=None):
59
86
  dir_path = os.path.join(TMP_ROOT, _sanitize(category))
60
87
 
61
88
  if not os.path.exists(dir_path):
62
- return {}
89
+ return {} if name is None else None
63
90
 
64
91
  if name is None:
65
92
  # Load all in category as dict
@@ -77,7 +104,7 @@ def dload(category, name=None, path=None):
77
104
  elif filename.endswith(".pkl"):
78
105
  out[k] = joblib.load(full_path, mmap_mode="r")
79
106
  except (EOFError, ValueError, OSError):
80
- print(f"Warning: '{full_path}' is corrupted. Skipping...")
107
+ log.warning(f"'{full_path}' is corrupted. Skipping...")
81
108
  os.remove(full_path)
82
109
  return out
83
110
 
@@ -93,9 +120,9 @@ def dload(category, name=None, path=None):
93
120
  elif ext == ".pkl":
94
121
  return joblib.load(target, mmap_mode="r")
95
122
  except (EOFError, ValueError, OSError) as e:
96
- print(f"Warning: '{target}' is corrupted ({e}). Trying next format...")
123
+ log.warning(f"'{target}' is corrupted ({e}). Trying next format...")
97
124
  os.remove(target)
98
125
  continue
99
126
 
100
- print(f"Warning: No valid file found for {category}/{name}")
101
- return {}
127
+ log.warning(f"No valid file found for {category}/{name}")
128
+ return None
@@ -1,8 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythonflex
3
- Version: 0.3.3
3
+ Version: 0.4
4
4
  Summary: pythonFLEX is a benchmarking toolkit for evaluating CRISPR screen results against biological gold standards. The toolkit computes gene-level and complex-level performance metrics, helping researchers systematically assess the biological relevance and resolution of their CRISPR screening data.
5
5
  Author-email: Yasir Demirtaş <tyasird@hotmail.com>
6
+ License-File: LICENSE
6
7
  Classifier: License :: OSI Approved :: MIT License
7
8
  Classifier: Operating System :: OS Independent
8
9
  Classifier: Programming Language :: Python :: 3
@@ -114,6 +115,10 @@ default_config = {
114
115
  "gold_standard": "GOBP",
115
116
  "color_map": "RdYlBu",
116
117
  "jaccard": True,
118
+ # Which genes define the evaluated space:
119
+ # - 'common' : intersect terms with genes common across datasets
120
+ # - 'dataset' : intersect terms with genes present in each dataset
121
+ "analysis_genes": "common",
117
122
  "plotting": {
118
123
  "save_plot": True,
119
124
  "output_type": "png",
@@ -124,7 +129,7 @@ default_config = {
124
129
  },
125
130
  "corr_function": "numpy",
126
131
  "logging": {
127
- "visible_levels": ["DONE","STARTED"] # "PROGRESS", "STARTED", ,"INFO","WARNING"
132
+ "visible_levels": ["DONE","INFO", "WARNING"] # "PROGRESS", "STARTED", ,"INFO","WARNING"
128
133
  }
129
134
  }
130
135
 
@@ -138,7 +143,7 @@ terms, genes_in_terms = flex.load_gold_standard()
138
143
 
139
144
  # Run analysis
140
145
  for name, dataset in data.items():
141
- df, pr_auc = flex.pra(name, dataset)
146
+ df = flex.pra(name, dataset)
142
147
  fpc = flex.pra_percomplex(name, dataset, is_corr=False)
143
148
  cc = flex.complex_contributions(name)
144
149
 
@@ -149,8 +154,8 @@ flex.plot_percomplex_scatter()
149
154
  flex.plot_percomplex_scatter_bysize()
150
155
  flex.plot_significant_complexes()
151
156
  flex.plot_complex_contributions()
157
+ flex.plot_mpr_summary(variants="unfiltered")
152
158
 
153
- # Save Result CSVspyflex.save_results_to_csv()
154
159
  flex.save_results_to_csv()
155
160
 
156
161
 
@@ -0,0 +1,32 @@
1
+ pythonflex/__init__.py,sha256=D3go2UnojWzRAFr8ahjrPwDTR3np__hDHqaAhBqUGHc,2640
2
+ pythonflex/analysis.py,sha256=H164EqsG5ewgshaYQOXUOh5pjF7TcWXGsmQvWzHFT6M,64615
3
+ pythonflex/logging_config.py,sha256=iqRKK18zvtfV_-bYHWrXtSZywiUtYxoHkw0ZnVORQBQ,2015
4
+ pythonflex/old_functions.py,sha256=regtkNGCS3ph0OBssAg8Sg1ivn1-kiRB54Q7xIVeQ4E,19031
5
+ pythonflex/plotting.py,sha256=Ie0F79q-DSkn8YzytjJf2FQthfvY_OWlR3B_sJMpXac,89247
6
+ pythonflex/preprocessing.py,sha256=XwLul6MQN2Gzjg-_JH0I14qklRslO8f6GCoYk3JpWpA,11251
7
+ pythonflex/utils.py,sha256=WqsCEnccNGIEwWuq_r34mIqDBBuu8mkFXW4zPIm0IwA,4665
8
+ pythonflex/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ pythonflex/data/dataset/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ pythonflex/data/dataset/liver_cell_lines_500_genes.csv,sha256=qfKsqPjL41Y1GuxxAhc-MfaNO0mX6Qju_SeynKSpEiM,238639
11
+ pythonflex/data/dataset/melanoma_cell_lines_500_genes.csv,sha256=ByxcaDDqLlRtAyuCKhHeFQCitIBk2-Q4Hn6k8BNUF6c,620887
12
+ pythonflex/data/dataset/neuroblastoma_cell_lines_500_genes.csv,sha256=IxJI8E-smagbxHRvTjvQLZxuu89MuCw8XrReMSsViUI,365992
13
+ pythonflex/data/gold_standard/CORUM.parquet,sha256=AkLiflQAeQ6K3HG-PIdLbZ8vEF9GtNObtlY7TkxHyaw,131858
14
+ pythonflex/data/gold_standard/GOBP.parquet,sha256=YQGhRcHSiN_cMKytCUYNCfcDwYj9L3TLFNwobiS2f3M,1025099
15
+ pythonflex/data/gold_standard/PATHWAY.parquet,sha256=bFRDe3PQ_TFc7B1uZuynwOGcgxESLaOy1Zt5gpQ1Oso,277386
16
+ pythonflex/data/gold_standard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ pythonflex/data/gold_standard/corum.csv,sha256=2rZeyr2Ghm7f-gFxCZnhPtxI2jxRoiZMUEH2EJwAgsI,208889
18
+ pythonflex/data/gold_standard/gobp.csv,sha256=TO9yfx9mO8WkXvWfSB-pFId9T8xYfqdZpshAXC0Fyj8,1739167
19
+ pythonflex/data/gold_standard/pathway.csv,sha256=J3HKVLUZ_Oxucmn_14ieYp3Wr2lcKtp0nIl4_8_K2Yc,489424
20
+ pythonflex/examples/basic_usage.py,sha256=06IPn_yon9DwXefpfb0Fo6uG_5CyRCT_ZCMZSPM-3Ww,2695
21
+ pythonflex/examples/manuscript.py,sha256=AyzycXys9BII4TZFyBi-bXksAWlrTcFZHCdc2gu8D0U,2984
22
+ pythonflex/examples/runtime/runtime_benchmark.py,sha256=kjOELNHzbk8Y-DDe1IPl75R2UNnxfdgxZBR_SDdcQgc,5688
23
+ pythonflex/examples/runtime/runtime_benchmark_10_runs_memmap.py,sha256=kXQ8ycnqmWxbjoEWoyT1DC3O1JWl90tlNvA7KVskfz4,14832
24
+ pythonflex/examples/runtime/runtime_benchmark_corum_njobs.py,sha256=n6ON4cRHuN5y1YU32OH2lsXF-TPNQ4B2635MtwCOXKY,6361
25
+ pythonflex/examples/runtime/runtime_benchmark_gobp_njobs_chunks.py,sha256=sC3cMV8MxFqT8GWFgskkIMx6jz7if6BWWkhC7jip0ks,9130
26
+ pythonflex/examples/runtime/runtime_benchmark_gobp_optimization.py,sha256=1Us2sISWbjaM2hahQ1hG-XSrlTaWzcDnvVQrItHo_ls,11934
27
+ pythonflex/examples/runtime/runtime_benchmark_repeated.py,sha256=6-NV1aLbScdmH13heu6_rROAJk0L1VZ1byO95kMtzX8,9666
28
+ pythonflex-0.4.dist-info/METADATA,sha256=TxzZaLktNrLQvfHu2xcbWPr_nOt7VaHz2sO24BFm7-Q,4463
29
+ pythonflex-0.4.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
30
+ pythonflex-0.4.dist-info/entry_points.txt,sha256=37liK1baI_CRVDivpjsn8JDClL9_YeTTuSMAZ3Ty7oE,47
31
+ pythonflex-0.4.dist-info/licenses/LICENSE,sha256=buBzPy38DV0g95acwIGUqsWZwhbpc0tQXnz6nBhjyS8,1091
32
+ pythonflex-0.4.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.29.0
2
+ Generator: hatchling 1.30.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -0,0 +1,7 @@
1
+ Copyright 2026, Yasir Demirtas, Maximilian Billmann
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,24 +0,0 @@
1
- pythonflex/__init__.py,sha256=MoDbdVhclK_PF_u9vzN4ntWX6hTRAKfvkTiDisIci5o,1748
2
- pythonflex/analysis.py,sha256=gKJ4cYA_TWYe521nAXizMqChd36A90TWfDf595fw_0M,77760
3
- pythonflex/logging_config.py,sha256=iqRKK18zvtfV_-bYHWrXtSZywiUtYxoHkw0ZnVORQBQ,2015
4
- pythonflex/plotting.py,sha256=AOzgyhJX5bPMoGs2ih2zbA30Dm-OoWpk8MNBC-9OQ94,75981
5
- pythonflex/preprocessing.py,sha256=jIeyB2SPPac-svtjB-zGe3vIyOSVB-SxYIFyNFFiCsY,11440
6
- pythonflex/utils.py,sha256=7toGnKbA_TKBtHz1HLk7ckWM0bjuFw_Byhp6ZUJaNs4,3694
7
- pythonflex/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- pythonflex/data/dataset/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- pythonflex/data/dataset/liver_cell_lines_500_genes.csv,sha256=qfKsqPjL41Y1GuxxAhc-MfaNO0mX6Qju_SeynKSpEiM,238639
10
- pythonflex/data/dataset/melanoma_cell_lines_500_genes.csv,sha256=ByxcaDDqLlRtAyuCKhHeFQCitIBk2-Q4Hn6k8BNUF6c,620887
11
- pythonflex/data/dataset/neuroblastoma_cell_lines_500_genes.csv,sha256=IxJI8E-smagbxHRvTjvQLZxuu89MuCw8XrReMSsViUI,365992
12
- pythonflex/data/gold_standard/CORUM.parquet,sha256=AkLiflQAeQ6K3HG-PIdLbZ8vEF9GtNObtlY7TkxHyaw,131858
13
- pythonflex/data/gold_standard/GOBP.parquet,sha256=YQGhRcHSiN_cMKytCUYNCfcDwYj9L3TLFNwobiS2f3M,1025099
14
- pythonflex/data/gold_standard/PATHWAY.parquet,sha256=bFRDe3PQ_TFc7B1uZuynwOGcgxESLaOy1Zt5gpQ1Oso,277386
15
- pythonflex/data/gold_standard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- pythonflex/data/gold_standard/corum.csv,sha256=2rZeyr2Ghm7f-gFxCZnhPtxI2jxRoiZMUEH2EJwAgsI,208889
17
- pythonflex/data/gold_standard/gobp.csv,sha256=TO9yfx9mO8WkXvWfSB-pFId9T8xYfqdZpshAXC0Fyj8,1739167
18
- pythonflex/data/gold_standard/pathway.csv,sha256=J3HKVLUZ_Oxucmn_14ieYp3Wr2lcKtp0nIl4_8_K2Yc,489424
19
- pythonflex/examples/basic_usage.py,sha256=dizQXYPJWjW7-2d2G29a8qYCBRIsKhrvxOxyXtudK30,2265
20
- pythonflex/examples/manuscript.py,sha256=V28vIBFmrxGsE_YhvouRFiLKWC9CorbOx9Ed3B2L8bQ,2810
21
- pythonflex-0.3.3.dist-info/METADATA,sha256=l5CnF5hX_qgnhMEHnTQbK9ZrBJrIRKzbYeCVCC7Wv1M,4226
22
- pythonflex-0.3.3.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
23
- pythonflex-0.3.3.dist-info/entry_points.txt,sha256=37liK1baI_CRVDivpjsn8JDClL9_YeTTuSMAZ3Ty7oE,47
24
- pythonflex-0.3.3.dist-info/RECORD,,