cpgtools 1.12.0__py3-none-any.whl → 2.0.2__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.

Potentially problematic release.


This version of cpgtools might be problematic. Click here for more details.

Files changed (77) hide show
  1. cpgmodule/_version.py +1 -0
  2. cpgmodule/data/__init__.py +0 -0
  3. cpgmodule/methylClock.py +53 -0
  4. cpgmodule/utils.py +38 -1
  5. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/CpG_aggregation.py +1 -1
  6. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/CpG_anno_position.py +1 -1
  7. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/CpG_anno_probe.py +6 -4
  8. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/CpG_density_gene_centered.py +1 -1
  9. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/CpG_distrb_chrom.py +1 -1
  10. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/CpG_distrb_gene_centered.py +1 -1
  11. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/CpG_distrb_region.py +1 -3
  12. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/CpG_logo.py +1 -1
  13. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/CpG_to_gene.py +1 -1
  14. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_PCA.py +31 -23
  15. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_UMAP.py +29 -22
  16. cpgtools-2.0.2.data/scripts/beta_imputation.py +604 -0
  17. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_jitter_plot.py +1 -1
  18. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_m_conversion.py +1 -1
  19. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_profile_gene_centered.py +1 -1
  20. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_profile_region.py +1 -1
  21. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_selectNBest.py +9 -6
  22. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_stacked_barplot.py +1 -1
  23. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_stats.py +1 -1
  24. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_tSNE.py +31 -24
  25. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_topN.py +1 -1
  26. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/beta_trichotmize.py +1 -1
  27. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/dmc_Bayes.py +1 -1
  28. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/dmc_bb.py +1 -1
  29. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/dmc_fisher.py +1 -1
  30. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/dmc_glm.py +1 -1
  31. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/dmc_logit.py +1 -1
  32. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/dmc_nonparametric.py +1 -1
  33. {cpgtools-1.12.0.data → cpgtools-2.0.2.data}/scripts/dmc_ttest.py +3 -3
  34. cpgtools-2.0.2.data/scripts/predict_sex.py +126 -0
  35. cpgtools-2.0.2.dist-info/LICENSE +19 -0
  36. cpgtools-2.0.2.dist-info/METADATA +76 -0
  37. cpgtools-2.0.2.dist-info/RECORD +82 -0
  38. {cpgtools-1.12.0.dist-info → cpgtools-2.0.2.dist-info}/WHEEL +1 -1
  39. cpgtools-2.0.2.dist-info/top_level.txt +3 -0
  40. impyute/__init__.py +3 -0
  41. impyute/contrib/__init__.py +7 -0
  42. impyute/contrib/compare.py +69 -0
  43. impyute/contrib/count_missing.py +30 -0
  44. impyute/contrib/describe.py +63 -0
  45. impyute/cs/__init__.py +11 -0
  46. impyute/cs/buck_iterative.py +82 -0
  47. impyute/cs/central_tendency.py +84 -0
  48. impyute/cs/em.py +52 -0
  49. impyute/cs/fast_knn.py +130 -0
  50. impyute/cs/random.py +27 -0
  51. impyute/dataset/__init__.py +6 -0
  52. impyute/dataset/base.py +137 -0
  53. impyute/dataset/corrupt.py +55 -0
  54. impyute/deletion/__init__.py +5 -0
  55. impyute/deletion/complete_case.py +21 -0
  56. impyute/ops/__init__.py +12 -0
  57. impyute/ops/error.py +9 -0
  58. impyute/ops/inverse_distance_weighting.py +31 -0
  59. impyute/ops/matrix.py +47 -0
  60. impyute/ops/testing.py +20 -0
  61. impyute/ops/util.py +76 -0
  62. impyute/ops/wrapper.py +179 -0
  63. impyute/ts/__init__.py +6 -0
  64. impyute/ts/locf.py +57 -0
  65. impyute/ts/moving_window.py +128 -0
  66. missingpy/__init__.py +4 -0
  67. missingpy/knnimpute.py +328 -0
  68. missingpy/missforest.py +556 -0
  69. missingpy/pairwise_external.py +315 -0
  70. missingpy/tests/__init__.py +0 -0
  71. missingpy/tests/test_knnimpute.py +605 -0
  72. missingpy/tests/test_missforest.py +409 -0
  73. missingpy/utils.py +124 -0
  74. cpgtools-1.12.0.dist-info/LICENSE.txt +0 -674
  75. cpgtools-1.12.0.dist-info/METADATA +0 -30
  76. cpgtools-1.12.0.dist-info/RECORD +0 -43
  77. cpgtools-1.12.0.dist-info/top_level.txt +0 -2
@@ -18,6 +18,7 @@ cg_003 0.845065 0.843957 0.840184 0.824286
18
18
  import sys
19
19
  import numpy as np
20
20
  from optparse import OptionParser
21
+ from cpgmodule._version import __version__
21
22
  from cpgmodule.utils import *
22
23
  import pandas as pd
23
24
 
@@ -28,7 +29,6 @@ __author__ = "Liguo Wang"
28
29
  __copyright__ = "Copyleft"
29
30
  __credits__ = []
30
31
  __license__ = "GPL"
31
- __version__="1.12.0"
32
32
  __maintainer__ = "Liguo Wang"
33
33
  __email__ = "wang.liguo@mayo.edu"
34
34
  __status__ = "Development"
@@ -40,8 +40,8 @@ def main():
40
40
  parser = OptionParser(usage,version="%prog " + __version__)
41
41
  parser.add_option("-i","--input_file",action="store",type="string",dest="input_file",help="Tab-separated data frame file containing beta values with the 1st row containing sample IDs and the 1st column containing CpG IDs.")
42
42
  parser.add_option("-g","--group",action="store",type="string",dest="group_file",help="Comma-separated group file defining the biological groups of each sample.")
