文档介绍:该【基于pandas实现烟草物流中心数据处理 】是由【1781111****】上传分享,文档一共【7】页,该文档可以免费在线阅读,需要了解更多关于【基于pandas实现烟草物流中心数据处理 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..FORUM?烟草物流中心数据处理摘要:烟草物流中心项目的规划及设计都离不开数据分析,随着大数据的不断发展Excel、R和SQLServer对数据的前期处理越来越不能满足需求,而Python中的pandas工具集可以快速获取大数据中的有效信息并易于对其进行按需处理。本文以某烟草公司物流中心真实销售数据为例,详细介绍了基于pandas的数据导入及清洗工作。关键词:烟草物流中心、Pythonpandas、数据导入、数据处理文/温泉詹雪―、引言又能只导入需求的列进行分析;具有良订单编号、客户编号、品规及销售数量目前在烟草物流中心的项目规划好的交互模式,可以一个命令即时返回等,如果需要区分异型烟,可再多增加及设计中广泛应用的数据分析工具主要一个结果,也可以一次性运行所有命令一列异型烟标记列。有、R、SQLServer等。其中,得到最终结果;此外,烟草物流中心的Excel对可处理的数据行、列数都有明订单分批现象给处理日期数据增加了难三、处理工具显限制。以Excel版为例,最多可度,pandas则可以自动解析目标列中类本文以某烟草物流中心一年的实际处理行、列的数据,更似日期格式的数据,,详细说明适用于小型数据的简单分析;而商业软据的数据聚合运算提供便利。如何使用pandas..版来实现数据的件SQLServer的可伸缩性有限,当多用导入、基本清洗及整理。户连接时性能会变差,更适用于数据类二、处理目的由于pandas是Python的工具集型相对规整的中小型数据;R在统计方数据处理为数据分析及方案规划打之一,正常情况下,在使用前都需要安面表现突出,但处理上GB数据时的运行下基础,原始数据中一般会含有大量冗装大量的工具包,安装步骤也非常复速度较为缓慢,对于数据类型复杂的大余数据,比如同时存在条烟编号列和条杂,而使用基于Python的Anaconda型数据来说,、烟名称列,且为一一对应关系,在导入Navigator软件作为数据处理工具可以避SMartdata、cleanerR等也不如Python数据时,只需保留数值型的条烟编号列免上述问题^AnacondaNavigator是的工具集使用灵活。以减少內存占用;再比如数据中含有多一个开源的集成了大量工具包的工具合Python作为一款免费的开源软件,列关于客户信息的数据、且每一列都无集,可以一次性安装所有运行Python时在Windows、MacOS、Linux等操作法作为客户信息识别的唯一标识时,在需要的各种工具包,降低了安装难度。系统中都有其对应的版本,具有代码简保证其对应关系的前提下将几列或所有打开AnacondaNavigator中洁、可读性高等优势,其中的pandas关于客户信息的数据列合并成为新的一的JupyterNotebook,在原始数据工具集提供了大量处理数据的函数和方列,并指定为“,,用于数据挖掘和数据分析,同时也标识客户信息的数据列。因此在数据分JupyterNotebook工程文件,利用提供数据清洗功能。pandas拥有更高的析前,一般会先根据需求设定目标列,importpandasaspd命令导入所需的数据交换性,对xlsx、csv、Mdf、txt、然后导入对应的原始数据,最后对数据pandasl具集。html等格式数据提供统一的导入模块,进行清洗和整理。并转换为DataFrame格式数据;通过参对烟草物流中心的销售数据进行处四、数据预览数设置既能导入少量的数据进行预览,理时,通常把目标列设为:订单日期、数据预览是在正式导入数据前,对物流技术与应用/.:..数据进行的简单查看,其主要有两个目的:一是确认数据是否可以使用在上文新建的JupyterNotebook文件中,导pandas进行导入;二是查看是否含有不需要导入的冗余数据列,。“df”,代码如下:大部分数据分析软件不具备数据预览的功能,只能一次性导入所有数df=('',nrows=)据,一旦报错就会被迫终止导入。而pandas工具集在这一方面存在天然返回结果,如图。的优势,可通过参数设置导入指定行数据来对原始数据进行实验性导入,由图可知,因为文件自身的编码与pandas帮助我们对数据建立基本认识。默认采用的“utf-”解码方式不相符,从而使pandas中提供了多种导入数据的函数,并且都可以实现预览目的,“utf-”编码解码器无法解码该数据,所以返回可根据不同数据格式选择对应的导入函数。()函数报错提示,可通过添加参数encoding来解决。及其提供的部分参数实现对数据的预导入,参数如下:在含有中文编码的情况下,除常用的“gbk”nrows设置导入行数,例如nrows=,通过查看前五行数据,快编解码器外,还有“gb”、“hz”、速判断数据是否存在编码、格式等问题,以及是否需要导入所有列;“big”等。skiprows:设置需要忽略的行数或要跳过的行号列表,当样本数量修改代码如下:很大时,可结合函数进行随机抽取,比如随机抽取%的行数。df=('';encoding='gbk';nrows=)运行后,系统不再报错,()函数画编码格式报错查看成功导入的前五行数据,返回结果如图。因此,在正式导入数据前,利用参数nrows或skiprows进行数据预导入,可避免因编解码器错误、数据类型复杂等问题带来的重复操作,以提高数据导入效率。通过简单预览,我们可得出:()该数据没有列名;()第七列产品名称列与第六列产品编号列含义相同,因此第七列可当做冗余数据,无需导入,以加快速度、节省內存占用;()前三列分别代表年、月、日,可合并为新的一列并转换为日期格式。画数据预览但完整数据中可能还会存在预览中无法看出[]:('*,nrows=,encodings*菖bk')的问题,比如是否存在缺失值、异常值等问题,需要在导入所有行数据后再进行判断。In[]:()Out[]:XSY双B(@经典)否XSYOOO真龙〔娇子)否五、数据导入XSYOOO三沙(椰王绿)()函数中常用于XSYOOO宝岛否数据预览的两个参数,本章中继续使用此函数中XSYOOO娇子(X)是的以下参数对数据进行正式导入,并解决列名及XSYOOO娇子(宽窄好运)否冗余数据问题,减少导入的数据量,加快数据处理速度:[图数据导入结果usecols:设置导入指定列,可以是列名或对应的索引值。在此数据中,以目标列为基础导入,需要导入的列索引值为:usecols=[,,,,,,,;header:指定第几行作为列名称,默认为,若如本文中数据需要另外指定列名,此参数设?SAIWi??None;?XSvOOOQilOOMM置为XSVOOOOHOOMM如names:指定列名,当header=None时,?eOOl??HXSYOOOOnOOM&ft&OW./物流技术与应用:..AUTHORITATIVEFORUM权威?添加此参数设置列名。:图info()函数返回值综上,数据导入代码如下:In[]:(null_counts=True,memory_usage=,deep*)df=(''!encoding='gbk'!usecols=[!l!!!!!!]!header=N<class'pandas,core,,>RangeIndex:entries,toone!names=['year'!'month'!'day'!'customer_Datacolumns(totalcolumns):code'!'order_no'!'product_code'!'qty'!'special_yearnon-nulobjecttype'])monthnon-nulfloatdaynon-nulfloat查看返回结果,如图。customer_codenon-nulfloat由图结果可知,目标列数据已导入且命名order_nonon-nulobject成功,数据预览中的问题也得到解决。但返回product_codenon-nulobjectQtynon-nulfloat一个第列及第列为混合类型的警示:因为在special_typenon-nulobjectpandas内部以块的形式处理文件,会降低解析时dtypes:float(),object()的内存使用量,但如果在一列中有不止一个数据memoryusage:?GB类型存在时,将被系统判断为混合类型并返回此警示,可以设置“low_memoRy二False”,或利画提取缺失值用d^pe参数指定每列的数据类型,但会占用大量内存和时间,可以等数据全部导入后再进行列数[]:df[-any(axis=l)]据类型的指定。yearmonthdayeustomer_eodeorder_noproduet_eodeqtyspeeial_typeERROR:()函数查看数据前五行发现:ORA-:snapshottooold:rollbacksegment...NaNNaNNaNNaNNaNNaNNaN数据中的“month”、“day”、“qty”及“customeR_code”等四列均被转换为浮点类删除缺失值型,由于pandas不支持存储含有缺失值的整型及布尔型数组,当引入含有缺失值的整型数组时,In[]:(how=‘any',inplace二True)根据pandas对数据的处理规则,该列数据将被转换为浮点型,因此可以推断出这四列数据中可能In[]:(null_counts=True,memory_usage=,deep')含有缺失值,需要进行单独验证。<class'pandas,core,'>至此数据导入工作已经完成,除导入本文数IntIndex:entries,to据需要的参数外,()函数中还有许多Datacolumns(totalcolumns):其他常用参数可以在导入数据时快速设置:yearnon~nulobjectmonthnon~nulfloatsep:指定分隔符,若其他非逗号分隔符的daynon~nulfloat文件,也可以通过修改该参数导入;customer_codenon-nulfloatindex_col:指定列数据作为行索引,默认order_nonon-nulobjectproduct_codenon-nulobject值为None;Qtynon-nulfloatna_filter:默认为True,是否检查丢失值special_typenon-nulobject(空字符串或空值),在没有任何缺失值的数据dtypes:float(),object()memoryusage:?GB中,传递参数na_filter=False可提高读取大文件的速度;skip_blank_lines:默认为True,忽略空白parse_dates:指定一列或多列字符串合并解析为日期格式。行而不是解析为NaN;error_bad_lines:默认为True,若有含大六、数据处理量字段的行(例如大量逗号)在默认情况下会引发数据处理是在数据成功导入后,对数据进行的缺失值及无效值异常,并且不会返回任何DataFrame,若error_清洗、数据类型转换、日期格式处理等一系列操作,以达到规整数bad_lines=False,这些“异常行”将不被导入;据的目的,为接下来的数据分析做准备。warn_bad_lines:默认为True,如果上一利用pandas对数据处理之前,可以先通过info()函数查看数据个参数设为False,而warn_bad_ines=True,的详细信息,例如数据类型、空值及内存占用情况等,info()函数中则将为每个“异常行”输出警告;的常用参数有以下几个:物流技术与应用/.:..画转换类型及结果查询()本数据共行,除“列以外的其他列都只含有个非空值行,说In[]:df[[,year*,,month*,,day,,‘qty']]=df[[*year','month,,,day*,,qty,]]-astype(,int,}明除“year”列以外的其他列中都含有个空值;In[:df[customer_code,]=df[?customer_code,].astype(*int)()数据类型存在问题,例如“、In[:df['special_type,]=df['special_type'].astype('category')“day“int、“”和列应转换为整In[]:(null_counts=True,memory_usage=,deep,)型,“customer_code<class'pandas,core,*〉intIntIndex:entries,to位整数,应转换为整型;Datacolumns(totaicolunms):yearnon-nullint(),其中,最后一列数monthnon-nullintdaynon-nullint据为异型烟标识列,代表是否为异型烟,存在大customer_codenon-nullintorder_nononnullobject量重复字段且唯一值少,可目录化为category类product_codenon-nullobjectqtynon-nullint型,不但可以继续显示原內容为阅读提供方便,special_typenon-nullcategorydtypes:category(),int(),int(l),object()memoryusage:.GB而且可以在占用更少內存的同时兼顾运行速度。?缺失值的处理在已经导入的原始数据中可能会存在少量缺画数据描述结果失值,这会使某些函数及代码无法运行或增加其运行时长,例如使用to_datetime()函数将某列或In[]:(include=[,int','int,]).agg([*max,min'])某几列转换为日期格式时,当数据中存在缺失值[]:monthdaycustomer_codeqty时就会报错。因此,为使数据分析结果的准确性max更高,需要对这些可能存在的缺失值进行优先处min-理。首先利用isnull()函数和any()函数提取数据中的缺失值,设置any()函数中的参数axis=选取提取负值含有缺失值的行,观察其分布情况,判断缺失值是否对数据分析结果有影响,使用代码如下:In[]:df[df['qty']〈=]df[().any(axis=)]yearmonthdaycustomer_codeorder_noproduct_codeqtyspecialtype查看返回结果,如图。SY-是由图可知,除”列以外的其他列中的缺失值均位于和两行,在判壑数据保存图定不影响整体分析结果的情况下,将此两行数据删除;若缺失值较多或对数据分析结果有影响,In[]:()则需根据实际情况对缺失值进行填充。Out[]:ye/rmonthdaycustomer_codeorder_noproduct_codeqtyspecial_typedate接下来再利用dropna()函数删除缺失值,相XSY否--关参数如下:XSYaOOOl--XSY--how:当整行或整列中有至少一个缺失值或XSYaaOOl--全为缺失值时,通过此设置确定删除方法,默认XSY是--,删除存在缺失值的行或列;“删除全为缺失值的行或列;memory_usage:是否显示DataFrame中所有元素(包括索axis:确定按行向下判断还是按列向右判断,弓I)的总內存使用情况,,始终显示內存情况,默认axis=,按行向下判断;不显示內存情况,“,精确计算內存使用情况;inplace:默认False,若inplace=True,直接null_counts:是否显示非空计数,,始终显示非空数在原始数据上进行;量,“False”,不显示非空数量。subset:删除指定列中含有缺失值的行或指使用代码如下:定行中含有缺失值的列。(null_counts=True,memory_usage='deep')删除缺失值并查看结果,代码如下:查看返回结果,如图。(how='any',inplace=True)由图可知:(null_counts=True,memory_./物流技术与应用:..AUTHORIATIVEFORUM权威usage='deep')图日期设为索引返回结果,如图。[]:([*year*,'month','day*],axis=l,inplace=True)由图可知,()函数后所有列的行数相同,说明数据中已无缺失值。In[]:(*date',inplace=True).数据类型的转换In[]:()在pandas中通常利用astype()函数实现对数Out[]:,先返回一个结果作为预览,并不会改变原始数据,因此在转换时可先运行代码查--XSYOOO否看转换结果,确认无误后再通过赋值的方法对原--XSY否--XSY否始数据进行更改。--XSY否按照上文中提到的分别将“year”、--GXSYDD是、day”和“qty”列转换为int整型,“customer_code”列转换为int整型,“special_type”列转换为category类型,代码图]方式一运彳亍如下:'pandasaapddf[['year';'month';'day','qty']]=df[['year';'mtn':ttl??dfl?.?neodinf,I*;!).J...I.*...'■ionth','day';'qty']].astype('int')eeiteeneeYalltlM:&IS>df['customer_code']=df['customer_code'].astype('int')aoiateta,xrnnooi?oosMMetOOOBdf['special_type']=df['special_type'].toimXTrWO^iOOMMKWXSVOOOCHOO?HISastype('category')XSVOOOCHQOMS?OP,,miMiaXSVVMCitOC?Hsiotfiooeia全部数据列类型转换成功后,()函数查看内存占用情况,返回结果如图。由图可知,,比图]方式二运行转换前减少了%,因此在分析大型数据前尽量把中文字符处理成占用字节更少的数据类型,可In:*:X-TM_c?*,?ncvdi^'J.<xF,.tetdrr-Nw.-?rw',*wnth','car.*cucto*r有效减小内存占用,提升运行速度。'atrlaclh?p?<*raln<:Shw??tyw?.SpecltrUeoctorMtUJtim;.?=*aar*■lmlAce!rw)除上述操作以外,数据中可能还存在异常Ulit■:i.??值,比如本文数据中的“month”列中是否有大Ulttia?:s于的数值,比如“day”列是否有大于的数Calltiae:u值,再比如“qty”列中是否有零或负值等,可以la:$;KIMdttt,InvlarKTriMiMHtlat:InIt!df?.DMdOtut?JX'?-nXSVDOOC'OOMW?*<?coe本文通过使用对烟草物绐?”XSYMQHMM■SOCxhiXSVOOOOUOOM?$*?edNci?>iix*¥ooooiiooMi??ec?owio流中心的实际销售数据进行导steKooe入、清洗、整理工作,将类型不规则、存在缺失值的数据规整为图数据保存图数据类型固定且只含有目标列的In;'dat?~i'数据,为数据分析、挖掘及可视C丄(Kti&fiaQjUi?£oad?.:XrpHaniaf:C?<'Mv??it?dffVMp?cif*d化奠定基础。tTP*opttoaonftorsttlcv_*uorT*?a^eXXXSVWCMMSeO?I$t^-?CO?OV-C<?X$VOCIXH<IOM*Xl--t???OHXOXSVOOOOHOOMM?aoO>”“cwaoxsvooohwommi*o<ooce物流技术与应用/.:..()函数来提取上述可能含有异常值的整形列并#将日期列“date”设置为索引。判断其最值情况,代码如下:()(include=['int','int']).agg(['max','min'])返回结果,如图和图。返回结果如图。为更直观的感受上述两种方式在运行速度上由图可知,只有“qty-,不符合实际情况,的差别,新建一个JupyterNotebook文件并导入利用代码“df[df['qty']<=]”将“qty”列中所有小于或等于零的数pandas,借助%time函数来分别计算两种方式据全部提取出来,返回结果如图。的代码运行时间。本文用于实现的电脑基本配由图可知,“qty列中只存在一个负值,由于负值的数量很置为:Windows位操作系统、IntelXeon少,可直接作为异常值进行删除,或根据实际分析需求进行处理。CPUE-V处理器、G內存、。在分析基于时间序列的数据时,经常会碰到日期格式处理和转换第一种方式的代码如下:问题,而pandas有着强大的日期数据处理功能,将其设置为整个数%timedf=('',en据的索引,更方便于利用resample()函数对数据进行频率转换和时间coding='gbk',usecols=[,,,,,,,],header序列重采样等操作。下文将介绍两种情况下将数据转换为日期格式的=None,names=['year','month','day','customer_方法:code','order_no','product_code','qty','special_()中小型数据集type'],parse_dates={'date':['year','month','day']}运用read_csv()函数中参数parse_dates,在导入数据时直接将,index_col='date')一列(如,--,//等)()析(以本文数据为例parse_dates={'date':['year','month','day']}),运行结果,如图。可快速将数据转换为日期格式。但该方法在解析时间格式时对內存占第二种方式的代码如下:用较大,数据导入时间较长,且如果待解析列格式不统一或存在空%timedf=('',en值、异常值时,将不会转换为日期格式,只能作为普通数值类型返coding='gbk',usecols=[,,,,,,,],header回,因此这个方法常适用于数据量较小的情况。=None,names=['year','month','day','customer_()大型数据集code','order_no','product_code','qty','special_当数据量很大且日期格式不标准时,可以在导入目标数据后,使type'])用to_datetime()函数将DataFrame中指定的一列或几列合并后转换%(how='any;inplace=True)为datetimeH期格式,且to_datetime可以解析多种不同的日期表示%timedf['da