Python数据科学

Python数据科学 查看完整档案

北京编辑  |  填写毕业院校互联网金融  |  数据挖掘工程师 编辑填写个人主网站
编辑

微信公众号:Python数据科学

个人动态

Python数据科学 收藏了文章 · 9月29日

安利 5 个拍案叫绝的 Matplotlib 骚操作!

公众号:Python数据科学
作者:东哥起飞

大家都知道,Matplotlib是Python的可视化库,功能很强,可以绘制各种图。一些常规用法前不久分享过Matplotlib官方出品的cheatsheet:Matplotlib官方小抄手册公开,配套可视化代码已打包!

但是!今天我们不走寻常路,专挑几个贼骚的操作分享下.

1. Span Selector

Span SelectorMatplotlib中的鼠标小部件,widgets是用于包含一些交互功能的python对象。Span Selector可以通过鼠标框选,方便地查看选定区域的最大值和最小值。

下面是代码,首先创建一个基本折线图作为例子。然后,我们调用SpanSelector方法并使用它来选择一个区域,然后在该区域中显示最大值和最小值。

import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
def onselect(xmin, xmax):
    print(xmin, xmax)
    return xmin, xmax
fig, ax = plt.subplots()
ax.plot([1,2,3,4,5,6,7], [10, 50, 100, 23,15,28,45])
span = SpanSelector(ax, onselect, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='red'))       
plt.show()

下面是具体操作。
image

2. Broken Barh

Broken的水平条形图是不连续具有间隙的图,它可用于数据值相差很大的情况下,例如,包含极端温度范围的数据集。在这种情况下,Broken的水平条形图非常合适,因为它们可以同时绘制最大和最小范围。

python模块matplotlib.broken_barh()用于绘制Broken的水平条形图。

import matplotlib.pyplot as plt 
#Defining the x and y ranges 
xranges = [(5,5), (20,5),(20,7)] 
yrange = (2,1) 
#Plotting the broken bar chart 
plt.broken_barh(xranges, yrange, facecolors='green') 
xranges = [(6,2), (17,5),(50,2)] 
yrange = (15,1) 
plt.broken_barh(xranges, yrange, facecolors='orange') 
xranges = [(5,2), (28,5),(40,2)] 
yrange = (30,1) 
plt.broken_barh(xranges, yrange, facecolors='red') 
plt.xlabel('Sales') 
plt.ylabel('Days of the Month') 
plt.show()

image

3. Table Demo

Matplotlib的表格功能也是可以在图中显示表格的。当我们希望以条形图的形式快速查看表格中的值时,这特别方便。表格可以放置在图表的顶部,底部或侧面。

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
x = np.random.rand(5, 8)*.7 
plt.plot(x.mean(axis=0), '-o', label='average per column') 
plt.xticks([]) 
plt.table(cellText=[['%1.2f' % xxx for xxx in xx] for xx in x],cellColours=plt.cm.GnBu(x),loc='bottom') 
plt.show()

image
image

4. Watermark Images

有时候我们觉得可视化的背景太单调了,想增加点趣味性,比如将与数据相关的图像作为水印覆盖到可视化图形上。下面就以NBA的詹皇为例试试水,最后呈现出詹皇的数据,同时背景是詹皇本人。

首先,导入要用的数据集,图片和必要的库pandas

import numpy as np 
import matplotlib.image as image 
import matplotlib.pyplot as plt 
import pandas as pd 
df = pd.read_csv('income.csv') 
im = image.imread('Lebron_James.jpeg') # Image

pandas过滤掉仅由勒布朗组成的数据。

lebron_james = df[df['Name']=='LeBron James']

然后像下面这样操作,使用figimage添加水印就ok了。

fig, ax = plt.subplots() 
ax.grid() 
ax.plot('Year','earnings ($ million)',data=lebron_james) 
ax.set_title("LeBron James earnings in US$(millions)") 
fig.figimage(im, 60, 40,cmap='ocean', alpha=.2) 
plt.show()

image

5. XKCD Plots

下面这个操作更有趣味性(更骚)。

如果你想让Matplotlib图上添加一些扭曲,可以简单地xkcd()pyplot对象上调用方法,如下所示。

import pandas as pd 
import matplotlib.pyplot as plt 
df = pd.read_csv('https://raw.githubusercontent.com/parulnith/Website-articles-datasets/master/India%20GDP%20Growth%20Rate%20.csv', parse_dates=['Year']) 
df['Year'] = df['Year'].apply(lambda x: pd.Timestamp(x).strftime('%Y')) 
#calling xkcd() method 
plt.xkcd(scale=5, length=400) 
df.plot(x='Year',y='GDP Growth (%)',kind='bar') 
plt.ylabel('GDP Growth (%)') 
plt.xticks(rotation=-20) 
plt.figure(figsize=(10,8)) 
plt.show()

image

文章参考:
https://towardsdatascience.co...

先分享这些,如果觉得有帮助,还请多分享点个赞

欢迎大家关注我的原创微信公众号 Python数据科学,专注于写基于Python的数据算法、机器学习、深度学习硬核干货。

查看原文

Python数据科学 发布了文章 · 9月29日

安利 5 个拍案叫绝的 Matplotlib 骚操作!

公众号:Python数据科学
作者:东哥起飞

大家都知道,Matplotlib是Python的可视化库,功能很强,可以绘制各种图。一些常规用法前不久分享过Matplotlib官方出品的cheatsheet:Matplotlib官方小抄手册公开,配套可视化代码已打包!

但是!今天我们不走寻常路,专挑几个贼骚的操作分享下.

1. Span Selector

Span SelectorMatplotlib中的鼠标小部件,widgets是用于包含一些交互功能的python对象。Span Selector可以通过鼠标框选,方便地查看选定区域的最大值和最小值。

下面是代码,首先创建一个基本折线图作为例子。然后,我们调用SpanSelector方法并使用它来选择一个区域,然后在该区域中显示最大值和最小值。

import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
def onselect(xmin, xmax):
    print(xmin, xmax)
    return xmin, xmax
fig, ax = plt.subplots()
ax.plot([1,2,3,4,5,6,7], [10, 50, 100, 23,15,28,45])
span = SpanSelector(ax, onselect, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='red'))       
plt.show()

下面是具体操作。
image

2. Broken Barh

Broken的水平条形图是不连续具有间隙的图,它可用于数据值相差很大的情况下,例如,包含极端温度范围的数据集。在这种情况下,Broken的水平条形图非常合适,因为它们可以同时绘制最大和最小范围。

python模块matplotlib.broken_barh()用于绘制Broken的水平条形图。

import matplotlib.pyplot as plt 
#Defining the x and y ranges 
xranges = [(5,5), (20,5),(20,7)] 
yrange = (2,1) 
#Plotting the broken bar chart 
plt.broken_barh(xranges, yrange, facecolors='green') 
xranges = [(6,2), (17,5),(50,2)] 
yrange = (15,1) 
plt.broken_barh(xranges, yrange, facecolors='orange') 
xranges = [(5,2), (28,5),(40,2)] 
yrange = (30,1) 
plt.broken_barh(xranges, yrange, facecolors='red') 
plt.xlabel('Sales') 
plt.ylabel('Days of the Month') 
plt.show()

image

3. Table Demo

Matplotlib的表格功能也是可以在图中显示表格的。当我们希望以条形图的形式快速查看表格中的值时,这特别方便。表格可以放置在图表的顶部,底部或侧面。

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
x = np.random.rand(5, 8)*.7 
plt.plot(x.mean(axis=0), '-o', label='average per column') 
plt.xticks([]) 
plt.table(cellText=[['%1.2f' % xxx for xxx in xx] for xx in x],cellColours=plt.cm.GnBu(x),loc='bottom') 
plt.show()

