Python学习篇34-Python进行数据分析

Python 进行数据分析

导入外部数据

导入数据主要用到的是 Pandas 里的 read_x()方法,x 表示待导入文件的格式。

导入**.xlsx** 文件

Python 中导入.xlsx 文件的方法是 read_excel()。

  1. 基本导入

使用 read_excel()方法导入文件,首先要指定文件的路径,也就是这个文件在电脑中的 哪个文件夹下存着。

【示例 25-1】导入**.xlsx** 文件

import pandas as pd

df = pd.read\_excel(r"E:\excelTest.xlsx") 
df

执行结果如图 25-1 所示:
在这里插入图片描述

25-1 示例 25-1 运行效果图

电脑中的文件默认路径使用\,这个时候需要在路径前面加一个 r(转义符)避免路径里 面的\被转义。也可以不加 r,但是需要把路径里面的所有\转换成/,这个规则在导入其他格 式文件时也是一样的,一般在路径前面加 r。

  1. 指定导入哪个 Sheet

.xlsx 格式的文件有多个 Sheet,可以通过设定 sheet_name 参数来指定要导入哪个 Sheet 的文件。

【示例 25-2】导入**.xlsx** 文件时,指定导入哪个 Sheet

import pandas as pd

df = pd.read\_excel(r"E:\excelTest.xlsx",sheet_name='Sheet1') 
df

执行结果如图 25-2 所示:
在这里插入图片描述

25-2 示例 25-2 运行效果图

除了可以指定具体 Sheet 的名字,还可以传入 Sheet 的顺序,从 0 开始计数。 【示例 25-3】导入**.xlsx** 文件时,传入 Sheet 的顺序

import pandas as pd

df = pd.read_excel(r"E:\excelTest.xlsx",sheet_name=0) 
df

执行结果如图 25-3 所示:
在这里插入图片描述

25-3 示例 25-3 运行效果图

如果不指定 sheet_name 参数时,那么默认导入的都是第一个 Sheet 的文件。

  1. 指定行索引

将 本 地 文 件 导 入 DataFrame 时 , 行 索 引 使 用 的 从 0 开 始 的 默 认 索 引 , 可 以 通 过 设 置 index_col 参数来设置。

【示例 25-4】导入**.xlsx** 文件时,通过 index_col 指定行索引

import pandas as pd
df = pd.read_excel(r"E:\excelTest.xlsx",sheet_name=0,index_col=0) 
df

执行结果如图 25-4 所示:
在这里插入图片描述

25-4 示例 25-4 运行效果图

index_col 表示用.xlsx 文件中的第几列做行索引,从 0 开始计数。

  1. 指定列索引

将本地文件导入 DataFrame 时,默认使用源数据表的第一行作为列索引,也可以通过设 置 header 参数来设置列索引。header 参数值默认为 0,即用第一行作为列索引;也可以是其 他行,只需要传入具体的那一行即可;

【示例 25-5】导入**.xlsx** 文件时,通过 header 指定行索引

import pandas as pd

df = pd.read_excel(r"E:\excelTest.xlsx",header=1) 
df

执行结果如图 25-5 所示:
在这里插入图片描述

25-5 示例 25-5 运行效果图

【示例 25-6】导入**.xlsx** 文件时,通过 header 指定行索引

import pandas as pd

df = pd.read_excel(r"E:\excelTest.xlsx",header=None) 
df

执行结果如图 25-6 所示:
在这里插入图片描述

25-6 示例 25-6 运行效果图

  1. 指定导入列 有时候本地文件的列数太多,而我们又不需要那么多列时,我们就可以通过设置 usecols 参数来指定要导入的列。

【示例 25-7】导入**.xlsx** 文件时,通过 usecols 指定列索引

import pandas as pd

df = pd.read_excel(r"E:\excelTest.xlsx",usecols=1) 
df

执行结果如图 25-7 所示:
在这里插入图片描述

25-7 示例 25-7 运行效果图

导入**.csv** 文件

  1. 直接导入,指定编码格式

