TowardsDataScience 博客中文翻译 2020(二百八十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

数据湖之上的数据库第二部分

原文:https://towardsdatascience.com/databricks-delta-lake-database-on-top-of-a-data-lake-part-2-f44e44f51a63?source=collection_archive---------32-----------------------

第 2 部分,共 2 部分——了解 Databricks Delta Lake 的基础知识——分区、模式演变、数据沿袭和真空

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由皮克斯拜的 Gerd Altmann 提供

在第 1 部分中,我们探讨了 Delta Lake 特性(如 ACID 事务、检查点、事务日志和时间旅行)如何对变更数据捕获、处理和管理产生积极影响。在本文中,我们将继续推进我们对一些高级特性的理解,比如分区、模式演化、数据沿袭和真空

数据起源/数据血统

从摄取到管理和转换数据经历了一个旅程。这个旅程被称为 adT5 数据血统。如今,监管机构对跟踪和审计数据实施了非常严格的指导方针。因此,验证数据沿袭是满足法规遵从性和治理要求的关键活动。

Delta Lake 将每次写入表的数据沿袭信息存储 30 天。

$ git clone [https://github.com/mkukreja1/blogs.git](https://github.com/mkukreja1/blogs.git)

完整的笔记本可从**/delta _ lake/delta _ lake-demo-2 . ipynb 获得。**让我解释一下下面的每个步骤:

deltaTable = DeltaTable.forPath(spark, "hdfs:///delta_lake/products")df_history = deltaTable.history()
df_history.show(20, False)+-------+-----------------------+------+--------+----------------------+-------------------------------------------------------------------------+----+--------+---------+-----------+--------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
|version|timestamp              |userId|userName|operation             |operationParameters                                                      |job |notebook|clusterId|readVersion|isolationLevel|isBlindAppend|operationMetrics                                                                                                                                                                                           |userMetadata|
+-------+-----------------------+------+--------+----------------------+-------------------------------------------------------------------------+----+--------+---------+-----------+--------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
|12     |2020-09-01 16:48:45.792|null  |null    |UPDATE                |[predicate -> (ProductID#529 = 270)]                                     |null|null    |null     |11         |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0]                                                                                                                        |null        |
|11     |2020-09-01 16:48:43.906|null  |null    |UPDATE                |[predicate -> (ProductID#529 = 280)]                                     |null|null    |null     |10         |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0]                                                                                                                        |null        |
|10     |2020-09-01 16:48:41.15 |null  |null    |UPDATE                |[predicate -> (ProductID#529 = 260)]                                     |null|null    |null     |9          |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0]                                                                                                                        |null        |
|9      |2020-09-01 16:48:39.497|null  |null    |UPDATE                |[predicate -> (ProductID#529 = 200)]                                     |null|null    |null     |8          |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0]                                                                                                                        |null        |
|8      |2020-09-01 16:48:37.695|null  |null    |UPDATE                |[predicate -> (ProductID#529 = 240)]                                     |null|null    |null     |7          |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0]                                                                                                                        |null        |
|7      |2020-09-01 16:48:35.437|null  |null    |UPDATE                |[predicate -> (ProductID#529 = 220)]                                     |null|null    |null     |6          |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0]                                                                                                                        |null        |
|6      |2020-09-01 16:48:33.499|null  |null    |UPDATE                |[predicate -> (ProductID#529 = 250)]                                     |null|null    |null     |5          |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0]                                                                                                                        |null        |
|5      |2020-09-01 16:48:31.559|null  |null    |UPDATE                |[predicate -> (ProductID#529 = 210)]                                     |null|null    |null     |4          |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0]                                                                                                                        |null        |
|4      |2020-09-01 16:48:29.492|null  |null    |UPDATE                |[predicate -> (ProductID#529 = 230)]                                     |null|null    |null     |3          |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0]                                                                                                                        |null        |
|3      |2020-09-01 16:48:26.544|null  |null    |MERGE                 |[predicate -> (products.`ProductID` = products_new.`ProductID`)]         |null|null    |null     |2          |null          |false        |[numTargetRowsCopied -> 0, numTargetRowsDeleted -> 0, numTargetFilesAdded -> 10, numTargetRowsInserted -> 5, numTargetRowsUpdated -> 4, numOutputRows -> 9, numSourceRows -> 9, numTargetFilesRemoved -> 1]|null        |
|2      |2020-09-01 16:48:19.493|null  |null    |DELETE                |[predicate -> ["(`ProductID` = 210)"]]                                   |null|null    |null     |1          |null          |false        |[numRemovedFiles -> 1, numDeletedRows -> 1, numAddedFiles -> 1, numCopiedRows -> 4]                                                                                                                        |null        |
|1      |2020-09-01 16:48:12.635|null  |null    |UPDATE                |[predicate -> (ProductID#529 = 200)]                                     |null|null    |null     |0          |null          |false        |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 4]                                                                                                                        |null        |
|0      |2020-09-01 16:47:31.819|null  |null    |CREATE TABLE AS SELECT|[isManaged -> false, description ->, partitionBy -> [], properties -> {}]|null|null    |null     |null       |null          |true         |[numFiles -> 1, numOutputBytes -> 1027, numOutputRows -> 5]                                                                                                                                                |null        |
+-------+-----------------------+------+--------+----------------------+-------------------------------------------------------------------------+----+--------+---------+-----------+--------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+ 

不需要担心数据审计,因为对数据的每一次更改都有完整的更改审计跟踪作为备份。

简单看一下表上的最后一个操作如下:

df_lastOperation = deltaTable.history(1)
df_lastOperation.show()+-------+--------------------+------+--------+---------+--------------------+----+--------+---------+-----------+--------------+-------------+--------------------+------------+
|version|           timestamp|userId|userName|operation| operationParameters| job|notebook|clusterId|readVersion|isolationLevel|isBlindAppend|    operationMetrics|userMetadata|
+-------+--------------------+------+--------+---------+--------------------+----+--------+---------+-----------+--------------+-------------+--------------------+------------+
|     12|2020-09-01 16:48:...|  null|    null|   UPDATE|[predicate -> (Pr...|null|    null|     null|         11|          null|        false|[numRemovedFiles ...|        null|
+-------+--------------------+------+--------+---------+--------------------+----+--------+---------+-----------+--------------+-------------+--------------------+------------+

模式演变——检测和适应模式变化

一直在创建数据管道的人肯定会对这个问题感兴趣。我们使用通常在项目开始时提供给我们的给定模式来创建和部署管道。在一段时间内,一切都很好,直到有一天管道出错。原来传入文件的模式已经改变。就我个人而言,我已经多次被同一个问题所困扰。在我的第一次攻击中,数据遭到了大范围的破坏,因为我们没有在破坏数据之前发现它。我仍然记得我们不得不花费无数的时间来处理损坏——修复代码和回溯数据。

那天我学到了重要的一课— 在接收数据之前验证模式。这是以后另一篇文章的主题。现在,让我们把注意力集中在三角洲湖如何能有所帮助。

Delta Lake 可以通过在写入时执行模式验证来保护数据。那是什么意思?

  1. 这意味着在写入时,新输入数据的模式会与过去的数据进行比较。
  2. 如果发现差异,则取消事务—没有数据写入存储—为用户引发异常。现在让我们来看看它的运行情况。这是我们之前摄取的最后一个文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

产品 _aug21.csv

这是第二天的新文件。请注意,文件的模式已经更改,添加了新的列数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

产品 _aug22.csv

让我们回顾一下 pypark 代码:

df_productsaug22 = spark.read.csv('hdfs:///delta_lake/raw/products_aug22.csv', header=True, inferSchema=True)
df_productsaug22.show()deltaTable = DeltaTable.forPath(spark, "hdfs:///delta_lake/products")df_productsaug22.write.format("delta").mode("append").save("hdfs:///delta_lake/products")AnalysisException                         Traceback (most recent call last)
<ipython-input-15-85affcb142df> in <module>
----> 1 df_productsaug22.write.format("delta").mode("append").save("hdfs:///delta_lake/products")

/opt/spark/python/pyspark/sql/readwriter.py in save(self, path, format, mode, partitionBy, **options)
    825             self._jwrite.save()
    826         else:
--> 827             self._jwrite.save(path)
    828 
    829     @since(1.4)

~/.local/lib/python3.6/site-packages/py4j/java_gateway.py in __call__(self, *args)
   1303         answer = self.gateway_client.send_command(command)
   1304         return_value = get_return_value(
-> 1305             answer, self.gateway_client, self.target_id, self.name)
   1306 
   1307         for temp_arg in temp_args:

/opt/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
    135                 # Hide where the exception came from that shows a non-Pythonic
    136                 # JVM exception message.
--> 137                 raise_from(converted)
    138             else:
    139                 raise

/opt/spark/python/pyspark/sql/utils.py in raise_from(e)

**AnalysisException: A schema mismatch detected when writing to the Delta table** (Table ID: 320f5591-72dd-4f4c-bdac-38f560e90dba).
To enable schema migration using DataFrameWriter or DataStreamWriter, please set:
'.option("mergeSchema", "true")'.
For other operations, set the session configuration
spark.databricks.delta.schema.autoMerge.enabled to "true". See the documentation
specific to the operation for details.

Table schema:
root
-- ProductID: integer (nullable = true)
-- Date: string (nullable = true)
-- Price: double (nullable = true)

Data schema:
root
-- ProductID: integer (nullable = true)
-- Date: string (nullable = true)
-- Price: double (nullable = true)
-- Quantity: integer (nullable = true)

         ;

Delta Lake 立即拒绝新文件,因为模式不匹配。相当酷。

如果您对新列没有意见,也就是说,即使存在模式不匹配,您也希望接收数据,那会怎么样呢?使用 option("mergeSchema “,” true ")进行如下操作。

df_productsaug22.write.format("delta").mode("append").option("mergeSchema", "true").save("hdfs:///delta_lake/products")spark.table("products").show()+---------+----------+------+--------+
|ProductID|      Date| Price|Quantity|
+---------+----------+------+--------+
|      200|2020-08-22|  25.5|       2|
|      210|2020-08-22|  46.0|       5|
|      220|2020-08-22| 34.56|       6|
|      230|2020-08-22| 23.67|      11|
|      200|2020-08-20|  25.5|    null|
|      250|2020-08-21| 99.76|    null|
|      230|2020-08-20| 23.67|    null|
|      210|2020-08-21|  46.0|    null|
|      220|2020-08-20| 34.56|    null|
|      260|2020-08-21| 64.55|    null|
|      280|2020-08-21| 54.78|    null|
|      270|2020-08-21|106.32|    null|
|      240|2020-08-20|100.82|    null|
+---------+----------+------+--------+

新列现在是三角洲湖元数据的一部分。注意,数量数据为以前的数据(< 2020–08–22) has been set to )null。

分割

为了显著提高 Delta Lake 中的查询性能,您应该考虑创建一个按列分区的表。选择正确的分区柱非常重要。

  1. 选择具有低基数的列,如 date,绝对不要选择顺序 ID 列
  2. 选择大小均匀且数据量大(希望大于 1 GB)列
df_productsaug_partition = spark.read.csv('hdfs:///delta_lake/raw/*.csv', header=True, inferSchema=True)df_productsaug_partition.write.format("delta").partitionBy("Date").option("path", "hdfs:///delta_lake/products_p").saveAsTable("products_p")$ hadoop fs -ls /delta_lake/products_p
Found 4 items
drwxr-xr-x   - mkukreja supergroup          0 2020-09-01 17:19 /delta_lake/products_p/**Date=2020-08-20**
drwxr-xr-x   - mkukreja supergroup          0 2020-09-01 17:19 /delta_lake/products_p/**Date=2020-08-21**
drwxr-xr-x   - mkukreja supergroup          0 2020-09-01 17:19 /delta_lake/products_p/**Date=2020-08-22**
drwxr-xr-x   - mkukreja supergroup          0 2020-09-01 17:19 /delta_lake/products_p/_delta_log

请注意,Delta Lake 已经基于日期列创建了一个分区文件夹结构。

真空

Delta Lake 实现了数据版本化,因此它可以按需提供旧版本的数据。随着时间的推移,存储同一数据的多个版本可能会变得非常昂贵。因此,Delta Lake 包含了一个叫做真空的清理机制,可以删除旧版本的数据。

deltaTable.vacuum()

我希望这篇文章是有帮助的。三角洲湖作为大数据 Hadoop、Spark & Kafka 课程的一部分,由 Datafence 云学院提供。课程是周末自己在网上教的。

DataCamp —您使用它的方式正确吗?

原文:https://towardsdatascience.com/datacamp-are-you-using-it-the-right-way-5ae139f5ad59?source=collection_archive---------26-----------------------

这就是如何使用 DataCamp 平台最大化您的数据科学学习。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯里德在 Unsplash 上的照片

我们每天产生大约 2.5 万亿字节,对数据科学家的需求比以往任何时候都要多。毕竟,许多平台都在提供让你为数据科学职业做准备的课程,这并不奇怪!到目前为止,我最喜欢的是数据营。但是你使用平台的方式正确吗?

从高质量的内容到用户友好的界面,该平台拥有您开始掌握该领域基础知识所需的一切。以下是您应该牢记的一些事情,以最大限度地提高您的学习效果,并充分利用平台体验。

“职业轨迹”很棒!但是不要错过那些隐藏在“课程”部分的宝石。

难道你不喜欢大多数数据科学平台为用户精心定制的职业轨迹吗?无论你是渴望成为 Python 数据科学家、数据工程师还是 R 数据分析师,DataCamp 都会精心挑选渐进课程,为你构建一条“轨迹”(或其他平台所谓的“路径”)。你开始以线性的方式学习,在大约 26 门课程后,你完成了你选择的轨道。你也获得了证书!

但这就够了吗?肯定不是!该平台非常清楚需要其他课程来补充这些课程。假设你作为一名 Python 数据科学家选择了(就像我们许多人刚刚开始做的那样)一个方向。策划的轨道为您提供一切,从 Python 编程语言的介绍,到数据操作和清理,到一些机器学习课程等…

您最终错过的是一些更高级和更有针对性的课程,这些课程隐藏在“课程”选项卡中,在策划的课程之外!像“Python 深度学习入门”、“Python 自然语言处理入门”、“Python Dask 并行编程”、“Python 可视化地理空间数据”、“Python Keras 图像处理”、“Python 数据科学家软件工程”等课程,以及大量其他内容丰富且非常必要的课程,以便更全面地了解该领域。

学习很棒!但是你每天都在应用你所学的一切吗?

被动地坐以待毙,吸收新信息,这是非常危险的(所有学习平台都有这种危险)。你在看视频讲座吗?每次看完视频后,你会尝试编码练习吗?正在将你在别处学到的方法和技术应用到你正在做的数据集和附带项目中吗?你是在尝试向朋友或精通数据的同事解释你刚刚学到的概念吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

粘土银行Unsplash 拍摄的照片

如果你想确保你的学习是积极的、有目的的,这些都是你应该经常问自己的问题。毕竟,你知道多少熊猫的技术和技巧并不重要!重要的是,在你的计划中,有多少是可以用在正确的地方和环境中的。永远记住,学习一件事的最好方法是继续尝试向别人解释它。

现在就开始使用 DataCamp 的指导项目构建投资组合

比特币加密货币市场让你着迷吗?有没有想过做《权力的游戏》的网络分析?也许你是一个棒球迷或音乐家,想探索这些主题的数据集?嗯,DataCamp“项目”部分有适合每个人的东西!

这些指导性的项目是无价的,可以让你感觉到应用你实际学到的东西意味着什么。他们也为你在工作中独立工作做好准备(提供指导)!这不是很好吗?我的建议是不要跳过在一个选定的轨道内的课程之间穿插的项目。事实上,我会更进一步。完成这些,并在“项目”标签中查看其他项目,这样你就可以得到一些实践!

哦,说到练习,我有没有告诉你这个平台有一个“练习”部分,我的大多数朋友甚至不知道它的存在/曾经使用过?

用数据营的 MCQ 的做法来保持数据敏锐!

我认为这个功能(在移动应用程序上也有)绝对是无价的。我喜欢休息,在我的手机上加载应用程序,并完成平台上几乎每门课程的几个选择题!这些非常有趣,可以确保你学到的东西保持新鲜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·斯皮斯克Unsplash 上拍摄

练习!练习!练习!这些 MCQ 很有趣,内容丰富,写得很好,是你在练习的课程中学到的概念的很好的总结!每堂练习课都以复习使用简单抽认卡制作的基础课程概念开始。然后你开始回答关于课程主题的问题。为了增加乐趣。你积累(我喜欢认为这是胜利)XPs!你可以根据自己的需要多次重复练习,以确保你理解了所有问题的答案。

不确定您的数据科学技能提高了多少?不要错过尝试 DataCamp 评估的机会!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安妮·斯普拉特Unsplash 上拍摄

我要提到的最后一个我非常喜欢在他们平台上使用的功能是“评估”功能。你不仅可以通过评估或多或少地了解自己目前的状况,还可以定期进行评估,不断检查自己进步了多少。

甚至更好?评估是自适应的,并根据您的技能水平和您提供的答案进行相应的调整。

我发现这也是为一些技术评估做好准备,当你开始找工作和准备获得第一份数据科学工作时,公司会让你完成这些评估。

这是一个在这个领域找到工作并拥有数据仓库来为我们能让这个世界变得更好的无数方法做出贡献的最佳时机。

感谢 DataCamp 团队启动了许多人的数据科学之旅!

如果有兴趣阅读我的更多故事,请阅读一本关于培养习惯的书如何帮助我更有效地学习数据科学:

[## Python 数据结构:学习算法的入门工具包

数组、链表、栈、队列和哈希表。

towardsdatascience.com](/python-data-structures-your-starter-kit-to-learning-algorithms-f8993039b86) [## 一本关于培养习惯的书如何帮助我更有效地学习数据科学

作为一名数据科学家,我从 James Clear 的原子习惯中学到了什么

towardsdatascience.com](/how-a-book-about-building-habits-helped-me-learn-data-science-more-effectively-b176e2fd572f)

比较托管机器学习平台

原文:https://towardsdatascience.com/dataiku-vs-alteryx-vs-sagemaker-vs-datarobot-vs-databricks-b3870bd34813?source=collection_archive---------10-----------------------

data iku vs . alter yx vs . Sagemaker vs . data robot vs . data bricks

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Alteryx 和 Databricks 处于领先地位,并且仍在不断普及。来源:作者

什么是托管机器学习平台?

代码只是任何机器学习解决方案的一小部分。通常,公司必须使用不同的工具和服务来端到端地管理机器学习解决方案,包括:

  • 计算服务整理数据,训练机器学习模型;
  • 数据管理清理、修改、跟踪和保护数据的工具;
  • 软件工程编写和维护代码的工具;
  • 仪表板工具与解决方案互动并查看结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

托管机器学习服务的四个核心组件。来源:作者

托管机器学习服务的目标是将这些组件集中到一个打包的解决方案中。

但并不是所有的托管机器学习服务都是完全可比的。像 AWS Sagemaker 这样的工具可以帮助你管理任何机器学习解决方案中固有的复杂性,但仍然希望你的团队中有能够构建和理解代码的工程师。这些工具更侧重于计算层。像 Alteryx 这样的工具更专注于表示层,他们试图隐藏的复杂性,提供无代码的用户界面来集成基本的机器学习。

更一般地说,这些平台通常集成了仪表板工具和/或工作流程编排工具,我们在之前的文章中已经比较过了。所以像 Alteryx 这样的工具可以被认为是一个更高层次的抽象,与直接使用低级工具相比,以牺牲灵活性为代价实现了更多的统一。

我们比较了最受欢迎的托管平台,以帮助您做出明智的选择,选择最适合您的平台。

告诉我用哪一个

和往常一样,“视情况而定”——但是如果你在寻找一个快速的答案,你可能应该使用:

  • 如果您还没有自己的一套开发、编排和机器学习工具,并且想要一个预定义的一体化解决方案。你的团队需要有一些技术知识,但不一定主要由软件工程师组成。
  • 如果您专注于市场营销和分析,并且希望在不编写代码的情况下访问机器学习和数据管理。
  • Knime 如果你想要一个不太贵、不太精致但更灵活的 Alteryx 版本。
  • Sagemaker 如果你的团队有工程知识,但希望在你的机器学习基础设施上有更高层次的抽象。
  • Datarobot 如果您将数据存储在电子表格中,并希望以最简单(但最不灵活)的方式运行预测分析。
  • 如果您已经投资了 Apache Spark 作为一个平台,并且正在寻找一种更简单的方式来运行它。

【还要不要更多这样的文章?注册我们的每周简讯。]

快速概述

在我们进入详细的比较之前,这里有一个每个平台的快速概述。

  • Dataiku 是一个跨平台的桌面应用程序,包括广泛的工具,如笔记本(类似于 Jupyter Notebook)、工作流管理(类似于 Apache Airflow)和自动机器学习。总的来说,Dataiku 的目标是取代你现有的许多工具,而不是与它们集成。
  • Alteryx 是一个专注于分析的平台,与 Tableau 等仪表板解决方案更具可比性,但包括集成的机器学习组件。它专注于为机器学习、高级分析和其他通常需要代码的组件提供无代码替代方案
  • Knime 类似于 Alteryx,但是它有一个开源的自托管选项,并且它的付费版本更便宜。它包括机器学习组件和模块化设计的分析集成。
  • Datarobot 专注于自动化机器学习。你以类似电子表格的格式上传数据,它会自动找到一个好的模型和参数来预测特定的列。
  • Databricks 主要是一个托管的 Apache Spark 环境,它还包括与 MLFlow 等工具的集成,用于工作流编排。
  • Sagemaker 专注于抽象出训练和服务模型所需的基础设施,但现在还包括自动驾驶(类似于 Datarobot)和 Sagemaker Studio (类似于 Dataiku)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

我们根据几个标准给每个图书馆打了大致的分数:

  • **成熟度:**存在多久了,有多稳定。
  • **受欢迎程度:**有多少人在谷歌上搜索该工具。
  • **广度:**工具是否有特定的侧重点或者试图做到全部。

这些不是严格或科学的基准,但它们旨在让您快速了解这些工具是如何重叠的,以及它们有什么不同。有关更多详细信息,请参见下面的一对一比较。

达泰库对奥特里克斯

Dataiku 和 Alteryx 都是托管的机器学习平台,但 Dataiku 侧重于工程方面,而 Alteryx 侧重于分析和演示。

Dataiku 提供了 Data Science Studio (DSS),这是一个跨平台的桌面应用程序,包括一个供工程师编写代码的笔记本(类似于 Jupyter 笔记本)和一个管理数据和任务的工作流编排工具(类似于 Apache Airflow)。虽然它提供了一些用户界面,但仍然强调编写代码。相比之下,Alteryx 提供了更好的仪表板体验,但灵活性较差:在 Alteryx 中,您使用 UI 来创建无代码的机器学习组件。

  • 如果您的团队是技术性的,并且您希望您的数据科学家、工程师和分析师都使用相同的工具,请使用 Dataiku
  • 如果您的团队技术含量较低,并且您希望使用预建组件进行高级分析,请使用 Alteryx

Dataiku vs. Databricks

Dataiku 和 Databricks 都旨在让数据科学家、工程师和分析师使用一个统一的平台,但 Dataiku 依赖于自己的定制软件,而 Databricks 则集成了现有的工具。Databricks 充当了 Apache Spark 、AWS 或 Azure 和 MLFlow 之间的粘合剂,并提供了连接这些组件的集中接口。

Dataiku 是一个更高级的工具,集成了 Tensorflow 等机器学习库和 AutoML 接口,可以对电子表格格式的数据进行机器学习。

  • 如果您喜欢管理自己的基础设施,但希望有一个平台来管理您的机器学习管道和分析,请使用 Dataiku
  • 如果您想要一个平台来管理您的基础设施,并且您对 Apache Spark 很熟悉,那么请使用 Databricks

数据机器人大战数据机器人

Datarobot 和 Dataiku 都提供了 AutoML:一个无代码的机器学习平台,你可以将数据上传为电子表格,选择目标变量,并让平台为你选择和优化机器学习模型。

值得注意的是,这是 Datarobot 的核心焦点,但它只是 Dataiku 的一个组件,data iku 还提供了一整套数据科学工具,包括 IDE、任务协调器和可视化工具。

  • 使用 Datarobot 如果您有现有的干净数据集,并且希望使用预定义的机器学习模型来分析您的数据,不需要任何工程技能。
  • 如果你需要更灵活的东西来帮助你设计和构建你自己的定制机器学习模型,请使用 Dataiku

达泰库对萨格马克

Dataiku 专注于为数据科学家和工程师提供编码和分析工具,而 Sagemaker 专注于底层基础设施:运行和服务这些模型的服务器。Dataiku 为提供了对 Sagemaker 的集成,但 Sagemaker 也在发布与 Dataiku 直接竞争的工具: Sagemaker StudioSagemaker Autopilot

您可以结合使用这些平台,使用 Dataiku 来构建和管理您的模型,使用 Sagemaker 来培训和服务它们,或者您可以使用 Sagemaker 做任何事情。

  • 如果您需要一个更成熟的平台,专注于用户界面和用户体验,一个您的工程师和分析师都可以使用的平台,请使用 Dataiku
  • 使用 Sagemaker 如果你的工程师比分析师多,你需要更大的灵活性,你不介意界面还在迭代,缺乏润色。

Alteryx vs. Datarobot

Alteryx 是一个更广泛的解决方案,提供分析、数据管理和仪表板组件以及无代码机器学习。Datarobot 对无代码机器学习的关注范围更窄。

  • 如果您的重点是数据和分析,并且您需要一个适用于整个组织的平台,请使用 Alteryx
  • 如果您有一个现有的数据集,并且希望使用预定义和精选的机器学习模型来分析它,请使用 Datarobot

Alteryx 对 Knime

Alteryx 和 Knime 是类似的工具,它们的功能在很大程度上是重叠的。Alteryx 更商业化,只提供付费平台,而 Knime 也有免费的开源选项。Knime 缺少 Alteryx 的一些优点,但是它提供了更多的灵活性。

  • 如果你的团队中业务分析师多于工程师,并且你需要精致的报告和仪表板,那么使用 Alteryx 。
  • 如果你预算有限,而且灵活性对你来说比表达更重要,那就使用 Knime 。

Sagemaker vs. Databricks

Sagemaker 为您提供了一种在 AWS 基础设施上使用各种机器学习框架来部署和服务您的机器学习模型的方法。Databricks 让您可以在 Apache Spark 集群上运行 Jupyter 笔记本电脑(而 Apache Spark 集群又可以在 AWS 上运行)。

Databricks 专注于大数据分析,让您可以在计算集群上运行数据处理代码。Sagemaker 专注于实验跟踪和模型部署。这两种工具都允许数据科学家在熟悉的笔记本环境中编写代码,并在可扩展的基础设施上运行。

  • 如果您需要一个通用平台来开发、训练、部署和服务您的机器学习模型,请使用 Sagemaker
  • 如果你特别想用 Apache Spark 和 MLFlow 来管理你的机器学习管道,就用 Databricks

Sagemaker vs. Datarobot

Sagemaker 包括 Sagemaker 自动驾驶,类似于 Datarobot。这两个工具都允许您上传电子表格格式的简单数据集,选择目标变量,并让平台自动运行实验,为您的数据选择最佳的机器学习模型。

因为这个所谓的“AutoML”是 Datarobot 的核心焦点,Datarobot 已经策划和调整了比 Sagemaker 更广泛的模型库。因此,在这个特定的用例中,Sagemaker 仍在追赶 Datarobot,但总的来说,Sagemaker 是一个功能更全、更灵活的平台,用于模型构建、部署、服务和实验跟踪。

  • 如果你需要一个包含 AutoML 的更灵活的平台,使用 Sagemaker 。
  • 如果你想要一个更简单的平台,拥有更精确、随时可用的模型,请使用 Datarobot

结束语

如果你访问这些平台的任何一个网站,你会看到他们大言不惭地宣称它们有多么强大,多么容易使用。请记住,它们都旨在解决非常困难的问题,加入其中任何一个都可能是一个漫长而昂贵的过程,需要克服一些障碍。

所有这些工具和服务都旨在提供数据处理、机器学习和分析的捷径。但这意味着它们也比你想象的更加严格。如果机器学习是你业务的核心,那么建立你自己的管道通常仍然是最好的选择。有许多优秀、成熟的开源平台可以用来构建完全定制的解决方案。

这些托管的机器学习平台销售的概念是,非技术人员可以在没有工程师的情况下构建机器学习解决方案。但在实践中,通常是经验丰富的机器学习工程师最成功地使用这些工具和服务。对底层系统和权衡有深刻理解的人可以使用托管平台作为构建概念证明的捷径;因为他们了解该工具旨在简化的过程,他们知道如何有效地使用它。但是那些没有这种经验的人经常发现托管平台太有限,不能满足他们的确切需求,并且对于非技术团队成员来说太复杂,不容易使用。

如果你正在研究机器学习问题,需要帮助,联系我们

数据主义世界——大数据和数据主义时代

原文:https://towardsdatascience.com/dataistic-world-the-age-of-big-data-and-dataism-7ddac8897a53?source=collection_archive---------48-----------------------

意见

虽然大数据看似让收集更多数据以发现更多有用信息成为可能,但事实是,更多数据并不一定意味着更多有用信息。

人工智能最近的快速发展,在很大程度上归功于大数据,增强了人们对数据及其基于数据的机器学习算法的信心。支持大数据的最知名技术之一是大数据分析形式的人工智能(AI)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

能够处理今天巨大数据流的算法直接从数据中提取信息和知识。此外,机器生成的信息或知识被认为比人类思维更加透明和可靠。空前数量的数字数据正以手机、平板电脑、电脑和其他数字设备的形式存储。大数据—支持技术使我们能够搜索和分析它们,从而建立联系并产生我们以前无法获得的洞察力。

现在,要分析的数据不仅很大,而且由各种类型的数据组成,包括流数据(67%)。大数据有许多影响,可能会改变统计数据分析的方法。首先,构建者和用户不再局限于单个数据源,比如数据库服务器。这种全新的分析类别意味着世界正在发生变化,但不仅仅是在数据收集和分析以及数据处理方面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在数据主义的世界观中,人类的经验能够产生数据,这些数据可以放在一起向数据流致敬。对于数据专家来说,数据和算法被注入了处理数据和寻找意义的高级工具。2013 年,大卫·布鲁克斯在《纽约时报》上总结并首次使用了大数据的新兴意义。然而,在 2016 年,尤瓦尔·诺亚·哈拉里(Yuval Noah Harari)在他的著作《德乌斯人:明日简史》(Homo Japan:A Brief History of Tomorrow)中扩大了对它的描述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 Matveydar——自己的作品,CC0,https://commons.wikimedia.org/w/index.php?curid=85041358

越来越多的设备连接到互联网,并被设计为不断地生成和来回发送数据。不可否认的是,社会正在走向一个数据流不断增长和扩大的世界。任何类型的网络公司都声称有权跟踪、收集、分析、货币化和出售网站上的用户行为数据,这已经成为常态。例如,脸书、Google +、Twitter、Facebook Messenger 或谷歌地图等常规应用程序需要用户在线并分享他们的位置数据才能运行。

大量的数据和信息被生成和共享,各种各样的社交媒体平台参与其中。真实的或欺诈性的网络机构通过诱惑渴望点击的广告商,找到将故事带入主流的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如今,简单地问数据显示了什么似乎数据可以取代思维已经变得时髦得多。如果算法已经知道我们在想什么,想要什么,需要什么,为什么还要麻烦政客和代议制政府?我们的代议制民主输给了技术宗教,这可能正是恢复代议制民主的防御所需要的震动。

技术必然性将质疑和限制技术发展等同于阻碍社会本身的繁荣。技术沙文主义声称技术带来了社会和经济性质的一切,无论是社会的还是经济的,它总是改善人们的生活。它以代议制民主为前提,有不寻常的分散的既得利益和抽象的意见,更不用说自由开放的社会了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那些相信科学已经向我们展示了我们继承了我们的生物学的人也持有类似的观点。他们认为有机体只是一个数据处理系统,一个在我们的社会中无处不在的算法,他们描述了这种控制是如何发生的。

这导致许多人预测,机器将很快取代目前由人类执行的认知任务。鉴于这种预测被广泛接受,在我们的社会中,信心和对数据的依赖正在增加也就不足为奇了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然它的起源模糊不清,但这种层次结构仍然是想象大数据时代正在收集和使用的信息的良好起点。大数据是同一个主题的变体,多年来一直从事数据工作的人已经明白这一点。即使大数据似乎可以收集更多的数据来找到更多有用的信息,但事实是,更多的数据并不一定意味着更多的有用信息。

数量、速度和多样性带来了技术挑战和解决方案,使我们能够访问比几年前想象的更多的信息。虽然技术和工具强大多了,数据还是数据,只是换了一种方式是数据。现在应该很明显,大数据和人工智能具有更高的道德价值。我不相信,经过仔细考虑后,人们会给一个算法政治权力,即使是一个掩盖其进展的算法。在未来,我们可能不像所有技术精英那样聪明,但我们肯定会比他们聪明。

引用来源

数据湖文件摄取:从 FTP 到 AWS S3

原文:https://towardsdatascience.com/datalake-file-ingestion-from-ftp-to-aws-s3-253022ae54d4?source=collection_archive---------9-----------------------

使用 Python 中的 Paramiko 将文件从 FTP 服务器传输到 AWS s3

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大家好。在开发 Datalake 管道时,数据接收是整个过程中的一个重要步骤。我们需要一个可靠,安全和容错的方法来把我们的文件从源(客户端 FTP 服务器)到我们的目标(AWS S3)。考虑到这一步的重要性,我用 python 开发了一个实现,可以用来将文件从 FTP 服务器接收到 AWS s3。我以这样的方式设计代码,它可以在托管(AWS Glue)或未托管(本地机器)环境中使用,以将文件从 FTP 服务器传输到 AWS s3。

在本文中,我将解释如何使用 Python 中的 Paramiko 库将存在于 FileZilla 等 FTP 服务器上的文件传输到 Amazon s3。

文件摄取代码可以在我的 GitHub 中找到。文件接收代码执行以下操作:

  • 使用 Paramiko 创建与文件服务器的安全 ssh SFTP 连接。
  • 根据文件大小自动处理单部分和多部分上传(多部分在 100MB 或以上)。
  • 在多零件上传期间,如果零件上传失败,会自动处理报废。
  • 基于当前年、月、日、小时对 s3 中的数据进行分区。
  • 确保哪个文件已经上传
  • 可以在 AWS Glue 中用作 python 作业,使用 AWS Glue 将文件从 FTP 传输到 S3。

为了更好地理解,我将一步一步地介绍代码的每一部分。所以让我们开始吧。

先决条件

在开始之前,我们需要在本地机器上做一些安装设置,并在 FTP 服务器上设置一个目录。

本地机器设置

我假设你们已经在机器上安装了 python。如果你还没有安装 python,访问这个链接在你的机器上安装 python。
在进入代码之前,我们需要确保我们已经安装了以下模块:

首先我们将安装 Paramiko。

pip install paramiko

因为我们将上传文件到 s3,我们将需要 boto3 客户端。

pip install boto3

FTP 服务器目录设置

我们需要在我们的 FTP 服务器上创建几个我们将在实现中使用的目录。

**注意:**这个目录设置是一次性的,我们不必每次都做。

连接到您的 FTP 服务器。我在我的案例中使用 FileZilla。转到站点管理器。在协议下拉菜单中选择 SFTP 选项。输入您的主机、ip、用户名和密码,然后按连接。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

连接后,在 FTP 服务器上创建两个目录:

  • 您将上传文件的父目录。
  • 经过处理的目录。这个目录将用于跟踪哪些文件已经上传到 s3。

完成以上两个步骤后,我们现在已经安装了所有必要的模块和目录结构。我们现在可以开始实际的实现了。

FTP 到 S3 的实现

让我们首先简单地浏览一下 git 存储库中的两个文件。

python _ glue _ injestion _ job . py

我们的整个 FTPIngestion 类实现如下。我将逐一解释代码的每个部分。

python_glue_injestion_job.py

**注意:**我称之为 python glue 作业,因为我们可以在 AWS Glue python shell 环境中运行相同的代码,并使用 AWS Glue 实现相同的 FTP 文件传输功能。

配置. py

这个文件将定义我们所有的配置,如主机名、IP、端口、用户名、密码、s3 存储桶名、ftp 目录路径等。将所有配置保存在一个单独的文件中是一个很好的编程习惯。这使得我们的代码更易于管理。

我们通过将该文件导入 python_glue_ingestion_job.py 文件来使用它。我们的 config.py 文件如下所示:

配置. py

在简要概述了我们的两个文件之后,让我们深入到代码的每一部分。

代码流

我们的代码从 main 方法开始。我们首先创建一个 FTPIngestion 类的对象**。在创建对象时,调用 init(self) 方法来设置所有的配置值。**

主要方法

然后 ftp_obj 调用**initiate _ ingestion(self)方法,该方法将首先使用 create_ssh_connection(self)方法创建一个与我们的 ftp 服务器的 ssh 连接。成功连接后,将使用create _ sftp _ connection(self)**方法创建一个 SFTP 连接,我们将用它来访问 FTP 服务器。

一旦建立了 SFTP 连接,我们执行以下操作

  • 将当前目录更改为父目录
self.sftp_client.chdir(self.ftp_directory_path)
  • 获取所有要上传到 S3 的文件
files_to_upload = self.sftp_client.listdir()
  • 使用**create _ s3 _ partition(self)**方法创建 S3 分区结构。我使用当前日期时间来设置分区结构,如下所示:

/ <目录 _ 名称>/年= <年> /月= <月> /日= <日> /小时= <小时>/文件

  • 之后,我们开始一个接一个地上传文件。列表中的每个文件都被传递给**S3 _ upload _ file _ multipart()**方法。如果文件大小大于 100Mb,文件将通过多部分上传,否则作为标准文件上传。
for ftp_file in files_to_upload:                    
    sftp_file_obj = self.sftp_client.file(ftp_file, mode='r')
    if self.s3_upload_file_multipart(sftp_file_obj,
                                     s3_partition+ftp_file):
        print('file uploaded to s3')
        files_to_move.append(ftp_file)
  • 在每次成功上传时,使用我们在 FTP 服务器上创建的**move _ files _ to _ processed()**方法将文件移动到已处理的目录中。这样做是为了跟踪已经成功上传到 s3 的所有文件。
if files_to_move:                    
    for uploaded_file in files_to_move:
        self.move_files_to_processed(uploaded_file)
else:
    print("nothing to upload")
  • 所有文件成功上传后,我们使用 close_connections(self) 方法关闭所有连接。

更深入地了解我们的代码:

现在让我们详细讨论一下 FTPIngestion 类的每一部分。

初始化方法

这是 init 方法,也称为我们类的构造函数。当我们创建一个 FTPIngestion 类的对象时,所有的属性都是在对象创建时设置的。每个属性的值都是从 config.py 类中获取的,我们在这个类中定义了它们的值。我们将 config.py 文件作为 cfg 导入,并为每个属性设置相应的值。

初始化方法

**推荐:**我们可以使用 AWS SSM 来代替 config.py 类,在这里我们为每个属性定义键值对,就像在 config.py 文件中一样。使用 SSM 更加可靠和安全。

创建 ssh 连接方法

这个方法使用给定的凭证创建一个与我们的 FTP 服务器的安全 ssh 连接。成功连接后,它会将 self.ssh_ok 属性设置为 True 并返回。否则 self.ssh_ok 设置为 False 并返回。

这个方法中需要注意的一点是**self . ssh _ client . set _ missing _ host _ key _ policy(paramiko。AutoAddPolicy())。**我们将其配置为使用自动生成的策略设置缺失的主机密钥。如果您打算在 AWS Glue 中作为 python shell 作业运行此任务,请使用主机策略,而不是添加自动添加策略。为此,请在代码中执行以下操作

#self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# in production, use load_system_host_keys            
 self.ssh_client.load_system_host_keys()

创建 _ sftp _ 连接方法

这个方法调用 create_ssh_connection 方法创建 ssh 连接,然后继续打开 SFTP 连接。如果连接成功,它会将 self.sftp_ok 设置为真,如果连接失败,则将其设置为假并返回值。

创建 _ sftp _ 连接方法

移动文件到已处理的方法

文件成功上传到 s3 后,在 initiate_ingestion 方法中调用该方法。这个方法以文件名作为参数。将 FTP 服务器上的源路径和目的路径设置为 srcdest ,然后执行以下命令,将文件从 src 路径移动到 dest 路径。

try:
    _, _, _ = self.ssh_client.exec_command("mv " + src+" " + dest)        except Exception as error:
    print("error moving files to processed directory, error: ", error)

我们的move _ files _ to _ processed方法如下:

移动文件到已处理的方法

创建 _ s3 _ 分区方法

这个方法创建 s3 分区结构。分区由根目录名后跟年、月、日、小时组成。通过这种方式,我们可以获得基于时间的分区数据。

创建 _ s3 _ 分区方法

s3 _ 上传 _ 文件 _ 多部分方法

该方法将文件上传到指定的 s3 存储桶。它使用 TransferConfig 类来处理多部分上传。我们为 TransferConfig 指定如下配置:

config = TransferConfig(multipart_threshold=cfg.MULTIPART_THRESHOLD,
                        multipart_chunksize=cfg.MULTIPART_CHUNKSIZE,
                        max_concurrency=cfg.MAX_CONCURRENCY,
                        use_threads=cfg.USER_THREADS
                        )
  • multipart_threshold 参数确定文件的最小大小,超过该值后,文件将通过 multipart 上传。AWS 建议所有大于 100MB 的文件通过 multipart 上传,所以我把这个参数设置为 100MB。这可以在 config.py 文件中更改。
  • multipart_chunksize 参数决定了多部分上传期间每个部分的大小。我把它设置为 20MB。
  • max_concurrency 参数决定了用于上传每个部分的并发 S3 API 传输操作的最大数量。默认值为 10。
  • 最后, use_threads 参数决定传输操作是否使用线程来实现并发。通过将 use_threads 属性设置为 False,可以禁用线程使用。如果禁用线程使用,则不会发生传输并发。因此,max_concurrency 属性的值将被忽略。

我们将这个配置对象作为参数传递给我们的 s 3.upload_fileobj

self.s3.upload_fileobj(source_file, self.s3_bucket_name,
                       s3_target_file, Config=config)

TransferConfig 类自动检查文件是作为单个部分上传还是通过多部分上传。它会自动处理失败的上传,并在失败时进行重试。

s3 _ 上传 _ 文件 _ 多部分方法

initiate _ 摄取方法

这个方法启动建立 ssh 和 sftp 连接的调用。将 FTP 目录路径更改为文件所在的指定路径。获取 FTP 指定路径中所有文件的列表,并开始上传到 s3。成功上传到 S3 的文件被移动到 FTP 服务器上的已处理目录中。所有文件上传后,关闭所有连接。

关闭连接方法

这种方法用于关闭 ssh 和 sftp 连接。

将代码用作 AWS 粘合工作

如前所述,同样的实现可以用在 AWS Glue 这样的托管环境中。如果用户有文件在特定时间段(小时、天、月等)到达 FTP 服务器,他可以安排作业在特定时间运行,将所有文件从 FTP 服务器接收到 s3。

我们必须修改代码中的一些内容,以便能够将这个实现作为 AWS Glue Python shell 作业来运行

  • 在我们的python _ glue _ in jestion _ job . py文件的 imports 部分中,取消对以下导入的注释。我们使用 easy install 在 Glue 环境中安装 paramiko 模块,因为它没有默认的 Python 安装。
install_path = os.environ['GLUE_INSTALLATION']easy_install.main( ["--install-dir", install_path, "https://files.pythonhosted.org/packages/ac/15/4351003352e11300b9f44 a13576bff52dcdc6e4a911129c07447bda0a358/paramiko-2.7.1.tar.gz"] )reload(site)
  • create_ssh_connection 方法中注释如下
#self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

并取消对以下内容的注释

self.ssh_client.load_system_host_keys()

我们所做的不是使用自动生成的策略,而是使用我们所处环境的主机密钥。

完成上述步骤后,我们可以在 AWS Glue 中将这段代码作为 Python shell 作业运行。

摘要

在本文中,我们研究了如何执行 Datalake 管道的数据接收步骤。我们学习了如何使用 paramiko 库创建与 FTP 服务器的安全 ssh SFTP 连接,并将文件从服务器上传到我们的 AWS S3 存储桶。我们还简要介绍了如何在 AWS Glue 这样的托管环境中使用给定的实现。

链接到我的 Github 库:

[## furqanshahid 85-Python/Python-FTP-文件-摄取

这个模块提供了从 FTP 服务器上传文件到 s3 的功能。SFTP 连接是通过…创建的

github.com](https://github.com/furqanshahid85-python/Python-FTP-File-Ingestion)

DataOps —使用 AWS Lambda 和 Amazon EMR 的全自动低成本数据管道

原文:https://towardsdatascience.com/dataops-fully-automated-low-cost-data-pipelines-using-aws-lambda-and-amazon-emr-c4d94fdbea97?source=collection_archive---------28-----------------------

使用 S3 事件通知、AWS Lambda 和亚马逊 EMR 实现数据处理管道完全自动化的指南。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 ar130405 来自 Pixabay

进展是连续的。回顾我在信息技术领域 25 年的职业生涯,我经历了几个阶段的进步和适应。

从一个仔细观察每条 SQL 命令运行完成的新员工,到一个自信的 DBA,他编写了数百条 SQL 脚本,并使用 Cron 调度程序将它们作为批处理作业一起运行。在现代,我适应了像 Oozie 和 Airflow 这样的 DAG 工具,它们不仅提供作业调度,还可以以自动化的方式运行一系列作业作为数据管道。

最近,云的采用改变了自动化的全部含义。

存储很便宜,计算很贵

在云时代,我们可以设计出以前闻所未闻的自动化方法。我承认云存储资源一天比一天便宜,但是计算资源(高 CPU 和内存)仍然相对昂贵。记住这一点,如果 DataOps 可以帮助我们节省计算成本,那岂不是太酷了。让我们来看看如何做到这一点:

通常,我们按如下方式运行数据管道:

数据收集定期(每天,每小时或每分钟)保存到存储像 S3。这之后通常是使用永久衍生的分布式计算集群(如 EMR)的数据处理作业。

优点:处理任务按计划运行。永久集群可用于其他目的,如使用 Hive 进行查询、流式工作负载等。

**缺点:**数据到达和处理之间可能会有延迟。计算资源可能没有得到最佳利用。有时可能会出现利用率不足的情况,从而浪费昂贵的美元

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

这里有一个替代方案,可以帮助实现运营和成本之间的平衡。这种方法可能并不适用于所有的用例,但是如果确实如此,那么请放心,它将为您节省大量的美元。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

在这种方法中,存储层基本保持不变,只是在存储中添加了一个事件通知,在新数据到达时调用 Lambda 函数。反过来,Lambda 函数调用用于数据处理的瞬态 EMR 集群的创建。瞬态 EMR 集群是一种特殊类型的集群,它部署、运行数据处理作业,然后自毁。

**优点:**一旦数据可用,处理作业就可以开始。没有等待。计算资源得到最佳利用。只为您使用的东西付费,节省$$$。

**缺点:**集群不能用于其他目的,如使用 Hive 进行查询、流式工作负载等。

以下是整个过程的技术处理方式:

假设数据文件被传送到 S3:///raw/files/renewable/hydrogen-consumption/_

克隆我的 git repo:

$ git clone https://github.com/mkukreja1/blogs.git

创建一个新的 S3 桶来运行演示。请记住更改时段名称,因为 S3 时段名称是全球唯一的。

$ S3_BUCKET=lambda-emr-pipeline  #Edit as per your bucket name$ REGION='us-east-1' #Edit as per your AWS region$ JOB_DATE='[2020-08-07_2PM'](https://s3.console.aws.amazon.com/s3/#) #Do not Edit this$ aws s3 mb s3://$S3_BUCKET$ aws s3 cp blogs/lambda-emr/emr.sh s3://$S3_BUCKET/bootstrap/$ aws s3 cp blogs/lambda-emr/hydropower-processing.py s3://$S3_BUCKET/spark/

为 Lambda 函数创建角色

$ aws iam create-role --role-name trigger-pipeline-role --assume-role-policy-document file://blogs/lambda-emr//lambda-policy.json$ aws iam attach-role-policy --role-name trigger-pipeline-role  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole$ aws iam attach-role-policy --role-name trigger-pipeline-role  --policy-arn arn:aws:iam::aws:policy/AmazonElasticMapReduceFullAccess

在 AWS 中创建 Lambda 函数

$ ROLE_ARN=`aws iam get-role --role-name trigger-pipeline-role | grep Arn |sed 's/"Arn"://'  |sed 's/,//' | sed 's/"//g'`;echo $ROLE_ARN$ cat blogs/lambda-emr/trigger-pipeline.py | sed "s/YOUR_BUCKET/$S3_BUCKET/g" | sed "s/YOUR_REGION/'$REGION'/g" > lambda_function.py$ zip trigger-pipeline.zip lambda_function.py$ aws lambda delete-function --function-name trigger-pipeline$ LAMBDA_ARN=` aws lambda create-function --function-name trigger-pipeline --runtime python3.6 --role $ROLE_ARN --handler lambda_function.lambda_handler --timeout 60 --zip-file fileb://trigger-pipeline.zip | grep FunctionArn | sed -e 's/"//g' -e 's/,//g'  -e 's/FunctionArn//g' -e 's/: //g' `;echo $LAMBDA_ARN$ aws lambda add-permission --function-name trigger-pipeline --statement-id 1 --action lambda:InvokeFunction --principal s3.amazonaws.com

最后,让我们创建 S3 事件通知。这个通知将调用上面的 Lambda 函数。

$ cat blogs/lambda-emr/notification.json | sed "s/YOUR_LAMBDA_ARN/$LAMBDA_ARN/g" | sed "s/\    arn/arn/" > notification.json$ aws s3api put-bucket-notification-configuration --bucket $S3_BUCKET --notification-configuration file://notification.json

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

让我们从将数据复制到 S3 开始这一过程

$ aws s3 rm s3://$S3_BUCKET/curated/ --recursive
$ aws s3 rm s3://$S3_BUCKET/data/ --recursive$ aws s3 sync blogs/lambda-emr/data/ s3://$S3_BUCKET/data/

如果一切运行正常,您应该能够在 EMR 中看到一个正在运行的集群,状态= 开始

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

一段时间后,EMR 集群应该变为 Status= Terminated。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

要检查 Spark 计划是否成功,请检查 S3 文件夹,如下所示:

$ aws s3 ls s3://$S3_BUCKET/curated/2020-08-07_2PM/
2020-08-10 17:10:36          0 _SUCCESS
2020-08-10 17:10:35      18206 part-00000-12921d5b-ea28-4e7f-afad-477aca948beb-c000.snappy.parquet

进入数据工程和数据科学的下一阶段,数据管道的自动化正在成为一项关键操作。如果操作得当,它不仅有可能简化操作,还可能降低资源成本。

希望你能从上面的文章中获得一些有价值的见解。如果您需要进一步的澄清和建议,请随时联系我。

我希望这篇文章是有帮助的。 AWS 数据湖& DataOps 是由 Datafence Cloud Academy 提供的 AWS 大数据分析课程的一部分。课程是周末自己在网上教的。

Dataprep.eda:加速您的 eda

原文:https://towardsdatascience.com/dataprep-eda-accelerate-your-eda-eb845a4088bc?source=collection_archive---------6-----------------------

关于 dataprepare.eda 你需要知道的一切。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:MicroStockHub,via:Getty Images/istock photo

作者: 斯拉夫·科埃略鲁奇塔·罗萨里奥

*导师: 王剑南博士 *,主任,的专业硕士项目(大数据与网络安全和视觉计算)

“数字有一个重要的故事要讲。他们依靠你给他们一个清晰而有说服力的声音

如今,大多数行业都认识到数据是一种宝贵的资产。然而,你如何处理这些数据,如何利用这些数据,才能帮助你获得额外的利润数字,或者带来一场革命的新发现。

当您开始处理数据集时,大多数趋势和模式并不明显。探索性数据分析有助于人们通过分析透镜仔细分析数据。它有助于我们得出结论,对数据发生的情况有一个总体的了解。揭示这些隐藏的关系和模式对于在数据基础上构建分析和学习模型至关重要。

EDA 的一般工作流程如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dataprep.eda 简介:

Data prepare是由 SFU 数据科学研究组为加速数据科学而发起的一项倡议。 Dataprep.eda 试图用非常少的代码行来简化整个 eda 过程。因为我们知道 EDA 是数据科学管道中非常重要和耗时的一部分,所以拥有一个简化这一过程的工具是一件好事。

这个博客旨在为你提供一个简单的实践经验,让你了解你可以用 dataprepare.eda 做的所有事情。所以我们开始吧,好吗?

**#installing dataprep.eda
#open your terminalpip install dataprep**

为了简化事情,我们研究了一个欺诈检测数据集。该数据包括金额、原始余额、原始账户、目的账户等列。最后是一个标签列,指示该交易实际上是否是欺诈交易。

**#importing all the libraries
import pandas as pd
from dataprep.eda import plot, plot_correlation, plot_missing#importing data and dropping missing values
df = pd.read_csv("capdata.csv")**

数据如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

dataprep.eda 包有 4 个子模块。我们将逐一解释:

  1. 【剧情() :分析分布

我们提供了一个 API plot() 来允许用户分析数据集的基本特征。它为每一列绘制分布图或条形图,让用户对数据集有一个基本的了解。

**#API Plot
plot(df)** 

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:所有列的数据分布

如果用户对一两个特定的列感兴趣,它会通过将列名作为参数传递来为特定的列提供更详细的绘图。

**plot(df, "newbalanceDest", bins=20)**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:单个列的数据分布

如果 x 包含分类值,则绘制条形图和饼图。

**plot(df,"type")**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:分类属性的数据分布

如果 x 包含数值,则绘制直方图、核密度估计图、箱线图和 qq 图。

**plot(df, "newbalanceDest", "oldbalanceDest")**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:两个属性之间的详细数据分布

如果 x 和 y 包含数值,则绘制散点图、六边形图和箱线图。如果 x 和 y 中的一个包含分类值,而另一个包含数值,则绘制一个箱线图和多线直方图。如果 x 和 y 包含分类值,则会绘制嵌套条形图、堆积条形图和热图。

****2。plot _ correlation():分析相关性

我们提供一个 API plot_correlation 来分析列之间的相关性。它绘制了列之间的相关矩阵。如果用户对特定列的相关列感兴趣,例如与列“A”最相关的列,API 可以通过将列名作为参数传递来提供更详细的分析。

**#API Correlation
plot_correlation(df)**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5:所有列的关联热图

**plot_correlation(df, k=1)**

前“k”个属性的关联热图(这里 k=1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6:前“k”个属性的相关性热图(这里 k=1)

**plot_correlation(df, "newbalanceOrig")** 

指定元素与所有其他属性的相关性。(即。newbalanceOrig 与其他一切)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7:指定元素与所有其他属性的相关性

**plot_correlation(df, "newbalanceOrig", value_range=[-1, 0.3])**

给定范围内的所有相关值。对于 newbalanceOrig,(-1,0.3)将出现在绘图中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8:给定范围内的相关值

**plot_correlation(df, x="newbalanceDest", y="oldbalanceDest", k=5)**

具有最佳拟合线和最有影响点的两个属性之间的相关性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9:具有最佳拟合线和最有影响点的两个属性之间的相关性

****3。【plot _ missing():分析缺失值

我们提供了一个 API plot_missing 来分析缺失值的模式和影响。乍一看,它显示了缺失值的位置,这使用户能够了解每一列的数据质量,或者找到缺失值的任何潜在模式。

**#API Missing Value
plot_missing(df)** 

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10:每列的缺失值

若要了解特定列中缺少值的影响,用户可以将列名传递到参数中。它将比较给定列中有无缺失值的每一列的分布,以便用户可以了解缺失值的影响。

**plot_missing(df, "isFraud", "type") #count of rows with and without dropping the missing values**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11:按类型划分的一个属性(isFraud)的影响

4.create _ report:从一个熊猫数据帧生成 profile 报告。

create_report 的目标是从 pandas 数据框架生成配置文件报告。create_report 利用 dataprep 的功能并格式化图。它提供的信息包括概述、变量、分位数统计(最小值、Q1、中值、Q3、最大值、范围、四分位数范围)、描述性统计(平均值、众数、标准差、总和、中值绝对偏差、变异系数、峰度、偏斜度)、长度文本分析、样本和字母、相关性和缺失值。

**from dataprepare.eda import create_report
df **=** pd**.**read_csv**(**"https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"**)** create_report**(**df**)****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12:泰坦尼克号数据集的详细报告

数据准备与传统方式

以上 3 个 API 的组合有助于简化 EDA 过程。

为了支持这一点,我们进行了一项调查来比较 dataprep.eda 和传统的 python EDA 实现。我们调查了 10 个人(包括现实世界的数据科学家和学习数据科学的大学生)。该调查基于 3 个关键绩效指标:

  1. ****需要:这里我们分析了数据专业人员每个项目在 EDA 上花费的分钟数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们所看到的,大多数人平均在 EDA 上花费大约一个半小时。这一结果表明,我们需要工具来加速 EDA 过程。

2.可读性:这里我们对这两种方法进行了比较,看看它们的可读性如何。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然,dataprepare.eda 提供了一个更加清晰易读的代码。

**3.**代码行数:data prep . EDA 真的减少了代码长度吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除了上述关键性能指标之外,dataprep.eda 还在其他几个方面比普通 python 实现甚至现有的数据分析库(如 pandas profiling)更好。让我们来看看这三种方法相互竞争时的表现。

  1. 当我们将其他两种方法的效率与 Dataprep.eda 进行比较时,它被证明更加高效。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.当我们谈到这些方法及其支持内存外数据的能力时,Dataprepare.eda 是唯一支持内存外数据处理的方法。事实证明,这在当今的大数据时代非常有用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改自:来源:【dreamstime.com】T4,转自:ilustración 9436463 Pixbox—Dreamstime.com

3.dataprep.eda 生成的图都是交互式的,但 matplotlib 和 seaborn 只创建静态图。这有助于加深对情节的理解。

我们请了几位行业专业人士和大学生对这个神奇的工具给出反馈。

以下是他们中的一些人要说的话:

“图书馆看起来真不错。大大简化了工作。亚马逊软件开发人员 Dhruva Gaidhani 说

“发现缺失值非常有效。我通常花很多时间在 EDA 上。该库确实简化了一些功能。”——SFU 大学校友马南·帕拉舍

结论

就在我们说话的时候,数据科学正在适应每一秒。我们正在探索几乎所有领域的长度和宽度,从体育分析到医学成像。这些时代要求我们将人工智能和机器学习的力量用于开发能够产生影响并节省时间的东西。拥有像数据准备这样的工具可以让我们更有效地完成准备工作。

一般来说,Dataprepare.eda 擅长检查数据分布、相关性、缺失值和 eda 过程等任务。编码的简易性和可读性也方便了新手使用 dataprepare 库。总而言之,Dataprepare.eda 是执行所有准备性分析任务的一站式库。这是一个即将到来的图书馆,有着光明的未来!

数据机器人让生活变得简单

原文:https://towardsdatascience.com/datarobot-makes-life-easy-8505637241e5?source=collection_archive---------47-----------------------

汽车系列之四——设计之美

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由皮克斯拜的 Gerd Altmann 提供

我偏离了本系列的前几篇文章。我将回顾两个远远超过其他工具的工具。设计和美丽的视觉效果并不便宜。这并不意味着我们不能钦佩他们,并把他们作为我们奋斗的目标。我将从 DataRobot 开始。这是一个企业工具,你可能会发现自己在工作或学校中可以使用它。

为什么是 DataRobot?

我有使用这个工具的经验,并且喜欢它用于我使用它的商业案例。我的商业案例是为非数据科学家提供一个简单明了的接口,以自动化的方式运行和部署模型。DataRobot 定期添加新功能,每个功能都很好地构建在现有的用户体验中。我可以继续谈论它的好处,但是我会控制我内心的粉丝。

为了与其他工具保持一致,我将专注于最基本的任务来运行一个简单的。csv 文件,无需任何手动干预或超参数调整。

设置和成本

坦率地说,DataRobot 超出了数据科学家个人的预算范围。实现和成本肯定是在商业领域。AWS Marketplace 提供 98,000 美元的一年订阅。口袋里的零钱,我肯定。但如果你用 AWS govCloud,就是【9.33 美元/小时(不一)。有意思。

数据

为了保持本系列中各种工具的平等性,我将坚持使用 Kaggle 培训文件。矛盾,我亲爱的华生。使用 TPUs 检测多语言文本中的矛盾和蕴涵。在这个入门竞赛中,我们将句子对(由一个前提和一个假设组成)分为三类——蕴涵、矛盾或中性。

6 列 x 13k+行—斯坦福 NLP 文档

  • 身份证明(identification)
  • 前提
  • 假设
  • 朗 abv
  • 语言
  • 标签

加载数据

您可以通过上传数据集来创建项目。这个界面是您开始的地方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者截图

加载数据后,有机会更改数据类型或移除要素。有一些数据分布数据。额外的好处是,如果可能有数据泄漏,会有警告。如果检测到数据泄漏,DataRobot 会从最终的训练数据集中删除该特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者项目截图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者截图

训练您的模型

一旦你选择了你的目标,你点击大启动按钮,将建模模式设置为自动驾驶。当你这样做的时候,你会在右边看到进步。随着模型的训练,它们在完成后会出现在排行榜上。

访问早期模型结果的一个好处是,您可以查看重要的问题。很多时候,一些数据问题随着洞察力变得非常明显,我可以停止这个过程,再试一次。这种快速简单的审查有助于快速迭代。

评估培训结果

排行榜开始填满已完成的模型。您可以在下拉列表中选择几个有效的指标。也有一些有用的标签,让你知道为什么领导人在顶部。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

排行榜截图作者

你可以将这些模型相互比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者的学习曲线截图

我经常使用的一个标签是速度与准确性。如果准确性下降很小,当你获得数百万条记录时,速度会胜过准确性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

速度与准确性由作者截图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

头对头模型对比作者截图

Insights 选项卡很方便。您可以快速查看您的某个功能是否弹出。这取决于你的商业专业知识,知道这是否合适。此选项卡是我在 autoML 模型培训早期发现数据问题的地方。如果我看到一些似乎不正确的东西,我可以比等待整个过程结束更快地迭代。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

见解作者截图

DataRobot model explainability 是迄今为止我评论过的最好的工具。每个预测都被分配了影响最终得分的特征,不仅表明了强度,还表明了方向。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者预测解释截图

不要低估,文档会消耗你的时间。对于这个简单的数据集,DataRobot 生成一个 7000 多字的文档,其中包含所有的图表、模型参数和 challenger 模型的详细信息。这个文档是一个独特的特性,我在任何其他工具中都没有发现,尽管我在被问到时要求过。只需一次点击即可完成。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的合规报告截图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的合规文档截图

结论

为了松散地比较工具之间的结果,我在分类模式下重新运行数据集。指标只是略高于 Azure。在很大程度上,模型结果是相似的。

对于我的商业案例,这是目前为止最重要的。图像处理或时间序列中的头对头可能会提供不同的结果。这将是另一个系列的挑战。

易用性、可视化、对 challenger 模型细节的访问、模型可解释性和自动化文档从其他方面脱颖而出。当然,你为此付出了高昂的代价。

接下来我给大家展示 H2O.ai 无人驾驶 ai。在我看来,他们是此时与 DataRobot 最接近的对比。他们竭尽全力让顶尖的数据可视化设计师参与这个项目,所以我期待着伟大的事情。

如果你错过了这个系列中的一篇文章,我会把它们贴在下面。

[## AWS Sagemaker Studio 自动驾驶仪准备好迎接黄金时段了吗?

带有一些评论的自动驾驶界面演示

towardsdatascience.com](/is-aws-sagemaker-studio-autopilot-ready-for-prime-time-dcbca718bae7) [## 免费体验 Google autoML 表格

autoML 工具用户体验评论系列之二。

towardsdatascience.com](/experience-google-automl-tables-for-free-d5648ae3d0e5) [## Azure Automated ML 倾听他们的设计师

本 autoML 系列的第 3 部分,微软,绝地大师

towardsdatascience.com](/azure-automated-ml-listens-to-their-designers-7f1c68d19eb4)

数据是测试版:利用数据提高攀岩和其他运动

原文:https://towardsdatascience.com/datas-the-beta-the-power-of-data-to-improve-at-climbing-and-other-sports-337df948f630?source=collection_archive---------23-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

凯瑟琳·玛丽和康纳·德法尔科在香港的魔鬼峰爬山。—作者照片

展示用于提高您在攀岩或一般运动中的表现的数据科学策略。

攀岩是一项每个人都在不断努力提高的运动。此外,与许多其他运动相反,在这些运动中,你的个人表现要么是主观的,要么依赖于他人,有非常明确的量化指标来评估你的攀岩水平:每一条路线都有攀岩难度等级,你是用身体、个人能力而不是其他任何东西来攀岩的。这可能是超级激励,也可能是一个大挫折。然后,这种变得更好的追求通常伴随着寻找原因和答案,为什么你仍然没有你希望的那么好。在攀岩中,你会不断听到:

  • “啊,如果我再高一点点”
  • “啊,如果我再轻一点”
  • “啊,如果我再坚强一点”
  • “啊,如果我从年轻时开始”

在众多借口中,有很多是关于为什么攀岩者的表现没有他们希望的那么好。

攀岩数据

然后,过去许多数据驱动的攀岩爱好者承担了分析几个变量与攀岩性能之间关系的任务,通常专注于体重、身高、身体质量指数和年龄。另一篇媒体文章中的图片就是这种分析的一个例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马克·达德对身体质量指数和身高与最大坡度的分析

将你的假设如此清晰地可视化,并在数据中找到趋势和相关性可能会非常令人兴奋,它甚至可以揭示一些反直觉的结果。例如,我相信大多数攀岩者期望与身高成正相关,而数据似乎表明并非如此。然而,所讨论的数据的性质也是一件非常重要的事情。知道对于强壮的攀岩者来说,在高度上有一个最佳点,我得到了什么?这不像我可以简单地增加或缩小 10 厘米来达到最佳高度。知道这一点只能作为一个额外的借口(大多数攀岩者都喜欢)来证明我们的表现,或者作为一个额外的打击士气的因素,以防你有最佳的参数但仍然表现不佳。

"比我高 5 厘米的攀岩者往往比和我一样高的攀岩者更努力."那又怎样?我希望我的分析结果能指导我实际上可以做些什么来改进,而不是简单地陈述我档案中不变方面的统计趋势。带着这个动机,我创建了一个调查来收集攀岩者的数据,这样我就可以进行更全面的分析,作为攀岩表现改善策略的基础。

调查的描述

该调查包括 44 个问题,分为 5 个不同的部分,以收集不同类型的信息:

  • 个人简介 :关于攀岩社区个人方面的问题,如年龄、性别、国籍、职业、攀岩原因等。
  • 训练简介 :关于他们多久攀登一次、多久训练一次、持续多长时间、如何训练、训练时注重什么能力等问题。
  • 投影轮廓 :关于对投影路线的态度和策略的问题。
  • 抱石性能 :记录攀岩者在不同条件下的最大攀爬等级,用于抱石。
  • 运动攀登表演 :记录攀登者在不同条件下的最大攀登等级,用于运动攀登。

在进行分析时,该调查已有 160 名登山者回答,因此它在统计上并不显著,此处显示的关系不应视为真实,它只是这类方法的概念证明。

受访者人口统计

查看受访者的人口统计数据,我们可以看到数据看起来像一个正态分布的样本,没有显示出大的偏差。

  • 受访者来自欧洲、大洋洲、亚洲、北美洲和南美洲。
  • 男女比例合理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

年龄和性别分布

  • 有各种体重、身高和年龄的登山者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

受访者的年龄、身高和体重分布

因此,考虑到数据似乎是有效的,并且接近真实的表示,我开始着手进行适当的分析。

比较和关联

在展示现代数据科学技术(包括机器学习模型或人工智能算法等工具)的真正力量之前,我想展示即使是一些简单的技术,如方法和直接比较,如果使用正确的数据和焦点,也可以提供非常有价值的见解。

我将用例子来展示这些:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

男女攀岩运动成绩的差异。

该图展示了样本中男性和女性攀岩者在运动攀岩表现上的差异。我们不能概括这些倾向,但我们可以看到,至少在这 160 名登山者中:

  • 男性攀爬的难度比女性高 1-2%
  • 女性在成功攀爬某一特定坡度时的一致性要高 5%

子集分析的另一个例子是比较声称训练的登山者和声称不训练的登山者:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

声称训练的攀岩者和不训练的攀岩者之间的表现差异

尽管这很直观,也在意料之中,但由于这里的数据,我们可以看到并最终展示培训益处的事实证据。训练的登山者:

  • 平均攀爬难度增加了 7%,
  • 在持续闪光/曝光方面提高了约 6%
  • 在重新定位方面提高了 8%

有趣的是,数据显示不训练的登山者:

  • 有更大的未实现的改进潜力

事情开始变得有趣起来,现在让我们来看看投影的影响:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

攀岩者和不攀岩者的百分比差异

似乎投射的影响比训练的影响更大。投射的人:

  • 平均攀爬难度增加 11%,
  • 对完成路线和获得红点有更高的信心
  • 间接显示闪光的提高,所以他们作为整体攀登者提高,而不仅仅是他们的最高等级

有趣的是,数据显示不投射的攀岩者:

  • 有更大的未实现的改进潜力
  • 是更坚持不懈的攀登者

描述性与可操作性的洞察力

所以,看起来很好看,但是这些见解和前面说的体重身高见解有什么区别呢?可控诉的情形

虽然你不能改变你的身高、性别或年龄,但你实际上可以决定开始训练,开始计划,或开始做任何可行的策略,这些策略可以改善数据,并提供事实数据来证明所做的建议。

到目前为止,我们已经任意选择了一些变量,然后查看它们对性能的影响,但是我们可以采用其他几种方法。

让我们比较一下最强的 20%攀登者和最弱的 20%攀登者,看看他们有什么不同:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最强和最弱攀岩者之间的差异

现在,我们开始看到一些我们还没有做出任何假设的见解,数据简单地表明了这一点。更强壮的登山者…

  • 投射更多
  • 度假的重点是爬山
  • 少旅行(他们专注于同一个悬崖,而不是去所有的地方)
  • 多爬几次
  • 更高更重
  • 更年轻/攀岩时间更长/开始攀岩更早
  • 要么自己训练,要么利用书本信息(而较弱的攀岩者要么不训练,要么和教练一起训练)
  • 训练更多天和更长时间
  • 多尝试几次路线,通常在以后的尝试中会比第一次更好
  • 他们的训练主要集中在爆发力、手指力量、力量耐力和有氧运动上
  • 每次抽签时,我都会努力观察或攀爬并休息

而表现较差的攀岩者…

  • 去尝试许多不同的峭壁
  • 要么在教练的指导下训练,要么简单地多爬一些来提高自己
  • 尝试更少的路线,并在更早的攀爬中获得最佳表现
  • 将他们的训练主要集中在耐力、步法、柔韧性、特定序列、核心和不同的攀爬上
  • 要么先顶绳,要么在尝试之前尝试每一个抓手

有些事情是意料之中的,但有些确实出乎我的意料,但一旦你仔细想想,它们确实有道理。表现较差的攀岩者仍然需要专注于他们的步法和基本耐力,而不是爆发力或手指力量,因为困难和容易的攀岩对身体的要求非常不同,这是在攀岩者生命的不同阶段发展的。

相关性和信息增益

然后,尽管这仍然只是一个比较分析,但已经出现了一些有趣的事情,例如训练的不同重点,他们训练的方式,对投射和旅行的心态等。但是,使用线性相关和信息增益分析等策略,甚至有“更好”的方法来获得这些见解。不用深入细节,这些只是简单地找出一个变量对确定另一个变量的值有多重要的方法,因此我们可以找出哪些变量对确定某人的攀登等级最重要。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

40 个最相关变量与运动攀登成绩的相关性。

那么如何解释相关性呢?很简单,这基本上意味着知道关于那个变量的信息可以让你更好地预测性能。在这种情况下,人们可以修改并对攀岩者在运动路线上的表现产生较大影响的因素依次为:

  • 他们一周爬多少天(包括室内)
  • 如果他们制定了自己的训练计划或他们读到的东西(或负相关,如果他们只是通过攀爬更多来“训练”)
  • 如果他们专门为登山旅行度假
  • 专注于攀岩运动(或者负相关,如果他们专注于抱石运动)
  • 如果他们攀登是为了竞争(或者负相关,如果他们认为这只是一个健康的爱好)
  • 如果他们把注意力集中在户外
  • 如果他们训练力量耐力,爆发力(或负相关,如果他们训练步法和弯曲)
  • 如果他们穿更紧的鞋子
  • 如果他们投射
  • 如果他们尝试了几次路线
  • 如果他们在月球板上训练
  • 如果他们每次攀登都爬更多的路线
  • 如果他们热身(或负相关,如果他们直接进入硬的东西)

其他具有高度相关性但无法改变的是…

  • 他们爬山有多长时间了/他们多年轻就开始爬山了
  • 如果他们有更高的猿类指数

有趣的是,身高、体重和当前年龄似乎不在最高度相关的变量中,这是一件非常好的事情。这表明,体型通常并不是表现的真正限制因素。

根据这些见解,我们可以做几件事:

  • 首先,体育专业人员或教练可以直接查看数据,并根据他们的个人经验使用这些数据来制定策略。
  • 第二,信息最丰富的变量可以用来创建一个计算机模型,该模型可以模拟攀岩者,以便根据攀岩者的特征来预测攀岩表现。

体育运动中的数据驱动智能系统

无需深入研究计算机建模方法背后的科学原理,只需考虑我们创建了一个计算机模型,它能够根据登山者有关以下变量的信息来预测他们的表现:

  • 他/她开始爬山的年龄
  • 他/她爬了多少年了
  • 他/她如何训练(独自或有教练指导)
  • 他/她一周训练几天和几个小时
  • 如果他/她集中训练爆发力
  • 他/她一天爬多少条路线
  • 他/她一天内尝试他的项目几次
  • 他/她如何穿鞋
  • 他/她如何看待假期(是登山旅行,还是非登山旅行)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型的训练和测试。

图像显示了用于创建模型的代码片段,与其他登山者一起训练它,然后用列表中的登山者#10 (climberID,任意选择)测试它。目前,climber10 在 0 到 25 (5.8 和 5.15d)的范围内具有 3.5 的实际爬升平均等级(在 5.10b/6a+和 5.10c/6b 之间),我们的模型仅使用列表中的变量预测它相当准确(它预测 3.9,仍在 5.10b/6a+和 5.10c/6b 之间)。虽然对于这个特定的模型来说,精度可能不太精确,但这主要是因为样本数据的大小。只有大约 160 个攀登者来覆盖从 5.8 到 5.15d 的 25 个等级的整个范围,这给出了算法正确学习模式的每个等级的非常少的例子。但是,用一个大几十倍、几百倍或几千倍的数据库来复制同样的策略,会产生好得多的结果。

这本身就已经很有价值了,因为它允许根据攀岩者的个人资料对他们的表现进行正确的评估。然而,它也让我们有可能探索如果这些变量中的任何一个发生变化,性能会如何。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试攀登者描述

只是陈述一些特性,现在我们的登山者…

  • 20 岁开始攀岩
  • 每周攀岩 3 天
  • 每天攀登 3 条路线
  • 已经爬了 3 年了
  • 通过简单的攀爬来训练,而不是自己制定训练计划
  • 每天尝试两次艰难的路线
  • 攀升至 5.10b/5.10c 左右

在此基础上,使用该模型,让我们探索和预测以下变化的爬坡性能…

  • 答:每周攀岩 5 天,而不是 3 天
  • b:每天爬 6 条路线,而不是 3 条
  • c:再爬 6 个月
  • d:转而遵循个人训练计划,而不仅仅是攀岩
  • e:每天尝试 3 次艰难路线
  • f:结合 A、B 和 E(增加攀爬量和尝试次数)
  • g:结合 C、D(开始一个个人训练计划,并坚持 6 个月)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同策略的模型输出

有了这些例子,我们可以根据其他攀岩者成功经验的历史数据,了解每种可能策略的预期结果。举例来说,这可以指导攀登者或教练哪一个是最有效的改进路径,因为一个人不能简单地同时做所有的事情,改变通常应该是渐进的。

在这个例子中,如果攀岩者每次去峭壁都爬 6 条路线而不是 3 条路线,似乎会带来最大的改善,几乎一直到 5.10d/6b+,这是攀岩者完全可以控制的,而不是增长 8 厘米。

到目前为止,我们尝试了我们提出的策略,但我们也可以使用该模型来逆向工程该过程,并找到最佳值。用下面的代码,我测试了在其他条件不变的情况下,一天爬多少次会给攀登者带来最大的进步。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

给定每天不同攀爬次数的攀爬性能

在本例中,在预测了每天攀爬 1-31 条路线的坡度后,算法发现,假设其他条件不变,每天攀爬 8 条路线将达到最佳坡度。

在这种情况下,我们只关注单个变量进行优化,实际上,您可以尝试同时优化所有变量,因为它们的影响是相互关联的。对于这些类型的多变量优化有许多其他算法,例如遗传算法。我们不会探究它们,但是它们可以用于更健壮的优化。

结论

这就是你如何使用数据来准备自己成为一个更好的攀岩者,来评估你与那些有着相似经历但做得更好的人相比缺乏什么,来以最佳的方式集中你有限的努力,并开始攀登。

数据科学已经在工业中广泛使用,但由于某种原因,它没有在许多其他可以增加价值的领域中使用,例如登山或一般的体育运动。这只是展示了数据科学的许多潜在用例,以帮助高性能攀岩者和许多其他运动员的教练和培训。数据可以以多种方式使用:仅仅作为描述符,作为专业人员做出自己明智决策的原始数据输入,作为通过智能系统提出潜在更好或新策略的工具,或者作为所有这些的组合。

数据科学非常依赖于数据的数量和质量。这是仅使用我自己创建的调查的 156 个响应(非常少的数据库)来执行的,我是一个具有数据科学知识但没有任何关于攀岩或运动科学的适当知识的人,也没有获得更详细的量化信息的工具(没有健身房设备或设施来进行适当的健身测试,等等。).通过更多的响应,或者在真正的体育专业人士的帮助下创建更合适的调查来收集实际有用的信息,这些类型的分析的性能将大大提高,结果将更加明显,并且发现变得更加有用。

答案和你提出的问题一样好,在这种情况下,我提出了非常基本的问题。如果有人开始提出正确的问题,就会产生更多有价值的见解。

代码和数据

我将本文制作过程中使用的所有代码和数据都留给了对处理数据感兴趣的人,或者为了自己制作类似的东西而学习数据科学的人。它以教程的形式呈现,以便初学者能够理解。

https://github.com/alexcasar/Data-Science-Climbing-Demo

数据剽窃

原文:https://towardsdatascience.com/datasculpting-af39f677f4f3?source=collection_archive---------33-----------------------

机器学习艺术

机器学习在艺术上的例子 myFATHERintheCloud.ai

🔵这里: 获得全媒体访问权限 🟠

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GAN 如何从数据库中学习数据触发器

数据出错。这是我在工作中使用的一个过程,所以我想把这个故事分成三个部分。首先,是数据雕刻的定义,然后是我在 2019 年开始的 myFATHERintheCloud 项目的介绍,最后,在第三部分,是我如何使用数据雕刻来生成雕塑的例子。

[## 如何从 AI 艺术入手?

这是很多人都在疑惑的问题。你应该如何开始你的 AI 艺术冒险?嗯,这一切都是从…

mlearning.substack.com](https://mlearning.substack.com/p/how-to-start-with-ai-art?r=z7zu8&utm_campaign=post&utm_medium=web&utm_source=copy)

数据剽窃

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据窃贼

数据剽窃存在于视觉艺术领域,但也包括数据科学的一些部分,当然还有机器学习。它使用随着数据科学的发展而产生的工具:深度学习、数据库(这是数据雕刻的一个非常重要的元素)。它在可用工具的帮助下可视化数据……所有这些都构成了“数据雕刻”的开放概念。

数据雕刻是一个创造性的过程,其中数据是作品成形的材料

MLearning.ai 生成的数据错误

如果我基于实例向您描述什么是数据雕刻,这可能是最好的。

这是第一幅作品,创作于 1993 年。这是一个老虎机,其中的数据集由三部分组成:名词,动词,形容词。玩这个独臂强盗游戏的人被展示随机生成的单词,这些单词组成了一个想要的句子。如果这个句子被认为是“有吸引力的”,那么这个玩家就会得到一笔奖金,或者赢得一场比赛。在这里,数据也是这个解决方案的一个重要元素。这个过程是完全自动化的——我的工作主要是选择那些单词,这些单词可以随机组成句子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1993 年 独臂大盗 卡·杜塞尔多夫数据窃贼

另一件作品——在某种程度上也是一种碰运气的游戏——叫做“危险的玩家”,是一件在索波特赌场创作的装置作品。你在前景看到的游戏桌,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1996 年项目 【风险玩家】 赌场大酒店 Sopot

从周围环境中收集数据,并将其指定为一个从 0 到 100 的连续数字。根据数字,图像中可见的镜子——一面黑色的镜子,它根据人流量和周围发生的事情的强度而凸出。因此,它与周围环境相互作用。这是一个非常有趣的实验。赌场里的人对周围发生的事情反应非常强烈。这些东西对他们来说非常重要;他们认为这对他们的表现有很大的影响,所以他们与工作的互动非常有趣。我工作中的这种互动感很重要,因为它收集的数据因地而异。同样的装置被设置在美术馆,在课程中收集的数据与赌场中的数据在强度和特征上完全不同。因此,作品没有如此动态地反应,曲面镜没有像在赌场中那样清晰地凸出。

[## GPT 3 是免费的吗?

你需要了解的人工智能工具

medium.com](https://medium.com/mlearning-ai/is-gpt-3-for-free-7ec8c2d904b6)

下一件作品是 2004 年在波兹南创作的。它与收藏有关

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2004 年第十四届 波兹南国际雕塑双年展

由这种形式的观察者产生的内容形式的数据。这种形式是同质的,只有一种颜色。内容由访问过的人生成。人们一个接一个地进入其中——这造成了一定程度的隔离,让他们在没有额外刺激的情况下集中注意力。单一颜色的形式消除了任何外部刺激,任何额外的噪音——所以这个房间是完全隔离的。

myFATHERintheCloud.ai

我在 2019 年开始了这个项目,此后它一直专注于我父亲的作品。

我父亲已经做了六十年的雕刻家,所以这个项目的目标是训练一个机器学习模型,它将按照我父亲的风格雕刻,从而延续他的遗产。

他的雕塑是具象的,宗教风格和主题。他使用的主要材料是木头。作为项目的一部分,我的目标是在工业机器人的帮助下实现他的作品,这种机器人将有能力用同样的工具按照我父亲的风格进行雕刻。

2020 年,我获得了文化部的奖学金。它涉及建立数据库的准备工作。为此,创建了网站 w-imie-ojca.gross.art.pl 。请访问——在这一页上,您可以看到该数据库的组成部分,即 3D 扫描,以及球形全景,所有这些都可以在这一页上找到。你可以看到我父亲的作品在哪里展出——由于他作品的特殊性,这一点非常重要。记录这一切开始的时间和地点对我来说也很重要——在我看来,这可能对将来训练模型很重要。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2020 年#维米耶奥赫卡

所有扫描的模型都可以通过浏览器访问。你可以在 3D 里看到我父亲的作品是什么样子。此外,网站上还有一份时事通讯。如果你对数据雕刻这个话题感兴趣,欢迎订阅。你不仅可以收到关于数据雕刻的最新消息,还可以看到 GANs 和机器学习在艺术中的应用。

该项目的最重要的部分是数据库。它由数千张雕塑照片组成。这些照片然后被进一步处理。照片的每一个元素在模特训练的时候都很重要。你会在生成的雕塑示例中看到,背景很重要,灯光也很重要,从照片是否着色到如何格式化,一切都在这个过程中起着关键作用。我准备这些照片的方式使它们不会失去比例——这对造型很重要。我将光线正常化,通过处理照片来“扩充”数据集,包括对称反射,正如我之前提到的——光线的变化,颜色的变化。我用不同的方法让最后的效果尽可能接近我父亲的风格。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据窃贼

雕塑的产生

我用各种 GAN 生成雕塑,包括 StyleGAN2(NVidia)。我已经准备了一个数据库和模型,查看由我父亲的人物照片组成的数据库,生成与我父亲的人物风格相似的新人物。本视频展示了 GAN 如何从数据库中学习。这个训练过程需要很多时间,输出图片。该数据库还包括最近制作的抽象雕塑,这扩展了该数据库,并允许现在正在创作的作品,尽管是我父亲的风格,但唤起了一种新的品质。这是 GAN 训练的样子,这是一个视频例子,所有生成的图像都被排列成了一个电影。它们展示了从抽象到具象表现的生成过程。

我生产的所有东西都是开源的,你可以在 我的 Substack feed 上跟随这个过程。

[## m learning . ai Art | data scull tor

创意经济的人工智能艺术解决方案。点击阅读 MLearning.ai Art,作者 Datasculptor,是一个子堆栈出版物,包含…

mlearning.substack.com](https://mlearning.substack.com) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据窃贼

看本视频全过程(代码+更多实验)//英文字幕

**感谢您的阅读,**您可能还会喜欢其他一些文章:

[## 机器学习与艺术杂志

这是会员专用的吗?不,还有一个你可以订阅的免费版本。如果你喜欢你收到的东西…

www.getrevue.co](https://www.getrevue.co/profile/mlearning_ai/members) [## 艾:“我期待着将来和你一起工作”

人类创造力的终结?(代码示例)

medium.com](https://medium.com/the-innovation/ai-i-look-forward-to-working-with-you-in-the-future-4068bc639074) [## 参加这些 ML 故事的虚拟现实之旅

使用虚拟现实的 MLearning.ai 顶级作家故事之旅

medium.com](https://medium.com/mlearning-ai/take-vr-tour-of-these-ml-stories-a7550340a6a2)

所有图片均由作者创作。

[## 通过我的推荐链接加入 Medium-Dariusz Gross # data culptor

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

datasculptor.medium.com](https://datasculptor.medium.com/membership)

麦当娜由 MLearning.ai 生成

🔵 获得全媒体访问

使用 Octoparse 软件为初学者创建数据集

原文:https://towardsdatascience.com/dataset-creation-for-beginners-using-software-4795ee119f6d?source=collection_archive---------38-----------------------

这是一种有趣的学习方式,可以在几分钟内抓取 1000 个网页。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

迈克尔·波德格在 Unsplash 上的照片

介绍

为什么是这篇文章?

本文是网络抓取系列的第二部分。
正如我之前在我的第一篇文章中提到的,我选择写一篇关于抓取的文章,因为在构建我的项目假新闻检测系统期间,我花了几天时间进行相应的研究,因为我无法找到我需要的数据集。

所以,如果你没有看完我的第一篇文章,我强烈建议你看一遍,如果你有编程背景,那么你必须阅读这个系列的第一篇文章。

这篇文章对谁有用?

因为,对于有编程背景的用户,我已经写了一个博客,并且有关于 python 的具体知识,我会建议使用它而不是任何软件来做抓取,因为我发现使用 python 比花几天时间去理解任何特定软件的接口更容易。

但是那些没有任何编程背景的人,你可以跟着我一起熟悉这个软件的界面和工作。

概观

本文是这个系列的第二部分,使用软件抓取网页: Octoparse

然而,有许多软件,你可以很容易地在互联网上找到自动化的目的,如

ParseHubScarpeSimpleDiffbotMozenda

不同自动化软件简介:

**1。parse hub:**网站:https://www.parsehub.com/

目的: Parsehub 是一个非凡的工具,它无需编码就能构建网页抓取器来提取大量数据。它被数据科学家、数据记者、数据分析师、电子商务网站、求职板、市场营销、金融等更多的人使用。

特点:它的界面使用起来非常简单,你只需点击你想要的数据就可以构建网页抓取器。然后,它以 JSON 或 Excel 格式导出数据。它有许多方便的功能,如自动 IP 轮换,允许在登录墙后抓取,浏览下拉列表和标签,从表格和地图中获取数据,等等。此外,它有一个慷慨的免费层,允许用户在短短 40 分钟内收集多达 200 页的数据!Parsehub 的优点还在于它为 Windows、Mac OS 和 Linux 提供了桌面客户端,因此无论运行什么系统,您都可以在自己的电脑上使用它们。

2。简单的刮擦:
网站:https://www.scrapesimple.com

**目的:**对于想要定制铲运机的人来说,ScrapeSimple 是完美的服务。Web 抓取非常简单,只需填写一张表格,说明您需要哪种数据。

功能: ScrapeSimple 名副其实,它提供完全托管的服务,为客户构建和维护定制的 web 抓取工具。只要告诉他们你需要从哪些网站获取什么信息,他们就会设计一个定制的 web scraper,定期(可以是每天、每周、每月或任何时间)将 CSV 格式的信息直接发送到你的收件箱。这项服务非常适合那些只需要一个 HTML 刮刀而不需要自己编写任何代码的企业。响应时间很快,服务非常友好和有帮助,这使得这项服务非常适合那些只需要完整数据提取过程的人。

3。Diffbot:
网站:https://www.diffbot.com

**用途:**有特定数据抓取和屏幕抓取需求的企业,尤其是抓取经常改变 HTML 结构的网站的企业。

特性: Diffbot 与大多数页面抓取工具不同,它使用计算机视觉(而不是 HTML 解析)来识别页面上的相关信息。这意味着即使一个页面的 HTML 结构改变了,只要页面看起来没有变化,你的网页抓取器就不会崩溃。对于长期运行的关键任务 web 抓取作业来说,这是一个不可思议的功能。虽然它们可能有点贵(最便宜的计划是每月 299 美元),但它们在提供优质服务方面做得很好,对于大客户来说,这可能是值得的。

**4。莫曾达:**网站:https://www.mozenda.com/

**目的:**寻找基于云的自助式网页抓取平台的企业无需再犹豫。Mozenda 已经抓取了超过 70 亿个页面,拥有服务全球企业客户的丰富经验。

功能: Mozenda 允许企业客户在其强大的云平台上运行 web 抓取器。他们在客户服务中脱颖而出(为所有付费客户提供电话和电子邮件支持)。它的平台是高度可扩展的,也允许本地托管。像 Diffbot 一样,它们有点贵,它们的最低计划起价为 250 美元/月。

  • 虽然我打算在这篇文章中详细讨论八解符,因为我只使用过它。

八解析

网址:http://agent.octoparse.com/ws/435

目的: Octoparse 是一个非常棒的工具,适合那些希望从网站中提取数据而无需编码,同时仍能通过其易于使用的用户界面控制整个过程的人。

**特性:**octoporse 对于那些不需要学习编码就想抓取网站的人来说是一个完美的工具。它具有一个指针和点击屏幕抓取器,允许用户抓取登录表单,填写表单,输入搜索词,滚动无限滚动,呈现 javascript 等等。它还包括一个站点解析器和一个托管解决方案,供希望在云中运行其抓取器的用户使用。最重要的是,它有一个慷慨的免费层,允许用户免费建立多达 10 个爬虫。对于企业级客户,他们还提供完全定制的爬虫和托管解决方案,他们负责为您运行一切,并直接向您提供数据。

从 1000 篇新闻文章中提取数据的逐步解释

第一步:下载 Octoparse

第二步:报名

  • 完成下载和安装后,如果您以前没有创建过帐户,请注册一个。

第三步:探索它

  • 在您自己开始之前,我强烈建议您探索它的不同部分,这些部分最终将帮助您在以后的工作中与这个界面进行交互。
  • 浏览热门模板部分,那里有一些热门网站的热门模板,你可能会在那里找到你需要的数据。
  • 浏览模板模式和高级模式的教程

第四步:输入网址

  • 如果你只想从一个网站抓取数据,你可以简单地将你复制的网址粘贴到主页上,然后点击开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Octoparse 软件截图

  • 但是如果你想从多个网站收集数据。然后,转到新的选项卡&然后,单击高级选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 你会看到一个像这样的新窗口,在这个窗口中,你可以用更高级的选项轻松地组织你的工作,也可以跟踪你的目录。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 因此,你可以在这里上传多达 10k 个不同的网址,但条件是这些不同的网址的布局应该是相同的,以便能够提取数据,否则,它会自动完成这个过程,但会给你不同网站的布局单独的结果。所以你不会得到所有的数据合并在一起。

第五步:指定刮削细节&属性

点击保存,你会看到这样一个窗口:
左边部分是维护工作流程,中间会显示你输入的第一个 URL 的网页,下面部分会显示数据预览。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 在那里,你有两个选项来进一步移动:自动检测网页数据

你可以选择“自动检测网页数据”,根据它的理解抓取 imp 特性并返回五个不同的结果。其中你可以选择跳过对你没用的东西,或者保留它,如果它按照你的意愿刮去了所有属性的话。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

在下面的对话框中,您可以根据需要选择进行编辑。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

因此,在上面的图像中,您可以根据需要启用或禁用 3 个选项。

  • 首先:**向下滚动页面以加载更多数据。**因此,如果一个网页没有分成不同的页面,所有的数据可能都在同一个页面上&要提取所有数据,您只需启用“加载更多数据”选项。
  • 第二:点击下一页按钮抓取多个页面
    启用它将对您选择作为下一页按钮的页面进行分页。
  • 因此它将允许您检查编辑下一步按钮。点击检查,您将看到下一步按钮在自动检测的网页部分高亮显示。
  • 如果自动检测不正确,点击编辑 >现在点击网页屏幕上您想要检测为“下一个按钮的任何内容。例如,假设没有"下一页"按钮,而是" > “作为"下一页按钮"或者如果您不想自动抓取网页的最后一页,您可以选择分页到特定的页面,如:” 1 “、” 2 “、” 3 " &等等…
  • 第三:点击 state_url,在之后的页面上抓取数据
  • 它将允许您捕获随后页面的内容或文本,并创建另一个包含文本的属性(意味着在单击特定 URL 时页面内容会打开)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 在提示中还有一个选项,“切换自动检测结果(1/5) ”,因此单击此链接,您将能够看到 5 组不同的自动检测数据集。你可以根据需要保留它。
  • 编辑完成后,点击保存设置
  • 您可以在数据预览中看到抓取的结果,也可以编辑“属性名称”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 您将看到工作流程中的如下变化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

手动编辑任务工作流

  • 或者您可以根据需要选择手动编辑工作流&从 web 页面中选择一个特定的元素作为属性显示在您的数据集中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 在那里,在指向下的箭头上,您会发现一个“+”号,可以根据您的需要添加元素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 这将有助于你明确和组织你的工作。与前面自动检测数据的情况一样,它自动抓取了太多不相关的属性。所以具体到你需要什么,我会建议选择第二个选项。
  • 它还允许您重命名、删除或编辑任何特定元素,或者您可以根据需要选择更改设置。
  • 我将向您演示一个提取 1000 篇具有 6 个属性的文章的示例:新闻标题链接来源陈述于日期图片 _url

手动提取数据

  • 要提取所有内容,请转到网页部分>选择第一篇文章的具体细节,如:“新闻标题”、“新闻链接”、“新闻来源”、“声明日期”、“日期”>只需在第一篇文章上单击这些项目>该部分将被突出显示,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

对所列网址首页的所有新闻文章进行数据提取

  • 然后,选择“全选”选项将会选择每篇文章的相同具体细节,直到网页的最后。您将在数据预览中看到捕获的 30 行,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 现在,点击“提取数据”选项,将提取所输入网址的第一页上列出的所有文章的所有详细信息。
  • 您现在可以看到工作流程中的更改:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 将打开一个对话框,要求提取更多元素:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 由于我们还没有抓取 image_url,我们将单独选择它,并按照上面列出的相同步骤操作:
  • 选择网页部分上的图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 将出现一个对话框,带有 diff options > Select "Select All选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 另一个弹出窗口将会出现,要求 diff 选项选择>选择"提取图像 URL"

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 对于第一页上的所有新闻文章,您已经完成了抓取图像 URL 的工作&这将为您的数据预览添加一个新属性。
  • 这是编辑属性名称后数据预览的外观:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 一个弹出窗口将再次出现,要求提取更多的元素,因为我们希望从多个页面提取数据,我们将进行分页。

分页

  • 现在,如果您需要大量数据,您可以循环到特定页面或所列 URL 的最后一页。
  • 要进行分页,您所需要的只是搜索为特定网页指定下一页的关键字,例如:“ next ”、“ > ”或任何内容。>点击关键字>在我的例子中,它是“下一个”按钮本身>点击它>它将被高亮显示&一个新窗口将会弹出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 选择循环点击下一页
  • 完成后,您的工作流现在看起来有点像 auto one 的工作流。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 完成所有编辑并组织好数据后,单击保存并运行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

第六步:将数据导出到你的机器

  • 点击保存 & 运行选项将打开带有新窗口清单 3 的选项来选择如何运行它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 如果你是一个高级用户,只有这样你才能访问最后两个选项,这些选项提供了像每天,每周,每月抓取任何网站的功能和许多其他功能。他们的服务器会照顾你的数据,并在根据你选择做的事情进行组织后发送给你。
  • 如果您不是自由用户,请选择第一个选项,“在您的设备上运行任务”
  • 它将开始提取所有数据,而且在提取数据时,您需要稍微注意一下,虽然这是通过自动化完成的,因为如果数据限制超过 10k,它将停止,您将不得不再等一个小时来从头提取数据。

您还需要唤醒您的系统,因为如果您的屏幕在提取数据时休眠,它可能会停止提取数据&您将不得不再次启动它来提取更多或尽可能多的数据。

  • 选择导出数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 选择保存文件的格式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 因此,我选择将我的文件提取为. csv 文件,并将其保存到我的桌面上,不要关闭此窗口,我们将使用它来提取数据。又是 xlsx 格式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 Octoparse 的截图

  • 现在,让我们来看看我们提取的数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

哦哦!😐这是一种可疑的形式,不可读&根本没有条理。

让我们再次转到导出窗口:导出数据>选择。xlsx 格式这次>点击确定。

  • 现在,让我们看看中导出的数据。xlsx 格式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

瞧啊。现在,这确实有意义,所有的模糊性都从我们的数据中消除了。

步骤 7:使用公式格式化 Excel 文件

检查数据集

  • 你要做的第一件事是检查你的数据集,在检查我的数据集时,我发现一些不相关的东西,我无法在抓取时编辑。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,我们将对 excel 文件执行一些格式化任务。

I. 查看我的“图片 URL ”属性,所以我提取图片 URL,从中提取标签。由于标签值写在图像 URL 中,我没有找到任何更好的选项来提取它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 所以如果你仔细注意到“图片 URL ”属性,有一个小字符串“”。jpg " &一个更大的字符串"https://static.politifact.com/img/meter-",它对于所有行的"图像 URL 属性都是通用的。
  • 因此,我们将用“”替换这两个字符串,以获得我的标签值。
  • 按 ctrl+H >填充字段"查找什么"用"。jpg" &然后,将字段"替换为"填充为"<空白区域>"(表示您不必在那里指定任何内容)>单击"替换所有 " >按"确定 " &您就完成了您的标签。

1。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是您的属性格式化后的样子,

3。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 正如你所看到的,它还有两个问题,首先是第一个单元格中的值是一个超链接。第二是多余的空间。
  1. 要从特定单元格中“移除超链接”>右击它>从下拉菜单中选择“移除超链接”。要从整列中移除>选择整列>右击它>从下拉菜单中选择“移除超链接”。
  2. 要删除特定属性中的“多余空格”,请>转到任何空白单元格>编写公式: =TRIM(属性的第一个单元格的地址) >按 enter 键>您将看到第一个单元格的格式化值>将更改应用到所有单元格>拖动&将第一个单元格拖放到特定属性的最后一个单元格。>您将看到所有以应用格式插入的值>现在通过选择整个新列用旧列替换新列>>复制它>然后,在需要粘贴的地方选择整个旧列>转到粘贴选项>从下拉列表中选择粘贴值(V)选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

太棒了。您已经完成了“标签列。
现在看一看:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二。看看我的另一个属性上的表述,其中我关注的数据是唯一的日期。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要删除除此之外的文本,我们将分两步进行:

  • 正如您已经看到的,对于在整个列中重复的字符串的相似模式,我们可以使用前面的模式来查找它&用 nothing 替换它。因此,对于子字符串“stated on ”,我们将用 nothing 替换它。

这就是我们专栏的样子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 注意到上面的图片,你会发现这个列的所有行的另一个子字符串是不同的,那么该怎么办呢,因为我们只需要一个日期,我们这次将提取它:

让我们看看:在一个新的空单元格中键入 command " =MID(所述属性的第一个单元格的地址,你要提取的字符串的起始索引,你要提取的字符数 " >按 enter >你会看到第一个格式化的值>然后,重复上述步骤来改变所有值&用新值替换它。

编写公式的格式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按回车键时:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看看属性上新的说明:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**三。**在“ Date ”属性中,我们不需要日期以外的文本,我们也不能在这里使用“ mid ”公式,因为日期是在字符串&的后缀中指定的,没有明确的起点,因为它对于所有的比较单元格都是变化的。

因此,我们将通过使用“ RIGHT ”来实现此任务:

转到 new empty cell > type command "RIGHT(E2,LEN(E20-FIND(",E2)) " >按 enter >键,执行与上述相同的步骤,用旧值替换新列插入的值。

  1. 编写公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.按回车键:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.新列将如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有格式化后的最终数据集:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以,这些数据现在都已经整理好了,可以使用了,我希望你们会发现这篇文章对你们有用。请在评论框中分享你的想法&如果你有任何疑问,请告诉我。✌️

所以,如果我的博客帖子对你有所帮助,而你此刻觉得很慷慨,请不要犹豫,请给我买杯咖啡。☕😍

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是的,点击我。

And yes, buying me a coffee **(and lots of it if you are feeling extra generous)** goes a long way in ensuring that I keep producing content every day in the years to come.

您可以通过以下方式联系我:

  1. 订阅我的 YouTube 频道 视频内容即将上线 这里
  2. 跟我上
  3. 通过 LinkedIn 联系我
  4. 跟随我的博客之旅:-https://kajalyadav.com/
  5. 成为会员:https://techykajal.medium.com/membershipT21

也可以看看我的其他博客:

[## 8 ML/AI 项目,让您的投资组合脱颖而出

有趣的项目想法与源代码和参考文章,也附上一些研究论文。

towardsdatascience.com](/8-ml-ai-projects-to-make-your-portfolio-stand-out-bfc5be94e063) [## 基于 Python 的推特情感分析预测美国总统大选

修订数据科学基础的有趣项目,从数据集创建到数据分析再到数据可视化

medium.com](https://medium.com/datadriveninvestor/predicting-us-presidential-election-using-twitter-sentiment-analysis-with-python-8affe9e9b8f)

使用 Open Refine 操作数据集

原文:https://towardsdatascience.com/dataset-manipulation-with-open-refine-a5043b7294a7?source=collection_archive---------29-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由皮克斯拜的 Gerd Altmann 提供

Open Refine 是一个用于清理、转换和丰富数据集的 web 应用程序。可以在以下地址下载:【http://openrefine.org。在下载部分,您可以下载适用于 Windows、Linux 和 Mac OS 的最新稳定版本。下载安装程序后,就可以运行了。一旦执行,该应用程序就可以在以下地址由浏览器使用: http://127.0.0.1:3333

Open Refine 允许您执行各种操作。在本教程中,我们将只看到以下内容:

  1. 上传 CSV 格式的数据集(也支持其他格式)
  2. 对列的操作
  3. 在现有列的基础上添加新列
  4. 从柱中提取元素
  5. 用外部数据丰富数据集

对于数据操作,Open Refine 使用 GREL(通用精炼表达式语言)。

数据集的上传

例如,我们采用包含 2015 年托斯卡纳地区编辑作品的数据集。在数据集下载之后,运行 Open Refine 并从左侧的菜单中选择 Create Project 项。然后选择我们要从计算机导入的文件,并按下一步按钮。此时,会出现项目的预览。在下半部分,出现另一个菜单(见下图),从中可以选择一些选项,如 CSV 字段的分隔字符(由标题指示,列由分隔)和右侧的其他选项(ad 示例将下一行解析为 setnames 的下一列标题列)。位于左上角的另一个选项提供了设置编码的可能性。在我们的例子中,预览中的数据集存在一些编码问题,因此我们可以从选项字符编码中选择 utf8 编码。至此,我们的数据集的编码问题应该解决了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

此时,在页面的右上部分,我们可以更改项目的名称(在项目名称下),然后按下按钮创建项目。应用程序屏幕应该如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

列操作

首先,我们希望在 Author 列中分离作者,并为每个作者创建一个列。为此,根据作者列的标题,单击箭头,从打开的下拉菜单中(见下图),选择编辑列,然后拆分为几列。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在打开的窗口中(见下图),您可以选择各种选项,包括如何划分列。在我们的例子中,默认选项就可以了,即使用逗号作为字段分隔符。我们按下 ok 按钮,我们看到我们的表已经改变。原来的列已经被删除,并且创建了许多列,每一列都以该列的旧名称作为名称,后跟一个渐进的数字。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

现在让我们删除所有添加的列,除了第一列。这样我们就只有每篇编辑作品的第一作者了。为此,对于要删除的每一列,始终从列名旁边的箭头中选择“编辑列”选项,然后删除该列(见下图)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

此时,我们只有一个列有第一作者的名字。我们把专栏改名为“第一作者”吧。为此,我们从列名旁边的箭头选择编辑列,然后重命名该列:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

现在,假设我们想要创建两个新列,一个包含第一作者的姓名,另一个包含第一作者的姓氏。为此,从箭头中选择编辑列,然后基于此列添加列:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在打开的窗口中,您必须指明要创建的列的名称,然后用 GREL 语言指定表达式来操作该列。让我们来插一句 GREL 语。在 GREL,你可以使用变量、控件和函数。变量代表表中的行。有不同类型的变量:

  • 值—表示对应于选定列的单元格值
  • 单元格—表示对应于选定列的单元格。可以对该变量执行两个操作:执行 cell.value(对应于 value)和 cell.recon(允许获得与外部数据的协调过程的结果)
  • 单元格—表示整行。若要访问列的值,必须使用以下语法:cells [“column name”]。价值。

至于控件,有不同的类型,包括 if 和 foreach。有关更多详细信息,请参见文档。最后是函数,可以是不同的类型。其中最重要的是字符串操作。有关更多详细信息,请参见文档。

让我们回到我们的数据集。我们说过要创建两个新列,一个包含作者的名字,另一个包含作者的名字。为此,我们可以使用之前使用的拆分列,但是我们会丢失原始列。要保留起始列,我们可以使用添加列。在为 GREL 表达式保留的字段中,我们可以使用 substring 函数创建包含姓名的第一列,该函数从传递的字符串中提取一个子字符串。我们将 substring 函数应用于当前单元格的值(由 value 变量表示),它接收子字符串的极值(起始索引,到达索引)。起始索引为 0,而到达索引由空格字符的位置给出,可通过indexOf function识别,始终应用于变量值:

value.substring (0, value.indexOf (“”))

这样我们就知道了作者的名字。要获得姓氏,您需要创建一个新列,然后再次选择 add column based on this column,然后通过 GREL 以如下方式操作字符串:您必须从字符空格+ 1 的位置开始从 value 变量中提取一个子字符串:

value .substring (value.indexOf (““))

此时,结果应该如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

要向左或向右移动列,您可以从箭头中选择“编辑列”菜单,然后向左或向右移动列(见下图)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

丰富数据集

现在假设我们要为带有 ISBN 码的图书添加标识码。为此,我们可以查询 opac.sbn.it 网站,该网站提供了一个 API,用于接收输入的 ISBN 代码并返回一系列信息。API 可以按如下方式调用:

http://opac.sbn.it/opacmobilegw/search.json?isbn=numeroisbn

结果是一个 json,其中还包含图书的识别码。在我们的例子中,我们选择对应于 ISBN 的列,然后编辑列,然后通过获取 URL 添加列:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在与 GREL 语言相对应的方框中,我们必须区分包含 ISBN 的行和不包含 ISBN 的行。我们可以将不包含 ISBN 的行识别为长度为 1 的行。因此,我们可以使用 IF 类型控件来检查该行是否包含 ISBN。if 检查的工作方式如下:

if (condition, true expression, false expression)

如果条件出现,则执行真表达式,否则执行假表达式。在我们的案例中:

if (value.length () == 1, null, *load_identification_code*)

要加载标识码,您需要调用 API。为此,只需输入带引号的 API URL,并使用+运算符添加任何变量。在我们的例子中,有必要指定 ISBN,它有时会等于当前行的值(value):

“http://opac.sbn.it/opacmobilegw/search.json?isbn=" + value

那么要插入 GREL 盒的完整代码是这样的:

if (value.length () == 1, null, “http://opac.sbn.it/opacmobilegw/search.json?isbn=" + value)

让我们为新列命名(例如 JSON ),然后点击 ok。我们等待结果。当系统完成这个过程时,会出现一个名为 JSON 的新列,其中包含一个 JSON,包含从 API 中提取的所有信息。现在要提取标识码字段,我们需要解析 JSON。我们选择 JSON 列,并从菜单“编辑列”中选择“基于此列添加列”。我们插入新列的名称(标识代码),并在与 GREL 语言相关的空间中插入代码来操作 JSON。首先,我们需要检查:如果字段为 null,我们不需要做任何事情,否则我们必须解析 JSON。我们使用 isNull 函数来检查变量是否为空:

if (isNull (value), null, *parsing_del_json*)

现在让我们来处理 JSON 的解析。我们将 parseJson()函数应用于 value 变量,该变量将 Json 转换为一个数组,因此我们可以直接访问数组的字段。识别码位于简要记录阵列的第一个位置。因此,我们可以按如下方式访问它:

value.parseJson () [“briefRecords”] [0] [“Identification”]

代码将插入为 GREL 语言保留的空间中的完整代码如下:

if (isNull (value), null, value.parseJson () [“briefRecords”] [0] [“Identification code”])

现在按 ok 按钮,我们将看到一个新的列出现,它带有与 ISBN 代码行相对应的识别码。

摘要

在本教程中,我演示了如何使用 Open Refine 提供的基本功能,这是一个非常强大的数据集操作工具。Open Refine 结合了图形操作和用 GREL 语言执行的高级操作。

如果你想了解我的研究和其他活动的最新情况,你可以在 TwitterYoutubeGithub 上关注我。

Python 中的数据集

原文:https://towardsdatascience.com/datasets-in-python-425475a20eb1?source=collection_archive---------3-----------------------

5 个软件包,可轻松访问各种数据集

有一些有用的 Python 包,只需要几行代码就可以加载公开可用的数据集。在本帖中,我们将看看 5 个包,它们提供了对一系列数据集的即时访问。对于每个包,我们将了解如何检查其可用数据集列表以及如何将示例数据集加载到熊猫数据框架

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由王思然·哈德森Unsplash 上拍摄

0.Python 设置🔧

我假设读者(👀是的,你!)可以访问并熟悉 Python,包括安装包、定义函数和其他基本任务。如果你是 Python 的新手,这个是一个很好的入门地方。

我已经在 Jupyter Notebook 中使用并测试了 Python 3.7.1 中的脚本。在我们开始之前,让我们确保您已经安装了相关的软件包:

◼️ ️ pydataset :数据集包,
◼️ ️ seaborn :数据可视化包,
◼️ ️ sklearn: 机器学习包,
◼️ ️ statsmodel :统计模型包,
◼️ ️ nltk: 自然语言工具包包

对于每个包,我们将检查示例数据集的形状头部尾部。为了避免重复我们自己,让我们快速制作一个函数:

# Create a function to glimpse the data
def glimpse(df):
    print(f"{df.shape[0]} rows and {df.shape[1]} columns")
    display(df.head())
    display(df.tail())

好了,我们准备好潜水了!🐳

1.PyDataset📚

我们要看的第一个包是 PyDataset 。它易于使用,可以访问 700 多个数据集。这个包的灵感来自于在 R 中访问数据集的便利性,并致力于在 Python 中实现这种便利性。让我们来看看数据集列表:

# Import package
from pydataset import data# Check out datasets
data()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这将返回一个数据帧,其中包含您可以浏览的所有数据集的 dataset_idtitle 。目前,有 757 个数据集。现在,让我们加载著名的 iris 数据集作为示例:

# Load as a dataframe
df = data('iris')
glimpse(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

导入包后,将数据集加载到 dataframe 只需要一行代码。就这么简单,对吧?需要注意的是,在这个数据集中,行索引从 1 开始,而不是从 0 开始。

🔗要了解更多信息,请查看 PyDataset 的 GitHub 库

2.海生的🌊

Seaborn 是另一个软件包,它提供了对示例数据集的简单访问。要找到数据集的完整列表,你可以浏览 GitHub 库,或者你可以像这样用 Python 查看:

# Import seaborn
import seaborn as sns# Check out available datasets
print(sns.get_dataset_names())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目前,有 17 个数据集可用。让我们以加载虹膜数据集为例:

# Load as a dataframe
df = sns.load_dataset('iris')
glimpse(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

导入包后,只需一行代码就可以将数据集作为 dataframe 加载。

🔗要了解更多信息,请查看 load_dataset文档页面。

3.sci kit-学习📓

s cikit-learn 不仅在功能工程和构建模型方面表现出色,它还附带玩具数据集,并提供下载和加载真实世界数据集的便捷途径。玩具和真实数据集的列表以及其他细节可在这里获得。您可以通过滚动链接或参考各个函数的文档来了解有关数据集的更多详细信息。值得一提的是,在这些数据集中,有一些玩具和真实的图像数据集 ,如数字数据集奥利维蒂人脸数据集

现在,让我们通过一个示例来看看如何加载真实数据集:

# Import package
from sklearn.datasets import fetch_california_housing# Load data (will download the data if it's the first time loading)
housing = fetch_california_housing(as_frame=True)# Create a dataframe
df = housing['data'].join(housing['target'])
glimpse(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面是如何加载一个示例玩具数据集, iris :

# Import package
from sklearn.datasets import load_iris# Load data
iris = load_iris(as_frame=True)# Create a dataframe
df = iris['data'].join(iris['target'])# Map target names (only for categorical target)
df['target'].replace(dict(enumerate(iris['target_names'])), 
                     inplace=True)
glimpse(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

💡如果您得到一个关于 as_frame 参数的错误,请将您的 sklearn 版本更新到 0.23 或更高版本,或者使用下面的脚本:

# Import packages
import pandas as pd
from sklearn.datasets import load_iris# Load data
iris = load_iris()# Create a dataframe
X = pd.DataFrame(iris['data'], columns=iris['feature_names'])
y = pd.DataFrame(iris['target'], columns=['target'])
df = X.join(y)# Map target names (only for categorical target)
df['target'].replace(dict(enumerate(iris['target_names'])), 
                     inplace=True)
glimpse(df)

🔗欲了解更多信息,请查看 scikit-learn 的文档页面

4.统计模型📔

另一个我们可以用来访问数据的包是 s tatsmodels 。可用的内置数据集列在他们网站上的这里。让我们选择‘美国宏观经济数据’作为例子并加载它:

# Import package
import statsmodels.api as sm# Load data as a dataframe
df = sm.datasets.macrodata.load_pandas()['data']
glimpse(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可能已经注意到,我们用来访问‘美国宏观经济数据’的名字是宏观数据。要找到其他数据集的等效名称,请查看该数据集文档的 URL 末尾。例如,如果您点击可用数据集部分中的“美国宏观经济数据”并查看浏览器中的地址栏,您会在 URL 的末尾看到*“macro data . html”*。

Statsmodels 还允许使用 get_rdataset 函数从 R 加载数据集。此处的可用数据集列表为。以 iris 数据集为例,我们可以这样加载数据:

# Load data as a dataframe
df = sm.datasets.get_rdataset(dataname='iris', package='datasets')['data']
glimpse(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

🔗欲了解更多信息,请查看数据集的文档页面

5.自然语言工具包| NLTK📜

这个包与其他包略有不同,因为它只提供对文本数据集的访问。这里是可用的文本数据集列表(Psst,请注意列表中的一些项目是模型)。使用 id ,我们可以从 NLTK 访问相关的文本数据集。我们以情感极性数据集为例。它的 id电影 _ 评论。让我们先用下面的脚本下载它:

# Import package
import nltk# Download the corpus (only need to do once)
nltk.download('movie_reviews')

如果已经下载了,运行它会通知您已经下载了。下载后,我们可以将数据加载到数据帧中,如下所示:

# Import packages
import pandas as pd
from nltk.corpus import movie_reviews# Convert to dataframe
documents = []
for fileid in movie_reviews.fileids():
    tag, filename = fileid.split('/')
    documents.append((tag, movie_reviews.raw(fileid)))
df = pd.DataFrame(documents, columns=['target', 'document'])
glimpse(df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在将文本数据从 NLTK 转换为 dataframe 时,没有一种适合所有情况的方法。这意味着您需要根据具体情况寻找转换为数据帧的适当方法。

🔗欲了解更多信息,请查看关于访问文本语料库和词汇资源的资源。

这就是你要的,5 个允许轻松访问数据集的包。现在您知道如何从这些包中加载数据集了。这些包中可用的数据集将来可能会改变,但是你知道如何找到所有可用的数据集!🙆

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯汀娜·戈塔迪在 Unsplash 上的照片

您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果你使用 我的推荐链接成为会员,你的一部分会费会直接去支持我。

谢谢你看我的帖子。希望你找到了有用的东西,✂️.如果你感兴趣,这里有我的一些其他帖子的链接:
◼️️ 给熊猫用户的 5 个提示
◼️️️️ 如何在熊猫数据框架中转换变量
◼️ TF-IDF 解释
◼️python 中的监督文本分类模型

再见🏃💨

SQL 中的日期/时间函数

原文:https://towardsdatascience.com/date-time-functions-in-sql-1885e2cbdc1a?source=collection_archive---------3-----------------------

如何使用 CAST、EXTRACT 和 DATE_TRUNC 的教程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由卢卡斯·布拉塞克Unsplash 上拍摄

什么是时序数据?

在使用 SQL 时,处理日期和时间是一种常见的做法。使用日期,我们可以计算随时间的变化,数据的趋势,执行区间运算。更好地理解潜在业务问题的影响。

时序数据作为一系列数据点,随着时间的推移测量同一事物,按时间顺序存储。

时序数据的一些常见用途

  • 股票价格变动
  • 传感器跟踪(例如,天气跟踪)
  • 租赁服务(如自行车或踏板车租赁)

我们开始吧

对于本教程,我将假设您具有中级 SQL 技能。我们将讨论三个函数并使用 PostgreSQL 语法。

  1. 提取
  2. 日期 _TRUNC

当分解包含大量数据的数据集时,这些函数都很有用。当我们通过一些例子浏览代码时,我们将会看到每种方法的优点。

铸造功能

一个CAST函数将选择的数据类型转换成另一种类型。相当直接。它把一种类型变成你喜欢的类型。语法如下。

CAST(expression AS **datatype**)

下面是一个如何应用于日期和时间的例子。

SELECT
    NOW(),
    CAST(NOW() AS TIMESTAMP),
    CAST(NOW() AS DATE),
    CAST(NOW() AS TIME),
    CURRENT_DATE,
    CURRENT_TIME

在这个查询中,我们期望有 6 个输出。如果您不熟悉NOW()CURRENT_DATECURRENT_TIME,它们是检索当前时间或日期的 SQL 函数。以下是按顺序排列的查询的所有输出。(注意—由于这些函数调用的是确切的时间或日期,因此您将获得不同的数字)

  • 2020–03–28 23:18:20.261879+00:00
  • 2020–03–28 23:18:20.261879
  • 2020–03–28
  • 23:18:20.261879
  • 2020–03–28
  • 23:18:20.261879+00:00

查看来自单独使用的NOW()的第一个结果,我们得到一个完整的时间戳值,包括时区。现在我们来看第二个输出,我们使用CAST只检索时间戳,不包括来自NOW()的时区。现在我们可以看到 cast 是如何工作的了。我们传入一个我们想要转换的值,然后声明我们想要的类型。

接下来,我们在NOW()上使用CAST(),但是传入DATE作为我们想要的类型。我们现在得到了一个时间戳,只保留了年/月/日格式。类似地,看看只有TIMENOW()CAST()函数,我们得到的只是没有日期的时间值。

我们可以看到CAST函数如何与时间一起工作,使用CURRENT_DATECURRENT_TIME的最后两个输出只是为了让您看到结果的比较。

更多示例—不带时间戳

SQL 还允许CAST()函数用于没有时间戳的类型。

SELECT 
    CAST(1.34 AS INT),
    CAST(1 AS BOOLEAN),
    CAST(2.65 AS DEC(3,0))

该查询的结果是,

  • 1 →因为整数不能有小数,所以会四舍五入到最接近的整数值
  • true → 1 作为布尔值为真,0 为假
  • 3 →使用DEC()我们也可以做第一次整数转换的反向操作。

间隔

在 SQL 中,您还可以使用INTERVAL为您拥有的任何时间戳添加更多时间。对于下面的例子,您不需要使用CAST()函数,但是我选择这样做只是为了得到日期。

SELECT
    CAST(NOW() AS DATE) AS TODAY_DATE,
    CAST((**INTERVAL** '3 DAYS' + NOW()) AS DATE) AS three_days,
    CAST((**INTERVAL** '3 WEEKS' + NOW()) AS DATE) AS three_weeks,
    CAST((**INTERVAL** '3 MONTHS' + NOW()) AS DATE) AS three_months,
    CAST((**INTERVAL** '3 YEARS' + NOW()) AS DATE) AS three_years

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输出

我们可以看到,除了以天、周、月或年为单位的时间间隔长度之外,使用INTERVAL会为您拥有的任何日期增加更多时间——在本例中,当前日期是从NOW()获得的。

提取()

接下来,我们可以看看从时间戳中提取特定的格式。目标是从时间戳中提取一部分。例如,如果我们只需要 2018 年 12 月 10 日的月份,我们将得到 12 月(12)。

让我们来看看EXTRACT的语法

EXTRACT(part FROM date)

我们声明我们想要的提取类型为部分,然后是要提取的源日期EXTRACT是时间序列数据分析的重要工具。它可以帮助您隔离时间戳中的组,以便基于精确的计时来聚合数据。例如,如果一家汽车租赁店想在每个MAY找到MONDAYS最繁忙的租赁HOUR,您可以使用EXTRACT来完成。你可以深入细节,看到更多有价值的见解。

假设我们运行NOW(),我们的时间戳是2020–03–29 00:27:51.677318+00:00,我们可以使用EXTRACT得到以下内容。

SELECT
    EXTRACT(MINUTE      FROM NOW()) AS MINUTE,
    EXTRACT(HOUR        FROM NOW()) AS HOUR,
    EXTRACT(DAY         FROM NOW()) AS DAY,
    EXTRACT(WEEK        FROM NOW()) AS WEEK,
    EXTRACT(MONTH       FROM NOW()) AS MONTH,
    EXTRACT(YEAR        FROM NOW()) AS YEAR,
    EXTRACT(DOW         FROM NOW()) AS DAY_OF_WEEK,
    EXTRACT(DOY         FROM NOW()) AS DAY_OF_YEAR,
    EXTRACT(QUARTER     FROM NOW()) AS QUARTER,
    EXTRACT(TIMEZONE    FROM NOW()) AS TIMEZONE

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输出

我们看到,我们可以深入了解如何从时间戳中提取信息。注意— DOW —一周中的某一天是星期日(0)到星期六(6)。

我们可以在前面的租车例子的基础上,看看它是如何工作的。

SELECT 
  EXTRACT(HOUR FROM RENTAL_DATE) AS HOUR, 
  COUNT(*) as RENTALS 
FROM RENTAL 
WHERE
    EXTRACT(DOW   FROM RENTAL_DATE) = 1 AND
    EXTRACT(MONTH FROM RENTAL_DATE) = 5
GROUP BY 1
ORDER BY RENTALS DESC

请记住,我们希望每个MAYMONDAYS有最繁忙的出租HOUR。首先,我们在SELECT中使用EXTRCT来声明,我们只需要HOUR和总计COUNT。然后我们在WHERE子句中为传递两个EXTRACT函数,以便只过滤MONDAYSMAY。看下面的表格,上午 11 点是 5 月份每周一最受欢迎的出租时间,共有 11 次出租。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输出

日期 _TRUNC

截断——通过或仿佛通过切断来缩短

在 SQL 中截断日期的目的是以绝对精度返回一个间隔。精度值是可用于EXTRACT的字段标识符的子集。DATE_TRUNC将返回一个时间间隔或时间戳而不是一个数字。

DATE_TRUNCtime_column语法是包含您想要舍入的时间戳的数据库列,而‘[interval]’表示您想要的精度级别。

DATE_TRUNC(‘[interval]’, time_column)

让我们假设我们的NOW()返回相同的2020–03–29 00:27:51.677318+00:00,我们可以使用date_part得到如下。

SELECT
    CAST(DATE_TRUNC('DAY', NOW()) AS DATE) AS DAY,
    CAST(DATE_TRUNC('WEEK', NOW()) AS DATE) AS WEEK,
    CAST(DATE_TRUNC('MONTH', NOW()) AS DATE) AS MONTH,
    CAST(DATE_TRUNC('YEAR', NOW()) AS DATE) AS YEAR

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输出

可以把使用DATE_TRUNC看作是获取当前位置的间隔,间隔的每一层都是日期被修整的方式。注意——在这个例子中,我们不需要使用CAST。我用它来确保格式干净,便于分析。

我们可以在前面的租车场景中使用DATE_TRUNC,并尝试找出一年中的哪一天(不考虑时间)更受欢迎。

SELECT
    CAST(DATE_TRUNC('DAY', RENTAL_DATE) AS DATE) AS RENTAL_DAY,
    COUNT(*) AS RENTALS
FROM RENTAL
GROUP BY
    RENTAL_DAY
ORDER BY RENTALS DESC

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输出

把所有的放在一起

既然我们已经看到了如何使用CASTEXTRACTDATE_TRUNC,我们可以将我们学到的一些技术整合到一个实际的例子中。

对于本例,我们将添加一个名为AGE的新时间函数,它接受 2 个日期作为参数,并输出“年龄”或日期之间的年和月时间。

让我们通过从2019–05–01 + 30 days中提取租赁持续时间最长(AGE)的客户列表来结束本教程。

SELECT
    CUSTOMER_ID,
    **EXTRACT**(DOW FROM RENTAL_DATE) AS DAY_OF_WEEK,
    **AGE**(RETURN_DATE, RENTAL_DATE) AS RENTAL_DAYS
FROM
    RENTAL
WHERE 
    RENTAL_DATE 
        BETWEEN **CAST**('2019-05-01' AS TIMESTAMP) AND
                **CAST**('2019-05-01' AS TIMESTAMP) + **INTERVAL** '30 DAY'
ORDER BY 3 DESC

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输出

最终结果

我希望您对在 SQL 中使用时间戳感到舒适。你已经学会使用CASTEXTRACTINTERVALDATE_TRUNCAGE。您应该做好充分准备来处理与趋势相关的分析,并更深入地挖掘数据,以找到您以前可能无法找到的见解!

如果你对更多的 SQL 教程感兴趣,可以看看我的其他帖子。

LinkedinGithub 上与我联系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值