数据分析笔记

2023-11-05

数据分析


1、不同数据格式读取


  • mysql数据操作
  • text文件操作
  • json文件操作
  • csv文件操作
  • excel文件操作

1.1 mysql 数据操作


# pip intall pymysql

import pymysql

pymysql.connect()   # 此对象为pymysql连接数据库的类

# 创建Connection连接对象实例
conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql', database='python1', charset='utf8')
# 创建游标
cursor = conn.cursor()
# 数据查询
sql = "select id,name from students where id = 7"  
# 数据更新
sql = 'update students set name="刘邦" where id=6'
# 数据删除
sql = 'delete from students where id=6'
# 载入查询语句, 返回的是执行成功的条数,可以用于判断是否执行成功
cursor.execute(sql)
# 接收查询结果、就要一条
result = cursor.fetchone()
# 关闭游标
cursor.close()
# 关闭连接
conn.close() 
 
# 数据更新/或数据新增时
conn.commit()   # 提交
# 事务的回滚  
conn.rollback()

# 查看所有数据 
cursor.fetchall()
cursor.fetchone()
cursor.fetchmany(2)

1.2 TEXT 文件读取


参数说明

  • filename :文件名称
  • mode :文件打开方式。
    • r : read只读模式
    • w :writer写入模式
    • a : append追加方式
  • encodeing : 指定文件解码 (当文件中文乱码时,则可以指定编码为 utf-8解决)
#文件打开
with open (filename,mode,encoding=None) as f :
    
    # 文件的读取
	file.read()   #  <class 'str'>
	file.readline()   # 读取一行   <class 'str'>
	file.readlines()   # 读取多行,返回列表模式   <class 'list'>
 		
	# 写入文件
	file.write("写入内容")   # 返回 写入内容的字符串个数

	# 文件的关闭
	file.close()

1.3 JSON 操作


  • json.dumps() :将python对象编码转化为字符串(将字典形式的数据转化为字符串)
  • json.dump() :将python对象转化为 Json 存储到文件中
  • json.loads() :将 Json 字符串编码成python对象(将字符串形式的数据转化为字典)
  • json.load() :将文件中的 Json的格式转化为 python对象提取出来
import json
 
dict1 = {'A': 'a', 'B': 'b', 'C': 'c'}
print(type(dict1))
print(dict1)
 
# json.dumps(content) : 将python对象转化为 <class 'str'>
en_json = json.dumps(dict1)
print(type(en_json))
print(en_json)
 
#  json.loads(content) :将字符串转化为 python对象  <class 'dict'>
de_json = json.loads(en_json)
print(type(de_json))
print(de_json)
 
#  eval()解析json
dict2 = {'X': 'x', 'Y': 'y', 'Z': 'z'}
en_json = json.dumps(dict2)
de_json = eval(en_json)
print(type(de_json))
print(de_json)



# 运行结果

<class 'dict'>
{'A': 'a', 'B': 'b', 'C': 'c'}
<class 'str'>
{"A": "a", "B": "b", "C": "c"}
<class 'dict'>
{'A': 'a', 'B': 'b', 'C': 'c'}
<class 'dict'>
{'X': 'x', 'Y': 'y', 'Z': 'z'}
# json格式读取 - {"age":18 } 
with open("data.json",mode="r") as f:
	res = f.read()   #  {"age":18 } 
	print(type(res))	# 数据类型为 str
	
json.load(open("data.json",'r'))  #从文件中进行读取,并讲内容转化成字典格式,内容可以通过键值进行取值
json.loads()   # 从字符串变量读取

# json格式写入
s = 'json'
json.dump()   # 将python对象转化成 json对象     {"age":18 }  转化为   '{"age":18 }' 
json.dump(s,open('json.txt','w'))  # 将内容写入到json.txt文件中,
S = json.dumps({["内容"])  # 将传入的内容抓话成字符串,并不对文件进行操作
print(json.dumps(['lcl',{"age":19}]))

多行json数据压缩

# json格式转化
f = open("data/result.txt",encoding="utf-8")

# 压缩多行转化为一行
contenxt = json.dumps(f.read()).replace("\\n","").replace("\\","").replace(" ","")
contenxts = contenxt.replace("}{","}\n{")

1.4 CSV 格式操作


# CSV文件写操作
import csv
with open("demo.csv","w",newline = "") as datacsv:  #文件名、打开方式、新的一行默认为空
	csvwriter = csv.writer(datacsv,dialect =("excel"))  # 创建 CSV 写入对象 默认打开的方式EXCEL表格 
	csvwriter.writerow(["A","B","C","D"])  #插入对象,单行写入
	csvwriter.writerows([],[],[])  # 多行写入,每个[] 为一行

#CSV文件读取
with open("demo.csv",'r') as rf:
	reader = csv.reader(rf) # reader 是一个对象
	print(next(reader))
	for i in reader:
		print(i)

1.5 EXCEL 格式操作


  • 文件读取 :xlrd 库操作 excel
  • 文件写入 :xlwt库操作 excel
  • openpyxl 操作 excle文件
  • pandas 操作 excel文件
import xlrd   # openpyxl(只支持 2010版 以上 xlsx 文件)

#文件的读取
book = xlrd.open_workbook('1.xls')   #打开文件
sheet = book.sheet_by_index(0)  # 获取第一个sheet,sheet 是一个对象
print(sheet.nrows)  # 获取行数
print(sheet.cell(1,1))  # 根据列数、行数、获取内容值
print(sheet.row(1))  # 获取第一行
print(sheet.row_values(1,1))  #获取第一行,跳过第一列

#文件的写入     
import xlwt
wbook = xlwt.Workbook('写入文件名')      #写入文件名
wsheet = wbook.add_sheet("sheet1")   # 向sheet1 中进行写入
wsheet.write(1,0,label = 'Row 0,Column 0')  # 位置、label 是写入的内容
wsheet.write(0,1,label = 'Row 0,Column 1')
wbook.save('output.xls')   #写入后保存为


# 用 openpyxl 写入数据
# openpyxl(只支持 2010版 以上 xlsx 文件
from openpyxl import Workbook
wb = Workbook()  # 创建工作簿
ws = wb.catie	# 激活第一个工作表
# 构建数据
data = [
	["name","age","class"],
	["amy","18","25"],
	]
# data里面有多少个数据就以为着有多少行
for row in data:
	ws.append(row)
wb.save("demo.xlsx")	# 保存工作簿


# 用 openpyxl 读取数据
# openpyxl(只支持 2010版 以上 xlsx 文件
from openpyxl import load_workbook
wb = load_workbook("demo.xlsx")	  # 打开工作簿
ws = wb.cative	# 打开工作表
# 单元格的值
tuple(ws.rows)
for row in ws.rows:		# 循环出每一行
	for cell in ws.row:		# 循环出每一个单元格
		print(cell.value)	

        
        
# pandas  读取excel文件

import pandas as pd

# 读取
data = pd.read_excel("demo.xlsx",sheet_name=0)

# 写入
data.to_excel("demo.xlsx",index=Flase)

2、Numpy库


2.1 Numpy介绍


  • 介绍 : 数值计算的基础包,提供很多科学函数的处理功能,将数组对象作为数据交换的通用语言
  • 特点 :提供多维数组、提供算数操作及广播机制,对数据进行快速的矩阵计算,对硬盘中数据 进行读写操作

2.2 数据的创建与修改


# pip install numpy


# 数组创建  [1 2 3 4 5]
li = [1,2,3,4]
#可以通过指定dtype的方式指定创建数据的类型   order 创建数组样式,C为行方向、F为列方向,A为任意方向
a = np.array([1,2,3,4,5],dtype ="int32",copy = None, subok = False, ndmin = 0) 

a1 = np.array(li)
a2 = np.array(range(1,6))   #range (开始位、结束位、步长、类型)
a3 = np.arange(1,6) # arange 方式创建数组

# 创建二维数组 / 创建三维数组
t2 = np.array([[1,2,3],[4,5,6]])
t3 = np.array([[[1,2,3],[4,5,6],[7,8,9]]])


print(a.dtype) #打印数组中数据的类型 

a4 = np.array([1,0,1,1,0],dtype= bool)	# 创建指定类型的数组 (组内元素指定为bool类型)

a5 = a1.astype("float32")  # #修改数组中数据的类型为 float32 类型

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)   # 一维、等差数组  开始、结尾、步长
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)  # 等比例
numpy.empty(shape,dtype = float,order = "C")   #创建数组   
numpy.zeros(shape, dtype = float, order = 'C')  # 创建指定大小数组、数组元素用0来填充
numpy.ones(shape, dtype = None, order = 'C')   #创建为 1 的数组
numpy.asarray(a, dtype = None, order = None)   # 创建数组
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)   # 动态数组  buffer流式数据读取

