数据挖掘基础day01
1.jupyter notebook的使用
两种模式下的通用快捷键
Shift+Enter ,执行本单元代码,并自动跳转到下一个cell
Ctrl+Enter,执行本单元代码,并留在本cell中
cell行号前面的*号,代表本cell正在运行
命令模式
按Esc进入命令模式
Y,切换到代码模式
M,切换到Markdown模式
A,在本cell前添加一个单元格
B,在本cell后添加一个单元格
双击D,删除本单元格
Z,回退
编辑模式
按Enter进入编辑模式
多光标操作:ctrl键点击鼠标
回退:ctrl+z
补全代码:Tab
注释:ctrl+/
屏蔽输出结果:在输出结果前双击
2. Matplotlib
专门用于2D画图
能将数据进行可视化,帮助理解数据。
2.1实现一个简单的画图
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure()
plt.plot([1, 0, 9], [4, 5, 6])
plt.show()
2.2Matplotlib三层结构
1)容器层
画板层Canvas
画布层Figure
绘图区/坐标系 x、y轴区域
2)辅助显示层 辅助信息显示,如网格线等
3)图像层 画不同类型的图,如柱状图,折线图等
2.3折线图绘制
2.3.1Matplotlib.pyplot模块
#画图三步走
# 创建画布
plt.figure()
# 绘制图像
plt.plot([1,2,3,4,5,6,7], [17,17,18,15,11,11,13])
# 显示图像
plt.show()
2.3.2设置画布属性与图片保存
plt.figure(figsize=(),dpi=)
figsize:指定图的长宽
dpi:图像的清晰度
返回fig对象
2.3.2.1图片保存
plt.savefig(路径)注意:要在plt.show前使用,因为plt.show会释放figure资源
2.3.3修改x,y刻度
Matplotlib不显示中文解决办法
只需要加入两行代码即可
import matplotlib
matplotlib.rc('font', family='FangSong')
Matplotlib不显示负号解决办法
plt.rcParams['axes.unicode_minus'] = False
# 需求:画出某城市11点到12点的温度变化
import random
#准备数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
#创建画布
plt.figure(figsize=(20,8),dpi = 80)
#绘制图像
plt.plot(x,y_shanghai)
#添加x、y刻度
# 准备x的刻度说明
x_lable = ["11点{}分".format(i) for i in x]
plt.xticks(range(0,60,5),x_lable[::5])
plt.yticks(range(0,40,5))
#显示图像
plt.show()
2.3.4添加网格显示
plt.grid(True,linestyle=’–’,alpha=0.5)
True:是否添加网格 默认为True
linestyle:网格风格
alpha:透明度
#添加网格显示
plt.grid(True,linestyle='--',alpha=0.5)
2.3.5添加描述信息
#添加描述徐信息
plt.xlabel("时间变化")
plt.ylabel("温度变化")
plt.title("某城市11点-12点温度变化")
2.3.6多个图像绘制
# 需求:画出某城市11点到12点的温度变化
import random
#准备数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
y_beijing=[random.uniform(1,3) for i in x]
#创建画布
plt.figure(figsize=(20,8),dpi = 80)
#绘制图像
plt.plot(x,y_shanghai,color='r',linestyle='-.',label='上海')
plt.plot(x,y_beijing,color='b',label="北京")
#显示图例
plt.legend() *也可以使用loc参数改变图例的位置
#添加x、y刻度
# 准备x的刻度说明
#添加网格显示
plt.grid(True,linestyle='--',alpha=0.5)
#添加描述徐信息
plt.xlabel("时间变化")
plt.ylabel("温度变化")
plt.title("上海、北京11点-12点温度变化")
plt.xticks(range(0,60,5))
plt.yticks(range(0,40,5))
#显示图像
plt.show()
2.3.7多个坐标系显示图像
fragure,axes = plt.subplots(nows=1,ncols=1,**frags)
nows:几行
ncols:几列
会返回画布和画图区对象
axes[0]代表第一个图像 使用axes.方法名 使用
axes[1]代表第二个图像
以此类推
import random
#准备数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
y_beijing=[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_shanghai,color='r',linestyle='-.',label='上海')
axes[1].plot(x,y_beijing,color='b',label="北京")
#显示图例
axes[0].legend()
axes[1].legend()
#添加x、y刻度
# 准备x的刻度说明
#添加网格显示
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("上海11点-12点温度变化")
axes[1].set_xlabel("时间变化")
axes[1].set_ylabel("温度变化")
axes[1].set_title("北京11点-12点温度变化")
axes[0].set_xticks(range(0,60,5))
axes[0].set_yticks(range(0,40,5))
axes[1].set_xticks(range(0,60,5))
axes[1].set_yticks(range(0,40,5))
#显示图像
plt.show()
2.3.8折线图应用场景
某事物或某指标随时间的变化状况
还可以画各种数学函数图像
# 绘制数学函数图像
# 准备数据
import numpy as np
x = np.linspace(-10,10,1000)
y = 2 * x * x
plt.figure(figsize=(20,8),dpi = 80)
plt.grid(linestyle='-.',alpha=0.5)
plt.plot(x,y)
plt.show()
2.4散点图
import matplotlib.pyplot as plt
#散点图
#准备数据
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,
163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,
21.61, 483.21, 245.25, 399.25, 343.35]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34,
140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,
30.74, 400.02, 205.35, 330.64, 283.45]
#创建画布
plt.figure(figsize=(20,8),dpi = 80)
#绘制图像
plt.scatter(x,y)
#显示图像
plt.show()
2.5柱状图
#绘制票房分布直方图
#准备数据
movie_names = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
tickets = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
#窗间画布
plt.figure(figsize=(20,8),dpi = 80)
#绘制图像
plt.bar(range(len(movie_names)),tickets,color=['b','r','g','y','c','m','y','k','c','g','b'])
# 一定要先写x,y坐标再写color等其他信息
#修改x刻度
plt.xticks(range(len(movie_names)),movie_names)
plt.title('票房数据')
plt.grid(linestyle="-",alpha=0.5)
#显示图像
plt.show()
2.5.1如何实现首日数据和首周数据的显示
# 准备数据
movie_name = ['雷神3:诸神黄昏','正义联盟','寻梦环游记']
first_day = [10587.6,10062.5,1275.7]
first_weekend=[36224.9,34479.6,11830]
#创建画布
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="首周票房") #width 控制柱子的宽度
#修改x刻度
plt.xticks([0.1,1.1,2.1],movie_name)
plt.legend() #要配合绘制图像中的label使用
#显示图像
plt.show()
2.6直方图
# 需求:电影时长分布状况
# 1、准备数据
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)
#绘制直方图
plt.hist(time,(max(time)-min(time))//2) #组数等于极差/组距
plt.xticks(range(min(time),max(time)+2,2))
plt.grid(linestyle='-',alpha=0.5)
#显示图像
plt.show()
注意点
画图的时候注意组距的设置
2.7饼图
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="%.2f%%") #在pie的api中plt.pie(x,labels=,colors,autopct=) x:填入数字即可,pie会自动计算百分比
plt.axis('equal') #设置图形好像 圆圆的且居中
plt.legend()
plt.show()
3numpy
高效的运算工具
Numpy提供了一个N维数组类型ndarray,他描述了相同类型的“items”的集合。
ndarray
属性
shape
ndim
size
dtype
itemsize
形状
方法
生成数组的方法
生成0和1的数组
np.zeros(shape)
np.ones(shape)
从现有数组中生成
np.array()
np.asarray()深拷贝
np.copy()浅拷贝
生成固定范围的数组
np.linspace(0,10,1000) 生成[0,10]之间1000个元素,且等距离
np.arange(0,10,1) 生成[0,10)步长为1 的数组
生成随机数组
均匀分布:每组的可能性相同
np.random.uniform(low=-1,high=1,size=1000000)
正态分布:
np.random.normal(loc=1.75,scale=0.1,size=10000) loc:均值,scale:方差,size:大小
数组的索引和切片
[0,:3] :3代表从0-3的数据
形状修改
ndarray.reshape(shape) 返回新的ndarray, 原始数据没有改变,且reshape并没有把行列互换,只是把原有数据重新切割,分成shape形状
ndarray.resize() 没有返回值, 对原始的ndarray进行了修改,且reshape并没有把行列互换,只是把原有数据重新切割,分成shape形状
ndarray.T 转置 行变成列,列变成行 返回一个ndarray,原数据未改变
类型修改
ndarray.astype(type)
ndarray序列化到本地
ndarray.tostring()
数组去重
ndarray.unique()
ndarray运算
逻辑运算
布尔索引
通用判断函数
np.all(布尔值) 只要有一个FALSE就返回FALSE,只有全是True才返回True
np.any(布尔值)只要有一个True就为True,只有全是FALSE才返回FALSE
三元运算符
np.where(三元运算符)
np.where(布尔值,True的值,False的值)
涉及符合逻辑需要额外的函数logical_and/or
大于0.5且小于1
np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)
大于0.5或小于-0.5
np.where(np.logical_or(temp > 0.5, temp < -0.5), 11, 3)
统计运算
统计指标函数
min,max,mean,median,var,std
np.函数名()
ndarray.方法名()
返回最大值最小值位置
np.argmax(tem,axis=0)
np.argmin(tem,axis=0)
数组间运算
ndarray数组与数的运算
正常的运算即可 加减乘除等
数组与数组的运算
数组与数组行列不同时,直接运算会出错
广播机制
执行broadcast的前提在于,两个nadarray执行的是element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray(numpy库的核心数据结构)进行数学运算。
当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有在下述情况下,两个数组才能够进行数组与数组的运算。
- 维度相等
- shape(其中相对应的一个地方为1)
在根据广播机制修改后,便可以运算了
矩阵运算
两种方法存储矩阵:
- np.ndarray()
- np.mat()
矩阵乘法:
如果矩阵使用ndarray存储的话,可以用:
- np.matmul()
- np.dot()
如果矩阵用mat存储,可以直接用运算符“*”来进行运算
如果ndarray想用“*”来进行运算,用@符号即可 eg:a @ b得到的结果便是a矩阵和b矩阵相乘的结果
数组的合并
np.hstack() 水平拼接
np.vstack() 竖直拼接
np.concatenate((a,b,c,…),axis=0/1) 若axis为0,竖直拼接,axis=1为水平拼接
数组的分割
np.split()
IO操作与数据处理
会遇到有缺失值的情况,有两种处理情况:
- 把含有缺失值得数据删除掉
- 若数据量少,可以使用插补法,求某一列平均值或中位数等
但是在numpy中处理很麻烦,所以使用pandas
Pandas
优势:
便捷的数据处理能力
读取文件方便
封装了Matplotlib和numpy
核心数据结构
DataFrame
既有行索引,又有列索引的二维数组。
创建索引,并修改行索引index和列索引columns
DataFrame属性
shape:形状
index:行索引列表
columns:列索引列表
values:得到原始的ndarray数据
T:转置
方法
head():默认显示前五行,但也可以指定前几行
tail():显示数据的最后五行
DataFrame索引的设置
-
修改行列索引值
不可以单独修改,必须整体修改
-
重设索引
-
设置新索引
MultiIndex与Panel
multiindex属性:
Panel:存储三维结构的容器
pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None,copy=False,dtype=None)
items - axis 0,每个项目对应于内部包含的数据帧(DataFrame)。
major_axis - axis 1,它是每个数据帧(DataFrame)的索引(行)。
minor_axis - axis 2,它是每个数据帧(DataFrame)的列。
Pandas从版本0.20.0开始弃用,推荐的用于表示3D数据的方法是DataFrame上的MultiIndex方法
p = pd.Panel(np.arange(24).reshape(4,3,2),
items=list('ABCD'),
major_axis=pd.date_range('20130101', periods=3),
minor_axis=['first', 'second'])
p["A"]
p.major_xs("2013-01-01")
p.minor_xs("first")
###由于panel是三维数据,因此只能从某一个维度切入,可以理解为从立方体中抽出一个平面(dataframe)观察,则上面三行代码结果如下图;而series则是相当于从平面(dataframe)中抽出一行或一列来观察
series
带索引的一维数组
属性
index
values
总结:DataFrame 是series的容器,Panel是DataFrame的容器
基本数据操作
索引操作
-
直接索引
-
按名字索引
-
按数字索引
-
组合索引
数字和名字混用
# 获取行第1天到第4天,['open', 'close', 'high', 'low']这个四个指标的结果
data.ix[:4, ['open', 'close', 'high', 'low']] # 现在不推荐用了
###但仍可利用loc和iloc
data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]
赋值操作
排序操作
- 对内容进行排序
dataframe
series
- 对索引进行排序
dataframe
series
DataFrame运算
算术运算
逻辑运算
逻辑运算符
逻辑运算函数
query()
isin()
统计运算
describe()
将返回关于列的最值,均值,方差等多种信息
累计统计函数
cumsum 计算前1/2/3/…/n个数的和
cummax 计算前1/2/3/…/n个数的最大值
cummin 计算前1/2/3/…/n个数的最小值
cumprod 计算前1/2/3/…/n个数的积
自定义运算
apply(func, axis=0)
func: 自定义函数
axis=0: 默认按列运算,axis=1按行运算
Pandas画图
pandas.DataFrame.plot
DataFrame.plot(x=None, y=None, kind=‘line’)
x: label or position, default None
y: label, position or list of label, positions, default None
Allows plotting of one column versus another
kind: str
‘line’: line plot(default)
''bar": vertical bar plot
“barh”: horizontal bar plot
“hist”: histogram
“pie”: pie plot
“scatter”: scatter plot
文件的读取与存储
CSV
读取 CSV
pd.read_csv(path,usecols,names)
存储CSV
DataFrame.to_csv()
path_or_buf :string or file handle , default None
sep : character, default ‘,’(分隔符)
columns :sequence,optional 一般填入列表
mode:'w‘:重写,'a’追加
index:是否写入 行索引
header:boolean or list of string,default True,是否写进列索引值
HDF5
hdf5可以存储三维数据
HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame,也就是说hdf5存储的是panel这种三维类型,一个key对应一个dataframe
pandas.read_hdf(path_or_buf, key=None, kwargs)
从h5文件当中读取数据
path_or_buffer: 文件路径
key: 读取的键
mode: 打开文件的模式
reurn: The Selected object
DataFrame.to_hdf(path_or_buf, key, kwargs)
注:如果一个文件有两个key,在读取的时候要指定键,否则会报错
JSON
pandas.read_json(path_or_buf=None,orient=None,typ=“frame”,lines=False)
将JSON格式转换成默认的Pandas DataFrame格式
- orient: string,Indication of expected JSON string format.
‘split’: dict like {index -> [index], columns -> [columns], data -> [values]}
‘records’: list like [{column -> value}, …, {column -> value}] 一般都用这个
‘index’: dict like {index -> {column -> value}}
‘columns’: dict like {column -> {index -> value}}, 默认该格式
‘values’: just the values array
- lines: boolean, default False 作用:是否按行读取文件
按照每行读取json对象
- typ: default ‘frame’,指定转换成的对象类型series或者dataframe
dataframe.to_json("./test.json",orient=“records”,lines=True)
Pandas高级処理
缺失值处理
如何进行缺失值处理?
- 删除含有缺失值的样本
- 替换/插补数据
如何处理NaN?
第一步:判断数据中是否存在NaN
pd.isnull(df)
pd.notnull(df)
第二步:删除含有缺失值的样本
df.dropna(inplace=True/False) 默认按行删除
替换插补
df.fillna(value,inplace=True/False)
inplace如果想原位置修改的话就是True,如果想返回一个新的df就用False,默认为False
如何处理不是NaN缺失值的?
读取数据
path = “wisconsin.data”->参数可以直接是一个网址
name = [“Sample code number”, “Normal Nucleoli”,“Mitoses”, “Class”]
data = pd.read_csv(path, names=name)
#这里的非nan标记值缺失值就是利用“?”表示的,因此利用参数to_replace,value=np.nan,将默认标记值替换为nan值,然后再利用前面方法处理nan缺失值
替换
data_new = data.replace(to_replace="?", value=np.nan)
数据离散化
one-hot编码(哑变量)
分组
自动分组 pd.qcut(data,bins)
自定义分组 pd.cut(data,[])
分好组以后 返回series
转换为one-hot编码
pd.get_dunmmies(sr,prefix=)
合并
按方向拼接
pd.concat([data1,data2],axis = )
按索引进行拼接(与数据库中的内外连接,左连接,右连接一起学习)
pd.merge(left,right,how=“inner”,on=[索引]) how可以选择left,right,inner,outer
交叉表和透视表
交叉表
data = pd.crosstab(stock[“week”], stock[“pona”])
探索两个变量之间的关系
透视表
stock.pivot_table([“pona”], index=[“week”])相对于交叉表操作简单些
分组与聚合
分组与聚合(聚合一般是统计函数)通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况
- dataframe
- series