Datawhale动手学数据分析打卡

1.1 第一章:数据载入及初步观察

1.1.1 任务一:导入numpy和pandas

import numpy as np
import pandas as pd

1.1.2 任务二:载入数据

(1) 使用相对路径载入数据
(2) 使用绝对路径载入数据

import os
print(os.getcwd())
os.chdir('d:\\user\\01387419\\desktop\\动手学数据分析')
print(os.getcwd())
import pandas as pd
df = pd.read_csv('.\\titanic\\train.csv')
df.head(3)#相对引用
import numpy as np
import pandas as pd
df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train.csv')
df.head(3)#绝对引用

【思考】知道数据加载的方法后,试试pd.read_csv()和pd.read_table()的不同,如果想让他们效果一样,需要怎么做?了解一下’.tsv’和’.csv’的不同,如何加载这两个数据集?
不同点:read_csv和read_table不同点在于前者的数据是按各个单元格顺序排列的,而后者是数据是通过逗号进行排列全部挤在后面的,也就是形成了逗号分隔值,也就是CSV格式,原汁原味的反映了原文件格式。

read_csv:read_CSV
read.table:
在这里插入图片描述
tsv和CSV的不同:
TSV:tab separated values;即“制表符分隔值”,CSV: comma separated values;即“逗号分隔值”,二者最大的区别就在于后者不同的数据间有逗号进行区隔。

1.1.3 任务三:每1000行为一个数据模块,逐块读取

import pandas as pd
chunker= pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train.csv',chunksize=1000)
chunker

【思考】什么是逐块读取?为什么要逐块读取呢?
答:是对数据进行分区分块处理。为了提高数据分析提取的速度。

1.1.4 任务四:将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]

import pandas as pd
df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train.csv')
df.columns = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口']
df1 = df.set_index("乘客ID")
df1.head(3)

【思考】所谓将表头改为中文其中一个思路是:将英文列名表头替换成中文。还有其他的方法吗?
答:把原表删掉,重新建一个表,或者和创建一个中文表头的表然后联结。

1.2 初步观察

导入数据后,你可能要对数据的整体结构和样例进行概览,比如说,数据大小、有多少列,各列都是什么格式的,是否包含null等

1.2.1 任务一:查看数据的基本信息

df1.head(10)

【提示】有多个函数可以这样做,你可以做一下总结

1.2.2 任务二:观察表格前10行的数据和后15行的数据

df1.head(10)
df1.tail(15)

1.2.4 任务三:判断数据是否为空,为空的地方返回True,其余地方返回False

df1.isnull().head()

【总结】上面的操作都是数据分析中对于数据本身的观察

【思考】对于一个数据,还可以从哪些方面来观察?找找答案,这个将对下面的数据分析有很大的帮助

1.3 保存数据

1.3.1 任务一:将你加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv

df1.to_csv('titanic\\train_chinese.csv',encoding='utf-8')

1.4 知道你的数据叫什么

1.4.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子?[开放题]