43
- parser.add_option("-k","--topK",action="store",type='int', dest="cpg_count", default=100, help="Number of top features to select. default=%default" )
44
- parser.add_option("-s","--score-function",action="store",type='string', dest="score_function", default='chi2', help="Scoring function used to measure the dependency between features scores and labels. Must be \"chisq\" (chi-squared statistic), \"anova\" (ANOVA F-value), or \"mutual_info\" (mutual information). default=%default" )
43
+ parser.add_option("-c","--topK",action="store",type='int', dest="cpg_count", default=100, help="Number of top features to select. default=%default" )
44
+ parser.add_option("-s","--score-function",action="store",type='string', dest="score_function", default='chisq', help="Scoring function used to measure the dependency between features scores and labels. Must be \"chisq\" (chi-squared statistic), \"anova\" (ANOVA F-value), or \"mi\" (mutual information). default=%default" )
45
45
  parser.add_option("-o","--output",action="store",type='string', dest="out_file",help="The prefix of the output file.")
46
46
  (options,args)=parser.parse_args()
47
47
 
@@ -77,7 +77,7 @@ def main():
77
77
 
78
78
  printlog("Reading group file: \"%s\"" % (options.group_file))
79
79
  group = pd.read_csv(options.group_file, index_col=0, header=0,names=['Sample_ID', 'Group_ID'])
80
- a = list(group['Group_ID']) #a is *string labels* for groups: ['Normal', 'Normal', 'Normal', 'Normal', 'Normal', 'Cancer', 'Cancer', 'Cancer', 'Cancer']
80
+ a = pd.Series(list(group['Group_ID'])) #a is *string labels* for groups: ['Normal', 'Normal', 'Normal', 'Normal', 'Normal', 'Cancer', 'Cancer', 'Cancer', 'Cancer']
81
81
  #print (a)
82
82
  y, tmp = pd.factorize(a) #y is *numeric labels* for groups: [0 0 0 0 0 1 1 1 1]
83
83
  #print (np.array(y))
@@ -87,12 +87,15 @@ def main():
87
87
  if options.score_function == 'anova':
88
88
  printlog ("Using ANOVA F value to select features ...")
89
89
  selector = SelectKBest(f_classif, k = options.cpg_count)
90
- elif options.score_function == 'mutual_info':
90
+ elif options.score_function == 'mi':
91
91
  printlog ("Using Mutual Information to select features ...")
92
92
  selector = SelectKBest(mutual_info_classif, k = options.cpg_count)
93
- else:
93
+ elif options.score_function == 'chisq':
94
94
  printlog ("Using Chi Square statistic to select features ...")
95
95
  selector = SelectKBest(chi2, k = options.cpg_count)
96
+ else:
97
+ printlog("Unknown function: %s" % options.score_function)
98
+ sys.exit(0)
96
99
  else:
97
100
  printlog("Doing nothing! '-k' >= the total number of features in \"%s\"" % (options.input_file))
98
101
  sys.exit(0)
@@ -28,6 +28,7 @@ import collections
28
28
  import subprocess
29
29
  import numpy as np
30
30
  from optparse import OptionParser
31
+ from cpgmodule._version import __version__
31
32
  from cpgmodule import ireader
32
33
  from cpgmodule.utils import *
33
34
  from cpgmodule import BED
@@ -37,7 +38,6 @@ __author__ = "Liguo Wang"
37
38
  __copyright__ = "Copyleft"
38
39
  __credits__ = []
39
40
  __license__ = "GPL"
40
- __version__="1.12.0"
41
41
  __maintainer__ = "Liguo Wang"
42
42
  __email__ = "wang.liguo@mayo.edu"
43
43
  __status__ = "Development"
@@ -25,6 +25,7 @@ import collections
25
25
  import subprocess
26
26
  import numpy as np
27
27
  from optparse import OptionParser
28
+ from cpgmodule._version import __version__
28
29
  from cpgmodule import ireader
29
30
  from cpgmodule.utils import *
30
31
  from cpgmodule import BED
@@ -33,7 +34,6 @@ __author__ = "Liguo Wang"
33
34
  __copyright__ = "Copyleft"
34
35
  __credits__ = []
35
36
  __license__ = "GPL"
36
- __version__="1.12.0"
37
37
  __maintainer__ = "Liguo Wang"
38
38
  __email__ = "wang.liguo@mayo.edu"
39
39
  __status__ = "Development"
@@ -33,6 +33,7 @@ import sys
33
33
  import subprocess
34
34
  from optparse import OptionParser
35
35
  from cpgmodule.utils import *
36
+ from cpgmodule._version import __version__
36
37
  import pandas as pd
37
38
  from sklearn.preprocessing import StandardScaler
38
39
  from sklearn.manifold import TSNE
@@ -41,15 +42,15 @@ __author__ = "Liguo Wang"
41
42
  __copyright__ = "Copyleft"
42
43
  __credits__ = []
43
44
  __license__ = "GPL"
44
- __version__="1.12.0"
45
45
  __maintainer__ = "Liguo Wang"
46
46
  __email__ = "wang.liguo@mayo.edu"
47
47
  __status__ = "Development"
48
48
 
49
49
  def pick_colors(n):
50
- my_colors = ['#e6194B', '#3cb44b', '#4363d8', '#f58231', '#911eb4', '#42d4f4', '#f032e6', '#bfef45', '#fabebe', '#469990', '#e6beff', '#9A6324', '#fffac8', '#800000', '#aaffc3', '#808000', '#ffd8b1', '#000075', '#a9a9a9','#ffe119']
50
+ my_colors = [
51
+ "#F0A3FF", "#0075DC", "#993F00", "#4C005C", "#191919", "#005C31", "#2BCE48", "#FFCC99", "#808080", "#94FFB5", "#8F7C00", "#9DCC00", "#C20088", "#003380", "#FFA405", "#FFA8BB", "#426600", "#FF0010", "#5EF1F2", "#00998F", "#E0FF66", "#740AFF", "#990000", "#FFFF80", "#FFE100", "#FF5005"]
51
52
  if n > len(my_colors):
