1. kaggle实战—泰坦尼克(一、数据分析)
  2. kaggle实战—泰坦尼克(二、数据清洗及特征处理)
  3. kaggle实战—泰坦尼克(三、数据重构)
  4. kaggle实战—泰坦尼克(四、数据可视化)
  5. kaggle实战—泰坦尼克(五、模型搭建-模型评估)

前言

相信大家都有队pandas,numpy等数据科学库有一定了解,其中不乏有很多人有专门刷过相关课程或者看多相关书籍,例如《python for data analysis》。但是在实操过程中有很多函数还是得看着官方文档来进行敲写,既费时又费力 。最近刚好datawhale发起一个相关打卡活动——实战,我就报名参加了。(ps:极力推荐这本书,大家可以去网上搜索电子版,或者也可以关注微信公众【浩波的笔记】回复data analysis来获取。

这次实践又比较偏模型和实战(完成kaggle上泰坦尼克的任务),直接给你一个任务,让你去完成,上手难度比较大,但是它的实战性可以让你对于什么是数据挖掘,以及数据挖掘的逻辑有很好的把握。所以有没有这样一门课,以项目为主线,将知识点孕育其中,通过边学,边做以及边被引导的方式来使学习效果达到更好,学完之后既能掌握pandas等的知识点又能掌握数据分析的大致思路和流程。通过调查发现,市面上这样的目好像没有可以完全符合这样的标准(失望.jpg)。

复习:在前面我们已经学习了Pandas基础,这次我们开始进入数据分析的业务部分,在上一个博客的内容中,我们学习了数据的清洗,这一部分十分重要,只有数据变得相对干净,我们之后对数据的分析才可以更有力。而这个博客,我们要做的是数据重构,数据重构依旧属于数据理解(准备)的范围

数据的合并

任务一:将data文件夹里面的所有数据都载入,与之前的原始 数据相比,观察他们的之间的关系

import pandas as pd
text_left_up = pd.read_csv("E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/train-left-up.csv")
text_left_down = pd.read_csv("E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/train-left-down.csv")
text_right_up = pd.read_csv("E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/train-right-up.csv")
text_right_down = pd.read_csv("E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/train-right-down.csv")
text_left_up.head()

text_left_down.head()

text_right_down.head()

text_right_down.head()

text_right_up.head()


任务二:使用concat方法:将数据train-left-up.csv和trainright-up.csv横向合并为一张表,并保存这张表为result_up

list_up = [text_left_up,text_right_up]
result_up = pd.concat(list_up,axis=1)
result_up.head()


任务三:使用concat方法:将train-left-down和train-rightdown横向合并为一张表,并保存这张表为result_down。然后将上 边的result_up和result_down纵向合并为result。

list_down=[text_left_down,text_right_down]
result_down = pd.concat(list_down,axis=1)
result = pd.concat([result_up,result_down])
result.head()


任务四:使用DataFrame自带的方法join方法和append:完成 任务二和任务三的任务

resul_up = text_left_up.join(text_right_up)
result_down = text_left_down.join(text_right_down)
result = result_up.append(result_down)
result.head()


join方法:dataframe内置的join方法是一种快速合并的方法。它默认以index作为对齐的列

  • how 参数
    join中的how参数和merge中的how参数一样,用来指定表合并保留数据的规则。具体可见后面marge的 how 说明。

  • on 参数
    在实际应用中如果右表的索引值正是左表的某一列的值,这时可以通过将 右表的索引 和 左表的列 对齐合并这样灵活的方式进行合并。

In [59]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],....:                      'B': ['B0', 'B1', 'B2', 'B3'],....:                      'key': ['K0', 'K1', 'K0', 'K1']})....: In [60]: right = pd.DataFrame({'C': ['C0', 'C1'],....:                       'D': ['D0', 'D1']},....:                       index=['K0', 'K1'])....: In [61]: result = left.join(right, on='key')

任务五:使用Panads的merge方法和DataFrame的append方 法:完成任务二和任务三的任务

result_up = pd.merge(text_left_up,text_right_up,left_index=True,right_index=True)
result_down = pd.merge(text_left_down,text_right_down,left_index=True,right_index=True)
result = resul_up.append(result_down)
result.head()


merge
pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效。和SQL语句的对比可以看这里