image
image

4. Watermark Images

有时候我们觉得可视化的背景太单调了,想增加点趣味性,比如将与数据相关的图像作为水印覆盖到可视化图形上。下面就以NBA的詹皇为例试试水,最后呈现出詹皇的数据,同时背景是詹皇本人。

首先,导入要用的数据集,图片和必要的库pandas

import numpy as np 
import matplotlib.image as image 
import matplotlib.pyplot as plt 
import pandas as pd 
df = pd.read_csv('income.csv') 
im = image.imread('Lebron_James.jpeg') # Image

pandas过滤掉仅由勒布朗组成的数据。

lebron_james = df[df['Name']=='LeBron James']

然后像下面这样操作,使用figimage添加水印就ok了。

fig, ax = plt.subplots() 
ax.grid() 
ax.plot('Year','earnings ($ million)',data=lebron_james) 
ax.set_title("LeBron James earnings in US$(millions)") 
fig.figimage(im, 60, 40,cmap='ocean', alpha=.2) 
plt.show()

image

5. XKCD Plots

下面这个操作更有趣味性(更骚)。

如果你想让Matplotlib图上添加一些扭曲,可以简单地xkcd()pyplot对象上调用方法,如下所示。

import pandas as pd 
import matplotlib.pyplot as plt 
df = pd.read_csv('https://raw.githubusercontent.com/parulnith/Website-articles-datasets/master/India%20GDP%20Growth%20Rate%20.csv', parse_dates=['Year']) 
df['Year'] = df['Year'].apply(lambda x: pd.Timestamp(x).strftime('%Y')) 
#calling xkcd() method 
plt.xkcd(scale=5, length=400) 
df.plot(x='Year',y='GDP Growth (%)',kind='bar') 
plt.ylabel('GDP Growth (%)') 
plt.xticks(rotation=-20) 
plt.figure(figsize=(10,8)) 
plt.show()

image

文章参考:
https://towardsdatascience.co...

先分享这些,如果觉得有帮助,还请多分享点个赞

欢迎大家关注我的原创微信公众号 Python数据科学,专注于写基于Python的数据算法、机器学习、深度学习硬核干货。

查看原文

赞 2 收藏 2 评论 0

Python数据科学 发布了文章 · 6月19日

从机械转行数据科学,吐血整理了这些白嫖的学习网站

作者:东哥起飞
Python数据科学

大家好,我是东哥。

前方高能,准备开启收藏夹吃灰模式。

本篇东哥分享几个数据科学入门的学习网站,全部免费资源,且内容优质,是小白入门的不二选择。东哥当年从机械转行也从这些学习网站收获很多。

下面开始进入正题。

一、Kaggle

什么是Kaggle?

在这里插入图片描述
kaggle是全球最先也是目前规模最大的数据科学竞赛组织了。之所以这么受欢迎,是因为很多大的公司奉献出自家真实的数据给kaggle,提出真实业务场景面临的痛点,需要数据科学上的解决方案。

我个人觉得是非常有意思的,因为很多人苦学理论,正愁着没有真实数据去实践,有了这个机会,不论方案是否可以排上名次,都是宝贵的实践经验啊。

当然,作为方案最优的前三名可以得到一笔丰厚的报酬,几千美元到几万美元不等,这更加刺激广大数据爱好者了。竞赛已经有上百场了,各种场景和需求,并且随着需求增多,竞赛也在不断增加。

Kaggle上有什么?

原来的kaggle只有单一的竞赛,现在的kaggle已经不只是竞赛这么简单了。它还有丰富的社区免费的学习课程在线实操的环境

下面是一在线操作提交模型的环境,非常奈斯。

在这里插入图片描述
各路神仙在社区共享自己的kernels和源代码,是个非常好的交流学习机会,有兴趣可以自己去看。这里主要说下免费的学习课程,下面是地址。

https://www.kaggle.com/learn/...

在这里插入图片描述

学习列表中有python、机器学习、深度学习、可视化、pandas数据处理、SqL入门和进阶等等。打开每个学习项目,内容非常丰富,虽是英文我相信对于有心的人都不是问题了。

二、Coursera

在这里插入图片描述
Coursera很多朋友应该熟悉,吴恩达的机器学习课程最早就是从这里开始分享的。里面有各个名校大学的公开课,很多都是免费公开的课程,听课是免费的,但学完后认证证书需要付费。

这里分享几个东哥收藏的宝藏课程,每一个都很经典,好评无数。

1.机器学习 (Andrew Ng / 斯坦福大学)

在这里插入图片描述

https://www.coursera.org/lear...

2.专业数据科学(10门课/JHU)

在这里插入图片描述

https://www.coursera.org/spec...

3.数据科学实战(5门课/JHU)

在这里插入图片描述

https://www.coursera.org/spec...

4.专业数据挖掘(6门课/伊利诺伊大学)

在这里插入图片描述

https://www.coursera.org/spec...

5.数据科学硕士(8门课/伊利诺伊大学圣巴巴拉分校)

在这里插入图片描述

https://www.coursera.org/degr...

6.数据科学应用硕士(密歇根大学)

在这里插入图片描述

https://www.coursera.org/degr...

三、Udacity

Udacity(优达学成)是个美国的付费类培训机构,内容涉及所有编程和计算机类的课程,是歪果仁拍的视频课程,质量很高,但收费很贵。

仔细观察,其实也有很多免费的课程供学习的,东哥把收藏的存货也拿出来分享下。

1.数据科学导论

总共10个章节,以titanicNewYork Subway data项目为例介绍数据分析、可视化、数据处理、Mapreduce大数据。
在这里插入图片描述

https://www.udacity.com/cours...

2.数据分析导论

在这里插入图片描述

https://www.udacity.com/cours...

3.数据可视化分析

这个课程是基于R语言的,介绍了R语言基础、逻辑回归、线性回归、正则化等内容。
在这里插入图片描述

https://www.udacity.com/cours...

4.使用SQL做数据分析

在这里插入图片描述

https://www.udacity.com/cours...

5. 统计推理入门

主要介绍推断性统计的知识,比如各种检验,假设检验、t检验、卡方检验、ANOVA方差分析、回归等等。

在这里插入图片描述

https://www.udacity.com/cours...

当然,除了这些还有很多付费的,感兴趣可自行查找,本篇只谈免费。

四、其它社区和博客

下面是几个很好的国外数据科学社区和个人博客,内容不如前面三个学习网站有组织和条条理,但是有很多优秀的文章分享也可以作为参考学习。

1. 面向数据科学

https://towardsdatascience.com/

这里着重说下这个社区,专门的数据科学学习平台,里面都是一些国外爱好者的分享,涵盖了data sciencemachine learningdeep learningvisualizationprogramming等,缺点是需要特殊工具才能上去,用谷歌访问助手也可以。

2. 方差解释

http://varianceexplained.org/

3. 成为一名数据科学家

https://www.becomingadatascie...

4. Mark Meloon

https://www.markmeloon.com/

5. Julia Silge

https://juliasilge.com/blog/

以上就是东哥分享的一些免费课程资源,资源多少不是关键,关键的是迈开第一步,深入进去开始学习。

先分享这些,如果觉得有帮助,还请多分享点个赞

欢迎大家关注我的原创微信公众号 Python数据科学,专注于写基于Python的数据算法、机器学习、深度学习硬核干货。

查看原文

赞 4 收藏 3 评论 0

Python数据科学 关注了专栏 · 6月18日

AWS_AI开发社区

AWS_AI 开发者社区是专注于人工智能领域 IT 人士交流与互动的平台。在这里,你可以分享和获取一切有关人工智能的相关技术和前沿知识,也可以与同行或爱好者们交流探讨,共同成长。

