如何动态更改 Power BI Visual 中的尺寸
数据可视化中最受欢迎的功能之一是用户能够更改/切换图形中的维度。下面是如何在 Power BI 中实现的。
作者 Gif
最近,我一直在使用 Power BI 以富有洞察力的方式可视化数据,其中最受欢迎的功能之一是更改/切换仪表板中某个图形的维度。今天,我将一步一步地教你如何做到这一点。你只需要对 Power BI 有一个基本的了解就可以了。
我将使用一个 kaggle 数据集,它可以在这里找到来展示如何在一个 Power BI 视觉中改变尺寸。创建此功能的基本步骤如下:
- 在电源查询中创建桥接表
- 在超级查询中创建属性切片器表
- 连接事实表、桥和属性切片器表
- 添加具有动态维度功能的切片器和图形
好,我们开始吧!
- 在电力查询中创建桥接表
在创建桥表之前,您需要加载事实表。我将使用上面链接的 Kaggle 中的 vgsales 数据作为我的事实表。一旦完成,您将需要转到 Power Query 编辑器,为您的事实表创建两个副本,这可以通过右键单击事实表并选择 Duplicate 来完成。将第一个重复表重命名为“桥表”,将另一个重复表重命名为“属性切片器”。接下来:
- 在电源查询中选择您的网桥表
- 移动到“转换”选项卡
- 选择您希望能够在视觉效果中更改/切换的列(在我的例子中是:平台、流派和出版商)。提示:您可以通过按住 Ctrl 键并单击来选择多列。
- 单击“取消透视列”
unpivoting 要做的是将三个维度连接到一个名为“属性”的列中,这样每一行(唯一的视频游戏名称)现在将有 3 行(每个维度一行)。3 个维度中每个维度的值现在将合并到一个名为“值”的列中。这是取消透视前的表格:
作者图片
这是取消透视后的表格:
作者图片
所以,基本上我们把表格从宽格式转换成了长格式。
2.在超级查询中创建属性切片器表
我们将对属性切片器表执行与桥接表相同的步骤,并增加几个额外的步骤:
- 在超级查询中选择属性切片器表
- 移动到“转换”选项卡
- 选择您希望能够在视觉效果中更改/切换的列(在我的例子中是:平台、流派和出版商)
- 单击“取消透视列”
- 选择新的“属性”列
- 移动到主页表
- 选择删除其他列(在删除列选项卡下)
- 选择删除重复项(在删除行选项卡下)
所以基本上你会得到一个只有一列和三个值的表:平台、流派和出版商。你现在可以点击关闭并在超级查询中应用。
3.连接事实表、桥和属性切片器表
要连接事实表和桥表,您需要转到 Power BI 中的 Model 选项卡,并选择 Manage Relationships。您的事实表需要有一个惟一的主键来连接到桥表上。在我的例子中,PK 是等级和/或名称列。你们的关系应该是这样的:
作者图片
确保选择交叉过滤方向选项“Both ”,否则动态切片器将无法工作。接下来,设置桥和属性切片器表之间的关系,如下所示:
作者图片
您的数据模型应该如下所示:
作者图片
4.添加具有动态尺寸功能的切片器和图形
现在是时候真正开始有趣的事情了!我们将向报告页面添加一个切片器,并将属性切片器表中的属性添加到其中。然后,我们将添加一个条形图,并选择以下数据用于它:
轴:属性切片器表中的属性
图例:桥表中的值
值:Global_sales(这可以是您想要的任何指标)
我还在值过滤器中只过滤了前 10 名 Global_sales,以减少图表中显示的条形列的数量。您的页面应该如下所示:
作者图片
现在,您可以通过更改切片器选项来选择不同的属性显示在您的图形中!不要忘记让切片器只选择一个选项。
希望你喜欢我的教程,一如既往,我已经在我的 github 上发布了数据和功率 BI 报告。
如何轻松地自动化您的键盘来完成 Python 中的任务
永远告别单调的任务
https://unsplash.com/@girlwithredhat
在 Python 中自动化你的键盘是非常容易的,下面是如何做到的。
你可以很容易地设置脚本,让它在你睡觉的时候帮你完成任务。
在这里,我将使用一个将成千上万的 PDF 文件转换为。txt 文件。在处理任何 NLP 项目时,知道如何做也是一件非常有用的事情。我还会写一些关于如何从 pdf 中提取数据的后续文章,所以请保持警惕。
你当然可以用 Adobe 来做这个,但是那会让你付出代价,而且这种方式肯定更有趣。
然而,实际应用并不止于此。如果你能自动化你的键盘,你就能自动化你的电脑所做的大部分事情!
让我们开始吧。
键盘包装
这个例子中的重物是“键盘”包。它的文档可以在这里找到。这是一个用纯 Python 编写的非常简单的包,并且没有依赖性。它可以在 Linux 和 Windows 上运行,从个人经验来看,它的易用性非常好。
你大概能猜到怎么安装。
pip install keyboard
使用起来非常简单。下面的代码只有七行,它将打开 windows 栏,搜索 google chrome,然后打开一个新的 chrome 浏览器。
作者代码—可在 https://gist.github.com/jasher4994 的获得。
尽管这可能很酷,但绝对没用。所以让我们进入有用的东西。
可以节省你数周时间的东西。
结合使用键盘和 Python 脚本来自动化重复的过程
我发现键盘包最有用的地方是它是一个设计良好的系统的一部分,这个系统围绕着一个只能用键盘执行的重复动作。
因此,具有挑战性的部分是设计一个系统,这样我们就可以自动化这个过程——在这个系统中,我们可以只用键盘做任何事情。
在这种情况下,很简单,我们必须设计一个系统,在其中我们可以使用键盘来自动化单调的动作,节省。txt 文件。
因此,我们需要按顺序做这些事情:
- 打开我们要更改为. txt 文件的文件。
- 点击“文件”
- 单击“另存为文本”
- 指定新文件名
- 单击保存
我们需要做很多次。因此,我们希望对所有想要转换的文件自动执行这些操作。txt 文件。
因此,首先,我们必须把所有的文件放在一个地方,任何文件夹都可以。把它们放在这个文件夹中,使用下面的函数提取所有文件的名称列表。输入只是文件夹的路径。
作者编写的代码—可在https://gist.github.com/jasher4994下载
现在是有趣的部分,设置你的脚本来自动完成单调的部分。下面这个相对较短的函数就是你所需要的。
作者编写的代码—可以在 https://gist.github.com/jasher4994 的下载。灵感来源:https://stack overflow . com/questions/58774849/using-adobe-readers-export-as-text-function-in-python
这个函数非常简单。它接受一个路径(到存储所有文件的文件夹)和一个文件名作为输入。然后,它指定了一个用于紧急情况的 kill 键,然后概述了我在前面的列表中指定的同一组命令。第 3 行将文件名和文件夹路径连接起来,给出我们要找的文件的完整路径。我们可以从一开始就一起指定它们,但是当我们遍历同一个文件夹中的所有文件时,这将更有意义——路径是相同的,但是文件扩展名将会改变。第 4 行则相反,说明我们将保存新创建的. txt .文件的路径。第 5 行通过声明我们允许覆盖文件来舍入第一个块——如果我们想要覆盖,稍后需要额外的点击。
因此,第 7–18 行无非是说明要按哪些键,以及两次按键之间要等待多长时间。这些行应该是不言自明的。输入是要按下的按钮和时间的整数输入。sleep()是在执行下一个命令之前要等待的时间。
如果你的文件很小,你可以在不到 5 秒的时间内完成,但是我有几个很长的 pdf 文件需要 3-4 秒。你不想催促计算机,否则它会在完成保存之前就开始按下当前文件的下一个文件的键。这可不好。如果你打算让它通宵运行,你最好保守估计。用一些最大的文件进行测试是一个好主意。
将这一切结合在一起
因此,要将所有这些放在一起并自动化这个过程,您只需要指定文件夹、导入包并遍历文件。
作者编写的代码—可以在https://gist.github.com/jasher4994下载
那很容易,不是吗?现在你所有的 pdf 文件都应该附有。txt 文件放在它们下面的同一文件夹中。
您可以通过将您拥有的文档数量乘以一次迭代的总时间来粗略估计它将运行多长时间。您可以在一次迭代中测试它,或者只计算睡眠时间,每按一次键增加一秒钟。
按照这种逻辑,1000 份文件需要的时间和睡一个好觉的时间差不多。
所以,买一个吧。
If I’ve inspired you to join medium I would be really grateful if you did it through this [link](https://jamesasher4994.medium.com/membership) — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout [365 data science](https://365datascience.pxf.io/c/3458822/791349/11148) through my [affiliate link.](https://365datascience.pxf.io/c/3458822/791349/11148)
如果你喜欢这篇文章,下面是我写的一些类似的文章:
干杯,
詹姆斯
如何在 Mac 和 Windows 上轻松自动化您的 Python 脚本
使用 crontab 和任务调度器来自动化您的脚本并节省时间
运行 Python 脚本可能就像打开 IDE 或文本编辑器并单击运行按钮一样简单;但是,如果脚本必须每天或每周执行,您就不希望浪费时间一遍又一遍地重复这些步骤。
相反,您可以通过计划在特定时间运行 Python 脚本的作业来自动化这些脚本。在本文中,我将向您展示如何在 Mac 和 Windows 上使用 crontab 和任务调度器来完成这项工作。
在 macOS 上调度作业
我们将要自动化的 Python 脚本叫做example.py
。你可以使用任何你必须遵循的脚本。
步骤 1:用 PyInstaller 使 Python 文件可执行
要在 macOS 上调度一个作业,我们首先需要使我们的 Python 文件可执行(。exe)。将.py
文件转换成可执行文件有不同的方法。在这种情况下,我将使用“PyInstaller”库,因为它很简单。
PyInstaller 读取 Python 脚本并找到脚本需要执行的库。然后,它创建所有文件的副本,并将它们放在一个可执行文件中。
要安装 PyInstaller 并使您的 python 脚本可执行,请执行以下操作。
- 打开终端,运行
pip install pyinstaller
。这将安装 PyInstaller - 在终端内部,转到您的脚本所在的目录(使用
cd
在目录中导航) - 一旦进入脚本所在的路径,在终端中编写下面的
pyinstaller --onefile example.py
,使脚本可执行。
在此之后,您将看到一条消息,上面写着“成功完成”然后在您的脚本所在的目录中,应该已经创建了一个名为“dist”的文件夹。在这个文件夹中,你会找到独立的可执行文件!右键点击,点击“打开方式”,然后“终端”,测试是否一切正常。
注意:如果您在运行独立的可执行文件后看到一个错误,如“ModuleFoundNotError:Not module named ’ name _ of _ module '”,您必须再次重复第 1 步,但是现在编写下面的
pyinstaller --onefile example.py --hidden-import name_of_module
步骤 2:使用 crontab 调度作业
为了在 macOS 上调度作业,我们将使用 crontab。为此,打开终端并运行crontab -e
。在这之后,你的终端应该看起来像下面的图片。
作者图片
您可以在这里创建新的工作。他们每个人都有自己的台词。要创建作业,请使用下面框中的格式。
* * * * * command_to_execute* - minute (0-59)
* - hour (0-23)
* - day of the month (1-31)
* - month (1-12)
* - day of the week (0-6, Sunday to Saturday)
学习如何创建新的 cron 作业很简单,但是要小心,cron 作业失败可能是灾难性的。我建议您使用 crontab.guru 来生成正确格式的 cron 表达式。
现在是时候创建一个 cron 作业了。
- 点击
i
激活INSERT
模式 - 现在可以写作业了。在这个例子中,我写了
0 15 * * 5 path_of_executable
这意味着"在每个星期五的 15:00 运行 Python 脚本*"*(你可以在 crontab.guru 上查看)
作者图片
- 打出后,按
esc
。然后键入:
并写wq
保存并退出(w
-写,q
-退出),最后按回车键。
此后,可能会出现以下窗口
作者图片
只需点击“确定”即可授予访问权限。在此之后,应该已经创建了 crontab。
要验证 crontab 是否已创建,请编写crontab -e or crontab -l
。如果您想删除列出的所有 crontabs,请编写crontab -r.
就是这样!现在,您的 Python 脚本将在预定的时间运行!
注意:如果你有权限问题,你需要给完全磁盘访问权限,所以去系统偏好设置,安全和隐私,隐私,和完全磁盘访问权限。
在 Windows 上调度作业
由于有了任务调度器,在 Windows 上安排作业比在 Mac 上更容易。只需遵循以下步骤。我们将要自动化的 Python 脚本叫做example.py
步骤 1:用批处理文件使 Python 文件可执行
批处理文件有不同的用途,但是在这种情况下,我们将把它作为一个可执行文件来自动化我们的 Python 脚本。
我们将把 Python 脚本存储在 bat 文件中,然后单击 bat 文件来执行命令并运行 Python 脚本。为此,请按照下列步骤操作。
- 右键单击任何文件夹,然后单击“新建”并创建一个记事本(“文本文档”)
- 在记事本中,使用以下格式编写文本。
**<Paste your python.exe location> <Paste your python script location>**
要获得“python.exe”路径(python 应用程序路径),您需要转到保存 Python 的位置(检查您安装它的位置)。您的记事本可能看起来像下面的文本。
"C:\User\Anaconda\python.exe" "C:\Scripts\example.py"
- 现在点击“文件”,然后点击“另存为”,最后写下包括扩展名
.bat
在内的任何名称。对于这个例子,我将创建一个名为example.bat
的文件
步骤 2:在 Windows 任务计划程序中创建任务
让我们用 Windows 任务调度器来调度example.bat
文件。只要按照这些步骤。
- 按 Windows 按钮并搜索 Windows 任务计划程序。然后点击它。
作者图片
- 现在你应该会看到一个类似上图的窗口。单击右侧面板上的“创建基本任务”。
应该会弹出这样的窗口。
作者图片
现在你只需要填写所有需要的信息,然后点击下一步。这些是您在上面看到的选项:
- **创建一个基本任务:**写下你的任务名称和描述。
- **触发时间:**选择您希望任务开始的时间。您可以选择每日、每周、每月等等。然后你必须选择上一次选择的时间 ( 每 x 天、周、月重复一次)
- **操作:**有 3 种操作可用,但其中两种已过时,因此只需选择“启动程序”并单击“下一步”。然后,浏览我们之前创建的 bat 文件。
- 点击完成按钮创建任务。
在此之后,一个新的任务应该被列在任务调度器上。
就是这样!现在,您已经准备好在您的计算机上自动化任何 Python 脚本了。
与 3k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)
如何在 Python 中轻松聚集文本数据
通过这种方法,您再也不必手动对调查答案进行聚类
Pawel Czerwinski 在 Unsplash 上的照片
文本数据是出了名的烦人,我真的不喜欢和它一起工作。
尤其是调查数据——让人们想打什么就打什么是谁的好主意?
在大多数研究公司中,一些穷人将不得不手动整理这些回答,并将它们“分类”到相似的答案组中。这样做有很多问题,比如大量的时间消耗,以及如何选择应该创建的集群数量。
集群太少,它们就不具体,太多,它们就过于具体。
我将要向您展示的这个方法解决了这两个问题。在让您访问该函数之前,我将首先解释我使用的方法,以便您将来可以使用它。
如果你知道 TF-IDF 和 K-means,那就直接跳到底部的功能。
向量表示和 TF-IDF
关于文本的向量表示和 TF-IDF 有上百万篇文章,所以我不会在这里浪费你太多时间。简而言之,我们将在这里使用的方法,TF-IDF(术语频率-逆文档频率)是一种统计方法,它表示一个单词(或词组)对一个文档或文本语料库的重要性。TF-IDF 值与该单词在文档中出现的次数成比例增加,并与包含该单词(或单词组)的文档数量成比例。更全面的解释,包括方程式,可以在维基页面看到。
我在这里使用的例子是一项调查的答案。我们正试图将调查答案归入同质组。因此,TF-IDF 分数将查看该答案中出现的单词与这些单词在所有其他答案中出现的频率的关系。
最好的开始方式是对 pandas 数据框架中的列使用 unique()方法,如下所示——S3 是我的列名。输入是字符串类型对象的列表。完整的文档可以在这里看到。
text = df.S3.unique()
其输出将是一个稀疏的 Numpy 矩阵。如果您使用 toarray()方法来查看它,它很可能是这样的:
稀疏矩阵的输出—由作者创建
从这里我们可以使用 K-means 来聚类我们的文本。
k-均值和肘方法
K-means 是最常见的聚类算法之一。但是,它不经常用于文本数据。多亏了 TF-IDF,我们的文本数据以一种可行的方式呈现出来。
大多数人以前都遇到过 K-means,但如果没有,这里有一个简短的介绍。
K-means 算法的主要目标是通过创建相似方差的聚类来最小化聚类内的平方和(或惯性)。首先,必须指定簇的数量,然后随机分配相同数量的“质心”。然后测量每个数据点和质心之间的欧几里德距离。然后,数据点被“分配”给最近的质心。然后,我们将新生成的聚类的平均值作为新的质心,并重复前面的步骤。然后重复这个过程,直到达到收敛或最大迭代次数。更深入的解释可以在这里看到。
这个过程的一个可视化例子,你可以看到质心和集群一起移动。【https://en.wikipedia.org/wiki/K-means_clustering
因此,算法相对来说是比较简单的。但是我们如何选择集群的数量呢?一个常见的,虽然不完美,但实用的启发式方法是肘法。该方法绘制相对于聚类数量的方差,并选择最像肘形的点。也可以通过绘制平方差的和来完成。
https://commons . wikimedia . org/wiki/File:Elbow _ Method _ for _ chopping _ Number _ of _ k . png
将这一切结合在一起
因此,我们能否将所有这些整合到一个功能中?当然,在下面。我会带你走一遍。
如果您在字符串列表上运行这个函数,在本例中,我使用调查答案,它将首先通过 TF-IDF 矢量器运行文本,然后运行 K-means。然后,它会为您绘制距离的平方和,然后显示要求您选择多少个集群。
由作者创建。应该在 Jupyter 运行以获得最佳效果。
然后,您只需输入您想要的集群数量,它就会为您创建群组。一旦你这样做了,它将输出所有的答案和他们被分配到哪个组。这是我的输出的一个例子,它清楚地表明工会是一个重要的集群。我的数据中没有明确的拐点,但我选择了七个聚类。每个组都有一个明确的主题,如工会或新冠肺炎,最后一个组作为不属于指定组的答案的总称。
由作者创建。
因此,接下来你所要做的就是得到一个字符串列表,就像我在开始时展示给你的那样,然后运行这个函数,你就有了聚集文本!
希望这有所帮助,它会节省你很多时间。
如果我鼓励你加入 medium,如果你通过这个链接加入,我会非常感激——这将有助于支持我在未来写出更好的内容。
如果你喜欢这篇文章,请看看我下面的其他文章。
干杯,
詹姆斯
如何轻松将 Python 脚本转换成可执行文件(。exe)
创建 Python 可执行文件的两种简单方法。
作者图片
虽然使用终端或您最喜欢的文本编辑器运行 Python 脚本很简单,但是在某些情况下,您更喜欢隐藏脚本中编写的所有代码(。py)放在可执行文件(.exe)。
也许您需要将脚本发送给一个根本不会编码的人,或者您可能需要安排一个在特定时间在您的计算机上运行.exe
的作业。无论情况如何,在本指南中,我将向您展示两种创建可执行文件的方法。第一个(auto-py-to-exe)有一个友好的界面,可以帮助初学者轻松地创建可执行文件,而第二个(PyInstaller)提供了一种通过终端创建可执行文件的简单方法。
**Table of Contents** 1\. [Making an Executable file with auto-py-to-exe](#b2c6)
- [Installing with pip](#c689)
- [Running auto-py-to-exe](#eeef)
- [Step 1: Add the script location](#0063)
- [Step 2: Choosing “One Directory” or “One File”](#7b48)
- [Step 3\. Choosing “Console Based” or “Window Based”](#d2bc)
- [Step 4: Advanced option(e.g. output directory, additional import)](#7cd6)
- [Step 5: Convert the file](#ed33)
2\. [Making an Executable file with PyInstaller](#f30d)
用 auto-py-to-exe 制作可执行文件
第一个选项提供了一个漂亮的 GUI(图形用户界面),它负责将 Python 脚本转换成可执行文件的所有必要工作。
对了,你也可以看看我的 YouTube 视频,学习一下如何把一个. py 转换成。如果你更喜欢看下面的步骤而不是阅读它们。
使用 pip 安装
要安装 auto-py-to-exe 的最新版本,只需打开终端并运行以下命令。
pip install auto-py-to-exe
注意:确保你安装 *auto-py-to-exe*
的工作环境包含了你的脚本需要运行的所有库。
运行自动复制到可执行文件
一旦安装了 auto-py-to-exe,创建一个可执行文件就像编写下面的命令一样简单。
auto-py-to-exe
运行该命令后,将打开以下 GUI 应用程序。
作者图片
我将带您浏览每个选项,以正确创建一个可执行文件。
创建可执行文件的步骤
步骤 1:添加脚本位置
浏览您希望转换的脚本,并将其添加到“脚本位置”字段。在本例中,我将选择一个自动化 Excel 报告的脚本(您可以在下面的链接中找到我的自动化 Excel 指南)
你可以随意选择任何你想要的剧本。然而,如果你的脚本需要读取一个路径,确保你使用绝对路径,因为相对路径不会像你期望的那样处理可执行文件。如有必要,在下面包含以下代码行,以了解可执行文件的位置,并对脚本进行必要的更改,以便在正确的目录下读取/导出文件。
application_path = os.path.dirname(sys.executable)
第二步:选择“一个目录”或“一个文件”
现在我们必须选择是创建“一个目录”还是“一个文件”第一个创建一个目录,其中包含脚本运行所需的所有依赖项(包括可执行文件),而第二个只创建一个可执行文件。
对于这个例子,我将选择“一个文件”选项。
第三步。选择“基于控制台”或“基于窗口”
现在是时候选择是否显示控制台了。如果您选择“基于控制台”,控制台将在运行可执行文件后打开,如果您的脚本生成基于控制台的输出,建议您这样做。但是,如果您不想在运行可执行文件时显示控制台输出,请选择“基于窗口”
我的脚本需要引入 Excel 电子表格的名称作为输入,以便创建我的 Excel 报表,因此我将选择“基于控制台”
步骤 4:高级选项(例如,输出目录、附加导入)
您可以添加图标,添加您的脚本需要运行的文件,等等!然而,对于这个例子,我将只修改可执行文件的导出路径。为此,点击“设置”选项并浏览您希望的输出目录。
作者图片
注意:如果您在双击创建的可执行文件后看到类似“ModuleFoundNotError:Not module named ’ name _ of _ module '”的错误,您必须再次从步骤 1 开始重复,但是现在在“高级”选项的“隐藏-导入”字段中缺少模块名称。
步骤 5:转换文件
要转换。将文件复制到。只需点击下面的蓝色按钮。
作者图片
auto-py-to-exe
在 convert 按钮上方显示的真正重要的东西是pyinstaller
(本指南中的主库和第二个选项)制作的代码。exe 文件)需要创建一个可执行文件背后的花式贵由看到在屏幕上。
一旦该过程完成,可执行文件应该位于您在步骤 4 中设置的输出目录中!
用 PyInstaller 制作可执行文件
这个选项更适合那些喜欢在终端上快速创建运行命令的可执行文件的人。
如果您习惯于使用终端,那么 PyInstaller 库将是最佳选择。要安装 PyInstaller,请按照下列步骤操作。
- **第一步:**打开一个终端,运行
pip install pyinstaller
- 步骤 2: 使用终端,转到您的脚本所在的目录(使用
cd
命令) - 步骤 3: 一旦进入正确的目录,在终端中使用下面的语法
pyinstaller --onefile name_of_script.py
编写一个命令,使脚本可执行。
步骤 3 中使用的命令类似于步骤 5 图片中显示的auto-py-to-exe
选项的代码。您可以稍微使用一下由auto-py-to-exe
提供的 GUI,以习惯您可以添加到该命令中的许多选项。
运行该命令后,您应该会看到一条消息,显示“成功完成”在脚本所在的目录中,应该已经创建了一个名为“dist”的文件夹。在这个文件夹中,你会找到独立的可执行文件!
祝贺你!现在,您的 Python 脚本已经被转换为可执行文件。如果您想安排该文件在您的计算机上运行的时间,请查看本指南。
使用 Python 自动化您的生活! 加入我的 20k+人电子邮件列表,获取我的免费自动化备忘单。
如何在 Python 中轻松创建表格
如何在 Python 中使用制表函数创建格式良好的表格
照片由 Unsplash 上的 Fotis Fotopoulos 拍摄
能够快速地将我们的数据组织成可读性更强的格式,例如在数据争论时,对于分析数据和计划后续步骤非常有帮助。Python 能够轻松地将某些表格数据类型转换成格式良好的纯文本表格,这是通过 制表 函数实现的。
安装制表
我们首先在命令行中使用 pip install 安装制表库:
pip install tabulate
导入制表功能
然后我们在代码中从制表库中导入 制表 函数:
from tabulate import tabulate
现在我们准备使用 制表 功能!
制表支持的表格数据类型
制表 函数可以将以下任何内容转换成易于阅读的纯文本表格:(来自制表 文档 )
- 列表的列表或另一个可迭代的列表
- 列表或另一个字典条目(作为列的关键字)
- 可重复项的字典(作为列的键)
- 二维数组
- NumPy 记录数组(名称为列)
- 熊猫。数据帧
列表列表
例如,如果我们有以下列表列表:
*table = [['First Name', 'Last Name', 'Age'],
['John', 'Smith', 39],
['Mary', 'Jane', 25],
['Jennifer', 'Doe', 28]]*
我们可以使用 制表 功能将它变成可读性更好的纯文本表格:
*print(tabulate(table))*
由于列表列表中的第一个列表包含列名作为其元素,我们可以通过将‘first row’作为 headers 参数的参数来将其设置为列名或标题名:
*print(tabulate(table, headers='firstrow'))*
制表 函数还包含一个 tablefmt 参数,该参数允许我们使用伪图形来改善表格的外观:
*print(tabulate(table, headers='firstrow', tablefmt='grid'))*
对于 tablefmt ,我更喜欢用【fancy _ grid】的说法:
*print(tabulate(table, headers='firstrow', tablefmt='fancy_grid'))*
*** *
文学词典
我们可以使用字典创建上面的相同表格:
*info = {'First Name': ['John', 'Mary', 'Jennifer'],
'Last Name': ['Smith', 'Jane', 'Doe'],
'Age': [39, 25, 28]}*
在字典的情况下, 键 将是 列标题 ,而值将是那些列的**元素。我们通过将‘keys’作为 headers 参数的自变量进行传递,来指定这些键将成为标题:**
*print(tabulate(info, headers='keys'))*
当然我们可以使用 tablefmt 参数来改善表格的外观:
*print(tabulate(info, headers='keys', tablefmt='fancy_grid'))*
添加索引
我们还可以使用 showindex 参数将索引添加到我们的表中:
我们可以通过向参数 showindex 传递一个 iterable 来添加一个自定义索引。例如,如果我们希望索引从 1 开始,我们可以传入一个范围对象作为参数:
*** *
缺少值
如果我们从上面的 info 字典中删除‘Jennifer’,我们的表将包含一个空字段:
*print(tabulate({'First Name': ['John', 'Mary'],
'Last Name': ['Smith', 'Jane', 'Doe'],
'Age': [39, 25, 28]},
headers='keys',
tablefmt='fancy_grid'))*
如果我们的表中有任何缺失值,我们可以使用 missingval 参数选择用什么来填充它们。 的缺省值 是一个空字符串。如果我们将其更改为‘N/A’,我们的表格将会是这样的:
*print(tabulate({'First Name': ['John', 'Mary'],
'Last Name': ['Smith', 'Jane', 'Doe'],
'Age': [39, 25, 28]},
headers='keys',
tablefmt='fancy_grid',
missingval='N/A'))*
将表格保存在文本文件中
我们可以使用上下文管理器将上述表格保存为文本文件:
*# save the table created above in a variable
table = tabulate({'First Name': ['John', 'Mary'],
'Last Name': ['Smith', 'Jane', 'Doe'],
'Age': [39, 25, 28]},
headers='keys',
tablefmt='fancy_grid',
missingval='N/A')
# use context manager to create table.txt file and write table to it
with open('table.txt', 'w') as f:
f.write(table)*
现在我们应该有一个名为table . txt**的文本文件包含了上面的表格。**
如果你喜欢阅读这样的故事,并且想支持我成为一名作家,可以考虑注册成为一名媒体会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的 链接 报名,我就赚点小提成。
**https://lmatalka90.medium.com/membership **
我希望这篇关于如何使用制表函数轻松创建格式良好的表格的教程对你有所帮助。感谢您的阅读!
如何轻松绘制神经网络架构图
使用无代码 diagrams.net 工具通过图表可视化展示您的深度学习模型
作者图片
当我们处理越来越复杂的神经网络时,架构可能会变得难以理解和消化。
当我们想要向技术和非技术受众解释这些架构时,通常的模型摘要打印输出不会使其更容易理解。
摘要打印输出不是呈现神经网络结构的最佳方式|作者图片
在呈现和描述神经网络的架构时,图表可视化比更有效,而不是用文字解释模型。
我们可能已经为今年剩下的时间编写了足够多的代码,所以让我们来看看一个简单的用于绘制定制架构图的无代码工具—diagrams.net(以前称为 draw.io)。
内容
(1)关于 diagrams.net(2)画你的第一张图
(3)保存你的图
Adeolu Eletu 在 Unsplash 上拍摄的照片
①关于 diagrams.net
diagrams.net(原名**draw . io)是一款免费拖放的在线图表工具,允许用户创建流程图,生成网络和实体关系(ER)图,甚至设计数据库模式。******
diagrams.net 的几个关键优势包括其易用性以及与 GitHub、OneDrive 和 Google Drive 等常见平台的无缝集成。
(2)画出你的第一张图
(I)导航至网络应用程序
让我们先来看看 diagrams.net 在线编辑工具https://app.diagrams.net/。
当您到达主页时,会出现一个弹出窗口,要求您选择保存图的目标位置。如果你想先做些实验,你可以选择“稍后决定”。
以下是图表编辑器在登录页面上的外观:
diagram.net 编辑器的主页面|图片在 Apache 2.0 许可下使用
㈡从模板开始
虽然你在主页上看到的第一件事是一个空画布,但这并不意味着你必须从头开始构建你的图表。
diagrams.net 提供了现成的模板供您开始工作,这可以通过点击顶部菜单栏中的文件>新建… 来探索。**
根据您的不同目标,有许多模板可供选择。
可用模板列表|在 Apache 2.0 许可下使用的图像
(三)形状选择
diagrams.net 是建立在拖放的概念上的,所以使用起来非常直观。有大量的形状(来自不同的类别)可供选择,它们可以在图编辑器的左侧栏中找到。
左侧栏中可用的形状列表|在 Apache 2.0 许可下使用的图像
侧边栏带有一个搜索栏,用于查找您想到的特定形状(如等轴测立方体)和一个便笺,您可以在其中拖放形状以将其保存为收藏夹。
除了侧边栏中显示的形状之外,还有很多其他形状,你可以点击“ +更多形状… 【T21””按钮来浏览整个收藏。
****https://kennethleungty.medium.com/membership ****
㈣定制
一旦你把所有你想要的形状放到画布上,下一步就是定制设计编辑和安排。
右侧边栏提供了多个选项,可以对整个布局或特定形状进行细微的更改。可用选项因您用鼠标选择的对象而异。
如果您想手动编辑字体颜色和字体样式等方面的具体值,您可以点击“编辑样式按钮。
********
整个画布布局(左)和特定形状(右)的侧边栏定制菜单|在 Apache 2.0 许可下使用的图像
(3)保存您的图表
最后一步是以首选格式保存您的图表杰作。
根据 Apache 2.0 许可保存图表|图像的选项
你可以把它保存在你的本地设备或者流行的云存储平台上,比如 Google Drive 和 Dropbox。
(4)示例
使用这个在线工具,我能够轻松地为 YOLO v1 和 VGG16 生成架构图:
YOLO v1 建筑
YOLO v1 建筑|作者图片
VGG16 架构
VGG16 架构|作者图片
这些美丽的视觉化图像无疑让我们所有人更容易欣赏和理解这些神经网络架构。
如果你想使用我创建的模板,请前往GitHub repo访问。drawio 文件,可以直接使用。**
在你走之前
**欢迎您加入**和我一起踏上数据科学学习之旅!关注此媒体页面或查看我的 GitHub 以了解更多精彩的数据科学内容。同时,享受绘制架构图的乐趣!
**** ****
如何用 Python 轻松制作漂亮的文字云
使用 stylecloud 和 wordcloud 库来定制你的 wordcloud。
作者图片
词云让我们很容易识别文本中的关键词,其中单词的大小代表它们的频率。有了这个,我们甚至在阅读之前就能很好地理解一篇文章的内容。虽然有很多免费的工具可以在线制作 word cloud,但是我们可以使用我们的 Python 技能来定制更多的 word cloud。
在本文中,我们将使用stylecloud
库用几行代码制作漂亮的单词云,使用wordcloud
库添加我们自己的图片作为单词云的遮罩,使用stop_words
定制默认提供的停用词列表。
用 Stylecloud 制作漂亮的单词云
我们将要使用的文字是史蒂夫·乔布斯在斯坦福演讲的一部分。你可以找到。txt 文件,或者使用任何文本来制作你自己的 wordcloud。
要轻松做出漂亮的字云,我们首先要做的就是安装stylecloud
。你可以通过 pip pip3 install stylecloud.
安装它
一旦安装了stylecloud
,就要导入。
import stylecloud
现在要创建一个基本的 wordcloud,我们需要使用.gen_stylecloud()
方法并添加。txt 文件和图标,我们将使用这个词云的形式。在这个网站上,你可以找到可以和 stylecloud 一起使用的图标列表。只需搜索你想要的图标,复制图标的 HTML 代码(在这个例子中,我选择了一个苹果作为图标)
stylecloud.gen_stylecloud(file_path='SJ-Speech.txt',
icon_name= "fas fa-apple-alt")
结果是下面的 wordcloud(该文件在 Python 脚本所在的同一路径中创建)
作者图片
但是我们可以做得更多!我们可以进一步定制 wordcloud,以获得更好看的 wordcloud。
我们可以控制背景颜色、单词的颜色、输出文件的名称,还可以省略 wordcloud 中两个单词的搭配。为此,我们将使用下面的代码。
stylecloud.gen_stylecloud(file_path='SJ-Speech.txt',
icon_name='fas fa-apple-alt',
colors='white',
background_color='black',
output_name='apple.png',
collocations=False)
我们甚至可以编写颜色的 HTML 代码,而不是使用像“白色”这样的标准颜色在这个网站上,你可以选择任何你想要的颜色,并获得它的 HTML 代码,你可以将它包含在 stylecloud 的colors
参数中。
作者图片
添加或删除停用词
默认情况下,Stylecloud 有一个英文的停用词列表,但是如果您想要删除或添加新的停用词,您必须在custom_stopwords
参数中包含一个新的列表。
为了定制停用词列表,我们必须使用stop_words
库。要做到这一点,首先,安装它(pip install stop_words
),然后我们使用get_stop_words
获得一个特定语言的停用词列表。
from stop_words import get_stop_wordsstop_words = get_stop_words('english')
一旦定义了列表,就可以分别用.append
和.remove
方法添加或删除元素。
stop_words.append('my_new_stop_word')
stop_words.remove('my_new_stop_word')
现在,我们只需添加新的stop_words
列表。我还将使用调色板而不是颜色来给 wordcloud 一个不同的外观。
stylecloud.gen_stylecloud(file_path='SJ-Speech.txt',
icon_name='fas fa-apple-alt',
palette='cartocolors.qualitative.Pastel_3',
background_color='black',
output_name='apple.png',
collocations=False,
custom_stopwords=stop_words)
在这个网站上,您可以找到一个 Python 调色板列表,您可以在 stylecloud 库中使用它(正如您在上面的代码中看到的,用点分隔的名称代表了palettes
模块的内容)
作者图片
添加您自己的图像
有数百个免费图标可以和stylecloud
一起使用,但有时我们可能想使用我们自己的图像来给我们想要创建的 wordcloud 赋予形式。如果是这样的话,我们必须使用wordcloud
库来制作一个单词云,PIL
来上传图片,matplotlib
来绘制单词云,numpy
来使用上传的图片作为我们的单词云的遮罩。
首先,我们安装前面提到的所有 4 个库。一旦我们有了所有的模板,我们就导入它们,并开始用想要的模板创建一个 wordcloud。
from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np# create a mask based on the image we wish to include
my_mask = np.array(Image.open('batman-logo.png'))# create a wordcloud
wc = WordCloud(background_color='white',
mask=my_mask,
collocations=False,
width=600,
height=300,
contour_width=3,
contour_color='black',
stopwords=stop_words)
如您所见,所使用的代码类似于 stylecloud,只是有一些变化。我们使用mask
来指定我们想要用于 wordcloud 的图像(在本例中,我使用的是蝙蝠侠标志)。此外,我们包括轮廓宽度和颜色,使图像的形状更加明显。
注意:确保你要用作蒙版的图片具有清晰的轮廓,否则文字云会不好看。
现在我们必须读取文本文件,并用下面的代码生成 wordcloud。
with open('SJ-Speech.txt', 'r') as txt_file:
texto = txt_file.read()wc.generate(texto)
如果我们想使用原始图像的颜色,我们编写下面的代码(如果不是这样,wordcloud 将有随机的颜色,就像本文中显示的第一个苹果图像一样)
image_colors = ImageColorGenerator(my_mask)
wc.recolor(color_func=image_colors)
最后,我们使用 matplotlib 来绘制 wordcloud。
plt.figure(figsize=(20, 10))
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
wc.to_file('wordcloud.png')
plt.show()
我还删除了轴,只保留了图中的单词云,并用wc.to_file()
保存单词云
作者图片
就是这样!现在你已经准备好用 Python 制作你自己的 wordcloud 了!我在下面的文章中用辛普森一家的角色创建了一些单词云。
下面是我看的学习 Python 的书单。
https://betterprogramming.pub/4-python-books-i-read-as-a-self-taught-programmer-5a5453840cdb
与 3k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)
感谢阅读这篇文章!在下面的文章中,你可以找到我用 Python 制作的其他漂亮的可视化指南。
</8-free-tools-to-make-interactive-data-visualizations-in-2021-no-coding-required-2b2c6c564b5b>
如何轻松将多台 Jupyter 笔记本合并为一台
招数
黑进你的 Jupyter
Paul Hanaoka 在 Unsplash 上拍摄的照片
Juypyter 笔记本是数据科学家非常必要的工具。它们为交互式计算提供了多种实用的选择,因为它们将代码、文本和可视化结合在一个文档中。
出于组织目的,通常会选择在一个项目中使用多个独立的笔记本。问题是,当经理或客户要求快速演示时,您需要快速合并不同的笔记本,重组单元格可能是一个冗长乏味的复制-粘贴序列。
由于 Jupyter 的界面并不容易,我们认为是时候创建我们自己的解决方案了。在本文中,我们将向您展示如何以省时的方式重组和连接两个笔记本。您将学习到的内容将允许您使用 python 代码来重组、过滤和更改笔记本的单元格。
**Table Of Contents:**
· [Getting to know Notebooks’s structure](#06b6)
· [Concatenating Notebooks](#e504)
· [Going further with nbformat](#2394)
了解笔记本电脑的结构
不知道大家有没有尝试过打开 Jupyter 笔记本文件(那个有**)。ipynb** 作为扩展)带有文本编辑器。如果您看到了,那么您要么看到了奇怪的乱码,要么认出了 JSON 格式。
如果您不知道 JSON 格式是什么,它代表 JavaScript 对象表示法,是一种以人类可读的方式存储对象/数据的方法。相当整洁简单(你可以在这里了解更多关于这个)。
就像我说过的,IPYNB 文件是以 JSON 纯文本格式存储的,如果你打开一个文件,它会是这样的:
如您所见,这是一本结构良好的字典,包含:
metadata
:基本上是一个字典,包含关于内核和所用语言的信息(以及更多)。nbformat
和nbformat_minor
:这些只是笔记本格式版本(这里是 4.0)- 这是我们最有可能感兴趣的,它包含了笔记本单元格的列表。
每个单元格由一个包含不同键值对的类似字典表示:
您可以在该屏幕截图中看到每个字段的位置:
作者截图
现在,您已经了解了足够多的知识,可以开始玩笔记本的电池了。但是,如果你想了解更多细节,你可以在这个链接查看文档。
连接笔记本
所以我们选择的实际例子是将两个笔记本合并在一起。这是一个相当简单的例子,但是你将看到如何读、写和调整笔记本,并且根据你的使用情况,你可以根据你的需要修改代码。
如果你愿意,你可以在这个链接下载示例笔记本来尝试代码。
所以让我们从实现一个读取 IPYNB 文件的函数开始。我们将使用 python 标准库中包含的 json
模块:
现在读取文件只需要两行代码:
first_notebook = read_ipynb('first_notebook.ipynb')
second_notebook = read_ipynb('second_notebook.ipynb')
虽然在这个例子中我们可能不一定需要复制笔记本,但是如果您想摆弄笔记本,它可能会派上用场。这里,我们将再次使用标准库的 copy
模块:
import copy
final_notebook = copy.deepcopy(first_notebook)
这就是我们实际合并细胞的部分:
final_notebook['cells'] = first_notebook['cells'] + second_notebook['cells']
最后,让我们编写一个助手函数,将笔记本导出为 Jupyter 笔记本格式,并使用它导出我们的 final_notebook:
使用 nbformat 更进一步
Jupyter 开发团队给了我们包 nbformat
来进行类似的操作,比如读取ipynb
文件或者用 nbformat.v4.new_code_cell
创建新的代码单元。
举个例子,让我们复制用nbformat
连接两个笔记本的等价代码:
如果你想要一个由nbformat
提供的更详尽的函数列表,你可以在下面的链接中查看它们的文档。
最后的想法
深入了解 Jupyter 笔记本的结构,可以获得创建细胞操作解决方案所需的知识。本文详细介绍了两种解决方案,它们为您提供了一种将两个笔记本合并成一个笔记本的繁琐的复制粘贴工作的变通方法。您将在这个 Github 资源库中找到本文使用的所有代码。
根据您的用例,您可以进一步创建脚本,以自动、省时的方式进行您需要的其他修改。
我们希望这篇文章对你有用。感谢您坚持到现在,注意安全,我们将在下一篇文章中再见😊!
更多文章阅读
https://python.plainenglish.io/what-the-newly-released-jupyterlab-3-has-to-offer-a9a144d93046 </8-tips-to-write-cleaner-code-376f7232652c>
如何使用 AWS Data Wrangler 在 S3 上轻松执行 Pandas 操作
与 S3 交互,就像它是您的本地文件系统一样
我一直觉得通过编程与 S3 交互来执行简单的任务有点复杂和不直观,比如文件读取或写入、批量下载或上传,甚至大规模文件删除(使用通配符等)。
我的典型用例是处理我从 S3 下载(或保存到那里)的熊猫数据帧,数据格式有三种:CSV、JSON 和 Parquet,用于分析和处理。
在寻找 boto3 (不要误会,这是一个很好的与 AWS 进行编程接口的包)的替代品时,我遇到了 AWS Data Wrangler ,这是一个 python 库,它通过将数据帧连接到 AWS 数据相关的服务,如 Athena、Glue、Redshift、DynamoDB、EMR……以及最重要的(至少对我来说)S3,将 Pandas 的功能扩展到 AWS。
在本帖中,我将回顾 AWS Data Wrangler 轻松连接熊猫和 S3 的功能。
作者图片
什么是 S3?
用户修改的图像
如果你不是 AWS 用户,S3 代表亚马逊简单存储服务。这是一套网络服务,你可以用它在任何时间,从网络上的任何地方存储任何数量的数据。
它为任何开发人员提供了对高度可伸缩、可靠、快速和廉价的数据存储的访问。
→要全面了解 S3,请查看官方文档。
→ 为了能够使用 S3 并复制以下代码片段,您需要设置一个 AWS 帐户。
创建 IAM 用户
用户修改的图像
在使用 AWS Data Wrangler 之前,您必须创建一个 IAM 用户。
IAM 代表身份和访问管理:这是一种让你能够安全管理 AWS 服务和资源访问的服务。IAM 允许您创建用户和组,并使用权限来允许或拒绝对 AWS 资源的访问。
一旦创建了 IAM 用户,AWS 将为您提供两个凭证:**Access key ID**
和**Secret access key**
。您必须使用它们在您的机器上配置 AWS 概要文件。
然后,AWS Data Wrangler 将使用该配置文件代表您以编程方式访问 AWS 服务。
要创建 IAM 用户,请转到 AWS 控制台并搜索 IAM。在左上角的工具条上,点击Users
。
用户截图
这将列出您已经创建的用户。要添加新的,点击Add users
。
用户截图
为此用户输入一个名称,并分配给它**Programmatic access**
。
用户截图
然后,将其添加到一个组中,以定义其权限集。为简单起见,授予 it 管理员访问权限,但是您可能希望将其限制为一组有限的权限。
用户截图
跳过标记步骤并验证用户创建。
创建用户后,屏幕上会出现凭证:**Access key ID**
和**Secret access key**
。我们将使用它们来配置 AWS 概要文件。
用户截图
配置 AWS 配置文件
要配置 AWS 概要文件,您必须首先按照本指南安装 AWS CLI,然后输入以下命令
**aws configure --profile ahmed**
系统会提示您输入以前的凭据。只需这样做,并将区域名称和输出格式保留为默认值。
用户截图
现在,AWS 概要文件已经正确配置了。
为了让 AWS Data Wrangler 使用它,我们必须在实验开始时设置一个与 boto3 的默认会话:只需在脚本或笔记本的开头留下这些行。
后续命令将使用为此配置文件提供的权限。
使用 AWS Data Wrangler 与 s3 对象交互
首先,让我们安装 AWS 数据牧马人。
**pip install awswrangler**
在运行任何命令与 S3 交互之前,让我们看看我的 buckets 的当前结构。
用户截图
没什么特别的,只是一堆我用于个人项目的水桶。
AWS Data Wrangler 可以对这些桶执行基本操作:
- 检查物体是否存在:
**>>> wr.s3.does_object_exist("s3://ahmedbesbes.com/plot.html")
True**
- 递归列出桶内的对象:
**>>> wr.s3.list_objects("s3://ahmedbesbes.com")
['s3://ahmedbesbes.com/app.mp4',
's3://ahmedbesbes.com/plot.html',
's3://ahmedbesbes.com/pyldavis.html']**
- 列出存储桶内的目录
**>>> wr.s3.list_directories("s3://sozy")
['s3://sozy/assets/',
's3://sozy/images/',
's3://sozy/saved_images/']**
- 显示每个桶的区域名称
**>>> wr.s3.get_bucket_region("ahmedbesbes.com")
'eu-west-3'**
- 获取每个对象的信息
**>>> wr.s3.describe_objects("s3://ahmedbesbes.com/plot.html")**
这将输出一个描述文件的 JSON 对象。它包括内容类型、大小以及权限元数据等属性。
作者截图
describe_objects
方法也可以接受一个文件夹作为输入。在这种情况下,它将返回一个 JSON 对象列表,每个对象描述文件夹中的每个文件。
读取、写入和删除操作
现在有趣的部分来了,我们让熊猫在 S3 上做手术。
- 读取文件
让我们从在 bucket 中保存一个虚拟数据帧作为 CSV 文件开始。
这就像与本地文件系统交互一样简单。这里有一件很酷的事情:如果/csv/sub-folder/
还不存在,AWS Data Wrangler 会自动创建它。
- 一次读取多个 CSV 文件:
这个其实挺简单的。您所要做的就是传递一个远程路径列表。在幕后,AWS Data Wrangler 将沿着行轴(轴=0)连接四个数据帧。
- 使用前缀
假设您在一个文件夹中有 1000 个 CSV 文件,并且您想在一个数据帧中一次性读取它们。为此,您可以将文件夹的路径传递给read_csv
方法。AWS Data Wrangler 将在其中查找所有 CSV 文件。
**wr.s3.read_csv(f"s3://{bucket}/csv/")**
- 删除对象
您可以使用delete_objects
方法删除对象
该方法在 path 参数中接受 Unix shell 样式的通配符。
例如,假设您想要删除特定文件夹中的所有 1000 个 CSV 文件。
你应该这么做:
**wr.s3.delete_objects(f"s3://{bucket}/folder/*.csv")**
JSON 和 Parquet 文件也是如此
您也可以对 JSON 和 Parquet 文件执行同样的操作
只需替换为:
wr.s3.read_csv
带wr.s3.read_json
或wr.s3.read_parquet
wr.s3.to_csv
同wr.s3.to_json
或wr.s3.to_parquet
下载和上传对象
- 下载对象
AWS Data Wrangler 使从 S3 下载对象变得非常容易。这是我开始使用它的主要原因。
要下载远程对象,只需使用 download 方法。该方法将对象的远程路径作为第一个参数,将保存对象的本地路径作为第二个参数。
或者,您可以以二进制模式下载对象。
- 上传对象
上传对象遵循相同的逻辑。
感谢阅读!
这篇文章收集了我在使用 AWS Data Wrangler 进行 per 时所做的笔记。我希望你觉得它们有用。
在后面的文章中,我将回顾其他 AWS 服务,如 DynamoDB 和 EMR,以及如何使用 AWS Data Wrangler 与它们进行交互。
就目前而言,如果你想深入了解,这里有一些值得一读的资源。
- AWS S3:https://aws.amazon.com/s3/?nc1=h_ls
- AWS IAM:https://aws.amazon.com/iam/?nc2=type_a
- AWS 数据牧马人文档:https://aws-data-wrangler.readthedocs.io/
- **Github:**https://github.com/awslabs/aws-data-wranglerT21
下次见!
新到中?您可以每月订阅 5 美元,并解锁无限的文章— 单击此处。
如何在网站输入上轻松运行 Python 脚本
这是我建立的一个网站的演示,它将动态分析文本情感
蒂莫西·戴克斯在 Unsplash 拍摄的照片
所有数据科学家都知道计算机在分析文本方面有多好,但大多数其他人不知道。所以作为一个普通人,我想我会给他们他们不知道他们需要的东西——一个网站,在那里他们可以分析他们自己的电子书。
你可以在这里阅读网站的用处。但是这篇文章更多的是针对你们这些技术人员,集中在如何在用户输入上运行 python 脚本并产生输出——而不是将输入保存在任何地方。
这是非常有用的,因为它是完全自动化的,只要服务器不崩溃(他们可能会——我不知道),那么它应该会自己运行。没有任何维护。
背景
所以游戏的目的是制作一个网站,它接受用户输入,在上面运行 python 脚本,然后以一种可用的方式返回给用户。事实证明,在线运行 Python 脚本并不容易,我在网上也没有找到太多的帮助,但下面是我找到的全部内容。
我发现最好的方法是使用Flask——一个用 Python 编写的微型 web 框架。Flask 和 Django 一起,通常用于 web 开发。因为它们是用 Python 编写的,所以很容易将 Python 脚本集成到您的路由中。
我以前写过一篇非常受欢迎的关于如何显示 Matplotlib 图和 Panda 的数据帧的文章——如果听起来有用,那么请检查一下。
提醒一下,这里的目标是从 HTML 表单中获取用户输入,在其上运行 python 脚本,并在全自动过程中输出结果。
建立
这个项目的设置非常简单。我们首先必须从 Flask 导入所有需要的包,如下所示( Line 2 )。然后我们初始化应用程序(第 5 行)——你可以随便叫它什么,但习惯上使用邓德的“名字”。只是不要叫它 Flask,因为这将与 Flask 本身相冲突。最后,我们使用 route decorator 告诉 Flask 哪个 URL 应该调用我们的函数。在这种情况下,它只是’/’ —所以我们的初始页面。
保持 debug = True 打开,以便开发时自动重新加载。但是不要忘记在部署时删除它。
可以看到,我们已经返回了“render_template”函数,这是任何 Flask 应用程序都必须的。它从 templates 文件夹(Flask 需要一个特定的 templates 文件夹)返回一个 HTML 文件,并将其呈现在指定的页面上。这是我们需要的 HTML。
可以看出,这是一个非常简单的 HTML 页面,您可能已经看过一百次了。然而,第 11–15 行是我们感兴趣的。在第 11 行,我们指定了表单的开始,并在第 15 行关闭它。在表单中,我们有三个 div 标签(第 12、13 行,& 14 )。第 12 行仅仅是表单标题,只不过是文本,第 13 行是文件选择,第 14 行是提交按钮。正如您在这里看到的,我们已经将输入类型指定为“file ”,并特别声明。txt 文件。
这里声明“enctype= 'multipart/form-data”很重要,因此 Flask 知道如何对输入进行编码。更重要的是,不要忘记声明 method = "POST ",这样 Flask 就知道请求存储在表单中的信息。
对输入运行 Python 脚本。
现在我们已经有了网站的基本框架,我们如何在输入上运行 python 脚本,然后向用户显示结果呢?
我们需要做的是,创建另一个仅在接收 post 请求时运行的装饰器。
这正是下面要做的。您可以将它直接放在原始的 route decorator 下面。
因此,在这里,当用户单击提交按钮时,这个函数被触发,因为它在使用 POST 方法时被激活。第 5 行然后使用请求库选择输入的文件。然后,您可以像在 python 中一样,简单地在这个变量上运行 Python 脚本。一旦你完成了操作,你就可以以多种方式之一将变量返回给用户。您可以像我上面一样使用 Response 方法,或者您可以将它传递给一个变量,并再次使用 render_template()在另一个 HTML 模板中直接输出它。可能性是无限的。
你可以用多种方式托管你的网站,但我更喜欢 PythonAnywhere。如何做到这一点的指导可以在我的文章的结尾这里看到。
如上所述,你可以在 www.ebookanalyzer.com 的看到一个工作实例。
我当然不是网络开发人员,所以请原谅我的丑陋。
也请让我知道是否有任何错误,或者你可以看到任何改进或更优雅的解决方案。
If I’ve inspired you to join medium I would be really grateful if you did it through this [link](https://jamesasher4994.medium.com/membership) — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout [365 data science](https://365datascience.pxf.io/c/3458822/791349/11148) through my [affiliate link.](https://365datascience.pxf.io/c/3458822/791349/11148)
如果你喜欢这篇文章,下面是我写的一些类似的文章:
[## 如何预测没有数据的事物——还有盆景树
towardsdatascience.com](/how-to-predict-something-with-no-data-and-bonsai-trees-b6ebc6471da3)
干杯,
詹姆斯
如何轻松设置 M1 macbook 进行数据科学和机器学习
你只需要 10 分钟。和一台 M1 苹果机。
安德烈·德·森蒂斯峰在 Unsplash 上拍摄的照片
为数据科学配置 M1 MAC 可能是一件痛苦的事情。您可以选择更简单的方法,在 Rosseta 下运行所有东西,或者像疯子一样手动安装依赖项,面对永无止境的错误消息日志。
第一个选项很好,但是 Python 不能本地运行,所以会损失一些性能。第二个是,嗯,乏味又伤脑筋。
但是还有第三种选择。
今天,您将学习如何设置 Python,以便在任何 M1 芯片上通过 Miniforge 本机运行。我们还将通过一些例子来探索 Python 是否真的在本地运行。
这篇文章的结构如下:
- 安装和配置 Miniforge
- 性能试验
- 最后的想法
安装和配置 Miniforge
我花了很多时间为数据科学配置 M1 Mac 电脑。它从来没有一点瑕疵。直到我发现了这个选项。根据网速的不同,完全设置需要 5 到 10 分钟。
首先,你需要安装自制软件。这是一个用于 Mac 的软件包管理器,您可以通过从终端执行以下行来安装它:
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
请记住——如果你正在安装一台新的 M1 Mac,很可能你不会安装自制所需的 XCode 构建工具。终端会通知您这些是否丢失,并询问您是否要安装它们。
一旦安装了 XCode 构建工具和 Homebrew,您就可以重启终端并安装 Miniforge:
brew install miniforge
这是几百 MB 的下载,所以需要一些时间来完成。完成后,再次重启终端。
就是这样!Miniforge 现已安装,您可以创建虚拟环境并初始化 conda 了。以下终端行将基于 Python 3.8 创建一个名为“base_env”的虚拟环境:
conda create — name base_env python=3.8
最后,初始化 Z shell (zsh)的 conda:
conda init zsh
只是为了好玩,在激活环境之前再次重启终端。调用“init”后,默认情况下将激活“base”环境。您可以通过执行以下行来更改它:
conda activate base_env
您应该会看到类似这样的内容:
图 1 —激活 conda 环境(图片由作者提供)
最后一步,让我们通过 conda 安装几个 Python 库:
conda install numpy pandas matplotlib plotly scikit-learn jupyter jupyterlab
仅此而已。接下来让我们做几个测试。
性能试验
如果你愿意的话,可以在虚拟环境中建立一个 Jupyter 实验室。首先,让我们导入常见的数据科学疑点——Numpy、Pandas 和 Scipy——只是为了验证一切工作正常:
图 2 —库导入和版本检查(作者图片)
接下来,让我们在没有任何库的情况下做一个简单的循环。代码如下:
图 3 —纯 Python 测试(图片由作者提供)
如您所见,该单元花了 7.5 秒完成。为了验证使用的是原生 Python 版本,而不是 Rosetta 下的 Intel 版本,我们可以在活动监视器中检查 Python3.8 的架构值:
图 4 —纯 Python 测试的活动监视器(图片由作者提供)
让我们用 Numpy 做下一个测试。下图中的代码生成一个大的随机整数数组,计算对数和平方根:
图 5 — Numpy 测试(图片由作者提供)
这是活动监视器:
图 Numpy 测试的活动监视器(图片由作者提供)
如你所见,Numpy 工作起来很有魅力。最后,让我们用熊猫做测试。我们将执行与 Numpy 相同的操作,因此无需进一步解释:
图 7-熊猫测试(图片由作者提供)
让我们再看一下活动监视器:
图 8-熊猫测试的活动监视器(图片由作者提供)
这就证明了 Python 和它的数据科学库都可以轻松配置。接下来让我们总结一下。
最后的想法
总之,在为数据科学配置新的 M1 Mac 电脑时,没有必要去碰壁。当然,这个过程和英特尔的不一样(除非你用的是 Miniforge),但是这个过程仍然很简单。
请继续关注更多 M1 测试以及与其更大的兄弟-2019 年的 16 英寸英特尔 i9 的详细比较。
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@radecicdario/membership
了解更多信息
- Python 3.10 的新特性–您应该尝试的 4 个惊人特性
- 如何用 Cron 调度 Python 脚本——你需要的唯一指南
- Dask 延迟——如何轻松并行化您的 Python 代码
- 如何使用 Python 创建 PDF 报告—基本指南
- 2021 年即使没有大学文凭也能成为数据科学家
保持联系
如何在任何 M1 Mac 上轻松设置 Python
在 M1 Mac 上正确安装 Python 和所有数据科学包的两种简单方法
Dmitry Chernyshov 在 Unsplash 上拍摄的照片
买了一台 M1 Mac 后,我意识到在新的 Mac 机型上正确设置 Python 和所有数据科学包(以及非数据科学包)是多么令人困惑。
根据这篇关于苹果芯片的长篇 Anaconda 指南,在 M1 上运行 Python 有 3 种选择——pyenv、Anaconda 和 miniforge。
在本指南中,我将向您展示如何使用 anaconda 和 miniforge 在任何 M1 Mac 上轻松设置 Python。Anaconda 一次安装就带来了数据科学中使用的所有工具(包括 Python 和 Jupyter Notebook)和包,而 miniforge 让你可以自由地按照自己的意愿设置 conda 环境,所以你需要自己安装任何包。
注意:本指南中提到的方法不会帮助你在 M1 MAC 上运行 Python,而是通过 Rosetta2。Python 可以很好地工作,只要记住 与原生 ARM64 相比,使用 Rosetta2 运行 x86–64 程序时,人们会看到 20–30%的性能损失
**Table of Contents** 1\. [Setting up Python and Data Science Packages with Anaconda](#6ef3)
- [Step 1: Download and Install Anaconda](#cb9f)
- [Step 2: Launch Jupyter Notebook/Lab](#57a6)
- [Step 3: Install any additional library](#fe78)
2\. [Setting up Python with Miniforge](#c3d4)
- [Step 1: Install Homebrew](#9400)
- [Step 2: Install miniforge](#dab6)
- [Step 3: Setup and activate a virtual environment](#8ea8)
- [Step 4: Install any Python library](#52f4)
选项 1:用 Anaconda 设置 Python 和数据科学包
下面的步骤将帮助您下载 Anaconda 安装程序以及用于数据科学的所有包。有了这个选项,我们将能够使用图形化安装程序来管理 Anaconda。
步骤 1:下载并安装 Anaconda
转到 Anaconda 并点击“开始”按钮。将会出现一个列表,选择选项“下载 Anaconda 安装程序”在这里,您将看到所有操作系统的 Anaconda 安装程序。
下载任何用于 macOS 的 64 位安装程序(由于 Rosetta2 ,这两个程序都可以很好地用于 M1 机型)。在我的例子中,我选择了“64 位图形安装程序”来拥有 Anaconda 提供的漂亮的 GUI。
下载文件后,打开它安装 Anaconda。将弹出一个窗口,按“继续”开始安装。
步骤 2:启动 Jupyter 笔记本/实验室
一旦 Anaconda 安装完毕,您将会看到一个代表 Anaconda 徽标的绿色圆形图标。点击它运行 anaconda。如果您像我一样下载了图形安装程序,您将会看到如下所示的 Anaconda navigator。
作者图片
数据科学的主要应用是 Jupyter 笔记本和 Jupyter 实验室。让我们启动它们中的任何一个,并导入几个数据科学库,以检查所有设置是否正确
import pandas as pd
import numpy as np
第一次导入库时,可能会花费比平时更多的时间。
步骤 3:安装任何附加库
Anaconda 为数据科学带来了最常见的包,但是您最终可能需要安装一些额外的库。
为此,请转到左侧的“环境”部分。然后选择您正在使用的环境(默认情况下称为“基本”),点击下拉菜单,并选择“未安装”在此之后,将显示通过康达-福吉渠道提供的所有包。在搜索框中,您可以编写任何您想要的库,然后选中复选框来安装库。
作者图片
就是这样!您已经准备好将 Python 用于数据科学。如果有不清楚的地方,查看下面的视频了解更多细节。
选项 2:用 Miniforge 设置 Python
Miniforge 允许你安装 conda 包管理器。这个选项给你自由设置 conda 环境,所以你需要自己安装任何包。
步骤 1:安装自制软件
要轻松安装 miniforge,首先,我们需要安装 Homebrew。家酿是一个开源的软件包管理系统,简化了 macOS 上的软件安装。
要安装家酿,去这个网站。在那里,您会发现下面的代码,您需要在终端中运行。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
终端将要求您的用户输入密码。介绍它,然后按 return/enter 继续。
注意:要安装 Homebrew,你需要安装 XCode 构建工具。如果你不确定你是否已经拥有它,不要担心;终端会让你知道 XCode 构建工具是否丢失,并要求安装。
步骤 2:安装 miniforge
一旦安装了 Homebrew,重启终端并安装 miniforge,运行下面的命令。
brew install miniforge
如果你得到错误zsh: command not found: brew
,可能自制程序被保存在/opt/homebrew/
而不是/user/local/…
T11 中。如果是这样,你必须用下面的命令修改你的路径(更多细节在 StackOverflow )。
export PATH=/opt/homebrew/bin:$PATH
这之后就可以使用brew
并安装 miniforge 了。现在是创建和激活虚拟环境的时候了。
步骤 3:设置并激活虚拟环境
要安装虚拟环境,请在终端上运行以下命令。在这个例子中,我将使用 Python 3.8 创建一个名为test_env
的新环境
conda create --name test_env python=3.8
此后,您必须运行以下命令来激活环境。
conda activate test_env
步骤 4:安装任何 Python 库
最后,您可以安装运行以下命令的 Python 包。
conda install PACKAGENAME
让我们安装数据科学中使用的最流行的 Python 库。
conda install numpy
conda install pandas
conda install matplotlib
conda install plotly
conda install scikit-learn
你还应该安装 Jupyter 笔记本和/或 Jupyter 实验室。
conda install jupyter
conda install jupyterlab
要运行 jupyter 笔记本,请在终端上运行以下命令。
jupyter notebook
就是这样!您已经准备好将 Python 用于数据科学。
https://frankandrade.ck.page/bd063ff2d3
如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑报名成为一名媒体成员。每月 5 美元,让您可以无限制地访问数以千计的 Python 指南和数据科学文章。如果你用我的链接注册,我会赚一小笔佣金,不需要你额外付费。
**https://frank-andrade.medium.com/membership **
如何轻松地在你的网站上动态显示 Matplotlib 图和 Pandas 数据框
卢卡斯·布拉塞克在 Unsplash 上的照片
用不到 100 行代码,一个令人惊讶的简单方法,向全世界展示你的 Matplotlib 图和 Pandas 数据帧。
H 你有没有想过从你的笔记本电脑或手机上获得一个可视化或数据框架,而不必每次都运行代码?如果你能让它在后台运行,并拥有一个可以随时随地(通过互联网连接)访问数据的网址,这不是很好吗?尤其是当有新数据时可以自动更新的。
事实证明,你可以,而且一点也不难。上周我只是从谷歌上自学了如何做到这一点,但那里有很多垃圾,所以这里是我发现的最简单的方法。可能有我不知道的更好的选择,所以如果有,请让我知道。我很好奇。然而,这种方法绝对可以保证的是简单性。它也不会花你一分钱。我也绝对不是一个网络开发人员,所以我提前道歉,如果我谋杀了任何术语。
本文对您的期望不高,对 Python 有基本的了解就可以了。对 HTML 有一点了解是有益的,但绝对不是必要的。理解 Flask 会让这变得很容易,但是如果你了解 Flask,你可能已经知道如何去做了。这个结构看起来有点像这样,你可以在一个小时内真正地让它运行起来,没问题。
- 设置烧瓶
- 基本路由
- 熊猫数据帧
- Matplotlib 图
- 托管在 PythonAnywhere 上
设置烧瓶
这不是一篇关于网页设计的文章,因为我肯定没有资格谈论它。这是一篇关于如何在你的网站上获得数据框架和图表的文章。最重要的是自动更新的绘图和数据帧。你可以“保存”你的图表,把它们塞进你的静态文件夹,当新的数据进来时不断更新它们,但那是苦差事,我不喜欢苦差事。
所以,首先,我们要做的是有一个非常简单的两页网站。一页展示你的精彩图表,一页突出你美丽的熊猫数据框。
它看起来会和这个一模一样。
我知道非常难看,但是你可以用一些 CSS 或 JS 让它看起来更漂亮,但是那是以后的事了。这只是简单地告诉你如何让他们在那里,你可以担心让他们看起来很漂亮。
这是代码。我将一节一节地讲解。如您所见,主文件只有 69 行。
确保不要将该文件命名为 Flask.py,因为这将与 Flask 本身冲突。
我们可以从第 0–16 行开始。这些都是需要导入的东西,第一部分**(第 4 行)**是帮助你处理所有路由和网站结构的 flask 包。它们的名字都是不言自明的,你不必想太多。正如你所看到的,其中的一些,你实际上并不需要它的基本版本。然而,它们非常有用,所以我倾向于总是导入它们。
下一个**(第 6-12 行)的导入都是为了绘制你的数据。同样,这些都很常见,不言自明。唯一一个可能会引起你注意的是第 11 行**——‘matplotlib . use(’ Agg)’。出于某种我不完全理解的原因,默认的 plt 后端不能很好地与 Flask 一起工作——这一行代码修复了它。如果你不使用 plt,不要担心,但是如果你使用,我建议你把它包括进来。第 15 行只是我们稍后需要的另一个包,当我们谈到它时,我会尽力解释。
现在,我们需要一些数据来使用。在这个文件中,我有两种方法,没有被注释掉的方法是我认为最容易获取数据的方法。让熊猫通过 CSV 文件带进来就行了。然而,这有几个问题。首先,当以后在 PythonAnywhere (PA)上托管网站时,路径可能会不同,并且相对于 PA 环境,而不是本地桌面。因此,请确保根据您是在本地测试还是试图在线发布来指定正确的路径。其次,这不会自动更新,除非您自动更新 CSV 文件。如果你想让数据自动更新,那么我个人的偏好是定义一个函数,从互联网上抓取数据,并将其清理到一个熊猫数据框架中。我不会在本文中深入探讨,但是在这个 GitHub repo 中有一个例子,以及这个小项目中涉及的其余代码。因此,要使这些图“动态”,你所要做的就是找到一个动态数据源(互联网通常是最好的)并创建一个文件,每次主文件运行时它都会抓取数据。第 19 行和第 21 行调用另一个文件中的函数,该文件通过搜索互联网来完成这一任务。
好的,最后,谈谈 flask 应用程序本身。你要做的第一件事就是初始化应用程序— line 25 。个性化是有空间的——但我不会。很容易把事情搞砸。我总是坚持那条路线。
基本路由
Flask 使用 route decorators 让您指定应该在每个 URL 上执行哪些函数。因此,这里的想法是创建两个返回两个不同函数的 URLs 一个显示我们的数据框架,另一个显示我们的绘图。基本的路线装饰可以在**28 行看到。**这个 decorators 参数仅仅是“/”,它有效地告诉 Flask 这是我们的主页,下面的函数应该从我们的起始 URL 运行——在我的例子中是:http://jasher4994.pythonanywhere.com/。正如你所看到的,如果你把“/”从 URL 中去掉,那么什么都不会改变。因此,要创建带有扩展 URL 的新页面,只需用 route decorator 创建一个新页面。这是我们下面要做的。
熊猫数据帧
所以,首先,我们可以为我们的熊猫做一个数据框架,我们也可以做我们的主页。我们已经在第 28 行中看到了 route 操作符,所以我们可以扩展它并在**第 29 行创建一个名为“Pandas”的新页面。**这次我们做了完全相同的事情,除了创建一个名为“Pandas”的新 URL,并声明我们想要使用“POST”和“GET”方法。这是两种最常见的 HTTP 方法,分别用于向服务器发送和请求数据。
因此,我们现在有两个 URL 将调用同一个函数。该功能在第 30 行**中定义如下。**这是一个传统的 Python 函数,它返回另一个函数——“render _ template()”。这个函数非常有用,它有效地告诉 Flask 从你的 templates 文件夹中呈现一个 HTML 模板(模板必须在一个名为“templates”的子目录中,所以要确保它是)。下面是你需要创建的 HTML 模板。这非常简单,只需要将第 7–10 行代码添加到传统的 HTML 模板中。第 7 行甚至不需要在那里,它只是一个标题标签。
这是怎么回事?在主文件的第 33 行中,我们将“表格”作为参数传递给渲染模板函数。该表只是我们的 pandas 数据帧,其中应用了“to_html()”方法。我很肯定你能猜到那是什么。这一行的其余部分只是指定我们是否需要像索引和列标题这样的东西。然后,在我们的 HTML 文件中,我们可以使用这个表。
Flask 在这里实际上使用了 Jinja2(一个创建 HTML 的 python 模板引擎),这就是你在第 7–10 行看到的。你不必太担心这一点,但是这 3 行有效地在 HTML 中显示了你的表格。
就这么简单!如果您现在在终端中运行主文件,您应该会得到一个本地链接,您可以复制并粘贴到您的浏览器中,您应该会看到您的数据帧!
Matplotlib 地块
Matplotlib 图一开始在 Flask 中工作似乎有点困难,但最终证明它们非常简单。在这一部分,我们将自下而上地工作,请耐心等待。
如果您的图形从不更改,您可以将它作为静态文件放在 images 文件夹中,并直接引用它。
然而,如果它确实需要定期改变,那么这种方法是适合你的。例如,我在这里使用的数据是足球队预期的零失球(他们不会失球的概率)。这当然会随着对手的不同而改变。所以,我有另一个文件定期抓取和更新这些数据。如果我把它作为一个静态文件,它不会更新,只会显示第一周的图表。用这种方法,情节将显示在飞行中,我将永远不需要更新它。我从未在“实时”数据上测试过这一点,我怀疑它不会工作得很好,可能需要一些 JavaScript。如果你的数据每天更新,甚至每小时更新一次,我怀疑这种方法绝对有效。
回到 Python 文件中的 Matplotlib 部分**(第 50–63 行)**,我们可以先看看 create_fig()函数。所有这些只是创建一个数字(图形)并绘制出我们想要的数据。在这种情况下,它在 x 轴上绘制“团队”,在 y 轴上绘制“预期目标”。出于美观的原因,我已经更改了 x 刻度的颜色和旋转。
向上移动,我们到达 plot_png()函数**(44–48)**。这个稍微复杂一点,但是不多。简而言之,它创建了一个网页,只显示我们之前显示的图形——以 png 格式。BytesIO()'创建一个内存缓冲区,可以选择用您作为参数提供的数据填充,并允许您对它进行类似文件的操作。
这将产生一个只有我们在上面创建的图像的网页。再次,创建一个新的路线,如前所述,可以在这里看到。这很有用,但还不够有用。当然,在未来,我们可能希望在同一页上有一些描述我们可爱情节的文字,或者其他一些情节——而不仅仅是充满一个大情节的一页。
因此,我们希望我们的情节成为页面的一部分,而不是整个页面。
因此,我们创建一条最终路线(第 38–40 行),并呈现我们的第二个也是最后一个模板,如下所示。
可以看出,这非常容易。只有两行不同于标准 HTML 模板的代码——其中一行是标题!第 7 行是这里最重要的一行,它转到我们之前用整页 png 创建的路径,获取图像,然后将它放到我们的 HTML 文件中。现在图像是我们页面的一部分,并没有吞噬整个页面。
哒哒!现在,您可以在浏览器上显示您的绘图和数据帧了。不过,这只是局部的,所以用处不大。幸运的是,用 pythonanywhere 把它们发布到网上让全世界看到是非常简单的。下一节将向您展示如何做到这一点。
在 Python anywhere 上托管
现在,最后一步,托管你的网站。 pythonanywhere (PA)是做这件事的一个很棒很简单的地方。如果操作正确,您也可以在不到五分钟的时间内启动并运行。所以,一旦你用三个文件(你的主 Flask 文件和你的两个 HTML 文件)创建了一个 PA 账户,你只需要一个初学者账户就可以了——这是免费的。一旦你注册完毕,你应该会看到一个类似这样的面板。
在这里,我们将主要使用“Web”和“Files”选项卡,但是不需要太多的想象力就能想到其他选项卡提供了什么。
首先,我们需要创建我们的 web 应用程序。因此,在左侧的仪表板上,单击“添加新的 web 应用程序”,然后按照说明进行操作。选择您使用的 Python 版本,当然,Flask 是您的框架。然后它会为你创建一个 web 应用程序,你可以指定名称——为了简单起见,我称我的应用程序为“我的网站”。
所以现在我们需要做的是,把我们的文件放到 PA 里。如果你知道 Git,太棒了,PA 有一个控制台,你可以直接打开和拉你的库,然后你就可以开始了。
对于不了解 Git 的人来说,这也非常简单,我将在下面向您展示如何操作。首先,去文件区。然后,在左侧,单击您的 web 应用程序路径(我的网站)。在这个目录中添加您的 Flask 文件。然后在这个目录中,创建一个名为“templates”的新目录。对 Flask 来说,准确地完成这一步很重要,这样它就知道在哪里寻找 HTML 模板。然后在这个新的模板目录中添加两个 HTML 文件。应该是这样的。
快到了!您必须检查的最后一件事是确保源代码是直接指定的。如果看起来不像这样…
那就改改看。
…最后!点击顶部那个性感的绿色大按钮来重新加载你的应用,然后点击链接。
瞧,你现在有熊猫和 Matplotlib 在网页上运行。Python anywhere 将免费为你无休止地运行这个网站,但你必须每三个月登录一次,让他们知道你还活着,你仍然想运行这个网站。不过,他们会在一周前给你发邮件,所以没必要设置任何提醒。
一旦你开发出这样一个不错的框架,利用像 https://getbootstrap.com/这样的资源让一个网站看起来相当专业就变得非常简单了。
我真的希望这有所帮助,任何反馈都将不胜感激。下面是我写的一些类似的文章,你可能会喜欢。
If I’ve inspired you to join medium I would be really grateful if you did it through this [link](https://jamesasher4994.medium.com/membership) — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout [365 data science](https://365datascience.pxf.io/c/3458822/791349/11148) through my [affiliate link.](https://365datascience.pxf.io/c/3458822/791349/11148)
干杯,
詹姆斯
如何有效地管理部署的模型
通过 Tensorflow 服务管理您的模型的生命周期
来源( Unsplash )
大多数型号从未投入生产。我们之前看了使用 Tensorflow 服务部署 Tensorflow 模型。一旦这一过程完成,我们可能会认为我们的工作已经全部完成。事实上,我们刚刚开始了管理模型生命周期的新旅程,并确保它保持最新和有效。
像软件中的大多数东西一样,需要持续的开发和改进。一旦模型被部署,管理它的任务是一个经常被忽视的任务。在这里,我们将看看如何有效地做到这一点,并使我们的模型管道更有效。
多型号配置
当服务模型时,最简单的方法是指定MODEL_NAME
环境变量,如这里的所示。但是,如果我们想为多种型号服务呢?不同的配置选项,比如使用多少个线程或轮询频率,会怎么样?在这种情况下,我们可以使用如下所示的模型服务器配置文件。
模型服务器配置文件
我们使用模型配置列表选项,它是模型配置协议缓冲区的列表。每个 ModelConfig 都应该指定一个要服务的模型。上面我们看到两个模型,分别命名为first_model
和second_model
。我们还需要指定一个base_path
,服务器将在这里寻找模型的版本以及model_platform
。我们的示例展示了在 TensorFlow 上运行的两个模型。
一旦我们有了 ModelServer 配置文件,我们就可以使用如下所示的命令运行 docker 容器。
docker run --rm -p 8501:8501 -v "$(pwd)/models/:/models/" \
-t tensorflow/serving **--model_config_file=/models/models.config \
--model_config_file_poll_wait_seconds=60**
在之前,我们已经看过这个docker run
命令。唯一的区别是我们在最后增加了--model_config_file
和--model_config_file_poll_wait_seconds
选项。--model_config_file
选项设置为我们的模型服务器配置文件,而--model_config_file_poll_wait_seconds
选项设置为 60。这意味着服务器每分钟都会在指定位置检查新的配置文件,并根据需要进行更新。
型号版本和版本标签
当 Tensorflow Serving 搜索一个模型的base_path
时,其默认行为是总是根据版本号服务于最新的模型。如果在我们的路径中有版本 1 到 5,版本 5 将总是被服务。如果我们想提供更早的版本呢?还是为同一型号的多个版本服务?在这种情况下,我们可以在配置文件中指定 model_version_policy,并将其设置为specific
,提供我们想要提供的版本号。
model_version_policy {
specific {
versions: 2
}
}
通过将上面的代码片段添加到我们的配置文件中,我们的服务器将知道提供我们模型的版本 2,而不是最新的版本。如果我们想一次提供多个版本,我们可以简单地添加更多的版本。
model_version_policy {
specific {
versions: 2
versions: 3
versions: 4
}
}
我们还可以给模型版本分配字符串标签,这样我们可以更容易地记住它们。
model_version_policy {
specific {
versions: 2
versions: 3
versions: 4
}
}
version_labels {
key: 'stable'
value: 2
}
version_labels {
key: 'canary'
value: 3
}
version_labels {
key: 'dev'
value: 4
}
上面我们已经给我们的模型版本分配了标签stable
、canary
和dev
。如果我们想将版本 3 升级到稳定版本,我们可以简单地将stable
的值从 2 改为 3。类似地,如果我们想让版本 4 成为新的 canary 版本,我们只需要改变相应的值。
A/B 型测试
一个常见的业务场景是模型 A/B 测试。总有一天,我们会想看看开发中的模型与当前生产中的模型相比如何。有了 Tensorflow 的服务,A/B 测试变得容易多了。
在上面的代码片段中,我们创建了一个名为get_request_url
的助手函数,它返回一个我们可以发送 post 请求的 URL。关于这一点,我们可以设置一些阈值(本例中为 0.05),将一定比例的流量路由到不同的模型版本。您还可以对此进行归纳,以便我们可以将流量路由到任意数量的模型版本。
如果我们想慢慢地扩大金丝雀模型版本,我们可以在我们认为合适的时候增加这个阈值,直到金丝雀版本处理大部分传入流量。可以想象,使用这种类型的设置进行回滚也非常简单。
迷你批处理推论
Tensorflow 服务的一个非常有用的特性是能够批量处理请求以增加吞吐量。如果我们一次发出一个请求,我们的服务器将会被占用,在接受任何新的请求之前等待每个请求完成。类似于我们在训练模型时如何批量训练示例,我们也可以将几个推理请求批量在一起,这样模型就可以一次性处理它们。为此,我们将创建一个batch_parameters.txt
文件来保存我们的批处理配置。
一个简单的批处理配置文件
在上面的文件中,我们将一个批处理中的最大请求数设置为 256,最大入队批处理数设置为 1000000,最大并发线程数设置为 4。更详尽的可用选项列表可以在这里的文档中找到。
一旦我们有了这个文件,我们就可以通过向我们的docker run command
添加两个选项来启用批处理。
docker run --rm -p 8501:8501 -v "$(pwd)/models/:/models/" \
-t tensorflow/serving --model_config_file=/models/models.config \
--model_config_file_poll_wait_seconds=60 **--enable_batching=true \
--batching_parameters_file=/models/batching_parameters.txt**
我们只需将--enable_batching
选项设置为真,并将我们的文件传递给--batching_parameters_file
选项。就这么简单!通过在我们的服务器中启用批处理,我们可以显著提高吞吐量,从而可以处理更大的流量。不需要额外的服务器!
结论
我们研究了 Tensorflow 服务的不同特性,这些特性使得管理模型部署和维护变得更加容易。当我们想要一次运行多个模型(或者并行运行同一模型的多个版本)时,我们使用一个 ModelServer 配置文件来指定每个模型的配置。我们还研究了为特定模型分配字符串值,以便更容易跟踪生产中的产品和非生产中的产品。我们还讨论了 A/B 测试,并看到将流量路由到我们模型的不同版本来比较结果是多么容易。最后,我们看了一下批处理,这是一种并发处理大量推理请求的简单方法,因此我们可以增加吞吐量。
感谢您的阅读!
您可以通过以下渠道与我联系:
如何有效地让您的数据项目取得成功
给有抱负的数据科学家的个人建议
原型设计来测试、说服和指导您的数据项目
来源( Unsplash )
问题陈述
哪些分析方向会用最少的时间带来最多的影响?
在失败的数据项目中如何避免沉没成本?
87%的数据项目将会失败— 2019,克里斯·查珀,Gap 的数据和分析 SVP
数据科学项目非常昂贵
每一个 ML 模型都必须在它的整个生命周期中被训练、生产和支持。它需要来自多个利益相关者(用户、工程师、运营、科学家等)的巨大支持来培育模型。
偶尔,可能会有一只黑天鹅和巨大的破坏(例如:疫情)使你的模型无用(又名:概念漂移)。如果没有适当的支持,这将是您最大和最昂贵的数据科学噩梦例如:
事实上, 根据 Chris Chapo 的说法,87%的 AI 项目失败都是因为这三个原因:
- **金钱驱动的投资:**对人工智能的过度宣传让许多投资者认为成功来自于对技术的投资。这导致了“总是成功”的心态,失败不是一个选项。
- 垃圾数据发现得太晚:由于项目负责人之间的适当数据通信失败,但被伪装成成功或“在制品(WIP) ”。
- **复杂的数据管理工作:**访问统一数据需要巨大的努力(基础设施、专业人员等)。更不用说堆积在复杂数据基础设施中的技术债务了。
但是后来……
我们怎么知道这个数据项目不是一艘泰坦尼克号,在索赔中不沉,但在第一次航行中沉没?
我们如何知道这个解决方案是否有效,而不会浪费资源(金钱、时间、人力)?
为什么:用于测试、说服和指导的原型
测试:更快地排除失败的假设
不要试图煮沸海洋,而是选择一个痛点来解决,在那里你可以展示明显的进步——Chapo
拥有一个原型有助于您消除失败的假设,避免沉没成本,因为您可以做出明智的决策来部署产品。
小项目成功总比大项目失败好。这种快速的尝试-失败-重复过程还允许企业以更及时的方式消除失败的假设并发现有用的假设。
例如,当我接到一个新项目时,我会快速开发设计文档,并进行小实验来决定下一个最佳的战略分析方向。
**类似地,你也可以使用类似的推理来启动每一个数据项目,例如:**试验社交媒体功能以进行品牌分析,通过聚类进行功能工程,等等。
劝说:加大对 ML 项目的支持力度
团结你的利益相关者来拥有金块。
数据科学家从不独自工作。在每一个数据项目中,您都需要获得运营、分析师和工程师的支持,以支持基于 ML 的解决方案。
因此,每个数据项目都需要可靠的沟通来传播让利益相关者兴奋的想法和知识。
这就是为什么原型很重要。原型将抽象的代码简化为有形的应用程序,通过我们的五种感官(听觉、触觉、嗅觉、视觉和味觉)吸引我们。
在交互式笔记本或 Shell 脚本中通过文本显示结果是不够的,但拥有一个可视化的仪表板,利益相关者可以在其中进行交互,这将在您的解决方案中建立他们的兴奋感和所有权。
指南:为想法的成功设定关键方向
原型使关键的想法和数据项目得以发展
数据科学家的定位是确定需要大量时间和精力的分析方向。
拥有一个原型对于生成做出明智决策所需的反馈来决定分析方向是很重要的。有了更多的反馈,你将对什么以及如何为你的利益相关者创造价值有更好的认识。
此外,想法滋生想法。例如,证明基于计算机视觉的解决方案在产品推荐中的功效的简单原型可以重新用于欺诈检测,甚至自动贴标。
这意味着原型可以让你的想法快速发展和转移。你的影响力不仅会扩大到你各自的团队,还会扩大到对你的想法感兴趣的其他职能部门。
原型构建快速概念验证(POC)来测试、说服和指导每个大规模数据项目——Vincent Tatan
如何:原型制作需要学习哪些工具?
使用 Web 仪表盘、Python Web 框架和 AI 原型框架。
在这个主题中,我想强调几个工具,从最简单到最简单的方式来构建一个原型。总的来说,我建议您从简单的工具开始,以节省时间,然后在需要时构建更高级的数据原型。
网络仪表板(谷歌数据工作室)
使用这种方法最简单的方法是:
- 对数据集运行 Python 脚本并将预测转储到静态文件中(例如:CSV/excelsheet)
- 根据你的预测创建一个谷歌数据工作室仪表盘
- 允许你的利益相关者访问和互动。
这些是如何使用连接的数据集快速构建仪表盘的一些示例。
在 10 分钟内建立一个数据工作室仪表板(来源于作者)
创建使用 Instagram API 进行社交媒体分析的原型/工具。(作者为 Yayasan Merajut Hati——一个总部设在印度尼西亚的心理健康组织提供)
Python Web 框架(Dash/Flask)
如果你想要一个直接在内存上运行预测的解决方案,你可以使用 Flask 和 Dash 这样的 Web 框架来交互式地运行预测。
总的来说,Dash 允许你设置 webhooks 来启动预定义的操作,并通过 Plotly 在交互式视觉效果中当场呈现结果。
这里有一个例子,我建立了一个价值投资仪表板来预测股票的买入/卖出判断。
原型价值投资计算(买入/卖出)带破折号(来源于作者)
数据原型框架(例如:Streamlit)
Streamlit 是一个开源的 Python 库,可以轻松创建和共享漂亮的定制 web 应用程序,用于机器学习和数据科学。只需几分钟,您就可以构建和部署强大的数据应用程序— Streamlit.io
我没有探索过 Streamlit.io,但是我发现 Chanin Nantasenamat(又名数据教授)教程非常有用。
拥有一个直观且易于使用的框架将会让你在不花费太多时间的情况下构建数据项目的原型。
【FreeCodeCamp.org 简化 Youtube 教程
总之:原型是快速失败的基本方法
通过原型设计,你可以让自己很快失败。对原型技术的投资将测试、说服并引导您的数据项目走向成功。
总之,原型设计对于将您的想法付诸实践并通过以下方式产生共享影响非常重要:
- 测试:更快地排除失败的假设。
- 说服:加大对 ML 项目的支持力度
- 指南:为想法的成功设定关键方向
我希望这能帮助您理解为什么原型设计很重要,并使用它来交付真实的数据影响。
索利·德奥·格洛丽亚
关于作者
文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。
除了在谷歌的工作,文森特还是乔治亚理工学院计算机科学硕士校友、三项全能运动员和面向数据科学媒体的特约作家,该媒体在全球拥有超过 100 万的观众,为有志于数据科学的人和数据从业者提供指导。
最后,请通过LinkedIn、Medium或 Youtube 频道 联系文森特
如何有效地重新划分火花数据帧
如何增加或减少火花数据帧的数量
Apache Spark 是一个能够在合理的时间内处理大量数据的框架。这个统一引擎的效率在很大程度上取决于它对数据集合执行的工作进行分配和并行处理的能力。
在本文中,我们将介绍 Spark 中的分区,并解释如何对数据帧进行重新分区。此外,我们还将讨论何时值得增加或减少 Spark 数据帧的分区数量,以便尽可能优化执行时间。
简单地说,火花分割
为了实现高并行性,Spark 将数据分割成更小的块,称为分区,分布在 Spark 集群的不同节点上。每个节点可以有多个执行器,每个执行器可以执行一个任务。
将工作分配给多个执行器需要将数据划分并分布在执行器之间,这样工作可以并行完成,以便优化特定作业的数据处理。
如何获得当前的分区数量
在开始重新分区之前,有必要描述一下获取 Spark 数据帧当前分区数量的方法。例如,假设我们有以下最小火花数据帧
为了获得上述数据帧的分区数量,我们只需运行以下命令
请注意,输出取决于您当前的设置和配置,因此您可能会看到不同的输出。
如何增加分区数量
如果想增加数据帧的分区,只需运行[repartition()](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.repartition)
函数。
返回由给定分区表达式分区的新的
[**DataFrame**](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame)
。产生的数据帧是散列分区的。
下面的代码会将分区数量增加到 1000:
如何减少分区的数量
现在,如果您想对 Spark 数据帧进行重新分区,使其具有更少的分区,您仍然可以使用repartition()
然而,有一种更有效的方法可以做到这一点。
[coalesce()](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.coalesce)
导致一个狭窄的依赖关系,这意味着当用于减少分区数量时,将会有 **no shuffle,**这可能是 Spark 中代价最大的操作之一。
返回一个正好有 N 个分区的新的
[**DataFrame**](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame)
。
在下面的例子中,我们将分区限制为 100 个。最初有 1000 个分区的 Spark 数据帧将被重新分区为 100 个分区,而不进行洗牌。我们所说的不洗牌是指 100 个新分区中的每一个都将被分配给 10 个现有分区。因此,当想要减少 Spark 数据帧的分区数量时,调用[coalesce()](https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.coalesce)
会更有效。
结论
在本文中,我们讨论了如何通过分区优化数据处理,分区允许工作分布在 Spark 集群的执行器上。此外,我们还探讨了增加或减少数据帧中分区数量的两种可能方法。
repartition()
可用于增加或减少火花数据帧的分区数量。然而,repartition()
涉及洗牌,这是一个昂贵的操作。
另一方面,当我们想要减少分区数量时,可以使用coalesce()
,因为这种方法不会触发 Spark 集群节点之间的数据洗牌,因此效率更高。
如何有效地与熊猫和 S3 一起工作
关于如何使用 python 和 S3 进行内存操作以及如何测试这些代码的教程。
埃里克·麦克林在 Unsplash 上的照片
对于我们这些数据科学家来说,至少有两件重要的事情;数据和科学。太惊喜了:)。从这两个方面来看,科学无疑是更令人兴奋也不那么混乱的部分。然而,没有数据,科学只是一个干巴巴的理论,没有把它变成现实的激情。那太无聊了。
当存储或加载数据时,我们应该考虑性能。没有人愿意等很久,直到数据可供处理。当使用云存储时,我们可以通过直接从-写入数据或者将数据加载到内存而不是使用中间文件来提高性能。对于运行在 AWS Fargate 或 Lambda 上的应用程序,这甚至可能是一个强烈的需求,因为本地磁盘存储很低或者根本不可用。
最后,由于我们不仅是伟大的数据科学家,也是出色的开发人员,我们希望测试我们的应用程序代码。当您的代码访问 S3 时,您不希望在测试中访问真正的 S3 桶。您更喜欢将数据保存在本地,甚至在内存中生成数据。否则,您的测试会变得很慢,并且依赖于网络连接。这当然是我们应该避免的。
那么我们应该做什么来运行测试访问 S3 的代码呢?
模拟对 S3 的读写连接
在这篇文章中,我将向你展示如何在内存中从/向 S3 读写熊猫数据帧。为了测试这些函数,我还展示了如何使用库 moto 模拟 S3 连接。作为一个好孩子,我指导你如何让你的测试变得枯燥,写起来更有趣。
说够了。我们开始吧!
熊猫数据框和 S3
在下面,我们想开发两个功能;一个是 写 一个熊猫数据帧给一个***【S3】***桶,另一个是 从那里读 数据回来。为了确保这些函数做它们应该做的事情,我们还编写了一些测试。
在深入研究之前,我们首先需要设置一些基础知识。
基础知识
当使用 Python 处理 AWS 服务时,有三个库是你必须知道的。
- boto core**😗*boto core 是越来越多的 AWS 服务的底层接口。从描述中你已经得到了最重要的部分;是低级。由于是低级的,用起来比较繁琐。幸运的是,围绕 botocore 有一个更高层次的抽象。
- boto**3:**boto 3 是配合各种 AWS 服务工作的 Python SDK。它是围绕 botocore 构建的,但提供了更高级、更方便的 API。它是您应该在代码中用来创建、配置和管理 AWS 服务的库。
- Moto**😗*Moto 模拟出各种 AWS 服务的连接。这对于测试与 AWS 基础设施对话的应用程序代码是必要的。在您的测试中,您不应该访问真实的基础设施,因为这会使您的测试变慢,并且依赖于连接性。
如果要运行下面的例子,需要安装 boto3 和 moto。你不必明确地安装 botocore,因为它是 boto3 自带的。我使用 pytest 作为测试框架。最后,你需要熊猫,因为我们正在处理数据帧。
一如既往,我推荐使用poems来管理您的 Python 项目和依赖项。如果你对此感兴趣,你可能想看看这篇文章。当然,你也可以使用普通的 pip 来安装所有的东西,最好是在虚拟环境中。
一切就绪。让我们继续前进!
将数据帧读写到内存中
在开始测试之前,我们需要测试一些东西。正如简介中所承诺的,我们希望从/向 S3 读取/写入数据都完全在内存中完成。让我们从给 S3 写信开始,直接进入代码。
所以这很简单。首先,您需要序列化您的数据帧。对于序列化,我使用 parquet,因为它是一种高效的文件格式,并且开箱即用。但是,您也可以使用 CSV、JSONL 或 feather。接下来,我写入一个类似文件的对象,而不是写入或序列化到磁盘上的文件中。该对象保存在内存中。为此,我使用了 python 标准库中的字节序。最后,我创建了一个 boto3 S3 客户端,并使用方法upload_fileobj
来运行上传。
数据帧在云中!
我们怎么把数据帧拿回来?同样,让我们从看一下代码开始。
我们在这里所做的只是颠倒我们之前所做的。我们从使用 boto3 创建 S3 客户端开始。接下来,我们使用get_object
下载对象,并将其放入一个类似文件的对象中。最后,我们使用 pandas 和 parquet 反序列化对象。我们的数据框架回来了!
杰弗里·F·林在 Unsplash 上的照片
现在,这些代码真的有用吗?你可以盲目地信任我,但我不会这么建议。因此,让我们添加一些测试,我们甚至可以运行没有 S3 帐户,甚至没有互联网连接。
测试在没有 S3 的情况下与 S3 对话的代码
为了测试我们的 S3 IO 代码,我们需要一种方法来欺骗 boto3,使其不真正与 S3 对话,而是与它的内存版本对话。这就是 moto 为我们做的。重要的是,它不仅模拟了连接,而且几乎完全复制了内存中的 S3 服务。有了它,我们就可以创建存储桶,把文件放在那里,然后读回来。听起来不错,不是吗?真正好的一点是,我们不需要做太多就能得到它。让我们深入到测试这两个函数的基本测试代码中。
最重要的部分是mock_s3
装饰。当您将它添加到您的测试函数中时,所有的 boto3 交互都将与内存中的 S3 版本对话。顺便提一下,如果您想模仿其他 AWS 服务,您只需添加 moto 提供的相应装饰器,您的测试就可以开始了。
我们要做的下一件事是创建一个我们想要定位的桶。从代码中可以看出,我们只是使用了 boto3,就像创建一个真正的 S3 桶一样。
最后,我们调用我们想要测试的函数,并做一些断言。为了给 S3 写信,我们检查是否能在桶中找到文件。我们再次使用普通的 boto3。对于读取,我们检查我们得到的数据帧是否与我们上传的数据帧相同。
就是这样。看起来我们的内存读/写操作像承诺的那样工作。
快乐你好 GIF 摘自 Giphy
我不喜欢测试代码的地方是它显示了相当多的重复。例如,创建存储桶总是相同的操作。此外,对于编写测试的人来说,用测试数据填充桶的代码看起来可以简化。
因为我们不仅是伟大的数据科学家,也是出色的软件开发人员,所以让我们努力让代码干燥并可重用。
让测试代码变干
如前一节所述,我们不想在我们编写的每个测试中重复桶创建代码。这只会让测试变得不必要的冗长,而且需要输入的内容太多。可选地,我希望有可能容易地上传一组数据帧到测试桶。为了简单起见,我将这里的上传限制为数据帧,但是代码可以进一步扩展以更加通用。
让我们从利用一些高级 python 概念来实现我们目标的代码开始。但别担心,我们之后会解剖它。
我在这里添加的是一个类固醇上的 mock_s3 装饰器。我已经将装饰器编写为一个可调用的类,在这里我可以使用神奇的方法__call__
来实现神奇的效果:-)。
使用可调用类,您可以使用括号调用类的创建实例*,并可能传递参数。用代码解释你可以做x = SomeCallableClass(); y = x(1, 2)
。这里要执行的是在__call__
方法中定义的。*
为什么我们需要一个可调用的?我们可以用它来创建一个基于类的装饰器。这允许我们参数化我们的装饰器并保持状态。后者使我们能够在稍后的测试中使用可调用的实例,例如获取创建的 bucket 的名称。
简单地说,__call__
方法包含实际的装饰逻辑。我想我们实际上可以说,是装修工。在那里,内部函数使用mock_s3
装饰器来模拟 S3 连接。这里有这么多装修工人。新的和枯燥的部分是,在执行测试函数之前,我们创建了 bucket,并可选地向它上传一些数据帧。现在,实际的测试函数运行了,带有一个模拟的 S3 连接、一个新模拟的桶和一些数据。任务完成!
最后,让我们看看如何在测试中使用 pimped mocker。
重要的一点是,您首先必须创建的实例,然后使用该实例来修饰您的测试函数。这样,您就可以在测试中访问桶名,而不必使用更多的常量。总的来说,测试代码看起来更干净,更专注于需要测试的东西。
顺便说一下,您看到我已经从功能工具内置模块中添加了另一个装饰器wraps
。这实际上非常重要。没有这一点,失败的断言不会直接指向失败的函数,而是指向装饰器本身。当然没有帮助。此外,如果您在实际的测试函数中使用 pytest fights,那么只有当包装装潢师就位时,它们才能与装潢师一起工作。
包裹
最后,我简要总结了本文的主要观点
- 当处理存储在 AWS S3 中的数据时,请尝试直接在内存中执行所有 IO 操作,而不要遍历中间文件。如果你还没有这样做,我向你展示了如何使用熊猫数据帧的代码。
- 测试您的代码,并使用 moto 测试与 AWS 服务交互的功能。它很容易使用,可以帮助您学习如何使用 boto3。
- 保持代码干燥!也是您的测试代码。它让写作测试更有趣。作为一个 Kickstarter,我给你看了一个干的和丘疹版本的摩托模拟 AWS S3。
谢谢你关注这篇文章。和往常一样,如果有问题、评论或建议,请随时与我联系。期待您的回音!
如何使用诗歌毫不费力地将 Python 包发布到 PyPI
在 10 分钟内分享您有用的 Python 工具
动机
你是否创建了一些有用的函数或类,并在多个项目中反复使用?如果您可以像下面一样在您的任何项目中导入您的有用函数,而不是复制和粘贴相同的代码,这不是很方便吗?
为了让您和其他人可以访问您的包,请发布到 PyPI 。我相信你在尝试安装一些 Python 包的时候一定遇到过 PyPI。任何人都可以上传他们的包到 PyPI,包括你。
你的包上传到 PyPI 需要复杂吗?不要!如果你觉得你的函数有用,很多其他人也会觉得它们有用。
我在 PyPI 上发布了一个包,你也可以!
我喜欢 Rich 中的表类,但是,它不支持我经常使用的 Pandas DataFrame。所以我决定创建自己的类来创建一个生动漂亮的表格,然后发布到 PyPI。
现在,我只需要从 PyPI 安装我的包,而不是使用 220 行代码来创建一个漂亮的数据框架
pip install rich-dataframe
然后使用我创建的函数prettify
美化我在 1 行代码中的数据帧。
瞧啊。
作者 Gif
在本教程中,我将向您展示如何使用诗歌将您的包发布到 PyPI。
创建项目
什么是诗歌?poems是一个 Python 库,它使得管理依赖关系和打包 Python 项目变得简单高效。在这里找到如何安装诗歌的说明。
要创建名为pretty_text
的项目,请键入
$ poetry new pretty_text
如果您已经有一个预先存在的项目,请使用
$ cd pretty_text
$ poetry init
在回答完诗歌提出的所有问题后,我们将把所有这些文件放在我们的pretty_text
目录下!
.
├── pretty_text
│ └── __init__.py
├── pyproject.toml
├── README.rst
└── tests
├── __init__.py
└── test_pretty_text.py
以及pyproject.toml
中关于我们套餐的所有信息!
从文件中我们可以看到,安装这个包的要求是 3.7 以上。接下来,我们需要为我们的包安装更多的库。但在此之前,让我们先激活虚拟环境。
激活虚拟环境并安装依赖项
什么是虚拟环境?虚拟环境是一种工具,有助于将不同项目所需的依赖关系分开。为不同的项目创建不同的虚拟环境是一个很好的实践。
诗歌使得用一个命令创建和激活虚拟环境变得容易
$ poetry shell
酷!现在我们已经准备好为我们的包安装依赖项了。要安装 pyfiglet,请使用poetry add <package>
$ poetry add pyfiglet
现在已经安装了 pyfiglet 及其依赖项。与使用 pip 相比,使用诗歌安装库的惊人之处在于,你将只能看到你在pyproject.toml
安装的包
随 pyfiglet 安装的其他依赖项将保存在poetry.lock
中。poetry.lock
列出了所有依赖项的确切版本,以确保使用你的项目的每个人的包版本是一致的。
使用相同的命令安装 termcolor:
$ poetry add termcolor
添加包的内容
在pretty_text/pretty_text
目录下为您的包添加其他文件:
$ touch pretty_text/pretty.py
现在,您的目录应该如下所示:
.
├── poetry.lock
├── pretty_text
│ ├── __init__.py
│ └── pretty.py
├── pyproject.toml
├── README.rst
└── tests
├── __init__.py
└── test_pretty_text.py
将下面的代码添加到pretty.py
:
要运行脚本,请结合使用poetry run
和python pretty.py
命令:
$ poetry run python pretty_text/pretty.py
酷!我们的功能有效!
缩短导入语句
让我们通过将我们的函数导入根目录中的另一个文件来进行测试。
$ touch example.py
您的目录结构应该如下所示
├── example.py
├── pretty_text
├── __init__.py
├── pretty.py
在文件example.py
中,我们导入并使用我们的函数:
我们运行时没有错误。然而,对于我们的用户来说,键入from pretty_text.pretty import pretty_text
来访问我们的包是相当冗长的。我们能缩短这个吗?
肯定!只需从文件pretty_text/__init__.py
中的pretty
导入函数pretty_text
现在可以直接从pretty_text
导入函数pretty_text
!
发布您的包
在发布您的包之前,在 PyPI 上注册一个帐户。然后简单地输入
$ poetry build
您应该会看到如下所示的内容。这将构建源代码和轮子档案。
请注意,与最初的方法相比,使用诗歌可以更容易地设置您的包。
要发布,请键入:
$ poetry publish
搞定了。现在这个包在 PyPI 上可用!
现在我们可以使用
pip install pretty-text
而且很管用!您现在应该能够导入并使用它了:
我们的 PyPI 网站看起来有点无聊。让我们给它添加一些相关的链接、描述和图片。
让你的包裹看起来很专业
创建指向源代码的链接
如果我们希望其他人看到您的代码并为其做出贡献,我们可能希望为您的包创建一个 Github 存储库。首先在 Github 上创建一个名为pretty-text
的新存储库。然后在我们的项目中添加一个新的遥控器。
使用。gitignore 忽略一些不应该提交给 Github 的包。然后提交并将我们的更改推送到 Github。
创建描述
给README.md
添加一些描述和图片
更新您的版本
将描述、存储库、自述文件和关键字添加到pyproject.toml
注意我们还想在version
里把旧版本换成新版本。
更新并发布
要更新和发布您的 repo,请键入与前面相同的命令:
$ poetry build
$ poetry publish
现在再次查看我们的包的网站。
作者图片
看起来好多了!
结论
恭喜你!您刚刚学习了如何使用诗歌创建自己的包。请注意,您可以用这 5 个命令将您的包发布到 PyPI:
poetry init
poetry shell
poetry add <package>
poetry build
poetry publish
很酷,不是吗?创造出别人能用的东西是一种很好的感觉。我希望通过发布您的软件包,您会经历同样的事情。
如果你想用一行代码创建漂亮的熊猫数据帧输出,请点击这里查看我的富数据帧包:
https://github.com/khuyentran1401/rich-dataframe
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 T2 Twitter 上与我联系。
星这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如: