一、数据挖掘基础
1.1、数据挖掘基础环境安装
# 使用conda创建新的虚拟环境
# requirements.txt
matplotlib==2.2.2
numpy==1.14.2
pandas==0.20.3
TA-Lib==0.4.16 # 技术指标库
tables==3.4.2 # hdf5
jupyter==1.0.0 # 数据分析与展示的平台
# 执行命令 pip install -r requirements.txt
# pip list 查看已安装列表
# TA-Lib安装报错,https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib 下载
1.2、Jupyter Notebook
1.2.1、介绍
-
一个支持跨所有编程语言的交互式数据科学计算工具
-
web版的ipython
-
编程、写文档、记笔记、展示
-
.ipynb文件格式
-
交互式运行环境
-
为什么使用Jupyter Notebook
1.2.2、快速使用
二、Matplotlib画图
2.1、Matplotlib简介
-
什么是Matplotlib
-
为什么要学习Matplotlib
- 数据可视化
- 可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法
- 能将数据进行可视化,更直观的呈现
- 是数据更客观、更具说服力
- 更炫酷的可视化
-
Matplotlib快速上手
import matplotlib.pylab as plt
%matplotlib inline
plt.figure() # 画布
plt.plot([1,0,9], [4,5,6]) #([x1,x2,x3],[y1,y2,y3])
plt.show() # 展示
2.2、Matplotlib三层结构
- 容器层
- 画板层(Canvas)
- 画布(Figure):plt.figure()
- 绘图区(坐标系):plt.subplots()
- 辅助显示层
- 图像层
2.3、折线图
2.3.1、折线图绘制与保存图片
-
matplotlib.pyplot模块
import matplotlib.pylab as plt
-
折线图的绘制与显示
# 展示上海一周的天气
# 创建画布
plt.figure()
# 绘制图像
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,12])
# 显示图像
plt.show()
-
设置画布属性
plt.figure(figsize(), dpi=)
# figsize:指定图的长宽
# dpi:图像的清晰度
# 返回fig对象
# 例:plt.figure(figsize=(20,8),dpi=80)
-
图片保存
# plt.savefig("test.png")
# 保存图片需要在show()之前
2.3.2、完善原始折线图1(辅助显示层)
-
准备初始折线图
# 需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
# 准备数据 x,y
import random
x = range(60)
y_sh = [random.uniform(15,18) for i in x]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y_sh)
plt.show()
-
添加自定义刻度
plt.xticks(x, **kwargs)
plt.yticks(y, **kwargs)
# x,y: 要显示的刻度值
# 例如
# 修改x轴刻度值
x_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5], x_label[::5])
# 修改y轴刻度值
plt.yticks(range(0,40,5))
-
添加网格显示
# 添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# grid(是否添加网格,linestyle风格 -- 虚线,透明度)
-
添加描述信息
# 添加描述信息
plt.xlabel("时间变化")
plt.ylabel("温度变化")
plt.title("某城市温度变化情况图")
-
中文不显示问题
-
原因:matplotlib不包含中文字体
-
解决:
-
安装字体
-
删除mapplotlib缓存文件
-
配置文件
-
查看配置文件路径
import matplotlib
matplotlib.matplotlib_fname()
-
# 配置文件增加内容
font.family : Microsoft YaHei, sans-serif
font.serif: Microsoft YaHei, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
-
# C:\Windows\Fonts\Microsoft YaHei UI下的字体 复制到
# matplotlib根目录\mpl-data\fonts\ttf
2.3.3、完善原始折线图2(图像层)
-
多个plot
# 添加一个城市的温度变化
# y轴数据
y_bj = [random.uniform(1,3) for i in x]
# 添加图像
plt.plot(x, y_bj)
-
修改图像
# color 颜色
# linestyle 风格
plt.plot(x, y_bj, color = "b", linestyle="--")
颜色字符 |
风格字符 |
r 红色 |
- 实线 |
g 绿色 |
– 虚线 |
b 蓝色 |
-. 点划线 |
w 白色 |
: 点虚线 |
c 青色 |
’ ’ 留空、空格 |
m 洋红 |
|
y 黄色 |
|
k 黑色 |
|
-
图例
plt.plot(x, y_bj, color = "b", linestyle="--", label = "北京")
# 显示图例
plt.legend()
2.3.4、多个坐标系显示-plt.subplots(面向对象的画图方法)
# 需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
# 准备数据 x,y
import random
x = range(60)
y_sh = [random.uniform(15,18) for i in x]
y_bj = [random.uniform(1,3) for i in x]
# 画布
# plt.figure(figsize=(20,8),dpi=80)
figure, axes = plt.subplots(nrows=1,ncols=2,figsize=(20, 8), dpi=80)
axes[0].plot(x,y_sh, label="上海")
axes[1].plot(x, y_bj, color = "b", linestyle="--", label = "北京")
# 修改x轴刻度值
x_label = ["11点{}分".format(i) for i in x]
axes[0].set_xticks(x[::5], x_label[::5])
# 修改y轴刻度值
axes[0].set_yticks(range(0,40,5))
axes[1].set_xticks(x[::5], x_label[::5])
axes[1].set_yticks(range(0,40,5))
# 添加网格显示
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)
# 添加描述信息
axes[0].set_xlabel("时间变化")
axes[0].set_ylabel("温度变化")
axes[0].set_title("上海温度变化情况图")
axes[1].set_xlabel("时间变化")
axes[1].set_ylabel("温度变化")
axes[1].set_title("北京温度变化情况图")
# 显示图例
plt.legend()
plt.show()
2.3.5、折线图的应用场景
-
呈现公司产品(不同区域)每天活跃用户数
-
呈现app每天下载量
-
呈现产品新功能上线后,用户点击次数随着时间的变化
-
拓展:画各种数学函数图像
import matplotlib.pylab as plt
import numpy as np
# 准备x,y数据
x = np.linspace(-10,10,1000) # 生成-1到1之间等距离的1000个数据
y = np.sin(x)
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
plt.grid(linestyle='--')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvxvxlQg-1661236390017)(.\image\sin函数曲线.png)]
2.4、散点图
2.4.1、常见图形虫类及意义
- 折线图(plot)
- 以折线的上升或下降来表示统计数量的增减变化的统计图
- 特点:能够显示数据的变化趋势,反应事物的变化情况(变化)
- 散点图(scatter)
- 用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式
- 特点:判断变量之间是否存在数量的关联趋势,展示离群点(分布规律)
- 柱状图(bar)
- 排列在工作表的列或行中的数据可以绘制到柱状图中
- 特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别(统计/对比)
- 直方图(histogram):
- 由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况
- 特点:绘制连续性的数据展示一组或者多组数据的分布情况(统计)
- 饼图(pie):
- 用于表示不同分类的占比情况
- 特点:分类数据的占比情况
2.4.2、散点图绘制
# 探究房屋面积和房屋价格的关系
x = [1,2,3,4,5,6]
y = [7,8,9,10,11,12]
# 创建画布
plt.figure(figsize=(20,8),dpi=80)
# 绘制图像
plt.scatter(x,y)
# 显示图像
plt.show()
2.5、柱状图
2.5.1、柱状图绘制
# 对比电影票房收入
# 准备数据
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案']
tickets = [11111,22222,33333]
# 创建画布
plt.figure(figsize=(20,8),dpi=80)
# 绘制柱状图
plt.bar(movie_name, tickets,width=0.1)
# 显示图像
plt.show()
# 对比相同时间电影票房收入
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案']
first_day = [11111,22222,33333]
first_weekend = [22222,33333,44444]
# 创建画布
plt.figure(figsize=(20,8),dpi=80)
# 绘制柱状图
plt.bar(range(3), first_day,width=0.2,label='首日票房')
plt.bar([0.2,1.2,2.2], first_weekend,width=0.2,label='首周票房')
plt.legend()
plt.xticks([0.1,1.1,2.1],movie_name)
# 显示图像
plt.show()
2.6、直方图
2.6.1、直方图介绍
- 直方图,形状类似柱状图却有着与柱状图完全不同的涵义。直方图牵涉统计学的按年,首先要对数据进行分组,然后统计每个分组内数据元的数量。在坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图。
- 相关概念
- 组数:在统计数据时,我们把数据按照不同的范围分成几个组,分成的组的个数成为组数
- 组距:每一组两个端点的差
- 直方图与柱状图对比
- 直方图展示数据的分布,柱状图比较数据的大小
- 直方图X轴为定量数据,柱状图X轴为分类数据
- 直方图柱子无间隔,柱状图柱子有间隔
- 直方图柱子宽度可不一致,柱状图宽度需一致
2.6.2、直方图绘制
# 准备数据
time = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
plt.figure(figsize=(20,8),dpi=80)
# 组距
distance = 2
# 组数
group_num = int((max(time) - min(time)) / distance)
# 绘制直方图
plt.hist(time, bins=group_num,density=True)
# 刻度
plt.xticks(range(min(time),max(time) + 2,2))
# 网格
plt.grid(linestyle="--", alpha=0.5)
plt.show()
- 注意组距
- 注意Y轴所代表的变量可以是频次也可以是频率,通过density=True参数控制
2.6.3、直方图的应用场景
- 用于表示分布的情况
- 通过直方图还可以观察和估计哪些数据比较继承,异常或者孤立的数据分布在何处
2.7、饼图
2.7.1、饼图绘制
# 准备数据
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]
plt.figure(figsize=(20,8),dpi=80)
plt.pie(place_count,labels=movie_name,colors=['b','r','g','y','c','m','y','k','c','g','y'], autopct="%1.2f%%")
plt.show()
2.8、小结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IX3X2HkK-1661236390019)(.\image\image-20220822135930303.png)]
三、Numpy
3.1、Numpy介绍
3.1.1、Numpy是什么
3.1.2、ndarray介绍
- NumPy提供了一个N维数组类型ndarray,它描述了相同类型的”items“的集合
- 为什么使用ndarray存储数据
- 相对于python原生计算,ndarray运算效率大大提高
- ndarray的优势
- 存储风格
- ndarray :相同类型
- list: 不同类型 通用性较强
- 并行化运算
- 底层语言
- 底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于Python代码
3.1.3、ndarray属性
-
ndarray属性
属性名称 |
属性解释 |
示例 |
ndarray.shape |
数组维度的元组 |
(8, 5) 表示二维数组,8行5列 |
ndarray.ndim |
数组维度 |
|
ndarray.size |
数组中的元素数量 |
|
ndarray.itemsize |
一个数组元素的长度 |
|
ndarray.dtype |
数组元素的类型 |
|
-
ndarray的形状
-
ndarray的类型
- 创建ndarray时可通过dtype=np.float32参数指定类型
3.1.4、基本操作
-
ndarray.方法()
-
numpy.函数名()
-
生成数组的方法
-
生成0和1
# 生成0和1的数组
np.zeros(shape=(3,4))
np.ones(shape=(2,3),dtype=np.int32)
-
从现有数组中生成
# 深拷贝
data1 = np.array(score)
data3 = np.copy(score)
# 浅拷贝
data2 = np.asarray(score)
-
生成固定范围的数组
# 生成[-10,10]等距离的数组
np.linspace(-10,10,1000)
# 生成[a,b)范围c步长的数组
np.arange(a,b,c)
-
生成随机数组
-
均匀分布
- 均匀分布(Uniform Distribution) 是概率统计中的重要分布之一。均匀表示可能性相等的含义
# np.random.uniform(low,high,size)
x = np.random.uniform(-1,1,size=100000)
-
正态分布
- 正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值。第二个参数σ是此随机变量的标准差,所以正态分布记作N(μ,σ)
- 正态分布的特点
- μ决定了其位置,标准差σ决定了分布的幅度。当μ=0,σ=1时的正态分布是标准正态分布
- σ 幅度、稳定性、波动程度、集中程度、离散程度
# np.random.normal(loc=μ,scale=σ,size)
x2 = np.random.normal(loc=1.75,scale=0.1,size=10000)
-
数组的索引、切片
-
案例:随机生成8只股票2周的加以日涨幅数据
# 案例:随机生成8只股票2周的加以日涨幅数据
stock_change = np.random.normal(loc=0,scale=1,size=(8,10))
# 前三日数据
# 切片
stock_change[0,:3]
a1[1,0,2]
-
形状修改
# ndarray.reshape(shape) 修改形状,数据排列未改变,不修改原始数据,返回新的ndarray
stock_change.reshape(10,8)
# ndarray.resize(shape) 修改形状,数据排列未改变,原始数据改变
stock_change.resize((10,8))
# ndarray.T 转置 行变列、列边行
-
类型修改
-
数组的去重
temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]]
np.unique(temp)
# 或者 flatten() 转一维数组
set(temp.flatten())
3.1.5、ndarray运算
-
逻辑运算
stock_change = np.random.normal(loc=0,scale=1,size=(8,10))
# 逻辑判断,如果涨跌幅>0.5就标记为True,否则为False
stock_change > 0.5
# 布尔值条件索引,操作统一条件的数据
stock_change[stock_change > 0.5]
# 条件修改
stock_change[stock_change > 0.5] = 1.1
-
通用判断函数
-
三元运算符
- np.where(布尔值,True的位置的值,False的位置的值)
# 前四个股票前四天的涨跌幅,大于0的置为1,否则为0
temp = stock_change[:4,:4]
np.where(temp > 0,1,0)
-
复合逻辑运算符
np.logical_and()
np.logical_or()
np.logical_and(temp > 0.5, temp < 1)
np.logical_or(temp > 1, temp < 0.5)
-
统计运算
-
统计指标函数(np.函数名())
-
返回最大值、最小值所在位置
- np.argmax(temp,axis=)
- np.argmin(temp,axis=)
-
数组间运算
-
数组与数的运算
arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
# 直接运算即可
arr + 1
arr / 10
-
数组与数组的运算
-
广播机制
- 执行broadcast的前提在于,两个ndarray执行的是element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray进行数学运算
- 当操作两个数组时,numpy会逐个比较他们的shape,只有符合下面条件之一,才能进行运算
- 维度相等(相同维度的元素个数相等)
- shape(其中相对应的一个地方为1)
-
矩阵运算
-
什么是矩阵
-
两种方法存储矩阵
-
矩阵乘法运算
-
形状
- (m行,n列) * (n行,l列) = (m行,l列)
-
运算规则
-
运算方法
- ndarray
- np.matmul(mat1,mat2)
- np.dot(mat1,mat2)
- mat
# ndarray存储矩阵
data = np.array([[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]])
# matrix存储矩阵
data_mat = np.mat([[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]])
weights = np.array([[0.3],[0.7]])
weights_mat = np.mat([[0.3],[0.7]])
np.matmul(data,weights)
np.dot(data,weights)
data @ weights
data_mat * weights_mat
3.1.6、其他
-
合并
-
numpy.hstack(tup) 水平拼接
-
numpy.vstack(tup) 垂直拼接
a = np.array([1,2,3])
b = np.array([2,3,4])
np.hstack((a,b))
np.vstack((a,b))
-
np.concatenate((a,b), axis=0) axis = 0 垂直拼接,axis = 1 水平拼接
-
分割
-
IO操作
- np.genfromtxt(“test.csv”,delimiter=“,”)
-
数据处理
四、Pandas
4.1、基础处理
4.1.1、Pandas简介
4.1.1.1、什么是Pandas
- pandas = panel + data + analysis
- panel 面板数据 -计量经济学 三维数据
- data数据
- analysis 分析
- 以Numpy为基础,接力Numpy模块在计算方面的优势
4.1.1.2、问什么使用Pandas
- 便捷的数据处理能力
- 读取文件方便
- 封装了matplotlib、Numpy进行画图和计算
4.1.2、核心数据结构
-
DataFrame
import pandas as pd
# 基本
pd.DataFrame(stock_change)
# 添加行、列索引
stock = ['股票{}'.format(i) for i in range(10)]
date = pd.date_range(start='20220101',periods=5,freq='B')
pd.DataFrame(stock_change,index=stock,columns=date)
-
属性
- shape :形状
- index:行索引
- columus:列索引
- values :ndarray
- T 转置
-
方法
-
DataFrame索引的设置
-
修改行列索引值
-
重设索引
# 不删除原索引
data.reset_index()
# 删除原索引
data.reset_index(drop=True)
-
设置新索引
df.set_index("month")
df.set_index("month",drop=False)
# 列表设置多个索引
new_df = df.set_index(["year","month"])
# new_df.index 类型是MultiIndex
-
MultiIndex
-
Panel
-
Series
-
小结
4.1.3、基本操作
4.1.3.1、索引操作
-
直接索引
# 直接索引
data = pd.read_csv("./stock_day.csv")
data["open"]["2018-02-27"] # 先列后行
-
按名字索引
data.loc["2018-02-27"]["open"]
data.loc["2018-02-27","open"]
-
按数字索引
data.iloc[1,0]
-
组合索引
data.ix[] 已经废弃
# 通过数字获取名字索引,再通过名字索引方法获取
data.loc[data.index[i],['open','name']]
# 通过名字获取索引数字,再用数字索引方法
data.iloc[0,data.columns.get_indexer(['open','name'])]
4.1.3.2、赋值操作
data['open'] = 100
4.1.3.3、排序
-
内容排序(dataframe)
# 按某字段排序
data.sort_values(by='high',ascending=False)
# 按多个字段排序
data.sort_values(by=['high','p_change'],ascending=False
-
索引排序(dataframe)
data.sort_index()
-
Series排序
data.sort_values()
data.sort_index()
4.1.4、运算
-
算数运算
-
逻辑运算
-
统计运算
-
min
-
max
-
mean 平均值
-
median
-
var
-
std
-
describe()
-
axis=1 按行,默认axis=0 按列
-
idmax() 最大值索引
-
idmin() 最小值索引
-
累计统计函数
-
cumsum 计算前1/2/3/4…/n个数的和
-
cummax 计算前1/2/3/4…/n个数的最大值
data['p_change'].cummax()
-
cummin 计算前1/2/3/4…/n个数的最小值
-
cumprod 计算前1/2/3/4…/n个数的积
-
自定义运算
4.1.5、画图
- pandas.Data.Frame.plot
- DataFram.plot(x=None,y=None,kind=‘line’)
- x:
- y:
- kind: str
- line 折线图
- bar 柱状图
- barh
- hist 直方图
- pie 饼图
- scatter 散点图
4.1.6、文件的读取与存储
4.1.6.1、CSV
4.1.6.2、HDF5
- 二进制文件
- 存储三维数据
- 读取hdf5文件
- pandas.read_hdf(path_or_buf, key = None, **kwargs)
- path_or_buf 文件路径
- key:读取的键
- mode:打开模式
- return
- 保存hdf5文件
- HDF5的优势
- 支持压缩,使用的方式是blosc,这个是速度最快也是pandas默认支持的
- 使用压缩可以提高磁盘利用率,节省空间
- 跨平台,可以轻松迁移到hadoop上
4.1.6.3、JSON
-
读取
-
pd.read_json(path,orient=‘records’,lines=True)
- orient=‘records’
- lines 按行读取
-
sa = pd.read_json('./Sarcasm_Headlines_Dataset.json',orient='records',lines=True)
-
存储
- df.to_json(path,orient=‘records’,lines=True)
4.2、高级处理
4.2.1、缺失值处理
4.2.1.1、如何处理缺失值
-
思路
-
如何处理nan
-
缺失值不是nan,有默认标记的情况
- 替换 ? -> np.nan
- df.replace(to_replace=‘?’,value=np.nan)
4.2.2、数据离散化
4.2.2.1、什么是数据的离散化
- 连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或者整数值代表落在每个子区间中的属性值
4.2.2.2、为什么要离散化
- 连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具
4.2.2.3、如何实现数据的离散化
-
分组
-
自动分组 sr = pd.qcut(data, bins)
-
data 数据
-
bins 组数
-
# 准备数据
data = pd.Series([165,174,160,180,159,163,192,184], index=['No1:165', 'No2:174','No3:160', 'No4:180', 'No5:159', 'No6:163', 'No7:192', 'No8:184'])
sr = pd.qcut(data,3)
pd.get_dummies(sr, prefix='height')
-
自定义分组 sr = pd.cut(data, [])
-
[] 分组区间列表
bins = [150,165,180,195]
sr2 = pd.cut(data,bins)
pd.get_dummies(sr2,"身高")
-
sr.value_counts()
-
将分组好的结果转换成one-hot编码
- pd.get_dummies(sr, prefix=)
4.2.3、合并
-
按方向拼接
- pd.concat([data1,data2],axis=0) 0:数值拼接,1 水平拼接
-
按索引拼接
-
pd.merge(left, right, how=‘inner’, on[索引])
# 内连接
pd.merge(left, right, on=['key1','key2']) # 默认how = 'inner'
# 左连接
pd.merge(left, right, on=['key1','key2'],how='left')
# 右连接
pd.merge(left, right, on=['key1','key2'],how='right')
# 外连接
pd.merge(left, right, on=['key1','key2'],how='outer')
4.2.4、交叉表与透视表
-
作用
-
使用crosstab(交叉表)实现
-
pd.crosstab(value1,value2)
data = pd.crosstab(stock['weekday'],stock['pona'])
data.div(data.sum(axis=1),axis=0).plot(kind='bar',stacked=True)
-
使用pivot_table(透视表)实现
pivot_table(data, index=)
# 透视表
stock.pivot_table(['pona'],index=['weekday'])
4.2.5、分组与聚合
-
什么是分组与聚合
-
分组API
-
#星巴克数据读取
sbs = pd.read_csv('directory.csv')
# 按国家分组
sbs.groupby(by='Country').count()['Brand'].sort_values(ascending=False)[:10].plot(kind='bar',figsize=(20,8))
# 按国家、城市分组
sbs.groupby(by=['Country','City']).count()
4.2.6、综合案例
# 需求:
# 准备数据