关注 629

Python数据科学 发布了文章 · 6月14日

太香了!墙裂推荐6个Python数据分析神器!!

作者:东哥起飞,数据爱好者
Python数据科学

hello,大家好我是东哥!

用Python处理数据大家都不陌生了,属常规操作,但常规之下还是也有些暗藏技巧的,本篇东哥分享6个好玩高效的操作,帮助大家提高效率。

一、Pandas Profiling

Pandas Profiling提供数据的一个整体报告,是一个帮助我们理解数据的过程。它可以简单快速地对Pandas的数据框数据进行探索性数据分析。

其实,Pandasdf.describe()df.info()函数也可以实现数据探索过程第一步。但它们只提供了对数据非常基本的概述。而Pandas中的Profiling功能简单通过一行代码就能显示大量信息,同时还能生成交互式HTML报告。

对于给定的数据集,Pandas中的profiling包计算了以下统计信息:

image.png

Pandas Profiling包计算出的统计信息包括直方图、众数、相关系数、分位数、描述统计量、其他信息包括类型、单一变量值、缺失值等。

安装

pipconda即可,使用方法很简单,如下:

pip install pandas-profiling
conda install -c anaconda pandas-profiling

用法

以titanic数据集来演示profiling的功能。

import pandas as pd
import pandas_profiling
df = pd.read_csv('titanic/train.csv')
pandas_profiling.ProfileReport(df) 

在这里插入图片描述
除了导入库之外只需要一行代码,就能显示数据报告的详细信息,包括必要的图表。

还可以使用以下代码将报告导出到交互式HTML文件中。

profile = pandas_profiling.ProfileReport(df)
profile.to_file(outputfile="Titanic data profiling.html")

在这里插入图片描述

二、pretty print

pprint是Python中的内置模块。它能够以格式清晰,可读性强漂亮格式打印任意数据结构。一个例子对比下printpprint

# 定义个字典,测试用
my_dict = {'Student_ID': 34,'Student_name' : 'Tom', 'Student_class' : 5,
          'Student_marks' : {'maths' : 92,
                            'science' : 95,
                            'social_science' : 65,
                            'English' : 88}
          }

print

# 正常的print
print(my_dict)
# 输出结果如下:
{'Student_ID': 34, 'Student_name': 'Tom', 'Student_class': 5, 'Student_marks': {'maths': 92, 'science': 95, 'social_science': 65, 'English': 88}}

pprint

# 使用pprint输出
import pprint
pprint.pprint(my_dict)
# 输出结果如下:
{'Student_ID': 34,
 'Student_class': 5,
 'Student_marks': {'English': 88,
                   'maths': 92,
                   'science': 95,
                   'social_science': 65},
 'Student_name': 'Tom'}

可以清楚看到pprint的优势之处,数据结构一目了然啊。

三、Python Debugger

交互式调试器也是一个神奇的函数,如果在运行代码单元格时出现报错,可以在新行中键入%debug运行它。这将打开一个交互式调试环境,自动转到报错发生的位置,并且还可以检查程序中分配的变量值并执行操作。要退出调试器,按q。比如下面这个例子。

x = [1,2,3]
y = 2
z = 5

result = y+z
print(result)
result2 = x+y
print(result2)

大家应该能看出x+y肯定会报错,因为二者不是一个类型,无法进行运算操作。然后我们敲入%debug

%debug

这时会出现对话框让我们互交式输入命令,比如我们可以像下面这样做。

在这里插入图片描述

四、Cufflinks

这个东哥在之前也介绍过,对于数据探索的可视化分析超级好用,低代码量便可生成漂亮的可视化图形。下面举一个例子,详细的可参见这篇Python一行代码搞定炫酷可视化,你需要了解一下Cufflinks

cufflinksplotly的基础上做了一进一步的包装,方法统一,参数配置简单。其次它还可以结合pandasdataframe随意灵活地画图。可以把它形容为pandas like visualization

比如下面的lins线图

import pandas as pd
import cufflinks as cf
import numpy as np

cf.set_config_file(offline=True)
cf.datagen.lines(1,500).ta_plot(study='sma',periods=[13,21,55])

在这里插入图片描述
再比如box箱型图

cf.datagen.box(20).iplot(kind='box',legend=False)

在这里插入图片描述

五、Pyforest

这是一个能让你偷懒的import神器,可以提前在配置文件里写好要导入的三方库,这样每次编辑脚本的时候就省去了开头的一大堆import 各种库,对于有常用和固定使用库的朋友来说无疑也是提高效率的工具之一。

pyforest支持大部分流行的数据科学库,比如pandasnumpymatplotlibseabornsklearntensorflow等等,以及常用的辅助库如ossysrepickle等。

此用法对于自己频繁调试很方便,但对于那些频繁跨环境比如和其它人共享脚本调试的时候就不是很好用了,因为别人不一定使用它。

此库东哥在之前也详细介绍过 牛逼!这个Python库竟然可以偷懒,和import说再见!看下面这个操作就明白了。

在这里插入图片描述

六、Jupyter notebook的笔记高亮

此方法仅适用于Jupyter notebook中,当我们想高亮笔记,让笔记变得美观的时候,这个方法非常的香。

笔记的高亮的颜色根据不同情况分为几种,前端的同学一看就明白,区别就是每种颜色代码的class类型不一样,其它只要在div标签中写内容就好。下面看下用法。

蓝色代表info

<div class="alert alert-block alert-info">
<b>Tip:</b> Use blue boxes (alert-info) for tips and notes. 
If it’s a note, you don’t have to include the word “Note”.
</div>

在这里插入图片描述
黄色代表warning

<div class="alert alert-block alert-warning">
<b>Example:</b> Yellow Boxes are generally used to include additional examples or mathematical formulas.
</div>

在这里插入图片描述
绿色代表success

<div class="alert alert-block alert-success">
Use green box only when necessary like to display links to related content.
</div>

在这里插入图片描述
红色代表danger

<div class="alert alert-block alert-danger">
It is good to avoid red boxes but can be used to alert users to not delete some important part of code etc. 
</div>

在这里插入图片描述
这里有个小提示东哥提示下,如果你直接复制到jupyter notebook中可能会报错,因为默认是代码的格式,所以你需要选中单元格按Esc变成可切换模式,然后再按Y切换成文本模式。这时候再运行shift+ok就ok了。看下面这个例子。

在这里插入图片描述
以上就是本次分享内容,欢迎各位朋友点赞留言收藏。

欢迎大家关注我的原创微信公众号 Python数据科学

查看原文

赞 4 收藏 2 评论 0

Python数据科学 发布了文章 · 6月7日

太赞了!分享一个数据科学利器 PyCaret,几行代码搞定从数据处理到模型部署

作者:帅阿东,数据爱好者
Python数据科学出品

学习数据科学很久了,从数据探索、数据预处理、数据模型搭建和部署这些过程一直有些重复性的工作比较浪费时间,尤其当你有个新的想法想要快速尝试下效果的时候,效率很低。

东哥最近发现一个开源的Python机器学习库,名字叫PyCaret,这个轮子正好可以为了解决我刚才所描述的困扰,它的特点是以low-code低代码量来快速解决从数据预处理到模型部署的整个流程。
在这里插入图片描述
用了一下感觉确实有点香,因此也和大家分享一下。

PyCaret是什么?

PyCaret是一个将我们常用到的机器学习库进行封装了的轮子。

常用的都有啥呢?

比如pandas,numpy做数据处理的,matplotlib,seaborn数据可视化的,sklearn,xgboost,catboost,lightgbm等各种模型的,总共有30个。在安装PyCaret的时候会附带着一起都安装上。

封装这么多库干什么用?

