pandas数据分析航空公司数据
pandas数据分析
pandas主要有两种数据结构,分别是dataframe和series,本次我们主要讲述的是dataframe的简单应用,从数据的读取到清洗。
数据读取与观察
- 1.pandas读取文件的方法很多,其中
read_csv()
最为常用,相对应的就有to_csv()
方法(df调用) - 2.数据的观察:
- 2.1 dataframe中,类型主要有
- 2.2
head(),tail()
:显示df的前n个记录(默认是5),显示包括列名。 - 2.2
info(),describe(),columns
:显示df的全部信息,描述,还有列名。需要注意的是,describe()
只能生成对数字的描述,Object类型无法统计描述 - 2.4 索引:在dataframe中不能够像Numpy那样直接通过df[i]来进行索引,需要通过df[i:j]来索引具体某几行(切片操作),或者索引某一列
df['column_name'].values
来返回某一列的数值 - 2.5 切片:切片可以通过直接
df[i:j]
来实现行切片,返回第i:j-1行,也可以通过.iloc
来切片或者重写覆盖(用法如下)
import csvimport pandasimport numpy as npimport sklearnimport refrom sklearn.cluster import KMeansimport matplotlib.pyplot as pltimport matplotlib%matplotlib inline
f = open("机票综合查询.csv")data = pandas.read_csv(f,encoding='utf-8')data.head()data.tail()print(data.index) ## 能够返回整张表中的记录数data.info() ## info() 显示数据表的基本信息print(data.describe().T) ## 描述统计(基于数字)data[0:2] ## 返回0:2的共2行记录(切片)print(data.iloc[0:3,[1,3]]) #获取1列3列的1~3行数据#data.iloc[0:3,[1,3]]=2 ## 把2写到选择的位置,起到覆盖作用passages = data["乘机人"].values ## 通过values把返回的series变成numpyde的ndarray形式data.columns
RangeIndex(start=0, stop=125011, step=1)<class 'pandas.core.frame.DataFrame'>RangeIndex: 125011 entries, 0 to 125010Data columns (total 7 columns):乘机人 124861 non-null object航程 124861 non-null object支付科目 118861 non-null object票面_折扣 124683 non-null float64票面_起飞时间 124861 non-null object票面_降落时间 124861 non-null object票面_舱位 125011 non-null objectdtypes: float64(1), object(6)memory usage: 6.7+ MBcount mean std min 25% 50% 75% max票面_折扣 124683.0 0.535882 0.358774 0.0 0.3 0.503 0.798 5.0航程 票面_折扣0 成都-南京 0.4851 西宁-广州 0.3012 广州-西宁 0.380Index(['乘机人', '航程', '支付科目', '票面_折扣', '票面_起飞时间', '票面_降落时间', '票面_舱位'], dtype='object')
3.数据筛选:
- 3.1精确筛选:通过
isin
方法来筛选指定信息。 - 3.2模糊筛选:通过正则表达式来进行匹配
chose = ["成都-南京","西宁-广州"]result = data["航程"].isin(chose) #将要过滤的数据放入list中,使用isin对数据进行筛选,返回行索引以及每行筛选的结果,若匹配则返回turedata[result] ## 通过上面返回的true和false值来选出实际的行## 模糊搜索:result = data["航程"].str.contains(r'-南京$') ## 通过正则表达来实现模糊匹配data[result]
数据清洗:
数据清洗包括查重、去空、填充、删除、替换等操作,以下是相关函数的用法:
1.查重,去空,填充,删除,补行
在这里需要注意的是经过删除操作之后,会出现空行 ,每一行并不会自动补上,导致实际长度小于序号(序号为开始处理前的样子),需要用到 reset_index()
方法来重新排序.
## 把为空的数据删掉或填上默认值data.fillna(np.nan) ## fillna("some") 以“some”来填充空值(null)data = data.dropna(axis=0, how='any') ## 丢弃空值的行#data.drop("航程",axis=1) ## 在列方向(axis),删除“航程”这一列data["航程"]## 查重:data["航程"].unique() ## 对某一列进行查重,返回该列存在的元素data = data.drop_duplicates(subset="乘机人") ## 在指定的某列进行去重data = data.reset_index(drop=True) ## 对data表重新排序,这里的drop=true表示不在表内新建一列index,而是直接补上data.info()
<class 'pandas.core.frame.DataFrame'>RangeIndex: 36834 entries, 0 to 36833Data columns (total 7 columns):乘机人 36834 non-null object航程 36834 non-null object支付科目 36834 non-null object票面_折扣 36834 non-null float64票面_起飞时间 36834 non-null object票面_降落时间 36834 non-null object票面_舱位 36834 non-null objectdtypes: float64(1), object(6)memory usage: 2.0+ MB
2.替换
- 2.1 replace:
replace()
方法能够通过字典的形式来进行直接的替换 - 2.2 apply:
apply()
方法能够通过传递一个函数进去后对每一个元素进行操作
## 通过字典来替换行名称,替换成英文后可以直接通过.passage 来代替["乘机人"]data=data.rename(columns={"乘机人":"passage","航程":"route","支付科目":"payway","票面_折扣":"discount","票面_起飞时间":"offtime","票面_降落时间":"downtime","票面_舱位":"siteclass"})data["siteclass"].unique() ## 统计机舱位的种类# print(data.siteclass.value_counts()) ## 统计每个种类的个数change = {'W':0, 'L':1, 'E':2, 'K':3,'R':4, 'D':5, 'Z':6, 'V':7, 'Y':8, 'T':9, 'U':10, 'S':11, 'X':12, 'Q':13, 'I':14, 'H':15,'N':16, 'M':17, 'B':18, 'P':19, 'A':20, 'G':21, 'J':22, 'C':23, 'O':24, 'F':25, 'e':2}data.siteclass=data.siteclass.replace(change) ## 通过字典来把舱位数字化## apply 方法。def clasification(strings):if "-" in strings:strings = strings.replace("-","/")return stringsdata["offtime"]=data["offtime"].apply(clasification)
3.数据格式转换
data.discount=data.discount.astype(float)## 由字符串转换成时间序列:data['offtime']=pandas.to_datetime(data['offtime'], format="%Y/%m/%d %H:%M") ## format为字符串的格式data.info()
<class 'pandas.core.frame.DataFrame'>RangeIndex: 36834 entries, 0 to 36833Data columns (total 7 columns):passage 36834 non-null objectroute 36834 non-null objectpayway 36834 non-null objectdiscount 36834 non-null float64offtime 36834 non-null objectdowntime 36834 non-null objectsiteclass 36834 non-null objectdtypes: float64(1), object(6)memory usage: 2.0+ MB
实战:
实战内容主要是以航空公司的部分资料,通过聚类算法来进行数据分析,通过飞行时间(降落时间与起飞时间的差)来间接体现飞行距离,这里就需要用把字符串的时间转换成time的格式来进行运算。
import csvimport pandasimport numpy as npimport sklearnimport refrom tqdm import tqdmfrom sklearn.cluster import KMeansimport matplotlib.pyplot as pltimport matplotlib%matplotlib inline
def clasification(strings):# if re.match(pattern='^\d{4}[/]\d+[/]\d+\s\d+[:]\d+',string=string)!=null:if "-" in strings:strings = strings.replace("-","/")# print(strings)return stringsf = open("机票综合查询.csv")data = pandas.read_csv(f,encoding="utf-8")data.info() ## info() 显示数据表的基本信息data.fillna("NaN") ## fillna("some") 以“some”来填充空值(null)data = data.dropna(axis=0, how='any') ## 丢弃空值的行data = data.reset_index(drop=True)drops = []for a,one in enumerate(data.values):if len(one[1].split("-"))>2 or one[1]=="#NAME?":drops.append(a)data = data.drop(drops)data = data.reset_index()data = data.drop("index",axis=1)print("-----------after dorping--------------")data=data.rename(index=str,columns={"乘机人":"passage","航程":"route","支付科目":"payway","票面_折扣":"discount","票面_起飞时间":"offtime","票面_降落时间":"downtime","票面_舱位":"siteclass"})data.info()print("----------check siteclass----------------")print(data["siteclass"].unique()) ## 统计机舱位的种类# print(data.siteclass.value_counts()) ## 统计每个种类的个数change = {'W':0, 'L':1, 'E':2, 'K':3,'R':4, 'D':5, 'Z':6, 'V':7, 'Y':8, 'T':9, 'U':10, 'S':11, 'X':12, 'Q':13, 'I':14, 'H':15,'N':16, 'M':17, 'B':18, 'P':19, 'A':20, 'G':21, 'J':22, 'C':23, 'O':24, 'F':25, 'e':2}data.siteclass=data.siteclass.replace(change)# print(data.siteclass.value_counts())data["offtime"]=data["offtime"].apply(clasification)data['offtime']=pandas.to_datetime(data['offtime'], format="%Y/%m/%d %H:%M")data['downtime']=pandas.to_datetime(data['downtime'], format="%Y/%m/%d %H:%M")data.insert(loc=6,column="lasttime",value=0)data["lasttime"] = data["downtime"]-data["offtime"] ## 增加一列,表示总共的飞行时间,间接说明飞行距离data.info()
<class 'pandas.core.frame.DataFrame'>RangeIndex: 125011 entries, 0 to 125010Data columns (total 7 columns):乘机人 124861 non-null object航程 124861 non-null object支付科目 118861 non-null object票面_折扣 124683 non-null float64票面_起飞时间 124861 non-null object票面_降落时间 124861 non-null object票面_舱位 125011 non-null objectdtypes: float64(1), object(6)memory usage: 6.7+ MB-----------after dorping--------------<class 'pandas.core.frame.DataFrame'>Index: 112390 entries, 0 to 112389Data columns (total 7 columns):passage 112390 non-null objectroute 112390 non-null objectpayway 112390 non-null objectdiscount 112390 non-null float64offtime 112390 non-null objectdowntime 112390 non-null objectsiteclass 112390 non-null objectdtypes: float64(1), object(6)memory usage: 6.9+ MB----------check siteclass----------------['W' 'L' 'E' 'K' 'R' 'D' 'Z' 'V' 'Y' 'T' 'U' 'S' 'X' 'Q' 'I' 'H' 'N' 'M''B' 'P' 'A' 'G' 'J' 'C' 'O' 'F' 'e']<class 'pandas.core.frame.DataFrame'>Index: 112390 entries, 0 to 112389Data columns (total 8 columns):passage 112390 non-null objectroute 112390 non-null objectpayway 112390 non-null objectdiscount 112390 non-null float64offtime 112390 non-null datetime64[ns]downtime 112390 non-null datetime64[ns]lasttime 112390 non-null timedelta64[ns]siteclass 112390 non-null int64dtypes: datetime64[ns](2), float64(1), int64(1), object(3), timedelta64[ns](1)memory usage: 12.7+ MB
以下是对数据进行聚类
KMeans 聚类:
我们本次实验主要是对航空公司的折扣以及用户飞行路程(通过飞行时间来表征)来进行聚类,并生成用户标签
for a in data.head(5).values:print(a[6].seconds/60) ## 有days,seconds属性disconunt = np.array(data["discount"]).reshape([-1,1])print(disconunt.min())disconunt = (disconunt - disconunt.min())/(disconunt.max()-disconunt.min())print(disconunt.shape)siteclass = np.array(data["siteclass"]).reshape([-1,1])# siteclass = (siteclass-siteclass.min())/(siteclass.max()-siteclass.min())minutes = []for one in data["lasttime"]:minutes.append(one.seconds/60.0)minutes = np.array(minutes).reshape([-1,1])minutes = (minutes-minutes.min())/(minutes.max()-minutes.min())tent = np.concatenate([disconunt,minutes, siteclass],axis=1)print(tent.shape)
150.0295.0330.0160.0140.00.0(112390, 1)(112390, 3)
K = 4kmeans = KMeans(n_clusters=K)kmeans.fit(tent)label = kmeans.labels_.reshape([-1,1])result = np.concatenate([label,tent],axis=1)result[0]
array([ 0. , 0.097 , 0.10452962, 0. ])
from mpl_toolkits.mplot3d import Axes3D fig = plt.figure()ax = Axes3D(fig)# ax.contour(X, Y, Z, 16, extend3d=True)for i in range(K):x=[]y=[]z=[]for one in result:if one[0]==i:x.append(one[1])##discounty.append(one[2])##minutesz.append(one[3])##siteclassz = np.array(z).reshape([1,-1])plt.scatter(x, y, z,c='rbgcmyk'[i])plt.show()
![这里写图片描述](https://img-
blog.csdn.net/2018050118011493?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1ZmZ5dG9t/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
fig = plt.figure()for i in range(K):x=[]y=[]z=[]for one in result:if one[0]==i:x.append(one[1])##discounty.append(one[2])##minutesz.append(one[3])##siteclassz = np.array(z).reshape([1,-1])plt.scatter(x, z,c='rbgcmyk'[i])plt.show()
![这里写图片描述](https://img-
blog.csdn.net/20180501180128644?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1ZmZ5dG9t/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
pandas数据分析航空公司数据相关推荐
- python小练习之航空公司数据练习题(二)
写在开头:这一节的内容是根据家庭作业来的,我们会对家庭作业中的问题展开的进行代码的运行与讲解,然后将代码进行封装直接跑出所有程序,数据的话会放在百度网盘以供下载. 航空公司数据匹配 今天要完成的一个小 ...
- Python数据挖掘 数据预处理案例(以航空公司数据为例)
Python数据预处理 一.内容: 1.数据清洗 2.数据集成 3.数据可视化 二.实验数据 根据航空公司系统内的客户基本信息.乘机信息以及积分信息等详细数据,依据末次飞行日期( LAST_FLIGH ...
- 数据分析系列之数据探索
根据观测,调查收集到的初步的样本数据集后,接下来要考虑的是样本的数据集的数量和质量是否满足模型构建的要求 ,是否出现从未设想过的数据状态?其中有什么明显的规律趋势,各因素之间有什么关联性?通过检验数据 ...
- 飞机qar数据可视化_航空公司的QAR是什么?如何用?
目前QAR译码数据已被各个航空公司或部门广泛应用于飞行过程仿真重现.飞行品质监控与改善.飞行技术评价.飞机维修维护.安全品质评估.油耗评测与节能技术的改进.事故因素调查.主动安全管理等工作,并发挥了重 ...
- 航空公司大数据建设的思考
ZDNET至顶网CIO与应用频道 10月13日 北京消息:主题为"科技整合·智汇航行"的2014年航空用户大会在青岛召开,文思海辉首席架构师李飞介绍了目前大数据的趋势以及航空领域的 ...
- 项目实战分享-大数据时代-航空公司该如何转型(四)
大数据时代-航空公司该如何转型(一)https://blog.csdn.net/tipdm0526/article/details/124985456?spm=1001.2014.3001.5501 ...
- 航空公司大数据的“钱景”猜想
目前,在国内航空市场上,绝大部分服务是免费的,航企正在逐步寻求服务收费的方法.然而,现阶段的付费服务还不"叫座",只有找到旅客最想要的服务,才是诉求. 正视数据,运用数据,航企大数 ...
- pandas 数据分析 相关性_探索 COVID-19 新冠数据来学习 Pandas
来源:python中文社区 本文约2100字,建议阅读6分钟. 使用 pandas 数据分析工具来学习一些基本的 pandas 命令,并探索数据集中包含的内容. 欧洲疾病预防控制中心(https:// ...
- 蜂鸟智游大数据:“人在囧途”的春运,航空公司们可操碎了心
"有钱没钱回家过年",这句歌词唱出了很多人的心声.临近年关,回家和家人团聚成了所有在外漂泊游子的头等大事,回家的想法是美好的,但路途却是坎坷的. "一票难求"是 ...
最新文章
- 增强型固态硬盘支持人工智能工作负载
- knn 进行手写数字识别
- python格式化字符串_Python笔记7:三种方式构建字符串-格式化
- 30分钟掌握 C#6
- PHP采集利器:Snoopy
- 一天变成36小时[转]
- kmp有next和nextval的C语言,KMP模式匹配算法中next和nextval的求解(轉)
- 怎么增加C盘空间大小,教你如何调整C盘容量【图文教程 无损数据】分区助手如何给磁盘分区 分区助手使用方法教程
- 管家婆打印报错——进程无法访问
- 怎样查看谁发的qq坦白说
- 微信小程序开发 uniapp【bug修复】点击事件 传值 数据结构错误 $orig
- U盘写保护的解决办法,亲自实践,原创!
- 数据分析可视化系列(四)B站关键词搜索结果
- Java初始化大乱斗
- 线路负载及故障检测装置(2019全国大学生电子设计大赛C题:国家级一等奖)
- AWVS扫描Web应用程序
- 2016年linux认证考试,2016年Linux认证考试模拟练习及答案
- 安卓手机运行linux
- oracle 按每分钟分组,oracle按每个10分钟进行分组展示数据
- 数据库_mysql数据库引擎_数据库索引
热门文章
- vue双向数据绑定原理
- ios调用系统相册显示英文,修改成中文
- 独家 | 硅谷神秘公司Nuro推出全美最牛无人车 还要颠覆物流业
- Ubuntu配置NFS服务器(Linux挂载Linux)
- 腐烂国度2巨霸版计算机学知识,腐烂国度2巨霸版V25.0版本更新内容 新增要素一览[多图]...
- iphone6s gpu Android,iPhone 6S GPU到底多强
- 【爬虫学习6】爬虫自动获取并使用代理ip
- 微信电脑版 == 摸鱼神器?
- Java开发陪玩系统源码小程序app详细介绍
- python运行时很卡-Python代码运行速度慢?这五种方法很管用