merge的参数on:列名,join用来对齐的那一列的名字,用到这个参数的时候一定要保证左表和右表用来对齐的那一列都有相同的列名。left_on:左表对齐的列,可以是列名,也可以是和dataframe同样长度的arrays。right_on:右表对齐的列,可以是列名,也可以是和dataframe同样长度的arrays。left_index/ right_index: 如果是True的haunted以index作为对齐的keyhow:数据融合的方法。sort:根据dataframe合并的keys按字典顺序排序,默认是,如果置false可以提高表现。merge的默认合并方法:merge用于表内部基于 index-on-index 和 index-on-column(s) 的合并,但默认是基于index来合并。

复合key的合并方法:使用merge的时候可以选择多个key作为复合可以来对齐合并。

** 通过on指定数据合并对齐的列**

In [41]: left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],....:                      'key2': ['K0', 'K1', 'K0', 'K1'],....:                      'A': ['A0', 'A1', 'A2', 'A3'],....:                      'B': ['B0', 'B1', 'B2', 'B3']})....: In [42]: right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],....:                       'key2': ['K0', 'K0', 'K0', 'K0'],....:                       'C': ['C0', 'C1', 'C2', 'C3'],....:                       'D': ['D0', 'D1', 'D2', 'D3']})....: In [43]: result = pd.merge(left, right, on=['key1', 'key2'])


没有指定how的话默认使用inner方法。

how的方法有:

  • left:只保留左表的所有数据
In [44]: result = pd.merge(left, right, how='left', on=['key1', 'key2'])

  • right:只保留右表的所有数据
In [45]: result = pd.merge(left, right, how='right', on=['key1', 'key2'])

  • outer:保留两个表的所有信息
In [46]: result = pd.merge(left, right, how='outer', on=['key1', 'key2'])

  • inner:只保留两个表中公共部分的信息
In [47]: result = pd.merge(left, right, how='inner', on=['key1', 'key2'])


suffix后缀参数:如果和表合并的过程中遇到有一列两个表都同名,但是值不同,合并的时候又都想保留下来,就可以用suffixes给每个表的重复列名增加后缀。

In [79]: result = pd.merge(left, right, on='k', suffixes=['_l', '_r'])

任务六:完成的数据保存为result.csv

result.to_csv('E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/result.csv')

换一种角度看数据

任务一:将我们的数据变为Series类型的数据

# 将完整的数据加载出来
text = pd.read_csv('E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/result.csv')
text.head()
# 代码写在这里
unit_result=text.stack().head(20)
unit_result.head()

#将代码保存为unit_result,csv
unit_result.to_csv('E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/unit_result.csv')
test = pd.read_csv('E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/unit_result.csv')
test.head()


stack和unstack

  1. stack:将数据的列“旋转”为行
  2. unstack:将数据的行“旋转”为列
  3. stack和unstack默认操作为最内层
  4. stack和unstack默认旋转轴的级别将会成果结果中的最低级别(最内层)
  5. stack和unstack为一组逆运算操作
#创建DataFrame,行索引名为state,列索引名为number
import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(6).reshape((2,3)),index=pd.Index(['Ohio','Colorado'],name='state'),columns=pd.Index(['one','two','three'],name='number'))
data

#将DataFrame的列旋转为行,即stack操作。
result = data.stack()
result

stack操作后将列索引number旋转为行索引,并且置于行索引的最内层(外层为索引state),也就是将旋转轴(number)的结果置于 最低级别。

#将DataFrame的行旋转为列,即unstack操作。
result.unstack()

unstack操作默认将内层索引number旋转为列索引。同时,也可以指定分层级别或者索引名称来指定操作级别,下面做错同样会得到上面的结果。

数据聚合与运算

# 导入基本库
import numpy as np
import pandas as pd
# 载入data文件中的:result.csv
text = pd.read_csv('E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/result.csv')
text.head()


任务一:通过《Python for Data Analysis》P303、Google or Baidu来学习了解GroupBy机制
在了解GroupBy机制之后,运用这个机制完成一系列的操作,来达到我们的目的。下面通过几个任务来熟悉GroupBy机制。

GroupBy机制

# 读入一个数据集, 我使用了美国警方击毙数据集.
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.style.use('ggplot')
path = 'https://raw.githubusercontent.com/HoijanLai/dataset/master/PoliceKillingsUS.csv'
data = pd.read_csv(path, encoding ='latin1')
data.sample(3)

  • 什么是group by(来自事重)
    主要的功能能是允许你在不额外写循环的情况下, 快速对每一组数据进行操作。groupby就是按xx分组, 它也确实是用来实现这样功能的. 比如, 将一个数据集按A进行分组, 效果是这样

    我们尝试使用groupby来尝试实现这样的功能, 不过我们不用A列, 我们将用我们数据集里面的"种族"尝试分组:
data.groupby('race')
#<pandas.core.groupby.DataFrameGroupBy object at 0x104fa2208>

这里我们得到了一个叫DataFrameGroupBy的东西, 虽然 pandas 不让我们直接看它长啥样, 但是你将它想象成上面那幅分组后的图(我手绘的)是完全没有问题的.

  • 要求被不同种族内被击毙人员年龄的均值:

data.groupby(‘race’)[‘age’].mean()
结果
race
A 36.605263
B 31.635468
H 32.995157
N 30.451613
O 33.071429
W 40.046980
Name: age, dtype: float64

上面我们求得了各个种族中被击毙的人员的平均年龄, 得到的是一个Series, 每一行对应了每一组的mean, 除此之外你还可以换成std, median, min, max这些基本的统计数据

上面age是连续属性, 我们还可以操作离散属性, 比如对不同取值的计数: .value_counts()

  • 求不同种族内, 是否有精神异常迹象的分别有多少人

data.groupby(‘race’)[‘signs_of_mental_illness’].value_counts()
结果
race signs_of_mental_illness
A False 29
True 10
B False 523
True 95
H False 338
True 85
N False 23
True 8
O False 21
True 7
W False 819
True 382
Name: signs_of_mental_illness, dtype: int64

注: 这时, 组内操作的结果不是单个值, 是一个序列, 我们可以用.unstack()将它展开

data.groupby(‘race’)[‘signs_of_mental_illness’].value_counts().unstack()

  • 方法总结
  1. 首先通过groupby得到DataFrameGroupBy对象, 比如data.groupby(‘race’)
  2. 然后选择需要研究的列, 比如[‘age’], 这样我们就得到了一个SeriesGroupby, 它代表每一个组都有一个Series
  3. 对SeriesGroupby进行操作, 比如.mean(), 相当于对每个组的Series求均值

注: 如果不选列, 那么第三步的操作会遍历所有列, pandas会对能成功操作的列进行操作, 最后返回的一个由操作成功的列组成的DataFrame

任务二:计算泰坦尼克号男性与女性的平均票价

df = text['Fare'].groupby(text['Sex'])
means = df.mean()
means#结果
Sex
female 44.479818
male 25.523893
Name: Fare, dtype: float64

任务三:统计泰坦尼克号中男女的存活人数

survived_sex = text['Survived'].groupby(text['Sex']).sum()
survived_sex.head()#结果
Sex
female 233
male 109
Name: Survived, dtype: int64

任务四:计算客舱不同等级的存活人数

survived_pclass = text['Survived'].groupby(text['Pclass'])
survived_pclass.sum()结果
Pclass
1 136
2 87
3 119
Name: Survived, dtype: int64

提示:表中的存活那一栏,可以发现如果还活着记为1,死亡记为0

任务五:统计在不同等级的票中的不同年龄的船票花费的平均 值

text.groupby(['Pclass','Age'])['Fare'].mean().head()#结果
Pclass Age
1 0.92 151.55002.00 151.55004.00 81.858311.00 120.000014.00 120.0000
Name: Fare, dtype: float64

任务六:将任务二和任务三的数据合并,并保存到sex_fare_survived.csv

result = pd.merge(means,survived_sex,on='Sex')
result
result.to_csv('E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/sex_fare_survived.csv')

任务七:得出不同年龄的总的存活人数,然后找出存活人数的 最高的年龄,最后计算存活人数最高的存活率(存活人数/总人数)

#不同年龄的存活人数
survived_age = text['Survived'].groupby(text['Age']).sum()
survived_age.head()####
Age
0.42 1
0.67 1
0.75 2
0.83 2
0.92 1
Name: Survived, dtype: int64
#找出最大值的年龄段
survived_age[survived_age.values==survived_age.max()]#####
Age
24.0 15
Name: Survived, dtype: int64
_sum = text['Survived'].sum()
print(_sum)//342#首先计算总人数
_sum = text['Survived'].sum()
print("sum of person:"+str(_sum))
precetn =survived_age.max()/_sum
print("最大存活率:"+str(precetn))###
sum of person:342
最大存活率:0.04385964912280701512