PyCaret依赖了这么多的神库肯定是要搞事情啊。没错,机器学习中的一些操作步骤都可在PyCaret自动开发的pipeline中进行复现。在 Pycaret 中所执行的所有操作均按顺序存储在 Pipeline 中,该 Pipeline 针对模型部署进行了完全配置。

PyCaret就像是把所有都安排好了一样,我们按照它定义的函数使用就可以了。不管是填充缺失值、转换类别数据、执行特征工程设计,还是调参,Pycaret 都能够自动执行。 所以才可以实现用几行代码搞定从预处理到模型部署的整个流程。

而且pipeline可以保存为二进制文件格式,支持在不同环境中进行迁移。

PyCaret支持的模型算法

PyCaret支持6个模块,有监督无监督模型的训练和部署,分别有分类、回归、聚类、异常检测、自然语言处理和关联规则挖掘。
在这里插入图片描述

PyCaret安装

pip install pycaret

老样子,命令行pip install皆可安装。

为了防止安装的这些依赖可能与之前你已安装过的发生冲突,建议可以创建个Python的虚拟环境安装PyCaret以减少不必要的麻烦,比如用python3 virtualenv或者conda。就拿conda为例吧。

#创建一个新的虚拟环境
conda create --name yourenvname python=3.7
#激活
conda activate yourenvname
#安装
pip install pycaret

如果不好使也可以尝试从源安装。

pip install C:/path_to_download/pycaret-version.tar.gz

PyCaret如何使用?

像这种数据建模类的工作会涉及很多交互式的操作,所以东哥首推在Jupyter notebook中运行代码。

PyCaret库的函数有五个大类,初始化、模型训练、模型集成、模型分析与模型部署,基本上覆盖了我们正常建模的顺序,只不过预处理都在初始化中完成了。具体使用方法见后面实例。

一、初始化

PyCaret初始化包括了两部分内容,一、获取数据;二、建立环境。

1. 获取数据

PyCaret自带了很多数据集,样本几万条的,特征几百个的,对于我们练习绝对是够用了。比如这样:

from pycaret.datasets import get_data
data = get_data('juice') 

2. 建立环境

这一步是必须的。首先,我们要选择使用哪个模块,分类、回归、聚类
还是其他的。比如我们要用classification分类模型。

from pycaret.datasets import get_data
diabetes = get_data('diabetes')
# 初始化
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')

上面setup函数就建立了基础环境,其中参数约束了数据集和目标变量。
在这里插入图片描述

setup参数除了上面这两个以外,还有N多个参数可以控制。所有预处理的步骤都会应用至 setup() 中,PyCaret 拥有 20 余项功能可运用于 ML 相关的数据准备,比如样本的划分数据预处理缺失值处理独热编码归一化特征工程特征选择等等。
在这里插入图片描述
比如要用归一化,那么令normalizeTure就好了,其它的同理。

clf1 = setup(data = pokemon, target = 'Legendary', normalize = True)

如果还要用其他的,在setup里面加就好了,至于处理的顺序不用我们管,pipeline已经自动搞定了。

另外,PyCaret 的一大优点是: Pipeline 可保存成二进制,轻松地在各环境之间相互迁移,比如大规模运行或是轻松部署到生产环境中。

二、模型训练

模型训练包括三个部分,模型比较,模型创建,模型调优

1. 模型比较

这是模型训练的第一步。compare_models 函数会训练模型库中的所有模型,并使用 k 折交叉验证(默认 k=10)来比较常见的评估指标。所使用的评估指标如下所示:

  • 分类模块:Accuracy, AUC, Recall, Precision, F1, Kappa
  • 回归模块:MAE, MSE, RMSE, R2, RMSLE, MAPE

下面是模型比较函数的使用,只需要这么一行代码!

# 比较所有模型
compare_models()

来看一下结果,直接给出所有模型跑出的结果,直观地对比。
在这里插入图片描述

2. 模型创建

当我们比较了各模型的结果后,知道了哪个模型最适合,这时只要在创建函数create_model中传入一个模型参数就行,同样一行代码搞定。

# 创建逻辑回归模型
lr = create_model('lr')

在这里插入图片描述
PyCaret 有 60 多个开源即用型算法,每个模型都有对应的缩写(可以查表),比如上面逻辑回归直接写上lr就可以完成。

变量lr存储一个由create_model函数返回的训练模型对象,可以通过在变量后使用标点.来访问训练对象的原始属性。

3. 模型调优

同样的,在模型调优tune_model函数中传入模型lr参数,PyCaret将自动调优。

# 调节 LR 模型
tuned_lr = tune_model('lr')

在这里插入图片描述

三、模型集成

1. 集成模型
模型集成函数ensemble_model可以直接调用生成的模型对象,然后做集成处理。默认使用Bagging方法用于模型集成,用户也可函数中的method参数将其转换为Boosting

# 创建一个决策树模型
dt = create_model('dt')
dt_bagged = ensemble_model(dt)

在这里插入图片描述
除此外,PyCaret还提供了blend_modelsstack_models 功能,来集成多个训练好的模型。

2. blend模型

# blend_models 混合特殊的模型
blender = blend_models(estimator_list = [dt, catboost, lightgbm])

3. stack模型

# 创建单个模型,用于stacking
ridge = create_model('ridge')
lda = create_model('lda')
gbc = create_model('gbc')
xgboost = create_model('xgboost')
# stacking 模型
stacker = stack_models(estimator_list = [ridge,lda,gbc], meta_model = xgboost)

四、模型分析

模型分析主要可以做两个事情:一、模型绘制;二、模型解释。

1. 模型绘制

我们需要分析什么模型指标,只要传入函数中即可,比如对adaboost模型分析AUC指标。

# 创建逻辑回归模型
adaboost = create_model('adaboost') 
plot_model(adaboost, plot = 'auc') # AUC plot
plot_model(adaboost, plot = 'boundary') # Decision Boundary
plot_model(adaboost, plot = 'pr') # Precision Recall Curve
plot_model(adaboost, plot = 'vc') # Validation Curve

在这里插入图片描述
如果你不想单独绘制所有这些可视化,那么PyCaret库有另一个惊人的功能evaluate_model。在此功能中,只需要传递模型对象,PyCaret将创建一个交互式窗口,供你·以所有可能的方式查看和分析模型:
在这里插入图片描述

2. 模型解释

在大多数机器学习项目中,解释复杂模型非常重要。通过分析模型认为重要的内容,有助于模型调优。在PyCaret中,此步骤非常简单,只需编写interpret_model即可获取Shapley值。

# 创建一个模型
xgboost = create_model('xgboost')
interpret_model(xgboost) # summary plot
interpret_model(xgboost, plot = 'correlation') # correlation plot

在这里插入图片描述
测试数据集上特定数据点的解释可以通过reason图来评估。如下图所示:在测试数据集上检查首个实例。

interpret_model(xgboost, plot = 'reason', observation = 0)

在这里插入图片描述

五、模型部署

模型调优后要将模型在测试集上进行测试,使用predict_model函数。

1. 模型预测

# 创建模型
rf = create_model('rf') # 预测测试集
rf_holdout_pred = predict_model(rf)

在这里插入图片描述
以上是对模型测试集进行的预测,如果对于未见过的新数据预测,PyCaret提供一个迭代的预测结果,在predict_model函数指定data,像下面这样。

2. 模型完成

最后确认模型finalize_model才能进行部署。

# finalize a model
final_rf = finalize_model(rf)

3. 模型部署

该功能将pipeline和经过训练的模型保存为最终用户应用程序可以作为二进制pickle文件使用。或者,可以使用PyCaret将模型部署在云上。在云上部署模型就像编写deploy_model一样简单。

