实训1_获取产业数据并存储_预处理与简单分析

Posted 山城棒棒儿军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实训1_获取产业数据并存储_预处理与简单分析相关的知识,希望对你有一定的参考价值。

目录

本文jupyter notebook资料下载地址百度网盘

1. 实训一. 获取产业数据并存储、预处理与分析

1.1 实训内容概述

    1. 爬取"https://s.askci.com/data/economy/" 前5个行业(左侧导航栏前5个)的经济指标资产负债收入利润成本费用产值指标
    1. 将爬取的结果按产业名为文件名,5个指标名为表单名存储为excel文件;
    1. 煤炭开采和洗选业为分析对象,查看经济指标的总体数据信息、统计数据信息、前5行、后5行数数据等;
    1. 煤炭开采和洗选业为分析对象,查看经济指标的中企业个数亏损企业数的变化情况,并绘制出图形予以展示;
    1. 煤炭开采和洗选业为分析对象,查看2021年度 经济指标的中亏损总额并可视化,再查看其最大值、最小值及相应的月份的详细经济指标;
    1. 煤炭开采和洗选业为分析对象,查看成本费用中的中管理费用,并采用3西格玛方法或者箱型图法查看是否有异常的点。
    1. 附加补充题:将爬取结果保存到mysql中。

1.2 实训知识点:

1.2.1 爬取网页数据

1.2.1.1 一般格式

  • 爬虫一般步骤:

    • 导包
    • 设置请求头
    • 发起get请求获得响应
    • 对响应进行编码转换
    • 解析响应
    • 获取目标字段
  • 爬虫解析方法:

    • lxml解析(xpath)
    # 导库
    import requests   
    from lxml import etree
    
    # 获得响应,解析响应
    r = requests.get(url,headers)
    html = etree.HTML(r.text)

    # 获得xpath路径,输入xpath方法获得元素内容
    element = html.xpath('xpath路径')
