当前位置: 首页 > 科技观察

用Python做一个数据预处理的小工具,多种操作,一键完成,非常实用!

时间:2023-03-18 22:40:39 科技观察

平时我们在使用Python进行数据处理分析的时候,在导入大量的库之后,我们通过预览数据来查看数据是否存在缺失值、重复值等异常,并进行处理.本文将结合GUI工具PySimpleGUI来讲解如何制作一个属于自己的小型数据预处理工具,让这个过程也可以自动化!最终效果如下本文将分为三个部分:制作GUI界面数据处理,主要讲解打包测试会涉及到以下模块:PySimpleGUIpandasmatplotlib1.GUI界面制作思路是老规矩,先说说思路再补充代码。首先说一下使用PySimpleGUI的四个过程#128071;导入模块==>创建元素并填充布局==>创建表单==>创建事件循环从元素中,从图中我们可以知道我们需要的元素是指令的菜单栏,数据预处理框那个看起来凹陷的,框内的三个单框Option值,读取文件路径的3个元素(固定文本,输入文本,浏览按钮),三个按钮“查看,处理,关闭”。总的来说,我们需要整个表单中的所有元素都处于分布状态的中间。菜单栏分布在窗体边缘的左侧。使用行串联的总分布。从事件来看,我们需要在说明菜单中加入用户要求的注意事项。至于文件读取位置,我们设置我们常用的两种数据存储格式(.xlsx、.xls)的Excel格式。看完之后,我们选择数据预处理框架中的一个处理。然后,我们可以在一个弹框里查看每一个错误,查看后最后对数据进行处理。处理过程需要用处理后的数据覆盖原来的数据文件。整个过程必须连续不间断。这里有一个提示:每次数据分析前最好做好备份,以免在分析过程中找不到原始数据文件的尴尬。看完代码是不是有种要动起来的感觉?!下面来实现一波,先看完整代码,再详细反汇编]layout=[[sg.Menu(menu_def,tearoff=True)],[sg.Frame(layout=[[sg.Radio('重复值处理',"RADIO1",size=(15,1),key="dup"),sg.Radio('缺失值处理',"RADIO1",size=(15,1),key="mis"),sg.Radio('异常值处理',"RADIO1",default=True,key="war")]],title='数据预处理',title_color='green',title_location='n',relief=sg.RELIEF_SUNKEN,tooltip='选择一种处理方式')],[sg.Text('文件位置',size=(8,1),auto_size_text=False,justification='right'),sg.InputText(enable_events=True,key="lujing"),sg.Button('浏览',key='getf')],[sg.Button('View',key='look'),sg.Submit('Process',key='handle'),sg.Cancel('Close')]]window=sg.Window('特征工程',layout,default_element_size=(40,1),grab_anywhere=False)whileTrue:event,values=window.read()ifevent=='getf':text=sg.popup_get_file('请点击浏览按钮或自行填写输入文件的绝对路径',title='获取文件',file_types=(("ExcelFiles","*.xlsx"),("ExcelFiles","*.xls"),))sg.popup('prompt','Areyousuretoselectthefile---',text)window['lujing'].update(text)ifevent=="look":'''用户点击查看按钮触发的事件'''ifevent=="handle":'''用户点击处理按钮触发的事件'''ifevent=="取消"orevent==sg.WIN_CLOSED:breakifevent=="注意":'''注意事项写'''代码解释其实有了思路之后,你会发现一切似乎都变得简单了。下面解释一下相关参数的作用。首先是matplotlib.use("TkAgg"):使用matplotlib模块和调用这个函数的目的是为了在我们的异常值处理(箱线图显示)中使用它,也就是改变图像的显示方式:TkAgg(交互式背景)。所谓交互背景,就是可以对图片进行任意操作,如放大缩小区域、查看数值等功能。之所以调用这个函数,一是因为我们使用GUI有那种交互的感觉,二是如果数据量大,箱线图就会小,方便查看。其次sg.ChangeLookAndFeel('GreenTan'):改变表格的颜色。那么menu_def就是菜单栏,使用格式["",[""]]来定义主菜单栏和子菜单栏。tearoff功能是在每个字段之间添加一条可爱的虚线。sg.Frame():这与sg.columns()元素相同。它主要用于多个子元素。这里我们设置了relief参数,让整个边框看起来是凹的。tooltip参数是一个小的提示框,出现在鼠标移动框的位置。title_location参数的用法很有意思。是标题字符串的位置设置,包括(n、s、e、w、se等)。你很快就会发现这个位置与其他元素布局位置设置不同。它以地理位置坐标作为子参数。sg.Radio:单选框,设置所有单选框的子参数group_id相同,这样就可以在三个选项中选择一个,这里我们使用“RADIO1”作为group_id。sg.Button():我们在整个GUI中使用了4个按钮,其中有一个专门的按钮Cancel。sg.popup():比较初级的弹出框,用于显示提示类的关键信息。sg.popup_get_file():这是一个高级弹出元素,允许用户从带有文本输入字段和浏览按钮的弹出窗口中选择文件。效果如下2.数据预处理GUI部分完成后,我们接着讲解数据处理部分,主要针对重复值、缺失值和离群值。数据准备这里使用的是2020年10月28日的A股行情。数据展示:可以看到有重复行和缺失值。重复值处理对于二维列表DataFrame,使用Pandas模块是最方便最符号化的office简化模块importpandasaspddf=df.read_excel('绝对文件路径')imfor=df[df.duplicated()]imfor=str(imfor)首先调用Pandas模块,读取文件路径。这里之所以使用绝对路径而不是相对路径,是因为后面打包的GUI不依赖文件,依赖Python自带的环境,所以相对路径读取是无法识别的。df[df.duplicated()]Pandas中的这个函数将重复值对应的行以二维列表的形式打印出来。这里将df变量改为str字符串形式,因为后面我们在GUI中使用弹窗的元素时,需要将其作为字符串加载。最终处理重复值的方法如下:df=df.drop_duplicates(inplace=True)只有一行代码,却可以删除整个数据表中的所有重复值,可见威力熊猫功能。至于为什么要用inplace=True,是因为删除功能并没有改变原表结构,所以新表需要覆盖原表。缺失值处理,先看代码。其实我一年前写过一篇关于缺失值处理的相关文章。.sum()#df.isnull().any()imfor1=str(imfor1)对于有缺失值的数据表,df.isnull()或df.isna()检查空值。该函数的作用是判断是否为空值,如果为空值则赋值True,否则赋值False。这里我们使用df.isnull().sum()来统计每个列字段缺失值的个数。如果数据量很大,也可以使用df.isnull().any()查看只有缺失值的行。解决办法,处理缺失值的方法有很多,比如取均值、取中值、删除、取下面的值等,这里我们使用取上面的值的方法来填充。df=df.fillna(method='pad')离群值处理所谓离群值就是一个数域中出现一个或多个异常值。例如,如果一个百位数字出现在一列只有个位数的数字中,则百位数字是异常值。在Python中有两种检测异常值的方法:箱线图观察和标准差观察。这里我们选择箱线图来观察。箱形图是一种统计图表,用于显示所选数据的分散情况。通过设定标准,将大于或小于箱形图上下线的值表示为异常点。如图所示,下四分位数表示样本中有25%的数据小于这个数,记为。上四分位数表示25%的样本大于此数字,表示为。上四分位数与下四分位数之差加上上四分位数之差的1.5倍为上缘,反之为下缘。在Pandas中,可以调用.boxplot()函数绘制箱线图importpandasaspddf.boxplot()打包及效果展示所有代码写完后,我们就可以使用pyinstaller打包了。假设你的程序名为yuchuli.py,在cmd窗口输入即可完成打包。pyinstaller-Fyuchuli.py打包后,exe在Python文件所在文件夹的dist文件夹中。下面启动看看效果,可以看到我们需要的数据预处理的三个功能:重复值、缺失值、离群值都可以按照指定的方法进行处理!当然你也可以自己修改本文提供的方法,定制一款属于你平时习惯的数据预处理小软件!