week08 zookeeper多种安装与pandas数据变换操作-new
课程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模式安装
解压缩与配置软连接
hadoop@master:~$ cd /home/hadoop/opt/app/
# 解压缩
hadoop@master:~/opt/app$ tar -zxf apache-zookeeper-3.7.1-bin.tar.gz
查看当前目录结构:
hadoop@master:~/opt/app$ pwd # 查看当前目录
/home/hadoop/opt/app
hadoop@master:~/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的软连接
# 软连接
hadoop@master:~/opt/app$ ln -s apache-zookeeper-3.7.1-bin zookeeper
创建存储目录与修改zoo.cfg文件
切换到~/opt/app/zookeeper,配置zookeeper的数据存储-data0目录
hadoop@master:~/opt/app$ cd zookeeper # 切换到zookeeper中
hadoop@master:~/opt/app/zookeeper$ ls
bin conf docs lib LICENSE.txt NOTICE.txt README.md README_packaging.txt
hadoop@master:~/opt/app/zookeeper$ mkdir data0 # 创建data0
hadoop@master:~/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,
hadoop@master:~/opt/app/zookeeper$ cd conf/
hadoop@master:~/opt/app/zookeeper/conf$ ls
configuration.xsl log4j.properties zoo_sample.cfg
hadoop@master:~/opt/app/zookeeper/conf$ cp zoo_sample.cfg zoo.cfg #复制zoo.cfg
编辑zoo.cfg
hadoop@master:~/opt/app/zookeeper/conf$ vi zoo.cfg # 编辑zoo.cfg文件,编辑内容如下:
# dataDir=/tmp/zookeeper 注释掉这句默认配置,然后添加下面的配置
dataDir=/home/hadoop/opt/app/zookeeper/data0# 在配置文件的最后面添加
server.1=master:2888:3888
# 如果是单节点的zookeeper集群部署可以配置多个server
#server.2=master:2889:3889
#server.3=master:2890:3890
配置zookeeper的环境变量
hadoop@master:~/opt/app/zookeeper/conf$ vi ~/.bashrc
#这一步会打开bashrc文件,编辑内容如下:
export ZOOKEEPER_HOME=/home/hadoop/opt/app/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATHhadoop@master:~/opt/app/zookeeper/conf$ source ~/.bashrc # 生效环境变量
启动与查看zk服务端(单机版本)
启动zk服务端(单机版本)
查看zk启动状态
hadoop@master:~/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
hadoop@master:~/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启动状态
hadoop@master:~/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客户端
hadoop@master:~/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 serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host: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:ZooKeeper@1422] - Session: 0x1000029eae60000 closed
2021-11-12 11:05:29,497 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@524] - EventThread shut down for session: 0x1000029eae60000
hadoop@master:~/opt/app/zookeeper/conf$
配置伪分布式的Zookeeper
本小节的伪分布式集群部署是指在一台机器(master)上配置多个配置文件(zoo1.cfg,zoo2.cfg,zoo3.cfg),三个配置文件中设置不一样clientPort和dataDir,然后根据不同的配置文件来启动Zookeeper服务。
备注:本部分是在standlone已经完成安装的基础上进行的。
创建并生成各自的配置文件:
配置各个zk节点的配置文件,具体如下:
hadoop@master:~/opt/app/zookeeper/conf$ pwd
/home/hadoop/opt/app/zookeeper/conf
hadoop@master:~/opt/app/zookeeper/conf$ cp zoo.cfg zoo1.cfg
hadoop@master:~/opt/app/zookeeper/conf$ cp zoo.cfg zoo2.cfg
hadoop@master:~/opt/app/zookeeper/conf$ cp zoo.cfg zoo3.cfg
分布修改这三个配置文件:
zoo1.cfg 配置文件
# dataDir=/tmp/zookeeper 注释掉这句默认配置,然后修改下面的配置
dataDir=/home/hadoop/opt/app/zookeeper/data1# clientPort=2181 注释掉15行这句话,把这句内容放在文件尾部
clientPort=2181
# server.1=master:2888(数据同步端口):3888(Leader选举端口)
server.1=master:2888:3888
server.2=master:2889:3889
server.3=master:2890:3890
zoo2.cfg 配置文件
# dataDir=/tmp/zookeeper 注释掉这句默认配置,然后修改下面的配置
dataDir=/home/hadoop/opt/app/zookeeper/data2# clientPort=2181 注释掉15行这句话,把这句内容放在文件尾部
clientPort=2182
# server.1=master:2888(数据同步端口):3888(Leader选举端口)
server.1=master:2888:3888
server.2=master:2889:3889
server.3=master:2890:3890
zoo3.cfg 配置文件
# dataDir=/tmp/zookeeper 注释掉这句默认配置,然后修改下面的配置
dataDir=/home/hadoop/opt/app/zookeeper/data3# clientPort=2183 注释掉15行这句话,把这句内容放在文件尾部
clientPort=2183
# server.1=master:2888(数据同步端口):3888(Leader选举端口)
server.1=master:2888:3888
server.2=master:2889:3889
server.3=master:2890:3890
server.A=B:C:D中A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C表示这个服务器与集群中的Leader服务器交换信息的端口,D表示集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。对于伪分布集群的配置方式,由于B都是一样,需要为不同的Zookeeper服务通信端口分配不同的端口号。
在各个data目录下创建myid文件,并存入当前服务器的编号,如下:
hadoop@master:~/opt/app/zookeeper$ pwd
/home/hadoop/opt/app/zookeeper
hadoop@master:~/opt/app/zookeeper$ touch data1/myid
hadoop@master:~/opt/app/zookeeper$ touch data2/myid
hadoop@master:~/opt/app/zookeeper$ touch data3/myidhadoop@master:~/opt/app/zookeeper$ echo 1 > data1/myid
hadoop@master:~/opt/app/zookeeper$ echo 2 > data2/myid
hadoop@master:~/opt/app/zookeeper$ echo 3 > data3/myid
启动并测试Zookeeper伪分布式集群
依次启动Zookeeper服务,在启动的时候,选举算法依次投票,那么Leader
服务就是2号配置文件启动的服务。其他的节点服务都是Fllower,当启动第一台服务器的时候查看状态status是不可用的,因为集群中节点未在半数以上。集群中奇数和偶数对故障的容忍度是一致的,所以建议配置奇数个Zookeeper节点。
启动zkServer.sh并指定配置文件为zoo1.cfg
hadoop@master:~/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
hadoop@master:~/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
hadoop@master:~/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
hadoop@master:~/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
hadoop@master:~/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
hadoop@master:~/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查看所有进程:
hadoop@master:~/opt/app/zookeeper$ jps
4833 QuorumPeerMain
5060 Jps
4726 QuorumPeerMain
4607 QuorumPeerMain
客户端连接Zookeeper服务节点,则使用如下命令:
hadoop@master:~/opt/app/zookeeper$ zkCli.sh -server localhost:2181Connecting to localhost:2181
#退出使用quit
centos安装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目录下,并对压缩包进行解压
[root@node1 ~]# cd /opt/software/
# 解压缩
[root@node1 ~]# tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz# 修改文件名
[root@node1 ~]# mv apache-zookeeper-3.7.1-bin zookeeper
# 创建zkdata目录
[root@node1 ~]# cd /opt/software/zookeeper
[root@node1 ~]# 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服务使用的端口号
clientPort=2181
# 设置ZooKeeper集群中每个ZooKeeper服务的地址及端口号
server.1=node1:2888:3888
server.2=node1:2889:3889
server.3=node1: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服务使用的端口号
clientPort=2182
# 设置ZooKeeper集群中每个ZooKeeper服务的地址及端口号
server.1=node1:2888:3888
server.2=node1:2889:3889
server.3=node1: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服务使用的端口号
clientPort=2183
# 设置ZooKeeper集群中每个ZooKeeper服务的地址及端口号
server.1=node1:2888:3888
server.2=node1:2889:3889
server.3=node1:2890:3890
在zookeeper003/zkdata下创建myid文件,内容为1
echo 3 > /opt/module/zookeeper001/zkdata/myid
启动并测试Zookeeper伪分布式集群
依次启动Zookeeper服务,在启动的时候,选举算法依次投票,那么Leader
服务就是2号配置文件启动的服务。其他的节点服务都是Fllower,当启动第一台服务器的时候查看状态status是不可用的,因为集群中节点未在半数以上。集群中奇数和偶数对故障的容忍度是一致的,所以建议配置奇数个Zookeeper节点。
启动zookeeper001下的zkServer.sh
[root@node1 module]# cd /opt/module/
[root@node1 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状态
[root@node1 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
[root@node1 module]# cd /opt/module/
[root@node1 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状态
[root@node1 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
[root@node1 module]# cd /opt/module/
[root@node1 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状态
[root@node1 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 σ为原始数据的标准差。
小数定标标准化(规范化)
小数定标规范化:通过移动属性值的小数位数,将属性值映射到[-1,1]之间,移动的小数位数取决于属性值绝对值的最大值。转化函数为:移动数据的小数点,使数据映射到[-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(index=None, columns=None, values=None)
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_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)
id_vars:表示无需被转换的列索引。
value_vars:表示待转换的列索引,若剩余列都需要转换,则忽略此参数。
var_name:表示自定义的列索引。
value_name:表示自定义的数据所在列的索引。
ignore_index:表示是否忽略索引,默认为True。
示例代码如下:
查看初始数据
new_df
输出为:
# 将列索引转换为一行数据:
# 将列索引转换为一行数据
new_df.melt(value_name='价格(元)', ignore_index=False)
输出为:
5.3 分组与聚合
分组与聚合是常见的数据变换操作
分组指根据分组条件(一个或多个键)将原数据拆分为若干个组;
聚合指任何能从分组数据生成标量值的变换过程,这一过程中主要对各分组应用同一操作,并把操作后所得的结果整合到一起,生成一组新数据。
下面通过一个例子说明分组聚合的过程:
掌握分组与聚合的过程,可以熟练地groupby()、agg()、transfrom()和apply()方法实现分组与聚合操作
分组操作groupby()(5.3.3)
分组操作
pandas中使用groupby()方法根据键将原数据拆分为若干个分组。
groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=<object object>, observed=False, dropna=True)
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(by="key")
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(by="key").max()
输出为:
分组+内置聚合,取消分组键做索引
# 取消索引 按照上一题要求进行分组,但不使用 key 做为索引
df_obj[['key','data']].groupby(by="key", as_index=False).max()
输出为:
分组+内置函数+排序
# 排序 分组 聚合后 排序
df_obj[['key','data']].groupby(by="key").max().sort_values('data',ascending=False)
输出为:
分组+内置函数+频率统计
# 频率 计算不同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(by='f').agg({'a':'count'})
输出为:
会发现,经过agg聚合后,分组键做了索引,聚合之后的a列的列名为a,这个列名会与原有的列名冲突,换成a_count比较合适,方法如下:
df_obj.groupby(by='f').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, prefix=None, prefix_sep='_', dummy_na=False,columns=None, sparse=False, drop_first=False, dtype=None)
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, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)
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中的窗口函数
相关文章:
week08 zookeeper多种安装与pandas数据变换操作-new
课程1-hadoop-Zookeeper安装 Ububtu18.04安装Zookeeper3.7.1 环境与版本 这里采用的ubuntu18.04环境的基本配置为: hostname 为master 用户名为hadoop 静态IP为 192.168.100.3 网关为 192.168.100.2 防火墙已经关闭 /etc/hosts已经配置全版本下载地址࿱…...
js构造函数和原型对象,ES6中的class,四种继承方式
一、构造函数 1.构造函数是一种特殊的函数,主要用来初始化对象 2.使用场景 常见的{...}语法允许创建一个对象。可以通过构造函数来快速创建多个类似的对象。 const Peppa {name: 佩奇,age: 6,sex: 女}const George {name: 乔治,age: 3,sex: 男}const Mum {nam…...
电脑连接海康相机并在PictureBox和HWindowControl中分别显示。
展示结果: 下面附上界面中所有控件的Name,只需照着红字设置对应的控件Name即可 下面附上小编主界面的全部代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; …...
直播系统源码技术搭建部署流程及配置步骤
系统环境要求 PHP版本:5.6、7.3 Mysql版本:5.6,5.7需要关闭严格模式 Nginx:任何版本 Redis:需要给所有PHP版本安装Redis扩展,不需要设置Redis密码 最好使用面板安装:宝塔面板 - 简单好用的…...
Spring+ActiveMQ
1. 环境搭建 1.1 env-version JDK 1.8 Spring 2.7.13 Maven 3.6 ActiveMQ 5.15.2 1.2 docker-compose.yml version: 3.8services:activemq:image: rmohr/activemq:5.16.3container_name: activemqports:- "61616:61616"- "8161:8161"environment…...
Linux 常用命令总汇
查询所有wifi nmcli dev wifi list 链接wifi sudo nmcli dev wifi connect XXXX password XXXX 查询本机IP ifconfig 查询联网情况 ping www.baidu.com 进入.bash gedit ~/.bashrc sudo dpkg -i XXX.deb 安装超级终端 sudo apt install terminator 超级终端常用…...
fmql之Linux RTC
模拟i2c,连接rtc芯片。 dts: /{ // 根节点i2c_gpio: i2c-gpio {#address-cells <1>;#size-cells <0>;compatible "i2c-gpio";// MIO56-SDA, MIO55-SCL // 引脚编号gpios <&portc 2 0&portc 1 0 >;i2c-gp…...
Flask-SocketIO 简单示例
用于服务端和客户端通信,服务端主动给客户端发送消息 前提: 确保安装了socket库: pip install flask-socketio python-socketio服务端代码 from flask import Flask from flask_socketio import SocketIO import threading import timeap…...
Vue 3 的组件式开发(2)
1 Vue 3 组件的插槽 插槽(Slot)是Vue组件中的一个重要概念,它允许父组件向子组件中插入HTML结构或其他组件,从而实现内容的自定义和复用。以下是对Vue 3组件插槽的详细讲解: 1.1 插槽的基本概念 插槽可以被视为子组…...
python 爬虫 入门 四、线程,进程,协程
目录 一、进程 特征: 使用: 初始代码 进程改装代码 二、线程 特征: 使用: 三、协程 后续:五、抓取图片、视频 线程和进程大部分人估计都知道,但协程就不一定了。 一、进程 进程是操作系统分配资…...
cloak斗篷伪装下的独立站
随着互联网的不断进步,越来越多的跨境电商卖家开始认识到独立站的重要性,并纷纷建立自己的独立站点。对于那些有志于进入这一领域的卖家来说,独立站是什么呢?独立站是指个人或小型团队自行搭建和运营的网站。 独立站能够帮助跨境…...
【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机
【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机 1、Mac OS X 端2、PVE 端(Debian Linux) 1、Mac OS X 端 (1)安装 wakeonlan 工具 brew install wakeonlan(2)唤醒 PVE 命令 …...
u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法
我们在u盘安装原版win10 iso镜像时,发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”,直接导致了无法继续安装下去。出现这种情况要怎么解决呢?下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…...
Linux系统之dc计算器工具的基本使用
Linux系统之dc计算器工具的基本使用 一、DC工具介绍二、dc命令的基本用法2.1 dc命令的help帮助信息2.2 dc命令基本用法2.3 dc命令常用操作符 三、dc命令的基本使用3.1dc命令的用法步骤3.2 简单数学计算3.3 通过文件来计算3.4 使用--expression计算3.5 使用dc命令进行高精度计算…...
使用Python计算相对强弱指数(RSI)进阶
使用Python计算相对强弱指数(RSI)进阶 废话不多说,直接上主题:> 代码实现 以下是实现RSI计算的完整代码: # 创建一个DataFramedata {DATE: date_list, # 日期CLOSE: close_px_list, # 收盘价格 }df pd.DataF…...
vue 解决:npm ERR! code ERESOLVE 及 npm ERR! ERESOLVE could not resolve 的方案
1、问题描述: 其一、需求为: 想要安装项目所需依赖,成功运行 vue 项目,想要在浏览器中能成功访问项目地址 其二、问题描述为: 在 package.json 文件打开终端平台,通过执行 npm install 命令,…...
Android 原生开发与Harmony原生开发浅析
Android系统 基于Linux ,架构如下 底层 (Linux )> Native ( C层) > FrameWork层 (SystemService) > 系统应用 (闹钟/日历等) 从Android发版1.0开始到现在15,经历了大大小小的变革 从Android6.0以下是个分水岭,6.0之前权限都是直接卸载Manifest中配置 6.0开始 则分普…...
VIVO售后真好:屏幕绿线,4年免费换屏
只要亮屏就有。这也太影响使用了。 本来想换趁机换手机,看了VIVO发布的X200,决定等明年的X200 ULTRA。手头这个就准备修。 查了一下价格,换屏1600,优惠1100。咸鱼上X70 PRO也就800。能不能简单维修就解决呢?于是联系…...
数据类型【MySQL】
文章目录 建立表查看表删除表数据类型floatcharvarcharchar&&varchar 时间日期类型enum和setenum和set查找 建立表 mysql> create table if not exists user1(-> id int ,-> name varchar (20) comment 用户名 ,-> password char (32) comment 用户名的…...
流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(二)
继续上篇介绍,本篇介绍一下封装RTP的数据格式,如何将摄像头采集的码流,音频的码流,封装到rtp里,传输。 有自己私有协议例子,有rtp协议,参考代码。注意不是rtsp协议。 一、私有协议 玩过tcp协议…...
在 Kakarot ZkEVM 上使用 Starknet Scaffold 构建应用
Starknet 和 EVM 我们所知的智能合约世界一直围绕着以太坊虚拟机(EVM),其主要语言是 Solidity。 尽管 Starknet 通过 STARKs 为以太坊开辟了新的可能性,但其缺点是它有一个不同的虚拟机 (CairoVM),这要求开发者学习 …...
DBeave如何连接达梦数据库,设置达梦驱动,真酷
前言 我们在使用DBeaver连接数据库时,默认可以连接常用的数据库,如mysql数据库,postgresql数据库,oracle数据库。但是,我们的国产数据库达梦数据库,默认在IDEA里面没有驱动,所以还得配置一下才…...
2024年全球 MoonBit 编程创新赛-零基础早鸟教程-使用wasm4八小时开发井子棋小游戏
前言 本篇文章主要分享 “2024年全球 MoonBit 编程创新赛 游戏赛道”参赛过程中九宫棋游戏的开发技巧和心得。以此抛砖引玉。首先介绍下 MoonBit。 月兔语言 MoonBit 是一个用于云计算和边缘计算的 WebAssembly 端到端的编程语言工具链。 您可以访问 https://try.moonbitlang.…...
机器学习4
第3章 线性模型 3.1 线性模型的基本形式 3.1.1 线性模型的核心公式 线性模型通过属性的线性组合进行预测,其核心公式为: [ f(x) \omega_1 X_1 \omega_2 X_2 … \omega_d X_d b ] 其中: ω 1 , ω 2 , . . . , ω d \omega_1, \omega_…...
Python数值计算(33)——simpson 3/8积分公式
1. 背景知识 既然前的Simpson可以通过使用三个点构造二次曲线近似积分,那么,如果点数增加到了4个,然后不就可以构造三次多项式的曲线,实现对目标值的积分吗? 如果采用和上一节介绍的同样的方法,我们可以推…...
<项目代码>YOLOv8路面垃圾识别<目标检测>
YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…...
Java中的注解(白金版)
Spring中常用注解 Springboot中@Validated注解的使用 Swagger中常用注解 @Validate...
actor模型
Actor模型(Actor Model)是一种用于并发计算的数学模型和编程概念,它最早由计算机科学家 Carl Hewitt 等人提出,用于简化对多线程或并发系统的设计和实现。Actor模型在并发编程、分布式系统、消息传递系统等领域具有广泛应用。 核…...
合约门合同全生命周期管理系统:企业智能合同管理的新时代
合约门合同全生命周期管理系统:企业智能合同管理的新时代 1. 引言 随着现代企业的快速发展,合同管理的复杂性日益增加。无论是采购合同、销售合同还是合作协议,合同管理已成为企业运营中至关重要的一环。传统的手工合同管理方式往往效率低下…...
vscode如何debug环境配置?torchrun与deepspeed库又该如何配置?
文章目录 前言一、vscode命令参数传递1、验证参数py文件2、第一种vscode调用方法(launch.json配置)3、第二种vscode调用方法(launch.json配置)二、deepspeed运行py文件代码(deepspeed_test.py)三、deepspeed命令调用(无法debug)四、deepspeed使用vscode进行调试(能debug)五、vs…...
网络服务器忙请稍后重试怎么办/曲靖seo
每个源文件只能有一个public class一个源文件可以有任意多个non-public classpublic class应该和源文件有着相同的名字,并且源文件应该以.java为后缀如果一个class定义在一个package内,package 语句必须是源文件的第一行代码如果有import语句,…...
wordpress真伪查询主题/微博营销策略
当MySQL单表的数据库过大时,数据库的访问速度会下降,“数据量大”问题的常见解决方案是“水平切分”。MySQL常见的水平切分方式有哪些?回答:分库分表,分区表什么是MySQL的分库分表?回答:把一个很…...
做营销型网站一般要多少钱/b站推广入口2023年
前不久后台有一个粉丝给我留言:为什么很多人参加校招的时候,宁愿低薪也要进大厂,而不选择更高薪的小公司呢?我想了一下,大概是有3个原因:一是大厂薪资高、待遇好,二是大厂的工作方式更加体系化&…...
html5笑话网站源码/谷歌的推广是怎么样的推广
1:关系型数据库。 比如常见的 mysql、oracle、sqlserver 等,这类数据库基本上都支持 jdbc 或者 odbc 链接,所以报表工具基本上都支持。 2:文本文件 常见的 txt、csv、excel 等文本文件,这类文本文件就看各类报表的支…...
怎么做免费的网站链接/襄阳seo培训
2PC Two-Phase Commit 实现分布式事务 协调者(Coordinator)组件 【事务管理器(Transaction Manager)】 1、投票(准备)阶段: 协调者发送一个“prepare”请求给所有的参与者,询问是否可…...
网站建设论文读书笔记/竞价交易规则
# Define apscheduler app 下的 __init__.py 文件中, 三个主要函数 转载于:https://www.cnblogs.com/wzbk/p/10396411.html...