导入时除了指明文件路径,还需要设置编码格式。Python 中用得比较多的两种编码格 式是 UTF-8 和 gbk,默认编码格式是 UTF-8。我们要根据导入文件本身的编码格式进行设置, 通过设置参数 encoding 来设置导入的编码格式。

【示例 25-8】导入**.csv** 文件,文件编码格式是 gbk

import pandas as pd

df = pd.read_csv(r"E:\excelTest.csv",encoding='gbk') 
df

执行结果如图 25-8 所示:
在这里插入图片描述

25-8 示例 25-8 运行效果图

  1. 指明分隔符

在 Excel 和 DataFrame 中的数据都是很规整的排列的,这都是工具在后台根据某条规则 进行切分的。read_csv()默认文件中的数据都是以逗号分开的,但是有的文件不是用逗号分 开的,这时候就需要人为指定分隔符号,否则就会报错。

【示例 25-9】导入**.csv** 文件,指明分隔符

import pandas as pd

df = pd.read_csv(r"E:\excelTest.csv",encoding=‘gbk’,sep=’ ') df

df = pd.read_csv(r"E:\excelTest.csv",encoding=‘gbk’,sep=', ') df

执行结果如图 25-9 所示:
在这里插入图片描述

25-9 示例 25-9 运行效果图

从上面的示例可以看到,如果使用空格进行分隔,获取到的数据还是一个整体,并没有 分开。用默认的逗号作为分隔符号进行分隔,数据被规整地分好了。常用的分隔符除了逗号、 空格,还有制表符(\t)。

  1. 指明读取行数 如果有一个几百兆的文件,想了解一席按这个文件里有哪些数据,那么这时候就没有必 要把全部数据都导入,只要看到前面几行即可,可以通过设置 nrows 参数。

【示例 25-10】导入**.csv** 文件,nrows 参数的使用

import pandas as pd
pd.read\_csv(r"E:\excelTest.csv",encoding='gbk',sep=',',nrows=1) 

执行结果如图 25-10 所示:
在这里插入图片描述
25-10 示例 25-10 运行效果图

  1. engine 指定 当文件路径或者文件名中包含中文时,如果还用上面的导入方式就会报错。因为当调用 read_csv()方法时,默认使用 C 语言作为解析语言,可以通过设置 engine 参数,把默认值 C 改为 Python 就可以了,如果文件格式是 CSV UTF-8(逗号分隔)(*.csv),那么编码格式也 需要跟着变为 utf-8-sig,如果文件格式是 CSV(逗号分隔)(*.csv)格式,对应的编码格式 则为 gbk。

【示例 25-11】导入**.csv** 文件,engine 参数的使用

import pandas as pd
pd.read_csv(r"E:\文件\excelTest.csv",engine='python',encoding='gbk') 

执行结果如图 25-11 所示:
在这里插入图片描述

25-11 示例 25-11 运行效果图

.csv 文件也涉及行、列索引设置及指定导入某列或某几列,设定方法与导入.xlsx 文件一

致。

导入**.txt** 文件

导 入 .txt 文 件 用 得 方 法 时 read_table(), read_table()是 将 利 用 分 隔 符 分 开 的 文 件 导 入 DataFrame 的通用函数。它不仅仅可以导入.txt 文件,还可以导入.csv 文件。

【示例 25-12】导入**.txt** 文件

import pandas as pd
pd.read\_table(r"E:\testFile.txt",encoding='gbk',sep='\t') 

执行结果如图 25-12 所示:
在这里插入图片描述

25-12 示例 25-12 运行效果图

【示例 25-13】使用 read_table()方法导入.csv 文件

import pandas as pd
pd.read_table(r"E:\excelTest.csv",encoding=‘gbk’,sep=‘,’)
执行结果如图 25-13 所示:
在这里插入图片描述

25-13 示例 25-13 运行效果图

查看数据

有了数据以后,先查看数据,只有对数据充分熟悉后,才能更好地进行分析。

  1. 预览前、后几行

当数据表中包含数据行数过多时,我们只想看一下每一列数据都是什么样,可以只把数 据的前几行或者后几行进行查看。

导入一个文件后,可以用 head()方法来控制要显示的前几行,tail()方法来控制要显示的 后几行。在 head()、tail()方法中直接设置行数,默认展示 5 行。

【示例 25-14】预览前、后几行

import pandas as pd
df = pd.read_excel(r"E:\excelTest.xlsx")
display(df,df.head(),df.tail(2)) 

执行结果如图 25-14 所示:
在这里插入图片描述

25-14 示例 25-14 运行效果图

  1. 调用 shape 获取数据表的大小

调用 shape 获取数据表的行、列数。

【示例 25-15】调用 shape 获取数据表的行、列数

import pandas as pd

df = pd.read_excel(r"E:\excelTest.xlsx") display(df,df.shape)

执行结果如图 25-15 所示:
在这里插入图片描述

25-15 示例 25-15 运行效果图

shape 方法会以元组的形式返回行、列数,上面代码中的(7,5)表示 df 表有 7 行 5 列 数据。这里需要注意的是,Python 中利用 shape 方法获取行数和列数时不会把行索引和列索 引计算在内,而 Excel 中是把行索引和列索引计算在内的。

  1. 调用 **info()**获取数据类型

查看数据的第二点就是看一下数据类型,不同的数据类型的分析思路是不一样的,比如 数值类型的数据可以求均值,但是字符串类型的数据就没法求均值了。

利用 info()查看数据表中的数据类型,而且不需要一列一列查看,在调用 info()方法以后 就会输出整个表中所有列的数据类型。

【示例 25-16】调用 **info()**获取数据类型

import pandas as pd

df = pd.read_excel(r"E:\excelTest.xlsx") 
df.info()

执行结果如图 25-16 所示:
在这里插入图片描述

25-16 示例 25-16 运行效果图

通过 info()方法可以看出表 df 的行索引 index 是 0-6,共 5columns,分别是姓名、年龄、 工作、薪水及入职时间,且 5columns 中年龄和薪水是 int 类型,入职日期是 datetime 类型, 其他 columns 都是 object 类型,共占用内存 360bytes。

  1. 调用 **describe()**获取数值分布情况

查看数据的第三点就是掌握数值的分布情况,即均值是多少,最大最小是多少,方差即 分位数分别又是多少。

调用 describe()方法就可以获取所有数值类型字段的分布值。 【示例 25-17】调用 **describe()**获取数值分布情况

import pandas as pd

df = pd.read_excel(r"E:\excelTest.xlsx") 
df.describe()

执行结果如图 25-17 所示:
在这里插入图片描述

25-17 示例 25-17 运行效果图

足球运动员数据分析

  1. 加载数据

【示例 25-18】加载足球运动员数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#支持中文

#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体 
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 
player = pd.read_csv('./data/FullData.csv')
  1. 查看数据

【示例 25-19】查看数据前 5

player.head()

执行结果如图 25-18 所示:
在这里插入图片描述

25-18 示例 25-19 运行效果图

【示例 25-20】查看数据的数据类型

player.info()

执行结果如下所示:

<class 'pandas.core.frame.DataFrame'> RangeIndex:

 17588 entries, 0 to 17587

Data columns (total 53 columns):

Name 17588 non-null object 
Nationality 17588 non-null object 
National_Position 1075 non-null object 
National_Kit 1075 non-null float64 
Club 17588 non-null object 
Club_Position 17587 non-null object 
Club_Kit 17587 non-null float64 
Club_Joining 17587 non-null object 
Contract_Expiry 17587 non-null float64 
Rating 17588 non-null int64 
Height 17588 non-null object 
Weight 17588 non-null object 
Preffered_Foot 17588 non-null object 
Birth_Date 17588 non-null object 
Age 17588 non-null int64 
Preffered_Position 17588 non-null object 
Work_Rate 17588 non-null object 
Weak_foot 17588 non-null int64 
Skill_Moves 17588 non-null int64 
Ball_Control 17588 non-null int64 
Dribbling 17588 non-null int64 
Marking 17588 non-null int64 
Sliding_Tackle 17588 non-null int64 
Standing_Tackle 17588 non-null int64 
Aggression 17588 non-null int64 
Reactions 17588 non-null int64 
Attacking_Position 17588 non-null int64 
Interceptions 17588 non-null int64 
Vision 17588 non-null int64 
Composure 17588 non-null int64 
Crossing 17588 non-null int64 
Short_Pass 17588 non-null int64 
Long_Pass 17588 non-null int64 
Acceleration 17588 non-null int64 
Speed 17588 non-null int64 
Stamina 17588 non-null int64 
Strength 17588 non-null int64 
Balance 17588 non-null int64 
Agility 17588 non-null int64 
Jumping 17588 non-null int64 
Heading 17588 non-null int64 
Shot_Power 17588 non-null int64 
Finishing 17588 non-null int64 
Long_Shots 17588 non-null int64 
Curve 17588 non-null int64 
Freekick_Accuracy 17588 non-null int64 
Penalties 17588 non-null int64 
Volleys 17588 non-null int64 
GK_Positioning 17588 non-null int64 
GK_Diving 17588 non-null int64 
GK_Kicking 17588 non-null int64 
GK_Handling 17588 non-null int64 
GK_Reflexes 17588 non-null int64 
dtypes: float64(3), int64(38), object(12)

memory usage: 7.1+ MB

  1. 缺值处理

从上述示例可以看到总共 17588 行,但 National_Position(国家队位置) 是 1075 行, Club_Position (俱乐部位置)17587 行。我们知道有的足球运动员是没有进入国家队的,所 以 National_Position 缺值是正常情况。但 Club_Position 缺值需要处理。

【示例 25-21】删除 Club_Position 的缺失值

player = player[player[‘Club_Position’].notnull()] player.info()

执行结果如下所示:

<class ‘pandas.core.frame.DataFrame’> Int64Index:

17587 entries, 0 to 17587

Data columns (total 53 columns):

Name 17587 non-null object Nationality 17587 non-null object National_Position 1075 non-null object National_Kit 1075 non-null float64 Club 17587 non-null object Club_Position 17587 non-null object Club_Kit 17587 non-null float64 Club_Joining 17587 non-null object Contract_Expiry 17587 non-null float64 Rating 17587 non-null int64 Height 17587 non-null object Weight 17587 non-null object Preffered_Foot 17587 non-null object Birth_Date 17587 non-null object Age 17587 non-null int64 Preffered_Position 17587 non-null object Work_Rate 17587 non-null object Weak_foot 17587 non-null int64 Skill_Moves 17587 non-null int64 Ball_Control 17587 non-null int64

Dribbling 17587 non-null int64 Marking![ref8] 17587 non-null int64 Sliding_Tackle 17587 non-null int64 Standing_Tackle 17587 non-null int64 Aggression 17587 non-null int64 Reactions 17587 non-null int64 Attacking_Position 17587 non-null int64 Interceptions 17587 non-null int64 Vision 17587 non-null int64 Composure 17587 non-null int64 Crossing 17587 non-null int64 Short_Pass 17587 non-null int64 Long_Pass 17587 non-null int64 Acceleration 17587 non-null int64 Speed 17587 non-null int64 Stamina 17587 non-null int64 Strength 17587 non-null int64 Balance 17587 non-null int64 Agility 17587 non-null int64 Jumping 17587 non-null int64 Heading 17587 non-null int64 Shot_Power 17587 non-null int64 Finishing 17587 non-null int64 Long_Shots 17587 non-null int64 Curve 17587 non-null int64 Freekick_Accuracy 17587 non-null int64 Penalties 17587 non-null int64 Volleys 17587 non-null int64 GK_Positioning 17587 non-null int64 GK_Diving 17587 non-null int64 GK_Kicking 17587 non-null int64 GK_Handling 17587 non-null int64 GK_Reflexes 17587 non-null int64 dtypes: float64(3), int64(38), object(12)

memory usage: 7.2+ MB

【示例 25-22】查看是否有重复数据

player.duplicated().any()
执行结果如图 25-19 所示:
在这里插入图片描述

25-19 示例 25-22 运行效果图

  1. 运动员身高和体重分布

从查看数据结果可以看到运动员身高 Height、体重 Weight 的数据后都添加了相应的单 位。要分析运动员身高和体重的分布,首先需要将身高 Height 和 Weight 数据的单位去掉。

【示例 25-23】去掉 HeightWeight 数据的单位

player[‘Height’] = player[‘Height’].str.replace(‘cm’,‘’)

player[‘Weight’] = player[‘Weight’].str.replace(‘kg’,‘’)

player[‘Height’] = player[‘Height’].astype(‘int’)

player[‘Weight’] = player[‘Weight’].astype(‘int’)

display(player[‘Height’].head(),player[‘Weight’].head()) 执行结果如图 25-20 所示:
在这里插入图片描述

25-20 示例 25-23 运行效果图

【示例 25-24】运动员 Height 数值分布

player[‘Height’].describe()

执行结果如图 25-21 所示,运动员 Height 数值分布的直方图 25-22 所示:
在这里插入图片描述
25-21 示例 25-24 运行效果图
在这里插入图片描述

25-22 运动员 Height 直方图

【示例 25-25】运动员 Weight 数值分布

player[‘Weight’].describe()

执行结果如图 25-23 所示,运动员 Weight 数值分布的直方图 25-24 所示:
在这里插入图片描述
25-23 示例 25-25 运行效果图

在这里插入图片描述

25-24 运动员 Weight 直方图

  1. 左脚右脚使用数量

【示例 25-26】查看足球运动员左脚右脚使用情况

player[‘Preffered_Foot’].head(10)

执行结果如图 25-25 所示:
在这里插入图片描述

25-25 示例 25-26 运行效果图

从上述示例可以看到,足球运动员踢球有使用左脚也有使用右脚。要统计使用左脚和右 脚的数量,需要按 Preffered_Foot 进行分组,计算其 count()值。我们可以使用饼状图来显示 左脚右脚选手数量的差别。

【示例 25-27】使用饼状图来显示左脚右脚选手数量的差别

g = player.groupby(‘Preffered_Foot’)![ref3]

s = g[‘Preffered_Foot’].count()

s.plot(kind=‘pie’,autopct=‘%.2f’)
执行结果如图 25-26 所示:
在这里插入图片描述

25-26 示例 25-27 运行效果图

按某列分组计算 count()值可以直接使用 value_counts()方法,示例如下: 【示例 25-28】**value_counts()**方法的使用

foot_counts = player[‘Preffered_Foot’].value_counts()

foot_counts.name=’ ’ #将左侧 Preffered_Foot 去掉

foot_counts.plot(kind=‘pie’,autopct=‘%.2f’)

执行结果如图 25-27 所示:
在这里插入图片描述

25-27 示例 25-28 运行效果图

  1. 相关性分析

通过散点图查看变量之间关系。

【示例 25-29】分析足球运动员的身高和体重是否相关

player.plot(kind=‘scatter’,x=‘Height’,y=‘Weight’)

执行结果如图 25-28 所示:
在这里插入图片描述

25-28 示例 25-29 运行效果图

从上面示例可以看到,身高和体重有一定的相关性,身高越高体重越重。 【示例 25-30】分析足球运动员的身高和评分是否相关

player.plot(kind=‘scatter’,x=‘Height’,y=‘Rating’)

执行结果如图 25-29 所示:
在这里插入图片描述

25-29 示例 25-30 运行效果图

从上面示例可以看到,身高和评分并没有一定的相关性。查看两个变量是否有相关性, 可以通过 corr()方法,该方法返回两个变量的相关系数值,相关系数值越大表示这两个变量 相关性越强。相关系数的最大值为 1,即获变量自己和自己的相关系数就是 1。

【示例 25-31】通过相关系数查看两个变量是否相关

print(‘身高与身高的相关系数:’,player[‘Height’].corr(player[‘Height’]))

print(‘身高与体重的相关系数:’,player[‘Height’].corr(player[‘Weight’]))

print(‘身高与评分的相关系数:’,player[‘Height’].corr(player[‘Rating’]))

执行结果如图 25-30 所示:
在这里插入图片描述
25-30 示例 25-31 运行效果图

【示例 25-32】分析对评分影响前 10 的变量

player.corr()[‘Rating’].sort_values(ascending=False).head(10)

执行结果如图 25-31 所示:
在这里插入图片描述

25-31 示例 25-32 运行效果图

在上述示例中,首先获取影响评分的相关系数值,再对其进行排序。按照某列排序需要 调 用 sort_values()方 法, 在 sort_values()方 法中 通 过 ascending 参 数指 定 是升 序还 是 降序 。 ascending 参数默认值为 True,表示升序排序,如果想降序需要将 ascending 参数设置为 False。

航班准点分析

数据集为美国各州机场的航班信息,包含出发地,目的地,是否出发延迟 15 分钟,是

否到达延迟 15 分钟等。打开 https://www.transtats.bts.gov/Fields.asp?Table_ID=246 网址进行 下载数据集。

24.4.1 数据探索和清洗

【示例 25-33】加载数据集

import numpy as np

import pandas as pd

import matplotlib as mpl

import matplotlib.pyplot as plt

#支持中文显示 mpl.rcParams[‘font.family’]=‘Kaiti’

  • 使用非 unicode 的负号,当使用中文时候要设置 mpl.rcParams[‘axes.unicode_minus’]=False %matplotlib inline

data = pd.read_csv(‘data/airport-ontime.csv’) data.info()

执行结果如图 25-32 所示:
在这里插入图片描述

25-32 示例 25-33 运行效果图

从上述示例可以看到总共 502617 行、17 列。其中 DEP_DEL15(起飞是否延迟)非空值是 492974 行,ARR_DEL15(到达是否延迟)非空值是 490716 行,Unnamed 这列全部为空值。

【示例 25-34】删除空值 Unnamed

data.dropna(axis=1,how=‘all’,inplace=True) data.info()

执行结果如图 25-33 所示:
在这里插入图片描述

25-33 示例 25-34 运行效果图

【示例 25-35】查看及删除重复数据

#data.duplicated().any() data.drop_duplicates(inplace=True) data.info()

执行结果如图 25-34 所示:
在这里插入图片描述
25-34 示例 25-35 运行效果图

  1. 统计起飞是否延迟情况

【示例 25-36】查询起飞是否延迟

data[‘DEP_DEL15’].head()

执行结果如图 25-35 所示:
在这里插入图片描述

25-35 示例 25-36 运行效果图

从上述示例执行结果可以看到,起飞是否延迟通过 0 和 1 来表示。其中 0 表示不延迟, 1 表示延迟。要统计起飞延迟与不延迟的数量,我们需要按 DEP_DEL15 列分组。

【示例 25-37】统计起飞延迟与不延迟,使用饼状图来显示

s = data[‘DEP_DEL15’].dropna()

delays = s.value_counts()

display(delays)

delays.name=‘’

delays.plot(kind=‘pie’,labels=[‘起飞不延迟’,‘起飞延迟’],autopct=‘%.2f’,title=‘起飞延迟总体 情况’)

执行结果如图 25-36 所示:
在这里插入图片描述

25-36 示例 25-37 运行效果图

  1. 统计到达是否延迟情况

【示例 25-38】统计到达延迟与不延迟,使用饼状图显示

s = data[‘ARR_DEL15’].dropna()

delays = s.value_counts()

display(delays)

delays.name=‘’ delays.plot(kind=‘pie’,labels=[‘到达不延迟’,‘到达延迟’],autopct=‘%.2f’,title='到达延迟总体

情况’)![ref9]

执行结果如图 25-37 所示:
在这里插入图片描述

25-37 示例 25-38 运行效果图

  1. 统计机场航班起飞、到达延迟数量

【示例 25-39】统计机场航班起飞延迟数量,使用柱状图显示

  • 缺失值处理

d = data[[‘ORIGIN_STATE_ABR’,‘DEP_DEL15’]].dropna()

depart_delay_couots = d.groupby(‘ORIGIN_STATE_ABR’)[‘DEP_DEL15’].sum()

  • 设置画布大小 figsize=(a,b) a 表示画布宽,b 表示画布高,单位英寸 depart_delay_couots.sort_values(ascending=False).plot(kind=‘bar’,figsize=(14,6))

执行结果如图 25-38 所示:
在这里插入图片描述

25-38 示例 25-39 运行效果图

【示例 25-40】统计机场航班到达延迟数量,使用柱状图显示

  • 缺失值处理

d = data[[‘DEST_STATE_ABR’,‘ARR_DEL15’]].dropna()

arrive_delay_couots = d.groupby(‘DEST_STATE_ABR’)[‘ARR_DEL15’].sum()

  • 设置画布大小 figsize=(a,b) a 表示画布宽,b 表示画布高,单位英寸 arrive_delay_couots.sort_values(ascending=False).plot(kind=‘bar’,figsize=(14,6))

执行结果如图 25-39 所示:
在这里插入图片描述

25-39 示例 25-40 运行效果图

【示例 25-41】合并机场航班起飞和到达延迟

delay_df=pd.DataFrame([depart_delay_couots,arrive_delay_couots]).T delay_df.columns=[‘起飞延迟’,‘到达延迟’]

delay_df.sort_values('起 飞 延 迟 ',ascending=False).plot(kind=‘bar’,figsize=(14,6),title=‘机 场起飞到达延迟状况’)

执行结果如图 25-40 所示:
在这里插入图片描述
25-40 示例 25-41 运行效果图

  1. 统计机场航班起飞、到达延迟的百分比
  1. 机场航班起飞延迟的百分比 机场航班起飞延迟百分比=机场起飞延迟的航班数/机场航班总起飞数。机场起飞延迟的 航班数前面已经获取到变量 depart_delay_couots 中,还需要获取机场总航班,示例如下:

【示例 25-42】机场起飞总航班数

d = data[[‘ORIGIN_STATE_ABR’,‘DEP_DEL15’]].dropna() departs = d[‘ORIGIN_STATE_ABR’].value_counts()

【示例 25-43】机场航班起飞延迟的百分比

pct_departure_delays = depart_delay_couots/departs![ref9]

  1. 机场航班到达延迟的百分比 同理,机场航班到达延迟百分比=机场到达延迟的航班数/机场航班达数总数。机场到达 延迟航班数前面已经获取到变量 arrive_delay_couots 中,还需要获取机场航班到达总数,示 例如下:

【示例 25-44】机场航班到达延迟的百分比

d = data[[‘DEST_STATE_ABR’,‘ARR_DEL15’]].dropna()

  • 计算到达航班的数量

arrives = d[‘DEST_STATE_ABR’].value_counts()

  • arrive_delay_couots 机场到达延迟航班数

pct_arrive_delays = arrive_delay_couots/arrives ![ref9]【示例 25-45】组合起飞延迟和到达延迟百分比,柱状图描述

  • 将起飞延迟和到达延迟组合成 DataFrame,柱状图描述 pct_delay_df=pd.DataFrame([pct_departure_delays,pct_arrive_delays]).T pct_delay_df.columns=[‘起飞延迟比例’,‘到达延迟比例’]
  • display(pct_departure_delays,pct_arrive_delays)

pct_delay_df.sort_values('起 飞 延 迟 比 例 ',ascending=False).plot(kind=‘bar’,title=‘机 场 起 飞 到达延迟百分比’,figsize=(14,6))

执行结果如图 25-41 所示:
在这里插入图片描述

25-41 示例 25-45 运行效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值