gwaslab 3.6.8__py3-none-any.whl → 3.6.9__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 gwaslab might be problematic. Click here for more details.

gwaslab/g_Sumstats.py CHANGED
@@ -102,7 +102,7 @@ from gwaslab.viz.viz_plot_mqqplot import mqqplot
102
102
  from gwaslab.viz.viz_plot_trumpetplot import plottrumpet
103
103
  from gwaslab.viz.viz_plot_compare_af import plotdaf
104
104
  from gwaslab.viz.viz_plot_credible_sets import _plot_cs
105
-
105
+ from gwaslab.viz.viz_plot_associations import _plot_associations
106
106
  from gwaslab.io.io_read_pipcs import _read_pipcs
107
107
  from gwaslab.io.io_load_ld import tofinemapping_using_ld
108
108
  from gwaslab.io.io_preformat_input import preformat
@@ -811,6 +811,9 @@ class Sumstats():
811
811
  self.associations = associations_full
812
812
 
813
813
  return associations_summary
814
+ def plot_associations(self,**kwargs):
815
+
816
+ _plot_associations(self.associations, **kwargs)
814
817
 
815
818
  def check_cis(self, gls=False, **kwargs):
816
819
  if "SNPID" in self.data.columns:
gwaslab/g_version.py CHANGED
@@ -17,8 +17,8 @@ def _get_version():
17
17
  def gwaslab_info():
18
18
  # version meta information
19
19
  dic={
20
- "version":"3.6.0",
21
- "release_date":"20250902"
20
+ "version":"3.6.9",
21
+ "release_date":"20251012"
22
22
  }
23
23
  return dic
24
24
 
@@ -25,15 +25,19 @@ def _extract_associations(sumstats, rsid="rsID", log = Log(), verbose=True):
25
25
  assoc_traits_agg = assoc_traits_agg.rename(columns={"trait":"GWASCATALOG_TRAIT",
26
26
  "riskFrequency":"RAF",
27
27
  "betaNum":"Beta",
28
- "pvalue":"P-value"
28
+ "pvalue":"P-value",
29
+ "betaUnit":"Unit"
29
30
  })
30
31
 
31
32
  summary_columns=['GWASCATALOG_TRAIT','associationId', 'rsID', "geneName",
32
- 'RA', 'RAF','Beta', 'P-value','cohort','initialSampleSize','publicationInfo.pubmedId',
33
+ 'RA', 'RAF','Beta',"Unit", 'P-value','cohort','initialSampleSize','publicationInfo.pubmedId',
33
34
  "functionalClass","gene.geneName"]
34
35
 
35
36
  assoc_traits_agg_summary = assoc_traits_agg[summary_columns]
36
37
 
38
+ assoc_traits_agg_summary = _align_beta(sumstats, assoc_traits_agg_summary, log, verbose)
39
+ assoc_traits_agg = _align_beta(sumstats, assoc_traits_agg, log, verbose)
40
+
37
41
  return assoc_traits_agg, assoc_traits_agg_summary
38
42
 
39
43
  def get_associations_from_gwascatalog(sumstats, rsid="rsID", log=Log(), verbose=True):
@@ -125,3 +129,41 @@ def parse_range(x):
125
129
  low = np.log(range_list[0])
126
130
  beta = (high + low)/2
127
131
  return beta
