读取数据python绘制心电图(python制作随机机心电图)

http://www.itjxue.com  2023-04-10 22:18  来源:未知  点击次数: 

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. 结论:由上面三种相关系数可以看出 心率和体温具有正相关。

(责任编辑:IT教学网)

更多

推荐计算机等级考试文章