import pandas as pd
import numpy as np
#戴戴举的例子
sdata = {'汉堡包': 350, '鸡腿': 710, '米饭': 160, '火腿': 500}
example_1 = pd.Series(sdata)
example_1
data = {'食物名称': ['米饭', '汉堡包', '薯条', '大鸡腿', '香菇', '鸡胸肉'],
        '热量(千卡)': [200, 201, 202, 201, 202, 403],'重量(kg)': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(data)
example_2

1.4.2 任务二:根据上节课的方法载入"train.csv"文件

df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train_chinese.csv')

1.4.3 任务三:查看DataFrame数据的每列的名称

df.keys()

1.4.4任务四:查看"Cabin"这列的所有值[有多种方法]

df.Cabin.head()

1.4.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除

经过我们的观察发现一个测试集test_1.csv有一列是多余的,我们需要将这个多余的列删去

df1 = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\test.csv')
df1.drop(['Sex'],axis=1,inplace = True)
df1

我在压缩包里面都没有找到test_1的数据集。用sex字段假装删除了吧,但是有一个问题就是需要inplace用true才可以去除。如果用false的话,怎么把改动后的数据显示出来呢?答:直接在df.()加.head()就可以看出来了。

1.4.6 任务六: 将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素

df1 = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\test.csv')
df1.drop(['PassengerId','Name','Age','Ticket'],axis = 1).head(3)

【思考】对比任务五和任务六,是不是使用了不一样的方法(函数),如果使用一样的函数如何完成上面的不同的要求呢?

答:我用的是一样的函数呀。然后我看了答案,上面用的是del函数,然后我搜索了一下del和drop的不同点,drop主要是pandas库中才可以使用,del可以在整个Python语言中使用。其实这一块内容主要介绍的是drop函数的使用方法。
在这里记录一下drop函数相关参数的主要用途:

DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')

常用参数详解:

labels:待删除的行名or列名;
axis:删除时所参考的轴,0为行,1为列;
index:待删除的行名
columns:待删除的列名
level:多级列表时使用,暂时不作说明
inplace:布尔值,默认为False,这是返回的是一个copy;若为True,返回的是删除相应数据后的版本
errors一般用不到,这里不作解释

1.5 筛选的逻辑

表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。

下面我们还是用实战来学习pandas这个功能。

1.5.1 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。

df[df['Age']<10].head(3)

1.5.2 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage

df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train.csv')
midage = df[(df['Age']<50)&(df['Age']>10)]
midage.head(3)

tips:
pandas的条件筛选使用是在df中再加一个df,用【】使用,多个条件使用&,用()来并列。

1.5.3 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来

midage = df[(df['Age']<50)&(df['Age']>10)]
midage = midage.reset_index(drop = True)
midage.loc[[100],['Pclass','Age']]

【提示】在抽取数据中,我们希望数据的相对顺序保持不变,用什么函数可以达到这个效果呢?
答:因为loc函数是根据索引来确定位置的,故如果需要相对顺序保持不变,就需要用到reset_index函数对提取出的数据重新按自然顺序进行索引编号。

1.5.4 任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来

midage.loc[[100,105,108],['Pclass','Name','Sex']]

1.5.5 任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来

midage.iloc[[100,105,108],[2,3,4]]

iloc和loc相同点:都用索引数字号定位。
不同点:前者是通过字段名称的相对位置的数字来定位的。后者是直接用文本来定位的。

9月13日感想: 完成课程1.1打卡,学习体会,对绝对引用和相对引用有了进一步的体会。使用相对引用时,要使用OS库,然后用OS.getcwd()函数确认所在的路径是否正确,如果不正确要使用上述的函数进行更改。同时我对于这些函数太陌生了。如果后续工作对这些Python加强使用,就会减少陌生感,用得更顺手。
没时间了,我太累了,我先做完1/2节,第2节和第3节明天补好。

1 第一章:探索性数据分析
开始之前,导入numpy、pandas包和数据
#加载所需的库
#载入之前保存的train_chinese.csv数据,关于泰坦尼克号的任务,我们就使用这个数据

import numpy as np
import pandas as pd
pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train_chinese.csv')

1.6 了解你的数据吗?

教材《Python for Data Analysis》第五章

1.6.1 任务一:利用Pandas对示例数据进行排序,要求升序

#具体请看《利用Python进行数据分析》第五章 排序和排名 部分

#自己构建一个都为数字的DataFrame数据

‘’’
我们举了一个例子
pd.DataFrame() :创建一个DataFrame对象
np.arange(8).reshape((2, 4)) : 生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7
index=[2,1] :DataFrame 对象的索引列
columns=[‘d’, ‘a’, ‘b’, ‘c’] :DataFrame 对象的索引行
‘’’

frame = pd.DataFrame(np.arange(8).reshape((2,4)),
index = ['2', '1'],
columns = ['d','a','b','c'] )
frame

【代码解析】

pd.DataFrame() :创建一个DataFrame对象

np.arange(8).reshape((2, 4)) : 生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7

index=['2, 1] :DataFrame 对象的索引列

columns=[‘d’, ‘a’, ‘b’, ‘c’] :DataFrame 对象的索引行

【问题】:大多数时候我们都是想根据列的值来排序,所以将你构建的DataFrame中的数据根据某一列,升序排列

#回答代码
【思考】通过书本你能说出Pandas对DataFrame数据的其他排序方式吗?

【总结】下面将不同的排序方式做一个总结

1.让行索引升序排序

frame.sort_index()

2.让列索引升序排序

frame.sort_index(axis=1)

3.让列索引降序排序

frame.sort_index(axis=1,ascending=False)

4.让任选两列数据同时降序排序

frame.sort_values(by = ['a','b'],ascending=False)

1.6.2 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从这个数据中你可以分析出什么?

‘’’
在开始我们已经导入了train_chinese.csv数据,而且前面我们也学习了导入数据过程,根据上面学习,我们直接对目标列进行排序即可
head(20) : 读取前20条数据

‘’’

import numpy as np
import pandas as pd
df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train_chinese.csv')
df.sort_values(['票价','年龄'],ascending=False).head(20)

【思考】排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。

当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。

多做几个数据的排序

import numpy as np
import pandas as pd
df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train_chinese.csv')
df.sort_values(['是否幸存','登船港口'],ascending=False).head(20)

在这里插入图片描述

**思考:**登船港口为S的,存活率最高。

1.6.3 任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果

具体请看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分

#自己构建两个都为数字的DataFrame数据

“”"
我们举了一个例子:
frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3),
columns=[‘a’, ‘b’, ‘c’],
index=[‘one’, ‘two’, ‘three’])
frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3),
columns=[‘a’, ‘e’, ‘c’],
index=[‘first’, ‘one’, ‘two’, ‘second’])
frame1_a
“”"
将frame_a和frame_b进行相加

frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3),
                     columns=['a', 'b', 'c'],
                     index=['one', 'two', 'three'])
frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3),
                     columns=['a', 'e', 'c'],
                     index=['first', 'one', 'two', 'second'])
framel_c = frame1_a + frame1_b
frame1_c               

【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。

当然,DataFrame还有很多算术运算,如减法,除法等,有兴趣的同学可以看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分,多在网络上查找相关学习资料。

1.6.4 任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?

‘’’
还是用之前导入的chinese_train.csv如果我们想看看在船上,最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’),我们该怎么做呢?
‘’’

max(df['堂兄弟/妹个数'] + df['父母与小孩个数'])

【提醒】我们只需找出”兄弟姐妹个数“和”父母子女个数“之和最大的数,当然你还可以想出很多方法和思考角度,欢迎你来说出你的看法。

多做几个数据的相加,看看你能分析出什么?

#代码
答:感觉需要数据透视,单独的数据相加看不出啥。

1.6.5 任务五:学会使用Pandas describe()函数查看数据基本统计信息

  1. 关键知识点示例做一遍(简单数据)
    具体请看《利用Python进行数据分析》第五章 汇总和计算描述统计 部分

#自己构建一个有数字有空值的DataFrame数据

“”"
我们举了一个例子:
frame2 = pd.DataFrame([[1.4, np.nan],
[7.1, -4.5],
[np.nan, np.nan],
[0.75, -1.3]
], index=[‘a’, ‘b’, ‘c’, ‘d’], columns=[‘one’, ‘two’])
frame2

“”"

frame2 = pd.DataFrame([[1.4, np.nan], 
                       [7.1, -4.5],
                       [np.nan, np.nan], 
                       [0.75, -1.3]
                      ], index=['a', 'b', 'c', 'd'], columns=['one', 'two'])
frame2

调用 describe 函数,观察frame2的数据基本信息

frame2.describe()

1.6.6 任务六:分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?

‘’’
看看泰坦尼克号数据集中 票价 这列数据的基本统计数据
‘’’

df['票价'].describe()

【思考】从上面数据我们可以看出,试试在下面写出你的看法。然后看看我们给出的答案。

当然,答案只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。

多做几个组数据的统计,看看你能分析出什么?

df['性别'].describe()

在这里插入图片描述

【思考】 describe 这个函数,我学到这里的时候发现,pandas真得太好了。Python真得太好了。在大数据处理方面比Excel好太多了,我真是惊为天人。

【总结】本节中我们通过Pandas的一些内置函数对数据进行了初步统计查看,这个过程最重要的不是大家得掌握这些函数,而是看懂从这些函数出来的数据,构建自己的数据分析思维,这也是第一章最重要的点,希望大家学完第一章能对数据有个基本认识,了解自己在做什么,为什么这么做,后面的章节我们将开始对数据进行清洗,进一步分析。

【回顾&引言】前面一章的内容大家可以感觉到我们主要是对基础知识做一个梳理,让大家了解数据分析的一些操作,主要做了数据的各个角度的观察。那么在这里,我们主要是做数据分析的流程性学习,主要是包括了数据清洗以及数据的特征处理,数据重构以及数据可视化。这些内容是为数据分析最后的建模和模型评价做一个铺垫。

开始之前,导入numpy、pandas包和数据

import numpy as np
import pandas as pd
df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train.csv')

2 第二章:数据清洗及特征处理

我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的亚子。

2.1 缺失值观察与处理

我们拿到的数据经常会有很多缺失值,比如我们可以看到Cabin列存在NaN,那其他列还有没有缺失值,这些缺失值要怎么处理呢

2.1.1 任务一:缺失值观察

(1) 请查看每个特征缺失值个数
(2) 请查看Age, Cabin, Embarked列的数据
以上方式都有多种方式,所以大家多多益善

df.info()
df.isnull().sum()
df[['Age','Cabin','Embarked']].head(3)

思考:第三种方法不就是简单的查看么。看了一下我觉得还是第一种好一些。学完整个课程我要做一个思维导图,将整个数据分析分析的流程画下了。然后后续的工作分析都按这样去做。

2.1.2 任务二:对缺失值进行处理

(1)处理缺失值一般有几种思路

:将缺失值在的行或者列进行删除。或者使用fillna函数,对缺失值进行填充。我觉得使用填充方式好一点。因为缺失值所在的行或者列也有其他的相关重要信息。

(2) 请尝试对Age列的数据的缺失值进行处理

df['Age'].fillna(0,inplace=True)

(3) 请尝试使用不同的方法直接对整张表的缺失值进行处理

df.fillna(0,inplace=True)

【思考1】dropna和fillna有哪些参数,分别如何使用呢?

dropna 参数:

axis: default 0指行,1为列

how: {‘any’, ‘all’}, default ‘any’指带缺失值的所有行;'all’指清除全是缺失值的

thresh: int,保留含有int个非空值的行

subset: 对特定的列进行缺失值删除处理

inplace: 这个很常见,True表示直接在原数据上更改
在这里插入图片描述
value指的是用什么值来填充缺失值,method指的是填充的使用方法,可以使用ffill和bbill,意识是分别向前填充和向后填充。axis是用来定位需要填仓的行或者列的。inplace是指true或false,true的话意识就是直接修改数据,不生成备用数据。limit是限制了要填充多少个缺失值。

【思考】检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?

我觉得是info函数好一点,可以查看各个列数值的类型。如果没有查找到缺失值,可能是该数值的类型无法被这个函数给识别到。

2.2 重复值观察与处理

由于这样那样的原因,数据中会不会存在重复值呢,如果存在要怎样处理呢

2.2.1 任务一:请查看数据中的重复值

df.duplicated()

在这里插入图片描述
应该是没有重复值吧

2.2.2 任务二:对重复值进行处理

(1)重复值有哪些处理方式呢?
:对重复值进行删除,对于缺失值相比,我觉得对数据相同的重复值应当删除,减少对于数据的影响。
(2)处理我们数据的重复值

df.drop_duplicates()

2.2.3 任务三:将前面清洗的数据保存为csv格式

df.to_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\test_clear.csv')

2.3 特征观察与处理

我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

2.3.1 任务一:对年龄进行分箱(离散化)处理

(1) 分箱操作是什么?
:对数值型中的连续型数据进行离散化,通过将连续的数据分箱为分段时间,可以减少模型处理的难度。有助于数据分析。我还没有做到模型的地步,所以需要在后续体会数据分箱的意义。

(2) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示

cats = pd.qcut(df['Age'],5,labels = [1,2,3,4,5])
cats#我的答案
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df.head()#正确答案

:在这个位置,我的答案犯了错误,首先是没有搞清楚qcut和cut的区别,qcut是指对数据出现的频率切开,而cut是按等距进行切分。

(3) 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示

df['AgeBand'] = pd.cut(df['Age'],['0','5','15','30','50','80'],labels = [1,2,3,4,5])
df.to_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train_2.csv')

(4) 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示

df['AgeBand'] = pd.qcut(df['Age'],['0','0.1','0.3','0.5','0.7','0.9'],labels = [1,2,3,4,5])
df.to_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train_3.csv')

2.3.2 任务二:对文本变量进行转换

(1) 查看文本变量名及种类

df['Sex'].value_counts()
df['Sex'].unique()