比如对于AWS用户来说,在将模型部署到AWS S3('aws')之前,必须使用命令行界面配置环境变量。要配置AWS环境变量,请在python命令行中输入aws configure。需要以下信息,可以使用亚马逊控制台帐户的身份和访问管理(IAM)门户生成。

  • AWS访问密钥ID
  • AWS访问密钥
  • 默认区域名称(可以在您的AWS控制台的“全局设置”下看到)
  • 默认输出格式(必须留空)
# 创建模型
lr = create_model('lr')
# 最终确定模型
final_lr = finalize_model(lr)
# 部署模型
deploy_model(final_lr, model_name = 'lr_aws', platform = 'aws', authentication = { 'bucket'  : 'pycaret-test' })

用户也能够以二进制文件的格式保存整个实验,包括所有中间输出。

# 创建模型
adaboost = create_model('ada') 
# 二进制保存模型
save_model(adaboost, model_name = 'ada_for_deployment') 

以上就是PyCaret的介绍和使用方法,具体教程也可以参考:

https://pycaret.org/guide/

老铁,要不点个赞再走可好?么么哒

关注我的原创微信公众号 Python数据科学,专注于写基于Python的数据算法、机器学习、深度学习硬核干货。

保证让你看完有所收获,不信你打我。后台回复『干货』送你Python入门、机器学习、数据挖掘等丰富项目资源。

作者简介
作者:大家好,我是帅阿东。原为机械专业,凭借自己的努力成功转行数据分析,目前担任某大银行风控建模职位,创立『Python数据科学』公众号,拥有近10w粉丝,文章涵盖爬虫,数据分析、机器学习等大量干货和实战项目讲解,提供海量学习资源,期待你的关注,和我一起学习。 转载说明:未获得授权,禁止转载。
查看原文

赞 7 收藏 5 评论 0

Python数据科学 收藏了文章 · 6月5日

深入理解 MySql 的 Explain

timg.jpg

相信大部分入门数据库的朋友都是从数据库的“增删改查”学起的。其实,对于很多搞业务的非专业技术人员而言,可能基本的增删改查也够用了,因为目的并不是要写的多好,只要能正确查到自己想要的分析的数据就可以了。

但是,对于一个专业搞数据分析的人而言,可就没那么简单了。这个自己平时跑个小数可能也没啥感觉,但现实工作中当公司业务数据量达到百万甚至千万级以上时,一个查询语句写的好坏所造成的影响就尤为明显了。所以也就不难理解为什么面试的时候面试官喜欢问一些关于优化的问题。

为了了解自己写的SQL是好是坏,MySql提供了Explain执行计划功能。它对优化SQL语句尤为的重要,通过它可以看清执行过程的细节,分析查询语句或是结构的性能瓶颈,找到问题所在。

如何使用Explain?

explain的使用很简单,就是在select 语句之前增加 explain关键字就ok了。MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL。比如这样:

# explain + sql
explain select * from table where a = 1;

Explain执行计划能做什么?

  • 确定表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

可以看出执行计划给我们提供的信息是非常有帮助的。只有读懂了这些内容,才能定位问题点在哪,进而去解决。下面东哥给大家介绍一下explain执行计划的内容。

因为有些字段光看很难理解,因此建立三个表作为例子来说明,感兴趣的朋友也可以自己跑下试试。

DROP TABLE IF EXISTS `actor`;
CREATE TABLE `actor` (
 `id` int(11) NOT NULL,
 `name` varchar(45) DEFAULT NULL,
 `update_time` datetime DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `actor` (`id`, `name`, `update_time`) VALUES (1,'a','2017-12-22 15:27:18');
INSERT INTO `actor` (`id`, `name`, `update_time`) VALUES (2,'b','2017-12-22 15:27:18');
INSERT INTO `actor` (`id`, `name`, `update_time`) VALUES (3,'c','2017-12-22 15:27:18');
DROP TABLE IF EXISTS `film`;
CREATE TABLE `film` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `film` (`id`, `name`) VALUES (3,'film0');
INSERT INTO `film` (`id`, `name`) VALUES (1,'film1');
INSERT INTO `film` (`id`, `name`) VALUES (2,'film2');
DROP TABLE IF EXISTS `film_actor`;
CREATE TABLE `film_actor` (
 `id` int(11) NOT NULL,
 `film_id` int(11) NOT NULL,
 `actor_id` int(11) NOT NULL,
 `remark` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_film_actor_id` (`film_id`,`actor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `film_actor` (`id`, `film_id`, `actor_id`) VALUES (1,1,1);
INSERT INTO `film_actor` (`id`, `film_id`, `actor_id`) VALUES (2,1,2);
INSERT INTO `film_actor` (`id`, `film_id`, `actor_id`) VALUES (3,2,1);

注意:上面三张表中,actor主键为id;film主键为id,以name字段为索引;film_actor表中id为主键,以film_id和actor_id为联合索引。

执行计划的内容介绍

我们在Navicat里随便执行一个查询语句,看看都会返回哪些内容。

explain select (select id from actor limit 1) from film;

image.png
执行后的结果不是查询的数据而是执行计划的解释,一共有id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra这些字段,每个都代表不同的含义,下面详细介绍。

id

id 决定了每个表的加载和读取顺序。比如你写了个复杂的嵌套逻辑,有很多子查询,那每个select执行的顺序就可通过id序列号观察出来。

原则是:id值越大越先被执行。id值相同的按从上到下的顺序执行。id为NULL的最后执行。

1、id相同

explain select * from film, actor, film_actor where film.id=actor.id and film.id=film_actor.id;

image.png

2、id不同

explain select (select id from actor limit 1) from film;

image.png

select_type

select查询的类型主要有三大类:

1、简单类型

SIMPLE:最简单的select查询,就是查询中不包含子查询或者union,表里如一。

explain select * from film where id=1;

image.png

2、嵌套类型

PRIMARY、SUBQUERY、DERIVED 这三个是用在有嵌套逻辑的语句中的。

PRIMARY:嵌套查询最外层的部分被标记为PRIMARY。

SUBQUERY:出现在select或者where后面中的子查询被标记为SUBQUERY。

DERIVED:这个其实我理解是SUBQUERY的一种特例,只不过出现的位置比较特殊,是在from后面的子查询,MySQL会将子查询结果存放在一个临时表中,称为派生表,因为这是我们派生出来的,而非原始表。

通过一个例子说明。

explain select (select id from actor where id = 1) from (select * from film) t;

image.png

3、组合类型

组合类型包括UNION和UNION RESULT两个。

UNION:UNION前后如果有两个select ,那么把出现在union之后的第二个select标记为UNION;如果UNION包含在from 子句的子查询中,外层select将被标记为DERIVED。

UNION RESULT:从 UNION表获取结果的select。

通过一个例子说明。

explain select id from actor union all select id from actor;

image.png

table

表示正在访问哪个表,以表的名称出现。

但是有两个特殊的情况:

1)当 from 子句中有子查询(派生表)时,那table就会以 < derivedN > 格式出现。因为此时查询所依赖的表是一个我们派生出来的表,即依赖一个 id 为 N 的子查询的。比如:

explain select (select id from actor where id = 1) from (select * from film) t;

image.png
2)当使用 union 时,UNION RESULT 的 table 值为 <union1,2>,1和2表示参与 union 的 select 行id。比如:

explain select id from actor union all select id from actor;

image.png

type

访问类型,表示MySQL是如何访问数据的,是全表扫描还是通过索引等?这是考量sql查询优化中一个很重要的指标,共分有很多种类型,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,好的sql查询至少达到range级别,最好能达到ref。下面挑几个常见且比较重要的说一下。

1. system

表里只有一行记录,这个属于const类型的特例,一行数据平时很少出现,可以忽略不计。