132
+
133
+ def _align_beta(sumstats, assoc_traits_agg_summary, log, verbose):
134
+ # merge with sumstats
135
+ log.write("Merging GWAS Catalog associationms with Sumstats...",)
136
+ assoc_traits_agg_summary = pd.merge(sumstats[["rsID","CHR","POS","EA","NEA","BETA"]], assoc_traits_agg_summary, on = "rsID", how="inner")
137
+ # check direction
138
+ assoc_traits_agg_summary["GC_Beta_GL_RA"] = np.nan
139
+ assoc_traits_agg_summary["GC_Beta_GL_EA"] = np.nan
140
+
141
+ # get sumstats RA
142
+ assoc_traits_agg_summary["_GL_RA_BETA"] = assoc_traits_agg_summary["BETA"].abs()
143
+ assoc_traits_agg_summary["_GL_RA"] = assoc_traits_agg_summary["EA"]
144
+ assoc_traits_agg_summary["_GL_NRA"] = assoc_traits_agg_summary["NEA"]
145
+ is_GL_RA_flipped = assoc_traits_agg_summary["BETA"]<0
146
+ assoc_traits_agg_summary.loc[is_GL_RA_flipped, "_GL_RA"] = assoc_traits_agg_summary.loc[is_GL_RA_flipped, "NEA"]
147
+ assoc_traits_agg_summary.loc[is_GL_RA_flipped, "_GL_NRA"] = assoc_traits_agg_summary.loc[is_GL_RA_flipped, "EA"]
148
+
149
+ is_matched = assoc_traits_agg_summary["_GL_RA"] == assoc_traits_agg_summary["RA"]
150
+ log.write(" -GL_RA matched RA for {} variants ".format(sum(is_matched)), verbose=verbose)
151
+ assoc_traits_agg_summary.loc[is_matched, "GC_Beta_GL_RA"] = assoc_traits_agg_summary.loc[is_matched, "Beta"]
152
+
153
+ is_flipped = assoc_traits_agg_summary["_GL_NRA"] == assoc_traits_agg_summary["RA"]
154
+ log.write(" -GL_NRA matched RA for {} variants... Aligning with Sumstats Risk allele (BETA>0) in GC_Beta_GL_RA... ".format(sum(is_flipped)), verbose=verbose)
155
+ assoc_traits_agg_summary.loc[is_flipped, "GC_Beta_GL_RA"] = - assoc_traits_agg_summary.loc[is_flipped, "Beta"]
156
+
157
+ is_matched = assoc_traits_agg_summary["EA"] == assoc_traits_agg_summary["RA"]
158
+ log.write(" -EA matched RA for {} variants ".format(sum(is_matched)), verbose=verbose)
159
+ assoc_traits_agg_summary.loc[is_matched, "GC_Beta_GL_EA"] = assoc_traits_agg_summary.loc[is_matched, "Beta"]
160
+
161
+ is_flipped = assoc_traits_agg_summary["NEA"] == assoc_traits_agg_summary["RA"]
162
+ log.write(" -NEA matched RA for {} variants... Aligning with Sumstats Risk allele (BETA>0) in GC_Beta_GL_RA... ".format(sum(is_flipped)), verbose=verbose)
163
+ assoc_traits_agg_summary.loc[is_flipped, "GC_Beta_GL_EA"] = - assoc_traits_agg_summary.loc[is_flipped, "Beta"]
164
+
165
+ not_match = (assoc_traits_agg_summary["_GL_RA"] != assoc_traits_agg_summary["RA"])& (assoc_traits_agg_summary["_GL_NRA"] != assoc_traits_agg_summary["RA"])
166
+ log.write(" -NEA and EA not matching RA for {} variants... ".format(sum(not_match)), verbose=verbose)
167
+
168
+
169
+ return assoc_traits_agg_summary
@@ -53,7 +53,8 @@ def get_default_path(keyword,fmt="png"):
53
53
  "afc":"allele_frequency_comparision",
54
54
  "gwheatmap":"genome_wide_heatmap",
55
55
  "scatter":"scatter",
56
- "forest":"forest"
56
+ "forest":"forest",
57
+ "gwaslab":"gwaslab"
57
58
  }
58
59
  prefix = path_dictionary[keyword]
59
60
  count = 1
