读取数据python绘制心电图(python制作随机机心电图)
Python如何从文件读取数据
1.1 读取整个文件
要读取文件,需要一个包含几行文本的文件(文件PI_DESC.txt与file_reader.py在同一目录下)
PI_DESC.txt
3.1415926535
8979323846
2643383279
5028841971
file_reader.py
with open("PI_DESC.txt") as file_object:
contents = file_object.read()
print(contents)
我们可以看出,读取文件时,并没有使用colse()方法,那么未妥善的关闭文件,会不会导致文件收到损坏呢?在这里是不会的,因为我们在open()方法前边引入了关键字with,该关键字的作用是:在不需要访问文件后将其关闭
1.2文件路径
程序在读取文本文件的时候,如果不给定路径,那么它会先在当前目录下进行检索,有时候我们需要读取其他文件夹中的路径,例如:
现在文件PI_DESC.txt存储在python目录的子文件夹txt中
那么我们读取文本内容的代码得修改为:
with open("txt\PI_DESC.txt") as file_object:
contents = file_object.read()
print(contents)
给open参数传递的参数得给相对路径
在Windows中,使用反斜杠(\),但是由于python中,反斜杠被视为转义字符,在Windows最好在路径开头的单(双)引号前加上r
相对路径:即相对于程序文件的路径
绝对路径:即文本在硬盘上存储的路径
使用绝对路径的程序怎么写呢 ?
with open(r"D:\python\txt\PI_DESC.txt") as file_object:
contents = file_object.read()
print(contents)
1.3逐行读取
读取文件时,可能需要读取文件中的每一行,要以每一行的方式来检查文件或者修改文件,那么可以对文件对象使用for循环
file_path = 'txt\PI_DESC.txt'with open(file_path) as file_object:
for line in file_object:
print(line)
程序运行结果如下:
通过运行结果我们可以看出,打印结果中间有很多空白行,这些空白行是怎么来的呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,而print语句也会加一个换行符,因此每行末尾就有2个换行符:一个来自文件,另外一个来自print,消除这些换行符,只需要使用方法rstrip()
file_path = 'txt\PI_DESC.txt'with open(file_path) as file_object:
for line in file_object:
print(line.rstrip())
打印结果
通过运行结果我们可以看出,打印结果中间有很多空白行,这些空白行是怎么来的呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,而print语句也会加一个换行符,因此每行末尾就有2个换行符:一个来自文件,另外一个来自print,消除这些换行符,只需要使用方法rstrip()
file_path = 'txt\PI_DESC.txt'with open(file_path) as file_object:
for line in file_object:
print(line.rstrip())
打印结果
1.4创建一个包含文件各行内容的列表
使用关键字with时,open()返回的文件对象只能在with代码块可用,如果要在with代码块外访问文件的内容,可在with块中将文件各行存储在一个列表,并在with代码块外使用该列表
file_path = 'txt\PI_DESC.txt'with open(file_path) as file_object:
lines = file_object.readlines()for line in lines:
print(line.rstrip())
1.5使用文件的内容
在上面一节中我们提到把数据提取到内存中,那么我们就可以对数据进行随心所欲的操作了
需要:将圆周率连在一起打印出来(删除空格),并打印其长度
file_path = 'txt\PI_DESC.txt'with open(file_path) as file_object:
lines = file_object.readlines()pi_str = ''for line in lines:
pi_str += line.strip()print(pi_str.rstrip())print(len(pi_str.rstrip()))
file_path = 'txt\PI_DESC.txt'with open(file_path) as file_object:
lines = file_object.readlines()pi_str = ''for line in lines:
pi_str += line.strip()print(pi_str.rstrip())print(len(pi_str.rstrip()))
注意最后print语句并没有缩进,如果是缩进的话就会每取一行打印一次
打印效果如下
如何用Python绘制Circos图
用Python实现Circos图的绘制在线绘制的Circos有一定局限性,如对数据的要求、个性化的局限和处理速度等的问题,但如果你是一个Pythoneer或者喜欢用更加Pythonic的方式来个性化地绘制Circos图,那么今天就跟随我一起用代码实现这一目标吧!
安装Circos包
首先,登录Python的包索引网站Python?Package?Index(PyPI,正确读音是:Pie?Pee?Ai),找到Circos包的下载页:
该包/模块的作者是我的好友Eric?Ma。你可以选择下载wheeler文件,然后本地安装。也可以在shell下直接通过pip进行安装:
pipinstallcircos
注意,所支持的Python版本必须是3.x,对2不支持。
选择数据
当安装了circos包后,我们就可以直接应用这个包来写代码了。为了演示方便,我需要应用一些数据。作为内科医师,就让我来展示一下老本行:处理药物与肝酶细胞色素P450的相互关系的可视化。由于是为了抛砖引玉,所以绘制出的Circos图相对简单。
我们先从美国FDA官网下载不同细胞色素相关的各种口服药物表。共202种常用的口服药物,涵盖内科学、肿瘤学、神经科和心理学等学科。数据文件如下:
可以看到这个数据的结构:是按肝细胞色素酶进行分类,共分8个列。这8个细胞色素酶分别是:CYP1A2,CYP2B6,?CYP2C8,?CYP2C9,?CYP2C19,?CYP2D6,?CYP2E1和CYP3A4。我们将要建立各个口服药与这些肝酶之间关系的Circos图,从而了解通过相同肝酶代谢或转化的药物之间是否存在相互作用。
导入各个模块和读入数据
导入各个模块:
fromcircosimportCircosPlot
importxlrd
importpandasaspd
importnumpyasnp
读入文件:
filename='.\\MedicationInteraction.xlsx'
book=xlrd.open_workbook(filename)
print('File?loaded!')
提取数据:
nrows=book.sheet_by_name('Sheet1').nrows
header=book.sheet_by_name('Sheet1').row_values(0)
data=[book.sheet_by_name('Sheet1').row_values(i)?fori?inrange(1,?nrows)]
df=pd.DataFrame(data,?columns?=header)
df[df=='']?=?np.nan
读取后,药物和酶的数据为pandas的DataFrame数据结构,细胞色素P450酶的名字为columns的名字。我们可以检查一下数据:
修数据,尤其是处理NA数据
df_dict={}
foriinrange(len(df.columns)):
df_dict[df.icol(i).name]?=list(df.icol(i).dropna())
节点和连线
创建节点(nodes)数据,在我这个例子里就是各个药物和肝酶:
nodes=[]
forkeyindf_dict.keys():
nodes.extend(df_dict[key])
nodes=list(nodes)
headers=list(df.columns)
enzymes=['0']?*?5
forheaderinheaders:
enzymes.append(header)
enzymes.extend(['0']*5)
nodes.extend(enzymes)
创建连线(edges)数据,我们应用tuple(元组)这个数据结构来表示药物与特定肝酶之间的关系:
edges_origin=[]
forkeyindf_dict.keys():
forvalue?indf_dict[key]:
edges_origin.append((key,?value))
绘图
绘制Circos图:
c=CircosPlot(nodes,?edges_origin,?radius?=10,
nodecolor="blue",
edgecolor="red",
)
c.draw()
得到了下面这张所有药物与肝酶之间的图:
左上方是8个肝脏细胞色素P450酶(CYP1A2、CYP2B6、CYP2C8、CYP2C9、CYP2C19、CYP2D6、CYP2E1和CYP3A4)。其它点即为202种口服药物。每种药物都与参与代谢和转化它的P450酶相连。与相同酶连接的不同药物,理论上应该都存在相互作用,但具体如何还要看与酶的作用机理。
个性化绘图
如果我们打算分别可视化出不同肝酶的关系图形,我们只需改变连线信息,即edges信息:
edges=[]
#8205;forvalueindf_dict['CYP2B6']:
edges.append(('CYP2B6',?value))
c=CircosPlot(nodes,?edges,?radius?=10,
nodecolor="orange",
edgecolor="orange",
)
c.draw()
从而我们得到了各种肝酶所代谢和转化药物的图形
用PS将它们合并:
相同肝酶所代谢和转化的药物用相同颜色的edges表示。
显示特定药物
最后,我们可以挑选其中一些感兴趣的药物来进行观察,例如,我从这202个药物中指定几个我感兴趣的药物:
propafenone(心律平),?acetaminophen(对乙酰氨基酚),?paclitaxel(紫杉醇),?ibuprofen(布洛芬),?losartan(洛沙坦),?omeprazole(奥美拉唑),?carvediolo(卡维地洛),?codeine(可待因),?theophylline(茶碱),?quinidine(奎尼丁),?verapamil(异搏定),?lovastatin(洛伐他汀),?nitrendipine(尼群地平)
然后重新建立edges:
medications=['propafenone',?'acetaminophen',?'paclitaxel',?'ibuprofen',?'losartan',?'omeprazole',?'carvedilol',?'codeine',?'theophylline',?'quinidine',?'verapamil',?'lovastatin',?'nitrendipine']
edges_candidate=set()
formedicationinmedications:
foredge?inedges_origin:
if?medication==edge[1]:
edges_candidate.add(edge)
edges_candidate=list(edges_candidate)
然后再绘图:
c=CircosPlot(nodes,?edges_candidate,?radius?=10,
nodecolor="black",
edgecolor="black",
)
c.draw()
从而得到这张图。
求问怎样用python/python turtle画“心”
python turtle画4个同心圆方法
import?turtle
#draw?first?circle
turtle.penup()
turtle.goto(0,-200)
turtle.pendown()
turtle.circle(200)
#draw?second?circle
turtle.penup()
turtle.goto(0,-150)
turtle.pendown()
turtle.circle(150)
#draw?third?circle
turtle.penup()
turtle.goto(0,-100)
turtle.pendown()
turtle.circle(100)
#draw?fourth?circle
turtle.penup()
turtle.goto(0,-50)
turtle.pendown()
turtle.circle(50)
画笔的坐标默认在0,0,就以它为圆心。
因为turtle画圆的时候是从圆的底部开始画的,所以需要找到四个圆底部的坐标
比如:
第一个半径为200的圆,底部为(0,-200)
第二个半径为150的圆,底部为(0,-150)
第三个半径为100的圆,底部为(0,-100)
第四个半径为 ?50的圆,底部为(0, ?-50)
画的时候按下面的步骤:
抬起画笔:turtle.penup()
移动到相应坐标:turtle.goto(坐标)
放下画笔:turtle.pendown()
画圆:turtle.circle(半径)
效果如下图所示:
关于体温、性别、心率的临床数据简单分析
数据选自 Journal of the American Medical Association (
)关于体温、性别、心率的临床数据,并对以下问题进行数据分析:
人类体温均值真的是98.6F吗?( Journal of the American Medical Association entitled "A Critical Appraisal of 98.6 Degrees F, the Upper Limit of the Normal Body Temperature )
体温样本数据是否服从正态分布?
不正常的体温是多少?
男性和女性的正常体温有明显的区别吗?
体温和心率是否有相关性?
为了找到以上问题的答案,我们使用python来对样本数据做一下分析。
1. 人类体温均值真的是98.6F吗?
体温散点图
注:样本共130条数据,其中male数据65条,female数据65条。
importpandasaspddf = pd.read_csv('', header =None,sep ='\s+',names=['体温','性别','心率'])#读取数据df['体温'].describe()'''
count? ? 130.000000
mean? ? ? 98.249231
std? ? ? ? 0.733183
min? ? ? 96.300000
25%? ? ? 97.800000
50%? ? ? 98.300000
75%? ? ? 98.700000
max? ? ? 100.800000
'''
结论:可以看到 体温的均值为 98.25 F.
2. 体温样本数据是否服从正态分布?
检测体温是否服从正态分布:以下分别使用 kstest、shapiro、normaltest三种方法来检验。
u = df['体温'].mean()# 计算均值std = df['体温'].std()# 计算标准差ks_test = kstest(df['体温'],'norm',(u,std))#KstestResult(statistic=0.06472685044046644, pvalue=0.645030731743997)shapiro_test = scipy.stats.shapiro(df['体温'])#(0.9865770936012268, 0.233174666762352)normaltest_test = normaltest(df['体温'], axis=None)#NormaltestResult(statistic=2.703801433319236, pvalue=0.2587479863488212)
结论:三种检验的pvalue值均大于5%,因此体温值服从正态分布。
体温分布直方图
我们通过绘制体温的密度分布直方图也可以看出来服从正态分布。
3. 不正常的体温是多少?
利用箱线图剔除异常值
体温分布箱线图
# 计算上下四分位数Q1 = df['体温'].quantile(q =0.25)#97.8Q3 = df['体温'].quantile(q =0.75)#98.7#异常值判断标准, 1.5倍的四分位差 计算上下须对应的值low_quantile = Q1 -1.5*(Q3-Q1)#96.44999999999999high_quantile = Q3 +1.5*(Q3-Q1)#100.05000000000001# 输出异常值value = df['体温'][(df['体温'] high_quantile) | (df['体温'] low_quantile)]'''
超过上下须的异常体温值:
0? ? ? 96.3
65? ? ? 96.4
129? ? 100.8
'''
结论:体温值大于100.05F,小于96.45F的均为异常体温。
4. 男性和女性的正常体温有明显的区别吗?
剔除异常体温后,分析样本中男女体温是否有明显区别
df2 = df.loc[(df['体温'] != 96.3)(df['体温'] != 96.4)(df['体温'] != 100.8)]#排除异常值df3 = df2.loc[df2['性别']==1]man_narmal_mean_temperature = df3['体温'].mean()#男士体温均值 98.13281250000003df4 = df2.loc[df2['性别']==2]woman_narmal_mean_temperature = df4['体温'].mean()#女士体温均值 98.38730158730158
结论:女性体温均值比男性体温均值偏高.
5. 体温和心率是否有相关性?
df2.corr()'''
? ? ? ? ? 体温? ? ? ? 性别? ? ? ? 心率
体温? 1.000000? 0.192293? 0.243285
性别? 0.192293? 1.000000? 0.054193
心率? 0.243285? 0.054193? 1.000000
'''df2.corr('kendall')'''
? ? ? ? ? 体温? ? ? ? 性别? ? ? ? 心率
体温? 1.000000? 0.159488? 0.176732
性别? 0.159488? 1.000000? 0.064551
心率? 0.176732? 0.064551? 1.000000
'''df2.corr('spearman')'''
? ? ? ? 体温? ? ? ? 性别? ? ? ? 心率
体温? 1.000000? 0.190609? 0.265460
性别? 0.190609? 1.000000? 0.077409
心率? 0.265460? 0.077409? 1.000000
5. 结论:由上面三种相关系数可以看出 心率和体温具有正相关。