JS散度評估特征距離

直接上代碼:

import pandas as pd
import numpy as np
import os,sys
from sklearn.preprocessing import StandardScaler
from scipy.stats import shapiro, ttest_ind, wilcoxon,levene,kruskal,mannwhitneyu
from statistics import median
from statistics import mean
from scipy.stats import normaltest
import itertools
import random
from scipy.spatial.distance import jensenshannon
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import pickle
os.makedirs('./Js_plot', exist_ok=True)
scaler = StandardScaler()
work="./"
tsv_files = [f for f in os.listdir(work) if f.endswith('LE5X.csv')]
tsv_files = [i  for i in tsv_files if i.find('Frag2023_FragArm2023')==-1]
def js_divergence_scipy(p, q,p_SampleID,q_SampleID,name):
    data1 =np.array(np.nan_to_num(p), dtype=np.float64)
    data2=np.array(np.nan_to_num(q), dtype=np.float64)
    kde1 = gaussian_kde(data1)
    kde2 = gaussian_kde(data2)
    x_range = np.linspace(min(data1.min(), data2.min()), max(data1.max(), data2.max()), 1000)
    prob_dist1 = kde1.evaluate(x_range)
    prob_dist2 = kde2.evaluate(x_range)
    out=jensenshannon(prob_dist1, prob_dist2)
    plt.clf()
    plt.figure(figsize=(10, 6))
    plt.plot(x_range, prob_dist1, 'r', label=p_SampleID)
    plt.plot(x_range, prob_dist2, 'b', label=q_SampleID)
    plt.xlabel('Feature Value')
    plt.ylabel('Probability Density')
    plt.title(name.split('.')[0]+' Probability Distribution')
    plt.legend()
    F=p_SampleID+"_"+q_SampleID+"_"+name.split('.')[0]
    plt.savefig('./Js_plot/JSD_' + F + '.png')
    if(out >=0):
        F=p_SampleID+"_"+q_SampleID+"_"+name.split('.')[0]
        with open('./Js_plot/'+F,'w+') as f:
            f.write(str(out)+"\n")
        return out
    return  None
def paired_delta(df1, df2):
    allsum=0
    # 刪除元素
    list1,list2=def_na(df1, df2)
    m=len(list1)
    n=len(list2)
    if(m*m==0 or m==0 or n==0 or m!=n):
        return []
    for i in range(0,m):
        allsum=computer(list1[i],list2[i])+allsum
    d=allsum/(m)
    return abs(d)
def def_na(list1,list2):
    nan_idx1 = [i for i, v in enumerate(list1) if np.isnan(v)]
    nan_idx2 = [i for i, v in enumerate(list2) if np.isnan(v)]
    # 合并兩個列表的缺失索引
    nan_idx = list(set(nan_idx1 + nan_idx2))
    # 刪除元素
    list1 = [v for i, v in enumerate(list1) if i not in nan_idx]
    list2 = [v for i, v in enumerate(list2) if i not in nan_idx]
    return list1,list2
def tmpdffun(tmpdf):
    scaler = StandardScaler()
    grouptmp = tmpdf[['SampleID', 'group']].copy()
    features = tmpdf.drop(['SampleID', 'group'], axis=1)
    scaled_features = scaler.fit_transform(features)
    scaled_df = pd.concat([grouptmp, pd.DataFrame(scaled_features, columns=features.columns)], axis=1)
    return scaled_df
groupname_list=sys.argv[1]
groupFlag=sys.argv[2] #'TypeOfCollection'
#group1=pd.read_table(work+"group1.TypeOfCollection.info.list")
group1=pd.read_table(work+groupname_list)
if 'LabID' not in group1.columns.to_list():
    group1['LabID']=group1['SampleID'].map(lambda x:x.split("-")[0])

group1=group1[['SampleID',groupFlag,'LabID']]  ###LabID 是具體配對編號
print(set(group1[groupFlag]))
group1name=groupFlag
group1.columns=['SampleID','group','LabID']
mygroup_name=group1
mygroup_name_list=list(set(mygroup_name['group']))[0]
mygroup_name_dict_a=[]
mygroup_name_dict_b=[]
def paired_dict(tmpdf):
    a=tmpdf.query("group==@mygroup_name_list")['SampleID'].to_list()[0]
    b=tmpdf.query("group!=@mygroup_name_list")['SampleID'].to_list()[0]
    mygroup_name_dict_a.append(a)
    mygroup_name_dict_b.append(b)