在这里插入图片描述
:从两种查看文本类型的方式来看,多种文本类型的数据使用比如地址啥的,value_counts感觉更好一些,可以看到出现的次数,而类型比较少的文本值,比如性别的话,两种都一样,使用效果差不多。

(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示

df['Sex_number']= df['Sex'].replace(['male','female'],[1,2])

(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示

for feat in ["Age", "Embarked"]:
#     x = pd.get_dummies(df["Age"] // 6)
#     x = pd.get_dummies(pd.cut(df['Age'],5))
    x = pd.get_dummies(df[feat], prefix=feat)
    df = pd.concat([df, x], axis=1)
    #df[feat] = pd.get_dummies(df[feat], prefix=feat)

:这一段也没有看懂是什么意思,为什么要这样做呢?

2.3.3 任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)

df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)

:中间的([A-Za-z]+).,应该是正则表达式,没有看懂,要再仔细理解一下。应该有特别的编写规则。

df.to_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\titanic\\train4.csv')

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

开始之前,导入numpy、pandas包和数据
导入基本库
载入data文件中的:train-left-up.csv

import numpy as np
import pandas as pd
df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\train-left-up.csv')
df

2 第二章:数据重构

2.4 数据的合并

2.4.1 任务一:将data文件夹里面的所有数据都载入,观察数据的之间的关系

df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\train-left-up.csv')
df1 = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\train-left-down.csv')
df2 = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\train-right-up.csv')
df3 = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\train-right-down.csv')

【提示】结合之前我们加载的train.csv数据,大致预测一下上面的数据是什么
:这些数据是将train.csv数据按左右半边上下切开分别存放。

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

df4 = pd.concat([df,df2],axis=1)
df4.to_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\result_up.csv')

:注意axis参数,当axis为1时是左右联结,为0时是上下联结。

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

df5 = pd.concat([df,df2],axis=1)
df5
df_result =pd.concat([df4,df5])
df_result.sort_values(by = ['PassengerId'],ascending=True)

在这里插入图片描述

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

df4 = df.join(df2)
df5 = df1.join(df3)
df_result = df4.append(df5)
df_result.head()

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

df4 = pd.merge(df,df2,left_index=True,right_index=True)
df5 = pd.merge(df1,df3,left_index=True,right_index=True)
df_result = df4.append(df5)
df_result.head()

【思考】对比merge、join以及concat的方法的不同以及相同。思考一下在任务四和任务五的情况下,为什么都要求使用DataFrame的append方法,如何只要求使用merge或者join可不可以完成任务四和任务五呢?
:merge和join以及concat放在一起,merge和join更像是一类,concat是一类。concat是体会下来是直接将两张表贴合在一起。而merge和join更像是联结的函数。而且merge和join是要有共同的列进行合并的,concat是拼接在一起。
因为df5和df4没有公有列,所以需要使用append进行追加,如果只要求使用merge或者join完成整个任务,是需要增加共有数据,然后直接用merge和join完成最后一步的合并任务。

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

df_result =pd.concat([df4,df5],ignore_index = True)
df_result.to_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\result.csv')

:ignor3_index 需要设置参数,要不然索引会乱了。

2.5 换一种角度看数据

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

text = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\result.csv')
text.head()
unit_result=text.stack().head(20)
unit_result.head()
unit_result.to_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\unit_result.csv')
pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\unit_result.csv')

在这里插入图片描述
:从输出结果来看,stack函数应该是把二维表转换为一维表的过程。

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

开始之前,导入numpy、pandas包和数据
#导入基本库
载入上一个任务人保存的文件中:result.csv,并查看这个文件

import numpy as np
import pandas as pd
df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\result.csv')
df

2 第二章:数据重构

第一部分:数据聚合与运算

2.6 数据运用

2.6.1 任务一:通过教材《Python for Data Analysis》P303、Google or anything来学习了解GroupBy机制

:group by 就像SQL里面的group by ,通过数据查询,将数据进行分类然后进行聚合。

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

df_mean  = df['Fare'].groupby(df['Sex'])
df = df_mean.mean()
df

在这里插入图片描述

在了解GroupBy机制之后,运用这个机制完成一系列的操作,来达到我们的目的。

下面通过几个任务来熟悉GroupBy机制。

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