kaggle实战—泰坦尼克(三、数据重构)相关推荐

  1. kaggle实战—泰坦尼克(四、数据可视化)

    kaggle实战-泰坦尼克(一.数据分析) kaggle实战-泰坦尼克(二.数据清洗及特征处理) kaggle实战-泰坦尼克(三.数据重构) kaggle实战-泰坦尼克(四.数据可视化) kaggle ...

  2. kaggle实战—泰坦尼克(五、模型搭建-模型评估)

    kaggle实战-泰坦尼克(一.数据分析) kaggle实战-泰坦尼克(二.数据清洗及特征处理) kaggle实战-泰坦尼克(三.数据重构) kaggle实战-泰坦尼克(四.数据可视化) kaggle ...

  3. kaggle实战—泰坦尼克(二、数据清洗及特征处理)

    kaggle实战-泰坦尼克(一.数据分析) kaggle实战-泰坦尼克(二.数据清洗及特征处理) kaggle实战-泰坦尼克(三.数据重构) kaggle实战-泰坦尼克(四.数据可视化) kaggle ...

  4. excel根据一列内容查找排序另一列_利用泰坦尼克生存数据讲述Excel数据分析的基本操作...

    一.使用Excel做数据处理方法(博主使用的是2007版本) 打开泰坦尼克生存数据文件,文件共有12列,891行. 每一列的含义是乘客ID,生存,船舱等级,名字,性别,年龄,兄弟姐妹,父母配偶,票号, ...

  5. 集成算法-随机森林与案例实战-泰坦尼克获救预测

    集成算法-随机森林 Ensemble learning 目的:让机器学习效果更好,单个不行,群殴走起 Bagging:训练多个分类器取平均 f ( x ) = 1 / M ∑ m = 1 M f m ...

  6. 《scikit-learn》《Kaggle》泰坦尼克数据集的试验

    下载泰坦尼克数据集,下载地址是:https://www.kaggle.com/c/titanic 这里如果是第一次使用kaggle的话,需要注册,注册时候有一些验证码的问题,可以参考https://w ...

  7. Kaggle滑水 - 泰坦尼克之灾(决策树)

    本文以Kaggle新手习题--Titanic: Machine Learning from Disaster为场景开展实验,以此熟悉Kaggle平台. 本文的源码托管于我的Github:Practic ...

  8. kaggle入门泰坦尼克之灾内容总结

    [泰坦尼克之灾](https://www.kaggle.com/c/titanic):求生问题预测,是一个二分类问题,判断每名乘客的存活情况,读了寒小阳大牛的博客,现做以下整理.阳哥只介绍了逻辑回归算 ...

  9. 机器学习实战(五) kaggle练习赛 泰坦尼克获救预测

    这道题的主页:https://www.kaggle.com/c/titanic 目录 一. 读取数据,观察数据分布 二. 数据预处理 1. 填充缺失值 2. 文字到数值的映射 三.模型 1. 用线性回 ...

最新文章

  1. RouterOS建立PPPOE服务器
  2. 新网站是如何吸引蜘蛛进行爬取的?
  3. visual basic6.0企业版
  4. .net序列化与反序列化通用方法
  5. utorrent设置上传速度_utorrent下载速度慢怎样设置 utorrent常用设置图文教程
  6. 学习性代码和使用不存在的代码
  7. 字节跳动 2019 ICME 双赛道冠军团队方案分享
  8. mac 下启动Android Studio 时出现 Android Studio was unable to find a valid Jvm
  9. 【Vegas2008】7月19日-凉粉的做法
  10. linux java heap space_Linux tomcat9 java.lang.OutOfMemoryError: Java heap space 解决方法
  11. 【JOURNAL】《题虾壶》
  12. VM安装windows server 2008
  13. matlab实验感悟,2019年matlab实验心得体会学习matlab的心得体会
  14. Android 运行程序报错:Unable to execute dex: Multiple dex files define Lcom/baidu/android/pushservice/Push
  15. Mac如何清理缓存文件
  16. 工程项目管理思维导图模板
  17. 厦门八大美院墙绘 茶馆里的中国风墙绘壁画
  18. MDM三权分立及分类分级权限说明
  19. 数字世界,企业何以抵御勒索病毒?
  20. signature=d35ee78c71b9950dc8dfdc350316e389,Low complexity encoder and decoder

热门文章

  1. Go开发报错 -- Golang strings.Builder type undefined
  2. 3、MapReduce详解与源码分析
  3. ASP.NET操作Excel
  4. docker安装nginx,配置nginx,并成功访问
  5. handsontable pro 授权码 key 生成器(JS函数)(仅供学习交流)
  6. 大数据 Hive spark Flink 关系
  7. 输入一个三位正整数,输出百位数,十位数,个位数
  8. 为什么我们需要Q#?
  9. 工作中,我们经常用到哪些SQL语句呢?
  10. sqlmap源码阅读系列init中的_cleanupOptions