@@ -0,0 +1,61 @@
1
+ import seaborn as sns
2
+ import matplotlib.pyplot as plt
3
+ from gwaslab.io.io_process_args import _update_args
4
+ from gwaslab.io.io_process_args import _update_arg
5
+ from gwaslab.g_Log import Log
6
+
7
+ def _plot_associations(associations,
8
+ values="Beta",
9
+ fig_args=None,
10
+ log=Log(),
11
+ verbose=True,
12
+ sort="P-value",
13
+ fontsize=12,
14
+ font_family="Arial",
15
+ cmap=None,
16
+ ylabel="Traits",
17
+ xlabel="rsID - Gene Name",
18
+ **args
19
+ ):
20
+
21
+ log.write("Start to create heatmap for associations...", verbose=verbose)
22
+
23
+ cmap = _update_arg(cmap, "RdBu")
24
+
25
+ log.write(f" -Value to plot: {values}", verbose=verbose)
26
+ log.write(f" -Total number of associations :{len(associations)} ", verbose=verbose)
27
+ log.write(f" -Sorting associations by :{sort} ", verbose=verbose)
28
+
29
+ associations = associations.sort_values(by=[sort]).drop_duplicates(subset=["rsID","GWASCATALOG_TRAIT"])
30
+
31
+ log.write(f" -Keeping unique rsID-traits pairs :{len(associations)} ", verbose=verbose)
32
+
33
+ associations = associations.dropna(subset=[values])
34
+ log.write(f" -Keeping associations without NA in {values} :{len(associations)} ", verbose=verbose)
35
+
36
+ log.write(f" -Total number of unique variants for plotting :{associations["rsID"].nunique()} ", verbose=verbose)
37
+ log.write(f" -Total number of unique traits for plotting:{associations["GWASCATALOG_TRAIT"].nunique()} ", verbose=verbose)
38
+
39
+ matrix_beta = associations.pivot_table(index=['rsID','gene.geneName'],
40
+ columns='GWASCATALOG_TRAIT',
41
+ values=[values])
42
+
43
+ matrix_beta = matrix_beta.astype("float64")
44
+
45
+ matrix_beta.columns = matrix_beta.columns.droplevel(0)
46
+
47
+ height = max(2, len(matrix_beta)//2)
48
+ width = max(2, len(matrix_beta.columns)//2)
49
+
50
+ fig_args = _update_args(fig_args, dict(figsize=(width,height)))
51
+ fig,ax = plt.subplots(**fig_args)
52
+
53
+ sns.heatmap(matrix_beta.T, annot=True, fmt=".2f",cmap="RdBu",ax=ax)
54
+
55
+
56
+ ax.set_xlabel(xlabel,fontsize=fontsize, fontfamily=font_family)
57
+ ax.set_ylabel(ylabel,fontsize=fontsize, fontfamily=font_family)
58
+
59
+
60
+ log.write("Finished creating heatmap for associations.", verbose=verbose)
61
+ return fig, ax
@@ -0,0 +1,98 @@
1
+ import seaborn as sns
2
+ import matplotlib.pyplot as plt
3
+ from gwaslab.io.io_process_args import _update_args
4
+ from gwaslab.io.io_process_args import _update_arg
5
+ from gwaslab.g_Log import Log
6
+ from gwaslab.viz.viz_aux_save_figure import save_figure
7
+
8
+ def _plot( associations,
9
+ values="Beta",
10
+ sort="P-value",
11
+ mode="gwaslab",
12
+ fontsize=12,
13
+ font_family="Arial",
14
+ cmap=None,
15
+ ylabel="Y",
16
+ xlabel="X",
17
+ xlim=None,
18
+ ylim=None,
19
+ yticks=None,
20
+ xticks=None,
21
+ title="Title",
22
+ title_pad=1.08,
23
+ title_fontsize=13,
24
+ linewidth=None,
25
+ linestyle=None,
26
+ linecolor=None,
27
+ dpi=200,
28
+ fig_args= None,
29
+ scatter_args=None,
30
+ save=None,
31
+ save_args=None,
32
+ log=Log(),
33
+ verbose=True,
34
+ **args
35
+ ):
36
+
37
+ # update args
38
+
39
+ cmap = _update_arg(cmap, "RdBu")
40
+
41
+ fig_args = _update_args(fig_args, dict(figsize=(10,10)))
42
+
43
+ # create fig and ax
44
+ fig,ax = plt.subplots(**fig_args)
45
+
46
+ # draw lines
47
+ horizontal_line = ax.axhline(y=1, linewidth = linewidth,
48
+ linestyle="--",
49
+ color=linecolor,zorder=1000)
50
+ vertical_line = ax.axvline(x=1, linewidth = linewidth,
51
+ linestyle="--",
52
+ color=linecolor,zorder=1000)
53
+
54
+ # ticks
55
+ if xticks is not None:
56
+ ax.set_xticks(xticks)
57
+ ax.set_xticklabels(xticks,
58
+ fontsize=fontsize,
59
+ family=font_family)
60
+
61
+ if yticks is not None:
62
+ ax.set_xticks(yticks)
63
+ ax.set_xticklabels(yticks,
64
+ fontsize=fontsize,
65
+ family=font_family)
66
+
67
+ # labels
68
+ ax.set_xlabel(xlabel,
69
+ fontsize=fontsize,
70
+ fontfamily=font_family)
71
+ ax.set_ylabel(ylabel,
72
+ fontsize=fontsize,
73
+ fontfamily=font_family)
74
+
75
+ ax.tick_params(axis='x',
76
+ labelsize=fontsize,
77
+ labelfontfamily=font_family)
78
+ ax.tick_params(axis='y',
79
+ labelsize=fontsize,
80
+ labelfontfamily=font_family)
81
+
82
+ # title
83
+ title_pad = title_pad -0.05
84
+ fig.suptitle(title ,
85
+ fontsize = title_fontsize,
86
+ x=0.5,
87
+ y=title_pad)
88
+
89
+ # spines
90
+ ax.spines["top"].set_visible(False)
91
+ ax.spines["right"].set_visible(False)
92
+ ax.spines["left"].set_visible(True)
93
+ ax.spines["bottom"].set_visible(True)
94
+
95
+ save_figure(fig = fig, save = save, keyword=mode, save_args=save_args, log = log, verbose=verbose)
96
+
97
+ log.write("Finished creating plots.", verbose=verbose)
98
+ return fig, ax
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gwaslab
3
- Version: 3.6.8
3
+ Version: 3.6.9
4
4
  Summary: A collection of handy tools for GWAS SumStats
5
5
  Author-email: Yunye <gwaslab@gmail.com>
6
6
  Project-URL: Homepage, https://cloufield.github.io/gwaslab/
@@ -2,7 +2,7 @@ gwaslab/__init__.py,sha256=tr8AGz-BqvOc5V0aUHNC-xW--LIAiUXrFo8HTR4SI9k,2861
2
2
  gwaslab/cache_manager.py,sha256=HOTnSkCOyGEPLRl90WT8D_6pAdI8d8AzenMIDGuCeWc,28113
3
3
  gwaslab/g_Log.py,sha256=C3Zv-_6c3C9ms8bgQ-ytplz22sjk7euqXYkWr9zNeAs,1573
4
4
  gwaslab/g_Phenotypes.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- gwaslab/g_Sumstats.py,sha256=7gRp2DIBxcBVYC6H5_4_3lde-VkGSKCiFCHOM3vLE1Q,45366
5
+ gwaslab/g_Sumstats.py,sha256=XH0QrEAofxvMwb07ISp1AUkagfgeCH971VmB2pb2fEA,45529
6
6
  gwaslab/g_SumstatsMulti.py,sha256=CDnYMK0L8bV-LNOwO4h9yJahOVHR-sPAxZMNaeKFb3U,15098
7
7
  gwaslab/g_SumstatsPair.py,sha256=3-4aFh6pMZ4phcqHCCfyFPC3ySuck43wuTsfLG-ZAyY,13470
8
8
  gwaslab/g_SumstatsSet.py,sha256=xuGLpsHyhY2SjMVsFHGdL3iCa-Leb_3bu_R8totkzBY,30180
@@ -14,8 +14,7 @@ gwaslab/g_meta.py,sha256=pXtSsQfFPv2UJmOxKMmLtcsp_Ku_H73YP7PnlfMd0sg,6472
14
14
  gwaslab/g_meta_update.py,sha256=W1m6mh5jNUeZAW4T6F6kKZ10gE4l8YieoEC2mAfkzGg,2495
15
15
  gwaslab/g_vchange_status.py,sha256=lc3G65-QBV5k5yK-ySGIxiUT0hMBmESLhMKYncwjSwU,1986
16
16
  gwaslab/g_vchange_status_polars.py,sha256=kxyGQCur0ibVFBCyZghA-XNf_kLDXKK-l7VC-Om2IdA,1839
17
- gwaslab/g_version.py,sha256=pW2dwSPMZRQYVnUfhCRZJgqUZrsdoO-wzycgeKdD8L8,1964
18
- gwaslab/hm_harmonize_sumstats.py,sha256=WkUGNxftEGF5NAJktbEqQfniwcoD6zWHd-4bGrBxOtM,84472
17
+ gwaslab/g_version.py,sha256=NJBby5_kMtMdDdDRyQc5s8LAjWzRq3QNF7LWqk1I_5o,1964
19
18
  gwaslab/run_script.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
19
  gwaslab/bd/bd_common_data.py,sha256=mlw977K-ihKf7TQEn6FwUCyJ2vcnq6KIhrX6J3bRMVA,14226
21
20
  gwaslab/bd/bd_config.py,sha256=t3YeDMGRSP8k3lw4rHHilIM4jAXSzFOF9DtuuIbpDS8,924
@@ -65,7 +64,7 @@ gwaslab/util/util_ex_infer_ancestry.py,sha256=AXLEhuJUBT6XIYjADB-envFRGIZ-misneg
65
64
  gwaslab/util/util_ex_ldproxyfinder.py,sha256=8E4g82gCmolAvrg52urNMJX11MZMwOAPGQaZ4cfggiU,16918
66
65
  gwaslab/util/util_ex_ldsc.py,sha256=ss1QlwH7duLuVx_Ckb9mDbyz2neK8tv0WefUGCqzZUc,21685
67
66
  gwaslab/util/util_ex_match_ldmatrix.py,sha256=uVfHKxWQRtUQ0lUkt1o2LtZPSd3fh1yQ1rElFa4FDao,17525
68
- gwaslab/util/util_ex_phewwas.py,sha256=Reg3TUMDpLuUCNGHxpVa_fxrlzpeXFOUShTDXUcxiLk,5887
67
+ gwaslab/util/util_ex_phewwas.py,sha256=oLbAgh_ULLWNP0m6bmD9xtx3EdDcH3HSIeTjxHX_0HU,8745
69
68
  gwaslab/util/util_ex_plink_filter.py,sha256=pK1Yxtv9-J4rMOdVAG7VU9PktvI6-y4FxBiVEH0QuRs,1673
70
69
  gwaslab/util/util_ex_process_h5.py,sha256=LqfQKBjXnbPSRUVJy9hhRhuoS5wG93yoIguiFDZN1A4,2837
71
70
  gwaslab/util/util_ex_process_ref.py,sha256=qtDRxJT0O2NgW4fd6VkRMxIHhSdzhSwz6bfa4iLQvcc,17132
@@ -98,7 +97,8 @@ gwaslab/viz/viz_aux_chromatin.py,sha256=aWZaXOSvGyZY7wQcoFDaqHRYCSHZbi_K4Q70HruN
98
97
  gwaslab/viz/viz_aux_property.py,sha256=UIaivghnLXYpTwkKnXRK0F28Jbn9L6OaICk3K73WZaU,33
99
98
  gwaslab/viz/viz_aux_quickfix.py,sha256=6xgJYHBEz6iTRkuIAS1e28PQJH1eIViBCOMvczxI-BQ,18698
100
99
  gwaslab/viz/viz_aux_reposition_text.py,sha256=iRIP-Rkltlei068HekJcVubiqPrunBqvAoSQ1eHk04M,4304
101
- gwaslab/viz/viz_aux_save_figure.py,sha256=HwIRDMYpeXfkBgb7mqzLN7OVPMz163U-ZVOlQJABzeg,2811
100
+ gwaslab/viz/viz_aux_save_figure.py,sha256=IOhojOCPPUDjZZYw7i4BgzCpAeasNpnzBTyrpiSoH_4,2856
101
+ gwaslab/viz/viz_plot_associations.py,sha256=06sE8987NEj4v-4_OFo6rliN2RVsf_WoTmLmnfVvQVU,2472
102
102
  gwaslab/viz/viz_plot_compare_af.py,sha256=pnL6pEQOSXZ1Zm2UTX-TdvTYSFD9zSY2vaJZSo4Ry_w,5348
103
103
  gwaslab/viz/viz_plot_compare_effect.py,sha256=KF0Ug4OwVwfl205Z5nRqGwXBLceuwJXYXj6378sT1Sg,69629
104
104
  gwaslab/viz/viz_plot_credible_sets.py,sha256=CjTtO5Dk2R-_GpZ0KN2NW0bN-EDga1OCjt9U8zDiTcw,5864
@@ -114,10 +114,11 @@ gwaslab/viz/viz_plot_regionalplot.py,sha256=UZSeXHfQlGWAYW_tMt00lZt8_vhiB6QcVLvM
114
114
  gwaslab/viz/viz_plot_rg_heatmap.py,sha256=AvVAlOOAwhqGWCses7MfdIXLVQSIA2SFE6bd7K1NaLw,13865
115
115
  gwaslab/viz/viz_plot_scatter_with_reg.py,sha256=0cpE6ui7yuJ1lhoLu_klac2OSzd5QDx6V51fyplB3GI,8366
116
116
  gwaslab/viz/viz_plot_stackedregional.py,sha256=bgVQir_Wj3TxB3o7NJFf7b8HETlWjppgfwLsbUyr3oo,20668
117
+ gwaslab/viz/viz_plot_template.py,sha256=3tOT4pWcxN8je6XEcqPTQ7PJXEG25cwXUnDnoIhqjMA,2917
117
118
  gwaslab/viz/viz_plot_trumpetplot.py,sha256=_FKVkxckEFE11jZDwcHhF_bLuYbzxTWDaRTs6ylNEGg,42982
118
- gwaslab-3.6.8.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
119
- gwaslab-3.6.8.dist-info/licenses/LICENSE_before_v3.4.39,sha256=GhLOU_1UDEKeOacYhsRN_m9u-eIuVTazSndZPeNcTZA,1066
120
- gwaslab-3.6.8.dist-info/METADATA,sha256=wH3szvvkbal87X3T_iWS3KFB-vKDcy0OtCqqh7M2Gh4,7073
121
- gwaslab-3.6.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
122
- gwaslab-3.6.8.dist-info/top_level.txt,sha256=PyY6hWtrALpv2MAN3kjkIAzJNmmBTH5a2risz9KwH08,8
123
- gwaslab-3.6.8.dist-info/RECORD,,
119
+ gwaslab-3.6.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
120
+ gwaslab-3.6.9.dist-info/licenses/LICENSE_before_v3.4.39,sha256=GhLOU_1UDEKeOacYhsRN_m9u-eIuVTazSndZPeNcTZA,1066
121
+ gwaslab-3.6.9.dist-info/METADATA,sha256=V7VQ4hyHm_LDCykfxBuRaDvqPdc4yKdrfKple7nROAI,7073
122
+ gwaslab-3.6.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
123
+ gwaslab-3.6.9.dist-info/top_level.txt,sha256=PyY6hWtrALpv2MAN3kjkIAzJNmmBTH5a2risz9KwH08,8
124
+ gwaslab-3.6.9.dist-info/RECORD,,