df_sex = df['Survived'].groupby(df['Sex']).sum()
df_sex.head()

在这里插入图片描述

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

df_pclass = df['Survived'].groupby(df['Pclass']).sum()
df_pclass.head()

在这里插入图片描述

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

【思考】从数据分析的角度,上面的统计结果可以得出那些结论

:1、女性的花费要高于男性。2、女性的存活人数要高于男性。3、等级为1的存活人数最多,2最少。是不是花费越多的存活率越高呢?所以我通过对费用进行分箱,然后对分箱的数据看不同费用下的存活人数,从下图的结果来看,初步来看好像是费用花费越高的存活率越高,但是最高的费用层级5只有1个人,存活率为100%,同时层级3的存活率也没有明显高于层级2。所以花费的票价越高,存活率越高的结论应当是不成立的。
在这里插入图片描述

【思考】从任务二到任务三中,这些运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名。你可以按照提示写出这个过程吗?

df.groupby('Sex').agg({'Fare': 'mean', 'Pclass': 'count'}).rename(columns=
                            {'Fare': 'mean_fare', 'Pclass': 'count_pclass'})

:注意agg函数中需要使用花括号,因为这里创建了字典,用方括号的话无法识别。

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

df = df.groupby(['Pclass','Age'])['Fare'].mean()
df

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

result = pd.merge(df_mean,df_sex,on='Sex')
result.to_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\sex_fare_survived.csv')

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

df['Ageband']=pd.cut(df['Age'],3)
df_count  = df['Fare'].groupby(df['Ageband']).count()
df_survived = df['Survived'].groupby(df['Ageband']).sum()

df_surli = df_survived/df_count 
df_surli

在这里插入图片描述
:在50岁到80岁的存活率最低,27岁到50岁的最高。

复习: 回顾学习完第一章,我们对泰坦尼克号数据有了基本的了解,也学到了一些基本的统计方法,第二章中我们学习了数据的清理和重构,使得数据更加的易于理解;今天我们要学习的是第二章第三节:数据可视化,主要给大家介绍一下Python数据可视化库Matplotlib,在本章学习中,你也许会觉得数据很有趣。在打比赛的过程中,数据可视化可以让我们更好的看到每一个关键步骤的结果如何,可以用来优化方案,是一个很有用的技巧。

2 第二章:数据可视化
开始之前,导入numpy、pandas以及matplotlib包和数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('d:\\user\\01387419\\desktop\\动手学数据分析\\data\\result.csv')

2.7 如何让人一眼看懂你的数据?

《Python for Data Analysis》第九章

2.7.1 任务一:跟着书本第九章,了解matplotlib,自己创建一个数据项,对其进行基本可视化

【思考】最基本的可视化图案有哪些?分别适用于那些场景?(比如折线图适合可视化某个属性值随时间变化的走势)

data = np.arange(10)
data
plt.plot(data)

在这里插入图片描述

:折线图:展现趋势。柱状图:展现不同指标的水平数值。饼图:展现占比。等

2.7.2 任务二:可视化展示泰坦尼克号数据集中男女中生存人数分布情况(用柱状图试试)。

plt.rcParams['font.sans-serif'] = ['SimHei']
df = df.groupby('Sex')['Survived'].sum()
df.plot.bar()
plt.title('不同性别的幸存人数')
plt.show()

在这里插入图片描述
:一般的matplotlib是显示不了中文标题的,需要增加一行代码提醒计算机使用中文标题。而且使用数据可视化需要使用group by首先对数据进行聚合清洗,才能使数据展示在图片上。

【思考】计算出泰坦尼克号数据集中男女中死亡人数,并可视化展示?如何和男女生存人数可视化柱状图结合到一起?看到你的数据可视化,说说你的第一感受(比如:你一眼看出男生存活人数更多,那么性别可能会影响存活率)。

plt.rcParams['font.sans-serif'] = ['SimHei']
df = df.groupby('Sex')['Survived'].sum()
df.plot.bar()
plt.title('不同性别的幸存人数')
for x,y in enumerate(df):
    plt.text(x,y,y)
plt.show()

在这里插入图片描述

:使用增加图表数据标签功能,可以在柱状图上增加数据标签,一眼看去,女性幸存的机会更大。

plt.text(x,y,s)#x:x轴的坐标;y:y轴的坐标;s:所要显示的文本,这个是标签功能的参数。`

