栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

数据分析实例——DataWhale202207(kaggle泰坦尼克任务)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据分析实例——DataWhale202207(kaggle泰坦尼克任务)

DataWhale课程地址:datawhalechina/hands-on-data-analysis: 动手学数据分析以项目为主线,知识点孕育其中,通过边学、边做、边引导来得到更好的学习效果 (github.com)

写在前面:DataWhale使用jupyter形式,笔者使用Pycharm使用的代码形式。

数据集下载地址:Titanic - Machine Learning from Disaster | Kaggle

1.数据加载

1.1数据载入及初步观察

任务一:导入numpy和pandas

#导入numpy和pandas
import numpy as np
import pandas as pd

安装numpy和pandas:  pip install numpy pandas

 

任务二:载入数据

#载入数据
df = pd.read_csv('train.csv')#已将文件放在工程目录下
#df = pd.read_csv('../train.csv')#绝对路径格式
print(df.head(3))#输出数据的前三行以判断数据是否成功导入

思考:read_csv与read_table 的区别

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

如果想让他们效果一样,需要怎么做?

# 调用read_table函数读取文件 data = pd.read_table("../data.txt,sep=','")

# 调用read_csv函数读取文件 df = pd.read_csv("../data.txt")


思考:TSV文件与CSV文件的区别与读取/生成

  • TSV与CSV的区别: 1)从名称上即可知道,TSV是用制表符(Tab,'t')作为字段值的分隔符;CSV是用半角逗号(',')作为字段值的分隔符; 2)IANA规定的标准TSV格式,字段值之中是不允许出现制表符的。
  • Python对TSV文件的支持: Python的csv模块准确的讲应该叫做dsv模块,因为它实际上是支持范式的分隔符分隔值文件(DSV,delimiter-separated values)的。 delimiter参数值默认为半角逗号,即默认将被处理文件视为CSV。 当delimiter='t'时,被处理文件就是TSV。
  • 参考链接

  

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

#每1000行为一个数据模块,逐块读取
data = pd.read_csv('train.csv', chunksize=1000)
#print(data)
#直接输出data时会出现
for chunk in data:#可以通过逐 block 加载
    print(chunk.astype(str))

 对于的解决参考此链接:通过逐 block 加载

【思考】什么是逐块读取?为什么要逐块读取呢?chunker(数据块)是什么类型?用for循环打印出来出处具体的样子是什么?

每次读取文件的最多chunksize行,每次读取到的部分以DataFrame类型返回。

逐块读取可以用来读取大文件,防止将文件一次性读入,因为内存占用过多产生各种问题。

链接:DataFrame类型解析

 

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

#将表头改成中文,索引改为乘客ID 

#法1
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
# pd.set_option('display.max_columns', None)   #显示完整的列
# pd.set_option('display.max_rows', None) 	 #显示完整的行
print(df.head())#默认为5行

#法2
newNamesDict={
    'PassengerId':'乘客ID',
    'Survived':'是否幸存',
    'Pclass':'乘客等级(1/2/3等舱位)',
    'Name':'乘客姓名',
    'Sex':'性别',
    'Age':'年龄',
    'SibSp':'堂兄弟/妹个数',
    'Parch':'父母与小孩个数',
    'Ticket':'船票信息',
    'Fare':'票价',
    'Cabin':'客舱',
    'Embarked':'登船港口',
}
df=pd.read_csv('train.csv')
df=df.rename(columns=newNamesDict)
df=df.set_index(keys='乘客ID')#需要设置为索引的列名,可以是单个列名,或者是多个列名
print(df.head())

pd.read_csv()参数详解

set_index详解

pandas读取csv格式数据时header参数设置

任务五:查看数据的基本信息,观察表格前10行的数据和后15行的数据

#查看数据的基本信息
print(df.info())

#观察表格前10行的数据和后15行的数据
pd.set_option('display.max_columns', None)   #显示完整的列
pd.set_option('display.max_rows', None) 	 #显示完整的行
print(df.head(10),'n',df.tail(15))

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

#判断数据是否为空,为空的地方返回True,其余地方返回False
pd.set_option('display.max_columns', None)   #显示完整的列
pd.set_option('display.max_rows', None) 	 #显示完整的行
print(df.isnull().head())
pd.options.display.max_rows=15#最多显示15行
print(df.isnull().sum())

pandas中显示行、列个数的设置 

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

#将加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
#注:不同的操作系统保存下来可能会有乱码,可以加入 encoding='GBK' 或 encoding = 'utf-8'
try:
    df.to_csv('train_chinese.csv',encoding = 'utf-8')
    print('保存成功')
except:
    print('保存失败')

1.2Pandas基础

 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。

Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以重复的。
DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

参考

#任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。

import numpy as np
import pandas as pd

sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1 = pd.Series(sdata)
print(example_1)

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(data)
print(example_2)

 

任务二:载入"train.csv"文件并进行一些操作

import numpy as np
import pandas as pd

#任务二:根据上节课的方法载入"train.csv"文件
df = pd.read_csv('train.csv')

#任务三:查看DataFrame数据的每列的名称
print(df.columns)

#任务四:查看"Cabin"这列的所有值
print(df['Cabin'])
print(df.Cabin)

#任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
df1=pd.read_csv('test_1.csv')
print(df1.head(3))#输出观察
del df1['a']# 删除多出的'a'列
print(df1.head(3))#输出删除'a'列后的列表

#任务六: 将['PassengerId','Name','Age','Ticket']这几个列元素隐藏,只观察其他几个列元素
# df1.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)
# print(df1)#只是隐藏,并未删除,因此此次输出的仍是隐藏前的完整列表
print(df1.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3))#此次输出隐藏操作后的列表

总结  

在 Pandas DataFrame 中

1.添加一行

 .loc [index] 将字典作为行添加Dataframe .append 方法

2. 添加一列

df[column] = valuedf.insertpd.concat 

3.删除行、列

删除行

data.drop([0,1#行索引],inplace = True)

data.drop(index = [3,4,5#行索引],inplace = True)

删除列

data.drop('列名',axis = 1,inplace = True) 

data.drop(columns = [‘列名1','列名2'],inplace = True)

参数含义:

labels:要删除的行或列,用列表给出
axis:默认为0,指要删除的是行,删除列时需指定axis为1
index :直接指定要删除的行,删除多行可以使用列表作为参数
columns:直接指定要删除的列,删除多列可以使用列表作为参数
inplace: 默认为False,该删除操作不改变原数据;inplace = True时,改变原数据

任务三:筛选的逻辑

利用pandas进行条件筛选和组合筛选

 loc方法

pandas索引函数loc和iloc的区别 

import numpy as np
import pandas as pd
df = pd.read_csv('train.csv')
#任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息
print(df[df["Age"]<10].head(3))
# 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
midage = df[(df["Age"]>10)& (df["Age"]<50)]
print(midage.head(3))
# 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
midage = midage.reset_index(drop=True)
print(midage.loc[[100],['Pclass','Sex']])
#任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
print(midage.loc[[100,105,108],['Pclass','Name','Sex']])
#任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.iloc[[100,105,108],[2,3,4]]

1.3探索性数据分析

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

frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
                    index=['2', '1'],
                    columns=['d', 'a', 'b', 'c'])#自己构建一个都为数字的DataFrame数据
print(frame)
print(frame.sort_values(by='c', ascending=True))
#根据'c'列的值来升序排列(by参数指向要排列的列,ascending参数指向排序的方式(升序还是降序))

【代码解析】
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.sort_index()frame.sort_index(axis=1)

frame.sort_index

(axis=1, ascending=False)

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

 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列)

import numpy as np
import pandas as pd
text = pd.read_csv('train_chinese.csv')#导入之前保存的数据
text1=text.sort_values(by=['票价', '年龄'], ascending=False)
pd.set_option('display.max_columns', None)   #显示完整的列
pd.set_option('display.max_rows', None) 	 #显示完整的行
print(text1.head(20))#查看前二十行数据

 根据输出数据思考年龄及票价与存活与否的关系。

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

# 具体请看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分
#建立一个例子
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'])
print(frame1_a)
print(frame1_b)
print(frame1_a + frame1_b)
#两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。

 

 

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

#最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’)
import numpy as np
import pandas as pd
text = pd.read_csv('train_chinese.csv')#导入之前保存的数据
print(text['兄弟姐妹个数'] + text['父母子女个数'])
print(max(text['兄弟姐妹个数'] + text['父母子女个数']))
#两列相加返回一个DataFrame,然后用max函数求出最大值

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

调用describe()函数会自动计算如下数值:
count : 样本数据大小
mean : 样本数据的平均值
std : 样本数据的标准差
min : 样本数据的最小值
25% : 样本数据25%的时候的值
50% : 样本数据50%的时候的值
75% : 样本数据75%的时候的值
max : 样本数据的最大值

 对泰坦尼克的部分项目进行分析

print('票价的统计信息:n',text['票价'].describe())
print('父母子女个数的统计信息:n',text['父母子女个数'].describe())

 

 票价分析: 一共有891个票价数据, 平均值约为:32.20, 标准差约为49.69,说明票价波动特别大, 25%的人的票价是低于7.91的,50%的人的票价低于14.45,75%的人的票价低于31.00, 票价最大值约为512.33,最小值为0。

父母子女个数分析:一共有891个数据, 平均值约为:0.38, 标准差约为49.69,75%甚至更多的人没有父母子女,父母子女最多的是6,最少为0。

 

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012770.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号