2. const

表示通过索引一次就找到了,const用于比较primary key 或者 unique索引。因为只需匹配一行数据,所有很快。如果将主键置于where列表中,mysql就能将该查询转换为一个const。

systemconst有啥区别呢?看解释不太好理解,举一个例子。

explain select * from (select * from film where id = 1) tmp;

image.png
这里子查询就是const,而最外层查询则为system,为什么呢?

因为子查询将主键id置于where中选择,我们知道主键是有唯一性的,所以这个子查询就只返回一行记录,即匹配了一行数据。而外层查询没得选,因为子查询派生表就给了它一行数据,也就是说它要查询的表里就一行数据。因此,system是表里只有一行数据,const是从表里选出唯一一条数据,表里可能很多数据。

3. eq_ref

唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。

explain select * from film_actor left join film on film_actor.film_id = film.id;

image.png

4. ref

相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。举例如下:

普通索引的简单查询

explain select * from film where name = "film1";

image.png
关联表查询,idx_film_actor_idfilm_idactor_id的联合索引。这里使用到了film_actor的左边前缀film_id部分。

explain select film_id from film left join film_actor on film.id = film_actor.film_id;

image.png

5. range

只检索给定范围的行,使用一个索引来选择行。key列显示使用了那个索引。一般就是在where语句中出现了bettween<>in等的查询。这种索引列上的范围扫描比全索引扫描要好。只需要开始于某个点,结束于另一个点,不用扫描全部索引

explain select * from actor where id > 1;

image.png

6. index

Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(Index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取)

explain select * from film;

image.png
这里用了查找所有*,但也返回了index,这是因为这个表里的两个字段都是索引,id是主键,name也被定位为索引。

7. all

全表扫描,意味MySQL需要从头到尾去查找所需要的行。通常情况下这需要增加索引来进行优化了。

explain select * from film_actor;

image.png

possible_keys

这一列显示查询可能使用哪些索引来查找。explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。

如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。

key

这一列显示MySQL实际采用哪个索引来优化对该表的访问。如果没有使用索引,则该列是 NULL。如果想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。

key_len

表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len是根据表定义计算而得的,不是通过表内检索出的

举例说明:film_actor的联合索引 idx_film_actor_idfilm_idactor_id 两个int列组成,并且每个int是4字节。通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。

explain select * from film_actor where film_id = 2;

image.png

ref

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名。举例如下:

ref为常量

explain select * from film_actor where film_id = 2;

image.png

ref为字段

explain select film_id from film left join film_actor on film.id = film_actor.film_id;

image.png

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

Extra

最后一列展示额外的信息。有以下几种重要的值,Using filesort Using temporaryUsing indexUsing where Using index,``

1、Using filesort

MySQL对数据使用一个外部的索引排序,而不是按照表内的索引进行排序读取。也就是说mysql无法利用索引完成的排序操作成为“文件排序” 。这种情况下一般也是要考虑使用索引来优化的。

explain select * from actor order by name;

image.png

2、Using temporary

mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。常见于order by 和 group by。

举例如下:
actor.name没有索引,此时创建了张临时表。

explain select distinct name from actor;

image.png

3、Using index

表示相应的select操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高
如果同时出现Using where,表明索引被用来执行索引键值的查找
如果没用同时出现Using where,表明索引用来读取数据而非执行查找动作。

explain select film_id from film_actor where film_id = 1;

image.png

关于索引会专门写一篇文章介绍。

参考:

https://blog.csdn.net/belalds...
https://blog.csdn.net/UncleMo...

最后,如果喜欢本篇文章,欢迎点赞和收藏。
更多精彩内容请关注我的微信公众号:Python数据科学

查看原文

Python数据科学 发布了文章 · 6月5日

深入理解 MySql 的 Explain

timg.jpg

相信大部分入门数据库的朋友都是从数据库的“增删改查”学起的。其实,对于很多搞业务的非专业技术人员而言,可能基本的增删改查也够用了,因为目的并不是要写的多好,只要能正确查到自己想要的分析的数据就可以了。

但是,对于一个专业搞数据分析的人而言,可就没那么简单了。这个自己平时跑个小数可能也没啥感觉,但现实工作中当公司业务数据量达到百万甚至千万级以上时,一个查询语句写的好坏所造成的影响就尤为明显了。所以也就不难理解为什么面试的时候面试官喜欢问一些关于优化的问题。

为了了解自己写的SQL是好是坏,MySql提供了Explain执行计划功能。它对优化SQL语句尤为的重要,通过它可以看清执行过程的细节,分析查询语句或是结构的性能瓶颈,找到问题所在。

如何使用Explain?

explain的使用很简单,就是在select 语句之前增加 explain关键字就ok了。MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL。比如这样:

# explain + sql
explain select * from table where a = 1;

Explain执行计划能做什么?

  • 确定表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

可以看出执行计划给我们提供的信息是非常有帮助的。只有读懂了这些内容,才能定位问题点在哪,进而去解决。下面东哥给大家介绍一下explain执行计划的内容。

因为有些字段光看很难理解,因此建立三个表作为例子来说明,感兴趣的朋友也可以自己跑下试试。

DROP TABLE IF EXISTS `actor`;
CREATE TABLE `actor` (
 `id` int(11) NOT NULL,
 `name` varchar(45) DEFAULT NULL,
 `update_time` datetime DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `actor` (`id`, `name`, `update_time`) VALUES (1,'a','2017-12-22 15:27:18');
INSERT INTO `actor` (`id`, `name`, `update_time`) VALUES (2,'b','2017-12-22 15:27:18');
INSERT INTO `actor` (`id`, `name`, `update_time`) VALUES (3,'c','2017-12-22 15:27:18');
DROP TABLE IF EXISTS `film`;
CREATE TABLE `film` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `film` (`id`, `name`) VALUES (3,'film0');
INSERT INTO `film` (`id`, `name`) VALUES (1,'film1');
INSERT INTO `film` (`id`, `name`) VALUES (2,'film2');
DROP TABLE IF EXISTS `film_actor`;
CREATE TABLE `film_actor` (
 `id` int(11) NOT NULL,
 `film_id` int(11) NOT NULL,
 `actor_id` int(11) NOT NULL,
 `remark` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_film_actor_id` (`film_id`,`actor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `film_actor` (`id`, `film_id`, `actor_id`) VALUES (1,1,1);
INSERT INTO `film_actor` (`id`, `film_id`, `actor_id`) VALUES (2,1,2);
INSERT INTO `film_actor` (`id`, `film_id`, `actor_id`) VALUES (3,2,1);

注意:上面三张表中,actor主键为id;film主键为id,以name字段为索引;film_actor表中id为主键,以film_id和actor_id为联合索引。

执行计划的内容介绍

我们在Navicat里随便执行一个查询语句,看看都会返回哪些内容。

explain select (select id from actor limit 1) from film;

image.png
执行后的结果不是查询的数据而是执行计划的解释,一共有id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra这些字段,每个都代表不同的含义,下面详细介绍。

id

id 决定了每个表的加载和读取顺序。比如你写了个复杂的嵌套逻辑,有很多子查询,那每个select执行的顺序就可通过id序列号观察出来。

原则是:id值越大越先被执行。id值相同的按从上到下的顺序执行。id为NULL的最后执行。

1、id相同

explain select * from film, actor, film_actor where film.id=actor.id and film.id=film_actor.id;

image.png

2、id不同

explain select (select id from actor limit 1) from film;

image.png

select_type

select查询的类型主要有三大类:

1、简单类型

SIMPLE:最简单的select查询,就是查询中不包含子查询或者union,表里如一。

explain select * from film where id=1;

image.png

2、嵌套类型

PRIMARY、SUBQUERY、DERIVED 这三个是用在有嵌套逻辑的语句中的。

PRIMARY:嵌套查询最外层的部分被标记为PRIMARY。

SUBQUERY:出现在select或者where后面中的子查询被标记为SUBQUERY。

DERIVED:这个其实我理解是SUBQUERY的一种特例,只不过出现的位置比较特殊,是在from后面的子查询,MySQL会将子查询结果存放在一个临时表中,称为派生表,因为这是我们派生出来的,而非原始表。

通过一个例子说明。

explain select (select id from actor where id = 1) from (select * from film) t;

image.png

3、组合类型

组合类型包括UNION和UNION RESULT两个。

UNION:UNION前后如果有两个select ,那么把出现在union之后的第二个select标记为UNION;如果UNION包含在from 子句的子查询中,外层select将被标记为DERIVED。

UNION RESULT:从 UNION表获取结果的select。

通过一个例子说明。

explain select id from actor union all select id from actor;

image.png

table

表示正在访问哪个表,以表的名称出现。

但是有两个特殊的情况:

1)当 from 子句中有子查询(派生表)时,那table就会以 < derivedN > 格式出现。因为此时查询所依赖的表是一个我们派生出来的表,即依赖一个 id 为 N 的子查询的。比如:

explain select (select id from actor where id = 1) from (select * from film) t;

image.png
2)当使用 union 时,UNION RESULT 的 table 值为 <union1,2>,1和2表示参与 union 的 select 行id。比如:

explain select id from actor union all select id from actor;

image.png

type

访问类型,表示MySQL是如何访问数据的,是全表扫描还是通过索引等?这是考量sql查询优化中一个很重要的指标,共分有很多种类型,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,好的sql查询至少达到range级别,最好能达到ref。下面挑几个常见且比较重要的说一下。

1. system

表里只有一行记录,这个属于const类型的特例,一行数据平时很少出现,可以忽略不计。

2. const

表示通过索引一次就找到了,const用于比较primary key 或者 unique索引。因为只需匹配一行数据,所有很快。如果将主键置于where列表中,mysql就能将该查询转换为一个const。

systemconst有啥区别呢?看解释不太好理解,举一个例子。

explain select * from (select * from film where id = 1) tmp;

image.png
这里子查询就是const,而最外层查询则为system,为什么呢?

因为子查询将主键id置于where中选择,我们知道主键是有唯一性的,所以这个子查询就只返回一行记录,即匹配了一行数据。而外层查询没得选,因为子查询派生表就给了它一行数据,也就是说它要查询的表里就一行数据。因此,system是表里只有一行数据,const是从表里选出唯一一条数据,表里可能很多数据。

3. eq_ref

唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。

explain select * from film_actor left join film on film_actor.film_id = film.id;

image.png

4. ref

相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。举例如下:

普通索引的简单查询

explain select * from film where name = "film1";

image.png
关联表查询,idx_film_actor_idfilm_idactor_id的联合索引。这里使用到了film_actor的左边前缀film_id部分。

explain select film_id from film left join film_actor on film.id = film_actor.film_id;

image.png

5. range

只检索给定范围的行,使用一个索引来选择行。key列显示使用了那个索引。一般就是在where语句中出现了bettween<>in等的查询。这种索引列上的范围扫描比全索引扫描要好。只需要开始于某个点,结束于另一个点,不用扫描全部索引

explain select * from actor where id > 1;

image.png

6. index

Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(Index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取)

explain select * from film;

image.png
这里用了查找所有*,但也返回了index,这是因为这个表里的两个字段都是索引,id是主键,name也被定位为索引。

7. all

全表扫描,意味MySQL需要从头到尾去查找所需要的行。通常情况下这需要增加索引来进行优化了。

explain select * from film_actor;

image.png

possible_keys

这一列显示查询可能使用哪些索引来查找。explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。

如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。

key

这一列显示MySQL实际采用哪个索引来优化对该表的访问。如果没有使用索引,则该列是 NULL。如果想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。

key_len

表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len是根据表定义计算而得的,不是通过表内检索出的

举例说明:film_actor的联合索引 idx_film_actor_idfilm_idactor_id 两个int列组成,并且每个int是4字节。通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。

explain select * from film_actor where film_id = 2;

image.png

ref

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名。举例如下:

ref为常量

explain select * from film_actor where film_id = 2;

image.png

ref为字段

explain select film_id from film left join film_actor on film.id = film_actor.film_id;

image.png

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

Extra

最后一列展示额外的信息。有以下几种重要的值,Using filesort Using temporaryUsing indexUsing where Using index,``

1、Using filesort

MySQL对数据使用一个外部的索引排序,而不是按照表内的索引进行排序读取。也就是说mysql无法利用索引完成的排序操作成为“文件排序” 。这种情况下一般也是要考虑使用索引来优化的。

explain select * from actor order by name;

image.png

2、Using temporary

mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。常见于order by 和 group by。

举例如下:
actor.name没有索引,此时创建了张临时表。

explain select distinct name from actor;

image.png

3、Using index

表示相应的select操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高
如果同时出现Using where,表明索引被用来执行索引键值的查找
如果没用同时出现Using where,表明索引用来读取数据而非执行查找动作。

explain select film_id from film_actor where film_id = 1;

image.png

关于索引会专门写一篇文章介绍。

参考:

https://blog.csdn.net/belalds...
https://blog.csdn.net/UncleMo...

最后,如果喜欢本篇文章,欢迎点赞和收藏。
更多精彩内容请关注我的微信公众号:Python数据科学

查看原文

赞 18 收藏 15 评论 0

Python数据科学 收藏了文章 · 4月11日

厉害了!每30秒学会一个Python小技巧,Github星数4600+

640?wx_fmt=png

作者:xiaoyu,数据爱好者
Python数据科学出品

很多学习Python的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经有了很好的方法来解决。当然,孰能生巧,当我们代码熟练了,自然就能总结一些好用的技巧,不过对于那些还在刚熟悉Python的同学可能并不会那么轻松。

本次给大家推荐一个学习这些技巧的很好的资源“30-seconds-of-python”,所有技巧方法只要30秒就能get到,完全可以利用业务时间不断积累。下面赶紧来看一下。

https://github.com/30-seconds...

内容目录

下面是30秒学Python的整个目录,分为几大板块:ListMathObjectStringUtility,以下是整理的思维脑图。

640?wx_fmt=jpeg

我挑选了10个实用并很有意思的方法分享给大家,其余的感兴趣可以自行学习。

1. List:all_equal
功能实现:检验一个列表中的所有元素是否都一样。
解读:使用[1:] 和 [:-1] 来比较给定列表的所有元素。

def all_equal(lst):
return lst[1:] == lst[:-1]

举例:

all_equal([1, 2, 3, 4, 5, 6]) # False
all_equal([1, 1, 1, 1]) # True

2. List:all_unique
功能实现:如果列表所有值都是唯一的,返回 True,否则 False
解读:在给定列表上使用集合set()去重,比较它和原列表的长度。

def all_unique(lst):
return len(lst) == len(set(lst))

举例:

x = [1,2,3,4,5,6]
y = [1,2,2,3,4,5]
all_unique(x) # True
all_unique(y) # False

3. List:bifurcate
功能实现:将列表值分组。如果在filter的元素是True,那么对应的元素属于第一个组;否则属于第二个组。
解读:使用列表推导式和enumerate()基于filter元素到各组。

def bifurcate(lst, filter):
    return [
    [x for i,x in enumerate(lst) if filter[i] == True],
    [x for i,x in enumerate(lst) if filter[i] == False]
  ]

举例:

bifurcate(['beep', 'boop', 'foo', 'bar'], [True, True, False, True])