2.7.3 任务三:可视化展示泰坦尼克号数据集中男女中生存人与死亡人数的比例图(用柱状图试试)。

plt.rcParams['font.sans-serif'] = ['SimHei']
df.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind = 'bar',stacked ='True')
plt.title('不同性别的幸存人数比例')
plt.ylabel('count')
plt.show()

在这里插入图片描述
:注意groupby后使用了unstack,意思是转换为二维表,kind参数为bar,意味着生成柱状图。stacked参数为True,意味着生成重叠柱状图。

2.7.4 任务四:可视化展示泰坦尼克号数据集中不同票价的人生存和死亡人数分布情况。(用折线图试试)(横轴是不同票价,纵轴是存活人数)

【提示】对于这种统计性质的且用折线表示的数据,你可以考虑将数据排序或者不排序来分别表示。看看你能发现什么?

df_sur = df.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending = False)
df_sur
plot_sur = plt.figure(figsize=(20,18))
df_sur.plot(grid=True)
plt.legend
plt.show()

在这里插入图片描述

df_sur = df.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending = True)
df_sur
plot_sur = plt.figure(figsize=(20,18))
df_sur.plot(grid=True)
plt.legend
plt.show()

在这里插入图片描述
:以上分别是正序和降序分别展示的代码和图片。代码中grid 为True 意思是增加网格线。legend的意思是增加图例。

2.7.5 任务五:可视化展示泰坦尼克号数据集中不同仓位等级的人生存和死亡人员的分布情况。(用柱状图试试)

pclass_sur = df.groupby(['Pclass'])['Survived'].value_counts()
pclass_sur
import seaborn as sns
sns.countplot(x='Pclass',hue='Survived',data=df)

在这里插入图片描述
:seaborn 是Python中的另外一个可视化库,是建立在matplotlib的基础上进一步开发得到的。而sns.countplot是画出条线图。

【思考】看到这个前面几个数据可视化,说说你的第一感受和你的总结
:条形图就可以满足大部分数据可视化的需求了。同时画图一定要有相关的标题,图例和数据标签,要不然别人不知道在看什么。

2.7.6 任务六:可视化展示泰坦尼克号数据集中不同年龄的人生存与死亡人数分布情况。(不限表达方式)

import seaborn as sns
sur = sns.FacetGrid(df,hue='Survived',aspect=3)
sur.map(sns.kdeplot,'Age',shade=True)
sur.set(xlim=(0,df['Age'].max()))
sur.add_legend()

在这里插入图片描述
:这里答案还是使用了seaborn库,sns.FaceGrid是用来画坐标轴的。hue参数是图例。aspect参数是用来展示图片的长度。.map是用来转换数据字符的。sns.kdeplot是用来密核度估计可视化(在我看来就是阴影趋势堆积图),其中shade参数是是否用色彩填充。.set是用来确定X轴参数的。xlim意思为X轴的起点数值,取age数据作为X轴。最后用legend增加图例。

2.7.7 任务七:可视化展示泰坦尼克号数据集中不同仓位等级的人年龄分布情况。(用折线图试试)

df.Age[df.Pclass==1].plot(kind='kde')
df.Age[df.Pclass==2].plot(kind='kde')
df.Age[df.Pclass==3].plot(kind='kde')
plt.xlabel('age')
plt.legend((1,2,3),loc='best')

在这里插入图片描述

【思考】上面所有可视化的例子做一个总体的分析,你看看你能不能有自己发现

:女性的生存几率要比男性的大,幸存人数也更多。同时等级越高的人幸存比例越大,等级越高3级的人主要更年轻,这可能是等级越高的幸存比例越高的主要原因之一。

【总结】到这里,我们的可视化就告一段落啦,如果你对数据可视化极其感兴趣,你还可以了解一下其他可视化模块,如:pyecharts,bokeh等。

如果你在工作中使用数据可视化,你必须知道数据可视化最大的作用不是炫酷,而是最快最直观的理解数据要表达什么,你觉得呢?
:是的,工作中用折线图和柱状图就能满足80%的可视化需求了。其他的可能跟地图或者散点图有关系。

9月21日,数据建模和数据建模评价对我而言比较难。我还是慢慢搞吧。今天把整体的流程。按思维导图的格式展现了情况。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值