国外免费推广网站,c 网站建设报告,模板网最新版本,网站流量课程1-hadoop-Zookeeper安装
Ububtu18.04安装Zookeeper3.7.1
环境与版本
这里采用的ubuntu18.04环境的基本配置为#xff1a;
hostname 为master
用户名为hadoop
静态IP为 192.168.100.3
网关为 192.168.100.2
防火墙已经关闭
/etc/hosts已经配置全版本下载地址#xff1…
课程1-hadoop-Zookeeper安装
Ububtu18.04安装Zookeeper3.7.1
环境与版本
这里采用的ubuntu18.04环境的基本配置为
hostname 为master
用户名为hadoop
静态IP为 192.168.100.3
网关为 192.168.100.2
防火墙已经关闭
/etc/hosts已经配置全版本下载地址 https://archive.apache.org/dist/zookeeper/ 这里我选择3.7.1这个版本 https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/
下载到本地后将apache-zookeeper-3.7.1-bin.tar.gz上传到ubuntu18.04的/home/hadoop/opt/app目录下 该目录下的目录作用如下
bin目录 框架启动停止客户端和服务端的
conf 配置文件信息
docs文档
lib 配置文档的依赖standlone模式安装
解压缩与配置软连接
hadoopmaster:~$ cd /home/hadoop/opt/app/
# 解压缩
hadoopmaster:~/opt/app$ tar -zxf apache-zookeeper-3.7.1-bin.tar.gz 查看当前目录结构
hadoopmaster:~/opt/app$ pwd # 查看当前目录
/home/hadoop/opt/app
hadoopmaster:~/opt/app$ ll
总用量 9120
drwxrwxr-x 6 hadoop hadoop 4096 11月 12 10:42 ./
drwxrwxr-x 3 hadoop hadoop 4096 11月 4 14:53 ../
drwxrwxr-x 6 hadoop hadoop 4096 11月 12 10:41 apache-zookeeper-3.7.1-bin/
-rw-rw-r-- 1 hadoop hadoop 9311744 11月 12 10:39 apache-zookeeper-3.7.1-bin.tar.gz配置zookeeper的软连接
# 软连接
hadoopmaster:~/opt/app$ ln -s apache-zookeeper-3.7.1-bin zookeeper 创建存储目录与修改zoo.cfg文件
切换到~/opt/app/zookeeper配置zookeeper的数据存储-data0目录
hadoopmaster:~/opt/app$ cd zookeeper # 切换到zookeeper中
hadoopmaster:~/opt/app/zookeeper$ ls
bin conf docs lib LICENSE.txt NOTICE.txt README.md README_packaging.txt
hadoopmaster:~/opt/app/zookeeper$ mkdir data0 # 创建data0
hadoopmaster:~/opt/app/zookeeper$ ls
bin conf data0 docs lib LICENSE.txt NOTICE.txt README.md README_packaging.txt进入~/opt/app/zookeeper/conf目录下复制zoo_sample.cfg为zoo.cfg
hadoopmaster:~/opt/app/zookeeper$ cd conf/
hadoopmaster:~/opt/app/zookeeper/conf$ ls
configuration.xsl log4j.properties zoo_sample.cfg
hadoopmaster:~/opt/app/zookeeper/conf$ cp zoo_sample.cfg zoo.cfg #复制zoo.cfg
编辑zoo.cfg
hadoopmaster:~/opt/app/zookeeper/conf$ vi zoo.cfg # 编辑zoo.cfg文件编辑内容如下
# dataDir/tmp/zookeeper 注释掉这句默认配置然后添加下面的配置
dataDir/home/hadoop/opt/app/zookeeper/data0# 在配置文件的最后面添加
server.1master:2888:3888
# 如果是单节点的zookeeper集群部署可以配置多个server
#server.2master:2889:3889
#server.3master:2890:3890配置zookeeper的环境变量
hadoopmaster:~/opt/app/zookeeper/conf$ vi ~/.bashrc
#这一步会打开bashrc文件编辑内容如下
export ZOOKEEPER_HOME/home/hadoop/opt/app/zookeeper
export PATH$ZOOKEEPER_HOME/bin:$PATHhadoopmaster:~/opt/app/zookeeper/conf$ source ~/.bashrc # 生效环境变量启动与查看zk服务端(单机版本)
启动zk服务端(单机版本) 查看zk启动状态
hadoopmaster:~/opt/app/zookeeper/conf$ zkServer.sh status #查看zk启动状态
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/app/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Error contacting service. It is probably not running.启动zkServer
hadoopmaster:~/opt/app/zookeeper/conf$ zkServer.sh start #启动zkServer
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED查看zk启动状态
hadoopmaster:~/opt/app/zookeeper/conf$ zkServer.sh status #查看zk启动状态单机启动为standalone模式
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/app/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone关闭zk服务端(单机版本)
zkServer.sh start # 启动zk服务端
zkServer.sh stop # 关闭zk服务端
zkServer.sh status # 查看zk服务端状态启动zk客户端
hadoopmaster:~/opt/app/zookeeper/conf$ zkCli.sh #启动zkCli默认连接端口2181
Connecting to localhost:2181
...
...
...
WATCHER::WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] help
ZooKeeper -server host:port cmd argsaddauth scheme authcloseconfig [-c] [-w] [-s]connect host:portcreate [-s] [-e] [-c] [-t ttl] path [data] [acl]delete [-v version] pathdeleteall pathdelquota [-n|-b] pathget [-s] [-w] pathgetAcl [-s] pathhistorylistquota pathls [-s] [-w] [-R] pathls2 path [watch]printwatches on|offquitreconfig [-s] [-v version] [[-file path] | [-members serverIDhost:port1:port2;port3[,...]*]] | [-add serverIdhost:port1:port2;port3[,...]]* [-remove serverId[,...]*]redo cmdnoremovewatches path [-c|-d|-a] [-l]rmr pathset [-s] [-v version] path datasetAcl [-s] [-v version] [-R] path aclsetquota -n|-b val pathstat [-w] pathsync path
Command not found: Command not found help
[zk: localhost:2181(CONNECTED) 2] quitWATCHER::WatchedEvent state:Closed type:None path:null
2021-11-12 11:05:29,497 [myid:] - INFO [main:ZooKeeper1422] - Session: 0x1000029eae60000 closed
2021-11-12 11:05:29,497 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread524] - EventThread shut down for session: 0x1000029eae60000
hadoopmaster:~/opt/app/zookeeper/conf$配置伪分布式的Zookeeper
本小节的伪分布式集群部署是指在一台机器master上配置多个配置文件zoo1.cfg,zoo2.cfg,zoo3.cfg三个配置文件中设置不一样clientPort和dataDir然后根据不同的配置文件来启动Zookeeper服务。 备注本部分是在standlone已经完成安装的基础上进行的。
创建并生成各自的配置文件
配置各个zk节点的配置文件具体如下
hadoopmaster:~/opt/app/zookeeper/conf$ pwd
/home/hadoop/opt/app/zookeeper/conf
hadoopmaster:~/opt/app/zookeeper/conf$ cp zoo.cfg zoo1.cfg
hadoopmaster:~/opt/app/zookeeper/conf$ cp zoo.cfg zoo2.cfg
hadoopmaster:~/opt/app/zookeeper/conf$ cp zoo.cfg zoo3.cfg分布修改这三个配置文件
zoo1.cfg 配置文件
# dataDir/tmp/zookeeper 注释掉这句默认配置然后修改下面的配置
dataDir/home/hadoop/opt/app/zookeeper/data1# clientPort2181 注释掉15行这句话把这句内容放在文件尾部
clientPort2181
# server.1master:2888(数据同步端口):3888(Leader选举端口)
server.1master:2888:3888
server.2master:2889:3889
server.3master:2890:3890zoo2.cfg 配置文件
# dataDir/tmp/zookeeper 注释掉这句默认配置然后修改下面的配置
dataDir/home/hadoop/opt/app/zookeeper/data2# clientPort2181 注释掉15行这句话把这句内容放在文件尾部
clientPort2182
# server.1master:2888(数据同步端口):3888(Leader选举端口)
server.1master:2888:3888
server.2master:2889:3889
server.3master:2890:3890zoo3.cfg 配置文件
# dataDir/tmp/zookeeper 注释掉这句默认配置然后修改下面的配置
dataDir/home/hadoop/opt/app/zookeeper/data3# clientPort2183 注释掉15行这句话把这句内容放在文件尾部
clientPort2183
# server.1master:2888(数据同步端口):3888(Leader选举端口)
server.1master:2888:3888
server.2master:2889:3889
server.3master:2890:3890server.AB:C:D中A是一个数字表示这个是第几号服务器B是这个服务器的IP地址C表示这个服务器与集群中的Leader服务器交换信息的端口D表示集群中的Leader服务器挂了需要一个端口来重新进行选举选出一个新的Leader而这个端口就是用来执行选举时服务器相互通信的端口。对于伪分布集群的配置方式由于B都是一样需要为不同的Zookeeper服务通信端口分配不同的端口号。
在各个data目录下创建myid文件并存入当前服务器的编号如下
hadoopmaster:~/opt/app/zookeeper$ pwd
/home/hadoop/opt/app/zookeeper
hadoopmaster:~/opt/app/zookeeper$ touch data1/myid
hadoopmaster:~/opt/app/zookeeper$ touch data2/myid
hadoopmaster:~/opt/app/zookeeper$ touch data3/myidhadoopmaster:~/opt/app/zookeeper$ echo 1 data1/myid
hadoopmaster:~/opt/app/zookeeper$ echo 2 data2/myid
hadoopmaster:~/opt/app/zookeeper$ echo 3 data3/myid
启动并测试Zookeeper伪分布式集群
依次启动Zookeeper服务在启动的时候选举算法依次投票那么Leader 服务就是2号配置文件启动的服务。其他的节点服务都是Fllower当启动第一台服务器的时候查看状态status是不可用的因为集群中节点未在半数以上。集群中奇数和偶数对故障的容忍度是一致的所以建议配置奇数个Zookeeper节点。
启动zkServer.sh并指定配置文件为zoo1.cfg
hadoopmaster:~/opt/app/zookeeper$ zkServer.sh start /home/hadoop/opt/app/zookeeper/conf/zoo1.cfg # 通过zoo1.cfg启动zkServer
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/app/zookeeper/conf/zoo1.cfg
Starting zookeeper ... STARTED
hadoopmaster:~/opt/app/zookeeper$ zkServer.sh status /home/hadoop/opt/app/zookeeper/conf/zoo1.cfg # 查看通过zoo1.cfg启动的zkServer状态
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/app/zookeeper/conf/zoo1.cfg
Client port found: 2181. Client address: localhost.
Error contacting service. It is probably not running.启动zkServer.sh并指定配置文件为zoo2.cfg hadoopmaster:~/opt/app/zookeeper$ zkServer.sh start /home/hadoop/opt/app/zookeeper/conf/zoo2.cfg # 通过zoo2.cfg启动zkServer
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/app/zookeeper/conf/zoo2.cfg
Starting zookeeper ... STARTED
hadoopmaster:~/opt/app/zookeeper$ zkServer.sh status /home/hadoop/opt/app/zookeeper/conf/zoo2.cfg # 查看通过zoo2.cfg启动的zkServer状态为leader
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/app/zookeeper/conf/zoo2.cfg
Client port found: 2182. Client address: localhost.
Mode: leader启动zkServer.sh并指定配置文件为zoo3.cfg
hadoopmaster:~/opt/app/zookeeper$ zkServer.sh start /home/hadoop/opt/app/zookeeper/conf/zoo3.cfg # 通过zoo3.cfg启动zkServer
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/app/zookeeper/conf/zoo3.cfg
Starting zookeeper ... STARTED
hadoopmaster:~/opt/app/zookeeper$ zkServer.sh status /home/hadoop/opt/app/zookeeper/conf/zoo3.cfg # 查看通过zoo3.cfg启动的zkServer状态
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/app/zookeeper/conf/zoo3.cfg
Client port found: 2183. Client address: localhost.
Mode: follower
目前看到zoo2.cfg的进程为leader节点。 如下图
此时使用命令jps查看所有进程:
hadoopmaster:~/opt/app/zookeeper$ jps
4833 QuorumPeerMain
5060 Jps
4726 QuorumPeerMain
4607 QuorumPeerMain客户端连接Zookeeper服务节点则使用如下命令
hadoopmaster:~/opt/app/zookeeper$ zkCli.sh -server localhost:2181Connecting to localhost:2181
#退出使用quitcentos安装Zookeeper3.7.1
这里采用的centos7.6环境的基本配置为
hostname 为node1
用户名为root
静态IP为 192.168.100.3
网关为 192.168.100.2
防火墙已经关闭
/etc/hosts已经配置全版本下载地址 https://archive.apache.org/dist/zookeeper/ 这里我选择3.7.1这个版本 https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/
下载到本地后将apache-zookeeper-3.7.1-bin.tar.gz上传到ubuntu18.04的/home/hadoop/opt/app目录下 该目录下的目录作用如下
bin目录 框架启动停止客户端和服务端的
conf 配置文件信息
docs文档
lib 配置文档的依赖基于centos7.6伪分布模式安装
centos7.6安装zookeeper的过程与ubuntu安装zookeeper的过程完全一致。下面提供具体过程。
上传解压修改文件名
上传apache-zookeeper-3.7.1-bin.tar.gz 到/opt/software目录下并对压缩包进行解压
[rootnode1 ~]# cd /opt/software/
# 解压缩
[rootnode1 ~]# tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz# 修改文件名
[rootnode1 ~]# mv apache-zookeeper-3.7.1-bin zookeeper
# 创建zkdata目录
[rootnode1 ~]# cd /opt/software/zookeeper
[rootnode1 ~]# mkdir zkdata复制zookeeper安装目录
复制zookeeper目录到/opt/module目录下并复制3份命名为001-003
cd /opt/software
cp -r zookeeper /opt/module/zookeeper001
cp -r zookeeper /opt/module/zookeeper002
cp -r zookeeper /opt/module/zookeeper003
创建并配置zoo.cfg配置文件
修改zookeeper001配置文件
首先把zookeeper001/conf下的的zoo_sample.cfg文件复制为zoo.cfg
cd /opt/module/zookeeper001/conf
cp zoo_sample.cfg zoo.cfg修改zoo.cfg配置文件
vim zoo.cfg修改配置如下
# 第1步设置数据持久化目录
dataDir/opt/module/zookeeper001/zkdata
# 设置客户端连接当前ZooKeeper服务使用的端口号
clientPort2181
# 设置ZooKeeper集群中每个ZooKeeper服务的地址及端口号
server.1node1:2888:3888
server.2node1:2889:3889
server.3node1:2890:3890
在zookeeper001/zkdata下创建myid文件内容为1
echo 1 /opt/module/zookeeper001/zkdata/myid修改zookeeper002配置文件
首先把zookeeper002/conf下的的zoo_sample.cfg文件复制为zoo.cfg
cd /opt/module/zookeeper002/conf
cp zoo_sample.cfg zoo.cfg修改zoo.cfg配置文件
vim zoo.cfg修改配置如下
# 第1步设置数据持久化目录
dataDir/opt/module/zookeeper002/zkdata
# 设置客户端连接当前ZooKeeper服务使用的端口号
clientPort2182
# 设置ZooKeeper集群中每个ZooKeeper服务的地址及端口号
server.1node1:2888:3888
server.2node1:2889:3889
server.3node1:2890:3890
在zookeeper002/zkdata下创建myid文件内容为2
echo 2 /opt/module/zookeeper002/zkdata/myid修改zookeeper003配置文件
首先把zookeeper003/conf下的的zoo_sample.cfg文件复制为zoo.cfg
cd /opt/module/zookeeper003/conf
cp zoo_sample.cfg zoo.cfg修改zoo.cfg配置文件
vim zoo.cfg修改配置如下
# 第1步设置数据持久化目录
dataDir/opt/module/zookeeper003/zkdata
# 设置客户端连接当前ZooKeeper服务使用的端口号
clientPort2183
# 设置ZooKeeper集群中每个ZooKeeper服务的地址及端口号
server.1node1:2888:3888
server.2node1:2889:3889
server.3node1:2890:3890
在zookeeper003/zkdata下创建myid文件内容为1
echo 3 /opt/module/zookeeper001/zkdata/myid启动并测试Zookeeper伪分布式集群
依次启动Zookeeper服务在启动的时候选举算法依次投票那么Leader 服务就是2号配置文件启动的服务。其他的节点服务都是Fllower当启动第一台服务器的时候查看状态status是不可用的因为集群中节点未在半数以上。集群中奇数和偶数对故障的容忍度是一致的所以建议配置奇数个Zookeeper节点。
启动zookeeper001下的zkServer.sh
[rootnode1 module]# cd /opt/module/
[rootnode1 module]# ./zookeeper001/bin/zkServer.sh start # 启动zkServer输出为
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper001/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED查看zkServer状态 [rootnode1 module]# ./zookeeper001/bin/zkServer.sh status # 查看zkServer状态输出为
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper001/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Error contacting service. It is probably not running.启动zookeeper002下的zkServer.sh
[rootnode1 module]# cd /opt/module/
[rootnode1 module]# ./zookeeper002/bin/zkServer.sh start # 启动zkServer输出为
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper002/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED查看zkServer状态 [rootnode1 module]# ./zookeeper002/bin/zkServer.sh status # 查看zkServer状态输出为
Using config: /opt/module/zookeeper002/bin/../conf/zoo.cfg
Client port found: 2182. Client address: localhost. Client SSL: false.
Mode: leader启动zookeeper003下的zkServer.sh
[rootnode1 module]# cd /opt/module/
[rootnode1 module]# ./zookeeper003/bin/zkServer.sh start # 启动zkServer输出为
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper003/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED查看zkServer状态 [rootnode1 module]# ./zookeeper003/bin/zkServer.sh status # 查看zkServer状态输出为
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper003/bin/../conf/zoo.cfg
Client port found: 2183. Client address: localhost. Client SSL: false.
Mode: follower启动后myid值为2的zookeeper002下的称为了leader。
课程2-数据导入与预处理-数据变换
主要是对数据进行规范化的操作将数据转换成“适当的”格式以适用于挖掘任务及算法的需要。
5.1数据变换方法
数据变换的常见处理方式包括 数据标准化处理 数据离散化处理 数据泛化处理 在对数据进行分析或挖掘之前数据必须满足一定的条件: 比如方差分析时要求数据具有正态性、方差齐性、独立性、无偏性需进行诸如平方根、对数、平方根反正弦操作实现从一种形式到另一种“适当”形式的变换以适用于分析或挖掘的需求这一过程就是数据变换。 数据变换主要是从数据中找到特征表示通过一些转换方法减少有效变量的数目或找到数据的不变式常见的操作可以分为数据标准化处理、数据离散化处理和数据泛化处理三类。
数据标准化处理
数据标准化处理是将数据按照一定的比例缩放使之投射到一个比较小的特定区间。 最小-最大标准化(规范化) 最小-最大规范化也称为离差标准化是对原始数据的线性变换使结果值映射到[0,1]之间。 转换函数如 其中 max为样本数据的最大值min为样本数据的最小值。max-min为极差。 以一个例子说明标准化的计算过程。
均值标准化(规范化) 零-均值规范化:也叫标准差标准化经过处理的数据的平均数为0标准差为1。转化函数为 其中 x ‾ \overline{x} x为原始数据的均值 σ \sigma σ为原始数据的标准差。
小数定标标准化(规范化) 小数定标规范化:通过移动属性值的小数位数将属性值映射到[-11]之间移动的小数位数取决于属性值绝对值的最大值。转化函数为移动数据的小数点使数据映射到[-1,1]。 转换函数如下 x ∗ x 1 0 k x^{\ast }\dfrac{x}{10^{k}} x∗10kx
数据离散化处理
一些数据挖掘算法特别是某些分类算法要求数据是分类属性形式如ID3算法、Apriori算法等。这样常常需要将连续属性变换成分类属性即连续属性离散化。 数据离散化处理一般是在数据的取值范围内设定若干个离散的划分点将取值范围划分为若干离散化的区间分别用不同的符号或整数值代表落在每个子区间的数值。 连续属性变换成分类属性涉及两个子任务决定需要多少个分类变量以及确定如何将连续属性值映射到这些分类值。
等宽法 等宽法将属性的值域从最小值到最大值划分成具有相同宽度的区间具体划分多少个区间由数据本身的特点决定或者由具有业务经验的用户指定 等频法 等频法将相同数量的值划分到每个区间保证每个区间的数量基本一致。 等宽法和等频法虽然简单但是都需要人为地规定划分区间的个数。等宽法会不均匀地将属性值分到各个区间导致有些区间包含较多数据有些区间包含较少数据不利于挖掘后期决策模型的建立。
数据泛化处理分层
数据泛化处理指用高层次概念取代低层次概念的数据。例如年龄是一个低层次的概念它经过泛化处理后会变成诸如青年、中年等高层次的概念。
5.4 轴向旋转
掌握pivot()和melt()方法的用法可以熟练地使用这些方法实现轴向旋转操作
pivot方法
pivot()方法用于将DataFrame类对象的某一列数据转换为列索引也叫透视方法。官网中对pivot()函数的描述如下 Reshape data (produce a “pivot” table) based on column values. Uses unique values from specified index / columns to form axes of the resulting DataFrame. This function does not support data aggregation, multiple values will result in a MultiIndex in the columns. 基于列值重塑数据(生成一个“透视”表)。使用来自指定索引/列的唯一值来形成结果DataFrame的轴。此函数不支持数据聚合多个值将导致列中的MultiIndex。 pivot()函数如下
DataFrame.pivot(indexNone, columnsNone, valuesNone)index表示新生成对象的行索引若未指定说明使用现有对象的行索引。 columns表示新生成对象的列索引。 values 表示填充新生成对象的值。 要想了解pivot()函数可以先了解下pivot_table()函数。pivot_table()函数是pivot()函数的泛化pivot_table函数允许值的聚合。 pivot_table透视的过程如下图
假设某商店记录了5月和6月活动期间不同品牌手机的促销价格保存到以日期、商品名称、价格为列标题的表格中若对该表格的商品名称列进行轴向旋转操作即将商品名称一列的唯一值变换成列索引将出售日期一列的唯一值变换成行索引。 示例代码如下
构建DataFrame:
import pandas as pd
df_obj pd.DataFrame({商品名称: [荣耀9X,小米6x,OPPO A1,荣耀9X,小米6x,OPPO A1],出售日期: [5月25日, 5月25日,5月25日,6月18日,6月18日, 6月18日],价格(元): [999, 1399, 1399, 800, 1200, 1250]})
df_obj输出为 将出售日期一列的唯一数据变换为行索引商品一列的唯一数据变换为列索引
# 将出售日期一列的唯一数据变换为行索引商品一列的唯一数据变换为列索引
new_df df_obj.pivot(index出售日期, columns商品名称,values价格(元))
new_df输出为
melt方法
melt()是pivot()的逆操作方法用于将DataFrame类对象的列索引转换为一行数据。
DataFrame.melt(id_varsNone, value_varsNone, var_nameNone, value_namevalue, col_levelNone, ignore_indexTrue)id_vars表示无需被转换的列索引。 value_vars表示待转换的列索引若剩余列都需要转换则忽略此参数。 var_name表示自定义的列索引。 value_name表示自定义的数据所在列的索引。 ignore_index表示是否忽略索引默认为True。 示例代码如下 查看初始数据
new_df输出为 # 将列索引转换为一行数据:
# 将列索引转换为一行数据
new_df.melt(value_name价格(元), ignore_indexFalse)输出为
5.3 分组与聚合
分组与聚合是常见的数据变换操作 分组指根据分组条件一个或多个键将原数据拆分为若干个组 聚合指任何能从分组数据生成标量值的变换过程这一过程中主要对各分组应用同一操作并把操作后所得的结果整合到一起生成一组新数据。 下面通过一个例子说明分组聚合的过程
掌握分组与聚合的过程可以熟练地groupby()、agg()、transfrom()和apply()方法实现分组与聚合操作
分组操作groupby()5.3.3
分组操作
pandas中使用groupby()方法根据键将原数据拆分为若干个分组。
groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keysTrue, squeezeobject object, observedFalse, dropnaTrue)by表示分组的条件可以取值为字符串、列表、字典或Series、函数等。 axis表示分组操作的轴编号可以是0或1。该参数的默认值为0代表沿列方向操作。 level表示标签索引所在的级别默认为None。 as_index表示聚合后新数据的索引是否为分组标签的索引默认为True。 sort表示是否对分组索引进行排序默认为True。 group_keys表示是否显示分组标签的名称默认为True。 使用pandas的groupby()方法拆分数据后会返回一个GroupBy类的对象该对象是一个可迭代对象它里面包含了每个分组的具体信息但无法直接被显示。 DataFrameGroupBy和SeriesGroupBy都是GroupBy的子类。 若DataFrame类对象调用groupby()方法会返回一个DataFrameGroupBy类的对象。 若Series类对象调用groupby()方法会返回一个SeriesGroupBy类的对象。
分组操作案例 分组初始化
# 分组初始化
import pandas as pd
df_obj pd.DataFrame({key:[C, B, C, A, B, B, A, C, A], data:[2, 4, 6, 8, 10, 1, 3, 5, 7]})
# 根据key列对df_obj进行分组
groupby_obj df_obj.groupby(bykey)
groupby_obj输出为
GroupBy对象不可查看可以遍历过去其中数据 遍历DataFrameGroupBy类的对象
# 遍历DataFrameGroupBy类的对象
for group in groupby_obj: print(group)print(-*10)输出为 通过列表生成器 获取DataFrameGroupBy的数据
# 通过列表生成器 获取DataFrameGroupBy的数据
result dict([x for x in groupby_obj])[A] # 字典中包含多个DataFrame
result输出为 通过groups获取内容
# 查看全部分组内容
df_obj.groupby([key]).groups输出为 查看指定分组内容
# 查看指定分组内容
df_obj.groupby([key]).get_group((A))输出为
分组内置聚合
分组自定义聚合
# 分组自定义聚合
import pandas as pd
df_obj pd.DataFrame({key:[C, B, C, A, B, B, A, C, A], data:[2, 4, 6, 8, 10, 1, 3, 5, 7]})
print(df_obj)
df_obj[[key,data]].groupby(bykey).max()输出为 分组内置聚合取消分组键做索引
# 取消索引 按照上一题要求进行分组但不使用 key 做为索引
df_obj[[key,data]].groupby(bykey, as_indexFalse).max()输出为 分组内置函数排序
# 排序 分组 聚合后 排序
df_obj[[key,data]].groupby(bykey).max().sort_values(data,ascendingFalse)输出为 分组内置函数频率统计
# 频率 计算不同key不同data出现的次数
pd.DataFrame(df_obj.groupby(key)[data].value_counts())输出为
聚合操作 5.3.4
pandas中可通过多种方式实现聚合操作除前面介绍过的内置统计方法之外还包括agg()、transfrom()和apply()方法。 初始化聚合所需的DF
# 初始化分组DF
import pandas as pd
df_obj pd.DataFrame({a: [0, 6, 12, 18, 24, 30],b: [1, 7, 13, 19, 25, 31],c: [1, 8, 14, 20, 26, 32],d: [2, 9, 15, 21, 27, 33],e: [2, 10, 16, 22, 28, 34],f: [2, 2, 2, 3, 3, 2]})
df_obj输出为 查看DF的值
# 根据列表对df_obj进行分组列表中相同元素对应的行会归为一组
groupby_obj df_obj.groupby(by[A, A, B, B, A, B])
# groupby_obj.groups
print(dict([x for x in groupby_obj]))
print(-*10)for (key,value) in dict([x for x in groupby_obj]).items():print(key)print(value)输出为
agg()方法
agg()方法既接收内置统计方法又接收自定义函数甚至可以同时运用多个方法或函数或给各列分配不同的方法或函数能够对分组应用灵活的聚合操作。
传入自定义函数
for (key,value) in dict([x for x in groupby_obj]).items():print(key)print(value)
# 定义求极差的函数
def my_range(arr):return arr.max()-arr.min()
groupby_obj.agg(my_range) # 使用agg()方法聚合分组数据输出为 指定列聚合
# 使用agg()方法聚合分组中指定列的数据
groupby_obj.agg({a:max, c:sum, e: my_range})输出为
在使用agg方法中还经常使用重置索引重命名的方式
# 初始化分组DF
import pandas as pd
df_obj pd.DataFrame({a: [0, 1, 2, 3, 4, 5],b: [1, 7, 13, 19, 25, 31],c: [1, 8, 14, 20, 26, 32],d: [2, 9, 15, 21, 27, 33],e: [2, 10, 16, 22, 28, 34],f: [2, 2, 2, 3, 3, 2]})
print(df_obj)df_obj.groupby(byf).agg({a:count})输出为
会发现经过agg聚合后分组键做了索引聚合之后的a列的列名为a这个列名会与原有的列名冲突换成a_count比较合适方法如下
df_obj.groupby(byf).agg({a:count}).reset_index().rename(columns{a: a_count})输出为
transfrom()方法
transfrom()方法能对分组应用灵活的运算操作同时可使聚合前与聚合后的数据结构保持一致。
初始化DF
# 初始化分组DF
import pandas as pd
df_obj pd.DataFrame({a: [0, 6, 12, 18, 24, 30],b: [1, 7, 13, 19, 25, 31],c: [1, 8, 14, 20, 26, 32],d: [2, 9, 15, 21, 27, 33],e: [2, 10, 16, 22, 28, 34],f: [2, 2, 2, 3, 3, 2]})
df_obj输出为
基于transform求最大值
df_obj[a_max] df_obj[[a,f]].groupby(by[f]).transform(max)
df_obj输出为 如果不提前选取列会生成同等结果的返回结果
del df_obj[a_max]
df_obj.groupby(by[f]).transform(max)输出如下
apply()方法
apply()方法既能直接接收内置方法又可以接收自定义的函数。 与前几种聚合方式相比使用apply()方法聚合数据的操作更灵活它可以代替前两种聚合完成基础操作另外也可以解决一些特殊聚合操作。
apply(func, *args, **kwargs)func表示应用于各分组的函数或方法。 *args和**kwargs 表示传递给func的位置参数或关键字参数。 案例如下
# 初始化分组DF
import pandas as pd
df_obj pd.DataFrame({a: [0, 6, 12, 18, 24, 30],b: [1, 7, 13, 19, 25, 31],c: [1, 8, 14, 20, 26, 32],d: [2, 9, 15, 21, 27, 33],e: [2, 10, 16, 22, 28, 34],f: [2, 2, 2, 3, 3, 2]})
print(df_obj)
# 自定义函数用于计算每个数据除以10的余数
def div_hun(df):return df.iloc[:, :] % 10
df_obj.groupby(by[f]).apply(div_hun)输出为
filter()方法
通过filter也可过滤分组后的数据
# 初始化分组DF
import pandas as pd
df_obj pd.DataFrame({a: [0, 6, 12, 18, 24, 30],b: [1, 7, 13, 19, 25, 31],c: [1, 8, 14, 20, 26, 32],d: [2, 9, 15, 21, 27, 33],e: [2, 10, 16, 22, 28, 34],f: [2, 2, 2, 3, 3, 2]})print(df_obj)
df_obj.groupby(f).filter(lambda x: x[a].max() 26)输出为
哑变量与面元切分
哑变量处理5.5.1
在数据分析或挖掘中一些算法模型要求输入以数值类型表示的特征但代表特征的数据不一定都是数值类型的其中一部分是类别型的例如受教育程度表示方式有大学、研究生、博士等类别这些类别均为非数值类型的数据。为了将类别类型的数据转换为数值类型的数据类别类型的数据在被应用之前需要经过“量化”处理从而转换为哑变量。
什么是哑变量 哑变量又称虚拟变量、名义变量等它是人为虚设的变量用来反映某个变量的不同类别常用的取值为0和1。需要说明的是0和1并不代表数量的多少而代表不同的类别。 假设变量“职业”有司机、学生、导游、工人、教师共5个类别这5个类别分别有0和1两种取值0代表非此种类别1代表此种类别。
实现哑变量的方法 pandas中使用get_dummies()函数对类别数据进行哑变量处理并在处理后返回一个哑变量矩阵。
get_dummies(data, prefixNone, prefix_sep_, dummy_naFalse,columnsNone, sparseFalse, drop_firstFalse, dtypeNone)data表示待处理的类别数据可以是数组、DataFrame类或Series类对象。 prefix表示列索引名称的前缀默认为None。 prefix_sep表示附加前缀的分隔符默认为“_”。 columns表示哑变量处理的列索引名称默认为None。 初始化数据
# 初始化DF
import pandas as pd
position_df pd.DataFrame({职业: [工人, 学生, 司机, 教师, 导游]})
position_df输出为
哑变量处理, 并给哑变量添加前缀
# 哑变量处理, 并给哑变量添加前缀
result pd.get_dummies(position_df, prefix[col])
result输出为
面元划分(5.5.2 )
掌握cut()函数的用法可以熟练地使用过该函数实现面元划分操作 面元划分是指数据被离散化处理按一定的映射关系划分为相应的面元可以理解为区间只适用于连续数据。连续数据又称连续变量指在一定区间内可以任意取值的数据该类型数据的特点是数值连续不断相邻两个数值可作无限分割。
pandas中使用cut()函数能够实现面元划分操作cut()函数会采用等宽法对连续型数据进行离散化处理。
cut(x, bins, rightTrue, labelsNone, retbinsFalse, precision3, include_lowestFalse, duplicatesraise, orderedTrue)x表示面元划分的连续数据可以取值为一维数组或Series类对象。 bins表示划分面元的依据。 right表示右端点是否为闭区间默认为True。 precision表示区间标签的精度默认为3。 include_lowest表示是否包含区间的左端点默认为False。 cut()函数会返回一个Categorical类对象该对象可以被看作一个包含若干个面元名称的数组通过categories属性可以获取所有的分类即每个数据对应的面元。 案例如下
import pandas as pd
ages pd.Series([19, 21, 25, 55, 30, 45, 52, 46, 20])
bins [0, 18, 30, 40, 50, 100]
# 使用cut函数划分年龄区间
cuts pd.cut(ages, bins)
cuts输出为
Pandas与SQL对比
参考文档如下
pandas vs sql 基本操作对比
SQL、Pandas、Spark窗口函数的3种实现
一场pandas与SQL的巅峰大战
Pandas 与 SQL 常用操作对比
SQL中的窗口函数