对于每个从事数据科学的人来说,早期的数据清洗和探索一定是一项耗时的工作。毫不夸张地说,我们80%的时间都花在了数据的前期工作上,包括清洗、处理、EDA(ExploratoryDataAnalysis,探索性数据分析)等,前面的工作不仅仅与数据的质量有关,也关系到最终模型预测效果的好坏。每当我们手上有了一份新的数据时,我们需要通过人工观察、现场解读等方式,提前熟悉和理解这些数据,在对数据进行清洗和处理后,才开始真正的EDA流程。这个过程中最常见的操作无非是对已有数据进行基本的统计和描述,包括均值、方差、最大值和最小值、频率、分位数、分布等,实际上它们往往是比较固定和机械的。R语言中的skimr包提供了丰富的数据探索性统计信息,比Pandas中describe()的基本统计信息更加丰富。01-skmir但是在Python社区中,我们也可以实现skmir的功能,甚至比skmir更好。也就是使用pandas-profiling库来帮助我们做前期的数据探索工作。快速使用通过pipinstallpandas-profiling后,我们就可以直接导入使用了。我们只需要一行核心代码ProfileReport(df,**kwargs):importpandasapdimportseabornassnsfrompandas_profilingimportProfileReporttitanic=sns.load_dataset("Titanic")ProfileReport(titanic,title="TheEDAofTitanicDataset")如果我们是在JupyterNotebook中使用,那么就会被渲染在JupyterNotebook中直接输出到单元格。02-profilepandas-profiling库也扩展了DataFrame对象的方法,也就是说我们也可以使用DataFrame.profile_report()作为方法调用,达到和上面一样的效果。无论使用哪种方法,最终都会生成一个ProfileReport对象;如果想进一步适配JupyterNotebook,可以直接调用to_widgets()和to_notebook_iframe()分别生成挂件或对应的组件,显示效果会更漂亮,而不是显示在输出栏中。03-如果widgets不是直接在JupyterNotebook中使用,而是使用其他IDE,那么我们可以直接通过to_file()方法输出报告。需要注意的是,最后保存的文件名需要加上扩展名.html。此外,Pandas-profiling还集成了多种框架、云平台等,方便我们调用。详情参见官网(https://pandas-profiling.github.io/pandas-profiling/docs/master/rtd/pages/integrations.html)。进一步自定义报表信息生成的探索性报表虽然基本可以满足我们理解数据的简单需求,但是输出的信息也有些不足或者冗余。幸运的是,pandas-profiling也为我们提供了自己定制的可能。这些自定义配置最终会写入到yaml文件中。官方文档中列出了我们可以进一步调整的几个部分,分别对应报表中tab栏各部分的标签:vars:主要用于调整报表中呈现的数据中字段或变量的统计指标reportmissing_diagrams:主要与缺失值字段的可视化展示有关correlations:顾名思义就是调整各个字段或变量之间相关性的部分,包括是否计算相关系数,以及相关的阈值等interactions:主要是两个字段或变量之间的相关图。Presentingsamples:对应Pandas中的head()和tail()方法,即预览前后有多少条数据。可以在这些部分中指定许多参数。感兴趣的朋友可以直接参考官方文档(https://pandas-profiling.github.io/pandas-profiling/docs/master/rtd/pages/advanced_usage.html),本文不再赘述。所以我们可以直接在代码中手动编写调整,像这样:profile_config={"progress_bar":False,"sort":"ascending","vars":{"num":{"chi_squared_threshold":0.95},"cat":{"n_obs":10}},"missing_diagrams":{'heatmap':False,'dendrogram':False,}}profile=titanic.profile_report(**profile_config)profile.to_file("titanic-EDA-report.html")将所有的配置信息写在一个字典变量中,然后将键值对以**variable的形式解包,这样就可以根据key对应到相应的参数。除了代码中配置的写法,如果你对yaml配置文件的写法略有了解,那么我们就不需要在代码中一一写了,直接在yaml文件中修改即可。不仅修改了官方文档中列出的配置选项,还可以修改未列出的参数。由于配置文件太长,这里我只放出基于官方默认配置文件config_default.yaml修改的部分:#profile_config.ymlvars:num:quantiles:-0.25-0.5-0.75skewness_threshold:10low_categorical_threshold:5chi_squared_threshold:0.95cat:length:Trueunicode:Truecardinality_threshold:50n_obs:5chi_squared_threshold:0.95coerce_str_to_date:Falsebool:n_obs:3file:active:Falseimage:active:Falseexif:Truehash:Truesort:"desceding"修改yaml文件后,我们只需要通过config_file参数指定即可生成报告时,配置文件所在的路径就像这样:df.profile_report(config_file="yourfilepath.yml")通过将配置文件与核心代码分离,提高了我们代码的简洁性和可读性。最后,pandas-profiling库为我们提供了一种方便快捷的数据探索方式,提供了一些比基本统计信息更为丰富的信息(如缺失值相关图、相关图等),可以为我们提供与早期数据。发现节省了大量时间。但是由于pandas-profiling生成的报表维度比较固定和模板化,想要让报表更加丰富的朋友可能需要自己做一些额外的工作;同时需要注意的是,pandas-profiling更适合在中小数据集上使用。随着数据量的增加,报表呈现将明显变慢,报表生成将花费更多时间。如果你还需要对大数据集进行EDA,那么正如官方文档所说,你最好在不影响数据分布的情况下,使用抽样或者抽样来降低样本量。官方还表示,未来版本将使用modin、spark、dask等高性能库或框架作为可扩展后端。到时候,生成大数据集的EDA报告可能就不成问题了。