# python中的方法 - b数组保留2位小数- 四舍五入的方式
print(np.round(b,2))
# numpy 中的方法 - b数据保留3位小数
print(np.around(b,3)) 

2.3 数组维度变更


t1 = np.array([[1, 2 ,3 ],[4 ,5 ,6]])
print(t1.ndim)    #维度 2
print(t1.shape)    #形状 (2,3)
print(t1.size)     # 数组元素总个数  
print(t1.dtype)   # t1 的元素类型

t1 = t1.reshape(2,3)  #修改数据形状  reshape  需要用变量进行接收
"""
arr.reshape(shape,order="C")
 - shape 数组重塑形状
 - order 数据重塑方向 (C : 行方向,F : 列方向)
"""

# 多维转一维
t2 = t2.flatten()   # 多维数据转化为1维
t3 = t2.ravel()		# 分散化,多维转化为 1 维

# 转置

a = np.arange(20).reshape(4,5)

a = arr.transpose(arr , axes)
a = arr.T

# 换轴
arr.swapaxes(arr ,axis1,axis2)  # 换轴
arr.swapaxes(arr ,axis1,axis2)  # 对换数组的两个轴   输入数据、第一个轴整数、第二个轴整数

# 滚动制定轴
rollaxis(arr,axis,start)  # 向后滚动指定的轴


2.4 数组间的计算


# 广播机制

print(np.zeros(3))   # 全 0 数组
print(np.ones(4))    #全 1 数组

print(np.zeros((3,4)))   # 全 0 数组
print(np.ones((3,4)))    #全 1 数组


arr = np.arange(6).reshape(2,3)
arr + 1     # 全部元素 + 1
arr * 2     # 所有数字全部 *2
# nan 非数     inf(正无穷、负无穷)无穷大

#数组和数组的计算
arr + arr1   #  对应位置相加减
arr * arr1   #  对应位置相乘/相除

# 数组垂直拼接(行堆叠)
numpy.vstack(arr,arr1) 
# 数组水平拼接(列堆叠)
numpy.hstack(arr,arr1) 

2.5 数据读取切片


  • loadtxt 参数读取CSV文件
    • frame : 读取文件名称
    • dtype :数据类型(文件内容读取出来的格式)
    • delimiter : 数据之间用什么符号进行分隔,默认空格
    • skiprows : 跳过前X行,一般是表头
    • usecols :读取指定的列,索引,元组类型
    • unpack : 对角线行列转置 ,如果为True,读取属性将分别写入不同的数组变量,False读取数据只写入一个数组变量,默认为False
#读取CSV文件 

t1 = np.loadtxt(fname,dtype = np.float,delimiter = None,skiprows = 0,usecols = None,unpack = False)


print(t1[2])   # 取第二行数据
print(t1[3])   # 取前三行数据
print(t1[:3:2])   # 取前三行,步长为2
print(t1[[0,2]])   # 取不连续的多行

print(t1[:,0])  #取列,逗号前代表全部的列,都行后边代表行,全部列的 第 0 行
print(t1[:,2])  # 取前两列
print(t1[:,[0,3]])   # 取不连续的列

print(t1[1:3,2])   #不相邻的多列
print(t1[1:0,[1,3]])  # 取点  [1,1] + [0,3]

2.6 数组中值的修改


arr1 = np.arange(24).reshape(4,6)

# 将第二列的值全部修改为 0
arr1[:,2] = 0

#布尔索引
arr1 < 10    # 全部元素与 10 比较,返回 true或flase

# 通过布尔进行筛选数值
arr1[ arr1 < 10 ]    # 整体可以选择小于 10的数

# 三元转化
t = np.where(t<10,0,10)  # 不修改函数本身,如果小于10,则显示 0,如果大于 0,则显示10

t.clip(10,18) # 小于10 的替换成10,大于18的替换成18

#数组中nan的处理(nan 和 inf  都是 float类型)
#  nan != nan    nan和任何数值计算都是nan
np.count_nozero(t)   # 判断不为零的数的个数
np.count_nozero(t!= t)   # 用来判断nan的个数
np.isnan(t)   # 判断是否为nan,若为 nan 则返回 True

#numpy中的常用方法  axis  数组中的轴
t.sum(axis = None)  #求和
t.mean(a,axis = None)  #均值
np.median(t,axis = None) #中值
np.max(axis = None)  #最大值
np.min(axis = None)  #最小值
np.ptp(t,axis = None)  #极值(最大最小之差)
np.std(t,axis =None)  #标准差
np.var(arr)		# 方差

np.cumsum(arr)	# 从 0 位置开始累加


np.concatenate  #连接沿现有轴
np.stack()   # 沿着新的轴接入一系列数组

np.argmax(t,axis = 0)  # 获取最大值的位置-索引
np.argmin(t.axis = 1)  # 获取最小值的位置-索引

