数据可视化:是关于数据视觉表现形式的科学技术研究。其中,这种数据的视觉表现形式被定义为“一种以某种概要形式抽提出来的信息,包括相应信息单位的各种属性和变量”。
数据可视化主要是借助于图形化手段,清晰有效地传达与沟通信息。
Power BI、Tableau、Gehpi和Echarts
Python是一个结合了 解释性、编译性、互动性和面向对象 的高级程序设计语言,结构简单,语法定义清晰。Python最具特色的就是使用缩进来表示代码块,不需要使用大括号{}。缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。
Python第三方包的安装方式较多,本书建议采用以下方式进行安装和管理:
(1)在CMD命令窗口中,使用conda命令进行自动下载安装,用法如下:
conda install <包名称列表> #安装包
conda remove <包名称列表> #卸载包
conda search<搜索项> #搜索包
conda list #查看所有包
conda update<包名称> #升级包
(2)在CMD命令窗口中使用pip命令,用法如下:
pip install <包名> #安装包
pip install--upgrade <包名> #更新包
pip uninstall <包名> #删除包
也可以在 Jupyter notebook 的cell中运行pip命令执行相应的命令,只需在命令前加“!”,如执行 !pip install 包名 进行包的安装。
按 esc 键切换为命令模式,按 enter 键进入编辑模式
NumPy是在1995年诞生的Python库 Numeric 的基础上建立起来的,但真正促使NumPy的发行的是Python的SciPy库。 但SciPy中并没有合适的类似于Numeric中的对于基础数据对象处理的功能 。于是,SciPy的开发者将SciPy中的一部分和Numeric的设计思想结合,在2005年发行了NumPy。
NumPy是Python的一种开源的数值计算扩展库。它包含很多功能,如 创建n维数组(矩阵)、对数组进行函数运算、数值积分 等。 NumPy的诞生弥补了这些缺陷,它提供了两种基本的对象:
通常来说,ndarray是一个通用的同构数据容器,即其中的所有元素都需要相同的类型。利用array函数可创建ndarray数组。
在NumPy.random模块中,提供了多种随机数的生成函数。如randint函数生成指定范围的随机整数来构成指定形状的数组。
np.random.randint(low, high=None, size=None)
random模块的常用随机数生成函数:
np.reshape(a, newshape, order='C')
数据重塑不会改变原来的数组.
数组的切片返回的是原始数组的视图,不会产生新的数据,如果需要的并非视图而是要复制数据,则可以通过 copy 方法实现。
广播(broadcasting)是指不同形状的数组之间执行算术运算的方式。
w=np.array([2,5,6,3,10])
np.where(w>4)
(array([1, 2, 4], dtype=int64),)
where中 若只有条件 (condition),没有x和y,则输出满足条件元素的 坐标 。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。
Sort函数对数据直接进行排序, 调用改变原始数组 ,无返回值。
arr=np.array([7,9,5,2,9,4,3,1,4,3])
print('原数组:',arr)
print('排序后:',arr.argsort())
#返回值为数组排序后的下标排列
print('显示较大的5个数:',arr[arr.argsort()][-5:])
原数组: [7 9 5 2 9 4 3 1 4 3]
排序后: [7 3 6 9 5 8 2 0 1 4]
显示较大的5个数: [4 5 7 9 9]
a=[1,5,1,4,3,4,4]
b=[9,4,0,4,0,2,1]
# 先按照a排序,如果a有相同的数按照b排序
ind=np.lexsort((b,a)) #sort by a,then by b
print('ind:',ind)
tmp=[(a[i],b[i])for i in ind]
print('tmp:',tmp)
ind: [2 0 4 6 5 3 1]
tmp: [(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]
NumPy中提供了很多用于统计分析的函数,常见的有 sum、mean、std、var、min和max 等。
Numpy中数组的方法sort、argsort和lexsort分别是指 ___、 将___和___
直接排序x中的元素从小到大排列,提取其对应的index(索引)对数组或列表按照某一行或列进行排序
Pandas(Python Data Analysis Library)是基于NumPy的数据分析模块,它提供了大量标准数据模型和高效操作大型数据集所需的工具, 可以说Pandas是使得Python能够成为高效且强大的数据分析环境的重要因素之一 。
Pandas有三种数据结构:Series、DataFrame和Panel。
DataFrame的属性
data.rename(columns=({
'total_bill':'消费总额','tip':'小费','sex':'性别','smoker':'是否抽烟',
'day':'星期','time':'聚餐时间段','size':'人数'}),inplace=True)
fdata['是否抽烟']===fdata.是否抽烟
data.query( '是否抽烟=="Yes" & 性别=="Male" & 人均消费>15')
data.dropna(subset=['性别','聚餐时间段'],inplace=True)
data.isnull().sum()
df.apply(np.mean)
data.dpplymap(lambda x:'%.3f'%x)
对于DataFrame数据排序,通过指定轴方向,使用 sort_index 函数对行或列索引进行排序。如果要进行列排序,则通过 sort_values 函数把列名传给by参数即可。
df.sum() # 按列进行求和
df.sum(axis=1) # 按行进行求和
利用 describe 方法会对每个数值型的列数据进行统计
Pandas中常用的描述性统计量:
对于类别型特征的描述性统计,可以使用频数统计表。Pandas库中通过unique方法获取不重复的数组,利用value_counts方法实现频数统计。
groupby方法的参数及其说明:
data.groupby(data.map(judge)),sum()
使用agg方法聚合数据
数据透视表(Pivot Table)是数据分析中常见的工具之一,根据一个或多个键值对数据进行聚合,根据列或行的分组键将数据划分到各个区域。
pivot_table 函数格式:
pivot_table(data, values=None, index=None, columns=None,
aggfunc='mean', fill_value=None, margins=False,
dropna=True, margins_name='All')
交叉表是一种特殊的透视表,主要用于计算分组频率。
crosstab(index, columns, values=None,
rownames=None, colnames=None,
aggfunc=None,
margins=False, dropna=True, normalize=False)
对于数据分析而言,数据大部分来源于外部数据,如常用的CSV文件、Excel文件和数据库文件等。Pandas库将外部数据转换为DataFrame数据格式,处理完成后再存储到相应的外部文件中。
文本文件是一种由若干行字符构成的计算机文件,它是一种典型的顺序文件。
pandas.read_table(filepath_or_buffer, sep=’\t’,
header=’infer’, names=None, index_col=None,
dtype=None, engine=None, nrows=None)
pandas.read_csv(filepath_or_buffer, sep=’,’,
header=’infer’, names=None, index_col=None,
dtype=None, engine=None, nrows=None)
2. 文本文件的存储
DataFrame.to_csv(path_or_buf=None, sep=’,’, na_rep,
columns=None, header=True, index=True, index_label=None,
mode=’w’, encoding=None)
pandas.read_excel(io, sheetname, header=0,
index_col=None, names=None, dtype)
JSON(JavaScript Object Notation) 数据是一种轻量级的数据交换格式,因其简洁和清晰的层次结构使其成为了理想的数据交换语言。JSON数据使用大括号来区分表示并存储。
Pandas通过read_json函数读取JSON数据。读取代码如下:
import pandas as pd
df=pd.read_json(‘FileName’)
df=df.sort_index
Pandas使用 pd.to_json 实现将DataFrame数据存储为JSON文件。
import pandas as pd
import MySQLdb
conn=MySQLdb.connect(host=host,port=port,user=username,passwd=password,db=db_name)
df=pd.read_sql('select * from table_name',con=conn) conn.close()
import pandas as pd
import pymssql
conn=pymssql.connect(host=host, port=port ,user=username, password=password, database=database)
df=pd.read_sql("select * from table_name",con=conn) conn.close()
merge函数是通过一个或多个键将两个DataFrame按行合并起来,与SQL中的 join 用法类似,Pandas中的数据合并merge( )函数格式如下:
merge合并时默认是 内连接 (inner),即返回交集。通过how参数可以选择连接方法:左连接(left),右连接(right)和外连接(outer)。
在合并时会出现重复列名,虽然可以人为进行重复列名的修改,但 merge 函数提供了 suffixes 用于处理该问题:
如果要合并的 DataFrame 之间没有连接键,就无法使用merge方法。pandas中的concat方法可以实现,默认情况下会按行的方向堆叠数据。如果在列向上连接设置axies=1即可。
如果需要合并的两个DataFrame存在重复索引,则使用merge和concat都无法正确合并,此时需要使用combine_first方法。
填充缺失值
缺失值所在的特征为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来填充;缺失值所在特征为类别型数据时,则选择众数来填充。
在DataFrame中利用duplicates方法判断各行是否有重复数据。 duplicates 方法返回一个布尔值的series,反映每一行是否与之前的行重复。
Pandas通过drop_duplicates删除重复的行,格式为:
drop_duplicates(self, subset=None, keep=’first’, inplace=False)
简单的数据统计方法中常用散点图、箱线图和3σ法则检测异常值。
箱线图利用数据中的五个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据,它也可以粗略地看出数据是否具有对称性、分布的分散程度等信息。
若数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值,因为在正态分布的假设下,距离平均值3σ之外的值出现的概率小于0.003。因此根据小概率事件,可以认为超出3σ之外的值为异常数据。
离差标准化是对原始数据所做的一种线性变换,将原始数据的数值映射到[0,1]区间。转换公式如下所示。
标准差标准化数据
标准差标准化又称零均值标准化或z分数标准化,是当前使用最广泛的数据标准化方法。
哑变量( Dummy Variables)是用以反映质的属性的一个人工变量,是量化了的自变量,通常取值为0或1。
散点图 箱线图分析 3σ法则,
在Jupyter notebook中进行交互式绘图,需要执行一下语句 % matplotlib notebook
figure():创建一个新的绘图窗口。
figtext():为figure添加文字
axes():为当前figure添加一个坐标轴
plot():绘图函数
polar():绘制极坐标图
axis():获取或设置轴属性的边界方法(坐标的取值范围)
clf : 清除当前figure窗口 cla : 清除当前axes窗口
close : 关闭当前figure窗口
subplot : 一个图中包含多个axes
text(): 在轴上添加文字
title(): 设置当前axes标题
xlabel/ylabel:设置当前X轴或Y轴的标签
hist():绘制直方图
hist2d():绘制二维在直方图
hold :设置当前图窗状态;off或者on
imread():读取一个图像,从图形文件中提取数组
legend():为当前axes放置标签
pie():绘制饼状图
scatter():做一个X和Y的散点图,其中X和Y是相同长度的序列对象
stackplot():绘制一个堆叠面积图
acorr():绘制X的自相关函数
annotate():用箭头在指定的数据点创建一个注释或一段文本
bar():绘制垂直条形图 barh():绘制横向条形图
barbs():绘制一个倒钩的二维场
创建子图
import matplotlib.pyplot as plt
fig=plt.figure()
#不能使用空白的figure绘图,需要创建子图
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)
可以用语句 Fig , axes=plt.subplots(2,3) 创建一个新的图片,然后返回包含了已生成子图对象的NumPy数组。数组axes可以像二维数组那样方便地进行索引,如 axes[0,1] 。也可以通过sharex和sharey表明子图分别拥有相同的x轴和y轴。
fig, axes=plt.subplots(2,3)
调整子图周围的间距: plt.subplots_adjust(wspace=0,hspace=0)
查看matplotlib的rc参数:
import matplotlib as plt
print(plt.rc_params())
常用参数:
Axes:设置坐标轴边界、颜色、坐标
刻度值大小和网格的显示;
Figure:设置边界颜色、图形大小和子区;
Font:设置字号、字体和样式;
Grid:设置网格颜色和线型;
Legend:设置图例和其中的文本显示;
Lines:设置线条颜色、宽度、线型等;
Savefig:对保存图像进行单独设置;
Xtick和ytick:X、Y轴的主刻度和次刻度设置颜色、大小、方向和标签大小。
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
plt.rcParams['font.family']=['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
调用函数fill_between() 实现曲线下面部分的填充:
plt.fill_between(x, 0, y, facecolor='green', alpha=0.3)
x:第一个参数表示覆盖的区域, x,表示整个x都覆盖
0:表示覆盖的下限
y:表示覆盖的上限是y这个曲线
facecolor:覆盖区域的颜色
alpha:覆盖区域的透明度[0,1],其值越大,表示越不透明
绘图时有时需要在图表中加文本注解
这时可以通过text函数在指定的位置(x,y)加入文本注解;
通过 annotate() 在指定位置实现指向型注释。
箱线图利用数据中的五个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据,它也可以粗略地看出数据是否具有对称性、分布的分散程度等信息,特别可以用于对几个样本的比较。
雷达图也称为网络图,星图,蜘蛛网图,不规则多边形,极坐标图等。雷达图是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法。轴的相对位置和角度通常是无信息的。雷达图相当于平行坐标图,轴径向排列。
(1)WordCloud
(2)jieba
conda install -c conda-forge jieba
(1)首先使用pandas读取数据并将需要分析的数据转化为列表;
(2)对获得的列表数据利用分词工具jieba进行遍历分词;
(3)使用WordCloud设置词云图片的属性、掩码和停用词,并生成词云图像。
查找到当前用户的配置文件目录,然后用编辑器打开,修改matplotlibrc文件,即可修改配置参数。
annotate()
text()
Matplotlib绘图基本模仿MATLAB绘图库,其绘图风格和MATLAB类似。由于MATLAB绘图风格偏古典,因此, Python开源社区开发了Seaborn绘图模块,对Matplotlib进行封装,绘图效果更符合现代人的审美 。
Seaborn属于Matplotlib的一个高级接口,使得作图更加容易。在多数情况下使用Seaborn能做出很具吸引力的图,而使用Matplotlib可以制作具有更多特色的图。 应该把Seaborn视为Matplotlib的补充,而不是替代物 。
Seaborn通过set函数实现风格设置绘图的背景色、风格、字型、字体:
seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)
Seaborn将matplotlib的参数划分为两个独立的组合。第一组是 设置绘图的外观风格 的,第二组主要 将绘图的各种元素按比例缩放的 ,以至可以嵌入到不同的背景环境中。控制这些参数的接口主要有两对方法:
despine()控制哪个脊柱将被移除。
sinplot()
sns.despine(left=True)
除了选用预设的风格外,可以利用with 语句使用 axes_style() 方法设置临时绘图参数。
with sns.axes_style("darkgrid"):
plt.subplot(2,1,1)
sinplot( )
plt.subplot(2,1, 2)
sinplot(-1)
seaborn中通过 set_context() 设置缩放参数,预设的参数有 paper, notebook, talk, poster 。默认为 notebook。“paper”、“talk”和“poster” 。
使用 distplot 方法绘制的直方图与matplotlib是类似的。在 distplot 的参数中,可以选择不绘制密度图。其中的 rug 参数绘制 毛毯图 ,可以为每个观测值绘制小细线(边际毛毯),也可以单独用 rugplot 进行绘制。
如果设置 hist 为 False ,则可以直接绘制密度图而没有直方图。
sns.distplot(df_iris['Petal.Width'],hist=False,rug=True)
小提琴图其实是箱线图与核密度图的结合,箱线图展示了 分位数 的位置,小提琴图则展示了 任意位置的密度 ,通过小提琴图可以知道哪些位置的密度较高。
在图中, 白点 是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。 外部形状即为核密度估计 (在概率论中用来估计未知的密度函数,属于非参数检验方法之一)。
sns.set_style("whitegrid")
df_iris=pd.read_csv('D:\dataset\iris.csv')
ax=sns.violinplot(x=df_iris['Petal.Length'])
sns.jointplot(x='Petal.Length',y='Petal.Width' ,data=df_iris,kind='kde')
sns.regplot(x='举手次数',y='讨论次数',order=4,data=df)
热力图是数据可视化项目中比较常用的数据显示方式。 热力图通过颜色变化程度直观反应出热点分布,区域聚集等数据信息 。热力图实现过程就是通过简单的数学变化,将离散的点信息映射为图像。
简述Seaborn绘图风格设置的内容和方法
Seaborn通过set函数实现风格设置。
seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)
pyecharts是基于Echart图表的一个类库,而Echart是百度开源的一个可视化 JavaScript 库。
pyecharts主要基于web浏览器进行显示,绘制的图形比较多,包括 折线图、柱状图、饼图、漏斗图、地图、极坐标图 等,代码量很少,而且很灵活,绘制出来的图形很美观。
图形绘制过程,基本上所有的图表类型都是这样绘制的:
chart_name=Type() #初始化具体类型图表
chart_name.add() #添加数据及配置项
chart_name.render()
#生成本地文件(html/svg/jpeg/png/pdf/gif)
chart_name .render_notebook #在jupyter notebook中显示
pyecharts 中通过 Funnel 绘制漏斗图,
仪表盘
平行坐标图(Parallel Coordinates Plot)是对于具有多个属性问题的一种可视化方法。在平行坐标图中,数据集的一行数据在平行坐标图中用一条折线表示,纵向是 属性值 ,横向是 属性类别 (用索引表示)
桑基图(Sankey diagram)即 桑基能量分流图 ,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。 Pyecharts 中利用 Sankey 绘制桑基图。
简述pyecharts中图表绘制的步骤。
chart_name=Type() #初始化具体类型图表
chart_name .add() #添加数据及配置项
chart_name .render()
#生成本地文件(保存路径)
chart_name .render_notebook #在jupyter notebook中显示
Python标准库中包含了用于日期(date)、时间(time)、日历(calendar)等功能的数据类型,主要会用到datetime、time、calendar模块,我们主要介绍一下datetime模块。
time=datetime.time(10,20,15)
print(time)
print(time.hour,time.minute,time.second)
Datetime类数据是date类和time类数据的组合,通过now函数可以查看当前的时间。
重采样是时间序列频率转换的过程,Pandas中的resample函数用于各种频率的转换工作。
在做 时间序列分析 时,经常要对时间序列进行平稳性检验。用Python来进行 平稳性检验 主要有 时序图检验、自相关图检验以及构造统计量进行检验 3种方法
时序图就是普通的时间序列图,即以时间为横轴,观察值为纵轴进行检验。利用时序图可以粗略观察序列的平稳性。
2 自相关图检验
平稳序列通常具有短期相关性,即随着延迟期数k的增加,平稳序列的自相关系数会很快地衰减向零,而非平稳序列的自相关系数的衰减速度会比较慢。画自相关图用到的是 statsmodels 中的 plot_acf 方法。自相关图中横轴表示延迟期数,纵轴表示自相关系数。
3. 利用绘图判断序列的平稳性比较直观,但不够精确,ADF(Augmented Dickey-Fuller)法直接通过 假设检验 的方式来验证平稳性。ADF的原假设(H0)和备择假设(H1)如下:
Python中可以使用 statsmodels 中的 adfuller 方法进行ADF检验,直接输入数据,即可返回7个数值。
其中的第一个返回值adf就是ADF方法的检验结果,这个值理论上越负越能拒绝原假设;
第二个返回值pvalue以常用的判断标准值0.05作为参考,若其值大于0.05,说明支持原假设,反之拒绝原假设,表明该序列是一个平稳序列。
若其值大于0.05,说明支持原假设,反之拒绝原假设,表明该序列是一个平稳序列。
Scipy是一款用于数学、科学和工程领域的Python工具包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。
SciPy的constants模块包含了大量用于科学计算的常数。
from scipy import constants as C
print(C.pi) #圆周率
print(C.golden) #黄金比例
print(C.c) #真空中的光速
print(C.h) #普朗克常数
print(C.mile) #一英里等于多少米
print(C.inch) #一英寸等于多少米
print(C.degree) #一度等于多少弧度
print(C.minute) #一分钟等于多少秒
print(C.g) #标准重力加速度
SciPy的special模块包含了大量函数库,包括基本数学函数、特殊函数以及NumPy中的所有函数。
from scipy import special as S
print(S.cbrt(8)) #立方根
print(S.exp10(3)) #10**3
print(S.sindg(90)) #正弦函数,参数为角度
print(S.round(3.1)) #四舍五入函数
print(S.round(3.5))
print(S.round(3.499))
print(S.comb(5,3))
#从5个中任选3个的组合数
print(S.perm(5,3)) #排列数
print(S.gamma(4)) #gamma函数
print(S.beta(10,200)) #beta函数
print(S.sinc(0)) #sinc函数
SciPy.linalg 是SciPy中实现线性代数计算的模块,常用的导入方式为: from scipy import linalg
在NumPy中,矩阵有矩阵类型和二维数组两种表示方法。
矩阵类型数据可以用 np.mat() 或 mat.matrix() 创建。
from scipy import linalg
import numpy as np
A=np.mat('[1,2;3,4]')
print('A矩阵为:\n',A)
print('A的转置矩阵为:\n',A.T)
print('A的逆矩阵为:\n',A.I)
矩阵也可以用二维数组对象表示,数组对象的矩阵操作与矩阵对象有一定的区别。
M=np.array([[1,2],[3,4]])
print('M矩阵为:\n',M)
print('M的转置矩阵为:\n',M.T)
print('M的逆矩阵为:\n',linalg.inv(M))
除了通过矩阵的逆求解外可以直接使用 linalg.solve() 函数求解而且效率更高。
from scipy import linalg
import numpy as np
a=np.array([[1, 3, 5], [2, 5, -1], [2, 4, 7]])
b=np.array([10, 6, 4])
x=linalg.solve(a, b)
print(x)
[-14.31578947 7.05263158 0.63157895]
行列式是一个将方阵映射到标量的函数。linalg.det()可以计算矩阵的行列式。
M=np.array([[1,2],[3,4]])
linalg.det(M)
-2.0
范数是数学上一个类似“长度”的概念。 linalg.norm() 函数可以计算向量或矩阵的范数(或者模)。常见范数及其含义见下表。
M=np.array([[1,2],[3,4]])
print('M矩阵为:\n',M)
print('M矩阵的L范数为:\n',linalg.norm(M,1)) # 6.0
print('M矩阵的2范数为:\n',linalg.norm(M,2))
函数 linalg.eig() 可以用来求解特征值和特征向量。
A=np.array([[1,2],[3,4]])
l,v=linalg.eig(A)
print(l)
print(v)
[-0.37228132+0.j 5.37228132+0.j]
[[-0.82456484 -0.41597356]
[ 0.56576746 -0.90937671]]
奇异值分解是一个能适用于任意的矩阵的一种分解的方法。
scikit-learn的PCA算法的背后真正的实现就是用的SVD。
from numpy import *
data=mat([[1,2,3],[4,5,6]])
U,sigma,VT=np.linalg.svd(data)
print('U: ',U)
print('SIGMA:',sigma)
print('VT:',VT)
SciPy.optimize 包提供了几种常用的优化算法,包括用来求有/无约束的多元标量函数最小值算法,最小二乘法,求有/无约束的单变量函数最小值算法,还有解各种复杂方程的算法。
使用 SciPy.optimize 模块的root和fsolve函数进行数值求解线性及非线性方程求方程的根。
from scipy.optimize import root
def func(x):
return x*2 + 2 * np.cos(x)
sol=root(func, 0.3)
# 0.3 估计初始值
print (sol)
使用 fmin,fminbound 可以求函数的极值:
import numpy as np
from matplotlib import pyplot as plt
from SciPy.optimize import fmin,fminbound
def f(x):
return x**2+10*np.sin(x)+1
x=np.linspace(-10,10,num=500)
min1=fmin(f,3) #求3附近的极小值
min2=fmin(f,0) #求0附近的极小值
min_global=fminbound(f,-10,10)
#这个区域的最小值
print(min1)
print(min2)
print(min_global)
plt.plot(x,f(x))
plt.show()
import matplotlib.pyplot as plt
x=np.linspace(-5,5,20)
y=3.5*x+2.1
y_noise=y+np.random.randn(20)*2
coeff=np.polyfit(x,y_noise,1)
plt.plot(x,y_noise,'x',x,coeff[0]*x+coeff[1])
plt.show()
最小二乘拟合
最小二乘拟合(Least Squares)是一种常用的数学优化技术,通过最小化误差的平方和在寻找一个与数据匹配的最佳函数。
要使用最小二乘优化,需要先定义误差函数:
def errf(p,x,y):
return y-func(x,*p)
其中,p表示要估计的真实参数,x是函数的输入,y表示输入对应的数据值。最小二乘估计对应的函数为 optimize.leastsq() ,可以利用该函数和定义的误差函数,对真实参数进行最小二乘估计。
from scipy import optimize
def myfunc(x,a,b,w,t):
return a*np.exp(-b*np.sin(w*x+t))
x=np.linspace(0,2*np.pi)
par=[3,2,1.25,np.pi/4]
y=myfunc(x,*par)
y_noise=y+0.8*np.random.randn(len(y))
def errf(p,x,y):
return y-myfunc(x,*p)
c,rv=optimize.leastsq(errf,[1,1,1,1],args=(x,y_noise))
#c返回找到的最小二乘估计
plt.plot(x,y_noise,'x',x,y,x,myfunc(x,*c),':')
plt.legend(['data','actual','leastsq'])
plt.show()
曲线拟合
可以不定义误差函数,用函数 optimize.curve_fit() 直接对函数myfunc的参数直接进行拟合。
p,e=optimize.curve_fit(myfunc,x,y_noise)
print('p是对参数的估计值:\n',p)
print('e是4个估计参数的协方差矩阵:\n',e)
p是对参数的估计值:
[3.28292536 1.90102739 1.2478838 0.78989363]
e是4个估计参数的协方差矩阵:
[[ 0.17453746 -0.05248031 0.01959142 -0.06158022]
[-0.05248031 0.01606779 -0.00572988 0.01801028]
[ 0.01959142 -0.00572988 0.00271714 -0.00854062]
[-0.06158022 0.01801028 -0.00854062 0.02707182]]
稀疏矩阵(Sparse Matrix)是 只有少部分元素值是非零的矩阵 。如果按照正常方式存储所有元素,则这些矩阵将占用巨大空间,因此,稀疏矩阵只保存非零值及对应的位置。
SciPy.sparse 是SciPy中负责稀疏矩阵的模块。在SciPy中,根据存储方式的不同,可以将稀疏矩阵分为以下几类:
由于稀疏矩阵数据量大,一般不使用普通矩阵作为参数来构建,而是采用非零数据点及坐标的形式构建。
import numpy as np
from scipy import sparse
sparse.coo_matrix((2,3)) #创建空的稀疏矩阵
A=sparse.coo_matrix([[1,2,0],[0,1,0],[2,0,0]])
#将普通矩阵转为稀疏矩阵
print(A)
print(type(A)) #查看A的类型
print(type(A.tocsc())) #不同类型的稀疏矩阵可以相互转换
v=np.array([1,3,-3])
print(A*v)
data=[1,2,3,4]
rows=[0,0,1,2]
cols=[0,1,2,2]
W=sparse.coo_matrix(data,(rows,cols))
print('稀疏矩阵W:\n',W)
r,c,d=sparse.find(W)
#find()函数返回非零元素的行、列和具体数值
print('稀疏矩阵W非零值:\n',r,c,d)
稀疏矩阵W:
(0, 0) 1
(0, 1) 2
(0, 2) 3
(0, 3) 4
稀疏矩阵W非零值:
[0 0 0 0] [0 1 2 3] [1 2 3 4]
简单的介绍一下SciPy在图像处理方面的应用,如果专业做图像处理当然还是建议使用OpenCV。
图像平滑是指用于突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分,使图像亮度平缓渐变,减小突变梯度,改善图像质量的图像处理方法。
图像平滑的方法包括:插值方法,线性平滑方法,卷积法等。
ndimage.median_filter 实现中值滤波。
import numpy as np
from scipy import ndimage
from scipy import misc
import matplotlib.pyplot as plt
%matplotlib inline
image=misc.ascent()
aa=plt.subplot(1,3,1)
plt.title("title")
plt.imshow(image)
plt.axis('off')
plt.subplot(1,3,2)
plt.title("medi_filter")
filter=ndimage.median_filter(image,size=10)
#使用SciPy的中值滤波处理图片
plt.imshow(filter)
plt.axis('off')
plt.subplot(1,3,3)
plt.title("gausfilter")
blurred_face=ndimage.gaussian_filter(image, sigma=7)
#高斯滤波
plt.imshow(blurred_face)
plt.axis('off')
图像旋转和锐化
图像锐化就是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。图像锐化处理的目的是 为了使图像的边缘、轮廓线以及图像的细节变的清晰 。经过平滑的图像变得模糊的根本原因是因为图像受到了平均或积分运算,因此可以对其进行逆运算(如微分运算)就可以使图像变的清晰。从频域来考虑,图像模糊的实质是因为其高频分量被衰减,因此可以用 高通滤波器来使图像清晰 。
image=misc.ascent()
#显示全部图片
plt.subplot(131)
plt.title("title")
plt.imshow(image)
plt.axis('off')
plt.subplot(132)
rotate=ndimage.rotate(image,60)
plt.title("rotate")
plt.imshow(rotate)
plt.axis('off') #边缘检测
plt.subplot(133)
prewitt=ndimage.prewitt(image)
plt.title("prewitt")
plt.imshow(prewitt)
plt.axis('off')
信号处理(signal processing)是指对信号进行提取、变换、分析、综合等处理,以便抽取出有用信息的过程。信号处理基本的内容有变换、滤波、调制、解调、检测以及谱分析和估计等。
Python中的 scipy.signal 模块专门用于信号处理。
重采样指将数据序列从一个频率转化为另一个频率进行处理的过程。将高频率数据转化为低频率数据为降采样,低频率转化为高频率为升采样。SciPy中的 signal.resample() 函数可以将信号重采样成n个点。
卷积是两个变量在某范围内相乘后求和的结果。一维卷积常用于序列模型,如自然语言处理领域。二维卷积常用于计算机视觉、图像处理领域。
卷积是两个变量在某范围内相乘后求和的结果。一维卷积常用于序列模型,如自然语言处理领域。二维卷积常用于计算机视觉、图像处理领域。
信号的表示是信息分析与处理的核心问题之一。在信号分析中,最基本的变量是时间和频率。
信号一般用时间作为自变量表示,通过时频变换,信号也可以使用频率作为自变量表示。常用的变换方法有傅里叶变换、小波变换等。
SciPy中利用 fft 方法将信号从时域变换到频率,用 ifft 方法 将频域信号逆变换回时域 。
数据拟合的方法: 多项式拟合,最小二乘拟合,曲线拟合
欧式距离distance的代码:
np.sqrt(np.sum((a-b)**2))
np.hstack((a,b))
每一行中的最大值的代码。
np.max(array,axis=0)
第二大值的代码(默认升序排序)
np.unique(array)[-2]
ndmin shape
numpy 维数 维度
pandas 维度 形状
Pandas的plot绘制直方图时,kind取值为hist
密度 kde
散点 scatter
Pandas通过 DataFrame.rename() 函数,传入需要修改列名的字典形式来修改列名。replace进行数据的替换
Pandas要读取Mysql中的数据,首先要安装 MySQLdb 包
Pandas读取SQL sever中的数据,首先要安装 pymssql 包
Matplotlib配置了配色方案和默认设置。有两种方式可以设置参数,即 全局参数定制 和 rc参数设置方法
Matplotlib中绘图时的参数alpha用于设置点的透明度。
Seaborn中可以通过 despine 方法移除绘图上方和右方坐标上不需要的边框。
在Seaborn中利用 pairplot() 实现数据特征的两两对比。
pyecharts中通过 Funnel 绘制漏斗图。
pyecharts利用 Kline 绘制K线图
pyecharts利用 Gauge 绘制仪表盘。
pyecharts中利用 Sankey 绘制桑基图。
Scipy中的 constants 模块包含大量用于科学计算的常数。
var函数用作方差统计
使用 rcdefault() 函数可以将配置文件重置。
处理数据缺陷的常用方法 dropna fillna isnull或 notnull
加油!
感谢!
努力!
avaScript 语言中有两种比较方式,转换类型比较运算符==和严格比较运算符===。其中严格比较运算符仅当两个操作数的类型相同且值相等时才为true。而转换类型比较运算符==会在进行比较之前,将两个操作数转换成相同的类型,再来比较。
比较运算符常用语逻辑语句中,它主要是用语判定变量或者值是否相等。
相等运算符==会为两个不同类型的操作数转换类型,然后进行严格比较。
示例:
console.log(1==1); // true
console.log(1==2); // false
console.log(1==true); // true
console.log(1=='1'); // true
从上述代码中的1=='1',输出结果为 true,就可以看出==相等运算符,在对两个操作数进行比较之前,会将两个操作数转换成相同的类型。
当使用比较运算符时,如果其中有布尔类型的操作数,值为 true时会转换为1,值为false时会转换为0。
当两个操作数都是对象时,JavaScript会比较其内部引用,当且仅当他们的引用指向内存中的相同对象时才相等,即他们在栈内存中的引用地址相同。
严格相等运算符===不会对操作数进行类型转换,只有当值相等并且类型也是相等时才会返回 true。
示例:
console.log(1===1); // true
console.log(1===2); // false
console.log(1===true); // false
console.log(1===false); // false
console.log(1==='1'); // false
从a===c d的比较结果可以看出,不同类型的值进行比较时,会返回 false。
不等运算符 !=只有当操作数不相等时才返回true,如果两操作数不是同一类型,会将操作数转为同意类型再进行比较。
示例:
var a=1;
var b=2;
var c='1';
console.log(a !=1); // false
console.log(a !=b); // true
console.log(a !=c); // false
如果两操作数为对象类型,JavaScript会比较其内部引用地址,仅当他们在内存中引用不同对象时不相等。
严格不等运算符 !==当操作数不相等或不同类型时返回 true。
示例:
var a=1;
var b=2;
var c='1';
console.log(a !==1); // false
console.log(a !==b); // true
console.log(a !==c); // true
大于运算符 > ,只有当左操作数大于右操作数时才返回 true。
示例:
console.log(5 > 1); // true
console.log(5 > 10); // false
console.log(5 > '5'); // false
大于等于运算符 >=,只有当左操作数大于或者等于右操作数时才返回 true。
示例:
console.log(5 >=1); // true
console.log(5 >=5); // true
console.log(5 >=10); // false
console.log(5 >='5'); // true
小于运算符 < ,只有当左操作数小于右操作数时才返回 true。
示例:
console.log(5 < 1); // false
console.log(5 < 5); // false
console.log(5 < 10); // true
console.log(5 < '5'); // false
小于运算符 < ,只有当左操作数小于或者等于右操作数时才返回 true。
示例:
console.log(5 <=1); // false
console.log(5 <=5); // true
console.log(5 <=10); // true
console.log(5 <='5'); // true
当比较运算涉及类型转换时,JavaScript 会按以下规则对字符串、数字、布尔、对象等类型的操作数进行操作:
s中常用的数据类型有:
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
引用数据类型:对象(Object)、数组(Array)、函数(Function)。
就以上数据类型先举几个例子:
// 字符串(String)
let a='word';
// 数字(Number)
let b=123;
// 布尔(Boolean)
let c=true;
// 对空(Null)
let d=null;
// 未定义(Undefined)
let e;
// Symbol
let f=Symbol('123');
// 对象(Object)
let g={name:'xiangming'};
// 数组(Array)
let h=[1,2,3,4,5];
// 函数(Function)
let i=function () {
return 'done';
};
1、最常见的判断方法:typeof
console.log('a:'+typeof a);
// a:string
console.log('b:'+typeof b);
// b:number
console.log('c:'+typeof c);
// c:boolean
console.log('d:'+typeof d);
// d:object
console.log('e:'+typeof e);
// e:undefined
console.log('f:'+typeof f);
// f:symbol
console.log('g:'+typeof g);
// g:object
console.log('h:'+typeof h);
// h:object
console.log('i:'+typeof i);
// i:function
所以,typeof 在判断除Object类型的对象时比较方便。
2、判断已知对象类型的方法:instanceof
console.log('a is string:'+a instanceof String);
// a is string:true
console.log('b is number:'+b instanceof Number);
// b is number:true
console.log('b is number:'+b instanceof number);
// Uncaught ReferenceError: number is not defined
注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。
3、通用但很繁琐的方法:prototype(推荐)
// 定义方法获取变量类型
function var_type(data) {
return Object.prototype.toString.call(data).replace(/^\[object\s(.+)\]$/, '$1').toLowerCase();
}
console.log('a:'+var_type(a));
// a:string
console.log('b:'+var_type(b));
// b:number
console.log('c:'+var_type(c));
// c:boolean
console.log('d:'+var_type(d));
// d:null
console.log('e:'+var_type(e));
// e:undefined
console.log('f:'+var_type(f));
// f:symbol
console.log('g:'+var_type(g));
// g:object
console.log('h:'+var_type(h));
// h:array
console.log('i:'+var_type(i));
// i:function
此方法虽稍显繁琐,但只需简单封装一个方法即可。
文章最后给大家推荐一个小编自己写的通用后台框架云静Admin通用后台,小编也是第一次尝试开源代码,还望大家不吝赐教。
云静Admin通用后台:
http://uadmin.yunj.net.cn/admin
开发文档:
https://www.kancloud.cn/worklz/yunj_admin_universal/2009454
*请认真填写需求信息,我们会在24小时内与您取得联系。