DW数据加载及探索性数据分析

1 数据载入及初步观察

通过数据分析的实战教学,完成kaggle上泰坦尼克的任务,实战数据分析全流程。
参考资料:
教材《Python for Data Analysis》

1.1 载入数据

1.1.2 任务二:载入数据
(1) 使用相对路径载入数据
(2) 使用绝对路径载入数据

df=pd.read_csv("train.csv")
df.head()
df1 = pd.read_csv("C:/Users/lenovo/Desktop/DW/hands-on-data-analysis-master/titanic/train.csv")
 #要么路径中都是英文名
 #要么路径后加上engine='python'
 #df1 = pd.read_csv("C:/Users/lenovo/Desktop/DW/hands-on-data-analysis-master/第一单元项目集合/train.csv",engine='python')
df1.head() 

【思考】知道数据加载的方法后,试试pd.read_csv()和pd.read_table()的不同,如果想让他们效果一样,需要怎么做?了解一下’.tsv’和’.csv’的不同,如何加载这两个数据集?

table默认分隔符为制表符(’\t’)
让table 和 csv 效果一样加上 sep=’,’

df1 = pd.read_table("C:/Users/lenovo/Desktop/DW/hands-on-data-analysis-master/第一单元项目集合/train.csv",sep=',',engine='python')
df1.head() 

【总结】加载的数据是所有工作的第一步,我们的工作会接触到不同的数据格式(eg:.csv;.tsv;.xlsx),但是加载的方法和思路都是一样的,在以后工作和做项目的过程中,遇到之前没有碰到的问题,要多多查资料吗,使用google,了解业务逻辑,明白输入和输出是什么。

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

chunker = pd.read_csv('train.csv', chunksize=1000)

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

有chunksize参数可以进行逐块加载,它的本质就是将文本分成若干块
for chunk in chunker

1.1.4 任务四:将表头改成中文,索引改为乘客ID

df = pd.read_csv('train.csv',names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数',
                                     '船票信息','票价','客舱','登船港口'],
                 index_col='乘客ID',header=0)
#header=0将第一行数据作为列名然后又被重命名names覆盖了,也可先读取后改名
df.head()
是否幸存仓位等级姓名性别年龄兄弟姐妹个数父母子女个数船票信息票价客舱登船港口
乘客ID
103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
503Allen, Mr. William Henrymale35.0003734508.0500NaNS

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

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

1.2 初步观察

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

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

df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 891 entries, 1 to 891
Data columns (total 11 columns):
是否幸存      891 non-null int64
仓位等级      891 non-null int64
姓名        891 non-null object
性别        891 non-null object
年龄        714 non-null float64
兄弟姐妹个数    891 non-null int64
父母子女个数    891 non-null int64
船票信息      891 non-null object
票价        891 non-null float64
客舱        204 non-null object
登船港口      889 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 83.5+ KB
df.describe()

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

df.head(10)
df.tail(15)

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

df.isnull()

1.3 保存数据

df.to_csv('train_chinese.csv')

1.4 数据查看与删除

查看DataFrame数据的每列的项

df.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')

查看"cabin"这列的所有项 [有多种方法]

df["Cabin"].head()
df.Cabin.head()
0     NaN
1     C85
2     NaN
3    C123
4     NaN
Name: Cabin, dtype: object

删除多余的列的方式

del df1['a'] #永久删除
df1.head()
"""drop方法的用法:drop(labels, axis=0, level=None, inplace=False, errors='raise')
       --  axis为0时表示删除行,axis为1时表示删除列 默认为按行
       inplace 接收逻辑型boolean代表操作是否对原数据生效,默认为False
       labels代表删除行或列的标签"""
df1.drop('a',axis=1).head()

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

df.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)
SurvivedPclassSexSibSpParchFareCabinEmbarked
003male107.2500NaNS
111female1071.2833C85C
213female007.9250NaNS

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

【思考回答】

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

df.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS

1.5 筛选的逻辑

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

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

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

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

midage = midage.reset_index(drop=True) #重置索引
midage.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
midage.loc[[100],['Pclass','Sex']]
PclassSex
1002male

【思考】这个reset_index()函数的作用是什么?如果不用这个函数,下面的任务会出现什么情况?

reset_index()是重置索引,因为前面对数据进行了筛选,所以索引不连续,而drop=True是表示把原来的索引index列去掉,默认 False。

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

loc方法

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

iloc方法

midage.iloc[[100,105,108],[2,3,4]]
PclassNameSex
1002Byles, Rev. Thomas Roussel Davidsmale
1053Cribb, Mr. John Hatfieldmale
1083Calic, Mr. Jovomale

基于标签: loc
基于位置: iloc

2 探索性数据分析

1.6 数据的排序、计算与描述

教材《Python for Data Analysis》第五章

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

# 具体请看《利用Python进行数据分析》第五章 排序和排名 部分
#自己构建一个都为数字的DataFrame数据
frame = pd.DataFrame(np.arange(8).reshape((2, 4)), 
                     index=['2', '1'], 
                     columns=['d', 'a', 'b', 'c'])
frame

1.根据列的值来排序

frame.sort_values(by='c', ascending=False)
# 大多数时候我们都是想根据列的值来排序

2.让行索引升序排序

frame.sort_index()

3.让列索引升序排序

frame.sort_index(axis=1)

4.让列索引降序排序

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

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

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

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

df.sort_values(by=['票价', '年龄'], ascending=False).head(20)
乘客ID是否幸存仓位等级姓名性别年龄兄弟姐妹个数父母子女个数船票信息票价客舱登船港口
67968011Cardeza, Mr. Thomas Drake Martinezmale36.001PC 17755512.3292B51 B53 B55C
25825911Ward, Miss. Annafemale35.000PC 17755512.3292NaNC
73773811Lesurer, Mr. Gustave Jmale35.000PC 17755512.3292B101C
43843901Fortune, Mr. Markmale64.01419950263.0000C23 C25 C27S
34134211Fortune, Miss. Alice Elizabethfemale24.03219950263.0000C23 C25 C27S
888911Fortune, Miss. Mabel Helenfemale23.03219950263.0000C23 C25 C27S
272801Fortune, Mr. Charles Alexandermale19.03219950263.0000C23 C25 C27S
74274311Ryerson, Miss. Susan Parker "Suzette"female21.022PC 17608262.3750B57 B59 B63 B66C
31131211Ryerson, Miss. Emily Boriefemale18.022PC 17608262.3750B57 B59 B63 B66C
29930011Baxter, Mrs. James (Helene DeLaudeniere Chaput)female50.001PC 17558247.5208B58 B60C
11811901Baxter, Mr. Quigg Edmondmale24.001PC 17558247.5208B58 B60C
38038111Bidois, Miss. Rosaliefemale42.000PC 17757227.5250NaNC
71671711Endres, Miss. Caroline Louisefemale38.000PC 17757227.5250C45C
70070111Astor, Mrs. John Jacob (Madeleine Talmadge Force)female18.010PC 17757227.5250C62 C64C
55755801Robbins, Mr. VictormaleNaN00PC 17757227.5250NaNC
52752801Farthing, Mr. JohnmaleNaN00PC 17483221.7792C95S
37737801Widener, Mr. Harry Elkinsmale27.002113503211.5000C82C
77978011Robert, Mrs. Edward Scott (Elisabeth Walton Mc...female43.00124160211.3375B3S
73073111Allen, Miss. Elisabeth Waltonfemale29.00024160211.3375B5S
68969011Madill, Miss. Georgette Alexandrafemale15.00124160211.3375B5S

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

多做几个数据的排序

df.sort_values(by=[ '年龄']).head(20)
乘客ID是否幸存仓位等级姓名性别年龄兄弟姐妹个数父母子女个数船票信息票价客舱登船港口
80380413Thomas, Master. Assad Alexandermale0.420126258.5167NaNC
75575612Hamalainen, Master. Viljomale0.671125064914.5000NaNS
64464513Baclini, Miss. Eugeniefemale0.7521266619.2583NaNC
46947013Baclini, Miss. Helene Barbarafemale0.7521266619.2583NaNC
787912Caldwell, Master. Alden Gatesmale0.830224873829.0000NaNS
83183212Richards, Master. George Sibleymale0.83112910618.7500NaNS
30530611Allison, Master. Hudson Trevormale0.9212113781151.5500C22 C26S
82782812Mallet, Master. Andremale1.0002S.C./PARIS 207937.0042NaNC
38138213Nakid, Miss. Maria ("Mary")female1.0002265315.7417NaNC
16416503Panula, Master. Eino Viljamimale1.0041310129539.6875NaNS
18318412Becker, Master. Richard Fmale1.002123013639.0000F4S
38638703Goodwin, Master. Sidney Leonardmale1.0052CA 214446.9000NaNS
17217313Johnson, Miss. Eleanor Ileenfemale1.001134774211.1333NaNS
78878913Dean, Master. Bertram Veremale1.0012C.A. 231520.5750NaNS
64264303Skoog, Miss. Margit Elizabethfemale2.003234708827.9000NaNS
7803Palsson, Master. Gosta Leonardmale2.003134990921.0750NaNS
53053112Quick, Miss. Phyllis Mayfemale2.00112636026.0000NaNS
29729801Allison, Miss. Helen Lorainefemale2.0012113781151.5500C22 C26S
82482503Panula, Master. Urho Abrahammale2.0041310129539.6875NaNS
20520603Strom, Miss. Telma Matildafemale2.000134705410.4625G6S

年龄最小的20的乘客中存活的有13人。

df.sort_values(by=['性别']).head(20) # 非数值数据 但也能大致看出女性存活率较高
乘客ID是否幸存仓位等级姓名性别年龄兄弟姐妹个数父母子女个数船票信息票价客舱登船港口
38338411Holverson, Mrs. Alexander Oskar (Mary Aline To...female35.01011378952.0000NaNS
21821911Bazzani, Miss. Albinafemale32.0001181376.2917D15C
60961011Shutes, Miss. Elizabeth Wfemale40.000PC 17582153.4625C125S
21621713Honkanen, Miss. Eliinafemale27.000STON/O2. 31012837.9250NaNS
21521611Newell, Miss. Madeleinefemale31.01035273113.2750D36C
60860912Laroche, Mrs. Joseph (Juliette Marie Louise La...female22.012SC/Paris 212341.5792NaNC
75075112Wells, Miss. Joanfemale4.0112910323.0000NaNS
21121212Cameron, Miss. Clear Anniefemale35.000F.C.C. 1352821.0000NaNS
74774812Sinkkonen, Miss. Annafemale30.00025064813.0000NaNS
40240303Jussila, Miss. Mari Ainafemale21.01041379.8250NaNS
20820913Carr, Miss. Helen "Ellen"female16.0003672317.7500NaNQ
75475512Herman, Mrs. Samuel (Jane Laver)female48.01222084565.0000NaNS
45845912Toomey, Miss. Ellenfemale50.000F.C.C. 1353110.5000NaNS
20520603Strom, Miss. Telma Matildafemale2.00134705410.4625G6S
64164211Sagesser, Mlle. Emmafemale24.000PC 1747769.3000B35C
34534612Brown, Miss. Amelia "Mildred"female24.00024873313.0000F33S
34634712Smith, Miss. Marion Elsiefemale40.0003141813.0000NaNS
45745811Kenyon, Mrs. Frederick R (Marion)femaleNaN101746451.8625D21S
75976011Rothes, the Countess. of (Lucy Noel Martha Dye...female33.00011015286.5000B77S
61061103Andersson, Mrs. Anders Johan (Alfrida Konstant...female39.01534708231.2750NaNS

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'])
print(frame1_a)
print(frame1_b)
         a    b    c
one    0.0  1.0  2.0
two    3.0  4.0  5.0
three  6.0  7.0  8.0
          a     e     c
first   0.0   1.0   2.0
one     3.0   4.0   5.0
two     6.0   7.0   8.0
second  9.0  10.0  11.0

将frame_a和frame_b进行相加

frame1_a+frame1_b
abce
firstNaNNaNNaNNaN
one3.0NaN7.0NaN
secondNaNNaNNaNNaN
threeNaNNaNNaNNaN
two9.0NaN13.0NaN

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

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

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

'''
如果我们想看看在船上,最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’)
'''
max(df.兄弟姐妹个数+df.父母子女个数)
10

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

'''
count : 样本数据大小
mean : 样本数据的平均值
std : 样本数据的标准差
min : 样本数据的最小值
25% : 样本数据25%的时候的值
50% : 样本数据50%的时候的值
75% : 样本数据75%的时候的值
max : 样本数据的最大值
'''
df.describe()
df['票价'].describe()
count    891.000000
mean      32.204208
std       49.693429
min        0.000000
25%        7.910400
50%       14.454200
75%       31.000000
max      512.329200
Name: 票价, dtype: float64

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

family = df.兄弟姐妹个数+df.父母子女个数
df.insert(6,'家庭人口数', family)
df.sort_values(by=["家庭人口数"],ascending = False).head(20)
乘客ID是否幸存仓位等级姓名性别年龄家庭人口数兄弟姐妹个数父母子女个数船票信息票价客舱登船港口
18018103Sage, Miss. Constance GladysfemaleNaN1082CA. 234369.5500NaNS
84684703Sage, Mr. Douglas BullenmaleNaN1082CA. 234369.5500NaNS
79279303Sage, Miss. Stella AnnafemaleNaN1082CA. 234369.5500NaNS
20120203Sage, Mr. FrederickmaleNaN1082CA. 234369.5500NaNS
15916003Sage, Master. Thomas HenrymaleNaN1082CA. 234369.5500NaNS
86386403Sage, Miss. Dorothy Edith "Dolly"femaleNaN1082CA. 234369.5500NaNS
32432503Sage, Mr. George John JrmaleNaN1082CA. 234369.5500NaNS
38638703Goodwin, Master. Sidney Leonardmale1.0752CA 214446.9000NaNS
596003Goodwin, Master. William Frederickmale11.0752CA 214446.9000NaNS
67867903Goodwin, Mrs. Frederick (Augusta Tyler)female43.0716CA 214446.9000NaNS
68368403Goodwin, Mr. Charles Edwardmale14.0752CA 214446.9000NaNS
48048103Goodwin, Master. Harold Victormale9.0752CA 214446.9000NaNS
717203Goodwin, Miss. Lillian Amyfemale16.0752CA 214446.9000NaNS
11912003Andersson, Miss. Ellis Anna Mariafemale2.064234708231.2750NaNS
61061103Andersson, Mrs. Anders Johan (Alfrida Konstant...female39.061534708231.2750NaNS
26126213Asplund, Master. Edvin Rojj Felixmale3.064234707731.3875NaNS
23323413Asplund, Miss. Lillian Gertrudfemale5.064234707731.3875NaNS
81381403Andersson, Miss. Ebba Iris Alfridafemale6.064234708231.2750NaNS
686913Andersson, Miss. Erna Alexandrafemale17.064231012817.9250NaNS
252613Asplund, Mrs. Carl Oscar (Selma Augusta Emilia...female38.061534707731.3875NaNS

票价越高,年龄越小存活率相对越高,家庭总人数越多,存活率相对较低。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KDWM1000 是一款Local Positioning System (LPS)的开发模块,这款模块主要结合了自己之前做的SmartIMU与现成的 DWM1000 模块,目前版本 v1.4,大致的功能都验证过没问题。 该KDWM1000模组集成了 MPU9250(加速度计、陀螺仪、磁力计)、LPS25HB(气压计) 10DOF 的传感器,并采用 ARM CortexM4F STM32F411CE 来控制,除了传感器与 DWM1000 模块外,还有可控制的三个 RGB LED、一个电源开关、按键与一个 MicroUSB 接口,此外将其他没有使用到的脚位都拉到 2.54mm 的排针上面,可以直接插在面包版上做开发,预计之后要透过 IMU 与 UWB 来实现空间中的定位,并尝试将其结合至飞行器上,实现成另一款飞控板。 KDWM1000模组PCB结构图: KDWM1000模组PCB 3D截图: KDWM1000模组硬件: 控制器 : STM32F411C 48Pin 100MHz DSP FPU 感測器 : MPU9250 + LPS25HB UWB : DecaWave DWM1000 PCB 尺寸 : 25.4 x 45.72 mm Ultra-wideband(UWB) 是一种无载波通信技术,采用 nanosecond(ns) 至 picosecond(ps) 级的极短脉冲信号来传递数据,耗电量低,因为脉冲极短(光速大约30cm/ns),所以对于绕射、反射干扰影响较小,电波讯号穿透性较佳,理论上可以实现较精确的定位。 KDWM1000 UWB 部分使用的是 Decawave 开发的 DWM1000 模块,DWM1000 模块基本简介: 符合 IEEE802.15.4-2011 UWB 规范 在实时的定位系统中,可以达到室内 10cm 的精度 资料传输速度高达 6.8 Mb/s 通讯距离达 300m 支持高密度 tag,20m 半径内可达 11,000 对多路径与衰减具有高抗干扰能力,使其在高衰减环境亦可进行可靠的通讯 功耗低,可以使用电池工作在长时间下 体积小,容易结合至其他 RTLS 与 WSN 系统 集成天线的一款模块 更详细的说明与功能可以参考官方的相关资料:https://www.decawave.com/products/dwm1000-module DWM1000模块实物截图: ,实体图片↓

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值