# 分隔数组
numpy.split(ary, indices_or_sections, axis)  # 沿特定的轴将数组分隔为自数组  ary:被分隔数组  indices_or_sections 如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭) axis 分隔的 轴 
np.hsplit(harr, 3)  # 水平分割数组 
numpy.vsplit(a ,2# 沿垂直轴分割

#数组元素的添加与删除
numpy.resize(arr, shape)  # 返回指定形状的新数组
numpy.append(arr, values, axis=None) # 将值添加到数组末尾  
numpy.insert(arr, obj, values, axis)  #在给定的索引之前,沿给定的轴在输入数组中插入值
Numpy.delete(arr, obj, axis)
numpy.unique(arr, return_index, return_inverse, return_counts)  #函数用于去除数组中的重复元素
#   return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储
#   return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储
#   return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数

2.7 Numpy字符串函数


np.char.add(['hello', 'hi'],[' abc', ' xyz'])  #两数组逐个字符串元素进行连接
>> ['hello abc' 'hi xyz']

np.char.multiply('Runoob ',3)  # 返回按元素多重连接后的字符串
>> Runoob Runoob Runoob

np.char.center('Runoob', 20,fillchar = '*')  # 据中字符串
>> *******Runoob*******

np.char.capitalize('runoob')  # 将字符串的第一个字母转化为大写
>> Runoob

np.char.title('i like runoob')  #函数将字符串的每个单词的第一个字母转换为大写
>> I Like Runoob

np.char.lower(['RUNOOB','GOOGLE'])   #函数对数组的每个元素转换为小写。它对每个元素调用 str.lower
>> ['runoob' 'google']

np.char.upper(['runoob','google'])   #函数对数组的每个元素转换为大写。它对每个元素调用 str.upper
>> ['RUNOOB' 'GOOGLE']

np.char.split ('www.runoob.com', sep = '.')  #通过指定分隔符对字符串进行分割,并返回数组
>> ['www', 'runoob', 'com']

np.char.splitlines('i\nlike runoob?')  # 函数以换行符作为分隔符来分割字符串,并返回数组
>> ['i', 'like runoob?']

np.char.strip('ashok arunooba','a')   # 函数用于移除开头或结尾处的特定字符
>> shok arunoob

np.char.join([':','-'],['runoob','google'])   # 函数通过指定分隔符来连接数组中的元素或字符串
>> ['r:u:n:o:o:b' 'g-o-o-g-l-e']

np.char.replace ('i like runoob', 'oo', 'cc')  #函数使用新字符串替换字符串中的所有子字符串
>> i like runccb

2.8 numpy排序、条件刷选函数


# 数据处理

np.reciprocal(a)  # 返回数组a 的所有元素的 倒数
np.power(a,b)   # 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂
np.mod(a,b)  # 对应位置相除、取余数
np.amin(a,0)   # 获取数组中指定元素沿轴方向的最小值
np.amax(a,0)   # 获取数组中指定元素沿轴方向的最大值
np.ptp(a, axis =  1)   # 计算数组中元素最大值与最小值的差(最大值 - 最小值) 
numpy.percentile(a, q, axis)   # 百分位数是统计中使用的度量,表示小于这个值的观察值的百分比  数组、百分数、轴向
np.median(a, axis =  0)  #计算数组中的中位数
np.mean(a, axis =  0)  # 计算数组中的 算术平均值
np.average(a)  # 根据另一个数组给出的各自的权重计算数组中元素加权平均值


# 数组处理
numpy.sort(a, axis, kind, order)   # 排序数组、轴方向、排序方法(默认快排)、排序字段
np.argsort(x)  # 返回数组从小到大的数据的索引值
np.lexsort((dv,nm))   # 对多序列进行排序
msort(a) == np.sort(a, axis=0)  # 按照第一轴进行排序
sort_complex(a)   #对复数按照先实数、后虚部进行排序
partition(a, kth[, axis, kind, order])  #指定一个数、对数组 进行分区
argpartition(a, kth[, axis, kind, order])   # 可以通过 关键字 kind指定算法 沿着指定轴对数组进行分区

3、Pandas 库


3.1 Pandas 介绍


  • 在numpy基础上进行升级而来的一个库,numpy主要用来处理数值型的数据
  • 我们拿到的数据除了数值型,还有其他类型的数据,比如字符串、时间序列等,所以我们需要一个库来进行处理,所以引进了 pandas

3.2 Pandas数据类型


  • Series : 一种一维的数据对象,包含一个值序列,并包含数据标签,成为索引(index)
  • DataFrame :矩阵的数据表,包含多个 有序的列集合,每行可以是不同类型的数据,数据被存储为二维块

3.3 Series数据创建


# pip install pandas

# 数据组成 : index、name、value
# data传入 :列表、字典、向量

import pandas as pd

# pd.Series(data=None,index=None,dtype=None,name=None,copy=False)

t = pd.Series([1,2,3,4,5],index=list('abcde'))  # 传入列表,可以指定索引
t = pd.Series([1,2,3,4,5],index=list('abcde'),name = "T") #整体数据的名字

t.index.name = T1  #索引行的名字



dic = {'A': 'a', 'B': 'b', 'C': 'c'}

t1 = pd.Series(dic)  # 键值对应索引,值对应值
print(t1)

> A    a
> B    b
> C    c


t2 = pd.Series(np.random.rand(5))   #可以传入numpy类型的数据

print(t2)

dtype: object
0    0.337169
1    0.929789
2    0.255028
3    0.697560
4    0.567698
dtype: float64

t3 = t2.astype("float") #类型转化  转化成float类型

3.4 Series索引切片取值


t3.head(2)   # 查看t3的前几行数据,默认五行

dtype: float64
0    0.266993
1    0.330825
dtype: float64


t3.tail(2)  #查看t3后几行数据,默认五条

dtype: float64
3    0.177648
4    0.960813
dtype: float64

t3.reset_index() 	# 重置索引
t3.reset_index(drop=True)  # 重置索引,删除原索引

# 通过键值对\索引进行取值、也可以通过函数的方式
t1[age] = 18   #

t1.loc['age'] = 18  # 通过标签索引取值
t1.iloc[1] = 18   # 通过索引方式取值

t1[2]  # 取前两行的数据
t1[[1,3]]  # 取不连续的多行   也可以把数字换成 键值 也可以

# 数据中的index是允许修改的,如果想修改需要重置,就是全部修改,就是在索引后面再加一样索引。

3.5 Series数据类型相加


  • 对应的索引位相加、而没有对应上的之间显示NAN(索引相同才可以互相运算)

3.6 Pandas 数据读取


# index_col = 0 指定 0 列为索引
# parse_dates 将时间转化成标准格式
pd.read_csv("data",index_col=0,parse_dates=True#读取外部csv数据
pd.to_csv('data')   # 把数据写入到CSV中

3.7 DataFrame数据创建


  • DateFrame参数
    • 创建的数据 :data
    • 指定行索引 :index
    • 指定列索引 :colums
    • 数组数据类型 :dtype
    • 是否拷贝 :copy
"""
pd.DataFrame(data = None,index = None,columns =None,dtype = None,copy = False)
"""
t = pd.DataFrame(np.arange(12),reshape(3,4))   # dataframe数据的创建
# index 行索引   0轴  axis = 0      columns 列索引  1轴  axis = 1
#通过字典类型创建  遵循广播机制,没有的就用有的补

#pandas 中的基础属性
df.shape  # 行数、列数
df.dtypes  # 列数据类型
df.ndim   #数据维度
df.index   #行索引
df.columns   # 列索引
df.values   # 对象值,二维ndarray数组
df.drop(columns = ['name','age'])    #返回被删除后的 dataframe原数据不变
del df['name']    # 删除列

3.8 DataFrame数据索引操作


t2.head(3)   #显示头部几行、默认5行
t2.tail(3)    #显示末尾几行,默认5行

t2.info()    # 数据描述信息概述   数据清洗的时候 通过此判断清洗情况
t2.describe()   #快速综合统计结果 
df.sort_values(by="",ascending = False)  # by 后面接根据什么来排序  True 升序   False 降序

df[:2]  #取前两行  方括号写数组,表示取行,对行进行操作
df[:"标签索引名"]  # 取 到标签索引名的行

df["列名称"]   # 取相应的列,对列进行操作。
df[["列名称1","列名称2"]]   # 取相应的多列,对列进行操作。
df[df["name" != "lcl"]]  # 取出名字不等于 lcl的行,条件筛选

df[:2]["列名"]   #同时取行和列,取确切位置
df.loc["python",:]  #通过标签索引取行数据,取 索引为 python 的行
df.loc[:,"three"]	# 取索引为 three 的列
df.loc[["php","go"],:]		# 取多行
df.loc[["php":"go"],:]		# 取多行,从 php 行到 go 行

df.iloc[2,:]   # 通过位置获取行数据, 取出第二行的全部数据
df.iloc[:,2]	# 取出第三列
df.iloc[[0,2],:]	# 取出第 0 行 和第 2 行数据

b.swaplevel()  # 交换索引的位置,应用于符合索引

#pandas 字符串常用方法
df.str.contains()   # 返回表示个字符串是否含由指定模式的布尔型数组
df.str.len()	# 返回字符串的长度
df.str.lower()	# 转化为小写
df.str.upper()  # 转化大写
df.str.slice()   # 对series中的各个字符串进行子串截取
df.str.split()  # 根据分隔符或正则表达式对字符串进行拆分

3.9 DataFrame 算数


方法 描述
add 加法(+)
sub 减法(-)
div 除法(/)
floordiv 整除(//)
mul 乘法(*)
pow 幂次方(**)
# fill_value 的值对 df1 缺失位置填充 3,然后再计算
df1.add(df2,fill_value = 3)		# df1 + df2



# 索引排序 (axis 轴,ascending 排序方式,True 为升序 )
df.sort_index(axis=0,ascending = True)	

# 按值排序 (by 指定一列或多列作为排序键)
df.sort_values(by=0)	# 指定第一列进行排序
df.sort_values(by=[0,1])	# 多列进行排序
df.sort_values(axis=1,by="b")	# 指定轴的排序

常用计算方法

方法 描述
count 非NA值个数
min,max 最大、最小值
argmin,argmax 最大、最小值的索引位置
idxmin,idxmax 最大、最小值的标签索引
sum 求和
mean 平均值
median 中位数
var 方差
std 标准差
cumsum 累计值
pct_change 百分比
# 多维度统计
data.aggregate([np.mean,np.std,np.median,min,max])

# 每项指标的差异值,后一天的值减去前一天的值
data.diff()

# 计算增长率(后一天的值 - 前一天的值)/前一天的值
data.pct_change()

3.10 DataFrame数据处理


3.10.1、缺失数据处理

# 判断数据是否有NaN (内置的None 默认为 Nan)
pd.isnull(df)	# 返回哪些值是缺失得布尔值
pd.notnull(df)	# 返回值是 isnull 的反集

# 过滤缺失值
"""
how —— 只要有Nan 就删除行
all —— 一行全部为Nan 时才删除
inplace —— 修改被调用的对象,而不是一个备份
"""
data.dropna( axis = 0,how = 'any/all' , inplace = False )  # 可以指定轴
3.10.2、补全缺失值

data.fillna(value= None,method = None,axis =None,inplace =Flase,limit =None)
"""
value : 标量或字典对象用于填充空缺值
method : 插值方法,默认 ffill(向上插补)
axis : 需要填充的轴,默认为 0
inplace : 修改被调用的对象,而不是一个备份
limit : 用于向前或向后填充时,最大的填充范围
"""
t.fillna(2)   # 将 Nan替补为 2
t.fillna({"x":3.0,"y":4.0})		#  X 列的 Nan 替换为3,Y 列替换为 4
t.fillna(df.mean())		# 填充均值
t.fillna(method="ffill")	# 往上插补(用上一行的数据来填充下一行的 Nan)
3.10.3、异常值

"""
to_replace 去替换的值
value 替换的值
"""
df.replace(to_replace=None,value =None)
3.10.4、处理重复数据

# 判断重复值
"""
subset : 指定子  列  判断重复
keep : 默认为 first 保留首个出现的 last 保留最后出现
"""
df.duplicated(subset =None,keep = "first")  # 返回一个布尔值 Series,默认反映的是每一行是否与之前出现的行相同


# 删除重复值 (返回 DataFrame 默认删除)
"""
subset : 指定数据任何自己是否重复
keep : 默认为 first 保留首个出现的 last 保留最后出现
"""
df.drop_duplicates()
df.unique()  # 返回一个列表
3.10.5、数据打印不全处理

pd.set_option('display.max_rows',1000)
pd.set_option('display.max_columns',1000)
3.10.6、字符串的离散化

  • 将连续值进行分区间
  • 同一个数据属于多种属性
# 对数据进行离散化分组
# data 数据、bins 分组范围、bins
pd.cut(data,bins)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

age_arr = np.random.randint(20,60,size=20)
bins = [20,30,40,50,60]
cates = pd.cut(age_arr,bins)
print(data)
cates.codes  # 返回数据分布 所在的组的索引
cates.categories # 返回表示 右闭合区间

# 自定义区间标签
l_name = ["youth","youngAdult","MiddleAged","Old"]
cates = pd.cut(age_arr,bins,labels = l_name)

# 统计每个区间的数值分布
pd.value_counts(cates)
3.10.7、索引与分层索引

df.index	# 查看索引
df.index=[,]	# 指定索引
df.reindex([,])		# 重置索引
df.set_index("M",drop=Flase)	# 设置M列作为index
df.set_index("M").index.unique()	# 返回 index 的唯一值


import pandas as pd
import numpy as np

df = pd.DataFrame(np.arage(12).reshape(3,4),index = list("ABC"),columns = list("QWER"))

df.index  # ['A','B','C']
df.index[1]  # B
df.index = ['B','C','D']    # 将索引全部修改

# 重置索引,如果原数据没有,则自动补齐 Nan
df.reindex(['F','G','G'])		# 重置索引

# 指定某列作为索引
df.set_index("M",drop=Flase)	
df.set_index(["M","D"])		# 指定多行索引

# 查看索引重复
df1.index.unique()

# 查看索引是否存在重复值
data.index.is_unique

df1.loc["one"]		# 取所有索引为 one
df1.loc["one","two"]	
df1.loc[["one","two"]]	

df1.loc["one","j"]	
df1.loc["one"].loc["j"]	

3.11 Pandas 中的时间序列


  • 在多个时间点观测地数据形成地时间序列
  • 时间戳
  • 固定时间区域
  • 时间间隔
# Periods 时间范围的个数,freq 频率,以天为单位还可以以月为单位,normalize 是否保留后面的时分秒
pd.date_range(start = None,end = None ,periods = None, freq = 'D',normalize=flase) 
D --Day   #  每日
B -- BusinessDay  # 工作日
H -- Hour  # 每小时
T / min  -- Minute # 每分
S -- Second  # 每秒
L/ms  -- Million # 每毫秒
U -- Micro # 每微妙
M -- MonthEnd  # 每月最后一个日期

index = pd.date_range("20190101",periods = 10)
df = pd.DataFrame(np.arange(10),index = index )   # 作为行索引
df = pd.DataFrame(np.arrge(10),reshape(1,10),columns = index)  # 作为列索引

# 获取 2020年数据
data["2020"]
# 获取 2020年 5月
data["2020 05"]  /  data["2020/05"] /  data["2020-05"]

# 重复索引分组 再聚合
group_data = data.groupby(level=0)
group_data.sum()
group_data.mean()


# 移位日期(是对数值进行移位) —— 讲日期按时间向前移动或向后移动 
# 一般用于计算增长率
data.shift(2)  # 向前移动
data.shift(-2) # 向后移动


# 数值不变,对时间序列进行移位
data.shift(2,freq ="D")
3.11.1、pandas 重采样

  • resample
  • 重采样:将时间序列从一个频率转化为另一个频率进行处理的过程
  • 降采样:将高频率数据转化为低频率数据
  • 升采样:低频率转化为高频率
# resample 中传入的是频率
print(t.resample("M").mean())   # 例如时间序列,把本月的数据取平均值,最后显示只显示月度数据

# 低频转化高频
data.resample("D").asfreq()
data.resample("D").ffill()

3.11.2、虚拟化变量

  • 类似 jiba 分词
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
	"key":['b','b','a','c','a','b'],
	"data":range(6)
})

# 实现数据的虚拟化 pd.get_dummies()
data = pd.get_dummies(df["key"],prefix="key")


**#虚拟化例子**

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("IMDB-Movie-Data.csv")
all_genres = []
for x in df["Genre"]:
    li = x.split(",")
    all_genres.extend(li)
#print(all_genres)

genres = pd.unique(all_genres)
zero_data = np.zeros((len(df),len(genres)))

# 构建数组
zero_data = pd.DataFrame(zero_data,columns=genres)

"""
# 获取当前行数据的位置
f_data = f_data.split(",")
zero_data.columns.get_indexer()
"""
# 获取df.Genre 中 每一个 元素以及对应的索引
for i,genre in enumerate(df.Genre):
	# 获取列索引所在位置
	col_index = zero_data.columns.get_indexer(genre.split(","))
	zero_data.iloc[i,col_index] = 1
3.11.3、数据的合并

#数据合并
join  # 默认情况下,把行索引相同的数据合并到一起,列不能有重复

df1 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("ABC"),columns=list("DEFG"))
df2 = pd.DataFrame(np.arange(6).reshape(2,3),index=list("AB"),columns=list("WXY"))
print(df1.join(df2))
print(df2.join(df1))