- BeautifulSoup(css、find...)                  
   # 导库
   import requests
   from bs4 import BeautifulSoup
   
   # 获得响应,解析响应
   r = requests.get(url,headers)
   soup = BeautifulSoup(r.text, 'lxml')
   
   # 分步解析获得各元素
   # css选择器
   # 方法:F12-->选择元素-->右键菜单:复制selector  
   element = soup.select("CSS选择器")
   
   # find方法
   # 方法:F12-->选择元素,观察
   element = soup.find("标签",class_= "类名")  #等其他选择
  • 乱码解决
    • 响应中包含的内容:
    • r.status_code:HTTP请求的返回状态,200表示连接成功,404表示失败
    • r.text:HTTP响应内容的字符串形式,即url对应的页面内容
    • r.encoding:从HTTP header中猜测的响应内容编码方式(
    • r.apparent_encoding:从内容中分析出的响应内容编码方式(备选编码方式)
    • r.content:HTTP响应内容的二进制形式
    • r.url:返回对象的网址
    • r.cookies:返回对象的cookis

实例: 采用xpath获取行业名

# 导入库        
import requests
from lxml import etree

# 设置请求头
headers = 
    'user-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36',
    'Host':'s.askci.com'

# 设置请求url
url = 'https://s.askci.com/data/economy/00001/'   

# 获得响应
r = requests.get(url, headers = headers) 

# 编码转换,避免乱码
r.encoding = r.apparent_encoding

# 采用etree.HTML解析
html = etree.HTML(r.text)

# 采用xpath获得行业名
html.xpath('/html/body/div[4]/div[2]/div[1]/a[3]/text()')

1.2.1.2 采用pandas读取网页表格数据

一般格式

pandas.read_html(io,
             match='.+', 
             flavor=None, 
             header=None, 
             index_col=None, 
             skiprows=None, 
             attrs=None, 
             parse_dates=False, 
             thousands=',', 
             encoding=None, 
             decimal='.',
             converters=None, 
             na_values=None, 
             keep_default_na=True, 
             displayed_only=True)

输入参数:

  • io:str、路径对象或 file-like 对象
    字符串、路径对象(实现 os.PathLike[str] )或 file-like 对象实现字符串 read() 函数。该字符串可以表示 URL 或 HTML 本身。请注意,lxml 只接受 http、ftp 和文件 url 协议。如果您有一个以 ‘https’ 开头的 URL,您可以尝试删除 ‘s’ 。

  • match:str 或编译的正则表达式,可选
    将返回包含与此正则表达式或字符串匹配的文本的表集。除非 HTML 非常简单,否则您可能需要在此处传递一个非空字符串。默认为“.+”(匹配任何非空字符串)。默认值将返回页面中包含的所有表。此值被转换为正则表达式,以便 Beautiful Soup 和 lxml 之间的行为一致。

  • flavor:str,可选
    要使用的解析引擎。 ‘bs4’ 和 ‘html5lib’ 是同义词,它们都是为了向后兼容。 None 的默认值尝试使用 lxml 进行解析,如果失败,则返回 bs4 + html5lib 。

  • header:int 或 list-like,可选
    用于制作列标题的行(或 MultiIndex 的行列表)。

  • index_col:int 或 list-like,可选
    用于创建索引的列(或列列表)。

  • skiprows:int, list-like 或切片,可选
    解析列整数后要跳过的行数。基于 0。如果给定整数序列或切片,将跳过由该序列索引的行。请注意,单个元素序列表示“跳过第 n 行”,而整数表示“跳过 n 行”。

  • attrs:字典,可选
    这是一个属性字典,您可以通过它来识别 HTML 中的表格。在传递给 lxml 或 Beautiful Soup 之前,不会检查它们的有效性。但是,这些属性必须是有效的 HTML 表格属性才能正常工作。例如,

    • attrs = ‘id’:‘table’
      是一个有效的属性字典,因为 ‘id’ HTML 标记属性是本文档中任何 HTML 标记的有效 HTML 属性。

    • attrs = ‘asdf’:‘table’
      不是有效的属性字典,因为 ‘asdf’ 不是有效的 HTML 属性,即使它是有效的 XML 属性。可以在此处找到有效的 HTML 4.01 表格属性。可以在此处找到 HTML 5 规范的工作草案。它包含有关现代 Web 表属性的最新信息。

  • parse_dates:布尔型,可选
    有关详细信息,请参阅read_csv()。

  • thousands:str,可选
    用于解析数千的分隔符。默认为 ‘,’ 。

  • encoding:str,可选
    用于解码网页的编码。默认为 None 。None 保留先前的编码行为,这取决于底层解析器库(例如,解析器库将尝试使用文档提供的编码)。

  • decimal:str,默认“。”
    识别为小数点的字符(例如,对欧洲数据使用“,”)。

  • converters:字典,默认无
    用于转换某些列中的值的函数的字典。键可以是整数或列标签,值是接受一个输入参数、单元格(不是列)内容并返回转换后的内容的函数。

  • na_values:可迭代,默认无
    自定义 NA 值。

  • keep_default_na:布尔值,默认为真
    如果指定了 na_values 并且 keep_default_na 为 False,则默认 NaN 值将被覆盖,否则将附加到它们。

  • displayed_only:布尔值,默认为真
    是否应该解析带有“display:none” 的元素。

返回值:

  • dfs
    数据帧列表。

注意:

在使用此函数之前,您应该阅读有关 HTML 解析库的问题。

调用此函数后,期望进行一些清理。例如,如果在传递 header=0 参数时列名转换为 NaN,则可能需要手动分配列名。我们尝试尽可能少地假设表格的结构,并将表格中包含的 HTML 的特性推送给用户。

这个函数搜索 **< table >**元素并且仅用于 < tr >< th > 行和 < td > 每个内的元素 < tr > 或者表中的元素。 < td > 代表“table data”。该函数试图正确处理colspan和rowspan属性。如果函数有 < thead > 参数,它用于构造标题,否则该函数会尝试在正文中查找标题(通过仅放置行 **< th >**元素到标题中)。

与read_csv() 类似,在应用skiprows 之后应用header 参数。

此函数将始终返回 DataFrame 列表,否则将失败,例如,它不会返回空列表。

1.2.2 DataFrame存储为excel表格

  • 使用to_excel()函数将DataFrame导出到excel文件
    要将单个对象写入excel文件, 我们必须指定目标文件名。如果要写入多个工作表, 则需要使用目标文件名创建一个ExcelWriter对象, 并且还需要在必须写入的文件中指定工作表。也可以通过指定唯一的sheet_name来写入多张纸。必须保存所有写入文件的数据的更改。

1.2.2.1 DataFrame的.to_execel()函数

  • 一般格式:
    DataFrame.to_excel(excel_writer, 
                 sheet_name='Sheet1', 
                 na_rep='', 
                 float_format=None, 
                 columns=None,
                 header=True, 
                 index=True, 
                 index_label=None, 
                 startrow=0, 
                 startcol=0, 
                 engine=None,
                 merge_cells=True, 
                 encoding=None, 
                 inf_rep='inf', 
                 verbose=True, 
                 freeze_panes=None)
  • 输入参数:
    • excel_writer:文件路径或现有的ExcelWriter。
    • sheet_name:它是指包含DataFrame的工作表的名称。
    • na_rep:指定要写入的表如果有空值(NAN),则需要填入的字符串。
    • float_format:这是一个可选参数, 用于格式化浮点数字符串。
    • columns:指定哪些列要写入新表。
    • header:是否把列名也写入excel表,默认为True,即写入
    • index:是否把索引也写入excel表,默认为True,即写入。
    • index_label:引用索引列的列标签。如果未指定, 并且标头和索引为True, 则使用索引名称。如果DataFrame使用MultiIndex, 则应给出一个序列。
    • startrow:默认值0。它指向转储DataFrame的左上单元格行。
    • startcol:默认值0。它指向转储DataFrame的左上方单元格列。
    • engine:这是一个可选参数, 用于写入要使用的引擎, openpyxl或xlsxwriter。
    • merge_cells:返回布尔值, 其默认值为True。它将MultiIndex和Hierarchical行写为合并的单元格。
    • encoding:这是一个可选参数, 可对生成的excel文件进​​行编码。仅对于xlwt是必需的。
    • inf_rep:它也是一个可选参数, 默认值为inf。它通常表示无穷大。
    • verbose:返回一个布尔值。它的默认值为True。
      它用于在错误日志中显示更多信息。
    • Frozen_panes:它也是一个可选参数, 用于指定要冻结的最底部一行和最右边一列。

1.2.2.2 DataFrame的.to_excel()函数存储多个sheet的问题

大家尝试df.to_excel()会发现,多次调用此函数存同一个excel文件的不同sheet时,会把旧文件覆盖掉,无法保存为多个sheet。
其解决办法如下:

    if not os.path.exists(excelFileName):
    html_tables[0].to_excel(excelFileName,sheet_name=sheet_names[0], index=True)
else:
    with pd.ExcelWriter(excelFileName, engine='openpyxl', mode='a') as writer:
            html_tables[0].to_excel(writer,sheet_name=sheet_names[0], index=True)
  • 第⼀个if语句是在Excel⽂件不存在时,⽤于直接构建;
  • 第⼆个else语句则是⽤ExcelWriter对已存在的Excel⽂件进⾏追加。
  • 注意,文件名"excelFileName"需使用".xlsx",若用".xls"可能会出现 **" File is not a zip file"**错误

1.2.2.3 Pandas的ExcelWriter构造函数

  • 一般格式
    以下首先对ExcelWriter的帮助文档进行整合:
    ExcelWriter是一个用于将DataFrame对象写入Excel工作表的类。默认的处理是对xls文件使用xlwt方法,对xlsx文件使用openpyxl方法,对ods文件使用odf方法。可以参见DataFrame.to_excel的文档查看这三种方法的典型用法。ExcelWriter应当视为一个上下文管理器(context manager),否则,call close()函数进行保存并关闭任何已打开的文件的处理(handles)

通过查看ExcelWriter的py文件,可以看到该类的定义框架如下所示:

class ExcelWriter(builtins.object):
    def ExcelWriter(
        path: 'FilePathOrBuffer | ExcelWriter', 
        engine=None, 
        date_format=None, 
        datetime_format=None, 
        mode: 'str' = 'w', 
        storage_options: 'StorageOptions' = None, 
        if_sheet_exists: 'str | None' = None, 
        engine_kwargs: 'dict | None' = None, 
        **kwargs):
  • 参数详解
    • path :str 或打字。BinaryIO,xls 或xlsx 或ods 文件的路径。
    • engine :str(可选)。用于写作的引擎。如果没有,默认为io.excel.< extension >.writer。注意:只能作为关键字参数传递。
    • date_format :str,默认无。写入Excel 文件的日期格式字符串(例如“YYYY-MM-DD”)。
    • datetime_format :str,默认无。写入Excel 文件的日期时间对象的格式字符串。(例如“YYYY-MM-DD HH:MM:SS”)。
    • mode :‘w’, ‘a’,默认’w’。要使用的文件模式(写入或附加)。附加不适用于fsspec URL。
    • storage_options :字典,可选。对特定存储连接有意义的额外选项,例如主机、端口、用户名、密码等,如果使用将由 fsspec 解析的URL,例如,从“s3://”、“gcs://” 开始。
    • if_sheet_exists :‘error’, ‘new’, ‘replace’, ‘overlay’,默认’error’。尝试写入已存在的工作表时的行为方式(仅限附加模式)。
      • ‘error’:引发ValueError。
      • ‘new’:创建一个新工作表,其名称由引擎确定。
      • ‘replace’:在写入之前删除工作表的内容。
      • ‘overlay’:将内容写入现有工作表而不删除旧内容。
    • engine_kwargs :字典,可选. 要传递到引擎的关键字参数。这些将传递给各个引擎的以下函数:
      • xlsxwriter:xlsxwriter.Workbook(file, **engine_kwargs)
      • openpyxl(写入模式):openpyxl.Workbook(**engine_kwargs)
      • openpyxl(追加模式):openpyxl.load_workbook(file, **engine_kwargs)
      • odswriter:odf.opendocument.OpenDocumentSpreadsheet(**engine_kwargs)
    • **kwargs :字典,可选。要传递到引擎的关键字参数。

其中,最基本的应用是:

    ExcelWriter(path, 
                engine=None, 
                date_format=None, 
                datetime_format=None,
                mode=‘w’)
  • 参数详解
    • path:文件保存路径,如"D:\\test\\test.xlsx"(绝对路径和文件名都要有)
    • engine:写入excel文件使用的引擎,默认为"None";一般情况下默认即可。
    • date_format:将写入Excel文件中的日期格式化,如"YYYY-MM-DD";默认为"None";
    • datetime_format:将写入excel文件中的时间格式化,如"YYYY-MM-DD HH: MM: SS"。默认为"None";
    • mode:写入模式,有"w"–写入和"a"–追加;默认为"w";

1.2.3 Pandas的DataFrame基本使用

1.2.3.1 Pandas的基本函数与属性

# 查看DataFrame的基本信息
df.info()

# 查看DataFrame的统计信息
df.describe()

# 查看DataFrame的前n行
df.head(n)

# 查看DataFrame的后n行
df.tail(n)

# 返回DataFrame的列索引
df.columns

# 返回DataFrame的行索引
df.index

1.2.3.2 Pandas中的统计函数

  • count() 统计个数,空值NaN不计算
  • min()最小值
  • max()最大值
  • sum()总和
  • mean()平均值
  • median()中位数
  • var()方差
  • std()标准差
  • argmin() 统计最小值的索引位置
  • argmax()统计最大值的索引位置
  • idxmin() 统计最小值的索引值
  • idxmax() 统计最大值的索引值

1.2.3.3 Pandas的索引

  • 获取列

    • 字典式
      df[columnName]
    • 对象式
      df.columnName
  • 获取行

    • 绝对索引
      df.loc[索引名]
    • 相对索引
      df.iloc[整数相对索引值]
  • 获取标量

    • df.loc[行索引名称,列索引名称]方式

    • df.loc[行索引名称][列索引名称]方式

    • df.iloc[行索引值,列索引值]方式

    • df.iloc[行索引值][列索引值]方式

    • df.at[行索引名称,列索引名称] 方式

    • df.iat[行索引值,列索引值]方式

  • 切片

    • 行切片

      • df[起始行索引名称:终止行索引名称:步长]

      • df.loc[起始行索引名称:终止行索引名称:步长]

      • df.iloc[起始行索引值:终止行索引值:步长]

    • 列切片

      • df[[列索引名1,列索引名2,列索引名3,...]]

      • df.loc[:,起始列索引名:终止列索引名:步长]

      • df.iloc[:,起始列索引值:终止列索引值:步长]

    • 花式切片

      • df.loc[起始行索引名:终止行索引名:行步长, 起始列索引名:终止列索引名:列步长]

      • df.iloc[起始行索引值:终止行索引值:行步长, 起始列索引值:终止列索引值:列步长]

  • 布尔索引
    例如:

    # 找出df的A列值最小的那行数据
    df[df.A==df.A.min()]
    

1.2.4 Pandas读取excel文件

  • 一般格式:
    pandas.read_excel(io, 
                sheet_name=0, 
                header=0, 
                names=None, 
                index_col=None, 
                usecols=None, 
                squeeze=False, 
                dtype=None, 
                engine=None, 
                converters=None, 
                true_values=None, 
                false_values=None, 
                skiprows=None, 
                nrows=None, 
                na_values=None, 
                keep_default_na=True, 
                na_filter=True, 
                verbose=False, 
                parse_dates=False, 
                date_parser=None, 
                thousands=None, 
                comment=None, 
                skipfooter=0, 
                convert_float=True,
                mangle_dupe_cols=True, 
                storage_options=None)
  • 主要参数说明
    • io:文件路径,可以是绝对路径或者相对路径
    • sheet_name:指定读取的sheet名。可以是数字,sheet名,以列表形式表现的sheet名
      在未指定的情况下默认为0,即读取第一个sheet,
    • sheet_name = 1,读取第二个sheet
    • sheet_name = “主营首版”,读取名为主营首版的sheet
    • sheet_name = [0,1,‘主营首版’],同时读取列表中的sheet
    • sheet_name = None,读取所有的sheet
    • header:指定标题行,不指定默认第一行为标题行
    • header = 1 ,从第2行开始读取数据,并且将第2行设置为标题行。
    • header = [0,1] ,第一行和第二行为标题行
    • header = None,没有标题行,所有都是数据
    • names:在header=None的前提下,补充列名
    • pd.read_excel(filename,sheet_name =1,header =None,names=[1,2,3,4,5,6,7,8,9,10,11,12,13]) # names元素的个数必须和dataframe的列数一致。
    • index_col:用于指定索引,默认为None,即索引默认为0开始的数字
    • index_col = 0,将第一列设置为索引
    • index_col=[0,1],将第一列和第二列设置为索引,其余列为数据
    • header 如果为1,则第一行数据就会被抛弃,index_col如果为1,第一列的数据会自动后移和其他数据合并在一起,不会被抛弃
    • usecols:用于指定读取的列
    • usecols = [1,2,3],读取第2-4列
    • usecols = None,读取所有列,其他形式的写法验证都不通过。
    • squeeze:如果源数据数据或者读取的数据只有一列,squeeze = False时读取的结果是*行1列的dataframe结构,如果squeeze = True时读取的结果是一个Series结构。
    • converters=“可滚动收入”:lambda x: x/100,“收入”:lambda x: x/100 # 将可滚动收入和收入的数值都除以100
    • skiprows:省略指定行数的数据,从第一行开始
    • skipfooter:省略指定行数的数据,是从尾部数的行开始。

1.2.5 Pandas数据可视化

1.2.5.1 DataFrame.plot()函数

一般格式:

DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False, 
                sharex=None, sharey=False, layout=None, figsize=None, 
                use_index=True, title=None, grid=None, legend=True, 
                style=None, logx=False, logy=False, loglog=False, 
                xticks=None, yticks=None, xlim=None, ylim=None, rot=None, 
                fontsize=None, colormap=None, position=0.5, table=False, yerr=None, 
                xerr=None, stacked=True/False, sort_columns=False, 
                secondary_y=False, mark_right=True, **kwds)

