数据挖掘零基础入门

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
    在这里插入图片描述
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值