python-生存曲线数据转换器

相信很多人跟我一样在做存活图的时候被前期的数据处理折磨的不行,特别是样本较多的情况下,把各个时间的死亡数转换成做存活图需要的格式,太浪费时间了。于是用python写了一个小软件,将原始数据转换成做图的数据格式。效果如图

python-生存曲线数据转换器

      python-生存曲线数据转换器

        python-生存曲线数据转换器

下面直接附上代码

#!/usr/bin/env python
#  coding:utf-8

from tkinter import *
import os
import os.path
import win32ui
import xlrd
import xlsxwriter
import time
import re

class convert(object):
    global filename

    # 初始化GUI界面
    def __init__(self):
        self.top = Tk()
        self.convertFm = Frame(self.top)
        self.chooseB = Button(self.convertFm, text = 'Choose', command = self.choosefile,
            activeforeground = 'white',
            activebackground = 'blue').pack()
        self.convertB = Button(self.convertFm, text='Convert', command=self.convertfile,
            activeforeground='white',
            activebackground='green').pack()
        self.convertFm.pack()

    #打开文件选择对话框
    def choosefile(self):
        global filename
        # 1表示打开文件对话框
        dlg = win32ui.CreateFileDialog(1)
        dlg.DoModal()
        # 获取选择的文件名称
        filename = dlg.GetPathName()


    def convertfile(self):
        global filename
        p = 0
        q = -3
        if filename[-4:-1] + filename[-1] == '.xls' or filename[-5:-1] + filename[-1] == '.xlsx' :
            #正则表达式提取文件名
            pattern = re.compile('(.*?\\\)*(.*?)\.xls.?', re.S)
            name = re.findall(pattern, filename)
            # 读取excel文件
            file_read = xlrd.open_workbook(filename)
            # 读取文件中第一个sheet
            sheet0 = file_read.sheet_by_index(0)
            nrows = sheet0.nrows
            # 创建输出文件,若存在将覆盖
            output = xlsxwriter.Workbook("%s-output.xlsx" % name[0][1])
            # 创建输出文件中的sheet
            sheet = output.add_worksheet()
            for i in range(nrows):
                # 如果上一行存活时间读取了,跳过下一行死亡数的读取
                if p == 1:
                    p = 0
                    continue
                # 判断是否是空白行
                if sheet0.row_values(i)[0] != '':
                    p = 1
                    q = q + 3
                    dict = {}
                    # 遍历存活时间这一行,将存活时间和相应的死亡数保存到字典中
                    for j in range(len(sheet0.row_values(i))):
                        if sheet0.row_values(i)[j] != '':
                            dict[sheet0.row_values(i)[j]] = sheet0.row_values(i+1)[j]
                    n = -1
                    #遍历字典,将数据按照作图的格式输出至output文件中
                    for key in dict:
                        if dict[key] != 0:
                            for m in range(int(dict[key])):
                                n = n + 1
                                sheet.write(n, q, key)
                                sheet.write(n, q + 1, 1)
            #转换完成提示
            self.finishedFm = Frame(self.top)
            self.finishLb = Label(self.finishedFm, text = 'Done').pack()
            self.finishedFm.pack()
            self.top.update()
            time.sleep(1)
            self.finishedFm.destroy()



        #若选择的不是excel文件,弹出警告
        else:
            self.warningFm = Frame(self.top)
            self.warning = Label(self.warningFm, text="Please choose a .xls or .xlsx file").pack()
            self.know = Button(self.warningFm, text = 'I known', command = self.warningquit).pack()
            self.warningFm.pack()


    def warningquit(self):
        self.warningFm.destroy()


def main():
    d = convert()
    mainloop()

if __name__ == '__main__':
    main()

注意:1. 原始数据文件中,死亡数量一定是在存活时间下一行,这样才能识别

          2. 没有数量限制,可以将所有样本的数据都一起转换

          3. 输出文件在此软件(代码)的文件夹中

另外我将这个脚本转化成了exe,电脑没有安装python的朋友也可以使用。附上下载链接

链接:https://pan.baidu.com/s/18JJxw8szmtq0U_7n_MFKUg 密码:438m