主要参数解释:

  • x : label or position, default None#指数据框列的标签或位置参数
  • y : label or position, default None
  • kind : str
    • ‘line’ : line plot (default)#折线图
    • ‘bar’ : vertical bar plot#条形图
    • ‘barh’ : horizontal bar plot#横向条形图
    • ‘hist’ : histogram#柱状图
    • ‘box’ : boxplot#箱线图
    • ‘kde’ : Kernel Density Estimation plot#Kernel 的密度估计图,主要对柱状图添加Kernel 概率密度线
    • ‘density’ : same as ‘kde’
    • ‘area’ : area plot#不了解此图
    • ‘pie’ : pie plot#饼图
    • ‘scatter’ : scatter plot#散点图 需要传入columns方向的索引
    • ‘hexbin’ : hexbin plot#不了解此图
  • ax : matplotlib axes object, default None#子图(axes, 也可以理解成坐标轴) 要在其上进行绘制的matplotlib subplot对象。如果没有设置,则使用当前matplotlib subplot其中,变量和函数通过改变figure和axes中的元素(例如:title,label,点和线等等)一起描述figure和axes,也就是在画布上绘图。
  • subplots : boolean, default False#判断图片中是否有子图
  • Make separate subplots for each column
  • sharex : boolean, default True if ax is None else False#如果有子图,子图共x轴刻度,标签
  • In case subplots=True, share x axis and set some x axis labels to invisible; defaults to True if ax is None otherwise False if an ax is passed in; Be aware, that passing in both an ax and sharex=True will alter all x axis labels for all axis in a figure!
  • sharey : boolean, default False#如果有子图,子图共y轴刻度,标签
  • In case subplots=True, share y axis and set some y axis labels to invisible
  • layout : tuple (optional)#子图的行列布局
  • (rows, columns) for the layout of subplots
  • figsize : a tuple (width, height) in inches#图片尺寸大小
  • use_index : boolean, default True#默认用索引做x轴
  • title : string#图片的标题用字符串
  • grid : boolean, default None (matlab style default)#图片是否有网格
  • Axis grid lines
  • legend : False/True/’reverse’#子图的图例,添加一个subplot图例(默认为True)
  • Place legend on axis subplots
  • style : list or dict#对每列折线图设置线的类型
  • matplotlib line style per column
  • logx : boolean, default False#设置x轴刻度是否取对数
  • Use log scaling on x axis
  • logy : boolean, default False
  • Use log scaling on y axis
  • loglog : boolean, default False#同时设置x,y轴刻度是否取对数
  • Use log scaling on both x and y axes
  • xticks : sequence#设置x轴刻度值,序列形式(比如列表)
  • Values to use for the xticks
  • yticks : sequence#设置y轴刻度,序列形式(比如列表)
  • Values to use for the yticks
  • xlim : 2-tuple/list#设置坐标轴的范围,列表或元组形式
  • ylim : 2-tuple/list
  • rot : int, default None#设置轴标签(轴刻度)的显示旋转度数
  • Rotation for ticks (xticks for vertical, yticks for horizontal plots)
  • fontsize : int, default None#设置轴刻度的字体大小
  • Font size for xticks and yticks
  • colormap : str or matplotlib colormap object, default None#设置图的区域颜色
  • Colormap to select colors from. If string, load colormap with that name from matplotlib.
  • colorbar : boolean, optional #图片柱子
  • If True, plot colorbar (only relevant for ‘scatter’ and ‘hexbin’ plots)
  • position : float
  • Specify relative alignments for bar plot layout. From 0 (left/bottom-end) to 1 (right/top-end). Default is 0.5 (center)
  • layout : tuple (optional) #布局
  • (rows, columns) for the layout of the plot
  • table : boolean, Series or DataFrame, default False #如果为正,则选择DataFrame类型的数据并且转换匹配matplotlib的布局。
  • If True, draw a table using the data in the DataFrame and the data will be transposed to meet matplotlib’s default layout. If a Series or DataFrame is passed, use passed data to draw a table.
  • yerr : DataFrame, Series, array-like, dict and str
  • See Plotting with Error Bars for detail.
  • xerr : same types as yerr.
  • stacked : boolean, default False in line and
  • bar plots, and True in area plot. If True, create stacked plot.
  • sort_columns : boolean, default False # 以字母表顺序绘制各列,默认使用前列顺序
  • secondary_y : boolean or sequence, default False ##设置第二个y轴(右y轴)
  • Whether to plot on the secondary y-axis If a list/tuple, which columns to plot on secondary y-axis
  • mark_right : boolean, default True
  • When using a secondary_y axis, automatically mark the column labels with “(right)” in the legend
  • kwds : keywords
  • Options to pass to matplotlib plotting method
  • Returns:axes : matplotlib.AxesSubplot or np.array of them