52
- print ("Only support 21 different colors", file = sys.stderr)
53
+ print ("Only support 26 different colors", file = sys.stderr)
53
54
  sys.exit()
54
55
  return my_colors[0:n]
55
56
 
@@ -99,27 +100,31 @@ def main():
99
100
  printlog("Perplexigty value is set to %d" % options.perplexity_value)
100
101
 
101
102
  #remove NA and transpose
102
- df2 = df1.dropna(axis=0, how='any')
103
- printlog("%d rows with missing values were removed." % (len(df1) - len(df2)))
103
+ df2 = df1.dropna(axis=0, how='any').T
104
+ printlog("%d rows with missing values were removed." % (len(df1.index) - len(df2.columns)))
104
105
  #print (df2.head())
105
-
106
- printlog("Transposing data frame ...")
107
- df2 = df2.T
108
- #print (df2.index)
109
-
110
- printlog("Standarizing values ...")
111
- x = df2.values
112
- x = StandardScaler().fit_transform(x)
113
- #print (x.shape)
114
-
106
+
115
107
  printlog("Reading group file: \"%s\" ..." % (options.group_file))
116
108
  group = pd.read_csv(options.group_file, index_col=0, header=0,names=['Sample_ID', 'Group_ID'])
117
- group.index = group.index.map(str)
118
-
119
109
  #check if sample IDs are unique
120
110
  if len(group.index) != len(group.index.unique()):
121
111
  print ("Sample IDs are not unique", file = sys.stderr)
122
- sys.exit()
112
+ sys.exit()
113
+ group.index = group.index.map(str)
114
+ printlog("Group file \"%s\" contains %d samples" % (options.group_file, len(group.index)))
115
+
116
+ printlog("Find common sample IDs between group file and data file ...")
117
+ common_samples = list(set(group.index) & set(df2.index))
118
+ used_df = df2.loc[common_samples]
119
+ (usable_sample, usable_cpg) = used_df.shape
120
+ printlog("Used CpGs: %d, Used samples: %d" % (usable_cpg, usable_sample))
121
+
122
+
123
+ printlog("Standarizing values ...")
124
+ x = used_df.to_numpy()
125
+ x = StandardScaler().fit_transform(x)
126
+
127
+
123
128
  group_names = group['Group_ID'].unique().tolist() # a list of unique group names
124
129
  color_names = pick_colors(len(group_names)) # a list of unique colors
125
130
  group_to_col = dict(zip(group_names, color_names))
@@ -127,13 +132,13 @@ def main():
127
132
  group['Colors'] = color_list
128
133
 
129
134
 
130
- tsne = TSNE(n_components = options.n_components, random_state = 0, perplexity = options.perplexity_value, learning_rate = options.learning_rate, n_iter = options.n_iterations)
135
+ tsne = TSNE(n_components = options.n_components, random_state = 0, perplexity = options.perplexity_value, learning_rate = options.learning_rate, max_iter = options.n_iterations)
131
136
  tsne_components = tsne.fit_transform(x)
132
137
  pc_names = [str(i)+str(j) for i,j in zip(['PC']*options.n_components,range(1,options.n_components+1))]
133
- principalDf = pd.DataFrame(data = tsne_components, columns = pc_names, index = df2.index)
138
+ principalDf = pd.DataFrame(data = tsne_components, columns = pc_names, index = used_df.index)
134
139
  principalDf.index.name = 'Sample_ID'
135
140
 
136
- finalDf = pd.concat([principalDf, group], axis=1,sort=False)
141
+ finalDf = pd.concat([principalDf, group], axis=1,sort=False, join='inner')
137
142
  finalDf.index.name = 'Sample_ID'
138
143
 
139
144
  printlog("Writing t-SNE results to file: \"%s\" ..." % (options.out_file + '.t-SNE.tsv'))
@@ -149,10 +154,12 @@ def main():
149
154
 
150
155
  if options.plot_alpha:
151
156
  print ('library(scales)', file=ROUT)
152
- print ('plot(PC1, PC2, col = alpha(Colors, %f), pch=%d, cex=1.5, main="t-SNE 2D map")' % (options.plot_alpha, pch[options.plot_char]), file=ROUT)
157
+ print ('plot(PC1, PC2, col = alpha(Colors, %f), pch=%d, cex=1.5, main="tSNE 2D map", xlab="tSNE1", ylab="tSNE2")'
158
+ % (options.plot_alpha, pch[options.plot_char]), file=ROUT)
153
159
  else:
154
- print ('plot(PC1, PC2, col = Colors, pch=%d, cex=1.2, main="t-SNE 2D map")' % pch[options.plot_char], file=ROUT)
155
- #print ('plot(PC1, PC2, col = Colors, pch=%d, cex=1, main="t-SNE 2D map")' % pch[options.plot_char], file=ROUT)
160
+ print ('plot(PC1, PC2, col = Colors, pch=%d, cex=1.2, main="tSNE 2D map", xlab="tSNE1", ylab="tSNE2")'
161
+ % (pch[options.plot_char]), file=ROUT)
162
+
156
163
  if options.text_label:
157
164
  print ('text(PC1, PC2, labels=Sample_ID, col = Colors, cex=0.5, pos=1)', file=ROUT)
158
165
  print ('legend("%s", legend=c(%s), col=c(%s), pch=%d,cex=1)' % (legend_pos[options.legend_location], ','.join(['"' + str(i) + '"' for i in group_names]), ','.join(['"' + str(group_to_col[i]) + '"' for i in group_names]), pch[options.plot_char]), file=ROUT)
@@ -18,6 +18,7 @@ import collections
18
18
  import subprocess
19
19
  import numpy as np
20
20
  from optparse import OptionParser
