
此次质朴学习源自“以赛促学”发送请求与获取内容# 引入requests库importrequests#发送请求(爬取“云南神农农业产业集团有限公司的主要财务指标”)rrequests.get(https://oss.xinchanjiao.com/bigdata/company/2021/csv/cwbbzy_605296.csv)#检测请求的状态码print(返回的状态码:,r.status_code)#header中猜测的响应内容编码方式print(header中猜测编码方式:,r.encoding)#内容中分析出的响应内容编码方式print(内容中分析的编码方式:,r.apparent_encoding)#更换解码方式r.encodingr.apparent_encoding r.textimportrequests#引入requests库headers{user-agent:Mozilla/5.0(Windows NT10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/96.0.4664.45Safari/537.36}rrequests.get(https://www.amazon.cn/dp/B078K5FXZ V/reflp_1759032071_1_6,headersheaders)#检测请求的状态码print(返回的状态码:,r.status_code)#变换编码方式r.encodingr.apparent_encodingprint(r.text[500000:530000])解析内容与保存数据Xpath在浏览器中安装扩展xpath helper插件可以辅助解析xpath地址#引入所需要的库importrequestsfromlxmlimportetreeimportpandasaspd#设置头信息进行绕过反爬headers{user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36}#发送请求resprequests.get(https://search.jd.com/Search?keyword烟台苹果amp;encutf-8amp;pvidb41e02073b39402f96f74c92e51e2fab,headersheaders)htmlresp.content.decode()elementetree.HTML(html)#店铺nameelement.xpath(//*[idJ_goodsList]/ul/li/div/div[5]/span/a/text())#金额payelement.xpath(//*[idJ_goodsList]/ul/li/div/div[2]/strong/i/text())#查看结果alist(zip(name,pay))dfpd.DataFrame(a,columns[店铺,金额])df用了request .get方法后返回一个response对象这个对象里面存的是服务器返回的所有信息包括响应头响应状态码等。其中返回的网页部分会存在.content和.text两个对象中。如果需要获得这些网页原始数据我们可以通过r.text 或 r.content来获取数据。.text 存的是.content 编码后的字符串.content中间存的是字节码一般来说 .text直接用比较方便返回的是字符串 但是有时候会解析不正常导致返回的是一堆乱码。这时需要用.content.decode(‘utf-8’)使其正常显示。总的来说.text是现成的字符串.content还要编码但是.text不是所有时候显示都正常需要用.content.decode()进行手动编码原文链接https://blog.csdn.net/sehun_sx/article/details/123764263# 引入库importrequests# 自定义爬虫函数defspider(url,filename):try:rrequests.get(url,timeout6)r.raise_for_status()# 专门与异常打交道的方法r.encodingr.apparent_encodingif(filename.endswith(xls)orfilename.endswith(xlsx)):withopen(filename,wb)asf:# 保存数据f.write(r.content)else:withopen(filename,w,encodingutf-8)asf:# 保存数据f.write(r.text)returnprint(文件,filename,下载成功)except:returnprint(文件下载失败)# 调用爬虫函数输入URL及文件名称spider(https://oss.xinchanjiao.com/bigdata/company/2021/list/hy001000.json,农林牧渔.json)数据处理NumpyNumpy的核心数据结构是ndarray支持任意维数的数组但要求单个数组内所有类型必须相同。ndarray 是 NumPy 的核心数据结构用于存储同类型元素的多维数组。它提供了高效的数值计算能力并支持多种操作和属性。数据与列表的区别节省存储空间和提升运算的速度创建数组的方法np.array(列表、数组)例如np.array([1,2,3]),np.array((4,5,6))np.arange(1,5,2) [1,3]#设置起始值10、终止值20,步长2cnp.arange(10,20,2)#arange创建数组reshape指定数组尺寸dnp.arange(23).reshape(3,4,2)array([[[0,1],[2,3],[4,5],[6,7]],[[8,9],[10,11],[12,13],[14,15]],[[16,17],[18,19],[20,21],[22,23]]])数组ndarray属性利用rand函数生成[0,1)范围内的一个浮点数/一维数的浮点随机数/二维数组的浮点随机数。anp.array([0,1,2,3,4,5,6,7,8])#求最大值、最小值print(np.max(a))print(np.min(a))np.eye() 是 NumPy 中用于生成二维数组单位矩阵的函数其对角线元素为 1其余元素为 0。它常用于线性代数、矩阵运算以及机器学习模型初始化等场景。np.zeros 是 NumPy 库中的一个函数用于创建一个指定形状和数据类型的数组并用零填充。importnumpyasnp Inp.eye(3)print(I)# 输出# [[1. 0. 0.]# [0. 1. 0.]# [0. 0. 1.]]importnumpyasnp# 创建一个3x3的二维数组cnp.zeros((3,3))print(c)# 输出:# [[0. 0. 0.]# [0. 0. 0.]# [0. 0. 0.]]Series DataFramePython数据分析SeriesDataFrame部分运算groupby条件筛选也称带条件判断的数据筛选可以通过条件在数据中筛选出条件为True的数据常见的形式有Ø 选取某列满足一定条件的行df[df[‘列’]条件]选取某列满足一定条件的行Ø 选取多列满足一定条件的行df[(df[‘列1’]条件)(df[‘列2’]条件)]:选取多列满足一定条件的行。#通过布尔索引选取某列满足一定条件的行df[df[门店]门店03]#通过布尔索引选取多列满足多个条件的行df[(df[销售收入]400000)(df[销售成本]300000)]#通过布尔索引选取多列满足一定条件的行df[(df[销售收入]400000)|(df[销售成本]300000)]# 这个左右左右的必须要加!!!#loc索引器选取一行df.loc[2]#loc索引器选取行列组合df.loc[[0,3],[门店,销售收入]]#loc索引器-按条件选取行df.loc[:3,门店:销售毛利]#loc索引器-按条件选取行列df.loc[(df[销售毛利]200000),[门店,销售毛利]]数据读写读取Excel数据#导入Pandas库importpandasaspd#读取Excel文件利用converters参数强制设置年、月、门店三列转换为字符串类型。dfpd.read_excel(rhttps://oss.xinchanjiao.com/upload/default/20220914-1bbc5a0e-9409-4ffa-adab-06f15090e2fb.xlsx,sheet_name0,converters{年:str,月:str,门店:str})#显示数据前5行df.head()写入Excel#导出新Excel表格,名称门店销售数据2表名为毛利率df.to_excel(门店销售数据2.xlsx,sheet_name毛利率)#显示出数据d追加若用to_excel()函数写到一个已经存在的Excel将会把原有的Excel表格数据全部覆盖。可以配合使用追加写入Excel表ExcelWriter()函数解决此问题。#简洁写法:在原有的Excel文件追加内容withpd.ExcelWriter(门店销售数据2.xlsx,modea)aswriter:df.to_excel(writer,sheet_name毛利率2)csv#读取CSV文件datapd.read_csv(rhttps://oss.xinchanjiao.com/upload/default/20220919-9d33c07c-6a50-4cbf-9480-abee2a8d4660.csv,encodinggbk)data.head()#获取前5行#写入CSV文件data.to_csv(data1.csv,encodinggbk)数据特征分析sum/max/min/describeaxis0时逐列计算axis1时逐行计算。默认axis0案例返回的describe常见的统计指标中筛选出“销售成本”的平均值。#describe()函数单独提取指标数据筛选出“销售成本”的平均值。df.describe()[销售成本][mean]# 或df.describe().loc[mean,销售成本]排序sort_index 参数axis默认为0行索引,1列索引排序ascending默认为True升序排序,False降序排序#根据索引进行排序#axis0行索引#ascendingFalse代表降序排列#inplaceTrue代表直接对df进行修改#并查看前五行数据df.sort_index(axis0,ascendingFalse,inplaceTrue)df.head()案例计算销售毛利前10的数据如销售毛利相同根据销售收入升序排序。(根据多列进行排序先根据销售毛利降序排序如销售毛利相同再根据销售收入升序排序。)#按照销售毛利降序、销售收入升序进行排序。#ascendingFalse代表降序排列#inplaceTrue代表直接对df进行修改df.sort_values([销售毛利,销售收入],#排序列ascending[False,True],#排序方式inplaceTrue)#直接修改df.head(10)#查看前10累积函数案例1筛选出各家门店一月份(Jan)的数据根据销售收入降序排列2使用cumsum计算累计销售收入赋值给累计销售收入列。#筛选月份为一月(Jan)的数据根据销售收入降序排列df1df.loc[df[月]Jan].sort_values(销售收入 ,ascendingFalse)#计算销售收入的累计和赋值给累计销售收入列。df1[累计销售收入]df1[销售收入].cumsum()#查看数据前5行df1.head()数据合并merge()函数merge()只能用于两个DataFrame间列方向进行内联或外联合并操作默认取交集concat()函数concat()可用于两个及多个DataFrame间行/列方向进行内联或外联合并操作默认对行(沿y轴)取并集merge默认为inner内连接contactaxis0 默认为纵向连接行增加axis1 横向连接列增加#df1,df2,调整axis参数用concat进行横向列连接df4pd.concat([df1,df2],axis1,sortFalse)df4数据清洗数据清洗主要包括缺失值清洗、逻辑错误清洗、重复数据清洗、格式内容清洗重复查找重复项duplicated() 如果对应的数据是重复的 会返回 True否则返回 False。删除重复项drop_duplicates() 删除重复数据#引入库importpandasaspd#读取数据dfpd.read_excel(rhttps://oss.xinchanjiao.com/upload/default/20221109-780c231e-ec8d-4f7a-a878-15ca651452f7.xlsx)#查找重复项print(df)df.duplicated()#删除重复项并重置索引df.drop_duplicates(inplaceTrue,ignore_indexTrue)df缺失缺失值处理包含两个步骤缺失值判断和空值处理。根据判断的缺失值数量和重要性决定缺失值处理的方式。axis 默认为0表示逢空值剔除整行如果设置参数 axis1 表示逢空值去掉整列df.dropna(axis1,howall)若axis0则对各行数据进行填充若axis1则对各列数据进行填充。#以0填充所有缺失值df.fillna(0)df.fillna(df.max())df.fillna(df.mean())异常最常用的常见其他异常处理形式特殊字符删除可以先将所有数据转换为字符串然后使用replace()函数进行替换。一般与高阶函数同时使用。数据类型更改先使用属性查看数据类型再根据需求使用astype()函数更改数据类型①整数可以转换为浮点数②浮点数转整数时直接取整数位③字符串转数值型时字符串需全为数字#使用循环方式完成数据清洗foriinrange(df.shape[0]):forjinrange(df.shape[1]):df.iloc[i,j]str(df.iloc[i,j]).replace( ,)使用applymap(对DataFrame中的每个元素应用一个给定的函数):#applymap函数完成数据清洗dfdf.applymap(lambdax:str(x).replace( ,))Pandas 高阶函数map()应用在单独一列Series的每个元素中apply()应用在Series、DataFrame的行或列中applymap()应用在DataFrame的每个元素中map#导入Pandas库importpandasaspd#读取Excel文件datapd.read_excel(rhttps://oss.xinchanjiao.com/upload/default/20220914-1bbc5a0e-9409-4ffa-adab-06f15090e2fb.xlsx)#显示数据前5行data.head()#方法1使用for循环foriindata[销售收入].index:data.loc[i,门店级别]优秀门店ifdata.loc[i,销售收入]400000else非优秀门店data.head()# 方法二使用map#使用Series.map()data[门店级别]data[销售收入].map(lambdax:优秀门店ifx400000else非优秀门店)data.head()map()函数可接收另一种参数形式字典。用于明确且少量分类的数据对应。案例将数据中刚插入的’门店级别’列中’优秀门店’替换成’A类门店’其他替换为’其他门店’。#将数据中刚插入的门店级别列中优秀门店替换成A类门店其他替换为其他门店data[门店级别]data[门店级别].map({优秀门店:A类门店,非优秀门店:其他门店})dataapply语法Series.apply(function,args,axis)argscab参数接收元组单个元素需加逗号隔开axis控制需要的数据操作是沿着0轴还是1轴进行(1)axis0代表操作对列column进行,(2)axis1代表操作对行row进行。案例用apply()函数将销售收入、销售成本、销售毛利三列数据修改为以万元显示,保留四位小数同时修改列名。• 对列进行操作需要指定axis0按列计算案例用apply()函数将销售收入、销售成本、销售毛利三列数据修改为以万元显示,保留四位小数同时修改列名。• 对列进行操作需要指定axis0。#沿着0轴计算销售收入、销售成本、销售毛利沿着数据列分别进行除以10000,保留四位小数 data[[销售收入,销售成本,销售毛利]]data[[销售收入,销售成本,销售毛利]].apply(lambdax:round(x/10000,4),axis0)#修改列名data.rename(columns{销售收入:销售收入(万元),销售成本:销售成本(万元),销售毛利:销售毛利(万元)},inplaceTrue)data.head()当沿着轴0(axis0)进行操作时会将各列(columns)默认以Series的形式作为参数传入到指定的操作方法中操作后返回相应结果。按行计算案例计算每笔数据的毛利率并将计算结果后添加“%”并存储在【毛利率】列。#按行(axis1)的实现计算毛利率计算结果后添加”%”并存储在【销售毛利率】列deffunc_01(row):row[销售毛利率]format(row[销售毛利]/row[销售收入],.2%)#format()格式化函数returnrow data[[销售收入,销售成本,销售毛利]].apply(func_01,axis1)或者这样浓缩成一行【这里换了一种格式化字符串的方式不同的格式化方式详见 Python教学中的一些小细节】data[销售毛利]data[[销售收入,销售成本,销售毛利]].apply(lambdarow:f{row[销售毛利]/row[销售收入]*100:.2f}%,axis1)当apply设置了axis1对行进行操作时会默认将每一行数据以Series的形式 (Series的索引为列名) 传入指定函数返回相应的结果。applymap()对DataFrame中的每个元素执行指定方法的操作#导入Pandas库importpandasaspd#读取Excel文件利用converters参数强制设置年、月、门店三列转换为字符串类型。datapd.read_excel(rhttps://oss.xinchanjiao.com/upload/default/20220914-1bbc5a0e-9409-4ffa-adab-06f15090e2fb.xlsx,sheet_name0,converters{年:str,月:str,门店:str})#显示数据前5行data.head()data[[销售成本,销售毛利]]data[[销售成本,销售毛利]].apply(lambdax:round(x,1))data数据分组与聚合分组gruopby1使用map函数将月对应为01-12月;2按照月分组分析销售整体数据。#创建一个英文月份和数字月份对照的字典将英文月份转换为数字字符串monthdict{Jan:01,Feb:02,Mar:03,Apr:04,May:05,Jun:06,Jul:07,Aug:08,Sep:09,Oct:10,Nov:11,Dec:12,}df[月]df[月].map(monthdict)#根据月列进行分组求各月总和df.groupby(月).sum()聚合aggagg()函数支持根据分组按多种方式进行聚合可以针对一列或多列选择相同或不同的聚合方式。基本用法单列单函数df[‘col’].agg(‘sum’)单列多函数df[‘col’].agg([‘sum’, ‘mean’])多列同函数df.agg(‘sum’)多列多函数df.agg([‘sum’, ‘mean’])不同列使用不同聚合函数df.agg({‘score’: [‘mean’, ‘max’], ‘height’: [‘min’]})可为每列指定不同数量和类型的聚合操作。配合 groupby 使用df.groupby(‘cls’).agg({‘score’: [np.min, np.max], ‘height’: np.mean})支持分组后对不同列执行不同聚合返回多级列索引结果。案例将数据根据年、月列聚合后计算销售收入列的总和销售成本列的平均值#将根据年、月列聚合计算销售收入总和销售成本平均值df.groupby([年,月]).agg({销售收入:sum,销售成本:mean})注意事项:groupby分组后后直接调用sum()函数会对所有数值列进行求和计算groupby分组后使用聚合函数agg()可以指定某一列或多列选择特定的聚合方式实现相同或不同的聚合计算。透视表与轴向转换数据透视表-pivot_table()函数pivot_table()函数类似于Excel里的数据透视表功能只要指定行、列、值和值的计算类型计数、合计、平均等就可以做出一个数据透视表来。pivot_table()函数语法pandas.pivot_table(dataframe,indexNone,columnsNone,valuesNone,aggfunc‘mean’,fill_valueNone,marginsFalse,dropnaTrue,margins_name‘All’,observedFalse)案例用Pandas做数据透视表行为’月’列为’年’统计指标为销售收入的合计和销售毛利的平均数。#行为月列为年统计指标为销售收入的合计和销售毛利的平均数在透视表中加上汇总栏 df1pd.pivot_table(data,index[月],columns[年],values[销售收入,销售毛利],aggfunc{销售收入:sum,销售毛利:mean},fill_value0,marginsTrue,margins_name汇总)轴向转换-stack、unstack轴向转换数据行列索引相互转换类似于Excel中的行列转置包括stack()函数和unstack()函数灵活运用轴向转换功能可轻松实现数据重塑。• stack()是将Dataframe的columns索引转换到index的索引• unstack()是将Dataframe的index索引转换到columns的索引换到最内侧了#根据月列进行分组求各月总和data1data.groupby(月).sum()data1#使用stack函数将销售收入、销售成本、销售毛利索引转换到行索引data1.stack(level-1)默认 level-1 销售收入、成本、毛利等先换到最内侧然后 level0 将最外侧行索引换到列索引