1.2.5.2 中文字符显示设置

Pandas在绘图时,会显示中文为方块,主要原因有二: matplotlib 字体问题,seaborn 字体问题。
没有中文字体,所以我们只要手动添加中文字体的名称就可以了,不过并不是添加我们熟悉的“宋体”或“黑体”这类的名称,而是要添加字体管理器识别出的字体名称,matplotlib自身实现的字体管理器在文件font_manager.py中,自动生成的可用字体信息在保存在文件fontList.cache里,可以搜索这个文件查看对应字体的名称,例如simhei.ttf对应的名称为’SimHei’,simkai.ttf对应的名称为’KaiTi_GB2312’等。因此我们只要把这些名称添加到配置文件中去就可以让matplotlib显示中文。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  
# plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] #MAC中设置字体为"Arial Unicode MS"
plt.rcParams['font.serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串

1.2.5.3 可视化图形美化

  • 加图标题: plt.title()
  • 加x轴标签: plt.xlabel()
  • 加y轴标签: plt.ylabel()
  • 自定义设置x刻度: plt.xticks(loc,labels)
  • 设置图例: plt.lagend(labels,loc)

1.2.6 异常值检测

1.2.6.1 3σ原则

3σ原则,又称为拉依达原则,它是先假设一组检测数据只含有随机误差,对该组数据进行计算处理得到标准偏差,按一定概率确定一个区间,凡是超过这个区间的误差不属于随机误差而是粗大误差,含有粗大误差范围内的数据(视为异常值)应予以剔除

3σ原则异常值检测函数

import numpy as np
import pandas as pd

def three_sigma(ser):
    """
    ser参数:被检测的数据,是一个Series
    返回值:异常值及其对应的行索引
    """
    
    # 计算平均值
    mean_data = ser.mean()
    # 计算标准差sigma
    std_data = ser.std()
    
    #小于(均值-3倍标准差) 或者 大于 (均值+3倍标准差)的数值都是异常的
    rule = ((mean_data-3*std_data)>ser) | ((mean_data+3*std_data)<ser)
    
    # 返回异常值的行索引
    index = np.arange(ser.shape[0])[rule]
    # 获取异常值
    outliers = ser.iloc[index]
    return outliers
    

1.2.6.2 箱形图异常值检测

除了使用3σ原则检测异常值之外,还可以使用箱形图检测异常值。
需要说明的是,箱形图对检测数据没有任何要求,即使不符合正态分布的数据集是能被检测的。
箱形图是一种用于显示一组数据分散情况的统计图,它通常由上边缘、上四分位数、中位数、下四分位数、下边缘和异常值组成。箱形图能直观地反映出一组数据的分散情况,一旦图中出现离群点(远离大多数值的点),就认为该离群点可能为异常值。

箱形图异常值检测函数

import pandas as pd
import numpy as np

def box_outliers(ser):
   # 对待检测的数据集进行排序
   new_ser = ser.sort_values()
   # 判断待检测数据集数的个数数偶数还是奇数
   if new_ser.count() %2==0:
       #计算Q3,Q1
       Q3 = new_ser[int(len(new_ser)/2):].median()
       Q1 = new_ser[:int(len(new_ser)/2)].median()
   else:
       #计算Q3,Q1
       Q3 = new_ser[int((le

以上是关于实训1_获取产业数据并存储_预处理与简单分析的主要内容,如果未能解决你的问题,请参考以下文章

数据挖掘——流数据分析实训

大数据仓库技术实训任务3

大数据仓库技术实训任务3

大数据仓库技术实训任务3

大数据仓库技术实训任务3

Python数据分析与可视化Pandas统计分析(实训二)