# 数据堆叠   pd.concat()
data = pd.concat([arr1,arr2,arr3],axis=0)


merge # 按照指定的列把数据按照一定的方式合并到一起,以列为基准,需要有公共的列(类似于vlookup)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df1 = pd.DataFrame(np.arange(6).reshape(2,3),index=list("AB"),columns=list("XYZ"))
df2 = pd.DataFrame(np.arange(6).reshape(3,2),index=list("ABC"),columns=list("WZ"))
print(pd.merge(df1,df2))

# 执行拼接方式,on 指定拼接列(须为公共列)
# 类似于 vlookup
pd.merge(df3,df4,how="left",on="")

how # 指定拼接方式 inner、outer、left 、right 默认为 inner
on # 需要连接的列名 (须为公共列)
left_on # 左边数据中用作连接的列
right_on # 右边数组中用做连接的列
3.11.4、数据的分组

# 数据的分组
import pandas as pd
import numpy as np

data = {
    "key1":['a','a','b','b','a'],
    "key2":['one',"two","one","two","one"],
    "data1":np.arange(5),
    "data2":np.arange(5)
}

df = pd.DataFrame(data)
data_one=df.groupby('key2').sum()
print(data_one)


df,groupby(by = "columns_name")   # 根据列名进行分组
count # 分组中非NAN值得数量
sum  # 非 Na值得和
mean  #非Na 值得平均值
min/max  # 非Na值得最小值、最大值