mygroup_name.groupby("LabID").apply(paired_dict)

mygroup_name=mygroup_name[['SampleID','group']]
mydict={}
for name in tsv_files:
    print(name)
    mydict[name]=[]
    datafile=work+name
    frature=pd.read_csv(datafile,header=0)
    df=pd.merge(mygroup_name,frature,on=['SampleID'])
    df=df.dropna(axis=1)
    #df=df.dropna(axis=1,thresh=round( df.shape[0] / 10) )  ##列NA限制10%
    df1=tmpdffun(df)  ## scale
   # df1=df
    groupA=df1.query("SampleID ==@mygroup_name_dict_a")
    groupA['SampleID'] = pd.Categorical(groupA['SampleID'], categories=mygroup_name_dict_a, ordered=True)
    groupA = groupA.sort_values('SampleID')
    groupB=df1.query("SampleID ==@mygroup_name_dict_b")
    groupB['SampleID'] = pd.Categorical(groupB['SampleID'], categories=mygroup_name_dict_b, ordered=True)
    groupB = groupB.sort_values('SampleID')
    for lengroup in range(groupB.shape[0]):
        data_b=np.array(groupA.iloc[lengroup,2:])
        b_SampleID=groupA.iloc[lengroup,0]
        data_p=np.array(groupB.iloc[lengroup,2:])
        p_SampleID=groupB.iloc[lengroup,0]
        JSdis=js_divergence_scipy(data_b,data_p,b_SampleID,p_SampleID,name)
        if(JSdis is None):
            pass
            #mydict[name].append(0)
        else:
            mydict[name].append(JSdis)
name=[]
value=[]
for k,v in mydict.items():
    for j in v:
        name.append(k.replace(".LE5X.csv","").split(".")[-1])
        value.append(j)
newdf=pd.DataFrame({'Categories': name, 'Values': value})
newdf['Categories']=newdf['Categories'].map(lambda x:x.replace("854TF_OCF_Tcell","griffin_ocf"))
newdf['group']=groupFlag
newdf.to_csv(work+"JS_"+groupFlag,index=False,sep="\t")
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末褂傀,一起剝皮案震驚了整個濱河市淑蔚,隨后出現的幾起案子,更是在濱河造成了極大的恐慌政模,老刑警劉巖泳桦,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澈侠,死亡現場離奇詭異桥言,居然都是意外死亡,警方通過查閱死者的電腦和手機谋国,發(fā)現死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迁沫,“玉大人芦瘾,你說我怎么就攤上這事〖” “怎么了近弟?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挺智。 經常有香客問我祷愉,道長,這世上最難降的妖魔是什么赦颇? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任二鳄,我火速辦了婚禮,結果婚禮上媒怯,老公的妹妹穿的比我還像新娘订讼。我一直安慰自己,他們只是感情好扇苞,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布欺殿。 她就那樣靜靜地躺著,像睡著了一般鳖敷。 火紅的嫁衣襯著肌膚如雪脖苏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天定踱,我揣著相機與錄音棍潘,去河邊找鬼。 笑死,一個胖子當著我的面吹牛蜒谤,可吹牛的內容都是我干的山宾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼鳍徽,長吁一口氣:“原來是場噩夢啊……” “哼资锰!你這毒婦竟也來了?” 一聲冷哼從身側響起阶祭,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤绷杜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后濒募,有當地人在樹林里發(fā)現了一具尸體鞭盟,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年瑰剃,在試婚紗的時候發(fā)現自己被綠了齿诉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡晌姚,死狀恐怖粤剧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情挥唠,我是刑警寧澤抵恋,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站宝磨,受9級特大地震影響弧关,放射性物質發(fā)生泄漏。R本人自食惡果不足惜唤锉,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一世囊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腌紧,春花似錦茸习、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浸遗,卻和暖如春猫胁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跛锌。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工弃秆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留届惋,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓菠赚,卻偏偏與公主長得像脑豹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衡查,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容