如何创建和使用自定义 Matplotlib 样式表
为什么要使用样式表?
数据可视化的美感非常重要。我经常认为这是“漂亮的数据应该得到漂亮的展示”——过分讲究图表样式是不被鼓励的,但是适当的润色会大有帮助。
然而,对于我们通常用 matplotlib 或 seaborn 制作的静态图,默认的美学通常需要调整。这就是定制样式表派上用场的地方,至少有两个原因:
- 使我们的工作流程符合不重复(DRY)原则:我们不需要每次都重复输入相同的样式代码。相反,我们用一行代码来应用样式表
- 风格一致性很容易实现,这可能是个人、团队和组织的隐含特征
如何设置和使用自定义样式表
从内置示例开始
我们大多数人可能已经在日常工作中使用了一些内置的风格。例如,快速运行
# This code snippet mimics command usages in ipython consoleIn [1]: import matplotlib.pyplot as pltOut [1]: plt.style.available
将返回样式表的完整列表,我们可以在 matplotlib 的文档中找到它们效果的图库视图。
在引擎盖下,我们可以找到这些内置的样式表并看一看:
# This code snippet mimics command usages in ipython consoleIn [2]: import matplotlib# Locate path to matplotlib by checking where config file is
# To learn more about the function below,
# type ?matplotlib.matplotlib_fnameIn [3]: matplotlib.matplotlib_fname()
Out [3]: '/Users/sdou/opt/miniconda3/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc'
路径/Users/.../mpl-data
是我们想要去的地方,并且定位样式表:
In [4]: !ls /Users/sdou/opt/miniconda3/lib/python3.8/site-packages/matplotlib/mpl-data/
fonts images matplotlibrc stylelib
感兴趣的文件夹是stylelib
。现在让我们来看看这个文件夹:
In [5]: !ls -1 /Users/sdou/opt/miniconda3/lib/python3.8/site-packages/matplotlib/mpl-data/stylelib/
Solarize_Light2.mplstyle
_classic_test_patch.mplstyle
bmh.mplstyle
classic.mplstyle
dark_background.mplstyle
fast.mplstyle
fivethirtyeight.mplstyle
ggplot.mplstyle
grayscale.mplstyle
seaborn-bright.mplstyle
seaborn-colorblind.mplstyle
seaborn-dark-palette.mplstyle
seaborn-dark.mplstyle
seaborn-darkgrid.mplstyle
seaborn-deep.mplstyle
seaborn-muted.mplstyle
seaborn-notebook.mplstyle
seaborn-paper.mplstyle
seaborn-pastel.mplstyle
seaborn-poster.mplstyle
seaborn-talk.mplstyle
seaborn-ticks.mplstyle
seaborn-white.mplstyle
seaborn-whitegrid.mplstyle
seaborn.mplstyle
tableau-colorblind10.mplstyle
让我们检查一份.mplstyle
文件。这里我们以classic.mplstyle
为例,显示文件的前 37 行:
图 classic.mplstyle”文件的前 37 行(37 行是任意选择)
我们可以看到 matplotlib 参数设置及其默认值的综合列表,参数被组织成lines
、markers
、patch
、text
等组。
打造定制。mplstyle 文件
极简主义的例子
下面是一个建立在内置样式表seaborn-colorblind.mplstyle
之上的极简示例(名为signature.mplstyle
如何调用自定义样式表
- 如果我们对上述路径
stylelib
有写权限,我们可以将自定义样式表放入同一个文件夹,并使用
# Scenario 1: Apply globally to a jupyter notebook
plt.style.use(“signature”)# Scenario 2: Apply locally with context manager
with plt.style.context("signature"):
plt.plot([1, 2, 3, 4])
- 如果我们没有写权限,我们需要做的唯一额外的事情就是包含自定义样式表的完整路径。这里我们使用一个简单的例子,将样式表直接存储在主目录下:
# Scenario 1: Apply globally to a jupyter notebook
plt.style.use(“/home/signature.mplstyle”)# Scenario 2: Apply locally with context manager
with plt.style.context("/home/signature.mplstyle"):
plt.plot([1, 2, 3, 4])
如何恢复默认
有些情况下,我们希望恢复默认样式。有两种方法可以恢复默认设置:
- 通过
rcParams.update
复位
import matplotlib as mpl
mpl.rcParams.update(mpl.rcParamsDefault)
2.用默认样式表重置
plt.style.use('default')
数据即例子:样式表在行动
这里我们以企鹅数据集为例来演示自定义样式表signaure.mplstyle
的效果。
import matplotlib.pyplot as plt
import seaborn as sns# Load the penguins dataset
penguins = sns.load_dataset("penguins")
- 使用默认样式
plt.style.use("default")
# Show the joint distribution using kernel density estimation
g = sns.jointplot(
data=penguins,
x="bill_length_mm",
y="bill_depth_mm",
hue="species",
kind="kde",
)
g.fig.suptitle("Styled With Default Style Sheet", y=1.01)
plt.show()
图 matplotlib 默认样式的效果
2.使用signature.mplstyle
中的自定义样式集
plt.style.use("signature")
# Show the joint distribution using kernel density estimation
g = sns.jointplot(
data=penguins,
x="bill_length_mm",
y="bill_depth_mm",
hue="species",
kind="kde",
)
g.fig.suptitle("Styled With Custom Style Sheet", y=1.01)
plt.show()
图 3:定制样式表“signature.mpl”的效果
关键要点
- 漂亮的数据值得漂亮的展示。但是,与其重复输入大量的样式代码,不如花一点前期时间建立我们自己的定制样式表(文件扩展名
.mplstyle
)既能节省时间,又能确保样式的一致性 - 要构建定制样式表,我们可以从内置样式表开始,并根据我们的喜好进一步定制它们。关键的一步是在
matplotlib.matplotlib_fname()
的帮助下找到这些样式表
参考
4.11 定制 Matplotlib:配置和样式表:Jake Vander plas 的《数据科学手册》
如何在命令行上创建和查看交互式备忘单
停止搜索命令行。用作弊来节省时间
为什么是命令行?
如果您还没有使用过命令行,那么您应该开始学习一些基本的命令行工具。以下是原因:
-
命令行对数据科学家很有用。有了命令行,你通常做的许多事情,比如移动文件、复制文件、解压文件、创建新文件,都可以更快地完成。
-
您甚至可以使用命令行来浏览您的数据!这里有一个很好的资源。Jupyter notebook 通常用于此任务,但有时,当您为项目编写脚本时,使用命令行会更有好处。
-
您可以创建一个 bash 脚本来自动化您已经重复完成的任务。例如,我创建了一个 bash 脚本来重构我的 Django 项目文件。我不需要到处移动文件、创建虚拟环境、安装所需的包,我只需要调用
createapp.sh
,一切都在一秒钟内为我设置好了! -
您希望确定为什么代码需要很长时间才能执行。这时,拥有一个正在运行的系统的动态实时视图来确定您使用了多少 CPU 和内存是很有帮助的。
top
是完成这项任务的最强大的命令行工具之一
基于以上原因,不可否认命令行是有用的。然而,记住所有的命令是不可能的。这就是为什么在记忆命令方面,谷歌是我的朋友。
但是谷歌搜索需要时间,因为你需要:打开浏览器,在所有的网站中搜索,比如 StackOverflow 来找到命令。有比这更快的方法吗?
欺骗
是的,有一个比谷歌搜索更快的方法,它涉及作弊(不是欺骗)。 Cheat 允许你在命令行上创建和查看交互式备忘单。这是什么意思?意思是当你在终端上输入这个的时候
cheat mv
这是你将会看到的
# To move a file from one place to another:
mv <src> <dest># To move a file from one place to another and automatically overwrite if the destination file exists:
# (This will override any previous -i or -n args)
mv -f <src> <dest># To move a file from one place to another but ask before overwriting an existing file:
# (This will override any previous -f or -n args)
mv -i <src> <dest># To move a file from one place to another but never overwrite anything:
# (This will override any previous -f or -i args)
mv -n <src> <dest># To move listed file(s) to a directory
mv -t <dest> <file>...
相当酷!mv
命令的很多选项都有描述!
尽管这个存储库很有用,但是在存储库中并不清楚如何设置它。感谢 StackOverFlow 上的这个回答,我终于想出办法了。在这篇文章中,我将向你展示如何设置和使用作弊更详细的说明。
设置
- 从发布页面下载可执行文件
- 提取 zip 文件
- 使其可执行。没有这个命令,您将无法执行下载的文件
chmod +x <downloaded_file> # No gzip extension this time
- 在您的路径中查找目录
echo $PATH | tr ":" "\n"
这是我屏幕上显示的内容
- 将下载的文件复制到上述目录之一。任何一个都可以。在我的例子中,我复制了
/usr/local/bin
中的文件
cp <downloaded_file> /usr/local/bin/cheat
目录末尾的cheat
表示您将用来调用文件的名称
- 将配置文件放入
./config
文件
cheat --init > ~/.config/cheat/conf.yml
- 通过编辑
.bash_profile
将/.config/cheat/conf.yml
永久放置在路径中
nano ~/.bash_profile
在.bash_profile
中,在文件底部添加下面两行
export CHEAT_CONFIG_PATH="~/config/cheat/conf.yml"export EDITOR="/usr/bin/nano"
保存您的更改
source ~/.bash_profile
厉害!现在你可以使用作弊了!
使用
只需在终端上键入cheat
,您将看到使用作弊的不同选项
使用cheat.
非常容易,如果你想查看像tar
这样的备忘单,你可以使用
cheat tar
命令tar
的所有选项和描述都会显示在终端上。使用 cheat -l 查看所有可用的备忘单。
如果你想编辑或创建一个新的备忘单,你可以使用cheat -e <cheatsheet_name>
。例如,我想为fuser,
保存备忘单,这是一个用于定位进程的强大命令行实用程序,我将像这样将fuser
添加到我的备忘单中
cheat -e fuser
将打开fuser
的编辑器。你所需要做的就是写下描述和命令
#View port
fuser <portnumber>/tcp#Kill port
fuser -k <portnumber>/tcp
然后键入’ ESC ‘和’:wq '来编写并退出编辑器。
现在当你输入cheat fuser
的时候,你会看到你刚刚写的描述和命令!从现在开始,你再也不需要在谷歌上搜索这个命令了。多方便啊!
问题解答
如果下次使用cheat
时出现如下错误
failed to load config: failed to resolve symlink: /home/khuyentran/.config/cheat/cheatsheets/community: lstat /home/khuyentran/.config/cheat/cheatsheets: no such file or directory
只需输入source ~/.bash_profile
来设置.bash_profile
中指定的环境变量。
结论
恭喜你!您刚刚学习了如何在命令行上创建和查看交互式备忘单。这个工具将为你节省大量的谷歌搜索时间,所以如果你还没有这样做的话,试试吧。
如果你想查看我写的所有文章的代码,请点击这里。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以通过 LinkedIn 和 Twitter 与我联系。在 Medium 上关注我或注册我的简讯以了解我的最新数据科学文章,例如:
让 YAML、JSON、CSV 和 Jupyter Notebook 为你工作,而不是与你作对
towardsdatascience.com](/top-4-code-viewers-for-data-scientist-in-vscode-e275e492350d) [## 如何用 Github 组织你的数据科学文章
被新信息淹没?现在,您可以轻松地跟踪文章并为其创建自定义注释
towardsdatascience.com](/how-to-organize-your-data-science-articles-with-github-b5b9427dad37) [## 如何在数据科学项目中利用 Visual Studio 代码
直到发现一种新的有效方法,我们才意识到我们是多么低效
towardsdatascience.com](/how-to-leverage-visual-studio-code-for-your-data-science-projects-7078b70a72f0) [## 高效 Python 代码的计时
如何比较列表、集合和其他方法的性能
towardsdatascience.com](/timing-the-performance-to-choose-the-right-python-object-for-your-data-science-project-670db6f11b8e) [## 使用 Python 最大化您的生产力
你创建了一个待办事项清单来提高效率,但最终却把时间浪费在了不重要的任务上。如果你能创造…
towardsdatascience.com](/maximize-your-productivity-with-python-6110004b45f7)
如何使用 Plotly 和 Dash 创建出色的动画散点图
Plotly 中的动画地图可能很难配置。在本教程中,您将学习如何一步一步地实现一个散点图,日复一日地跟随 Covid 疫情走遍世界。
仪表板中的地图
Dash 是构建在 Flask 和 Plotly 之上的 Python 框架,旨在制作数据驱动的 web 应用。由于 Plotly,它提供了一些基本的图表,如直方图和饼状图,它还带有大量高度可定制的控件,如下拉菜单,复选框,日期滑块,等等。
要构建应用程序,您可以在一个或多个选项卡中组合所有这些控件和图表。但是当涉及到地图绘制时,就变得棘手了。Plotly 有一些基本的内置地图绘图:足以显示数据,但不如 2020 年 web 地图应该的那样好。为了解决这一弱点,Plotly 与 Mapbox 建立了合作关系。他们一起提供了很好的服务。
带有默认 plotly 贴图的散点图示例(相当难看)
今天,我们将了解如何在 dash 应用程序中使用 Mapbox 和 Plotly,以及如何创建动画散点图。
带有地图框地图的散点图示例(非常好)
由于这篇文章写于 2020 年 4 月冠状病毒疫情期间,我建议与新冠肺炎开放数据合作,以发现散点图。
注册到地图框
一些地图框表示需要一个令牌,散点图就是其中的一部分。别担心,这个简单又自由。
前往www.mapbox.com创建一个账户。对于这一步,你只需要一个电子邮件帐户验证。完成后,您可以在“令牌”页面上获得令牌,然后单击“创建令牌”按钮。
有了这个令牌,你可以免费绘制 50000 张地图/月。在本文的结尾,我们将看到如何存储地图并最小化所需的请求数量。
地图盒子网站截图
通常将这些信息存储在与脚本不同的文件中。通常的做法是使用 *。ini 文件进行存储,然后 python 内置的configparser
模块对其进行访问。
config.ini
[mapbox]
secret_token=your-token
any_file_needing_token.py
import configparser
config = configparser.read('config.ini')
mapbox_token = config['mapbox']['secret_token']
创建散点图
加载数据
如前所述,我们将使用 Covid 疫情数据。我们将使用霍普金斯大学的数据集,该数据集在危机期间每天更新。在 opendatasoft 上可用。
原始数据集的头部
数据非常容易理解:它包含许多国家关于 covid 的日常信息,关于死亡、确诊、或康复人员,以及 GPS 信息。
处理数据
必须转换该数据集以适应地图框输入。让我们明确所需的输入。
散点图的目的是在地图上绘制气泡,气泡的大小和颜色都是可变的。在今天的例子中,我们希望:
- 每个国家一个泡沫
- 气泡纬度:指定国家的纬度
- 气泡经度:指定国家的经度
- 气泡大小:确诊病例数
- 气泡颜色:获救人员比例
- 泡沫徘徊:国家形势概述
让我们在不同的栏目中获取这些信息。
- 第一步:将
Location
列提取为经纬度 - 第二步:将单个
category
列每键 3 行(date
&zone
)拆分为三列:confirmed
、deaths
&recovered.
,得到一个整洁的数据集 - 第三步:旋转表格时,我们丢失了位置信息。我们现在将它们合并回来,这多亏了
country_position
数据集。 - 第四步:定义每个气泡的大小
- **第五步:**定义每个气泡的颜色
转换数据集的头
这里有一个多索引的全数据框:date
& zone
,过滤非常方便。
例如,要提取某一天的信息,我们需要:
day = '2020-05-01'
df_day = df.xs(day)
这对于我们的散点图和之后的地图动画来说非常方便!
地图
这里我们用所有必要的参数定义一个图形,然后用 Mapbox 信息更新它的 layout 属性:令牌、地图的中心位置以及我们想要放大多少。我们使用 1 的缩放比例,因为我们想看到整个地球。要放大,你只需要增加这个值。
2020 年 5 月 1 日的 Covid 案例
微小的改进
我们的散点图很好,但缺乏信息。在深入动画部分之前,我们先做一些基本的修改,提升贴图的质量。
- 添加色彩映射表。
在上图中,我们看到橙色、紫色和黄色的盒子,但不知道它们的意思。让我们添加一个色彩映射表来说明这一点。要添加色彩映射表,将showscale = True
添加到标记参数中。然后使用colorbar
属性,您可以添加更多的规范,比如标题、颜色条的大小或者任何其他关于记号的信息。
现在可以清楚地看到,黄色气泡与康复率最高的国家有关。气泡越暗,回收率越小。
2.添加自定义悬停信息
除了颜色理解之外,当用户用鼠标悬停在气泡上时显示数字也会很有趣。为此,我们可以向go.Scattermapbox()
添加一个text
参数,指定显示哪一列信息。但是这里我们想要显示多个信息,所以我们将使用hovertemplate
和customdata.
,后者允许我们将数据存储到控件中,并显示原始数据集中任何列的值。因此,我们将必要的列存储到np.stack()
中的customdata
中,并从hovertemplate
中定义的 Html 模板中访问它。
注意:
<extra></extra>
用于覆盖悬停框中写有跟踪名(trace0)的原始部分。跟踪是我们存储图形数据的对象。
2020 年 5 月 1 日的 Covid 案例,带有颜色图和悬停信息
这是我们之前修改的结果。看起来很棒,不是吗?
制作动画
现在,我们能够在地图上绘制特定日期的数据。让我们把它做成动画,日复一日地观察世界局势。
作为参考,有两种方法可以用 Plotly 和 Dash 制作地图动画:
- 创建一个多帧的动画地图(解释如下)
- 创建具有可更新轨迹的单个 Plotly 地图,通过 dash 回调进行更新,由时间滑块进行监控。这在技术上是可行的,但是由于在每一步都需要修改地图数据,因此要复杂得多并且计算量很大。(而绘制的动画地图只计算一次,然后优化帧间导航。)
框架
为了创建一个情节性的动画,我们将为该图形提供多个帧,而不是像之前在go.Figure()
语句中那样只提供一条轨迹。帧基本上是一个go.Scattermapbox()
的内容,但是存储在一个列表中。
注:
*days*
为可用天数列表:df.index.levels[0].tolist()
滑块
然后,为了浏览这个框架,我们将创建一个slider
。每个slider
被定义为一个字典,并存储在sliders
列表中。我们这里只有一个。
一个slider
由它的特性定义(如x
、y
、len
等)。),其初始状态(currentvalue
)及其steps
。为了将一个步骤链接到一个特定的帧,我们需要在帧name
和steps[i]['args'][0][0]
中有相同的值。steps[i]
作为步骤之一,i in [0 ; nb_frame]
。不是最容易的猜测,但工作。
工作按钮
一旦我们有了一个漂亮的滑块,添加一个“播放按钮”会是一个好主意,它会一个接一个地运行所有的迭代。以下是我们的做法。
放在一起
现在我们有了所有的部分,我们可以组装拼图,并最终创建我们的交互式地图。
就是这样!下面是结果!一个漂亮的交互式散点图!让我们希望气泡不会变大,我们很快就会在这个图中看到很多黄色的气泡。
结论
你已经学习了如何用 Plotly 绘制散点图以及如何制作动画。现在你可以用你自己的数据,颜色图,滑块绘制你自己的交互式地图,并通过一个播放按钮让他们活起来。我希望你喜欢它!
在我的下一篇文章中,我将把这个地图嵌入到 Dash 应用程序中,您将会发现如何在 Heroku 上部署 Python web 应用程序。你将设法进入这个散点图现场版!敬请期待!
(更新——你可以在那里查看)
[## 在 Heroku 上部署 Dash 或 Flask web 应用程序。简易 CI/CD。
在笔记本电脑上开发 python web 应用非常棒。让每个人都能接触到它更令人满意。让我们…
towardsdatascience.com](/deploying-dash-or-flask-web-application-on-heroku-easy-ci-cd-4111da3170b8)
如果你喜欢散点图版本,你可能也会喜欢 Choropleth 地图的故事😉
[## 如何使用 Plotly 和 Dash 创建出色的自定义 choropleth 地图🌎
使用 GeoJSON 文件迈出第一步&了解如何在地球上的任何地方构建 choropleth 地图。用…举例说明
towardsdatascience.com](/how-to-create-outstanding-custom-choropleth-maps-with-plotly-and-dash-49ac918a5f05)
为了发现更多关于 Plotly 以及如何展示你的 ML 项目和成果,我推荐你这篇来自 Neptune.ai 的好文章
[## 面向机器学习专家的 Plotly Python 教程- neptune.ai
Plotly 是一个开源的 Python 图形库,非常适合构建漂亮的交互式可视化…
海王星. ai](https://neptune.ai/blog/plotly-python-tutorial-for-machine-learning-specialists)
再见🤠
如何用 Plotly 创建动画可视化
让你的数据技能更上一层楼。
我们生活在大数据时代。我们可以收集大量数据,从而推断出有意义的结果,做出明智的商业决策。然而,随着数据量的增加,分析和探索数据变得更加困难。当有效和恰当地使用时,可视化是探索性数据分析的伟大工具。可视化也有助于向你的观众传递信息,或者告诉他们你的发现。没有一种通用的可视化方法,因此某些任务需要不同类型的可视化。近年来,动画可视化越来越受欢迎,因为它们使“告诉”比统计可视化更多的东西成为可能。动画可视化非常擅长展示事物如何随着时间的推移而变化。
我们将介绍如何使用 Plotly Python (plotly.py)创建动画可视化,这是一个基于 plotly javascript (plotly.js)构建的开源绘图库。我喜欢 plotly.py 的一点是,它提供了一个高级 API ( plotly express )和一个低级 API ( graph objects )来创建可视化。使用 plotly express,我们可以用很少的代码行创建一个很好的情节。另一方面,我们需要用图形对象编写更多的代码,但是对我们创建的内容有更多的控制。
在本帖中,我们将使用 plotly express API。我将写另一篇文章来介绍图形对象的动画可视化。
我们将合并两个不同的数据集。一个是肥胖率数据集,可在 kaggle 上的这里获得。原始数据集需要清理和重新格式化。如果你想经历数据清理的步骤,请随意访问我的帖子:
如何清理和重新格式化原始数据集。
towardsdatascience.com](/a-practical-guide-for-data-cleaning-obesity-rate-dataset-aff9d12390c8)
以下是清理后的数据帧的前五行:
我们将使用的另一个数据集不区分性别。因此,我们需要通过按“国家”和“年份”分组并取“肥胖率”的平均值来消除该数据集中的性别:
import numpy as np
import pandas as pd# fixing data tytpes
obesity_cleaned = df2.astype({'obesity_rate': 'float32', 'year': 'int32'})# eliminating gender
obesity_cleaned = obesity_cleaned.groupby(['country','year']).mean().reset_index()obesity_cleaned.head()
另一个数据集可用作 plotly express 的内置数据集。它被称为 gapminder,包括 142 个国家从 1952 年到 2007 年的预期寿命、人均 gdp 和人口(以 5 年为增量)。我们首先导入 plotly express 和数据集:
import plotly.express as pxdf_gdp = px.data.gapminder()df_gdp.head()
我们可以使用 pandas 的 merge 功能来合并这两个数据帧。共享列是国家和年份,因此我们将它们传递给参数上的**😗*
df_merge = pd.merge(df_gdp, obesity_cleaned,
on=['country','year'])df_merge.head()
我们现在可以创建我们的第一个动画可视化。下面是生成动画散点图的代码。我会解释每一个参数,然后显示图。
px.scatter(df_merge, x="obesity_rate", y="gdpPercap",
animation_frame="year",
size="pop", color="continent", hover_name="country",
size_max = 50,
range_x=[0.1, 50], range_y=[100,60000],
log_x=True, log_y=True)fig.show()
我们首先在数据帧的名称上加右键,并指定 x 轴和 y 轴。因此,我们的动画散点图将显示人均 gdp 和肥胖率如何随时间变化。为了使情节动画,我们使用动画 _ 帧参数。我们使用“年”作为动画帧,因此值将根据年份而变化。我们将人口分配给大小参数,因此散点图中点的大小与国家人口成比例。对于 color 参数,我们使用大陆列,这样我们可以大致了解每个大陆。 Size_max 参数允许调整散点图中点的大小。如果不指定,点可能看起来太小,人眼看不出来。 Range_x 和 range_y 参数用于指定范围,使所有点在动画期间保持可见。最后,log_x 和 log_y 参数调整对数标度上的轴范围。如果数值相差很大,最好使用对数标度,使绘图看起来更好。
可视化是传递信息的好工具。动画情节甚至更强大,因为它们也考虑了时间。通过我们刚刚创建的图,我们获得了以下信息:
- 国家人口
- 各国人均国内生产总值
- 各国肥胖率
- 这些值如何随时间变化
- 根据这些标准,各大洲是如何不同的
- 如果这些度量之间存在相关性
让我们看看我们创建的动画散点图:
- 欧洲国家的人均 gdp 和总体肥胖率都很高。
- 总的来说,非洲和亚洲国家在人均 gpd 和肥胖率方面都远远落后。
- 这些年来,亚洲国家的人均国内生产总值已经超过了非洲国家。
- 肥胖率和人均 gdp 之间似乎存在正相关关系(当然,我们需要更多的数据来证实)
- 尽管由于人口规模非常小,这一点很难引起注意,但科威特一直是肥胖率最高的国家,人均国内生产总值排名前三。
我们还可以创建一个动画条形图。例如,肥胖率如何随时间变化可以用柱状图来表示。让我们选择 5 个国家(每个洲一个)在图上显示。
countries = ['China', 'Germany', 'Senegal', 'Brazil', 'New Zealand']df5 = obesity_cleaned[obesity_cleaned.country.isin(countries)].reset_index(drop=True)
我们这次也加个标题。以下是使用 plotly express 创建动画条形图的代码:
fig = px.bar(df5, x="country", y="obesity_rate",
color="country",
animation_frame="year", animation_group="country",
range_y=[0.1, 50],
title='Obesity Rate from 1975 to 2016')fig.show()
不幸的是,全世界的肥胖率一直在上升。
我们已经介绍了如何使用 plotly express 创建一些基本的动画情节。当然,这只是这个神奇图书馆的一小部分功能。我们可以使用 plotly 动态创建许多其他绘图类型。我还将讲述如何使用 plotly.py 的图形对象创建动画图。语法稍微复杂一点,但它提供了更多的灵活性。最好熟悉这两种 API,选择最适合自己需求的一种。
就像任何其他主题一样,熟悉 plotly 的最好方法就是实践。因此,我建议创造大量的情节来提高你的技能。
感谢您的阅读。如果您有任何反馈,请告诉我。
如何使用地理空间数据在 Python 中创建气泡图
初学者指南和教程。
Marc Sendra Martorell 在 Unsplash 拍摄的照片
想过如何用 Python 和地理空间数据创建气泡图吗?我将向您展示如何轻松地以静态格式和交互式格式制作气泡图。
A
bubble map
使用 size 作为编码变量。圆圈的大小代表一个地理区域的数值。
气泡图
我们经常使用 Choropleth 地图来显示区域,在这种情况下,我们使用颜色编码。Choropleth 地图有一个固有的大面积偏差问题。相比之下,气泡图使用圆形来表示区域或区域的数值。
用 Python 创建泡泡图看起来很复杂,也有点高级,但事实并非如此。这就像创建带有纬度和经度列的气泡图。让我们首先导入我们需要的库。
import pandas as pd
import numpy as npimport geopandas as gpdimport matplotlib.pyplot as plt
import plotly_express as px
我们可以用 Geopandas 读取数据。使用 Geopandas,您可以读取大多数地理数据格式,如 Shapefile、Geojson、Geo package 等…在本例中,我们使用的是瑞典莫尔蒙市的人口数据。
gdf = gpd.read_file(“data/malmo-pop.shp”)
gdf.head()
这是数据集的第一行。对于每个行政单位(Deso ),我们有许多人口细分栏(5 岁至 80 岁及以上)。
我们通常使用 choropleth 地图和颜色编码。正如我们将要看到的,我们可以用 Geopandas 非常容易地创建一个 choropleth 地图。请注意,我们首先通过细分总人口来标准化数据(年龄 80_w)。
gdf["Age_80_norm"] = (gdf["Age80_w"] / gdf["Total"]) * 100fig, ax = plt.subplots(figsize=(16,16))
gdf.plot(ax=ax, column="Age_80_norm", cmap="Blues",edgecolor="grey", linewidth=0.4, legend=True)
ax.axis("off")
plt.axis('equal')
plt.show()
气泡图
或者,我们可以使用气泡图,避免 choropleth 图的一些缺陷。例如,我们不需要对数据进行归一化,我们可以使用总体细分。但是,我们需要对数据进行一些转换,以便能够创建气泡图。
正如你所看到的,我们使用的数据是多边形,如果我们想创建气泡图,我们需要点。然而,这是使用 Geopandas 的一个简单过程。我们只需要改变几何列,在这种情况下,多边形为点几何。
gdf_points = gdf.copy()
gdf_points[‘geometry’] = gdf_points[‘geometry’].centroid
我们首先将具有面几何的地理数据框架复制到新的地理数据框架中。因为我们希望气泡位于区域的中心,我们可以使用 Geopandas 中的质心函数来实现这一点。
现在,我们有了具有不同几何列的相同地理数据框架,即点几何。让我们绘制一个气泡图,因为我们现在有了点数据集。
fig, ax = plt.subplots(figsize=(16,16))
gdf.plot(ax=ax, color=”lightgray”, edgecolor=”grey”, linewidth=0.4)
gdf_points.plot(ax=ax,color=”#07424A”, markersize=”Age80_w”,alpha=0.7, categorical=False, legend=True )ax.axis(“off”)
plt.axis(‘equal’)
plt.show()
下面的地图显示了瑞典莫尔蒙一个较小行政区域内 80 岁及以上人口的气泡图。每个圆圈代表基于 80 岁及以上人口小计的不同大小。要构建气泡图,您需要为您想要映射的列提供 markersize ,在本例中是 Age80_w。
正如你所看到的,这是一个静态贴图,气泡贴图的一个常见问题是点圆的重叠。我们可以避免这种情况的一种方法是创建交互式地图,允许用户与感兴趣的区域进行交互和放大。在下一节中,我们将看到如何创建一个交互式气泡图。
交互式气泡地图
有不同的 Python 库用于绘制交互式气泡图。为了构建一个交互式气泡图,我们使用 Plotly Express。我们只需要转换到另一个投影,用 Plotly Express 显示地图。Plotly Express 具有 scatter_mapbox()函数,该函数可以获取地理数据框和要用于气泡图的列。
gdf_points_4326 = gdf_points.to_crs(“EPSG:4326”)fig = px.scatter_mapbox(
gdf_points_4326,
lat=gdf_points_4326.geometry.y,
lon=gdf_points_4326.geometry.x,
size=”Age80_w”,
color=”Total”,
hover_name = “Age80_w”,
color_continuous_scale=px.colors.colorbrewer.Reds,
size_max=15,
zoom=10
)
fig.show()
使用 Plotly Express,我们可以通过创建交互式气泡图来避免气泡图的重叠问题。见下图 GIF。
气泡图可以是显示具有不同气泡大小的数值变量的替代图,而不是最常用的 choropleth 图。如果您有一个带有值(即年龄细分)的区域(即行政区)列表,气泡图可以代替 Choropleth 图。气泡图没有 choropleth 图固有的大面积偏差。
结论
在本教程中,我们已经看到了如何使用 Python 创建静态和交互式气泡图。静态气泡图存在重叠问题。为了避免这种情况,您可以创建允许放大/缩小的交互式地图,或者增加静态地图圆圈的透明度。
本教程的代码可以在这个 Github 存储库中找到。
permalink dissolve GitHub 是 4000 多万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/shakasom/esda/blob/master/Bubble%20Maps%20Medium.ipynb)
如何在深度学习中创建定制的实时图
如何在使用 Keras 回调训练深度学习模型的同时,生成自定义指标的实时可视化。
图片来源:pix abay
我们所说的实时图是什么意思?
用大型数据集训练复杂的深度学习模型可能非常耗时。随着时代的流逝,大量的数字在你的屏幕上闪现。你的眼睛(和大脑)会疲劳。
那个令人兴奋的不断更新你进度的精确度图在哪里?如何知道模型是否在学习有用的东西?还有,到底有多快?
一个 实时视觉更新 会很棒吧?
人类毕竟是视觉生物。
在这里,我们收集了一些有趣的事实来强调为什么在科学交流中使用视觉辅助工具是如此重要…
www.seyens.com](https://www.seyens.com/humans-are-visual-creatures/)
我说的视觉,并不是指当你打开模型的冗长时,所有的数字分数都倾泻在你的屏幕上。
不是这个。
我们希望如此。
让我们看看怎样才能到达那里。
那个令人兴奋的不断更新你进度的精确度图在哪里?如何知道模型是否在学习有用的东西?还有,到底有多快?
我们所说的自定义地块是什么意思?
常规工作有既定的工具。但是很多时候,我们需要定制的输出。
Tensorboard 很酷,但可能无法满足所有需求
如果你正在使用 TensorFlow/Keras 进行深度学习任务,那么你很有可能听说过或使用过 Tensorboard。这是一个神奇的仪表板实用程序,你可以传递训练日志,并可以获得精彩的视觉更新。
[## TensorBoard | TensorFlow 入门
在机器学习中,为了改进某些东西,你通常需要能够测量它。TensorBoard 是一款提供…
www.tensorflow.org](https://www.tensorflow.org/tensorboard/get_started)
图片来源: 张量板
用 Tensorboard 可以很容易地得到标准损耗、精度图。如果您只想监控这些,而不是 DL 模型中的其他内容,您可以停止阅读本文,直接使用 Tensorboard。
但是,当您有一个高度不平衡的数据集要处理,并且您想要绘制精度、召回和 F1 分数时,该怎么办呢?或者,另一个不那么标榜分类的度量标准像 马太系数 ?如果您只关心真阴性和假阴性的比率,并想创建自己的度量标准,那该怎么办?
随着您培训的进展,您如何看待这些非标准指标的实时更新?
Keras 内置了计算混淆矩阵的功能
幸运的是,Keras 提供了对应于混淆矩阵的四个基本量的基本对数——真阳性(TP)、假阳性(FP)、真阴性(TN)和假阴性(FN)。它们来自 Keras 指标模块。
[## 模块:TF . keras . metrics | tensor flow Core v 2 . 3 . 0
内置指标。
www.tensorflow.org](https://www.tensorflow.org/api_docs/python/tf/keras/metrics)
我们可以简单地在您的模型的训练日志中定义一个我们想要的度量列表,并在编译模型时传递该列表。
**metrics** = [
tf.keras.metrics.TruePositives(name="tp"),
tf.keras.metrics.TrueNegatives(name="tn"),
tf.keras.metrics.FalseNegatives(name="fn"),
tf.keras.metrics.FalsePositives(name="fp"),
]
然后,
model.compile(
optimizer=tf.keras.optimizers.Adam(lr=learning_rate),
loss=tf.keras.losses.BinaryCrossentropy(),
** metrics=metrics**,
)
因此,我们可以将这些度量(尽管它们是在训练数据集上计算的)作为训练日志的一部分。一旦我们得到了它们,我们就可以根据第一性原理的定义,为分类任务计算出我们想要的任何自定义指标。例如,这里我们展示了一些非标准指标的公式,
图片来源:维基百科
但是,我们如何从这些计算值中创建定制的实时图呢?
我们当然使用回调!
随着您培训的进展,您如何看待这些非标准指标的实时更新?
实时可视化的自定义回调
回调是一类非常有用的工具,可以在你训练的某些时候(或者你喜欢的话,在每个时期)调用。简而言之,它们可用于在培训过程中实时处理数据(与模型性能或算法相关)。
这是 Keras 回调的 TensorFlow 官方页面。但是为了我们的目的,我们必须编写一个自定义的绘图类从基本回调类派生而来。
[## 模块:TF . keras . callbacks | tensor flow Core v 2 . 3 . 0
回调:在模型训练期间的某些点调用的实用程序。
www.tensorflow.org](https://www.tensorflow.org/api_docs/python/tf/keras/callbacks)
演示 Jupyter 笔记本
演示版 Jupyter 笔记本是 位于我的 Github repo 上的 这里。 这个资源库 包含了很多其他有用的深度学习教程式的笔记本。所以,请随意星或叉。
不平衡的数据集
图片来源: Pixabay
我们为演示中的二进制分类任务创建了一个具有不平衡类别频率(负数比正数多得多)的合成数据集。这种情况在实际的数据分析项目中很常见,它强调需要有一个可视化的仪表板来定制分类指标,而准确性不是一个好的指标。
下面的代码创建了一个数据集,其中包含 90%的阴性样本和 10%的阳性样本。
from sklearn.datasets import make_classificationn_features = 15
n_informative = n_featuresd = make_classification(n_samples=10000,
n_features=n_features,
n_informative=n_informative,
n_redundant=0,
n_classes=2,
**weights=[0.9,0.1]**,
flip_y=0.05,
class_sep=0.7)
下面的配对图显示了两个类的样本数据分布。请注意内核密度图中的不平衡。
合成数据集的分类数据分布
回调是一类非常有用的工具,可以在你训练的某些时候(或者你喜欢的话,在每个时期)调用。
自定义回调类
自定义回调类主要完成以下工作,
- 启动一组列表来存储值
- 在每个时期结束时从模型中提取指标
- 从这些提取中计算分类度量
- 并将它们存储在这些列表中
- 创建多个地块
下面是初始化,
这里是提取,
这里是计算,
这里是仓库,
而且,我不会用标准的 Matplotlib 代码来让你厌烦,除了下面的位,它在每次迭代时刷新你的 Jupyter 笔记本绘图。
from IPython.display import clear_output# Clear the previous plot
clear_output(wait=True)
此外,您不必绘制每个时期的图,因为这可能会加重显示器或机器的负担并降低其速度。你可以选择绘制,比如说,每 5 个纪元。只要把整个绘图代码放在一个条件下(这里epoch
是你从训练日志中得到的纪元编号)
# Plots every 5th epoch
if epoch > 0 and epoch%5==0:
不要担心所有这些如何协同工作,因为 演示笔记本仍然为您准备 。
结果
这是一个典型的结果,以简单的仪表板样式显示损失和精确度/召回/F1 分数。请注意,对于这个不平衡的数据集,召回是如何从一个高值开始的,但是精度和 F1 值却很低。这些是您可以通过这种回调实时计算和监控的指标!
更多结果—概率分布!
在每个时期结束时,您可以对模型(在该点训练)进行任何想要的计算,并可视化结果。例如,我们可以预测输出概率,并绘制它们的分布。
def on_epoch_end(self, epoch, logs={}):
# Other stuff
m = self.model
preds = m.predict(X_train)
plt.hist(preds, bins=50,edgecolor='k')
请注意,在开始时很少给出高概率,慢慢地模型开始学习数据的真实分布。
摘要
我们展示了如何使用简单的代码片段创建深度学习模型性能的生动可视化仪表板。按照这里概述的方法,你不必依赖 Tensorboard 或任何第三方软件。您可以创建自己的计算和绘图,根据您的需要进行最大程度的定制。
请注意,上述方法仅适用于 Jupyter 笔记本。您必须针对独立的 Python 脚本对其进行不同的调整。
关于这一点,有另一篇关于这个主题的精彩文章,你可以在这里查看。
[## 如何在 Keras 中绘制模型训练——使用自定义回调函数和 TensorBoard
我开始探索不同的方法来形象化训练过程,同时致力于狗的品种识别…
medium.com](https://medium.com/@kapilvarshney/how-to-plot-the-model-training-in-keras-using-custom-callback-function-and-using-tensorboard-41e4ce3cb401)
你可能也喜欢…
如果你喜欢这篇文章,你可能也会喜欢我下面的深度学习文章,
[## 你在你的 Keras 深度学习模型中使用了“Scikit-learn wrapper”吗?
如何使用 Keras 的特殊包装类进行超参数调优?
towardsdatascience.com](/are-you-using-the-scikit-learn-wrapper-in-your-keras-deep-learning-model-a3005696ff38) [## 用几行代码实现深度学习模型的激活图
我们演示了如何用几行代码显示深度 CNN 模型中各层的激活图
towardsdatascience.com](/activation-maps-for-deep-learning-models-in-a-few-lines-of-code-ed9ced1e8d21) [## 使用 Keras 简化影像分类的单一功能
我们展示了如何构建一个单一的、通用的、实用的函数来从一个目录中自动提取图像…
towardsdatascience.com](/a-single-function-to-streamline-image-classification-with-keras-bd04f5cfe6df)
Y 你可以查看作者的 GitHub 知识库获取机器学习和数据科学方面的代码、思想和资源。如果你和我一样,对人工智能/机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
[## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…
通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和…
www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)
如何打造数据流物联网管道——谷歌云平台
来自谷歌云平台参考架构的数据管道架构
介绍
在本文中,我们将了解如何在谷歌云平台上配置完整的端到端物联网管道。你会知道-
如何在云物联网核心中创建设备注册表
如何创建主题和订阅
如何使用 GCP Python 物联网客户端向设备发送消息
如何设置发布订阅
如何建立从 PubSub 到 BigQuery 的云数据流管道
如何使用设备注册表和发布订阅设置云物联网核心
前往https://console.cloud.google.com/,使用您的凭证登录并搜索物联网核心。
选择物联网核心后,其主界面页面会打开如下图。
我们首先需要创建注册表来注册设备。
点击创建注册表。创建注册表的新页面打开如下
根据需要为您的注册表命名。您可以看到显示的命名规则。
选择要存储数据的区域。最好让注册表区域靠近设备源
然后您会注意到,它要求命名主题名为 pub-sub,以路由来自注册中心中注册的设备的消息。
所以我们取一个小的散度。转到发布订阅并创建主题和订阅。
在新标签页转到 https://console.cloud.google.com/的并搜索发布订阅
它将打开发布-订阅登录页面,如下所示
由于我已经创建了一个主题,它显示在列表中。
点击创建主题。将打开一个新的创建主题配置页面,如下所示
给一个你想要的话题 ID。它将自动创建一个主题名称,并添加到您的项目路径中。
点击创建主题。完成后,您将看到在主题登录页面中创建的主题。
主题将消息从发布者设备转发到订阅者。任何订阅的消费者都可以使用这些消息。
因此,让我们创建一个订阅,并将其与我们创建的主题相关联。
为此,请在发布订阅的登录页面上单击订阅。它将打开订阅窗格。
点击创建订阅。这将打开订阅配置窗格。
给出你选择的 ID。它将自动创建一个带有项目名称的订阅名称。
将您的订阅与刚刚创建的主题名称链接起来。
保留其余的默认设置,然后单击 Create。
这将创建如图所示的订阅
现在,让我们回到“物联网核心”选项卡,将注册表与我们在“创建注册表配置”窗格中创建的主题相关联。
单击“创建”来创建注册表。
创建注册中心后,物联网核心登录页面将如下所示
点击注册表创建。它将打开如下注册表页面。
我们现在需要创建一个设备实例,并将其与我们创建的注册表相关联。这将完成设备创建、注册表创建、主题订阅创建的路径。然后,我们可以从 GCP 客户端向这些设备发送消息。消息将通过订阅路由到主题。然后,可以用 API 提取消息。
点击设备,然后创建设备选项卡
这将打开设备配置页面。给出一个设备 ID,保留其余的设置,然后点击 create。这将创建一个与注册表相关联的设备实例。
创建 GCP 客户端,通过 MQTT 协议发送消息
下载用于谷歌云平台实施的 Python 脚本@
【https://github.com/GoogleCloudPlatform/python-docs-samples】
转到tree/master/IOT/API-client/end _ to _ end _ example/cloud IOT _ pubsub _ example _ mqtt _ device . py
此客户端依赖于以下 python 库。
argparse,datetime,json,os,ssl,time,jwt,paho MQTT 客户端 。如果需要,可以使用 pip install 将相关的库安装到 python 包中。
客户端文件生成虚拟温度数据消息,并将遥测数据发送到我们在物联网核心上创建的设备。该消息被进一步路由到发布-订阅主题。我们可以在发布订阅中看到消息,也可以订阅和提取消息。
请注意,这是一个基线脚本。您可以根据您的消息要求进行更改。
执行代码
python cloud IOT _ pubsub _ example _ mqtt _ device _ lift PDM . py—project _ id = your project name—registry _ id = your registry id—device _ id = your device id—private _ key _ file = RSApemfile—algorithm = RS 256
您可以使用 openSSL 通过以下命令生成 RSA pem 文件,如下所示-
OpenSSL gen pkey-算法 RSA-out RSA _ private . PEM-pkeyopt RSA _ keygen _ bits:2048
OpenSSL RSA-in RSA _ private . PEM-pub out-out RSA _ public . PEM
当我发布不同的数据时,你会看到不同的信息。但是消息将被确认。
现在让我们去 PubSub 看看消息。
点击您创建的主题 ID
点击查看消息。您将选择订阅。从我们刚刚创建的下拉列表中单击 subscription。
数据流管道
现在让我们来看看如何创建从 PubSub 到 BigQuery 的数据流管道
去 console.cloud.google.com/dataflow。登录页面如下所示
点击从模板创建工作。
给出所需的作业名称、区域端点。从数据流模板中选择 Pub-Sub 到 Bigquery 管道,如下所示。以 project:dataset:tablename 格式命名我们创建的订阅和表名。您还需要在 Google 云存储中指定临时存储位置,如下所示。
【https://cloud.google.com/bigquery/docs/schemas】T5T6
****
单击运行作业选项卡,作业面板将如下所示
现在让我们转到大查询,检查数据是否流入我们的表。
注意 — GCP 不允许启动/停止数据流作业。每次想要停止时,您都必须重新创建一个作业。一定要停止这项工作,因为它会消耗大量资源并给你带来巨额账单。
数据流入数据集 liftpdm_2 的表 acc8。
一旦数据存储在 BigQuery 中,您就可以用于进一步的下游应用程序,如可视化、机器学习等,并将计算出的数据存储回 BigQuery。
结论
我们研究了 step 来创建物联网核心设备和注册表,并将它们与主题相关联。
如何创建发布-订阅主题和订阅?
如何通过物联网 Python 客户端向 PubSub 发送消息?
如何创建从发布订阅到大查询的数据流管道?
下一步怎么样
我们将研究如何利用一些可操作的参数创建与设备的闭环通信。
参考文献
https://cloud.google.com/iot/docs/samples/end-to-end-sample
https://cloud . Google . com/data flow/docs/guides/templates/provided-streaming。
这个报告包含了数据流 python API 的几个例子。这些示例是我们看到的常见用例的解决方案…
github.com](https://github.com/GoogleCloudPlatform/professional-services/tree/master/examples/dataflow-python-examples)**
如何使用 Plotly 创建动态 3D 散点图
让你的数据技能更上一层楼。
可视化比纯文本或数字更容易让人记住。可视化的信息力量是纯文本难以达到的。因此,可视化被广泛应用于数据科学领域。可视化的信息能力取决于它的结构。例如,3D 动态图比 2D 图更能说明问题。随着结构变得越来越复杂,我们可以用可视化来表示更多的信息。在将模型应用于数据之前,探索和理解原始数据中的结构是非常重要的。可视化是加速探索数据和帮助建立一个健壮的数据分析过程的很好的工具。
在本帖中,我们将创建动态 3D 散点图,并将它们与 2D 散点图进行比较。我们将使用 Plotly Python (plotly.py),这是一个基于 plotly javascript (plotly.js)构建的开源绘图库。我喜欢 plotly.py 的一点是,它提供了一个高级 API ( plotly express )和一个低级 API ( graph objects )来创建可视化。使用 plotly express,我们可以用很少的代码行创建一个很好的情节。另一方面,我们需要用图形对象编写更多的代码,但是对我们创建的内容有更多的控制权。
让我们首先使用 numpy 和 pandas 创建一个合成数据集。我们从导入库开始。
import numpy as np
import pandas as pdimport plotly.express as px
我们创建了一个数据框架,其中包含属于两个不同类别的一些观察值的 3 个不同的数字特征。我们使用 numpy 数组来表示数字特征,使用 python 列表来创建类别列。
数字特征:
x = np.random.random(size=60)*7 + 1
y = np.random.random(size=60)*7 + 1
z = np.random.random(size=60)
z[-30:] = z[-30:]*5 + 2
分类特征:
categories = "A "*30 + "B "*30
categories = categories.split(" ")
categories.pop(60)
首先创建一个包含 30 个 a 和 30 个 b(中间有空格)的字符串,然后用空格分割该字符串以创建一个包含 30 个条目的列表。由于字符串末尾有一个空格,所以列表的最后一个元素是一个空格(“”)。我们使用pop
方法移除它。
使用这 4 个数组,我们可以创建一个熊猫数据帧。
df = pd.DataFrame({
'cat':categories, 'col_x':x, 'col_y':y, 'col_z':z
})df.head()
让我们创建一个基于 x 列和 y 列的 2D 散点图
fig = px.scatter(df, x='col_x', y='col_y', color='cat',
width=700, height=500,
title="2D Scatter Plot")fig.show()
我们传递 dataframe 的名称、用作 x 轴和 y 轴的列。可选的颜色参数代表数据点的类别。
正如我们所看到的,类别 A 和 b 中的数据点之间没有明显的区别。在某些情况下,在可视化中增加一个特性就能说明很多问题。我们以这样一种方式创建数据帧,即“col_z”具有信息能力。
现在,让我们使用所有功能创建一个 3D 散点图。
fig = px.scatter_3d(df, x='col_x', y='col_y', z='col_z',
color='cat',
title="3D Scatter Plot")fig.show()
col_z 中的值清楚地区分了类别 A 和类别 b。当然,我们可以在 x 轴或 y 轴上使用 col_z,并通过 2D 散点图获得类似的结果。但是,在某些情况下,所有列都包含我们需要的有价值的信息。
让我们构建一个更复杂的数据框架,每个特征对分类都很重要。
特点:
x = np.random.random(size=100)*5
x[-30:] = x[-30:] + 6
x = x + np.random.random(size=100)*8y = np.random.random(size=100)*5
y[:30] = y[:30]*4 + 8
y = y + np.random.random(size=100)*3
y[-30:] = y[-30:] + 4z = np.random.random(size=100)*5
z[30:70] = z[30:70] - np.arange(1,41) / 40
z = z + np.random.random(size=100)*5categories = "A "*30 + "B "*40 + "C "*30
categories = categories.split(" ")
categories.pop(100)
数据帧:
df = pd.DataFrame({
'cat':categories, 'col_x':x, 'col_y':y, 'col_z':x
})df.head()
基于新功能的散点图:
px.scatter_3d
的另一个重要参数是size.
到目前为止,我们创建的图中的点具有相同的大小。然而,我们也可以给size
参数分配一个特性。然后,数据点的大小根据该特征中的值而改变。
我们给color
参数分配了一个分类变量,因此数据点用不同的颜色表示。Plotly 还提供了对color
参数使用数字特征的选项。在这种情况下,点的颜色会根据比例发生变化。
让我们使用size
参数再创建一个 3D 散点图。我们将使用著名的“iris”数据集,它是 plotly 库中的内置数据集。
df_iris = px.data.iris()
df_iris.head()
fig = px.scatter_3d(
df_iris, x='sepal_length', y='sepal_width', z='petal_width', color='petal_length',
size='petal_length', size_max=20
)fig.show()
还有一个参数增加了动态 3D 散点图的信息量,这就是symbol
。它只接受一个分类变量,代表数据点的符号根据类别而变化。例如,类别 A 可以用正方形表示,而类别 B 可以用圆形表示。
一个动态的 3D 图承载了大量的信息。如果“一张图胜过千言万语”,这些 3D 动态图有可能达到 100 万字:)
感谢阅读。如果您有任何反馈,请告诉我。
如何用 Faker 创建假数据
您可以收集数据或创建自己的数据
由paweczerwi ski在 Unsplash 上拍摄的照片
动机
假设您想要创建具有特殊特征(名称、地址、颜色、电子邮件、电话号码、位置)的特定数据类型(bool、float、text、integers)的数据,以测试一些 Python 库或特定实现。但是找到那种特定的数据需要时间。你想知道:有没有一种快速的方法可以创建你自己的数据?
如果有一个软件包可以让您在一行代码中创建假数据,比如:
fake.profile()
这可以用 Faker 来完成,这是一个 Python 包,它为您生成假数据,范围从特定数据类型到该数据的特定特征,以及数据的来源或语言**。让我们来看看如何使用 Faker 来创建假数据。**
Faker 的基础
从安装包开始
pip install Faker
进口冒牌货
from faker import Fakerfake = Faker()
Faker 的一些基本方法:
>>> fake.color_name()
'SeaGreen'>>> fake.name()
'Vanessa Schroeder'>>> fake.address()
'3138 Jennings Shore\nPort Anthony, MT 90833'>>> fake.job()
'Buyer, industrial'>>> fake.date_of_birth(minimum_age=30)
datetime.date(1906, 9, 18)>>> fake.city()
'Rebeccastad'
假设你是一本小说的作者,想创造一个角色,但发现想出一个真实的名字和信息既困难又费时。你可以写作
>>> name = fake.name()>>> color = fake.color_name()>>> city = fake.city()>>> job = fake.job()>>> print('Her name is {}. She lives in {}. Her favorite color is {}. She works as a {}'.format(name, city,color, job))
结果:
Her name is Natalie Gamble. She lives in East Tammyborough. Her favorite color is Magenta. She works as a Metallurgist
有了 Faker,你可以瞬间生成一个有说服力的例子!
但是如果我需要特定于一个位置的信息呢?
幸运的是,我们还可以指定我们想要伪造的数据的位置。也许你想创造的角色来自意大利。您还想创建她的朋友的实例。因为你来自美国,所以你很难生成那个地方的相关信息。这可以通过在类Faker
中添加location
参数来轻松解决
fake = Faker('it_IT')for _ in range(10): print(fake.name())
结果:
Lando Bertoli-Bulzoni Danilo Gianvecchio Dott. Margherita Veneziano Bianca Morabito Alfredo Rossetti Claudia Chechi Dott. Gastone Loredan Dott. Fulvio Russo Camilla Crisafulli-Gentileschi Agnolo Gioberti
或者从多个位置创建信息
fake = Faker(['ja_JP','zh_CN','es_ES','en_US','fr_FR'])for _ in range(10): print(fake.city())
结果:
Ceuta
Juanhaven
佳市
East Sarah
山武郡横芝光町
川崎市宮前区
Blondel-sur-Pottier
West Christine
Lake Amandahaven
Weekshaven
如果你来自这些特定的国家,我希望你能认出这个地方。如果您对您可以指定的其他位置感到好奇,请查看此处的文档。
创建文本
创建随机文本
我们可以创建随机文本
>>> fake.text()'Lay industry reach move candidate from local spring. Wind someone really but. One rock fund different down own.'
试试日语
>>> fake = Faker('ja_JP')>>> fake.text()'普通の器官証言する仕上げ鉱山癌。カラム索引障害自体今ブラケット創傷。細かい見出し見出し目的自体持っていました。\nピックバケツリンク自体。職人サワーカラム人形自体。癌ブランチ普通のデフォルト同行ヘア不自然な。\nあった偏差〜偏差今特徴敵。バストスパン拡張助けて。\nスマッシュ彼女ボトル隠す品質隠すサンプル。ヘアパイオニアスマッシュ風景。\nパン発生する装置尊敬する。偏差省略自体。'
从选定的单词创建文本
或者我们也可以从单词列表中创建文本
fake = Faker()my_information = ['dog','swimming', '21', 'slow', 'girl', 'coffee', 'flower','pink']fake.sentence(ext_word_list=my_information)
首次运行:
'Girl slow slow girl flower flower girl.'
第二轮
'Flower 21 flower coffee flower dog.'
创建快速配置文件数据
我们可以通过以下方式快速创建配置文件:
fake = Faker()fake.profile()
正如我们所看到的,关于一个人的大多数相关信息都是很容易创建的,甚至包括邮件、ssn、用户名和网站。
更有用的是,我们可以创建一个由来自不同国家的 100 名用户组成的数据框架
import pandas as pdfake = Faker(['it_IT','ja_JP', 'zh_CN', 'de_DE','en_US'])profiles = [fake.profile() for i in range(100)]pd.DataFrame(profiles).head()
或者创建自定义配置文件
创建随机 Python 数据类型
如果我们只关心数据的类型,而不太关心信息,我们很容易生成随机的数据类型,例如:
布尔代数学体系的
>>> fake.pybool()False
具有不同数据类型的 5 个元素的列表
>>> fake.pylist(nb_elements=5, variable_nb_elements=True)['TiZaWQDCzVIgSALOSKJD', 8100, 'hZTFGZpYVwJUcGZUoauG', Decimal('-3512.1951'), 37442800222.8852, 'XIxdbnwYMfOJDsZlaowZ']
一个有 5 个左数字和 6 个右数字的小数(在.
之后)
>>> fake.pydecimal(left_digits=5, right_digits=6, positive=False, min_value=None, max_value=None)Decimal('92511.722977')
你可以在这里找到更多关于你可以创建的其他 Python 数据类型的信息
结论
我希望你发现 Faker 是一个有效创建数据的有用工具。你可能会发现这个工具对你正在做的事情有用,也可能目前没用。但是知道有一个工具可以让您轻松地为您的特定需求(比如测试)生成数据是很有帮助的。
在这个 Github repo 中,您可以随意使用这篇文章的代码,或者在这里查看关于 Faker 的更多信息。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
如何利用包装算法实现数据可视化
towardsdatascience.com](/convex-hull-an-innovative-approach-to-gift-wrap-your-data-899992881efc) [## 字典作为 If-Else 的替代
使用字典创建一个更清晰的 If-Else 函数代码
towardsdatascience.com](/dictionary-as-an-alternative-to-if-else-76fe57a1e4af) [## 跟踪数据的 Python 技巧
如何用列表、字典计数器和命名元组来跟踪信息
towardsdatascience.com](/python-tricks-for-keeping-track-of-your-data-aef3dc817a4e) [## 高效 Python 代码的计时
如何比较列表、集合和其他方法的性能
towardsdatascience.com](/timing-the-performance-to-choose-the-right-python-object-for-your-data-science-project-670db6f11b8e) [## cy thon——Python 函数的加速工具
当调整你的算法得到小的改进时,你可能想用 Cython 获得额外的速度,一个…
towardsdatascience.com](/cython-a-speed-up-tool-for-your-python-function-9bab64364bfd)
如何用 Altair 创建交互式剧情
在 5 行简单的 Python 代码中利用您的数据分析
牛郎星是什么?
您是否曾经想要通过放大来仔细查看您的数据,突出显示感兴趣的点,或者使用滚动条来查看数据如何随时间变化?通过对静态图有更多的控制,你会发现你可以对数据有更多的了解。
但是你可以想象创造一个互动的情节一定很有挑战性。所以你决定不参与互动部分。如果有一个 python 库可以让你用几行 Python 代码就能做到这一点,那会怎么样呢?
上图是用 Altair 创建的。 Altair 是 Python 的统计可视化库,基于 Vega 和 Vega-Lite。Altair 提供了强大而简洁的可视化语法,用于快速构建各种各样的统计图形。您只需要声明数据字段、颜色、大小等之间的链接,而让其余的绘图细节自动处理。有了 Altair,你可以花更多的时间 理解你的数据和它的意义,而不是找出代码。
开始
安装 Altair
$ pip install altair
Altair 可以和示例数据集一起安装在 vega_datasets 中:
$ pip install altair vega_datasets
在 Jupyter 笔记本上导入 Altair
import altair as alt
import pandas as pd
Altair 中的一些数据集是围绕熊猫数据框架建立的。这是什么意思?这意味着你可以在 Altair 中操作数据,就像你处理熊猫数据帧一样。
我们将使用 vega_data 中的 gapminder 数据来显示一些国家 1995 年至 2005 年期间的全球健康和人口数据。
from vega_datasets import data as vega_data
gap = pd.read_json(vega_data.gapminder.url)gap.head(10)
找出此数据中有多少独特的年份:
>>> gap.year.unique()array([1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005])
既然我们最感兴趣的是最新的数据,那就让我们看看 2005 年的数据吧。
gap2005 = gap.loc[gap['year'] == 2005]
形象化
指定 X 轴和 Y 轴
我们对生育率和预期寿命之间的相关性很好奇。所以我们指定了我们想要用mark_point()
绘制的图的类型,以点的形式显示数据。我们还可以使用mark_*
以其他几何形状呈现数据
alt.Chart(gap2005).mark_point().encode(
alt.X('fertility'),
alt.Y('life_expect')
)
看起来数据不在图表的中心。通常我们需要用matplotlib
来指定比例,但是用牛郎星,你只需要用scale
的方法
调整比例
不错!但是如果我们想知道人口数量与生育率和预期寿命的关系呢?我们可以利用另一个维度:大小
太棒了。左侧的图例给出了每个圆圈大小的含义。我们能增加另一个维度吗?绝对的!x 轴,y 轴,尺寸,我们遗漏了什么?颜色!
添加颜色维度并指定数据类型
正如您在上面看到的,我们还可以指定数据的**类型:**N-名义(类别名称)、Q-数量(数字数据)、O-序数(有序数据)或 T-时间(时间点或时间间隔)。在上面的代码中,因为我想将聚类解释为类别数据,所以我使用了:N
为了让我们的圆圈看起来更好,我们用filled=True.
填充颜色,用alt.OpacityValue(0.5)
添加一些不透明度来看大点后面的小点
显示每个点的信息
但是图中有很多点。有没有一种方法,当我们点击每一个点来显示关于国家、生育率和预期寿命的信息?是的,当然。这可以通过添加Tooltip
来完成
能够看到每个点上的信息是很好的。但是如果我们想一次看到多个点的信息呢?不用再等了,让我们直接跳到如何用 Altair 创造一个互动的剧情!
互动情节
选择单点
Selection_single()
使我们能够点击一个点来突出显示它。当我们单击该点时,我们希望其他点变得与灰色无关。这可以通过alt.condition()
完成
现在,我们可以查看感兴趣点的信息,而不会被其他点分散注意力
选择多个点
但是我们可能同时对几个点感兴趣。或者更好,到选择一个区间的点。两者都可以用selection_multi()
和selection_interval()
来完成
因为我们想一次尝试不同的选择工具,所以让我们创建一个函数来完成它。
现在使用alt.hconcat()
尝试不同的选择,并连接这些选择的图形
时间间隔
我们已经看到了 2005 年的数据。如果我们想看到数据随时间的变化呢?通过为alt.selection_single
添加更多的条件,例如name=’select’, fields = [‘year’]
、初始年份init={‘year’: 1955}
和范围bind=alt.binding_range(min=1955, max=2005, step=5)
,可以很容易地做到这一点
不错!现在,通过在select-year
栏上拖动鼠标,我们可以很容易地看到数据随时间的变化
保存情节
创建图形后,我们希望从图形中得到的最后一个函数是什么?保存我们的图表以展示我们的网站或社交媒体!这可以通过点击图表左上角的按钮轻松完成。
结论
恭喜你!您已经学习了如何利用 Altair 进行高效的数据分析。这篇文章并没有详尽地涵盖你可以用 Altair 做的所有事情,比如创建一个堆叠条形图、热图、面积图、地图或其他交互功能。你可以在这里找到更多关于牛郎星图书馆的信息,或者关注 Github 教程。我最希望你从这篇文章中得到的是:用 Python 创建一个有趣而漂亮的图形可以是难以置信的简单和有趣!
在这个 Github repo 中,您可以随意使用本文的代码。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
我努力为数据科学贡献时间。但是发现新的策略使我能够提高我的学习速度和…
towardsdatascience.com](/how-to-learn-data-science-when-life-does-not-give-you-a-break-a26a6ea328fd) [## 什么是卓越的图形以及如何创建它
作为一名数据科学家,了解如何制作重要的图表至关重要
towardsdatascience.com](/what-graphical-excellence-is-and-how-to-create-it-db02043e0b37) [## 字典作为 If-Else 的替代
使用字典创建一个更清晰的 If-Else 函数代码
towardsdatascience.com](/dictionary-as-an-alternative-to-if-else-76fe57a1e4af) [## 使用 Python 最大化您的生产力
你创建了一个待办事项清单来提高效率,但最终却把时间浪费在了不重要的任务上。如果你能创造…
towardsdatascience.com](/maximize-your-productivity-with-python-6110004b45f7) [## 跟踪数据的 Python 技巧
如何用列表、字典计数器和命名元组来跟踪信息
towardsdatascience.com](/python-tricks-for-keeping-track-of-your-data-aef3dc817a4e)
参考
赫尔,杰佛里。github:https://github.com/uwdata/visualization-curriculum。2017 年 1 月。
如何用 Python 创建交互式可视化
Plotly express 简介
在这个博客中,我们将学习如何用 Python 创建交互式可视化。在探索添加更多的交互式控件之前,我们将从仅仅用不同的格式绘制数据开始。
如果你已经关注我一段时间了,你会注意到这是数据可视化系列的第三篇文章。我们首先介绍了使用默认 python 可视化库 matplotlib 的数据可视化。然后我们学习了如何使用同一个库创建一个时间序列的动画可视化。
动画数据可视化的基础
towardsdatascience.com](/learn-how-to-create-animated-graphs-in-python-fce780421afe)
今天,我们将学习如何使用 Plotly express。Plotly 允许用户在开箱即用的可视化界面上进行交互,并且更容易与网络内容集成。
plotly express 简介
Plotly express 是 plotly wrapper,它允许更简单的语法。
受 Seaborn 和 ggplot2 的启发,它专门设计了一个简洁、一致和易于学习的 API:只需一个导入,只需一个函数调用就可以制作丰富的交互式绘图,包括分面、地图、动画和趋势线。
如果你想了解更多,可以去 Plotly 的官方媒体岗位看看。
只需两行代码,你就可以拥有一个看起来很酷的交互式图形。这很简单,因为:
import plotly.express as pxfig = px.line(x='x data set', y= 'y data set')fig.show()
获取和准备数据
就像我们在 Python 中的数据可视化系列的前几篇文章中所做的一样,我们将使用新冠肺炎数据。虽然在这篇博客中,我们不会涉及熊猫的运作,这些运作引导我们去获取和格式化我们的数据,如果你想进一步了解它,请阅读这篇文章。
我们将使用以下数据代码来获取和格式化我们的数据:
import plotly.express as px
import numpy as np
import pandas as pdurl = '[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv')
df = pd.read_csv(url, delimiter=',', header='infer')
df_interest = df.loc[
df['Country/Region'].isin(['United Kingdom', 'US', 'Italy', 'Brazil', 'India'])
& df['Province/State'].isna()]
df_interest.rename(
index=lambda x: df_interest.at[x, 'Country/Region'], inplace=True)
df1 = df_interest.transpose()
df1 = df1.drop(['Province/State', 'Country/Region', 'Lat', 'Long'])
df1 = df1.loc[(df1 != 0).any(1)]
df1.index = pd.to_datetime(df1.index)df1 = df1.diff() #day on day changes
创建图表
线形图
要在图上添加一行,我们实际上需要两行代码:
fig = px.line(x=df1.index, y= df1[df1.columns[0]],title = 'Daily Deaths due to COVID-19', name = df1.columns[0])fig.show()
简单线图
要添加更多的行,我们需要。add_scatter()属性。使用一个循环,我们可以添加范围内的所有国家。
fig = px.line()for i,n in enumerate(df1.columns):
fig.add_scatter(x=df1.index, y= df1[df1.columns[i]], name= df1.columns[i])
多线绘图
最后,我们可以考虑给我们的图表增加一些细节。我个人喜欢在图中突出显示不同的数据点。
fig.update_traces(mode='markers+lines')
带标记的图表
最后但同样重要的是,添加相关的轴标签,设置字体大小并替换默认模板。
fig.update_layout(
title = 'Daily Deaths due to COVID-19'
,xaxis_title = 'Dates'
,yaxis_title = 'Number of Deaths'
,font = dict(size = 25)
,template = 'plotly_dark' #"plotly", "plotly_white", "plotly_dark", "ggplot2", "seaborn", "simple_white", "none"
)
条形图
与我们之前看到的方式非常相似,条形图可以很快地组合在一起:
fig = px.bar()for i,n in enumerate(df1.columns):
fig.add_bar(x=df1.index, y= df1[df1.columns[i]], name= df1.columns[i])fig.update_layout(
title = 'Daily Deaths due to COVID-19'
,xaxis_title = 'Dates'
,yaxis_title = 'Number of Deaths'
,font = dict(size = 25)
,template = 'plotly_dark' #"plotly", "plotly_white", "plotly_dark", "ggplot2", "seaborn", "simple_white", "none"
)fig.show()
饼图
和以前一样,唯一的不同是我们将只显示时间序列中最近的一天。
df1 = df1.tail(1).transpose()
fig = px.pie(df1, values = str(df1.columns[0]), names = df1.index)
fig.update_traces(textposition='inside', textinfo = 'percent+label')ddate = str(df1.columns[0])[:10] #chop timestampfig.update_layout(
title = f'Deaths on {ddate} due to COVID-19'
,xaxis_title = 'Dates'
,yaxis_title = 'Number of Deaths'
,font = dict(size = 25)
,template = 'seaborn' #"plotly", "plotly_white", "plotly_dark", "ggplot2", "seaborn", "simple_white", "none"
)fig.show()
交互式控件
既然我们已经看到了如何快速地将不同类型的观想放在一起,现在是我们用交互控制来增强我们的观想的时候了!
范围滑块
首先,用一行代码,我们将添加一个范围滑块——一个漂亮的控件,允许用户关注时间序列的特定部分。
fig.update_xaxes(rangeslider_visible=True)
距离焦点
如果我们的用户总是关注时间序列中的某些片段,那该怎么办?然后我们就可以直接构建那些控件了!
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=7, label="1w", step="day", stepmode="backward"),
dict(count=1, label="1m", step="month", stepmode="backward"),
dict(count=2, label="2m", step="month", stepmode="backward"),
dict(step="all")
]),
font = dict( color='#008000', size = 11),
)
)
自定义按钮
体验过前面一组关于焦点范围的功能后,很容易想象构建自定义按钮。Plotly express 以一种简单的方式迎合了这一点。让我们来看一下自定义按钮,这些按钮允许我们关注各个国家。
fig.update_layout(
updatemenus=[
dict(
type="buttons",
direction="right",
active=0,
x=0.5,
y=1.03,
buttons=list([
dict(label=df1.columns[0],
method="update",
args=[ {"visible": [True, False, False, False, False]},
{'showlegend' : True}
]),
dict(label=df1.columns[1],
method="update",
args=[ {"visible": [False, True, False, False, False]},
{'showlegend' : True}
]),
dict(label=df1.columns[2],
method="update",
args=[ {"visible": [False, False, True, False, False]},
{'showlegend' : True}
]),
dict(label=df1.columns[3],
method="update",
args=[ {"visible": [False, False, False, True, False]},
{'showlegend' : True}
]),
dict(label=df1.columns[4],
method="update",
args=[ {"visible": [False, False, False, False, True]},
{'showlegend' : True}
]),
dict(label='All',
method="update",
args=[ {"visible": [True, True, True, True, True]},
{'showlegend' : True}
]),
]),
)
]
)
下拉菜单
获得下拉菜单就像注释掉上一节中的一行一样简单。你所需要做的就是注释掉“type='buttons '”,给你:
结论
Plotly express 绝对是一个非常棒的数据可视化工具,它非常容易上手,使用起来也非常 pythonic 化。在这篇博客中,我们仅仅触及了它所提供的一些皮毛。我非常鼓励你进一步探索这个库,因为可能性真的是无穷无尽的!
如果您觉得这篇文章很有趣,您可能也会喜欢:
在这篇博客中,我们将学习如何获取、转换并最终吸引人地呈现数据。我们要去工作了…
towardsdatascience.com](/the-basics-of-data-visualisation-with-python-23188aa9fc1a?source=your_stories_page---------------------------) [## 构建用于比较数据的 Python UI
如何快速让您的非技术团队能够比较数据
towardsdatascience.com](/building-a-python-ui-for-comparing-data-13c10693d9e4) [## 估算一个软件的最后期限真的很难——让我们来谈谈为什么
规划时你需要知道的 5 条法则
medium.com](https://medium.com/better-programming/estimating-a-software-deadline-is-really-hard-lets-talk-about-why-44687a6baf9d)
如何使用 Plotly Express 创建交互式可视化
有许多例子的实用指南
Plotly Python (plotly.py)是一个基于 plotly javascript (plotly.js)构建的开源绘图库。Plotly express 是 plotly.py 的一个高级接口,它允许我们创建许多交互式和信息可视化。
在这篇文章中,我们将一步一步地增加复杂程度,同时浏览许多例子。我们将探究添加到可视化中的每个特征/结构的效果。
如果您的工作环境中没有安装 plotly.py,您可以使用 pip 或 conda 进行安装:
$ pip install plotly==4.8.0$ conda install -c plotly plotly=4.8.0
先来导入 plotly express:
import plotly.express as px
对于示例,我们将使用两个不同的数据集。一个是 kaggle 上的“电信客户流失”数据集。另一个是 gapminder 数据集,可在 plotly 库中找到。plotly 的这些内置数据集对于练习来说很方便。
流失预测是机器学习领域的一个常见用例。如果你不熟悉这个术语,churn 的意思是“离开公司”。对于一个企业来说,了解客户可能流失的原因和时间是非常重要的。拥有一个强大而准确的客户流失预测模型有助于企业采取措施防止客户离开公司。我们将尝试探索数据集,并了解数据集的底层结构。原始数据集包含 7043 个客户的 20 个特征(自变量)和 1 个目标(因变量)。在这篇文章中,我们将只使用 7 个特性和目标变量。
churn = pd.read_csv("Telco-Customer-Churn.csv")churn = churn[['gender', 'Partner', 'tenure', 'PhoneService', 'InternetService', 'Contract', 'MonthlyCharges','Churn']]
churn.head()churn.head()
我们从一个基本的箱线图开始,根据合同类型检查每月费用的分布:
fig = px.box(churn, x="Contract", y="MonthlyCharges")fig.show()
箱线图越高,数值越分散。该图告诉我们,长期合同的月费用范围更大。我们可以通过将鼠标悬停在最小值、第一个四分位数、中值、第三个四分位数和最大值的可视化图形上来查看箱形图的临界值。
我们可以通过颜色参数对不同的组使用不同的颜色,还可以添加一个额外的变量用于比较 facet_col 参数。
fig = px.box(churn, x="Contract", y="MonthlyCharges",
color="Contract", facet_col='Partner')fig.show()
看起来有一个合作伙伴并没有显著改变合同类型。
散点图也常用于理解变量之间的关系。为了演示清楚,我将采用数据集的前 200 行。
churn_filtered = churn.iloc[:200,:]
我们可以检查任期和月费之间的关系,以及这种关系如何根据合同类型和是否有合作伙伴而变化。保有权变量是客户成为客户的月数。
fig = px.scatter(churn_filtered,
x="tenure", y="MonthlyCharges",
color='Partner',
facet_col="Contract", facet_col_wrap=3)
fig.show()
基于指定的变量创建支线剧情。 Facet_col_wrap 参数调整支线剧情的排列。
这个图告诉我们的是,没有合作伙伴的客户倾向于按月签约。此外,有合作伙伴的客户在公司停留的时间更长(任期更长)。这是原始数据集的子集,但是根据这 200 行,公司销售的逐月合同比一年或两年合同多。图中的每个点代表一个客户,我们可以通过悬停在该点上来查看数据。
我们也可以通过使用 groupby 函数检查平均值来确认我们的直觉:
churn_filtered[['Contract','Partner','tenure']].groupby(['Contract','Partner']).mean()
对于每种合同类型,有合作伙伴的客户的任期更长。此外,没有合作伙伴的客户数量在逐月合同细分市场中更多。
让我们来看看每月费用、合同类型和任期方面的流失率。我们还为情节添加了一个标题:
fig = px.scatter(churn_filtered, x="tenure", y="MonthlyCharges",
color='Churn',
facet_col="Contract", facet_col_wrap=3,
title= "Churn Rate Analysis")fig.show()
正如我们在上面的图表中看到的,拥有长期合同的客户不太可能流失(即离开公司)。如果公司想留住客户,首要任务应该是签订长期合同。
我们还可以使用 marginal_x 和 marginal_y 参数向散点图添加分布指示。这次让我们绘制整个数据集,并检查我们的 200 行样本是否真正很好地代表了整体:
fig = px.scatter(churn,
x="tenure", y="MonthlyCharges",
color="Churn",
marginal_y="rug", marginal_x="histogram")fig.show()
我们先来评价一下 x 轴。对于少于 10 个月的任期,red points(流失=是)占主导地位。随着任期的不断延长,蓝点(流失=无)正在成为主导类别。我们还可以在散点图上方的直方图中看到这一点。它显示了红点和蓝点的分布如何根据 x 轴上的位置而变化。大多数流失的客户任期不到 10 个月。
y 轴表示每月费用。散点图中红点的密度随着 y 轴的上升而增加(即每月费用增加)。这也可以在散点图右侧的地毯图上看到。水平线的密度在上部更密集。除了底部之外,蓝点的密度比红点更均匀。
Ploty express 提供了许多数据集来练习。我们可以很容易地将这些数据集加载到熊猫数据框架中。例如, gapminder 数据集包括 142 个国家 12 年的人均 gdp(不连续)。该数据集还包含这些年各国的预期寿命和人口。
gap_df = px.data.gapminder()gap_df.head()
我们来绘制一下 1952 年的人均寿命和人均 gdp。Plotly express 允许在使用查询方法创建绘图时过滤数据帧:
fig = px.scatter(gap_df.query("year==1952"),
x="gdpPercap", y="lifeExp",
hover_name="country",
color="continent", log_x=True
title="GDP vs Life Expectancy in 1952")
fig.show()
通过将 hover_name 参数设置为“country ”,我们能够在点上看到国家的名称。
总的来说,非洲国家的人均国内生产总值较低,欧洲国家的人均国内生产总值处于最高区域。科威特是个异数,人均 gdp 超过 10 万。你可能已经注意到了 x 轴上的对数刻度。我们通过将 log_x 参数设置为 True 来实现它,这使得绘图看起来更好。如果没有 log_x 参数,该图将如下所示:
我们也可以使用大小参数来表示图中的另一个变量。例如,如果我们设置 size="pop ",那么点数的大小就与国家的人口数成比例。
fig = px.scatter(gap_df.query("year==1952"),
x="gdpPercap", y="lifeExp",
hover_name="country",
color="continent", log_x=True,
size="pop", size_max=50,
title="GDP vs Life Expectancy in 1952")
fig.show()
我们已经用 plotly express 介绍了一些基本的可视化类型。当然,这只是这个神奇的图书馆的一小部分功能。我们可以使用 plotly 动态创建许多其他绘图类型。它的语法也很容易理解。在接下来的帖子中,我会尝试涵盖更复杂的情节。你也可以查看 plotly 文档,我认为它有很多不同的例子。就像任何其他主题一样,熟悉 plotly 的最好方法就是实践。因此,我建议创造大量的情节来提高你的技能。
感谢您的阅读。如果您有任何反馈,请告诉我。
如何使用 Spotipy 创建大型音乐数据集
为机器学习获取音乐相关数据的最快、最干净的方法
什么是 Spotipy,你能用它做什么?
你是音乐爱好者还是程序员?很有可能,你们都是,就像我一样!当我开始使用 Spotipy 时,我几乎没有编程经验,想探索计算音频分析。现在,随着我深入编程和数据科学,我开始欣赏 Spotipy 为我的数据科学项目创建了令人惊叹的数据集。
这个图书馆非常适合你,如果
- 你是一名数据科学家或程序员,想要为机器学习生成有趣的数据集
- 你是一名音乐家/音乐学家想要学习编程或数据分析
Spotipy 是一个 Python 库,用户可以更容易地访问 Spotify Web API,并从中检索各种音乐数据。当我开始使用 Spotipy 时,这是我第一次接触 API。因此,如果您从未使用过 API,请不要担心。你能做到的!
你可以用 Spotipy 做这些事情
- 使用您自己的用户数据(创建或编辑您的播放列表,查找您最喜欢的曲目等。)
- 获取 Spotify 上每个曲目、专辑和艺术家的数据
在本指南中,我们将探索后一种应用的可能性。我将向您展示如何使用这些数据为统计分析或机器学习项目创建令人惊叹的数据集。
以下是您应该使用 Spotipy 创建数据集的两个主要原因:
- 由于 Spotify 拥有超过 5000 万首歌曲,创建大型数据集的可能性是无限的。最重要的是,一旦您设置好了基础,您将能够非常快速地检索数据。
- 在音乐领域,机器学习有如此多令人惊叹的应用,你可以探索。预测泰坦尼克号幸存者变得无聊了吗?不如你建立一个流派分类器,一个推荐系统,或者一个热门歌曲预测器?在我听来,那听起来更酷。
引起了你的兴趣?太好了!读完这个故事后,你就可以创建你的第一个大样本音乐数据集了(1k,10k,100k?你决定!).为了让你更容易做到这一点,我将通过你需要采取的三个步骤来指导你。
三步指南。1.注册和授权,请按 2。选择要分析的音乐,3。分析曲目并导出数据。
第一步:注册并授权
登记
这是最难的部分,但是坚持住。我们很快就要编码了!为了使用 Spotify Web API,你需要在 https://developer.spotify.com/注册一个应用程序。不管你实际上是在构建一个应用程序还是仅仅在探索 API。这是你走向成功的三个步骤:
在这里,您提出了一个应用程序名称(您如何称呼它并不重要)和对它的描述。当我创建我的应用程序时,我只是诚实地写道,我只是想用我的应用程序探索 API。对我很有效。
3.打开你的应用视图,点击“编辑设置”。在重定向 URL 字段中输入 http://localhost/ 。
4.回到你的应用程序视图,点击你的客户端 ID 下的“显示客户端密码”。
5.将客户端 ID 和客户端秘密 ID 存储在文本文件或其他文件中,以便以后快速访问。我们需要他们的授权。
如果我的解释方式对你没有帮助,我建议你查看这部分的不同资源。一个很棒的介绍就是 Max Tingle 的这篇文章。
批准
万一最后一部分对你来说有点混乱或烦人,确保你只用几行代码就能完成无聊的部分。
- 首先,您需要进行两次导入。如果您还没有安装 spotipy,请先使用命令“pip install spotipy”来安装它。
import spotipy
import spotipy.util as util
2.接下来,将您的客户端和秘密 ID 分配给变量。
CLIENT_ID = "YourClientID"
CLIENT_SECRET = "YourSecretID"
3.下面几行代码我就不细说了。我建议你复制粘贴它们,以后再学习。
token = util.oauth2.SpotifyClientCredentials(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
cache_token = token.get_access_token()
sp = spotipy.Spotify(cache_token)
太好了!现在,您将在步骤 2 中开始分析一些实际的音乐。
第二步:选择要分析的音乐
现在 Spotify API 就在你的脚下,你打算用它做什么呢?如前所述,分析大量的轨迹会产生大量的数据集。然而,手动选择每一首曲目是很痛苦的。你需要一些曲目的集合或列表。以我的个人经验来看,有两个选项非常有用,那就是按播放列表或艺术家来搜索曲目。两者各有利弊,在我们进入真正的分析之前,我将很快介绍一下。
通过播放列表选择音乐
用户 Oscar Lallier 在 Spotify 上的“史上最长播放列表”
播放列表有多大?上面的这个美女有 10,000 首歌曲,这似乎是 Spotify 允许的最大播放列表大小。也许你也想使用包含 5000 首歌曲的“有史以来最大的播放列表”播放列表。环顾四周,你会发现许多这样的大型播放列表,可以用来快速建立一个大型数据集。然而,你必须问问自己,你真正的研究兴趣是什么。这 15000 的集合对任何人都有用吗?也许你想用这样的数据集来调查 Spotify 上的一些音频功能是如何分布的?
另一种方法是根据主题选择播放列表。您可以获取标题中带有“睡眠”一词的播放列表的前 20 个搜索结果。也许你想将“睡眠”播放列表中的歌曲与“专注”播放列表中的歌曲进行比较,找出它们的不同之处。我以前用这种方法分析过浪漫和心碎的歌曲在音乐上是否不同(令人惊讶的是,它们并没有不同)。
如果您选择了您感兴趣的播放列表,请确保存储它们的创建者用户名以及播放列表 id。您可以从 url 中检索 ID,如下所示。
按艺术家选择音乐
另一种选择音乐的方式是通过他们的艺术家。我以前使用过这种方法来建立一个机器学习模型,该模型将新发布的工具专辑“恐惧接种体”中的音乐分配给 6 个进步金属/摇滚乐队中的正确乐队。然而,在这种情况下,你面对的是小样本。很少有艺术家有几百首歌曲,更不用说几千首了。然而,Spotify 有一个“推荐艺术家”功能。您可能想要使用它来增加样本大小,同时仍然使用类似的音乐。
为德国乐队“拉姆斯坦”推荐艺术家:“林德曼”、“魅力”、“移民”、“玛丽莲·曼森”。
一旦你选择了几个艺术家,就像你之前存储播放列表 id 一样存储他们的艺术家 ID。
对于第三步,我将向你展示如何从播放列表中分析音乐。我们鼓励你自己通过 artist 来尝试如何做到这一点。也可以随时问我任何问题。
步骤 3:分析轨迹并导出数据
3.1 分析单个播放列表
让我们进入一些实际的编码。检索播放列表中每个曲目信息的基本 Spotipy 函数是:
sp.user_playlist_tracks("username", "playlist_id")
让我们以 Spotify 的“Warum Fuzzy Feeling”播放列表为例。
Spotify 的“温暖模糊的感觉”播放列表
从 url 中获取 ID,我们现在可以应用该函数。
sp.user_playlist_tracks("spotify", "37i9dQZF1DX5IDTimEWoTd")
输出是势不可挡的,乍一看,对于不习惯处理 API 的人来说完全无法理解。这是一些输出。
sp.user_playlist_tracks 函数的输出
虽然我非常鼓励您自己探索输出,但我不会在这里深入讨论,而只是简单地向您展示您想要的特性以及在哪里可以找到它们。如果您确实想自己探索输出,将它视为多个相互嵌套的字典的集合是很有用的。
这些是我们可以从输出中提取的特征。
- 元信息(艺术家、专辑、曲目名称、曲目 ID)
- 声学参数(响度、音调、模式、速度)
- 心理声学参数(可跳舞性、能量、乐器性、活性、效价)
Spotify 有一些很棒的资源,可以让我们找到更多可以提取的特征(见下图)。点击了解更多。
Spotify 解释他们的“可跳舞性”参数。
因为这是一篇介绍性的文章,所以我将向您展示提取函数,并简要解释它是如何工作的。
- 创建一个包含所有相关列的空数据框架
- 将 sp . user _ playlist _ tracks(" username “,” playlist_id “)存储到” playlist "变量中
- 循环播放列表中的每个曲目
- 创建一个空字典来填充音轨信息
- 直接提取元数据
- 通过 sp.audio_features(track_id)提取音频特征
- 将 track_dict 连接到现有的数据帧上
- 返回最终数据帧
这是作为纯代码的函数。你可以在这个 github 库 中以更吸引人的格式找到本教程的全部代码。
def analyze_playlist(creator, playlist_id):
# Create empty dataframe
playlist_features_list = ["artist","album","track_name", "track_id","danceability","energy","key","loudness","mode", "speechiness","instrumentalness","liveness","valence","tempo", "duration_ms","time_signature"]
playlist_df = pd.DataFrame(columns = playlist_features_list)
# Loop through every track in the playlist, extract features and append the features to the playlist df
playlist = sp.user_playlist_tracks(creator, playlist_id)["items"]
for track in playlist: # Create empty dict
playlist_features = {} # Get metadata
playlist_features["artist"] = track["track"]["album"]["artists"][0]["name"]
playlist_features["album"] = track["track"]["album"]["name"]
playlist_features["track_name"] = track["track"]["name"]
playlist_features["track_id"] = track["track"]["id"]
# Get audio features
audio_features = sp.audio_features(playlist_features["track_id"])[0]
for feature in playlist_features_list[4:]:
playlist_features[feature] = audio_features[feature]
# Concat the dfs
track_df = pd.DataFrame(playlist_features, index = [0])
playlist_df = pd.concat([playlist_df, track_df], ignore_index = True)
return playlist_df
此时,您可以复制我的函数,编辑它,或者自己探索 API。在任何情况下,上面的函数都返回一个 dataframe,它可以很容易地转换成您想要的任何数据格式。
输出数据帧
# csv
df.to_csv("dataframe.csv", index = False)
# excel
df.to_excel("dataframe.xlsx", index = False)
3.2 分析多个播放列表
最后,我将向您展示如何创建包含多个播放列表的数据帧。
您可以使用以下函数来完成此任务。它分析每一个播放列表,添加一个带有播放列表名称的“播放列表”列。最后,该函数连接新旧数据帧。
def analyze_playlist_dict(playlist_dict):
# Loop through every playlist in the dict and analyze it
for i, (key, val) in enumerate(playlist_dict.items()):
playlist_df = analyze_playlist(*val)
# Add a playlist column so that we can see which playlist a track belongs too
playlist_df["playlist"] = key
# Create or concat df
if i == 0:
playlist_dict_df = playlist_df
else:
playlist_dict_df = pd.concat([playlist_dict_df, playlist_df], ignore_index = True)
return playlist_dict_df
然而,你需要以特定的格式组织你的播放列表,以使该功能正常工作。正如您在下面看到的,您需要将播放列表存储在一个字典中,将播放列表名称作为键,将它们的创建者和播放列表 id 作为元组形式的值。
playlist_dict = {
“warm_fuzzy_feeling” : (“spotify”, “37i9dQZF1DX5IDTimEWoTd”),
“love_songs_heart” : (“indiemono”, “5KbTzqKBqxQRD8OBtJTZrS”),
“romance_songs” : (“Susan Doles”, “7sAUK3XK8NHH1s5vGcTBkF”)
}
让我们看看运行这个函数会发生什么。
multiple_playlist_df = analyze_playlist_dict(playlist_dict)
multiple_playlist_df["playlist"].value_counts()
输出:
love_songs_heart 100
romance_songs 77
warm_fuzzy_feeling 70
Name: playlist, dtype: int64
如您所见,使用这种方法,您可以轻松地分析 20 个大型播放列表,并获得数千个曲目分析。但是,请记住,您需要进行一些数据清理。特别是,检查重复将是一个重要的步骤。
后续步骤
现在你已经有了第一个音乐数据集,但是下一步做什么呢?以下是一些想法:
- 分析不同流派、情绪或活动的播放列表。将每组播放列表(例如“悲伤”与“快乐”)存储在单独的数据帧中。然后,使用逻辑回归、决策树或深度学习方法(如神经网络或随机森林)来构建分类算法。
- 根据不同的艺术家而不是播放列表来分析音乐。您会发现以下两个函数对此很有用:
sp.audio_analysis(track_id)
sp.audio_features(track_id)
- 构建一个推荐系统,根据流派、情绪或活动输入向用户推荐音乐。
感谢您阅读这篇文章!如果有什么东西不见了或者对你不起作用,请随时给我发信息。
如何直接从 Python 代码创建 Latex 表
将控制台中的结果表复制到 Latex 报告中是一件单调乏味且充满错误的事情——那么为什么不实现自动化呢?
制作桌子要简单优雅(图片由罗曼·博日科在 Unsplash 上拍摄)。
创建结果表在交流数据科学的实验结果方面起着重要作用。在 Python 中生成表格并在控制台输出中绘制它们有各种解决方案,但是如何将它们转换成书面报告呢?通常,这需要一些耗时和令人麻木的复制和粘贴,但有一些更好的解决方案。
用 Python 制作表格
Python 有几个库允许你绘制表格。在这篇文章中,我将特别关注两个:制表和文本表格。它们都实现了相同的目标——以尽可能少的麻烦生成格式良好的表格。制表是更受欢迎的图书馆,上个月下载量超过 1000 万次。相比之下,texttable 的用户量不到 200 万(根据 2020 年 6 月底的 PyPi 统计数据):
table 和 texttable 的下载比较( PyPi Stats 30/06/2020)
这两个库都允许您以特定的样式格式化表格。Texttable 在选择表格设计方面给予用户完全的自主权;可以定制列对齐、标题对齐、表格装饰、列类型,甚至是用于在行列之间画线的字符。制表选择关注预先设计的格式,但是用户仍然可以选择覆盖这些格式。
我个人的偏好是使用 texttable。十有八九,我使用它是因为它是我遇到的第一个创建表的库,但是它还没有让我失望。
导出到 Latex
制表格式主要是为了在其他平台上使用或模仿它们的设计,例如 github、html、psql。其中一种格式允许创建 latex 代码,为您提供可以直接复制并粘贴到 Latex 文档中的文本。工作完成了——这很容易。
比制表更轻量级的 Texttable 没有提供这样的解决方案。然而,作为一个个人的业余项目,我把我的第一个 Python 库放在一起,作为 texttable 的包装器来创建 Latex 表。我创造性地将其命名为 latextable ,目前它已经在 PyPi 上可用。它提供了与制表 Latex 格式类似的输出,并提供了额外的功能,如匹配 texttable 控制台输出的格式,并允许用户添加表格标题和标签。
使用任何一个库都非常简单;它们都做了它们的设计用途,并且有非常相似的用法。对于包含表数据的行列表,表是这样创建的:
print('Tabulate Table:')
print(tabulate(rows, headers='firstrow'))table = Texttable()
table.set_cols_align(["c"] * 4)
table.set_deco(Texttable.HEADER | Texttable.VLINES)
print('\nTexttable Table:')
print(table.draw())
输出 Latex 代码同样简单:
print(‘\nTabulate Latex:’)
print(tabulate(rows, headers=’firstrow’, tablefmt=’latex’))
print(‘\nTexttable Latex:’)
print(latextable.draw_latex(table, caption=”A comparison of rocket features.”))
它给出了下面的 Latex 代码:
两种 Latex 输出都可以直接复制到 Latex 文档中,latextable 输出具有自动缩进的优点。控制台输出与渲染 Latex 的比较如下所示:
比较控制台输出(左)和渲染 Latex 输出(右)的制表(上)和 texttable/latextable(下)。
我已经在的 Colab 笔记本中提供了这个例子的完整源代码。很可能您仍然需要对 Latex 代码进行一些修改,以得到您想要的样子,但是通过使用这些工具中的一个,您至少不必浪费时间来复制和粘贴东西。这样做的好处是,你在抄写时不会犯任何错误!