# 索引和符合索引
t.index   # 简单索引
t.index ['a','b','c']  # 指定index
t.reindex['a','e']  # 重设index
t.set_index("M",drop = False)  # 指定某一列作为index
t.set_index("M").index.unique()   # 返回index的唯一值

#  Series 符合索引
a = pd.DataFrame({'a':range(7),'b':range(7,0,-1),'c':['one','one','one','two','two','two','two'],'d':list("hjklmno")})   # 设置c,d 为索引,设置 d,c为索引

4、Matplotlib库


  • 流行的python底层绘图库,制作 2D 可视化图表
  • 官网 : http://c.biancheng.net/matplotlib/

4.1 绘制过程


  • 设置图片大小
  • 保存到本地
  • 描述信息,X 和 Y轴表示
  • 调整X,或 Y 的刻度距离
  • 线条样式(颜色、透明度)
  • 标记特殊点(最高、最低)
  • 给图片加水印(防伪用)
# https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.plot.html#matplotlib.axes.Axes.plot


# 假设一天中每隔2小时的温度分别为  [15,13,14.5,17,20,25,26,26,27,22,18,15]

from matplotlib import pyplot as plt

# 设置图片大小(宽、高)、 dpi图片的清晰度(最大值100)
fig = plt.figure(figsize =(20,8),dpi = 80)

x = range(2,25,2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]

plt.xlabel('time')   #设置X轴描述信息 直接显示在图表中
plt.ylabel('temp')   #设置Y轴描述信息 直接显示在图标中

plt.title("图像title")  # 设置图像title

plt.plot(x,y,label ="图例显示内容",color = "red",marker = "o",linestyle = "dashed",linewidth =2,marksize = 12)

_x = range(2,25,2) 

# 列表推倒式 含义同_x = range(2,25,2)  ,_x = [i/2 for i in range(4,50)]

plt.xticks(_x, _xtick_lable)   # 设置X轴的刻度,如果_xtick_lable不为空,则会在显示时替换到_X
plt.yticks(_y)   # 设置Y轴的刻度

plt.grid()   # 绘制网格线(可根据效果省略)
plt.legend(prop = front)   # 绘制图例(跟绘图中的label标签配合使用) 参数中是显示中文图例参数
plt.savefig('./matp.png')  # 将图片保存到本地

plt.show()  #展示画好的图

5、Seaborn库


5.1 Seaborn介绍


  • 基于 matplotlib 组数据结构与 pandas 统一的统计图制作库。封装了一系列的方便绘图函数

5.2 Seaborn 安装


# pip 安装
pip install seaborn

#anaconda 安装
conda install seaborn

学习文档

  • 官网 :http://seaborn.pydata.org/
  • 中文文档 :https:www.cntofu.com/book/172/docs/1.md

5.3 Seaborn绘图模块


  • 关系型绘图
  • 分类型绘图
  • 分布型绘图
  • 线性关系绘图
5.3.1 关系型绘图

  • 表示多个变量之间的关联关系,默认情况绘制散点图,也可以绘制线性图,通过 kind参数进行指定
  • 关系图绘制 : seaborn.relplot()
  • 散点类型 :scatterplot : relplot(kind = “scatter”)
  • 线性类型 lineplot : relplot(kind = “line”)
import seaborn as sns
import pandas as pd
from matplot import pyplot as plt
import numpy as np 

# sns.load_dataset()加载在线数据集
tips = sns.load_dataset("tips",cache = True)    # cache 保存
# 读取本地数据集
tips = pd.read_csv("/seaborn-data-master/tips.csv")

# 绘图、默认散点图
sns.relplot(x="total_bill",y ="tip",data=tips)
# 绘制散点图
sns.scatterplot(x="total_bill",y ="tip",data=tips)

# hue 参数控制第三个变量的颜色显示(每个点属于星期几,用不同颜色标出)
sns.relplot(x="total_bill",y ="tip",hue = "day",data=tips)

# 根据某个属性值,对每个属性值进行绘制子图 (lunch、dinner)
# 通过 col 、 row 进行指定
sns.relplot(x="total_bill",y="tip",hue ="day",col ="time",data=tips )
# 性别 + 时间分组(4个子图)
sns.relplot(x="total_bill",y="tip",hue ="day",col ="time",row = "sex",data=tips )

# 绘制折线图
fmri = sns.load_dataset("fmri")
# ci 设置置信区间(置信区间)
sns.relplot(x="timepoint",y="signal",kind ="line",data=fmri,ci = None,hue ="region",col ="event",style="region")
# 绘制折线图
sns.lineplot(x="timepoint",y="signal",data=fmri)
5.3.2 分类型绘图

  • 通过 sns.catplot 来实现,默认绘制的是 分类散点图,也可以通过 kind 来进行指定
  • 分类散点图、分类分布图、分布统计图
  • sns.catplot()
# 分类散点图
sns.catplot(x ="day",y ="total_bill",data = tips , hue ="sex")

# 分布散点图(kind ="swarm" 点之间不重叠)
sns.catplot(x ="day",y ="total_bill",data = tips , hue ="sex",kind ="swarm")
5.3.3 分类分布图

  • 根据分类,每个分类下数据的分布情况,通过catplot 来实现
  • 箱型图( boxplot() (with kind=“box”))
  • 小提琴图 (violinplot() (with kind=“violin”))
# 箱型图
sns.boxplot(x ="day",y ="total_bill",data = tips , hue ="sex",kind ="box")

# 小提琴图
# inner = "quartile"  指定 四分位
sns.violinplot(x ="day",y ="total_bill",data = tips,inner ="quartile",hue ="sex",split=True)
5.3.4 分类统计图

  • 根据分类、统计每个分类下的数据的个数或比例
  • 条形图 :sns.barplot() —— (with kind =“bar”)
  • 柱形图 :sns.countplot() —— (with kind =“count”)
  • 点线图 : sns.pointplot() —— (with kind =“point”)
# 条形图 : 可以统计比例,平均数,也可以按照想要的统计函数来统计
# estimator 指定 求和 总数
sns.catplot(x ="day",y ="total_bill",data = tips ,kind ="bar",estimator=sum)

# 柱形图 : 统计某一变量出现数量的图形
sns.catplot(x ="sex",data = titanic,kind ="count")

# 点线图	: 变量之间的变化趋势
sns.catplot(x="sex",y="survived",data=titanic,kind="point",hue="class")
5.3.5 分布绘图

  • 主要分为单变量分布以及而变量分布 和 pairplot
  • 单变量分布 :主要 通过直方图来绘制,采用 distplot
  • 二变量分布 :观察两个变量之间分布的关系,一般采用多个图进行,函数为 jointplot
# 单变量分布
titanic = pd.read_csv("./seaborn-data-master/titanic.csv"))
titanic.head()
sns.distplot(titanic["age"])


# 二变量分布
tips = sns.load_dataset("tips")
g = sns.jointplot( x = "total_bill",y  ="tip",data = tips)

# 通过设置 kind ='reg' 可以设置回归绘图和核密度曲线
# 通过设置 kind = 'hex' 可以绘制六边形图

"""
jointplot 其他常用参数
1、x,y,data : 绘制图的数据
2、kind : scatter 、reg 、resid 、kde 、hex
3、color : 绘制元素颜色
4、height : 图的大小、图绘在一个正方形
5、ratio : 主图 和副图的比例,只能为一个整数
6、space : 主图和副图的间距 
7、dropna : 是否需要删除 x 或 Y值 中出现的 Nan的值
8、marginal_kws : 副图的一些属性,比如设置 bins、rug 等
"""


# **pairplot**
# 默认情况下,对角线的图 是直方图,其他地方是散点图,如果想更改可以通过 diag_kind 和 kind 来实现
# diag_kind : auto,hist,kde  (指定对角线曲线类型)
# kind : scatter ,reg(回归线)
sns.pairplot(tips,var=["total_bill","tip"],kind="reg")
5.3.6 线性回归绘图

  • 线性回归图 帮助看到数据的关系趋势,在 seaborn 中,通过 regplot 和 lmplot 两个函数来实现
  • regplot 的 X,Y 可以是 Numpy 数组,Series等变量 —— regplot(x,y,data=None)
  • lmplot 的 X,Y 则必须为字符串,并且 data的值不能为空 —— lmplot(x,y,data)
# 散点图 + 回归线
sns.regplot(x="total_bill",y="tip",data=tips)
sns.lmplot(x="total_bill",y = "tip",data = tips)
5.3.7 FacetGrid结构图

  • 官网地址 :https://seaborn.pydata.org/tutorial/color_palettes.html
  • relplot、catplot、lmplot 等函数都可以通过 col、row 等在一个 Figure 中绘制多个图
  • 这些函数之所有有这些功能,主要是底层使用了 FacetGrid 来组装这些图形

Axes绘图

  • seaborn 绘图中很多底层使用 Axes 进行绘图
  • 凡是函数名中已经明确了绘图类型函数,这种图一般使用Axes.
  • 使用Axes 绘图的 不能传入 col、row 等参数绘图
import seaborn as sns
import pandas as pd
from matplot import pyplot as plt
import numpy as np

# plt.subplots()  有两个返回值

fig , ax = plt.subplots(1,2,figsize(20,5))
sns.scatterplot(x="total_bill",y = "tip",data = tips ,ax = ax[0])
sns.scatterplot(x="total_bill",y = "tip",data = tips ,ax = ax[1])

FaceGrid使用步骤

  • 创建一个FaceGrid对象
  • 再调用这个对象的map方法
  • map 的第一个参数是函数
  • 后续 map 通过调用该函数绘制图形
  • 最后的参数是传给函数的 参数
tips = sns.load_dataset("tips")

# 绘制散点图 —— (day 数据进行分组)
# height=4,aspect=2 设置绘图图形的宽高,比例
g = sns.FacetGrid(tips,col = "day",hue = "time",height=4,aspect=2)
# order 指定图形数据顺序
g.map(plt.scatter,"total_bill","tip",order=["Sat","Fri","Sun",....])

设置图例

# 设置显示中文
sns.set(rc={"font.sans-serif":"SimHei"})

fg2 = sns.FaceGrid(tips.col="day",hue="time")
fg2.map(sns.regplot,"total_bill","tip")

# 添加图例(方法1)
fg2.add_legend(title="标题",labels=["晚餐","午餐"],label_order=["Dinner","Lunch"])

# 添加图例(方法2)
fg2.add_legend(title="标题",label_order=["Dinner","Lunch"])
new_labels=["晚餐","午餐"]
for text,label in zip(fg2._legend.texts,new_labels):
	text.set_text(label)

设置标题

  • 设置函数 :g.set_titles(template=None,row_template=None,col_template=None)
  • template : 给图设置标题 {row_var} : 绘制每行图形的名称 ,{row_name} : 绘制每行图形的值,{col_var} : 绘制每列图像的名称 ,{col_name} : 绘制每列图像的值
  • col_template : 给图像设置的标题。其中 {col_var} 、{col_name} 可以使用
  • row_template : 给 图像 设置行的 标题。其中 {row_var} 、{row_name} 可以使用
g = sns.FacetGrid(tips.col="day",row="time")
g.map(sns.regplot,"total_bill","tip")
g.set_titles(template="时间{row_name}/星期{col_name}")

设置坐标轴

  • 设置坐标轴 :g.set_axis_labels(x_var,y_var) : 一次性设置 X,Y 的坐标轴标题
# 设置坐标轴标签
g.set_axis_labels("消费金额","消费") 
# 设置刻度及刻度标签
g.set(xticks= range(0,60,10),xticklabels=["0rmb","10rmb","20rmb","30rmb","40rmb","50rmb",])
# 设置背景颜色(绿色)
g.set(facecolor ="g")

风格设置函数

  • sns.set_style()
  • sns.axes_style()
  • sns.set()
tips =pd.read_csv("data.csv")
fmri = pd.read_csv("data1.csv")


# set_style 设置风格
sns.set_style("darkgrid")


# rc 中传入样式设置 - 临时设置
with sns.axes_style("darkgrid",rc={'axes.facecolor':'white'}):
	sns.lineplot(x="timepoint",y="signal",data=fmri)


# sns.set() 设置风格
sns.set(rc={'axes.facecolor':'white'})

调色盘设置

  • 根据应用场景提供三种调色盘
  • 定性的、连续的、发散的
# 定性调色盘 —— 数据不连续、较发散、想体现分类的情况下使用
planets = pd.read_csv("data.csv")

# palette 设置调色盘参数
# hls 调色盘- 默认6种颜色
sns.barplot(x="year",y="distance",data=planets,palette = sns.color_palette("hls"))


# 默认调色盘 (默认10种)
# 通过 sns.color_palette 获取
current_palette = sns.color_palette()
sns.palplot(current_palette)


# 分类颜色
sns.palplot(sns.color_palette("Paired"))
sns.palplot(sns.choose_colorbrewer_palette("qualitative"))

# 连续调色盘
# 由浅入深
sns.palplot(sns.color_palette("Blues"))
# 由深入浅
sns.palplot(sns.color_palette("Blues_r"))


# 离散调色盘(两边的颜色逐渐加深,中间最淡)

values = [12,15,17,18,-5,-8]
# 查看色调选择
sns.choose_colorbrewer_palette("diverging")
with sns.color_palette("RdBu_r")
	sns.barplot([1,2,3,4,5,6],sorted(values))

6、Pyeharts库


6.1 Pyecharts介绍


  • 是百度开发的一个绘图库、不支持复杂df的数据类型
  • 官网地址 :https://pyecharts.org/#/zh-cn/global_options?id=legendopts%ef%bc%9a%e5%9b%be%e4%be%8b%e9%85%8d%e7%bd%ae%e9%a1%b9

6.2 Pyecharts绘图


6.2.1 绘制条形图

# -*- coding: UTF-8 -*-

from pyecharts.charts import Bar

# 方法实例化
bar = Bar() 
bar.add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
bar.add_yaxis("商家A",[5,20,36,75,9060])
bar.render()

链式调用

from  pyecharts.charts import Bar