21
+ from cpgmodule._version import __version__
21
22
  from cpgmodule import ireader
22
23
  from cpgmodule.utils import *
23
24
  from cpgmodule import BED
@@ -27,7 +28,6 @@ __author__ = "Liguo Wang"
27
28
  __copyright__ = "Copyleft"
28
29
  __credits__ = []
29
30
  __license__ = "GPL"
30
- __version__="1.12.0"
31
31
  __maintainer__ = "Liguo Wang"
32
32
  __email__ = "wang.liguo@mayo.edu"
33
33
  __status__ = "Development"
@@ -18,6 +18,7 @@ import numpy as np
18
18
  from optparse import OptionParser
19
19
  from sklearn import mixture
20
20
  from time import strftime
21
+ from cpgmodule._version import __version__
21
22
  from cpgmodule import ireader
22
23
  from cpgmodule.utils import *
23
24
  import pandas as pd
@@ -26,7 +27,6 @@ __author__ = "Liguo Wang"
26
27
  __copyright__ = "Copyleft"
27
28
  __credits__ = []
28
29
  __license__ = "GPL"
29
- __version__="1.12.0"
30
30
  __maintainer__ = "Liguo Wang"
31
31
  __email__ = "wang.liguo@mayo.edu"
32
32
  __status__ = "Development"
@@ -27,13 +27,13 @@ from cpgmodule import ireader
27
27
  from cpgmodule.utils import *
28
28
  from cpgmodule import BED
29
29
  from cpgmodule import padjust
30
+ from cpgmodule._version import __version__
30
31
  from multiprocessing import Process, Manager, current_process
31
32
 
32
33
  __author__ = "Liguo Wang"
33
34
  __copyright__ = "Copyleft"
34
35
  __credits__ = []
35
36
  __license__ = "GPL"
36
- __version__="1.12.0"
37
37
  __maintainer__ = "Liguo Wang"
38
38
  __email__ = "wang.liguo@mayo.edu"
39
39
  __status__ = "Development"
@@ -36,12 +36,12 @@ from cpgmodule import ireader
36
36
  from cpgmodule.utils import *
37
37
  from cpgmodule import BED
38
38
  from cpgmodule import padjust
39
+ from cpgmodule._version import __version__
39
40
 
40
41
  __author__ = "Liguo Wang"
41
42
  __copyright__ = "Copyleft"
42
43
  __credits__ = []
43
44
  __license__ = "GPL"
44
- __version__="1.12.0"
45
45
  __maintainer__ = "Liguo Wang"
46
46
  __email__ = "wang.liguo@mayo.edu"
47
47
  __status__ = "Development"
@@ -34,12 +34,12 @@ from cpgmodule import ireader
34
34
  from cpgmodule.utils import *
35
35
  from cpgmodule import BED
36
36
  from cpgmodule import padjust
37
+ from cpgmodule._version import __version__
37
38
 
38
39
  __author__ = "Liguo Wang"
39
40
  __copyright__ = "Copyleft"
40
41
  __credits__ = []
41
42
  __license__ = "GPL"
42
- __version__="1.12.0"
43
43
  __maintainer__ = "Liguo Wang"
44
44
  __email__ = "wang.liguo@mayo.edu"
45
45
  __status__ = "Development"
@@ -18,12 +18,12 @@ from cpgmodule import ireader
18
18
  from cpgmodule.utils import *
19
19
  from cpgmodule import BED
20
20
  from cpgmodule import padjust
21
+ from cpgmodule._version import __version__
21
22
 
22
23
  __author__ = "Liguo Wang"
23
24
  __copyright__ = "Copyleft"
24
25
  __credits__ = []
25
26
  __license__ = "GPL"
26
- __version__="1.12.0"
27
27
  __maintainer__ = "Liguo Wang"
28
28
  __email__ = "wang.liguo@mayo.edu"
29
29
  __status__ = "Development"
@@ -31,12 +31,12 @@ from cpgmodule import ireader
31
31
  from cpgmodule.utils import *
32
32
  from cpgmodule import BED
33
33
  from cpgmodule import padjust
34
+ from cpgmodule._version import __version__
34
35
 
35
36
  __author__ = "Liguo Wang"
36
37
  __copyright__ = "Copyleft"
37
38
  __credits__ = []
38
39
  __license__ = "GPL"
39
- __version__="1.12.0"
40
40
  __maintainer__ = "Liguo Wang"
41
41
  __email__ = "wang.liguo@mayo.edu"
42
42
  __status__ = "Development"
@@ -19,12 +19,12 @@ from cpgmodule import ireader
19
19
  from cpgmodule.utils import *
20
20
  from cpgmodule import BED
21
21
  from cpgmodule import padjust
22
+ from cpgmodule._version import __version__
22
23
 
23
24
  __author__ = "Liguo Wang"
24
25
  __copyright__ = "Copyleft"
25
26
  __credits__ = []
26
27
  __license__ = "GPL"
27
- __version__="1.12.0"
28
28
  __maintainer__ = "Liguo Wang"
29
29
  __email__ = "wang.liguo@mayo.edu"
30
30
  __status__ = "Development"
@@ -18,12 +18,12 @@ from cpgmodule import ireader
18
18
  from cpgmodule.utils import *
19
19
  from cpgmodule import BED
20
20
  from cpgmodule import padjust
21
+ from cpgmodule._version import __version__
21
22
 
22
23
  __author__ = "Liguo Wang"
23
24
  __copyright__ = "Copyleft"
24
25
  __credits__ = []
25
26
  __license__ = "GPL"
26
- __version__="1.12.0"
27
27
  __maintainer__ = "Liguo Wang"
28
28
  __email__ = "wang.liguo@mayo.edu"
29
29
  __status__ = "Development"
@@ -146,8 +146,8 @@ def main():
146
146
  # check if sample ID matches
147
147
  for s in s2g:
148
148
  if s not in sample_IDs:
149
- printlog("Cannot find sample ID \"%s\" from file \"%s\"" % (s, options.input_file))
150
- sys.exit(3)
149
+ printlog("Cannot find sample ID \"%s\" from file \"%s\". Exclude this sample from differential analysis." % (s, options.input_file))
150
+ #sys.exit(3)
151
151
  else:
152
152
  g2values = collections.defaultdict(list)
153
153
  probe_ID = f[0]
@@ -0,0 +1,126 @@
1
+ #!python
2
+
3
+ """
4
+ #==============================================================================
5
+ Predict sex based on the semi-methylation (also known as genomic imprinting)
6
+ ratio. This method leverages the fact that, due to X chromosome inactivation,
7
+ females have a higher proportion of semi-methylated CpGs on their X chromosomes.
8
+ A log2(ratio) greater than 0 indicates a female, while a log2(ratio) less than
9
+ 0 indicates a male.
10
+
11
+ Example of input data file
12
+ ---------------------------
13
+ CpG_ID Sample_01 Sample_02 Sample_03 Sample_04
14
+ cg_001 0.831035 0.878022 0.794427 0.880911
15
+ cg_002 0.249544 0.209949 0.234294 0.236680
16
+ cg_003 0.845065 0.843957 0.840184 0.824286
17
+
18
+ Example of output file
19
+ ----------------------
20
+ Sample_ID log2_SM_ratio Predicted_sex
21
+ Sample_01 -2.249628052954919 Male
22
+ Sample_02 -2.2671726671830674 Male
23
+ Sample_03 1.4530581933290616 Female
24
+ Sample_04 1.4808015115356654 Female
25
+
26
+ ...
27
+
28
+ """
29
+ import sys
30
+ import numpy as np
31
+ from optparse import OptionParser
32
+ from cpgmodule.utils import printlog
33
+ from cpgmodule import ireader
34
+ import pandas as pd
35
+ from cpgmodule._version import __version__
36
+
37
+ __author__ = "Liguo Wang"
38
+ __copyright__ = "Copyleft"
39
+ __credits__ = []
40
+ __license__ = "GPL"
41
+ __maintainer__ = "Liguo Wang"
42
+ __email__ = "wang.liguo@mayo.edu"
43
+ __status__ = "Development"
44
+
45
+
46
+ def main():
47
+
48
+ usage="%prog [options]" + "\n"
49
+ parser = OptionParser(usage,version="%prog " + __version__)
50
+ parser.add_option("-i","--input_file",action="store", type="string",dest="input_file", help="Tab-separated data frame file containing beta values with the 1st row containing sample IDs and the 1st column containing CpG IDs.")
51
+ parser.add_option("-x","--xprobe",action="store", type="string",dest="xprobe_file", help="File with CpG IDs mapped to the X chromosome, with one probe listed per row.")
52
+ parser.add_option("-c","--cut",action="store", type='float', dest="cutoff", default=0.0, help="The cutoff of log2(SM ratio) to determine the sex prediction. Log2(SM ratio) greater than this cutoff indicates a female, while a log2(ratio) less than this cutoff indicates a male. default=%default")
53
+ parser.add_option("-o","--output",action="store", type='string', dest="out_file", help="The prefix of the output file.")
54
+ (options,args)=parser.parse_args()
55
+
56
+ print ()
57
+ if not (options.input_file):
58
+ print (__doc__)
59
+ parser.print_help()
60
+ sys.exit(101)
61
+ if not (options.xprobe_file):
62
+ print (__doc__)
63
+ parser.print_help()
64
+ sys.exit(102)
65
+ if not (options.out_file):
66
+ print (__doc__)
67
+ parser.print_help()
68
+ sys.exit(103)
69
+
70
+ printlog("Reading X probes from: \"%s\"" % (options.xprobe_file))
71
+ x_cpgs = set()
72
+ for l in ireader.reader(options.xprobe_file):
73
+ l = l.strip()
74
+ if l.startswith('#'):
75
+ continue
76
+ x_cpgs.add(l)
77
+ printlog("Total %d X probes loaded." % len(x_cpgs))
78
+
79
+ printlog("Reading input file: \"%s\"" % (options.input_file))
80
+ df1 = pd.read_csv(options.input_file, index_col = 0, sep="\t")
81
+ #print (df1)
82
+
83
+ #remove any rows with NAs
84
+ df2 = df1.dropna(axis=0, how='any')
85
+ printlog("%d CpGs with missing values were removed." % (len(df1) - len(df2)))
86
+ #print (df2)
87
+
88
+ sample_cpg_ids = df2.index
89
+ sample_names = df2.columns
90
+ found_x_cpgs = list(x_cpgs & set(sample_cpg_ids))
91
+ printlog("Found %d CpGs located on the chrX from file: %s" % (len(found_x_cpgs), options.input_file))
92
+
93
+ # only X probes in df3
94
+ df3 = df2.loc[list(found_x_cpgs)]
95
+ #pd.DataFrame.to_csv(df3, options.out_file + '.tmp.tsv', sep="\t", index_label="sample")
96
+
97
+ low_beta_range = [0, 0.2]
98
+ mid_beta_range = [0.3, 0.7]
99
+ high_beta_range = [0.8, 1.0]
100
+
101
+ output = {}
102
+ for s in sample_names:
103
+ output[s] = {}
104
+ low_beta_count = pd.cut(df3[s], low_beta_range).count()
105
+ mid_beta_count = pd.cut(df3[s], mid_beta_range).count()
106
+ high_beta_count = pd.cut(df3[s], high_beta_range).count()
107
+ try:
108
+ ratio = np.log2(mid_beta_count/(low_beta_count + high_beta_count))
109
+ except:
110
+ ratio = np.nan
111
+ output[s]['log2_SM_ratio'] = ratio
112
+
113
+ if ratio > options.cutoff:
114
+ output[s]['Predicted_sex'] = 'Female'
115
+ elif ratio < options.cutoff:
116
+ output[s]['Predicted_sex'] = 'Male'
117
+ else:
118
+ output[s]['Predicted_sex'] = 'Unknown'
119
+ df_out = pd.DataFrame(output).T
120
+
121
+ outfile = options.out_file + '.predicted_sex.tsv'
122
+ printlog("Writing to file: \"%s\"" % outfile)
123
+ pd.DataFrame.to_csv(df_out, outfile, sep="\t", index_label="Sample_ID")
124
+
125
+ if __name__=='__main__':
126
+ main()
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2024 The Python Packaging Authority
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,76 @@
1
+ Metadata-Version: 2.1
2
+ Name: cpgtools
3
+ Version: 2.0.2
4
+ Summary: Tools to analyze and visualize DNA methylation data
5
+ Author-email: Liguo Wang <wangliguo78@gmail.com>
6
+ Maintainer-email: Liguo Wang <wangliguo78@gmail.com>
7
+ License: Copyright (c) 2024 The Python Packaging Authority
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ of this software and associated documentation files (the "Software"), to deal
11
+ in the Software without restriction, including without limitation the rights
12
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included in all
17
+ copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ SOFTWARE.
26
+
27
+ Project-URL: Documentation, https://cpgtools.readthedocs.io/en/latest/index.html
28
+ Project-URL: Repository, https://github.com/liguowang/cpgtools.git
29
+ Keywords: DNA methylation,EPIC,450K,850K,935K,RRBS,WGBS
30
+ Classifier: Programming Language :: Python :: 3
31
+ Classifier: Development Status :: 4 - Beta
32
+ Classifier: License :: OSI Approved :: MIT License
33
+ Classifier: Environment :: Console
34
+ Classifier: Intended Audience :: Science/Research
35
+ Classifier: Operating System :: MacOS :: MacOS X
36
+ Classifier: Operating System :: POSIX
37
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
38
+ Requires-Python: >=3.5
39
+ Description-Content-Type: text/markdown
40
+ License-File: LICENSE
41
+ Requires-Dist: numpy
42
+ Requires-Dist: scipy
43
+ Requires-Dist: scikit-learn
44
+ Requires-Dist: weblogo
45
+ Requires-Dist: bx-python
46
+ Requires-Dist: pandas
47
+ Requires-Dist: umap-learn
48
+ Requires-Dist: fancyimpute
49
+
50
+ ## Install CpGtools using [pip](https://pip.pypa.io/en/stable/)
51
+
52
+ 1. (Optional) Create Virtual Environments (Note: `venv` is available in Python 3.3 and later. You can also use [virtualenv](https://packaging.python.org/en/latest/key_projects/#virtualenv))
53
+
54
+ `$ python3 -m venv my_env` (will create a directory called my_env)
55
+
56
+ `$ source my_env/bin/activate`
57
+
58
+ 2. Install CpGtools
59
+
60
+ `$ pip install cpgtools`
61
+
62
+ or
63
+
64
+ `$ pip install git+https://github.com/liguowang/cpgtools.git`
65
+
66
+ 3. Upgrade
67
+
68
+ `$ pip install cpgtools --upgrade`
69
+
70
+ 4. Uninstall
71
+
72
+ `pip -y uninstall cpgtools`
73
+
74
+ ## Documentation
75
+
76
+ https://cpgtools.readthedocs.io/en/latest/
@@ -0,0 +1,82 @@
1
+ cpgmodule/BED.py,sha256=ZNAhGZPFMFD4UpVwGTDOM0hMLnfXF52zerdMb21sH6s,12675
2
+ cpgmodule/MI.py,sha256=pkUWzKXYeyRuGsGKZdFVxHzFWikkuJavdQ_4fsnN3U4,8649
3
+ cpgmodule/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ cpgmodule/_version.py,sha256=tATvJM5shAzfspHYjdVwpV2w3-gDA119NlEYi5X2lFY,22
5
+ cpgmodule/cgID.py,sha256=DLG5Djm6JP0d6MiFvP_keUXv_rYxESWrISuVClTs8kw,16017914
6
+ cpgmodule/extend_bed.py,sha256=sjRxbRJFRumjYHwd6_AMTAYBG29yXQPYp1lDjTv2Q_Q,4648
7
+ cpgmodule/imotif.py,sha256=j7_MQFnowGsVTGCRQHHLUnEzSD0HehZPEHKKZ68Jv24,9227
8
+ cpgmodule/ireader.py,sha256=NRTdFnQvd1AEkYchfgvTVTixBVwUjn8xNyswc0OWU1Q,720
9
+ cpgmodule/methylClock.py,sha256=HyMk3vpVwR3yrkLCPv9fVJs6JCeSchbJEBe7i69jdSs,1202
10
+ cpgmodule/padjust.py,sha256=mvbQ9_crn_S39yvWrv_JPoU5OxZGHaw7cV3deBxTPdk,2389
11
+ cpgmodule/region2gene.py,sha256=iuSYa2-ki-qbL1TqqAlTXGT7g-j1uNIA1y7hzMwVM2U,5347
12
+ cpgmodule/utils.py,sha256=NgKT3aJlRT5pQKKO3_e0WB2_u93pY13F-k-r0pvgKno,16095
13
+ cpgmodule/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ cpgtools-2.0.2.data/scripts/CpG_aggregation.py,sha256=iSSUanCPlTkT3f6Df_f_b6zEP2Ixzse9zFwJLL5z2Qw,7278
15
+ cpgtools-2.0.2.data/scripts/CpG_anno_position.py,sha256=j8l4v7SpGFaJ3pBVE5qK8coMkxe5h4p1bwmhcPnhxMk,4643
16
+ cpgtools-2.0.2.data/scripts/CpG_anno_probe.py,sha256=bACac7x9zX2E1QJnUUmNKS6YNKg_f4K-jxwl_v93--4,3171
17
+ cpgtools-2.0.2.data/scripts/CpG_density_gene_centered.py,sha256=JM2PrvHCnGAvymBbbIBr30AfXwu69WgJkJNy6PCmCrg,5266
18
+ cpgtools-2.0.2.data/scripts/CpG_distrb_chrom.py,sha256=q3xZ1AH4JEif1DQRG6UXiiUb4jZyt2khzTZld1jaXnA,6207
19
+ cpgtools-2.0.2.data/scripts/CpG_distrb_gene_centered.py,sha256=tLfalDRzklBcNfZxhABjhprcBlk4HgUyxXxznOGVTN8,7736
20
+ cpgtools-2.0.2.data/scripts/CpG_distrb_region.py,sha256=nJGgZLhZe2kYCPnxuW--EemxOcoReu2hdkIAgl-7UAE,5391
21
+ cpgtools-2.0.2.data/scripts/CpG_logo.py,sha256=U8RxYPmakKii1xmEgG22tKfdZBPpjhZbAfKxgF_Z-O8,4597
22
+ cpgtools-2.0.2.data/scripts/CpG_to_gene.py,sha256=fciNtI5N6fO-jZX2eyKgiAhDIsus4SljYSCbEQMeTHI,6114
23
+ cpgtools-2.0.2.data/scripts/beta_PCA.py,sha256=cRlqGC5CQlpsmzhAwy2AoI4_lLwjFh_rvn7ObNbHgYg,7155
24
+ cpgtools-2.0.2.data/scripts/beta_UMAP.py,sha256=SJfxtCsM1NTK5rYnZjtXiDj_x1kJiYZvR1NGHKo0IRI,8079
25
+ cpgtools-2.0.2.data/scripts/beta_imputation.py,sha256=o7wM_iHFwhxjRAMQ5_fCxgAfO9VYe48O9dY4BeZF2wA,28928
26
+ cpgtools-2.0.2.data/scripts/beta_jitter_plot.py,sha256=Knja1n1rpD0qe3FHkNPax0p6BYsmAtEQBFB1wBdpHyY,4389
27
+ cpgtools-2.0.2.data/scripts/beta_m_conversion.py,sha256=992tJI0IzkphUaEr_9_CveSRPjKdnyYkCTO10D_xkbg,2848
28
+ cpgtools-2.0.2.data/scripts/beta_profile_gene_centered.py,sha256=Jb9mm8y-1cKH_EepRFhUH5mfBdoAt0zpN_VXETRnQek,7312
29
+ cpgtools-2.0.2.data/scripts/beta_profile_region.py,sha256=GHDPyUFR9XJm2CK0_9wCKossMTWWvn4VwYCCSA8kn2E,5971
30
+ cpgtools-2.0.2.data/scripts/beta_selectNBest.py,sha256=Uu_MvQUm6Zc8MGKuGUEooJ-IL7C1eg_LNRqQsNdLaWs,4638
31
+ cpgtools-2.0.2.data/scripts/beta_stacked_barplot.py,sha256=2fcypD_BE4XqK-vl8hHsgyWqvp3I9oLvg8tF2dd5QZ0,3415
32
+ cpgtools-2.0.2.data/scripts/beta_stats.py,sha256=WBh3Aquk_AHeUcteLPtt2Q2yKpqu5aBA38zaFz_7mVI,3021
33
+ cpgtools-2.0.2.data/scripts/beta_tSNE.py,sha256=0UTxNxyaDb-iNqbeIfFKj9DRURTQcHeJdltr-iY72XM,8450
34
+ cpgtools-2.0.2.data/scripts/beta_topN.py,sha256=gmbmJZoGJt3QljlRHUA8LaKSIurdCNgtn2J9LAIQNCo,3914
35
+ cpgtools-2.0.2.data/scripts/beta_trichotmize.py,sha256=T594UfSCDJHRFyGvov7qetLQs10WU73PGVVCDNrwNPg,7143
36
+ cpgtools-2.0.2.data/scripts/dmc_Bayes.py,sha256=imqKv5x8s_plXQPL3_d9OpqSI-imrSfUj-k39Zf1XqA,13735
37
+ cpgtools-2.0.2.data/scripts/dmc_bb.py,sha256=pOEEHT-hT--r6IswZwQFyGri77OJqbW1y9VVG8pzzpg,8407
38
+ cpgtools-2.0.2.data/scripts/dmc_fisher.py,sha256=t18smNJAtipmDm3xgUg62ccKsFQWcdKBo4Tm2cxx43s,5163
39
+ cpgtools-2.0.2.data/scripts/dmc_glm.py,sha256=_vJiZhbGA-Rv5v5oBU9N9lGND8MTEVAFHHFqW5hgfSw,6516
40
+ cpgtools-2.0.2.data/scripts/dmc_logit.py,sha256=V35wyBgcdiUbsR_NDnEDfs6F2yPyz11ryZvYkkV6Ess,8488
41
+ cpgtools-2.0.2.data/scripts/dmc_nonparametric.py,sha256=eFyUy7jXl8bPyySKZLEi3LVxYkDOKp9S4XBXevYvbVw,4945
42
+ cpgtools-2.0.2.data/scripts/dmc_ttest.py,sha256=jOW0el_NeJlBuF91wKN2UHnu7phoP0OPrKCNCaOAQBs,6704
43
+ cpgtools-2.0.2.data/scripts/predict_sex.py,sha256=ojoMJ6XwBsE1kGpxzKGZ4TZPs5JcUwI_C_9ieEQbB9c,4755
44
+ impyute/__init__.py,sha256=Q07nw2fDjLm_c3EQWMpSo8nZCfC-fvs2lpRG5uha-gg,87
45
+ impyute/contrib/__init__.py,sha256=DgGgN0iBoMfHjzr9edz-ZgtJ2KeyIDlyV1t8hxhcM2c,209
46
+ impyute/contrib/compare.py,sha256=psWygE7PD4Cky4MoTJLAgjaEkTXwqemv3NTKkKVaapo,2852
47
+ impyute/contrib/count_missing.py,sha256=KkCpYeuDP5jRxCcURJbne_k-7Zq1k31oq2aFHpqygx8,742
48
+ impyute/contrib/describe.py,sha256=LI6Xage19-DEEDZVNqaaOjemRAVqVkSlH4mxjjubw-A,2033
49
+ impyute/cs/__init__.py,sha256=ArkuAVHm0z4jl3_UK_FUBF8i2vZUvAZpfVFyryUTm18,373
50
+ impyute/cs/buck_iterative.py,sha256=ceoQ2ij64pXHy7NszErTTRb9h2wctF0CMBexhc6YZSA,3009
51
+ impyute/cs/central_tendency.py,sha256=xHwTVeDL-N-O5refvP536FiVEDODR7s-cgX2Ao9LsfI,2127
52
+ impyute/cs/em.py,sha256=SwvVNMYK3llATR2r1baVCA0hy_fwJIkGD110du9Woos,1631
53
+ impyute/cs/fast_knn.py,sha256=CI4RKMcrbXPi7izUtWo-lnq1BuLYwl8bvbx62dj8Qn0,6246
54
+ impyute/cs/random.py,sha256=-Ti4BwMwUGdsciKTp8OVAgYK6TzGP-R4Nw62UY_xqAs,594
55
+ impyute/dataset/__init__.py,sha256=GK-ktaf86PLZOUlO_oOhvc-55SX1YFLcpjcpgf7a87c,192
56
+ impyute/dataset/base.py,sha256=bNYszhYP62fSeDe8w_Ij4yhEf-dv6NiNGcCdC22OkuY,4445
57
+ impyute/dataset/corrupt.py,sha256=uGCnpofJWfWZYBucQMrwT9yOSpEQAaZSG010Jv6ks1I,1491
58
+ impyute/deletion/__init__.py,sha256=ztemVB8Q6LRaxSv8DDdFzZlGUVUQbsVRA7gvcs_vMhM,124
59
+ impyute/deletion/complete_case.py,sha256=2xBhqNOSmEeW-sBQvl3TVJCcf2Ybmkr8HXNk9xrQ2J0,395
60
+ impyute/ops/__init__.py,sha256=ZP_rQQ0qATGEibUA9I8D1JfD1kRT2Xqw8SsOMPIddog,275
61
+ impyute/ops/error.py,sha256=lyXJcIDyfdrj_JJbsEI18z-t4UKi1mpLTyt3iS2YvTs,226
62
+ impyute/ops/inverse_distance_weighting.py,sha256=88hmyc-dWltP66MbjrW-VHBcVgPOI0V0BkrV30B-Lyc,1017
63
+ impyute/ops/matrix.py,sha256=-eniwqvbvwXNrYw8PmIMD95uMcPMq6HE6OBOyjzR-Vk,837
64
+ impyute/ops/testing.py,sha256=3ZRVL1sc5IIQLPW2GrD6-lF4_nVnSLo7SBW4rfaOMLA,415
65
+ impyute/ops/util.py,sha256=Tcm8reCrWQf8btKRP5StawBL1UV_GOBWmzy1NYDcPbY,2204
66
+ impyute/ops/wrapper.py,sha256=bQj3r9WsZxqNw51y3OobyyXPPxCeISUv2jb-Ga2C_-M,6022
67
+ impyute/ts/__init__.py,sha256=veePCYSBfo1t5Ahh3wrVCNveizcniXZYhjyS7ahkIhI,145
68
+ impyute/ts/locf.py,sha256=qusLWfBrepKzFIkeGxIS0S5KnqRgZde2CV6mcF5nf4c,1876
69
+ impyute/ts/moving_window.py,sha256=G3Z4ohhqZXAVPflptuOhktwucbW3tg8FySb7gTtBraE,4991
70
+ missingpy/__init__.py,sha256=H_yX0CtfoG2UaJPRcoZKv0AFhi4n-1hHmfIwfqQXoPk,96
71
+ missingpy/knnimpute.py,sha256=WxniKg6-3pvwJa9mipiCZBqkRL_GGHUcxDu-7b57x3k,13456
72
+ missingpy/missforest.py,sha256=UYRf2YANPwxvRPruN3P6xlhJ5JPZB1x8o4xVhYfIp74,24696
73
+ missingpy/pairwise_external.py,sha256=XU_vW-rMCPD3aH9k0UrP_p90QUHDZqe3QZPoOQmu2vo,13221
74
+ missingpy/utils.py,sha256=sMU4OGHPvRgReT8e_HqGCYvjAJZkE_qlAPDzLo-_M6U,4360
75
+ missingpy/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
+ missingpy/tests/test_knnimpute.py,sha256=rR1OPZ4-IzcIKgWmSEN7UEPvVSRwJe0KU_wTxPr46k0,17527
77
+ missingpy/tests/test_missforest.py,sha256=5YfKZf_xdy9RcXmnlFz7cJDqdnspJDzzrxLnVVWJi3A,13725
78
+ cpgtools-2.0.2.dist-info/LICENSE,sha256=NAIE1kmjlmRNJ1BwR9m9i0jXHmQqqujTnEyIBuIxvwM,1074
79
+ cpgtools-2.0.2.dist-info/METADATA,sha256=EfdjaKSMi75Wo041GCIx9gd9JjFf7rULeCkAhw2uuqY,2943
80
+ cpgtools-2.0.2.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
81
+ cpgtools-2.0.2.dist-info/top_level.txt,sha256=L6IX1ORvZ1JssvdU8qOtU99-vbMK9ZSIgYg4zH-rL5Y,28
82
+ cpgtools-2.0.2.dist-info/RECORD,,