datawhale 动手做深度学习 第一节

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

1.1 载入数据

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

1.1.1 任务一:导入numpy和pandas

import numpy as np
import pandas as pd

1.1.2 任务二:载入数据

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

#写入代码
import os
os.getcwd()
data = pd.read_csv('train.csv')
data
data2 = pd.read_table('train.csv')
#data2
#写入代码
data1=pd.read_csv('E:\\人工智能学习\\hands-on-data-analysis-master\\第一单元项目集合\\train.csv')
data1
#在使用绝对路径载入数据时报错 OSError: [Errno 22] Invalid argument,解决方法是手打一遍路径,不直接复制粘贴,复制黏贴就会出现此错误
【思考】知道数据加载的方法后,试试pd.read_csv()和pd.read_table()的不同,如果想让他们效果一样,需要怎么做?了解一下'.tsv'和'.csv'的不同,如何加载这两个数据集?

答:read_table的默认分隔符为"\t" pd.read_csv输出的数据是多少个特征就多少列,而pd.read_table()是无论多少特征只有一列 tsv用制表符"/t"分隔,csv则是用','作为字符分隔符

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

#写入代码
chunker = pd.read_csv('train.csv', chunksize=1000)
print(type(chunker))
for chunker in data:
  print(chunker)
<class 'pandas.io.parsers.TextFileReader'>
PassengerId
Survived
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked

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

每次进行迭代的时候是一个DataFrame的结构,逐块读取可以减少资源消耗,提高效率

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

#写入代码
#方法1
data = pd.read_csv('train.csv', names=['乘客ID', '是否幸存', '乘客等级(1/2/3等舱位)', '乘客姓名', '性别', '年龄', '堂兄弟/妹个数', '父母与小孩个数', '船票信息', '票价', '客舱', '登船港口'],index_col='乘客ID', header=0 )
#方法2
df1=pd.read_csv('train.csv')
df1.rename(columns={'Survived':'是否幸存', 'Pclass':'仓位等级', 'name':'姓名'}, inplace = True)#可以修改部分或者全部
#方法3
df2=pd.read_csv('train.csv')
df2.columns=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口']
#该方法的新列名必须要与原列名一一对应
data
df1.head()
df2.head()

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

没想到

1.2 初步观察

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

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

#写入代码
data.info()

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

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

data.head(10)
data.tail(15)
data.iloc[-15:,:]

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

data.isnull()

1.3 保存数据

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

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

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

1.4 知道你的数据叫什么

我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?

开始前导入numpy和pandas

In [4]:

import numpy as np
import pandas as pd

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

Series只有一列数据和索引,dataframe有一列index和多列数据

In [21]:

series1 = pd.Series(['1','5','7'], index=['2','4','6'],name='test')
dataframe1 = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6]})
series1
#dataframe1

In [22]:


#我们举的例子
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1 = pd.Series(sdata)
example_1

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

In [5]:

data = pd.read_csv('train.csv')

也可以加载上一节课保存的"train_chinese.csv"文件。通过翻译版train_chinese.csv熟悉了这个数据集,然后我们对trian.csv来进行操作

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

data.columns
data.head(0)

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

In [18]:

data['Cabin']
data.Cabin

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

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

compare=pd.read_csv("test_1.csv")
compare.head(0)
#写入代码
del compare['a']
compare.head(0)

【思考】还有其他的删除多余的列的方式吗?

new_columns = list(compare.columns)
new_columns.remove('a')
df = df[new_columns]

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

data = pd.read_csv('train.csv')
data.drop(['PassengerId','Name','Age','Ticket'],axis=1)
data

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

【思考回答】

如果想要完全的删除你的数据结构,使用inplace=True,因为使用inplace就将原数据覆盖了,所以这里没有用

data.drop(['PassengerId','Name','Age','Ticket'],axis=1,inplace=True) inplace默认为False,如果设置为True那么就会将修改覆盖到原来的数据上

1.5 筛选的逻辑

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

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

data[data["Age"]<10]

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

midage=data[(data["Age"]<50)&(data["Age"]>10)]
midage.head(10)

【提示】了解pandas的条件筛选方式以及如何使用交集和并集操作

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

In [1]:

midage = midage.reset_index(drop=True)
midage.loc[[100],["Pclass", "Sex"]]

【提示】在抽取数据中,我们希望数据的相对顺序保持不变,用什么函数可以达到这个效果呢?

midage = midage.reset_index(drop=True) loc使用字符型搜索的,所以如果没有加上reset_index函数,其实搜索到的不是真实的第一百行数据,而是index值为100的那一条数据

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]]

【思考】对比ilocloc的异同

iloc主要使用数字来索引数据,而不能使用字符型的标签来索引数据。 而loc则刚好相反,只能使用字符型标签来索引数据

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

In [3]:

#加载所需的库
import numpy as np
import pandas as pd

In [13]:

#载入之前保存的train_chinese.csv数据,关于泰坦尼克号的任务,我们就使用这个数据
data=pd.read_csv("train_chinese.csv")

1.6 了解你的数据吗?

教材《Python for Data Analysis》第五章

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

data = {'year': [2000, 2001, 2002, 2001, 2002, 2003],
      'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
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中的数据根据某一列,升序排列

In [16]:

frame.sort_values(by='pop')#默认升序

Out[16]:

 yearpop
0 2000 1.5
1 2001 1.7
3 2001 2.4
4 2002 2.9
5 2003 3.2
2 2002 3.6

【思考】通过书本你能说出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=['year','pop'],ascending=False)

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

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

'''
m=data.sort_values(by=['票价','年龄'],ascending=False)
m.head(20)
#代码

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

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

多做几个数据的排序

In [4]:

#代码
#时间不足先不做了QAQ

1.6.3 任务三:利用Pandas进行算术计算,计算两个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

In [23]:

#代码
frame1_b

将frame_a和frame_b进行相加

#代码
frame1_a+frame1_b

Out[27]:

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

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

In [30]:

#代码
max(data['兄弟姐妹个数']+data['父母子女个数'])

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

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

#代码
#时间紧QAQ

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

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

#代码
frame2.describe()

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

data['票价'].describe()

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

posted @ 2021-12-14 22:24  ytttttt桃  阅读(71)  评论(0)    收藏  举报