bar = (
	Bar()
	.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
	.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])	
)
bar.render()
6.2.2 配置项

  • 标题配置项 — TitleOpts
  • 图例配置项 — LegendOpts
  • 工具箱配置项 — ToolboxOpts
  • 提示框配置项 — TooltipOpts
  • 视觉映射配置项 — VisualMapOpts (0-100)
  • 区域缩放配置项 — DataZoomOpts
6.2.2.1 InitOpts:初始化配置项

  • 可以配置诸如图像宽度,高度,图表主题,背景颜色等
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from faker import Faker

c = (
        Bar(
        	# 初始化配置
            init_opts=opts.InitOpts(
            	# 图像宽度
                width="500px",
                # 图像高度
                height="400px",
                # 图像主题
                theme=ThemeType.LIGHT,
                # 图像背景色
                bg_color="skyblue"
            )
        )
        .add_xaxis(Faker.choose())
        .add_yaxis("商家A", Faker.values())
        .add_yaxis("商家B", Faker.values())
    )
c.render()
6.2.2.2 TitleOpts:标题配置项

  • 配置图的标题和子标题等信息
c = (
        Bar()
        .add_xaxis(Faker.choose())
        .add_yaxis("商家A", Faker.values())
        .add_yaxis("商家B", Faker.values())
        # 全局化配置
        .set_global_opts(title_opts=opts.TitleOpts(
        	# 主标题
            title="销售表",
            # 副标题
            subtitle ="水果商户"
            pos_right="0",
            pos_bottom="2px",
            # 主标题样式配置项
            title_textstyle_opts=opts.TextStyleOpts(**{"color":"#333","font_size":12})
        ))
    )
c.render()
6.2.2.3 LegendOpts:图例配置项

  • 配置图的标题和子标题等信息
c = (
        Bar()
        .add_xaxis(Faker.choose())
        .add_yaxis("商家A", Faker.values())
        .add_yaxis("商家B", Faker.values())
        .set_global_opts(
            legend_opts=opts.LegendOpts(selected_mode="mutiple",orient="vertical",pos_right="30px")
        )
    )
c.render()
6.2.2.4 VisualMapOpts:视觉映射配置项

c = (
    Scatter()
    .add_xaxis(Faker.choose())
    .add_yaxis("商品",[(x,y) for x,y in zip(Faker.values(),Faker.values())])
    .set_global_opts(
        visualmap_opts = opts.VisualMapOpts(type_="size",range_text=['大','小'])
    )
)
c.render()
6.2.2.5 TooltipOpts:提示框配置项

c = (
    Scatter()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家A",Faker.values())
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Scatter-多维度数据"),
        tooltip_opts=opts.TooltipOpts(
        	# {a} 系列名、{b} 数据名、{c} 数据值
            formatter="{a}"
            )
        )
    )
)
c.render()

6.2.2.6 坐标轴轴线/刻度/指示器/坐标轴配置项


  • xisLineOpts/AxisTickOpts/AxisPointerOpts/AxisOpts : 坐标轴轴线/刻度/指示器/坐标轴配置项
c = (
        Bar()
        .add_xaxis(
            [
                "名字拉拉长的X轴标签1",
                "名字拉拉长的X轴标签2",
                "名字拉拉长的X轴标签3",
                "名字拉拉长的X轴标签4",
                "名字拉拉长的X轴标签5",
                "名字拉拉长的X轴标签6",
            ]
        )
        .add_yaxis("商家A", [10, 20, 30, 40, 50, 40])
        .add_yaxis("商家B", [20, 10, 40, 30, 40, 50])
        .set_global_opts(
            xaxis_opts=opts.AxisOpts(
                name="商家名称",
                # 刻度标签旋转 15 度
                axislabel_opts=opts.LabelOpts(rotate=-15),
                # x轴 箭头的样式
                axisline_opts = opts.AxisLineOpts(symbol="arrow",linestyle_opts=opts.LineStyleOpts(width=2)),
                # y轴竖向的分隔线
                axistick_opts = opts.AxisTickOpts(is_inside=True,length=20),
                # 动态的分隔线
                axispointer_opts = opts.AxisPointerOpts(is_show=True,type_="line")
            )
        )
    )
c.render_notebook()
6.2.3 横向条形图

c = (

    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家A", Faker.values())
    .add_yaxis("商家B", Faker.values())
    # 翻转 X,Y轴,绘制横向条形图
    .reversal_axis()
    .set_series_opts(label_opts=opts.LabelOpts(position="right"))
    .set_global_opts(title_opts=opts.TitleOpts(title="Bar-翻转 XY 轴"))
)
c.render()
6.2.4 堆叠图

c = (
    Bar()
    .add_xaxis(Faker.choose())
    # stack 参数设置堆叠
    .add_yaxis("商家A", Faker.values(), stack=True)
    .add_yaxis("商家B", Faker.values(), stack=True)
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(title_opts=opts.TitleOpts(title="Bar-堆叠数据(全部)"))
)
c.render()
6.2.4.1 设置条形图的间距

  • category_gap参数:x轴每个分类的间距
  • gap参数:统一分类下多根柱子间的间距
# y 值只有一个的情况
c = (

    Bar()
    .add_xaxis(Faker.choose())
    # 设置每个分类间距 category_gap
    .add_yaxis("商家A", Faker.values(), category_gap="80%")
    .set_global_opts(title_opts=opts.TitleOpts(title="Bar-单系列柱间距离"))
)
c.render()



# 有两个y轴数据的情况
c = (

    Bar()
    .add_xaxis(Faker.choose())
    # 设置多跟柱子的间距gap
    .add_yaxis("商家A", Faker.values(), gap="0%")
    .add_yaxis("商家B", Faker.values(), gap="0%")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Bar-不同系列柱间距离"),
    )
)
c.render()
6.2.5 带有网格的条形图

  • 网格图,是在x轴和y轴上,都绘制横线,形成的网格。可以在opts.AxisOpts中通过设置splitline_opts实现
c = (
        Bar()
        .add_xaxis(Faker.choose())
        .add_yaxis("商家A", Faker.values())
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Scatter-显示分割线"),
            # 设置网格线
            xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)),
            yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)),
        )
    )
c.render()
6.2.6 箱型图

v1 = [
    [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980],
    [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790],
]
v2 = [
    [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920],
    [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870],
]

c = Boxplot()
c.add_xaxis(["商品1","商品2"])
c.add_yaxis("A",c.prepare_data(v1))
c.add_yaxis("B",c.prepare_data(v2))
c.render()
6.2.6.1 绘图样例

c_athletes = athletes[athletes["NOC"].isin(list(countries.keys()))]

male_ath =[]
female_ath =[]

for country in countries.keys():
	# 城市匹配、性别为 M, 取身高列,删除 nan值
	male_h = c_athletes(c_athletes["NOC"]==country) & (c_athletes["Sex"]=="M")["Height"].dropna()
	# 城市匹配、性别为 F, 取身高列,删除 nan值
	female_h = c_athletes(c_athletes["NOC"]==country) & (c_athletes["Sex"]=="F")["Height"].dropna()
	male_ath.append(male_h)
	female_ath.append(female_h)

c = Boxplot(
	init_opts = opts.InitOpts(
		width = "800px",
		height = "400px",
		)
)
c.add_xaxis(list(countries.values()))
c.add_yaxis("男性",c.prepare_data(male_ath))
c.add_yaxis("女性",c.prepare_data(female_ath))
c.set_global_opts(
	yaxis_opts = opts.AxisOpts(interval =20,min _=120,max_ =240)
	)
c.render()
6.2.7 散点图

  • 散点图用的是pyecharts.charts.Scatter来实现的
c = (
    Scatter()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家A", Faker.values())
    .set_global_opts(title_opts=opts.TitleOpts(title="Scatter-基本示例"))
)

c.render()
6.2.8 多维散点图