# [ ['beep', 'boop', 'bar'], ['foo'] ]

4. List:difference
功能实现:返回两个iterables间的差异。
解读:创建b的集合,使用a的列表推导式保留不在_b中的元素。

def difference(a, b):
  _b = set(b)
return [item for item in a if item not in _b]

举例:

difference([1, 2, 3], [1, 2, 4]) # [3]

5. List:flatten
功能实现:一次性的整合列表。
解读:使用嵌套的列表提取子列表的每个值。

def flatten(lst):
return [x for y in lst for x in y]

举例:

flatten([[1,2,3,4],[5,6,7,8]]) # [1, 2, 3, 4, 5, 6, 7, 8]

6. Math:digitize
功能实现:将一个数分解转换为个位数字。
解读:将n字符化后使用map()函数结合int完成转化

def digitize(n):
return list(map(int, str(n)))

举例:

digitize(123) # [1, 2, 3]

7. List:shuffle
功能实现:将列表元素顺序随机打乱。
解读:使用Fisher-Yates算法重新排序列表元素。

from copy import deepcopy
from random import randint

def shuffle(lst):
  temp_lst = deepcopy(lst)
  m = len(temp_lst)
while (m):
    m -= 1
    i = randint(0, m)
    temp_lst[m], temp_lst[i] = temp_lst[i], temp_lst[m]
return temp_lst

举例:

foo = [1,2,3]
shuffle(foo) # [2,3,1] , foo = [1,2,3]

8. Math:clamp_number
功能实现:将数字num钳在由a和b边界值规定的范围中。
解读:如果num落尽范围内,返回num;否则,返回范围内最接近的数字。

def clamp_number(num,a,b):
return max(min(num, max(a,b)),min(a,b))

举例:

clamp_number(2, 3, 5) # 3
clamp_number(1, -1, -5) # -1

9. String:byte_size
功能实现:返回字符串的字节数。
解读:使用string.encode('utf-8')解码给定字符串,返回长度。

def byte_size(string):
    return len(string.encode('utf-8'))

举例:

byte_size('?') # 4
byte_size('Hello World') # 11

10. Math:gcd
功能实现:计算几个数的最大公因数。
解读:使用reduce()math.gcd在给定列表上实现。

from functools import reduce
import math

def gcd(numbers):
    return reduce(math.gcd, numbers)

举例:

gcd([8,36,28]) # 4

以上就是30秒学python的各种小技巧。怎么样,对于一些常见操作是不是有了一些新的启发,除此之外,还有很多其它技巧可以慢慢学习,希望对各位读者有所帮助。

https://github.com/30-seconds...

最后,如果喜欢本篇文章,欢迎点赞收藏。更多精彩内容请关注Python数据科学

查看原文

Python数据科学 发布了文章 · 4月11日

厉害了!每30秒学会一个Python小技巧,Github星数4600+

640?wx_fmt=png

作者:xiaoyu,数据爱好者
Python数据科学出品

很多学习Python的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经有了很好的方法来解决。当然,孰能生巧,当我们代码熟练了,自然就能总结一些好用的技巧,不过对于那些还在刚熟悉Python的同学可能并不会那么轻松。

本次给大家推荐一个学习这些技巧的很好的资源“30-seconds-of-python”,所有技巧方法只要30秒就能get到,完全可以利用业务时间不断积累。下面赶紧来看一下。

https://github.com/30-seconds...

内容目录

下面是30秒学Python的整个目录,分为几大板块:ListMathObjectStringUtility,以下是整理的思维脑图。

640?wx_fmt=jpeg

我挑选了10个实用并很有意思的方法分享给大家,其余的感兴趣可以自行学习。

1. List:all_equal
功能实现:检验一个列表中的所有元素是否都一样。
解读:使用[1:] 和 [:-1] 来比较给定列表的所有元素。

def all_equal(lst):
return lst[1:] == lst[:-1]

举例:

all_equal([1, 2, 3, 4, 5, 6]) # False
all_equal([1, 1, 1, 1]) # True

2. List:all_unique
功能实现:如果列表所有值都是唯一的,返回 True,否则 False
解读:在给定列表上使用集合set()去重,比较它和原列表的长度。

def all_unique(lst):
return len(lst) == len(set(lst))

举例:

x = [1,2,3,4,5,6]
y = [1,2,2,3,4,5]
all_unique(x) # True
all_unique(y) # False

3. List:bifurcate
功能实现:将列表值分组。如果在filter的元素是True,那么对应的元素属于第一个组;否则属于第二个组。
解读:使用列表推导式和enumerate()基于filter元素到各组。

def bifurcate(lst, filter):
    return [
    [x for i,x in enumerate(lst) if filter[i] == True],
    [x for i,x in enumerate(lst) if filter[i] == False]
  ]

举例:

bifurcate(['beep', 'boop', 'foo', 'bar'], [True, True, False, True])

# [ ['beep', 'boop', 'bar'], ['foo'] ]

4. List:difference
功能实现:返回两个iterables间的差异。
解读:创建b的集合,使用a的列表推导式保留不在_b中的元素。

def difference(a, b):
  _b = set(b)
return [item for item in a if item not in _b]

举例:

difference([1, 2, 3], [1, 2, 4]) # [3]

5. List:flatten
功能实现:一次性的整合列表。
解读:使用嵌套的列表提取子列表的每个值。

def flatten(lst):
return [x for y in lst for x in y]

举例:

flatten([[1,2,3,4],[5,6,7,8]]) # [1, 2, 3, 4, 5, 6, 7, 8]

6. Math:digitize
功能实现:将一个数分解转换为个位数字。
解读:将n字符化后使用map()函数结合int完成转化

def digitize(n):
return list(map(int, str(n)))

举例:

digitize(123) # [1, 2, 3]

7. List:shuffle
功能实现:将列表元素顺序随机打乱。
解读:使用Fisher-Yates算法重新排序列表元素。

from copy import deepcopy
from random import randint

def shuffle(lst):
  temp_lst = deepcopy(lst)
  m = len(temp_lst)
while (m):
    m -= 1
    i = randint(0, m)
    temp_lst[m], temp_lst[i] = temp_lst[i], temp_lst[m]
return temp_lst

举例:

foo = [1,2,3]
shuffle(foo) # [2,3,1] , foo = [1,2,3]

8. Math:clamp_number
功能实现:将数字num钳在由a和b边界值规定的范围中。
解读:如果num落尽范围内,返回num;否则,返回范围内最接近的数字。

def clamp_number(num,a,b):
return max(min(num, max(a,b)),min(a,b))

举例:

clamp_number(2, 3, 5) # 3
clamp_number(1, -1, -5) # -1

9. String:byte_size
功能实现:返回字符串的字节数。
解读:使用string.encode('utf-8')解码给定字符串,返回长度。

def byte_size(string):
    return len(string.encode('utf-8'))

举例:

byte_size('?') # 4
byte_size('Hello World') # 11

10. Math:gcd
功能实现:计算几个数的最大公因数。
解读:使用reduce()math.gcd在给定列表上实现。

from functools import reduce
import math

def gcd(numbers):
    return reduce(math.gcd, numbers)

举例:

gcd([8,36,28]) # 4

以上就是30秒学python的各种小技巧。怎么样,对于一些常见操作是不是有了一些新的启发,除此之外,还有很多其它技巧可以慢慢学习,希望对各位读者有所帮助。

https://github.com/30-seconds...

最后,如果喜欢本篇文章,欢迎点赞收藏。更多精彩内容请关注Python数据科学

查看原文

赞 33 收藏 19 评论 3

认证与成就

  • 获得 1315 次点赞
  • 获得 7 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 7 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2018-01-03
个人主页被 17.7k 人浏览