复习:这门课程得主要目的是通过真实的数据,以实战的方式了解数据分析的流程和熟悉数据分析python的基本操作。知道了课程的目的之后,我们接下来我们要正式的开始数据分析的实战教学,完成kaggle上泰坦尼克的任务,实战数据分析全流程。
这里有两份资料:
教材《Python for Data Analysis》和 baidu.com &
google.com(善用搜索引擎)

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

1.1 载入数据

数据集下载 https://www.kaggle.com/c/titanic/overview

1.1.1 任务一:导入numpy和pandas
#写入代码
import numpy as np
import pandas as pd

【提示】如果加载失败,学会如何在你的python环境下安装numpy和pandas这两个库

1.1.2 任务二:载入数据

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

import os
os.getcwd()
'C:\\Users\\yan\\Desktop\\DataWhale\\hands-on-data-analysis-master\\第一单元项目集合'
#写入代码
train_relative_data = r"train.csv"
train_absolute_data = r"C:/Users/yan/Desktop/DataWhale/hands-on-data-analysis-master/第一单元项目集合/train.csv"
#写入代码
train_r_data = pd.read_csv(train_relative_data)
train_r_data.head(3)



PassengerId

Survived

Pclass

Name

Sex

Age

SibSp

Parch

Ticket

Fare

Cabin

Embarked

0

1

0

3

Braund, Mr. Owen Harris

male

22.0

1

0

A/5 21171

7.2500

NaN

S

1

2

1

1

Cumings, Mrs. John Bradley (Florence Briggs Th...

female

38.0

1

0

PC 17599

71.2833

C85

C

2

3

1

3

Heikkinen, Miss. Laina

female

26.0

0

0

STON/O2. 3101282

7.9250

NaN

S

train_r_data2 = pd.read_table(train_relative_data)
train_r_data2.head(3)



PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked

0

1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/...

1

2,1,1,"Cumings, Mrs. John Bradley (Florence Br...

2

3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,S...

"""
TSV与CSV的区别:
1)从名称上即可知道,TSV是用制表符(Tab,'\t')作为字段值的分隔符;CSV是用半角逗号(',')作为字段值的分隔符;
2)IANA规定的标准TSV格式,字段值之中是不允许出现制表符的。


read_csv和read_table都是是加载带分隔符的数据,每一个分隔符作为一个数据的标志,但二者读出来的数据格式还是不一样的,
read_table是以制表符 \t 作为数据的标志,也就是以行为单位进行存储。
"""

【提示】相对路径载入报错时,尝试使用os.getcwd()查看当前工作目录。
【思考】知道数据加载的方法后,试试pd.read_csv()和pd.read_table()的不同,如果想让他们效果一样,需要怎么做?了解一下’.tsv’和’.csv’的不同,如何加载这两个数据集?
【总结】加载的数据是所有工作的第一步,我们的工作会接触到不同的数据格式(eg:.csv;.tsv;.xlsx),但是加载的方法和思路都是一样的,在以后工作和做项目的过程中,遇到之前没有碰到的问题,要多多查资料吗,使用googel,了解业务逻辑,明白输入和输出是什么。

1.1.3 任务三:每1000行为一个数据模块,逐块读取
#写入代码
df = pd.read_csv(train_absolute_data,chunksize=1000)
print(type(df))      #<class 'pandas.io.parsers.TextFileReader'>
for chunk in df:
    print(chunk)
    print(type(chunk))   #<class 'pandas.core.frame.DataFrame'>
<class 'pandas.io.parsers.TextFileReader'>
     PassengerId  Survived  Pclass  \
0              1         0       3   
1              2         1       1   
2              3         1       3   
3              4         1       1   
4              5         0       3   
..           ...       ...     ...   
886          887         0       2   
887          888         1       1   
888          889         0       3   
889          890         1       1   
890          891         0       3   

                                                  Name     Sex   Age  SibSp  \
0                              Braund, Mr. Owen Harris    male  22.0      1   
1    Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   
2                               Heikkinen, Miss. Laina  female  26.0      0   
3         Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   
4                             Allen, Mr. William Henry    male  35.0      0   
..                                                 ...     ...   ...    ...   
886                              Montvila, Rev. Juozas    male  27.0      0   
887                       Graham, Miss. Margaret Edith  female  19.0      0   
888           Johnston, Miss. Catherine Helen "Carrie"  female   NaN      1   
889                              Behr, Mr. Karl Howell    male  26.0      0   
890                                Dooley, Mr. Patrick    male  32.0      0   

     Parch            Ticket     Fare Cabin Embarked  
0        0         A/5 21171   7.2500   NaN        S  
1        0          PC 17599  71.2833   C85        C  
2        0  STON/O2. 3101282   7.9250   NaN        S  
3        0            113803  53.1000  C123        S  
4        0            373450   8.0500   NaN        S  
..     ...               ...      ...   ...      ...  
886      0            211536  13.0000   NaN        S  
887      0            112053  30.0000   B42        S  
888      2        W./C. 6607  23.4500   NaN        S  
889      0            111369  30.0000  C148        C  
890      0            370376   7.7500   NaN        Q  

[891 rows x 12 columns]
<class 'pandas.core.frame.DataFrame'>

【思考】什么是逐块读取?为什么要逐块读取呢?

【提示】大家可以chunker(数据块)是什么类型?用for循环打印出来出处具体的样子是什么?

# 有时候对于一个大的csv文件,一下子读到内存会非常耗费内存空间,所以用chunksize进行分块
# chunker是dataframe类型
1.1.4 任务四:将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]

PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口

#写入代码
str_info = """
PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口
"""
mapper = {}
for s in str_info.strip().split('\n'):
    L = s.split('=>',1) #返回的是一个list
    mapper[L[0]] = L[1]
print(mapper)
# for chunk in df:
#     chunk.rename(columns=mapper)
#     print(chunk.head())
#方式一
train_r_data.columns = mapper.values()
train_r_data.set_index(' 乘客ID', inplace=True)
train_r_data.head()
{'PassengerId ': ' 乘客ID', 'Survived ': ' 是否幸存', 'Pclass ': ' 乘客等级(1/2/3等舱位)', 'Name ': ' 乘客姓名', 'Sex ': ' 性别', 'Age ': ' 年龄', 'SibSp ': ' 堂兄弟/妹个数', 'Parch ': ' 父母与小孩个数', 'Ticket ': ' 船票信息', 'Fare ': ' 票价', 'Cabin ': ' 客舱', 'Embarked ': ' 登船港口'}



是否幸存

乘客等级(1/2/3等舱位)

乘客姓名

性别

年龄

堂兄弟/妹个数

父母与小孩个数

船票信息

票价

客舱

登船港口

乘客ID

1

0

3

Braund, Mr. Owen Harris

male

22.0

1

0

A/5 21171

7.2500

NaN

S

2

1

1

Cumings, Mrs. John Bradley (Florence Briggs Th...

female

38.0

1

0

PC 17599

71.2833

C85

C

3

1

3

Heikkinen, Miss. Laina

female

26.0

0

0

STON/O2. 3101282

7.9250

NaN

S

4

1

1

Futrelle, Mrs. Jacques Heath (Lily May Peel)

female

35.0

1

0

113803

53.1000

C123

S

5

0

3

Allen, Mr. William Henry

male

35.0

0

0

373450

8.0500

NaN

S

# 方式二
print(mapper)
train_r_data_new = pd.read_csv(train_relative_data)
train_r_data_new.set_index('PassengerId', inplace=True)
train_r_data_new.rename(columns=mapper,inplace=True)
train_r_data_new.head(3)
{'PassengerId ': ' 乘客ID', 'Survived ': ' 是否幸存', 'Pclass ': ' 乘客等级(1/2/3等舱位)', 'Name ': ' 乘客姓名', 'Sex ': ' 性别', 'Age ': ' 年龄', 'SibSp ': ' 堂兄弟/妹个数', 'Parch ': ' 父母与小孩个数', 'Ticket ': ' 船票信息', 'Fare ': ' 票价', 'Cabin ': ' 客舱', 'Embarked ': ' 登船港口'}



Survived

Pclass

Name

Sex

Age

SibSp

Parch

Ticket

Fare

Cabin

Embarked

PassengerId

1

0

3

Braund, Mr. Owen Harris

male

22.0

1

0

A/5 21171

7.2500

NaN

S

2

1

1

Cumings, Mrs. John Bradley (Florence Briggs Th...

female

38.0

1

0

PC 17599

71.2833

C85

C

3

1

3

Heikkinen, Miss. Laina

female

26.0

0

0

STON/O2. 3101282

7.9250

NaN

S

df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
df.head()



是否幸存

仓位等级

姓名

性别

年龄

兄弟姐妹个数

父母子女个数

船票信息

票价

客舱

登船港口

乘客ID

1

0

3

Braund, Mr. Owen Harris

male

22.0

1

0

A/5 21171

7.2500

NaN

S

2

1

1

Cumings, Mrs. John Bradley (Florence Briggs Th...

female

38.0

1

0

PC 17599

71.2833

C85

C

3

1

3

Heikkinen, Miss. Laina

female

26.0

0

0

STON/O2. 3101282

7.9250

NaN

S

4

1

1

Futrelle, Mrs. Jacques Heath (Lily May Peel)

female

35.0

1

0

113803

53.1000

C123

S

5

0

3

Allen, Mr. William Henry

male

35.0

0

0

373450

8.0500

NaN

S

【思考】所谓将表头改为中文其中一个思路是:将英文列名表头替换成中文。还有其他的方法吗?

# 直接用DataFrame中的rename()

1.2 初步观察

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

1.2.1 任务一:查看数据的基本信息
#写入代码
train_r_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0    乘客ID            891 non-null    int64  
 1    是否幸存            891 non-null    int64  
 2    乘客等级(1/2/3等舱位)  891 non-null    int64  
 3    乘客姓名            891 non-null    object 
 4    性别              891 non-null    object 
 5    年龄              714 non-null    float64
 6    堂兄弟/妹个数         891 non-null    int64  
 7    父母与小孩个数         891 non-null    int64  
 8    船票信息            891 non-null    object 
 9    票价              891 non-null    float64
 10   客舱              204 non-null    object 
 11   登船港口            889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
train_r_data.describe()



乘客ID

是否幸存

乘客等级(1/2/3等舱位)

年龄

堂兄弟/妹个数

父母与小孩个数

票价

count

891.000000

891.000000

891.000000

714.000000

891.000000

891.000000

891.000000

mean

446.000000

0.383838

2.308642

29.699118

0.523008

0.381594

32.204208

std

257.353842

0.486592

0.836071

14.526497

1.102743

0.806057

49.693429

min

1.000000

0.000000

1.000000

0.420000

0.000000

0.000000

0.000000

25%

223.500000

0.000000

2.000000

20.125000

0.000000

0.000000

7.910400

50%

446.000000

0.000000

3.000000

28.000000

0.000000

0.000000

14.454200

75%

668.500000

1.000000

3.000000

38.000000

1.000000

0.000000

31.000000

max

891.000000

1.000000

3.000000

80.000000

8.000000

6.000000

512.329200

train_r_data.memory_usage()
Index               128
 乘客ID              7128
 是否幸存              7128
 乘客等级(1/2/3等舱位)    7128
 乘客姓名              7128
 性别                7128
 年龄                7128
 堂兄弟/妹个数           7128
 父母与小孩个数           7128
 船票信息              7128
 票价                7128
 客舱                7128
 登船港口              7128
dtype: int64

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

1.2.2 任务二:观察表格前10行的数据和后15行的数据
#写入代码
train_r_data[:10]#或者用train_r_data.head(10)



乘客ID

是否幸存

乘客等级(1/2/3等舱位)

乘客姓名

性别

年龄

堂兄弟/妹个数

父母与小孩个数

船票信息

票价

客舱

登船港口

0

1

0

3

Braund, Mr. Owen Harris

male

22.0

1

0

A/5 21171

7.2500

NaN

S

1

2

1

1

Cumings, Mrs. John Bradley (Florence Briggs Th...

female

38.0

1

0

PC 17599

71.2833

C85

C

2

3

1

3

Heikkinen, Miss. Laina

female

26.0

0

0

STON/O2. 3101282

7.9250

NaN

S

3

4

1

1

Futrelle, Mrs. Jacques Heath (Lily May Peel)

female

35.0

1

0

113803

53.1000

C123

S

4

5

0

3

Allen, Mr. William Henry

male

35.0

0

0

373450

8.0500

NaN

S

5

6

0

3

Moran, Mr. James

male

NaN

0

0

330877

8.4583

NaN

Q

6

7

0

1

McCarthy, Mr. Timothy J

male

54.0

0

0

17463

51.8625

E46

S

7

8

0

3

Palsson, Master. Gosta Leonard

male

2.0

3

1

349909

21.0750

NaN

S

8

9

1

3

Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)

female

27.0

0

2

347742

11.1333

NaN

S

9

10

1

2

Nasser, Mrs. Nicholas (Adele Achem)

female

14.0

1

0

237736

30.0708

NaN

C

#写入代码 
train_r_data[-15:]  #或者用train_r_data.tail(15)



乘客ID

是否幸存

乘客等级(1/2/3等舱位)

乘客姓名

性别

年龄

堂兄弟/妹个数

父母与小孩个数

船票信息

票价

客舱

登船港口

876

877

0

3

Gustafsson, Mr. Alfred Ossian

male

20.0

0

0

7534

9.8458

NaN

S

877

878

0

3

Petroff, Mr. Nedelio

male

19.0

0

0

349212

7.8958

NaN

S

878

879

0

3

Laleff, Mr. Kristo

male

NaN

0

0

349217

7.8958

NaN

S

879

880

1

1

Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)

female

56.0

0

1

11767

83.1583

C50

C

880

881

1

2

Shelley, Mrs. William (Imanita Parrish Hall)

female

25.0

0

1

230433

26.0000

NaN

S

881

882

0

3

Markun, Mr. Johann

male

33.0

0

0

349257

7.8958

NaN

S

882

883

0

3

Dahlberg, Miss. Gerda Ulrika

female

22.0

0

0

7552

10.5167

NaN

S

883

884

0

2

Banfield, Mr. Frederick James

male

28.0

0

0

C.A./SOTON 34068

10.5000

NaN

S

884

885

0

3

Sutehall, Mr. Henry Jr

male

25.0

0

0

SOTON/OQ 392076

7.0500

NaN

S

885

886

0

3

Rice, Mrs. William (Margaret Norton)

female

39.0

0

5

382652

29.1250

NaN

Q

886

887

0

2

Montvila, Rev. Juozas

male

27.0

0

0

211536

13.0000

NaN

S

887

888

1

1

Graham, Miss. Margaret Edith

female

19.0

0

0

112053

30.0000

B42

S

888

889

0

3

Johnston, Miss. Catherine Helen "Carrie"

female

NaN

1

2

W./C. 6607

23.4500

NaN

S

889

890

1

1

Behr, Mr. Karl Howell

male

26.0

0

0

111369

30.0000

C148

C

890

891

0

3

Dooley, Mr. Patrick

male

32.0

0

0

370376

7.7500

NaN

Q

1.2.4 任务三:判断数据是否为空,为空的地方返回True,其余地方返回False
#写入代码
# 主要api可以用pd.isna()  pd.isnull() 
train_r_data_new.isna().head(10)



Survived

Pclass

Name

Sex

Age

SibSp

Parch

Ticket

Fare

Cabin

Embarked

PassengerId

1

False

False

False

False

False

False

False

False

False

True

False

2

False

False

False

False

False

False

False

False

False

False

False

3

False

False

False

False

False

False

False

False

False

True

False

4

False

False

False

False

False

False

False

False

False

False

False

5

False

False

False

False

False

False

False

False

False

True

False

6

False

False

False

False

True

False

False

False

False

True

False

7

False

False

False

False

False

False

False

False

False

False

False

8

False

False

False

False

False

False

False

False

False

True

False

9

False

False

False

False

False

False

False

False

False

True

False

10

False

False

False

False

False

False

False

False

False

True

False

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

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

# 个人觉得应该从数据类型、数据取值范围(是数值列还是分类列)

1.3 保存数据

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



是否幸存

乘客等级(1/2/3等舱位)

乘客姓名

性别

年龄

堂兄弟/妹个数

父母与小孩个数

船票信息

票价

客舱

登船港口

乘客ID

1

0

3

Braund, Mr. Owen Harris

male

22.0

1

0

A/5 21171

7.2500

NaN

S

2

1

1

Cumings, Mrs. John Bradley (Florence Briggs Th...

female

38.0

1

0

PC 17599

71.2833

C85

C

3

1

3

Heikkinen, Miss. Laina

female

26.0

0

0

STON/O2. 3101282

7.9250

NaN

S

#写入代码
# 注意:不同的操作系统保存下来可能会有乱码。大家可以加入`encoding='GBK' 或者 ’encoding = ’utf-8‘‘`
train_r_data.to_csv('train_chinese2.csv')

【总结】数据的加载以及入门,接下来就要接触数据本身的运算,我们将主要掌握numpy和pandas在工作和项目场景的运用。

遇到的问题,关于使用pd中的DataFrame模块下的rename函数用的不对,查看了https://www.cjavapy.com/article/713/ pd的API文档还是没弄清楚具体原因,等会在补充。

检查了一下代码,发现 第一个程序构造mapper有问题

# 方式二
str_info = """
PassengerId => 乘客ID
Survived => 是否幸存
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口
"""
mapper = {}
for s in str_info.strip().split('\n'):
    L = s.split(' => ',1) #返回的是一个list   由于空格而造成的之前一致没找到正确的key
    mapper[L[0]] = L[1]
print(mapper)
train_r_data_new = pd.read_csv(train_relative_data)

数据分析导入csv_数据