c = (
    Scatter()
    .add_xaxis(Faker.choose())
    .add_yaxis(
        "商家A",
        [list(z) for z in zip(Faker.values(), Faker.choose())],
        label_opts=opts.LabelOpts(
            formatter=JsCode(
                "function(params){return params.value[1] +' : '+ params.value[2];}"
            )
        ),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Scatter-多维度数据"),
        tooltip_opts=opts.TooltipOpts(
            formatter=JsCode(
                "function (params) {return params.name + ' : ' + params.value[2];}"
            )
        ),
        visualmap_opts=opts.VisualMapOpts(
            type_="color", max_=150, min_=20, dimension=1
        ),
    )
)
c.renderk()
6.2.9 中国地图

from pyecharts.charts import Map
c = (
    Map()
    .add("淘宝618", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Map-VisualMap(连续型)"),
        visualmap_opts=opts.VisualMapOpts(max_=200),
    )
)

c.render()
6.2.9.1 中国局部地图
c = (
    Map()
    .add("商家A", [list(z) for z in zip(Faker.guangdong_city, Faker.values())], "广东")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Map-广东地图"),
        visualmap_opts=opts.VisualMapOpts(),
    )
)

c.render()
6.2.9.2 世界地图

c = (
    Map()
    .add("商家A", [list(z) for z in zip(Faker.country, Faker.values())], "world")
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
    	# 标签设置
    	label_opts = opts.LabelOpts(is_show=False)
        title_opts=opts.TitleOpts(title="Map-世界地图"),
        visualmap_opts=opts.VisualMapOpts(max_=200),
    )
)

c.render()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据分析笔记 的相关文章

随机推荐

  • 字符串表达式校验&求值(C#实现) - 附代码

    一 参考文献 严蔚敏 数据结构 C语言版 二 功能演示 1 测试例子 2 测试结果 三 对表达式进行校验 怎么对输入的字符串表达式进行校验呢 1 对表达式按操作符进行拆分 返回一个字符串数组 代码 private static string
  • Oracle数据库删除重复数据

    Oracle数据库中如何删除重复数据 第一种情况 部分字段重复数据的删除 先查询出那些数据是重复的 select 字段1 字段2 count from 表名 group by 字段1 字段2 having count gt 1 将上面的大于
  • TIA博途S7-1200学习笔记——指令集

    目录 1 位逻辑运算操作 1 1 常开触点 1 2 常闭触点 1 3 取反触点 1 4 线圈 1 5 赋值取反 1 6 复位输出 1 7 置位输出 1 8 置位位域 1 9 复位位域 2 10 SR置位 复位触发器 1 11 RS复位 置位
  • 【activiti】网关

    activiti网关 网关是用来控制流程的走向的 1 排他网关 ExclusiveGateway 1 1 什么是排他网关 排他网关 用来在流程中实现决策 当执行到这个网关时 会根据判断条件去选择执行某一条分支 注意 排他网关只会选择一个为t
  • 5.5_数据的存储和排列

    文章目录 一 大小端模式 二 边界对齐 在这个小结中 我们要探讨的是 数据的存储和排列 一 大小端模式 首先来看一个之前提到过的问题 叫做大小端模式 我们在内存里经常会存储某一些多字节的数据 比如 c 语言里的 Int 型变量 在很多时候占
  • renren-fast 快速开发 Web 管理平台

    什么是 renren fast renren fast 是一个 Java 的开源项目 只需要对它进行简单修改 就能够应用到自己的项目中 大大简化开发流程 缩短开发周期 renren fast 是一个前后端分离开发的项目 前端基于 vue e
  • 算法之动态规划理论

    目录 前言 一个模型三个特征理论讲解 1 最优子结构 2 无后效性 3 重复子问题 一个模型三个特征实例剖析 两种动态规划解题思路总结 1 状态转移表法 2 状态转移方程法 四种算法思想比较分析 总结 参考资料 前言 本篇博文主要讲解动态规
  • 一步一步详解LSTM网络【从RNN到LSTM到GRU等,直至attention】

    一步一步详解LSTM网络 从RNN到LSTM到GRU等 直至attention 0 前言 1 Recurrent Neural Networks循环神经网络 2 The Problem of Long Term Dependencies长期
  • 直接理解转置卷积(Transposed convolution)的各种情况

    使用GAN生成图像必不可少的层就是上采样 其中最常用的就是转置卷积 Transposed Convolution 如果把卷积操作转换为矩阵乘法的形式 转置卷积实际上就是将其中的矩阵进行转置 从而产生逆向的效果 所谓效果仅仅在于特征图的形状
  • Word模板引擎poi-tl

    文章目录 方案对比 版本 特性 模板 数据 输出 数据模型 标签 1 文本 2 图片 3 表格 4 列表 5 嵌套 6 区块对 SpingEL 2 单系列图标 3 多系列图标 4 组合图表 配置 1 标签前后缀 2 标签类型 3 标签匹配值
  • vlc源码编译android最新版2020年9月份记录

    经过几天研究终于在2020 9 25早上编译出安卓版本的vlc for android的so文件了 此时源码指定gradle是6 1 1版本的 主要参考都是百度上面的 你们也能百度到 这里就不引用了 重点 1 参考vlc官方编译过程 htt
  • 激光扫描测量点模拟(Matlab源码)

    本文提供了一个模拟环境 模拟激光束打到物体表面上的点及地面点 可以设置激光范围 分辨率 物体位置 大小及旋转 近期需要分析激光扫描仪在物体的背景上产生的遮挡 没找到合适的环境 自己用Matlab写了一个 原理不难 但细节的东西挺多 本以为一
  • 【达内课程】DataInputStream、DataOutputStream用法

    文章目录 简介 DataOutputStream DataInputStream 栗子1 写入数据 栗子2 读取 栗子3 保存学生信息 简介 在 io 包中 提供了两个与平台无关的数据操作流 数据输出流 DataOutputStream 数
  • C语言语法笔记

    C语言语法笔记 C 语言教程 网道 wangdoc com C 语言教程 菜鸟教程 runoob com 文章目录 C语言语法笔记 一 关键字 32 二 预编译指令 三 流程控制 3 1 顺序结构 3 2 循环结构 3 3 条件结构 四 变
  • OpenStack--镜像制作

    通过 KVM 安装虚 Centos 和 Windwos 2008 R2 x86 64 操作系统步骤并将磁盘文件作为镜像上传到 openstack glance 作为批量创建虚拟机的镜像文件 其中 windowsn 2008 安装 virti
  • 产品开发项目中文档的重要性

    现在 很多人认为写文档是一件苦差使 特别是研发人员 觉得写文档是一种浪费 和产品开发工作没有太大关系 更愿意把写文档的时间用来写代码画图纸 实际上 一个成功完整的产品开发项目 最终产出的不只是可交付的实际产品 还包括产品开发过程中的文档 以
  • Slim-neck by GSConv:自动驾驶车辆检测器架构的更好设计范式(文末附代码)

    Slim neck by GSConv 自动驾驶车辆检测器架构的更好设计范式 摘要 引言 相关工作 本文方法 GSConv的优势在于轻量级检测器 这些检测器通过添加DSC层和Shuffle来增加非线形表达能力 但是 如果GSConv在模型的
  • 用遗传算法求解TSP问题

    原文链接 http blog 5long me 2015 genetic algorithm on tsp 遗传算法简介 关于遗传算法 首先看一段维基百科的解释 遗传算法是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法 它借鉴了达尔
  • elementUI的自定义主题

    elementUI的自定义主题的设置 一 安装elementUI以及sass loader node sass 项目中使用scss编写需要依赖的插件 npm i element ui S npm i sass loader D npm i
  • 数据分析笔记

    数据分析 1 不同数据格式读取 mysql数据操作 text文件操作 json文件操作 csv文件操作 excel文件操作 1 1 mysql 数据操作 pip intall pymysql import pymysql pymysql c