5 分钟 5 步学会初学 SQL!
学习科技行业最受欢迎的技能!
介绍
所以你想学 SQL?太好了,你应该!
你知道数据分析师*数据工程师 和数据科学家最想要的第三个技能是什么吗?*
在本文中,我将向您解释如何以最简单的方式使用 SQL 进行查询。但首先,让我定义几个术语…
如果这是你喜欢的那种东西,成为第一批订阅 我的新 YouTube 频道在这里 !虽然还没有任何视频,但我会以视频的形式分享很多像这样的精彩内容。感谢大家的支持:)
定义
**行,也称为**记录,是代表单个实体的属性(变量)的集合。例如,一行可能代表一个住院病人,可能有年龄、体重、身高等属性/变量…
一个表是具有相同属性(相同变量)的行的集合。对我帮助最大的是把一个表格想象成一个 Excel 表格。
表格示例
查询是对数据库表或表组合中的数据的请求。使用上面的表格,如果我想找到所有年龄大于 23 岁的患者,我将编写一个查询。
如何编写 SQL
因为这是给初学者的教程,如果你想从一个表中提取数据,我将向你展示如何编写一个查询。
一个基本查询有五个组件:
- 选择(必填)
- 从(必填)
- 其中(可选)
- 分组依据(可选)
- 排序依据(可选)
其结构如下:
****SELECT**
[column_name_1],
[column_name_2],
[column_name_n]
**FROM**
[table_name]
**WHERE**
[condition 1]
**GROUP BY** [column_name]
**ORDER BY** [column_name]**
让我们带回我的例子作为参考:
1.选择(必填)
****SELECT 确定要从给定的表中提取哪些列。例如,如果我想提取名称,那么我的代码应该是这样的:
**SELECT Name**
一个巧妙的技巧是,如果你想拉所有的列的,你可以使用星号——见下文:****
**SELECT ***
2.从(必填)
****FROM 确定您要从哪个表中提取信息。例如,如果您想要获取患者的姓名,您可能想要从名为 patient_info 的表中获取数据(见上文)。代码看起来会像这样:
**SELECT
Name
FROM
patient_info**
这是您的第一个函数查询!让我们来完成另外 3 个可选步骤。
3.其中(可选)
如果您想选择年龄超过 23 岁的患者的姓名,该怎么办?这就是我们的用武之地。 WHERE 是用来过滤您的表的语句,就像您在 Excel 中使用过滤工具一样!
获取 23 岁以上患者姓名的代码在左边。右侧显示了一个可视化表示:
如果想要满足两个子句的患者姓名,可以使用和**。例如,查找年龄超过 23 岁且体重超过 130 磅的患者的姓名。**
**SELECT
Name
FROM
patient_info
WHERE
Age > 23
AND
Weight_lbs > 130**
如果您想要满足两个子句之一的的患者姓名,您可以使用或。例如,查找小于 22 岁或大于 23 岁的患者的姓名。****
**SELECT
Name
FROM
patient_info
WHERE
Age < 22
OR
Age > 23**
4.分组依据(可选)
GROUP BY 正如它所说的那样— 它将具有相同值的行分组到汇总行中。它通常与计数、最小值、最大值、总和、AVG 等聚合函数一起使用。
让我们用下面的例子:
如果我们想得到每个病人去医院的次数,我们可以使用下面的代码并得到下面的结果:
5.排序依据(可选)
ORDER BY 允许您根据特定属性或多个属性按升序或降序对结果进行排序。我们来举个例子。
**SELECT
*
FROM
patient_info
ORDER BY
Age asc**
“ORDER BY Age asc”意味着您的结果集将按年龄以升序对行进行排序(参见上图中的左表)。如果你想按降序排列(上图的右边表格),你可以用 desc 代替 asc 。
结论
这就是如何构造一个查询!你刚刚学到了科技界最受欢迎的技能之一。我将在下面提供一些链接,在那里你可以练习你的 SQL 技能。尽情享受吧!
感谢阅读!
如果你喜欢我的工作,想支持我…
- 成为第一批订阅我的新 YouTube 频道这里的人之一!虽然还没有任何视频,但我会以视频的形式分享很多像这样的精彩内容。
- 也是这里第一批关注我的 Twitter 的人之一。
- 在 LinkedIn 上关注我这里。
- 在我的邮箱列表** 这里报名。**
- 看看我的网站,terenceshin.com。
加入 700 多万开发人员在 HackerRank 上解决代码挑战的行列,这是为…
www.hackerrank.com](https://www.hackerrank.com/domains/sql) [## SQL 练习、练习、解答-w3 资源
SQL 代表结构化查询语言,它是一种 ANSI 标准的计算机语言,用于访问和操作…
www.w3resource.com](https://www.w3resource.com/sql-exercises/)**
免费从顶尖大学学习数据科学
在哪里可以找到麻省理工学院、斯坦福大学和哈佛大学的免费讲座、研讨会和完整课程
瓦西里·科洛达在 Unsplash 上拍摄的照片
我最近在读一本名为《超学习》的书。加速您的职业生涯,掌握硬技能并智胜竞争对手。这本书讲述了一种学习技巧,可以让你在看似不可能的时间框架内学习新的技能,甚至全新的科目。根据这本书,超学习是“获取技能和知识的一种策略,这种策略是自我导向的和强烈的”。
这本书的作者斯科特·H·杨利用超级学习完成了一项著名的个人挑战。他给自己设定的挑战是在 12 个月内学习完麻省理工学院(T2 麻省理工学院)的计算机科学课程。他在 2012 年成功完成了挑战,并录制了一个关于他经历的 ted 演讲,名为“你能用 2000 美元获得麻省理工学院的教育吗?”。
你能花 2000 美元得到斯科特·H·杨的麻省理工教育吗
斯科特·H·杨只用了 2000 美元就完成了他的挑战,因为麻省理工学院通过一个在线门户网站免费提供他们的大部分课程材料和讲座。
麻省理工学院并不是唯一一所这样做的大学。许多排名靠前的美国大学免费提供课程、讲座和其他学习材料。在这其中,有大量的材料高度且经常直接适用于学习数据科学、机器学习和人工智能。
许多排名靠前的美国大学免费提供课程、讲座和其他学习材料。
我之前写过一篇名为*如何免费学习数据科学的文章,与更传统的大学学位课程相比,它提供了一种替代的、免费的学习途径。然而,如果你是通过更传统的基于讲座的课程学得更好的人,或者想通过更深入地钻研相关主题来补充本课程,以下免费资源可以提供帮助。*
麻省理工学院,开放式课程
麻省理工学院是现代计算机领域教学和研究的领先机构之一。2001 年,该大学推出了自己的开放式课件平台。它的目标是让绝大多数课程的课堂笔记、习题集、考试和视频讲座都可以在网上免费获得。
这里有大量数据科学相关主题的资料。我个人最喜欢的包括:
数据、模型和决策——课程大纲,麻省理工学院开放式课程
哥伦比亚大学,应用机器学习
Andreas C. Muller 是流行的 Python 机器学习库 Scikit-learn 的核心开发人员之一,也是哥伦比亚大学的研究科学家和讲师。
每年他都在网上发布他的‘应用机器学习’课程的所有材料。本课程的所有幻灯片、课堂讲稿和家庭作业都可以在这个 Github repo 中获得。
回购中的材料实际上是我见过的最好的,涵盖了在现实世界中实际应用机器学习的领域。除了涵盖从数据探索和清理到模型评估和调优的机器学习过程的所有方面,还涵盖了 Github、单元测试和持续集成。当你在现实世界中应用机器学习时,这些都是非常重要的方面。
哥伦比亚大学“应用机器学习课程”的时间表快照
斯坦福大学,研讨会
**斯坦福工程学院定期在网上免费提供一些精选的研讨会。有一些精选的数据科学相关研讨会,包括“人机交互”和“机器人和自主系统”。你可以通过这个链接找到它们。
此外,斯坦福大学将许多研讨会和讲座上传到它的 Youtube 频道——你可以在这里找到。频道上有大量涵盖数据科学、机器学习和深度学习的视频。
斯坦福大学免费研讨会
哈佛免费在线课程
哈佛大学在其网站上发布了一系列完全免费的在线课程。这些课程大部分是由 edX 主办的,所以你也可以选择支付少量费用来获得每门课程的认证。
这里有一些非常优秀的学习数据科学的课程。这些包括以下几个最佳选择,尽管还有很多其他的:
哈佛大学免费在线课程
伯克利,MOOCs
加州大学柏克莱分校也出版了一系列关于 edX.org 课程。有一些优秀的数据科学相关课程,包括:
网上有如此丰富的学习数据科学的免费资料。本文涵盖了一些来自高排名大学的更传统的基于讲座的方法。为了获得更多的替代资源,我之前在这里发布了我的前 5 个。
感谢阅读!
我每月发一份时事通讯,如果你想加入,请通过此链接注册。期待成为您学习旅程的一部分!
以正确的方式学习数据科学
发痒的地图集,直接跳进去😉
要错过数据科学的迷人歌曲,你必须生活在岩石下。作为“21 世纪最性感的工作”,数据科学激起了人工智能、机器学习、魔法等的想象,正在彻底改变我们与信息互动的方式。对于临时技术人员、经验丰富的数据专业人员或任何介于两者之间的人来说,将数据科学技能添加到你的技能清单中会非常有利可图。但是你应该从哪里开始呢?
如果你像我一样,问谷歌“如何学习数据科学”会让你陷入混乱。在“ 8 个简单步骤”中吹嘘掌握数据科学的文章与致力于艺术的整个博士项目相矛盾。Python 爱好者和 R 狂热分子争夺“数据科学的最佳计算语言”,而 Julia 进行了一次突袭。数据库技术吹捧高效的存储和检索方法,如 MySQL、Postgres、MongoDB 和 Cassandra,以与位/字节进行交互,但因应用程序而异。Tableau 最近被 SalesForce 以将近160 亿美元收购,然而嵌入式绘图库和前端框架使得数据可视化变得免费和容易。
因为有这么多固执己见、见解深刻的声音回荡在数据科学领域,所以我不会因为给乐队增加一件乐器而感到内疚。我的建议?无论何时何地,只要你能,就加入进来。在这个旅程中没有完美的地图,只有你的。通过分析把自己从麻痹中解放出来,把自己的手弄脏,宝贝!
不,不是那种肮脏的🕺.
在本文中,我将分享我的建议,告诉你如何抛弃 atlas,进入数据科学的奇妙世界。我将讨论我最喜欢的开源资源、平台和框架(天哪!)它可以启动你的旅程,或者让余烬继续燃烧。如果这次在新冠肺炎的隔离让我们学到了什么,那就是在线教育和电子学习工具在提升普通技术人员方面有着无限的潜力。没有比这更好的时间来学习新技能或磨练你的爱好了。
在开始之前,让我们快速定义一下“数据科学”到底是什么:
不管你对这个定义的感觉如何,它说明了围绕数据科学的模糊光环。一般的软件工程师真正了解多少统计学?一般的统计学家做过多少工程项目?我个人觉得无所谓。该领域不断变化,包括新技术,淘汰过时的技术,并鼓励新兴领域的加入。所以,只要你致力于追求*学习和建设,*我相信你会走得很好。
还是不相信我?看一看数据科学的招聘信息,你会发现基本要求从高级算法设计博士到任何拥有 HS 文凭和相关经验的人都有。10 年使用特定技术的基于项目的工作与另一个初级职位——拥有数学学位的大学毕业生——的竞争。熟练掌握 Python、R、Scala、COBOL 等。与任何有使用代码模糊性经验的人相比。
我最近参加了一个会议,会上才华横溢的 Dick De Veaux 用这张图(或类似的图)传达了他对数据科学的定义。
De Veaux 教授交替使用“预测分析”、“机器学习”、“数据科学”和“人工智能”等术语,并用有趣的例子证明他的松散命名法是正确的,这些例子证明了这门学科是多么模糊。我喜欢这个图表,因为它为灵活性和灵活性留下了空间:如果你对一个主题感到舒适,只需深入另一个主题。
我绝对不是想抹杀那些拥有高等学位和相关经验的数据科学家的惊人成就。然而,我确实想激励越来越多好奇的数据专业人员建立他们的信心,并向一些伟大的资源学习。我们来看看吧!👇
我没有💰来推广这些资源,我希望您在使用我的建议来提升您的数据科学技能时发现真正的价值!
免费在线资源
有大量的资源可供任何对启动或维持数据科学职业感兴趣的人使用。在众多的在线课程、游戏化课程、GitHub 知识库和媒体文章中,有一些是我最喜欢的:
Hackr.io
这个出色的平台查询他们的用户社区,以众包和聚合各种主题的课程,包括数据科学和机器学习,以提供免费的在线学习。根据您的技能水平和对特定主题的兴趣,您可以定制搜索查询和/或加入他们的社区以接收新产品的更新。
互联网档案馆
互联网档案馆提供免费书籍、电影、软件、音乐、网站以及几乎所有主题的更多内容。我的一个同事最近建议互联网档案馆填补一些隔离时间,我没有回头!你可以下载和/或查阅高质量的人工智能/人工智能教材,以继续你的研究或进入新的主题。
Python 课程
**Python 是迄今为止我最喜欢的编程语言,**由于它的简单性和无限的社区支持,我总是对免费提供的高质量 Python 资源感到惊讶。如果您是这个领域的新手,Python 是介绍编程概念的一种很好的语言;如果你是个老手,学习或更新 Python 基础知识只会提高你的市场竞争力。
虽然我还没有完成下面列出的所有免费课程的***(你也不应该!),这些是一些最受欢迎和评价最高的资源,值得您关注📚。***
- Python 编程入门 — Udemy
- Python 核心和高级 — Udemy
- 适合绝对初学者的 Python—Udemy
- 从零开始学习 Python—educative . io
- 用 Python 实现谷歌 IT 自动化 — Coursera
十大免费 Python 编程书籍
我一直随身带着一个 1TB 的外置硬盘,里面装满了编程教科书、PDF、备忘单等等。虽然它已经过时了,特别是在如此容易访问云的情况下,我还是喜欢把一切都组织在一个物理驱动器上。无法解释。无论如何,许多📖 👇在我的💾。
*** [## 十大免费 Python 编程书籍——下载 PDF 或在线阅读
每个程序员都喜欢免费的电子书和免费的课程,如果它们来自著名的技术书籍出版商,比如…
www.java67.com](https://www.java67.com/2017/05/top-7-free-python-programming-books-pdf-online-download.html)
R 的漩涡
如果你曾经上过在线编程课程,你可能会对基于浏览器的代码和实际开发环境之间的脱节感到沮丧。 Swirl 在 R 控制台上,按照您自己的节奏,以交互方式教您 R 编程和数据科学。你只需要下载 R,设置 RStudio,安装漩涡,就可以开始了!作为一个对 Python 无比熟悉的人,这个工具真的帮助我扩展了我的视野和与 R studio(R 开发人员的首选 IDE)的舒适性。
Git & GitHub
如果之前没用过 GitHub, git 启动😉!对于那些正在构建很酷的自动化脚本/ ML 项目的独立数据科学家来说,GitHub 提供了一个存储和共享代码的好地方。如果你在一个团队中工作,你很可能使用过类似的工具来协作和管理产品代码。 GitHub 是一个在线平台(虽然桌面应用程序可以下载),用于创建存储库和共享代码;git 生活在你的终端里,与 GitHub 的沟通要高效得多。
对于新手,我推荐 Git Started with GitHub 作为入门速成班,包括安装。如果您熟悉 GitHub,但想更好地了解终端,请查看这个 Bash Shell 教程以了解更有效的命令行要点。对于侧重于版本控制的基于浏览器的场景,请尝试 katacoda 。如果您想跳过教程,直接进入脚本,请查看参考指南:
2005 年,Linus Torvalds 创建了 Git 来取代他开发的专有分布式源代码控制管理解决方案
opensource.com](https://opensource.com/article/20/4/git-extras)
如果所有这些看起来有点初级,而你只是在寻找一个复习/备忘单供你使用,那么克隆这个库。
发展环境和集装箱化
如果你曾经看过 MTV 婴儿床,那么这个参考就是给你的:一个 IDE(集成开发环境),很像主卧室,是魔法发生的地方。无论您选择哪种语言,您的 IDE 确实为任何专业或个人代码开发设定了基调,并且应该进行定制以满足您独特的编码需求。数据科学项目依赖于多种语言、框架和平台无缝协作;我推荐 Visual Studio 代码来简化你的操作。他们为有效的数据科学设置提供了极好的操作指南👇。
[## Visual Studio 代码中的 Python 和数据科学教程
本教程演示了如何在公共数据科学中使用 Visual Studio 代码和 Microsoft Python 扩展…
code.visualstudio.com](https://code.visualstudio.com/docs/python/data-science-tutorial)
您可能也会对容器化开发环境的 Docker 感兴趣。如果你计划构建和共享代码,但 Docker 不是你想要的,我强烈推荐像 Kubernetes 或 Anaconda Cloud 这样的软件。
建议:如果你有几分钟空闲,花 12 分钟学习 Docker 基础知识,提升你的下一个项目。
(舞台上由人扮的)静态画面
数据可视化是任何数据科学部署的关键组成部分,负责将数据洞察转化为可消费的观察。一个糟糕的可视化可能会浪费你所有的辛苦工作来提取、清理和建模数据;相反,一个伟大的 viz 可以催化可操作的见解,建立信任,激发好奇心,激励项目,等等。
Tableau 可以很容易地安排美丽的指标,只受你的想象力。很难感受到灵感?看看他们的“今日之见”。如果你是 Tableau 的新手,他们有一些很棒的资源可以让你在他们的平台上快速提升。
截至 2020 年 4 月,Tableau Desktop(付费版)提供 90 天的试用期,以增强你的技能。Tableau Desktop 和 Tableau Prep(也包括在内)提供了更广泛的数据连接、嵌入、流水线等。
培训获得 90 天免费使用访问代码 2020 电子学习开始学习随着全球经济复苏,数据技能将…
www.tableau.com](https://www.tableau.com/learn/training/elearning)
如果你已经是一个 Tableau 的狂热用户,看看禅宗大师(显然是同卵双胞胎兄弟)并准备好让你的袜子被打掉。
LeetCode
寻找相关的资源来帮助你通过技术面试?LeetCode 为提高技能和拓展专业领域提供实践培训。无所不知的“在线法官”会对您的算法的强度和效率提供即时反馈,以促进定制体验。我用 LeetCode 准备那些需要现场编码或者伪代码的数据科学面试。他们有一个高级版,UX 稍好,面试问题更有针对性,由公司组织。
几乎免费的在线资源和书籍
如果你能摆动它,这些资源是廉价的和沉浸式的。这是我做过的一些投资,在接触新项目和/或与学生合作时,我会经常提到它们。
简陋的包裹
Humble Bundle 是一家数字店面,提供不同的游戏、软件、电子书等。为了便宜。他们的目标是使发展收益民主化,并为慈善事业做出贡献,同时“以优惠的价格向客户提供精彩的内容”。他们通常会有价值数千美元的机器学习/人工智能教科书,价格不到 20 美元。是的,你没听错。基本上,你可以选择支付多少钱给开发商,慈善机构等等。查看他们当前的产品:
更多精彩的电子书给你。我们与摩根&克莱普尔联手推出了我们的最新产品包!获得像必需品一样的电子书…
www.humblebundle.com](https://www.humblebundle.com/books/artificial-intelligence-machine-learning-morgan-claypool-books)
数据营
从您舒适的浏览器中学习数据科学!DataCamp 是可扩展的,并不断向其课程中添加新的课程/技能。你可以选择不同的职业轨迹根植于 Python、R 和 SQL,跟随行业专家完成不同规模的项目。当你完成免费试用时,你通常可以通过让他们在购买前流点汗来获得一笔特殊的再营销交易——我通过电子邮件获得了 60%的折扣,只需等待几天就可以购买年度套餐。此外,一旦你完成职业轨迹,你将获得一个徽章,可以添加到你的 LinkedIn 个人资料中🙌。
**专业提示:**看一下 DataCamp 免费的备忘单——它们组织得很好,值得在技术面试和编码挑战中密切关注。
用 Python 自动化枯燥的东西
这本书不仅仅为初学者提供了 Python 技巧,它还改善了你与逻辑的关系。使用 Python 基础知识,用逻辑学家的眼光重新想象平凡的任务并开始处理“东西”。我毫不夸张地向每一位与我共事的非技术经理/主管/副总裁推荐这本书,以获得立竿见影的效果。
“编程最好的部分是看到机器做一些有用的事情的胜利。用…自动化枯燥的工作
automatetheboringstuff.com](https://automatetheboringstuff.com/)
ACM —资源和专业网络
一旦你对展示你的数据科学肌肉感到更舒服了,你可能会想与其他志同道合的技术专家交流和分享。GitHub、Medium、StackOverflow 和其他网站是开始与人联系的绝佳场所,但可能会让你渴望更专业、更有针对性的内容。加入 ACM,或计算机械协会,向“世界上最大的教育和科学计算协会”提供会员资格。这就像数据科学的演讲会。
你也可以访问他们的数字图书馆,它包含在会员费用中,以搜索任何计算主题的相关资源。
奥莱利学习— Safari 在线访问
这是付费资源的最高端,所以如果你是数据科学的新手,或者可以忙于我提到的其他课程和教科书,那么推迟可能对你最有利。也就是说,如果你是一名学者或者迫切需要前沿参考资料,这绝对适合你!
你可以找到来自美国前首席数据科学家 DJ Patil、通用电气前副主席 Beth Comstock 的内容…
www.oreilly.com](https://www.oreilly.com/online-learning/individuals.html)
专业提示: Safari 在线学习是 ACM 会员的额外福利!所以,如果你想让你的钱最大化,ACM 会员是一个不错的选择。
训练营
号称课程饱和的速成编程训练营正在席卷全球。如果你一直在研究数据科学和阅读在线课程,你可能会遇到一两个训练营,它们可以快速提升你的数据科学地位,从零到英雄。但是训练营值这个价钱吗?
我认为旅程比目的地更重要,但我有偏见。我在明尼苏达州明尼阿波利斯的一个著名的数据分析/数据科学训练营担任助教,致力于为学生提供尖端的技术技能。这绝对是一种“一英里宽,一米厚”的方法,可以进入数据科学的多面世界。我们一路上涵盖了如此多的相关主题(6 个月的周期),这迫使每个学生接受模糊性,并专注于他们解决问题的方法,而不是找到“完美”的解决方案。这是因为对于不断变化的问题,没有完美的解决方案,只有高效、美观、可持续且有发展空间的解决方案。
这并不适合所有人。但是,如果你付出努力并致力于学习,你将获得无价的技能、专门的项目组合、解决任何问题的开源工具以及自信。在我看来这是非常棒的东西。
我会走下讲台,推荐三部曲教育:他们提供了一系列可以兼职或全职完成的训练营选项。在你花钱之前——要求旁听一堂课,检查全部课程,和以前的学生和/或教授交谈,等等。为了更好地了解你可以期待的投资回报率。
在过去的十年里,数据爆炸几乎改变了每个行业。无论是在制造业,医疗保健…
bootcamp.umn.edu](https://bootcamp.umn.edu/data/curriculum/)
*重复一下:*这些训练营赚钱,因为我们大多数人没有资源来建立和审查我们自己的沉浸式课程。如果你想要一个快速的旅程,充满补充资源和支持来保持你的动力,那么训练营可能是正确的选择。
社区
中等
既然你正在读这篇文章,你已经对媒体很熟悉了。给自己一个鼓励!我偶然发现了 Medium,并对出版物的广度和深度感到震惊。如果您还没有,请成为会员并更新您的首选项,以便 Medium 可以为您提供出色的自定义内容。
我最喜欢的媒体出版物是面向数据科学的。在@here 上发表文章是我的个人目标,所以我很自豪能够通过他们出版团队的审核并获得批准。如果你有一些有趣的事情要说,或者只是你有太多的时间,那就把笔写在纸上,或者把手指放在键盘上?在我鼓起勇气将我的内容公之于世之前,我只是一个长期的鉴赏家,而且我没有回头。
以下是我喜欢的几个相关出版物:
**专业提示:**如果你对自己的在线状态感到满意,但又想保持经常更新、低维护量的内容,那么读一读 Nat Torkington 每日收集的 4 个短链接。
公共数据集
不接触数据,就当不了数据科学家。如果你足够幸运,可以获得公司数据并得到批准,那就去做吧!否则,在使用安全的私有数据移动之前,分析清理过的公共数据并不可耻。
建立工作关系网
我在科技行业担任数据科学顾问。我真诚地相信,没有比从私营部门的专家那里学习新技术、方法和策略更好的环境了。就我个人而言,我尽可能多的与招聘方/公司沟通和面试,强化自己的软技能,拓展自己的人脉。
如果您有兴趣与我联系讨论,请在 LinkedIn 上给我留言。我很乐意连接!
结论
数据科学太模糊了,无法构建成功的完美路线图。随着需求的发展,你也将拥抱新兴的技术、方法、策略和定义行业的个性。总是有探索和进步的机会,推动你的边界,将另一种工具纳入众所周知的工具带。
概述的资源足以启动您的数据科学之旅。如果你走得更远,它们应该有助于激励你或者给你指明一个新的方向。
这篇文章中的所有内容都深受我的学生和其他教学人员的影响。非常感谢他们激励我继续学习,尤其是现在!
如果你对我想要添加的资源有任何建议,我很乐意在下面的评论中听到你的意见。感谢阅读!***
边听边学数据科学
不知道从哪里开始播客?这是三个吸引你的播客片段。
在 Unsplash 上由 Mohammad Metri 拍摄的照片
播客是一种有趣的方式来学习你喜欢的话题的新东西。播客主持人必须想办法用简单的术语解释复杂的想法,否则没人会理解🙂在这篇文章中,我展示了几个小插曲来让你开始。
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
如果你错过了我之前关于播客的文章:
我如何跟上最新的研究?我如何记住领域中的复杂概念?在…的帮助下
towardsdatascience.com](/top-5-apps-for-data-scientists-dc8b66886560)
你应该通过偏导数获得博士学位吗
偏导数由数据科学超级极客主持。他们谈论我们周围世界的日常数据。
这一集对于正在考虑攻读博士学位的学生来说可能会很有趣,在这一集里,克里斯从他个人的角度谈到了获得博士学位。他谈到他年轻时对数学不感兴趣,但对历史更感兴趣。大学毕业后,他受够了学校教育,不打算继续攻读博士学位。他向加州大学戴维斯分校递交了申请,面临着一项挑战。喜欢听他的冒险。
Tim 是一名两届博士退学者,现居北卡罗来纳州,是一名数据科学家,他有一个专门讨论这个话题的网站:我应该获得博士学位吗?
让冒险开始吧…
基于线性离题的核技巧和支持向量机
线性离题标志来自 SoundCloud
凯蒂和本通过有趣的(通常非常不寻常的)应用程序探索机器学习和数据科学。
在这一集,凯蒂和本解释什么是支持向量机(SVM)的核心技巧。我真的很喜欢 SVM 背后的重型机械的简单解释。不知道最大边距分类器是什么?然后先听支持集最大间隔分类器。
最大边缘分类器试图在左侧和右侧之间找到一条线(决策边界),以便最大化边缘。这条线被称为超平面,因为它通常包含更多的二维。决策边界在支持向量之间。
基于支持向量的二元分类问题
内核绝招是什么?
当二维空间中有 3 个点时,可以用一种方式排列这些点,使它们不能被一条线分开。你总是可以通过把它们放在三维空间中来把它们分开。引入新尺寸的一种方法是计算离原点的距离:
z = x^2 + y^2
这将推动离原点更远的点,而不是更靠近原点的点。下面我们来看一个视频。这也使得线性分类器成为非线性的,因为它将边界映射到更低维度的空间。
来自 giphy 的具有多项式内核可视化的 SVM
当维度多于样本时,我们总是可以用一个超平面来分隔这些点——这是 SVM 背后的主要思想。多项式核是 SVM 常用的核之一(最常见的是径向基函数)。二次多项式核寻找两个特征之间的所有交叉项,这在我们想要对交互进行建模时非常有用。
内核招数是什么?爆米花加入了军队,他们让他成为了核心
数据怀疑论者的人工智能决策
来自 https://dataskeptic.com/的数据怀疑论者标志
数据怀疑论播客的特色是采访和讨论与数据科学、统计学和机器学习相关的话题。
在本集的中,Dongho Kim 讨论了他和他在 Prowler 的团队如何建立一个基于概率建模、强化学习和博弈论的自主决策平台。目的是让人工智能系统能像人类一样做出好的决策。
我们对贝叶斯过程最感兴趣,而不是深度学习
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。
在 Unsplash 上由Courtney hedge拍摄的照片
在实践社交距离的同时学习数据科学
在保持社交距离的同时学习数据科学
我是如何帮助我的朋友充分利用在家的时间的
和我的朋友一起研究数据科学
更多在家的自由时间
在全球疫情时期,适应新的生活常态是一项挑战。在澳大利亚,我们的情况比许多其他国家好得多,至少目前是这样。然而,孤立仍然会让你沮丧。坚持“呆在他妈的家里”运动,我们都有更多的空闲时间。许多人试图通过学习新技能来明智地利用他们的独处时间。
学习数据科学的想法
为了这篇文章的目的,我把我朋友的名字改成了化名,以保护无辜的人。任何一起阅读的父母可能会认出我从流行的儿童电视节目 Bluey 中使用的名字😜
Bluey 别名来自两集:
1.布鲁伊的爸爸决定将布鲁伊和她的妹妹宾果重新命名为“丹尼斯”和“沙拉兰达”,这一集叫做“戏弄”。
2.布鲁和宾戈在《老奶奶》一集中扮演老奶奶“珍妮特”和“丽塔”。
我的一个朋友沙拉兰达是一名会计师,她告诉我她正考虑在疫情期间做一些研究。我问她在想什么学习?她不是很确定,但数据科学是她清单上的事情之一。我告诉她,如果她真的想学习,我很乐意帮助她。至少我可以教她足够多的东西,让她知道这是不是她想进一步追求的东西。
其他人加入进来
当我提出这个建议后,另一个朋友珍妮特也加入了进来。她是一名化学家和数据分析师。这些年来,她一直对学习数据科学感兴趣,并开始学习几次 python 编程。然而,生活阻碍了她,她没有继续下去。所以她问她是否可以和沙拉兰达一起学习。我说她当然可以,人越多越好。
因此,我向更多的朋友发出了做一些数据科学研究的邀请,并有更多的人接受了邀请。
我的朋友丹尼斯是一名律师,在她的工作中经常涉及技术。她想更多地了解数据科学到底是什么。对她来说,这个想法更多的是为了更好地理解数据科学,以便她在与数据科学家和技术合同互动时能够更轻松地完成工作。
另一个说愿意加入我们小学习小组的人是丽塔。她是一名研究科学家,刚刚完成生理学博士学位。我们以前在数据科学项目上合作过,并参加了政府举办的开放数据黑客马拉松 GovHack。
Rita 已经开始自学数据科学的某些方面,但是她有三个孩子,还有许多其他事情要做。所以她很难保持学习的动力。
小组学习
网上有很多自学的数据科学课程。然而,我从未发现我对一门客观的在线课程负有责任。你也不能总是在网络课程中提问。当我开始学习数据科学时,我希望有一群朋友一起学习。
和一群朋友一起学习数据科学似乎是完美的解决方案。我们可以互相问责。我总是发现,如果别人依赖我,保持对一个项目的热情会更容易。和朋友一起学习也比独自学习有趣得多。因此,即使我们目前不能面对面地见面,我们也可以分享这个项目来提高我们的技能。
我发现在过去,当我和朋友一起做活动时,比如学习一项新技能,我会比平时更多地看到他们。这项活动为接触和保持联系提供了动力。希望一起学习能让我们在这个几乎不可能面对面交流的困难时期保持理智和联系。
在学习复杂的概念时,有不同的观点也会很有帮助。来自不同人的问题可能会引发其他人的理解。因此,希望我们能够帮助彼此获得数据科学方面的新技能。
小组想从学习数据科学中获得什么
- 更好地理解什么是数据科学。
- 工作中使用的编程技巧。
- 通向新事业的可能途径。
我的数据科学背景
我已经做了几年的数据科学家。我的背景是神经科学,我通过免费的在线课程过渡到了数据科学。你可以在我之前的故事“我如何在 6 个月内从零编码技能成为数据科学家”中了解我是如何进入数据科学的。我的旅程证明,如果你真的想学习数据科学,并全身心投入,你可以不读特定的大学学位。
数据科学有点像艺术,有许多方法可以达到预期的结果,对于如何解决问题也有不同的思想流派。我绝不是数据科学各个方面的专家。我不认为有人真的是。我期待在我们的旅程中学习一些新的数据科学技能。
在我们进行的过程中开发课程将会响应我的朋友们想要学习的数据科学方面。所以,任何读到这些帖子的人请不要把它们当成福音,这只是我们尽最大努力一起学习新东西。我将尽我所能提供我的专业知识,但也将根据需要利用其他资源。
我们将从哪里开始
虽然我的朋友不一定要在数据科学领域寻找职业,但我仍然很高兴能帮助他们学习并实现他们的目标。
为了让我们走上正轨,我想我会在媒体上记录我们的进展。我们已经建立了一个私人的 facebook 聊天平台,在那里我发布了包含这些课程的我的媒体文章的草稿链接。然后,我的朋友们在一个共享的谷歌文档中写下他们对问题和练习的答案。这样我可以看到他们在解决问题时的进展。然后在周末我会出版这个故事。
学数据科学的朋友背景千差万别。我不希望任何人在我们学习课程的过程中掉队,所以我们将从头开始。第一课假设没有编程或统计知识。
首先,我们将着手学习 SQL。这样,我们将知道如何从数据库中访问数据。所以请继续关注第一课,在 SQL 中创建一个表并用数据填充它。
时机
作为一个小组,我们决定每周完成一节课。这似乎是一个时间框架,既能让我们保持势头,又不会给家庭生活带来不必要的压力。当我们学习更复杂的课程时,我们可能需要修改时间框架。尽管有目标是好事。
如果你喜欢,就跟着去吧
如果你想加入我们,试着在这段强制的时间里提高自己的技能,请随时关注我帖子里的练习。希望我们都能玩得开心,学到新东西:)
除了数据,我的另一个爱好是绘画。你可以在 www.katemarielewis.com 找到我的野生动物艺术
社交距离学习数据科学的所有课程(LDSWSD)
阅读《走向数据科学》中关于 Ldswsd 的文章。共享概念、想法和代码的媒体出版物。
towardsdatascience.com](https://towardsdatascience.com/tagged/ldswsd)
如何使用 SQL 创建数据表
在保持社交距离的同时学习数据科学
使用儿童节目 Bluey 中的一个例子,演示了如何使用 SQL 制作一个表格并用数据填充它
介绍
在我之前的故事中,我谈到了我和我的朋友们如何以及为什么决定在这次全球疫情期间学习数据科学,同时保持社交距离。我们都喜欢能够利用我们的时间做一些建设性的事情的想法。我很高兴能够通过这个项目与我的朋友保持联系,并帮助他们提高数据科学技能。
自从我们一周前开始以来,这个团队已经发生了微小的变化。一个人不得不退出,因为她有了一个全新的婴儿。这是一个在每天洗澡和学习数据科学之间的决定,洗澡理所当然地赢了😃
另一方面,自从我发表了本系列的第一篇文章介绍我们将如何以及为什么在自我隔离的同时学习数据科学,我得到了人们的惊人回应。我的几个朋友问他们是否可以加入。所以现在我们是一个 8 人小组,所有女性一起学习技术技能。
我甚至有几个朋友的朋友问他们是否可以加入,但我决定只限于我亲自认识的人。主要是因为我不想让我的其他任务影响到团队的规模。然而,我欢迎任何人和每个人跟随我发布的课程,并尝试学习数据科学。
也许如果你是那些喜欢学习的人之一,你可以和你的一些朋友成立自己的学习小组。然后,如果你们在任何一个概念上陷入困境,你们将能够互相帮助,并且你们将获得让彼此保持在正确轨道上的好处。我建议在你的社交媒体上打个电话,看看有没有你认识的其他人有兴趣和你一起学习。你永远不知道,你可能会对你得到的回应感到惊讶。我知道我是😊
我要教小组的第一件事是 SQL。在第一课中,我们将练习制作表格并用数据填充它们。我们将使用 CREATE TABLE 和 INSERT INTO 关键字来实现这一点。如果这还不完全有意义,不要担心,在整个课程中它会变得很清楚。
如果你和我们一起学习,这是一个很好的起点。我的目标是在我们完成课程后每周发布一次。敬请关注!
什么是 SQL?
SQL 是一种在数据库中访问、存储和操作数据的语言。它代表结构化查询语言,因为你用它来查询数据库。每种基于 SQL 的语言都有自己的细微差别,但有相同的基本命令。每种语言的细节及其排列方式被称为语法。
当学习编程时,我想我能给人们的主要建议是在代码中寻找模式。然后尝试如何修改这些模式,使代码按照您的要求运行。
为什么要学 SQL?
当人们想到数据科学家时,他们往往会专注于机器学习的激动人心的工作。然而,数据科学家花费大部分时间将他们需要的数据转换成他们需要的格式。因此,我认为在学习数据科学时,从头开始并学习如何从数据库中访问数据是很重要的。
许多数据科学课程为学生提供了包含他们需要的数据集的文件。在我看来,这种做法对学生有害无益。如果不知道如何从数据库中检索您想要的数据,您将不得不依靠数据工程师来为您完成,或者希望数据集已经以您需要的格式可用。根据我的经验,这种情况很少发生,尤其是当你试图使用一个大数据集的子集时。
背景
什么是数据库?
数据库通常包含一个或多个表。我们给每个表起了一个名字,这样当我们想要查看表中的数据时,就可以访问我们想要的那个表。如果您愿意,可以阅读更多关于数据库的内容,但是为了学习 SQL,我们将把它们看作是表的集合。
什么是桌子?
表格包含数据。它用于组织数据,以便于使用。表格中的数据被进一步组织成行和列。描绘表格的一种方式是像电子表格一样。
什么是行?
每行代表一个记录(或条目)。例如,一条记录将包含数据集中每一列的值,这将构成表的行。您可以在下面的示例表中看到一条高亮显示的记录。
什么是专栏?
数据集的要素存储在单独的列中。例如,对于表中的每条记录,一列将包含一个特性值。您可以在下表中看到一个突出显示的列。还需要注意的是,每一列都包含一致数据类型的数据。
什么是数据类型?
数据类型顾名思义就是一种数据。有许多不同的数据类型可以在 SQL 中使用,但最常见的是 varchar、integer 和 float。
varchar —一个长度可变的字符串。字符串是字符的集合,这些字符串在一起构成文本。字符串可以包含字母字符、数字字符和空格。例如,“这是一个包含 33 个字符的字符串”
整数 —整数是没有小数位的整数。因此,此数据类型中不允许有分数。例 6
float —浮点数。因此,数字的分数可以以小数点的形式包含在内。例如 6.45
制作表格时,您需要在每一列中指定数据类型。希望当你看到一些例子时,这将是有意义的。您可以查找 SQL 中使用的所有数据类型,但在本课中我们将只使用 varchar 和 integers。
什么是查询?
SQL 中的查询是对表进行某种操作的语句。它询问一个表的问题,因此命名为查询。它可以用来从表中读取记录、向表中插入记录、过滤表、修改表中的记录、从表中删除记录以及许多其他操作。我们的目标是学习如何编写查询。
在 SQL 中,每个查询通常以分号结尾。这将一个查询与下一个查询分开。
重要说明
SQL 不区分大小写。我将对 SQL 关键字使用大写字母,使它们更加明显。这在许多 SQL 风格指南中是相当标准的做法。
公司或组织内部经常使用风格指南来指定他们希望在所有计算机代码中使用的风格。每种编程语言都有自己的风格指南,因此在组织内部,代码看起来都很相似。团队中的其他人也能够很容易地理解它。
创建表的语法
下面是一个使用 SQL 创建表的查询语法示例。
CREATE TABLE name_of_table(
first_column_name datatype,
second_column_name datatype,
third_column_name datatype,
fourth_column_name datatype,
fifth_column_name datatype
);
首先,我们有 CREATE TABLE 语句。CREATE TABLE 是用于创建新表 SQL 关键字。
然后,将该表的结构放在 CREATE TABLE 语句后面的括号中。在括号中,我们用逗号分隔每个列的名称和数据类型。然后,查询以分号结束。
问题 1 :上例创建的表中有多少列?
向表中插入数据的语法
下面是一个使用 SQL 向表中插入数据的查询语法示例。
INSERT INTO name_of_table (
first_column_name,
second_column_name,
third_column_name,
fourth_column_name,
fifth_column_name)
VALUES
('column1_value1', 'column2_value1', 'column3_value1', 'column4_value1', 'column5_value1'),
('column1_value2', 'column2_value2', 'column3_value2', 'column4_value2', 'column5_value2'),
('column1_value3', 'column2_value3', 'column3_value3', 'column4_value3', 'column5_value3')
;
首先我们有 INSERT INTO 语句。INSERT INTO 是一个 SQL 关键字,用于将数据插入到指定的表中。命名表的列名的逗号分隔列表包含在第一组括号中。
然后,我们将值插入到关键字值后面的括号中。每个记录都是一个逗号分隔的列表,在它自己的一组括号内。
然后,查询以分号结束。
问题 2 :使用上面的查询在表中插入了多少行或记录?
现在让我们试一试:
- 去 http://sqlfiddle.com/的(或者你可以用 https://www.db-fiddle.com/的,因为我发现 SQL fiddle 最近停机了)
- 在左边的框中放入创建表并插入到下面的查询中
CREATE TABLE bluey_nerds (
name varchar(255),
occupation varchar(255),
number_of_children int(255)
);INSERT INTO bluey_nerds (name, occupation, number_of_children)
VALUES
('Sharalanda', 'accountant', 1),
('Dennis', 'lawyer', 1),
('Janet', 'analytical chemist', 0),
('Rita', 'scientist', 3)
;
**关于数据类型的说明:**回到黑暗时代,计算机内存和磁盘空间是昂贵的,所以优化每一位的使用是很重要的(哈哈)。数据类型后面括号中的 255 是关于指定字符限制的,为了节省空间,可以把它变小。我们现在不会担心太多,除了记住你需要为 varchar 和 integer 数据类型包括它,而不是为 floats,255 是最大显示大小。如果你想了解更多,你可以查看 SQL 中关于数据类型的有用资源。
**关于数据的说明:**这个表包含了我的四个朋友的数据,他们启发我写下了这些关于学习数据科学的帖子。为了保护他们的身份,他们的名字被改了。它们已经根据流行儿童节目《蓝调》中的角色名字重新命名。
Bluey 别名来自两集:
布鲁伊的爸爸决定将布鲁伊和她的妹妹宾果重新命名为“丹尼斯”和“沙拉兰达”,这一集叫做“戏弄”。
布鲁和宾戈在《老奶奶》一集中扮演老奶奶“珍妮特”和“丽塔”。
以防你想知道😜妈妈的生活!
3.单击“构建模式”按钮
4.在右边的框中输入下面的查询
SELECT *
FROM bluey_nerds;
SELECT 和 FROM 都是不言自明的 SQL 关键字。*用于表示您想要所选表格中的所有内容。
5.您应该会看到一个包含您插入的所有数据的表格:
练习 1 :制作一个包含 5 列 3 行的表格,其中至少有一列是整数数据类型。
练习 2: 制作自己的表,包含 2 列 7 行,其中一列为浮点数据类型,另一列为 varchar 数据类型。
我们是如何学习这一课的
我所有的朋友都很容易地掌握了这一课的概念。他们在一周内第一次就正确地完成了所有的练习和问题。他们中的一些人甚至问了我几个问题,要求我去寻找答案。我认为这是一个很好的迹象!
和我一起工作的小组报告说,他们花了 45 分钟到 1.5 小时完成了这一课。谢天谢地,这正是我想要的时间。我会在学习的过程中不断重新评估课程,以确保我没有让它们变得太难或太容易。我想让他们保持金发,刚刚好。
看到我的朋友们制作的有趣的桌子是一件非常有趣的事情。有关于酒的桌子,关于食物的桌子和关于锻炼的桌子。我认为这是对人们在自我孤立时所做的事情的一个很好的反思。这只是表明我们周围到处都有数据😃
我很高兴我的朋友们对这一课如此投入,并期待着和他们一起进入第二课。如果你和我们一起学习,我希望你喜欢这第一课,并渴望开始下一课。
下一课
第 2 课将讲述如何使用 SQL 从表中选择数据。我们将练习从表中选择所有数据,根据列名进行选择,以及选择特定数量的记录。此外,我们还将学习如何使用 SELECT DISTINCT,这样我们就不会得到重复的值。
除了数据,我的另一个爱好是绘画。你可以在 www.katemarielewis.com 的找到我的野生动物艺术
社交距离学习数据科学的所有课程(LDSWSD)
阅读《走向数据科学》中关于 Ldswsd 的文章。共享概念、想法和代码的媒体出版物。
towardsdatascience.com](https://towardsdatascience.com/tagged/ldswsd)
学习梯度下降(带代码)
大量的统计和机器学习涉及将一堆数据转化为新的数字,以做出好的决策。例如,数据科学家可能会使用您过去对 Google 搜索项的出价和结果,来计算新出价的预期投资回报(ROI)。有了这些知识,你就可以对未来出价多少做出明智的决定。酷,但是如果那些 ROI 是错的呢?真的错了吗?
灾难!
幸运的是,数据科学家不只是猜测这些数字!他们使用数据为自己生成一个合理的数字。有很多方法可以做到这一点,一个常见的是梯度下降。根据我们的朋友维基百科,“梯度下降是一种一阶迭代优化算法,用于寻找可微函数的局部最小值。”这没有错,但是你被这个弄糊涂了也是情有可原的。我们来学习一下什么是梯度下降,它是如何工作的(用代码)。
设置和代码
想跟着去吗?本文中复制了基本代码。如果你想完全遵循,从这个 github repo 下载代码。我将对以下包使用 R:
library(tidyverse)
library(broom)
library(glue)
渐变?血统?
在“如何”之前,让我们先了解一下梯度下降是关于什么的。
我们将从两个变量的超级简单数据集开始,x
和y
。这些可以是bid
和ROI
的值。我们有兴趣使用这些数据来猜测我们从未见过的x
值的y
会是多少。
d <- tibble(x = c(0, 1, 2),
y = c(1, 3, 10))
好吧。为了使用该数据对y
进行新的预测,典型的方法是使用普通最小二乘(OLS)回归。听起来不错吧?别担心。这只是一种快速获得下图所示最佳拟合线的方法。
我们是怎么得到这条线的?使用此代码:
model <- lm(y ~ x, d) %>% tidy()
model#> # A tibble: 2 x 5
#> term estimate std.error statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 (Intercept) 0.167 1.86 0.0894 0.943
#> 2 x 4.5 1.44 3.12 0.198
记住,直线有等式:y = intercept + slope * x
。上面的代码告诉我们estimate
列中的截距和斜率:intercept = 0.167
和slope = 4.5
。我们会把这些留到以后。
ols_intercept <- model$estimate[1]
ols_slope <- model$estimate[2]
OLS 回归是一个超级标准的算法。尽管如此,我还是会用它来演示梯度下降是如何工作的,因为你可以将你在这里学到的东西应用到更多的东西上!
想象一下,有人告诉你截距值(0.167),但让你算出斜率。除了认为这很粗鲁,你还会怎么做?我们就试试一堆随机的斜坡吧!
从视觉上看,斜率 5 是这一组中最好的(我们知道它非常接近真实的斜率 4.5)。但是如果我们看不出来呢?斜率为 4 看起来也不错。
这就是所谓损失函数的用武之地。这是一个奇特的术语,表示有一种方法可以用数字来表示你的线与数据的匹配程度。有很多方法可以做到这一点,但我们将使用一个非常标准的方法来处理回归问题:误差平方和。
哇,更多的行话?!这些数据人员让事情变得不容易。别担心。我会解释的。这条线显示了在给定每个x
值的情况下,我们对y
的预测。这意味着从直线到每个数据点的垂直距离就是我们的错误程度。这个距离称为“误差”(或“残差”)。这些是下图中的红线。
侧面宣传:想进入这样的可视化领域?看看我的博客, [“可视化残差”](http://Visualising Residuals)
把这些红色的部分加起来,我们就能对我们的曲线与数据的吻合程度有一个总体的了解。如果总数很少,我们的产品一定很好。如果总数很大,我们一定做得不好。还有一个额外的细节需要了解。距离计算为y - predicted y
。在上面的图中,这些都是正值(因为线在点的下面)。然而,如果线在它们上面,它们将是负的。这很烦人,因为如果我们有很多正面和负面,它们可能会互相抵消。所以解决方法是首先求每个误差值的平方,这样它们都是正的,然后把所有的都加起来。因此,“误差平方和!”
# Calculating the squared errors for a slope of 1
slope_guess <- 1d %>%
mutate(predicted_y = ols_intercept + slope_guess * x) %>%
mutate(error = y - predicted_y) %>%
mutate(squared_error = error^2)#> # A tibble: 3 x 5
#> x y predicted_y error squared_error
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 0 1 0.167 0.833 0.694
#> 2 1 3 1.17 1.83 3.36
#> 3 2 10 2.17 7.83 61.4
这些平方误差的总和就是0.694 + 3.36 + 61.4 = 65.42
。
现在,我们可以对之前尝试的五行代码重复这一过程:
# Function to add predicted y to data with x and y
add_predicted_y <- function(df, intercept, slope) {
mutate(df, predicted_y = intercept + slope * x)
}# Function to get sum of squared errors (sse) from the data
sse <- function(y, predicted_y) {
squared_errors <- (y - predicted_y)^2
sum(squared_errors)
}# Compute Sum of Squared Errors (sse) for each slope
slope_tests <- tibble(slope_guess = c(1, 3, 5, 7, 10)) %>%
mutate(sse = map_dbl(
slope_guess,
~ add_predicted_y(d, ols_intercept, .) %>%
summarise(sse = sse(y, predicted_y)) %>%
pull(sse)
))slope_tests#> # A tibble: 5 x 2
#> slope_guess sse
#> <dbl> <dbl>
#> 1 1 65.4
#> 2 3 15.4
#> 3 5 5.42
#> 4 7 35.4
#> 5 10 155.
看起来像这样:
我们不用再猜了。5°的斜率绝对是这一组中最好的,因为它的误差平方和最低。
你注意到这个情节了吗?我们只有 5 分,但他们已经有一个 U 型。这不是巧合。存在一个误差最小的“最佳”斜率。当我们选择更远的斜率时,误差会增加。我们的目标是找到最低点!这就像在山谷中迷路,但知道你最有可能在底部找到水,所以走下坡路。
走下山。下山。降梯度!
渐变下降!
梯度下降
是时候认真对待了。如果我们想努力达到最低点,我们该怎么做呢?一种选择是尝试很多很多的斜坡,直到我们有信心到达那里。当然,但这可能会变得非常烦人和耗时。
梯度下降是一种算法,巧妙地为我们找到了最低点。它从斜率的初始值开始。假设我们从斜率 1 开始。然后,它以一系列合理的步骤调整斜率,直到它认为找到了最低点。让我们来看看这是如何发生的。
寻找梯度
尝试一个斜率后,我们希望下一个斜率更接近曲线的底部。方便的是,我们可以利用曲线在当前位置的梯度知道向哪个方向移动。
我们分两步解决这个问题。首先,定义上图所示曲线的方程式。这并不太难。记住,曲线上的一点代表误差平方和。所以曲线的整个方程看起来像这样(其中y
和x
是我们数据中值的向量):
sum((d$y - (intercept + slope * d$y))^2)
我们也知道截距,所以实际上是:
sum((d$y - (0.167 + slope * d$x))^2)
旁注:这是指误差的总组合,称为损失。方程也可以叫做函数。这是我们的损失函数!
其次,我们使用链式法则对这条曲线进行求导(它告诉我们梯度)。如果你不熟悉导数,我会偷偷摸摸地让你弄清楚这是怎么回事,但答案是:
sum( -2 * d$x * (d$y - ( 0.167 + slope * d$x) ) )
代入斜率 1,我们得到:
# Derivative where slope = 1
sum( -2 * d$x * (d$y - ( 0.167 + 1 * d$x) ) )#> [1] -34.998
好,我们有一个很大的负值。这意味着我们在曲线上的一点,向下向右倾斜。为了下降到一个更合适的斜坡,我们需要向右移动!为了直观地理解它,您可以在下图中看到一条紫色的倾斜线:
为了比较,对 9°的斜率重复,我们得到了45.002
的正导数。这意味着我们在一个向右上方倾斜的点上,必须向左移动来降低坡度。下图证实了这一点:
好吧,我们已经搞定了一个大挑战。需要休息吗?喝一杯,吃点点心,或者做点瑜伽。当你准备好了,回来开机!
穿越梯度
我们现在知道如何使用导数来告诉我们更高或更低的斜率会更好。现在是行动的时候了。
照片由尼古拉斯·I .在 Unsplash ( CC0 )拍摄
假设我们需要将正在测试的斜率向右移动(一个更高的斜率)。我们应该走多远?太小的一步,我们会浪费时间。太大的一步,我们可能会在另一边以比以前更大的误差结束。
方便的是,衍生品可以再次帮助我们!当导数真的很大(远离 0)时,意味着我们离一个好的解还很远,可以迈出一大步。随着导数越来越接近零,这意味着我们越来越接近解决方案,可以开始采取更小的步骤。
梯度下降如何使用这个俏皮的想法?它可以从当前斜率移动到current slope — derivative
。如果导数是负的,那么从当前斜率中减去它将向上移动(右)。如果导数为正,那么我们向下移动(向左)。离零更远的导数也会导致更大的步长。有道理。然而,仅仅减去导数最终有点疯狂。当我告诉你这不是个好主意时,你必须相信我。为了处理这种情况并更好地控制步骤,梯度下降将导数乘以一个称为学习率的数字。例如,0.1 的学习率意味着下一个测试点将在:current position — 0.1 * derivative
让我们来看看实际情况。我们将使用 1 的初始斜率,0.08 的学习率,并采取 5 个步骤(所有这些都是我挑选出来做一个很好的演示)。
# Setup
initial_slope <- 1
learning_rate <- .08
steps_df <- tibble(step = seq_len(5), slope = NA)
current_slope <- initial_slope# For each step...
**for** (step **in** steps_df$step) {
# Store the current slope value
steps_df$slope[step] <- current_slope # Calculate the derivative of the loss
derivative <- sum(-2*d$x*(d$y - (0.167 + current_slope * d$x))) # Update the slope value based on the derivative and learning rate
current_slope <- current_slope - learning_rate * derivative
}
steps_df#> # A tibble: 5 x 2
#> step slope
#> <int> <dbl>
#> 1 1 1
#> 2 2 3.80
#> 3 3 4.36
#> 4 4 4.47
#> 5 5 4.49
当绘制误差曲线时,看起来像这样:
注意从第一步到第二步的变化有多大,但是它很快变得越来越小。5 步之后,算法落在一个4.49
的斜坡上。难道你不知道吗,这和 OLS 一开始给我们的答案差不多!
知道何时停止
到目前为止还不错,但是走 5 步就能找到正确答案有多幸运呢?!好吧,这不是运气。不幸的是,你不知道现实世界中的正确答案,需要告诉算法什么时候停止。
在 Unsplash ( CC0 )上由贝琳达·费因斯拍摄的照片
我们想要停止有两个原因,每个原因都有不同的处理方式:
- 我们认为我们已经找到了一个很好的答案。
- 我们的耐心到期了。
为了停止,因为我们认为我们已经得到了一个好的答案,我们可以设置一个最小的步长。也就是说,一旦算法试图采取一个小于这个最小值的步骤,我们就停止。
为了不考验我们的耐心,我们可以设定我们愿意等待的最大步数。如果算法不停地运行这个数量的步骤,那么就停下来,把计算机还给我们。
这里不多解释了。让我们在下一节看看代码。
将碎片拼在一起
是时候用一个新的稍微大一点的数据集把这些碎片放在一起了:
*# Simulate a larger data set*
more_d <- tibble(x = rnorm(100),
y = .6 * x + rnorm(100) + 5)
我得到了 OLS 对这个新数据的估计:
more_d_model <- lm(y ~ x, more_d) %>% tidy()
more_d_ols_intercept <- more_d_model$estimate[1]
more_d_ols_slope <- more_d_model$estimate[2]
并且如下运行梯度下降:
# Hyperparameters
initial_slope <- 1
learning_rate <- .001
minimum_step <- .0001
maximimum_steps <- 1000# Values to track
slope <- initial_slope
step <- Inf
steps <- 0# Run Gradient Descent until stopping criterion reached
while((steps < maximimum_steps) && (abs(step) > minimum_step)) { derivative <- sum(-2 * more_d$x * (more_d$y - (more_d_ols_intercept + slope * more_d$x))) step <- learning_rate * derivative
steps <- steps + 1
slope <- slope - step
}
注意到我在代码中的注释“超参数”了吗?你可能听说过这个,因为 超参数 是所有酷的机器学习孩子都使用的一个词。现在你知道梯度下降是如何工作的,你可以看到它只是指我们可以改变的值,以使我们的算法按照我们想要的方式运行。
结果呢?
glue("OLS slope: {round(more_d_ols_slope, 3)}",
"Gradient Descent slope: {round(slope, 3)}",
"Number of steps: {steps}",
.sep = "\n")#> OLS slope: 0.624
#> Gradient Descent slope: 0.625
#> Number of steps: 26
如果你问我,我会觉得这很酷!
注意。我调整了超参数(再次),所以这个演示工作。事实上,许多学习率并没有导致找到解决方案。这是因为梯度下降对学习速率非常敏感。如果你想进入这个兔子洞,那么你的下一站应该是学习不同的学习率公式,以确保事情顺利进行。我会从搜索“适应性学习率”开始。
如果你愿意,这是另一个快速休息的好时机。准备好了吗?向前!
不止一个参数?
我们已经走了很长一段路,但你还记得吗,我们一直在使用 OLS 拦截器作弊。这是我的错,但这是为了帮助你学习,我发誓!
为了解决这个问题,我们必须回到我们的损失函数(误差曲线)。这里有一个提醒:
sum((y - (intercept + slope * y))^2)
既然我们正在处理两个参数(截距和斜率),我们的损失函数就不像我们看到的图那样是 2D 曲线。它更像一个三维平面。如果这是令人困惑的,不要担心。相反,假设我们现在有两条误差曲线,一条是截距,一条是斜率。我们将在其中的每一个上设置一个点,并尝试同时移动它们。这意味着算法必须计算导数,并为每个步骤!
我们知道斜率的导数是什么样的:
# Derivative of the slope
sum( -2 * x * (y - ( intercept + slope * x) ) )
截距是相似的,但不完全相同:
# Derivative of the intercept
sum( -2 * (y - ( intercept + slope * x) ) )
为了方便起见,我编写了一些函数来计算这些:
*# Functions to compute derivatives*
get_slope_derivative <- **function**(x, y, intercept, slope) {
sum( -2 * x * (y - ( intercept + slope * x) ) )
}
get_intercept_derivative <- **function**(x, y, intercept, slope) {
sum( -2 * (y - ( intercept + slope * x) ) )
}
我们所做的大部分与之前相同,但同时针对两个参数。这意味着我们需要:
- 为每个参数(截距和斜率)创建一个初始值
- 使用各自的导数对每个参数进行阶跃变化。
- 改变最小步长停止准则以考虑所有参数。
让我们来看看它的实际应用:
*# Hyperparameters*
initial_intercept <- 0
initial_slope <- 1
learning_rate <- .001
minimum_step <- .0001
maximimum_steps <- 1000
*# Values to track*
intercept <- initial_intercept
slope <- initial_slope
intercept_step <- Inf
slope_step <- Inf
steps <- 0
*# Run Gradient Descent until stopping criterion reached*
**while**((steps < maximimum_steps) && (max(abs(intercept_step), abs(slope_step)) > minimum_step)) {
*# Handle intercept*
intercept_derivative <- get_intercept_derivative(
more_d$x,
more_d$y,
intercept,
slope
)
intercept_step <- learning_rate * intercept_derivative
intercept <- intercept - intercept_step
*# Handle slope*
slope_derivative <- get_slope_derivative(
more_d$x,
more_d$y,
intercept,
slope
)
slope_step <- learning_rate * slope_derivative
slope <- slope - slope_step
*# Increment step*
steps <- steps + 1
}
最后的结果呢?
glue("OLS intercept: {round(more_d_ols_intercept, 3)}",
"OLS slope: {round(more_d_ols_slope, 3)}",
"Gradient Descent intercept: {round(intercept, 3)}",
"Gradient Descent slope: {round(slope, 3)}",
"Number of steps: {steps}",
.sep = "\n")#> OLS intercept: 5.187
#> OLS slope: 0.624
#> Gradient Descent intercept: 5.186
#> Gradient Descent slope: 0.624
#> Number of steps: 44
完美!(给或拿一些四舍五入,让我一个人呆着,好吗)
祝贺和告别
如果你做到了这一步,并且理解了正在发生的一切,那么恭喜你!这并不完全是让人放松的材料,你可能需要一些时间来理解。
这是我要结束的地方。我的最后一个请求是,如果你在此基础上有所发展,请回来分享一些东西。例如,也许你测试适应性学习率。在这里分享你的作品意味着未来的读者可以从你的作品中受益并直接阅读:)
感谢您的阅读,希望您觉得这有用,再见!
了解如何自动化数据分析的基本步骤
你是不是也厌倦了一遍又一遍的写 df.shape,df.info()。
马库斯·斯皮斯克在 Unsplash 上的照片
介绍
写 df.shape,df.info(),plt.plot(kind='bar '),df[‘column_name’],你也烦吗?nunique() ,以及其他许多基本函数一次又一次地从任何数据中获得基本的洞察力。我相信你们一定也开始觉得这个过程很单调。阅读完本文后,您将看到如何通过在几分钟内开发自己的 Python 包,在五个基本步骤中实现这些基本功能的自动化。
试映
作者提供的视频
我们开始吧
要开始开发您自己的定制 Python 包,我们需要执行以下步骤:
步骤 1-创建 Python 脚本文件
该文件将包含运行基本数据分析所需的 Python 代码。为了演示,让我们自动执行以下步骤,例如计算-
- 数据集的维度
- 所有列的数据类型
- 唯一值的数量
- NA 值的百分比
- 绘制所有分类列的条形图
- 绘制所有数字列的直方图,以查看数据的分布
- 制作一个热图来显示空值
以下是我写的代码片段:
作者图片
文件的名字应该是你想要的包的名字,比如 Pandas,Numpy 等等,并且应该是唯一的。在我们的例子中,我将其命名为“Mrinal”。
步骤 2 创建一个 Setup.py 文件
这个文件是安装包所必需的,包含了包名、作者名等信息。该文件位于包含步骤 1 中的 Python 脚本文件和稍后讨论的其他文件的文件夹之外。
作者图片
上面的图像显示了要在 Setup.py 中编写的代码。这里需要注意的一些事情是,您的包的名称应该是唯一的,如果您希望稍后发布到 pypi.org,那么您不能使用网站中已经存在的任何匹配的名称。例如,您不能创建名为“Pandas”或“Numpy”的包,因为它们已经在库中。
步骤 3 创建一个 init。py 文件
这个文件告诉 Python 这个文件夹包含一个包。它应该与步骤 1 中创建的 Python 脚本文件位于同一文件夹中。
作者图片
上面的代码引用了我们在 Python 脚本中创建的类的名称“Insights ”,以及包的名称“Mrinal”。“.”在 Python3 和更高版本中是强制的。
将文件放在正确的文件夹中
对于这一步:
- 创建一个文件夹,你可以随意命名,因为它不会以任何方式影响安装。让我们把它命名为“我的第一个 Python 包”作为参考
- 将 Setup.py 文件存储在该文件夹中
- 在其中创建另一个文件夹,并将其命名为与您给定的包名相同的名称,在我们的例子中,它是“Mrinal ”,每当您想要导入包时,您将编写“From Mrinal import Insights”。
- 存储名为“Mrinal.py”的 Python 脚本文件和“init”。新创建的文件夹中的“py”文件
第五步 Pip 安装
- 打开命令提示符
- 使用“cd”命令导航到“我的第一个 Python 包”文件夹
- 键入“Pip 安装”
- 这将安装您的软件包
- 然后打开任何 IDE,如 Jupyter Notebook,并键入:“来自 Mrinal import Insights”
- 创建一个类对象,例如 insight_1 = Insights()。也可以看看预告视频。
- 然后像视频中一样调用’ automate_analysis()'函数。你会看到那些重复的步骤现在是如何自动化的,现在你只需要调用这个函数就可以完成所有的工作。
恭喜你!
您自己构建了您的第一个 python 包,并且通过不再一次又一次地编写那些函数,将会在将来节省大量时间。类似地,您可以添加更多的函数和类来为您的包添加更多的内容,并使您的数据分析过程更加顺畅。
资源
- 你也可以从我的 GitHub 页面下载所有的代码文件
- 如果你想上传你的包裹到 pypi.org,你可以点击这个链接
如果你喜欢这篇文章,那么请阅读我的另一篇关于如何开发为强大的机器学习模型执行特征工程所需的关键技能的文章。
了解如何用 Python 创建动画图形
动画数据可视化的基础
随着数据以前所未有的速度不断膨胀,数据科学家需要对其进行分析和理解。一旦发生这种情况,就需要有效地交流结果。
然而,交流数据分析的结果常常是棘手的。为了有效地沟通,一个流行的和非常有效的技术是讲故事。
让世界上所有的信息触手可及并不会让交流变得更容易:反而会让交流变得更难。―科尔·努斯鲍默·克纳弗里克
为了帮助讲故事和交流,数据可视化是至关重要的。动画数据可视化让事情更上一层楼,增加了令人惊叹的因素。
在这篇博客中,我们将探讨如何让你的图表生动起来。我们将学习如何给折线图、条形图和饼图添加新的维度。这个博客将让你开始,但可能性是无限的。
动画是如何工作的
在典型的时尚中,正如你对 Python 的期望,有一个非常易用的包,它使我们能够为我们的数据可视化增加一个额外的维度。
正在讨论的包是 FuncAnimation 扩展方法,是 Python 的 matplotlib 库中动画类的一部分。我们将通过多个例子来看看如何使用它,但是现在,你可以把这个函数想象成一个 while 循环,它不断地在画布上重新绘制我们的图形。
如何使用图书馆
帮助我理解如何制作图表动画的是从结尾开始。这个动画魔术将从下面两行开始发生:
import matplotlib.animation as anianimator = ani.FuncAnimation(fig, chartfunc, interval = 100)
让我们看看 FuncAnimation 的上述输入:
- fig 是我们将用来“绘制我们的图形”的图形对象
- chartfunc 是一个接受数字输入的函数,它表示时间序列上的时间(随着数字的增加,我们沿着时间轴移动)
- 间隔是帧之间的延迟,单位为毫秒。默认为 200。
如需更多可选输入,请查看文档。
进一步研究以上内容,我们需要做的就是将他们的图表参数化为一个函数,该函数将时间序列中的点作为输入,游戏就开始了!
入门指南
为了确保我们涵盖了所有基础,我们将基于之前的数据可视化示例,我们已经在:
不到 5 分钟的逐步介绍
towardsdatascience.com](/the-basics-of-data-visualisation-with-python-23188aa9fc1a)
换句话说,我们将使用来自疫情(每天死亡人数)的数据,并且我们将使用下面代码中给出的最终数据集。如果你想了解更多关于下面的数据转换和如何开始简单的数据可视化,先简单地阅读上面的帖子。
import matplotlib.animation as ani
import matplotlib.pyplot as plt
import numpy as np
import pandas as pdurl = '[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv')
df = pd.read_csv(url, delimiter=',', header='infer')df_interest = df.loc[
df['Country/Region'].isin(['United Kingdom', 'US', 'Italy', 'Germany'])
& df['Province/State'].isna()]df_interest.rename(
index=lambda x: df_interest.at[x, 'Country/Region'], inplace=True)
df1 = df_interest.transpose()df1 = df1.drop(['Province/State', 'Country/Region', 'Lat', 'Long'])
df1 = df1.loc[(df1 != 0).any(1)]
df1.index = pd.to_datetime(df1.index)
动画线条图
我们需要做的第一件事是定义图表中的项目,这些项目将保持不变。也就是说,创建图形对象、x 和 y 标签,设置线条颜色和图形边距。
import numpy as np
import matplotlib.pyplot as pltcolor = ['red', 'green', 'blue', 'orange']
fig = plt.figure()
plt.xticks(rotation=45, ha="right", rotation_mode="anchor") #rotate the x-axis values
plt.subplots_adjust(bottom = 0.2, top = 0.9) #ensuring the dates (on the x-axis) fit in the screen
plt.ylabel('No of Deaths')
plt.xlabel('Dates')
然后,我们必须设置我们的曲线功能,然后动画它:
def buildmebarchart(i=int):
plt.legend(df1.columns)
p = plt.plot(df1[:i].index, df1[:i].values) #note it only returns the dataset, up to the point i
for i in range(0,4):
p[i].set_color(color[i]) #set the colour of each curveimport matplotlib.animation as ani
animator = ani.FuncAnimation(fig, buildmebarchart, interval = 100)
plt.show()
动画饼图
代码结构看起来与折线图相同。然而,有一些差异,我们将通过。
import numpy as np
import matplotlib.pyplot as pltfig,ax = plt.subplots()
explode=[0.01,0.01,0.01,0.01] #pop out each slice from the piedef getmepie(i):
def absolute_value(val): #turn % back to a number
a = np.round(val/100.*df1.head(i).max().sum(), 0)
return int(a)
ax.clear()
plot = df1.head(i).max().plot.pie(y=df1.columns,autopct=absolute_value, label='',explode = explode, shadow = True)
plot.set_title('Total Number of Deaths\n' + str(df1.index[min( i, len(df1.index)-1 )].strftime('%y-%m-%d')), fontsize=12)import matplotlib.animation as ani
animator = ani.FuncAnimation(fig, getmepie, interval = 200)
plt.show()
一个主要的区别是,在上面的代码中,我们每次都返回一组值。在线图中,我们将整个时间序列返回到我们所在的点。我们通过使用
df1.head(i).max()
df1.head(i)返回一个时间序列,但是。max()确保我们只获得最新的记录(因为死亡总数要么保持不变,要么上升)。
动画条形图
构建条形图就像我们到目前为止看到的例子一样简单。对于这个例子,我包括了水平和垂直条形图。取决于你想看哪一个,你只需要定义变量 bar 。
fig = plt.figure()
bar = ''def buildmebarchart(i=int):
iv = min(i, len(df1.index)-1) #the loop iterates an extra one time, which causes the dataframes to go out of bounds. This was the easiest (most lazy) way to solve this :)
objects = df1.max().index
y_pos = np.arange(len(objects))
performance = df1.iloc[[iv]].values.tolist()[0]
if bar == 'vertical':
plt.bar(y_pos, performance, align='center', color=['red', 'green', 'blue', 'orange'])
plt.xticks(y_pos, objects)
plt.ylabel('Deaths')
plt.xlabel('Countries')
plt.title('Deaths per Country \n' + str(df1.index[iv].strftime('%y-%m-%d')))
else:
plt.barh(y_pos, performance, align='center', color=['red', 'green', 'blue', 'orange'])
plt.yticks(y_pos, objects)
plt.xlabel('Deaths')
plt.ylabel('Countries')animator = ani.FuncAnimation(fig, buildmebarchart, interval=100)plt.show()
如何保存动画图形
所以你已经创建了你的第一个动画图表,你想分享它们。你如何拯救他们?
幸运的是,只需要一行代码:
animator.save(r'C:\temp\myfirstAnimation.gif')
更多信息,查看文档。
如果你喜欢这篇博文,你可能也会喜欢:
如何用 xlwings 集成 Python 和 Excel
towardsdatascience.com](/how-to-supercharge-excel-with-python-726b0f8e22c2) [## 正则表达式简介
使用 Python 逐步介绍正则表达式
medium.com](https://medium.com/better-programming/introduction-to-regex-8c18abdd4f70) [## 用 Python 中的 PyAutoGUI 实现自动化 UI 测试
回归测试你的用户界面的一个快速简单的方法
towardsdatascience.com](/automate-ui-testing-with-pyautogui-in-python-4a3762121973)
了解如何用 Python 创建 Web 数据应用程序
最后,你可以在 5 分钟内找到一个图书馆
学习 python 的美妙之处在于它的简单性和直观的表达结构。一旦你学会了这些基础知识,你就可以很好地构建有用且功能强大的应用程序了。加速整个过程并使 python 领先于竞争对手的是大量的免费库。
时不时会出现一个新的库,这改变了游戏!我认为这可能是构建 web 数据应用程序的一个例子。
用于构建 web(数据)应用程序的 Python 库
最流行的 web 开发 Python 框架有 Django、Tornado 和 Flask。都很厉害,但多少有点技术含量。它们需要你投入大量的时间来学习使用它们。在某种程度上,他们不是真正的生活方式!
这就是 streamlit 拯救世界的地方。一家谷歌支持的公司,其使命包括提供机器学习爱好者应得的工具:极快、有趣和互动!
“在生产可共享工件的同时编写生产级代码。”—谷歌 X,尼尔·特里克
事不宜迟,让我们开始探索这个令人印象深刻的图书馆。
疫情数据探索
使用我上一篇文章 中的数据和技术,如何用 Python 创建交互式可视化 , 我们可以用 Streamlit 非常快速地构建一个数据仪表板。
下面是我用几行代码构建的!
加载仪表板
加载仪表板非常快速简单。首先,以典型的方式安装库:
pip install streamlit
然后,创建一个 python 脚本:
import streamlit as stst.title('Hello there')
然后通过命令行运行它:
streamlit run yourScriptsFileName.py
这将返回您需要在浏览器中使用的地址,以查看您的 web 数据应用程序。
内置函数介绍
显示文本
有几种方法可以在 web 应用程序上显示文本:
import streamlit as st
st.title('This is a title')
st.header('A header...')
st.subheader('A subheader...')
st.markdown('Or a markdown.')
多重选择
你可以很容易地添加一个下拉多选控件。
x = st.multiselect('Text to display', List of Available Options, List of default options)
#where x will end up being a list of options
选择框
或者你可以有一个选择框,你只能从下拉菜单中选择一个值。
dailytotal = st.selectbox('Toggle between Daily and Total number of deaths', ('Daily', 'Total'))
滑块
引入滑块可以允许用户在不同的值之间拖动滑块。
slide = st.slider('Slide across to explore infection spread', minimumslide, maxslide, defaultslidevalue)
图表
使用 plotly express 时,您很大程度上遵循了典型的模式,但是您没有使用 fig.show(),而是将其替换为:
st.plotly_chart(fig, use_container_width=True)
交互式地图
一个直接的控件,要求您传入经度和纬度。
st.map(dfmap[['lat','lon']])
缓存以更快获得结果
没有任何形式的缓存,数据仪表板就不完整。令人欣慰的是,streamlit 允许您非常快速、轻松地缓存数据,因此您不必每次都读取它们。简单地在你的函数上添加下面一行。
@st.cache(persist=True)
我的仪表板的完整代码
import streamlit as st
import pandas as pd
import plotly.express as px
import pydeck as pdk
import numpy as np#Load and Cache the data
[@st](http://twitter.com/st).cache(persist=True)
def getmedata():
url = '[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv')
df = pd.read_csv(url, delimiter=',', header='infer')
df.rename(index=lambda x: df.at[x, 'Country/Region'], inplace=True)
dft = df.loc[df['Province/State'].isnull()]
dft = dft.transpose()
dft = dft.drop(['Province/State', 'Country/Region', 'Lat', 'Long'])
dft.index = pd.to_datetime(dft.index)
return(dft, df)df1 = getmedata()[0]st.title('Building a Data Dashboard with Streamlit')
st.subheader('while exploring COVID-19 data')#####In Scope Countries
countrylist = df1.columns.tolist()
countrylist1 = ['United Kingdom', 'US', 'Italy']
x = st.multiselect('Choose in scope countries', countrylist, countrylist1)
df1_inscope = df1[x]dailytotal = st.selectbox('Toggle between Daily and Total number of deaths', ('Daily', 'Total'))
if dailytotal == 'Daily':
plotdata = df1_inscope.diff() #day on day changes
else:
plotdata = df1_inscope#Build Pie Chart
df1 = plotdata.tail(1).transpose()
fig = px.pie(df1, values = str(df1.columns[0]), names = df1.index)
fig.update_traces(textposition='inside', textinfo = 'percent+label')
ddate = str(df1.columns[0])[:10] #chop timestampif dailytotal == 'Daily':
st.header('Number of deaths on ' + ddate)
else:
st.header('Total number of deaths up until ' + ddate)fig.update_layout(
#title = f'Deaths on {ddate} due to COVID-19',
xaxis_title = 'Dates'
,yaxis_title = 'Number of Deaths'
,font = dict(size = 25)
,template = 'seaborn' #"plotly", "plotly_white", "plotly_dark", "ggplot2", "seaborn", "simple_white", "none"
)
st.plotly_chart(fig)piechart = st.sidebar.checkbox('Show Pie Chart data')
if piechart == True:
st.dataframe(df1)
st.write()
else:
st.write()#Move to Line graph
if dailytotal == 'Daily':
st.header('Timeseries of daily number of deaths')
else:
st.header('Timeseries total Number of deaths')fig = px.line()
for i,n in enumerate(plotdata.columns):
fig.add_scatter(x=plotdata.index, y= plotdata[plotdata.columns[i]], name= plotdata.columns[i])
fig.update_layout(
xaxis_title = 'Dates'
,yaxis_title = 'Number of Deaths'
,template = 'seaborn' #"plotly", "plotly_white", "plotly_dark", "ggplot2", "seaborn", "simple_white", "none"
,legend=dict(orientation="h", yanchor = 'top', y = 1.2)
)
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=7, label="1w", step="day", stepmode="backward"),
dict(count=1, label="1m", step="month", stepmode="backward"),
dict(count=2, label="2m", step="month", stepmode="backward"),
dict(step="all")
]),
font = dict( color='#008000', size = 11),
)
)st.plotly_chart(fig, use_container_width=True)##Show underlying data?
showdata = st.sidebar.checkbox('Show Line graph timeseries data')
if showdata == True:
st.dataframe(plotdata)
else:
st.write()###Plot a streamlit map
st.header('Explore the infection spreading with a map')
df2 = getmedata()[1]
df2.rename(columns={'Lat': 'lat', 'Long': 'lon', 'Province/State': 'Province', 'Country/Region': 'Country'}, inplace=True)maxslide = len(df2.columns) - 5
slide = st.slider('Slide across to explore infection spread', 0, maxslide, 10)datecolumn = df2.columns[slide + 4]
datecolumnlist = [datecolumn]st.subheader('Infections Recorded on ' + datecolumn)dfmap = df2[['Country','Province', 'lat', 'lon', datecolumn]]
dfmap = dfmap.replace(0,np.nan).dropna(subset = [datecolumn, 'lat', 'lon'])st.map(dfmap[['lat','lon']])mapgraph = st.sidebar.checkbox('Show map data')
if mapgraph == True:
st.dataframe(dfmap)
st.write()
else:
st.write()
离别的思绪
Streamlit 是一个非常漂亮的数据 web 仪表板,可以单独用 python 编写。它允许你毫不费力地分享你的工作,并且有许多有用的控件。
只使用了这个仪表板的基本功能,我可以看到它的许多应用。它上传文件的新控件 st.file_uploader()肯定会支持更大的项目。
我相信 streamlit 是这样一个库,随着它的成熟,它会变得越来越好,并在定制和控制方面提供越来越多的功能!
如果你喜欢这个博客,你可能也会喜欢:
学习如何有效管理你的时间以获得职业成功
medium.com](https://medium.com/better-programming/three-techniques-for-time-management-and-prioritization-9df6dffe2ff1) [## 学习使用 Python 中的进度条
4 个不同库的介绍(命令行和用户界面)
towardsdatascience.com](/learning-to-use-progress-bars-in-python-2dc436de81e5) [## 识别投资股票的入门指南
想在股市一试身手却不知道从何下手?
medium.com](https://medium.com/financeexplained/beginners-guide-to-identifying-stocks-to-invest-in-4cf10fa5dcff)
了解如何以正确的方式进行特征选择
来源: Pixabay
x 真的是 y 的预测因子吗?
努力为您的模型找到合适的功能?我指的是增值功能。假设您正在处理来自物联网传感器或医疗保健的高维数据,这些数据具有成百上千个特征,很难找出哪些特征子集将带来良好的可持续模型。本文是关于在汽车数据集上使用 scikit-learn 的特性选择和技术实现的。我已经尽了最大努力把复杂的计算放在一边,但是对统计学的一些基本理解会让你的旅程更容易。😃
“原始”数据集通常带有许多不相关的特征,这些特征对预测模型的准确性没有太大贡献。使用音乐类比来理解这一点——音乐工程师经常使用各种技术来调整他们的音乐,这样就没有多余的噪音,声音也清晰明了。类似地,即使是数据集也会遇到噪声,为了更好地优化模型,去除噪声是至关重要的。这就是特性选择的由来!
现在,撇开模型精度不谈,理论上,特征选择
- 减少过度拟合‘维数灾难’—如果数据集的特征/列多于样本 (X) ,模型将容易过度拟合。通过移除不相关的数据/噪声,该模型可以专注于基本特征,从而实现更高的泛化能力。
- 简化模型 —维度给模型增加了许多层,使其变得不必要的复杂。过度工程很有趣,但他们可能不会比简单的同行更好。更简单的模型更容易解释和调试。
- 减少训练时间 —较少的特征/尺寸降低了计算速度,加快了模型训练。
请记住,所有这些好处在很大程度上取决于问题。但可以肯定的是,它会产生一个更好的模型。
这是降维吗?
不完全是!
通常,特征选择和降维可以互换使用,因为它们的相似目标是减少数据集中的特征数量。然而,它们之间有一个重要的区别。特征选择从原始特征集中产生特征子集,这是数据的最佳代表。而降维是引入新的特征空间,在该空间中表示原始特征。它基本上将特征空间转换到一个较低的维度,保持原始特征不变。这是通过组合或排除一些特征来实现的。总之,你可以把特征选择看作是维度教育的一部分。
数据集在运行
我们将使用来自 UCI 机器学习知识库的自动汽车数据集。该数据集包含有关汽车规格、保险风险评级以及与其他汽车相比的正常使用损失的信息。该模型的目标是预测“价格”。一个回归问题,它由连续变量和分类变量组成,如下所示:
属性描述(图片由作者提供)
在对大约 200 个样本(每个样本有 26 个属性)进行了大量的预处理后,我设法将 R 的平方的值设为 0.85。因为我们的重点是评估特性选择技术,所以我不会深入建模过程。要获得完整的回归代码,请查看下面 Github 链接上的 jupyter 笔记本。
查看此链接,了解完整的多元线性回归代码以及汽车数据集的特征技术。
github.com](https://github.com/Ayushijain09/Feature-Selection-Techniques/blob/master/_Automobile_Multiple_LinearRegression_Feature_Selection.ipynb)
现在,让我们尝试通过特征选择来改进模型!
技术
简而言之,特征选择方法可以分为三大类,过滤、包装和嵌入。
一.过滤方法
使用过滤方法,我们主要应用适合我们的数据的统计测量来分配每个特征列一个计算的分数。基于该分数,将决定该特征将被保留还是从我们的预测模型中移除。这些方法计算成本低,最适合消除冗余的不相关特征。然而,一个缺点是它们没有考虑到特性的相关性,因为它们独立地处理每个特性。
此外,我们有对单个特征进行排序的 单变量过滤方法 ,以及评估整个特征空间的 多变量过滤方法 。让我们探索一下最著名的特征选择过滤方法:
1。)缺失值比率
缺少太多值的数据列没有多大价值。理论上,25–30%是缺失值的可接受阈值,超过该阈值,我们应该从分析中删除这些特征。如果你有领域知识,最好能做出一个有根据的猜测,这个特性是否对模型至关重要。在这种情况下,尝试使用此处列出的各种技术输入缺失值。要获得每个特性的缺失值百分比,请尝试下面的一行代码!为每种技术添加一个 jupyter 笔记本很麻烦,所以我使用 Github gist 并排添加了输出,考虑到了相同的汽车数据集。
nlargest()返回缺省值最多的 5 个要素
2。)差异阈值
其中相同值占据大多数样本的特征被称为具有零方差。这种携带少量信息的特征不会影响目标变量,并且可以被丢弃。您可以调整阈值,默认值为 0,即移除所有样本中具有相同值的特征。对于一个非常大的子集具有相同值的准常数特征,使用阈值 0.01。换句话说,删除 99%的值相似的列。
丢弃零方差要素(可自定义阈值)
3。)相关系数
如果两个独立的特征(X)彼此之间有很强的关系并且向相似的方向移动,则它们是高度相关的。在这种情况下,如果一个特性就足够了,那么就不需要将两个相似的特性添加到模型中。它主要考虑拟合线、拟合线的斜率和拟合质量。计算相关系数有多种方法,如果一对列超过某个阈值,则显示与目标变量(y)高度相关的一列将被保留,而另一列将被丢弃。
皮尔逊相关 *(针对连续数据)*是度量两个变量之间相似性的参数统计检验。被参数项搞糊涂了?这意味着该测试假设观察到的数据遵循某种分布模式(例如,正态、高斯)。其系数值’ r’ 的范围在 -1( 负相关)到 1( 正相关)之间,表示数据与模型的拟合程度。它还返回’ p 值,通过与显著性水平’ alpha’ (α)进行比较,确定变量之间的相关性是否显著。如果 p 值小于α,则意味着样本包含足够的证据来拒绝零假设,并得出相关系数不等于零的结论。
来源:多组( x , y )点,每组相关系数为 x , y 。请注意,相关性反映了线性关系的强度和方向(顶行),但不是该关系的斜率(中间),也不是非线性关系的许多方面(底部)。
Spearman 秩相关系数 (针对连续+有序数据)是一种非参数统计检验,工作原理类似于 Pearson,但是,它不对数据做任何假设。用符号 rho(-1<ρ<1)**表示,这种检验可以应用于未通过皮尔逊相关假设的有序和连续数据。对于新手来说,有序数据是分类数据,但在排名/排序上有细微差别(例如,低、中、高)。这里要注意的一个重要假设是,变量之间应该存在单调关系,即变量的值一起增加,或者如果一个增加,另一个减少。
肯德尔相关系数 *(针对离散/有序数据)——*类似于 Spearman 相关,这个系数比较的是一致和不一致数据对的数量。
*假设我们有一对观测值(xᵢ,yᵢ),(xⱼ,yⱼ),i < j,它们是:
*** 和谐 if 任一(xᵢ > xⱼ和 yᵢ > yⱼ)或(x\u\u<x \u\u 和 y\u\u<y\u\u
**不和谐if 任一(x \u
用希腊字母 tau ( τ )表示,该系数在-1 到 1 之间变化,并且基于相对于 x-y 对数量的一致和不一致对的计数差异。
Pearson、Spearman、Kendall 使用 Scipy & Pandas 的相关系数
在上面的回归 jupyter 笔记本中,我使用了 Pearson 相关性,因为 Spearman 和 Kendall 只对顺序变量有效,而我们有 60%的连续变量。
4。)独立性卡方检验 (针对分类数据)
在深入研究卡方之前,我们先了解一个重要的概念:假设检验!想象一下,XYZ 提出一个主张,一个公认的事实,你称之为无效假设。现在你提出了一个替代假设,一个你认为能更好地解释这种现象的假设,然后努力拒绝零假设。
在我们的例子中:
零假设:两个变量是独立的。
备择假设:两个变量是相依的。
因此,卡方检验有两种变化——一种是评估拟合优度,另一种是独立性检验。首先,它将观察到的数据与根据变量独立的期望分布数据的模型进行比较。然后,你基本上需要检查观察到的数据哪里不符合模型。如果数据点/异常值太多,那么变量存在相依性的可能性极大,证明零假设不正确!
它主要返回一个测试统计量*“p 值”*来帮助我们决定!在高水平上,如果 p 值小于某个临界值- ’ 显著性水平’(通常为 0.05),我们拒绝零假设,认为变量是相关的!
卡方检验不适用于汽车数据集,因为它需要分类变量和非负值!出于这个原因,我们可以使用互信息&方差分析。
5。) 互信息( 为双方回归&分类)
互信息衡量一个变量对另一个变量的贡献。换句话说,如果我们删除或添加特性,目标变量会受到多大的影响?如果两个变量都是独立的,则 MI 为 0,如果 X 是 y 的确定性变量,则 MI 在 0-1 之间。MI 主要是 X 的熵,它测量或量化通过一个随机变量获得的关于另一个随机变量的信息量。
关于 MI 最好的事情是它允许人们检测非线性关系,并且对回归和分类都有效。酷!不是吗😃
6。)方差分析
好吧,老实说,这有点棘手,但让我们一步一步地理解它。首先,这里我们处理的不是特性,而是组/级别。组是同一独立(分类)变量中的不同组。方差分析主要是 t 检验的一种 T2 扩展。用 t 检验,你可以只研究两组,但用方差分析,你至少需要三组来观察均值是否有差异,并确定他们是否来自同一人群。
它假定假设为
H0:所有群体的手段都是平等的。
H1:至少有一组的均值不同。
假设从我们的汽车数据集中,我们使用一个“燃料类型”特征,它有两个组/级别——“柴油”和“汽油”。因此,我们的目标是通过计算两组的平均值是否不同于独立变量(即“燃料类型”)的总体平均值,来确定这两组在统计上是否不同。ANOVA 使用 F-Test 进行统计显著性检验,F-Test 是组之间的方差与组内的**方差之比,该数字越大,组的均值越有可能真正不同,您应该拒绝零假设。***
回归任务的方差分析特征选择
选择特征选择方法(图片由作者提供)
二。包装方法
在包装方法中,我们主要选择特征的子集,并使用机器学习算法来训练它们。基于来自该模型的推论,我们采用搜索策略来查看可能的特征子集的空间,并决定为下一个模型开发添加或移除哪个特征。该循环继续,直到模型性能不再随所需的特征数 (k_features) 而变化。
缺点是,随着要素的增加,计算量会变得很大,但好的一面是,它会处理要素之间的交互,最终为您的模型找到具有最低可能误差的最佳要素子集。
1.)顺序特征选择
一种贪婪的搜索算法,它有两种变体- 顺序向前选择 (SFS)和顺序向后选择 (SBS)。它基本上从一组空集特征开始,然后寻找一个特征,使最小化成本函数。一旦找到特征,它就被添加到特征子集中,并以同样的方式一个接一个地找到正确的特征集来构建最佳模型。这就是 SFS 的工作方式。对于顺序向后特征选择,它采取完全相反的路线。它从所有特征开始,并根据性能迭代地逐个去除特征。两种算法的目标都是获得最低成本的模型。
SFS 的主要限制是不能删除添加其他功能后变得无用的功能*。SBS 的主要限制是它不能在一个特性被丢弃后重新评估其有用性。*
SFS(对于顺序向后选择,将向前参数改为 假)
2.)递归特征消除(RFE)
考虑到您有一组初始特征,这种贪婪算法的作用是通过每次考虑更小的特征子集来重复执行模型构建。它是怎么做到的?在对估计器进行特征训练之后,它基于模型的 coef_ 或 feature_importances_ 属性返回等级值,传达每个特征的重要性。对于下一步,从当前特征集中删除最不重要的特征。这个过程被递归地重复,直到获得指定数量的特征。
RFE 回归
三。嵌入式方法
这些方法结合了过滤器和包装器方法的功能。好处是它们在训练过程中执行特征选择,这就是它们被称为嵌入式的原因!计算速度和过滤方法一样快,当然精确度更高,这是一个双赢的模式!
1.)L1(拉索)正则化
*在深入 L1 之前,让我们先了解一下正规化。首先,它是一种用于减少对高度复杂模型过度拟合的技术。我们在成本函数中增加了一个惩罚项,这样随着模型复杂度的增加,成本函数会增加一个巨大的值。回到 LASSO(最小绝对收缩和选择算子)正则化,这里你需要明白的是,它带有一个参数,**‘alpha’*并且 alpha 越高,最不重要特征的特征系数越收缩到零。最终,我们得到一个更简单的模型,具有相同或更好的精度!
然而,在某个特征很重要的情况下,您可以尝试岭正则化(L2)或弹性网(L1 和 L2 的组合),其中不是完全放弃它,而是减少特征权重。
套索回归
2.)树模型(用于回归和分类)
随机森林是最流行和最准确的机器学习算法之一,它是随机决策树的集合。一个单独的树不会包含所有的特征和样本。我们使用这些进行特征选择的原因是决策树的构造方式!我们的意思是,在树构建的过程中,它使用内置的几种特征选择方法。从根开始,用于创建树的函数通过在每一步进行条件比较来尝试所有可能的分割,并选择将数据分割成最同质组(最纯)的一个。每个特征的重要性由每个集合的“纯净”程度得出。
使用基尼系数进行分类,使用方差进行回归,我们可以识别出能够产生最优模型的特征。同样的概念也可以应用于 CART(分类和回归树)和 boosting 树算法。
使用决策树的特征重要性
结束注释
仅此而已!希望你对这些统计测试作为特征选择技术是如何工作的有一个很好的直觉。这里要考虑的一件重要事情是,应用特征选择算法并不总是保证更好的准确性,但肯定会导致比以前更简单的模型!
如果你有任何问题/想法,请在下面的评论区留下你的反馈,或者你可以通过 Linkedin 联系我。
敬请关注更多内容!😃
参考
* [## NumPy、SciPy 和 Pandas:与 Python 的相关性-真正的 Python
在本教程中,您将了解什么是相关性,以及如何使用 Python 计算相关性。你会用 SciPy,NumPy…
realpython.com](https://realpython.com/numpy-scipy-pandas-correlation-python/#pearson-correlation-coefficient) [## 特征选择技术实践:嵌入式方法
第 4 部分:正则化和基于树的嵌入方法
heartbeat.fritz.ai](https://heartbeat.fritz.ai/hands-on-with-feature-selection-techniques-embedded-methods-84747e814dab)*
学习如何(轻松!!)用 Python 做 3 个高级 Excel 任务
面向 Excel 高级用户的熊猫介绍
对峙开始了!(来源:Nik Piepenbreier)
Excel 是无处不在的数据分析工具——它很容易上手,大多数情况下每个人都有一份,一旦你掌握了它,它就非常强大!与此同时,Python 通常被认为是比较难学的,但是却有无限的潜力。在这篇文章中,我们将探索在 Python 中可以轻松完成的三件事,这三件事你通常在 Excel 中都能做到!
我们将从导入 pandas 开始,并根据工作簿中的工作表加载两个数据帧。我们称它们为销售和状态。
将我们的数据集导入熊猫数据框架。
假设我们运行了。head()方法,如下所示:
print(sales.head())
我们可以将其与 Excel 中的数据进行比较:
比较数据在 Excel 和 Pandas 中的显示方式(来源:Nik Piepenbreier)
我们可以看到显示的数据与 Excel 显示数据的方式相对相似,但也有一些关键的区别:
- Excel 从第 1 行开始,而 Pandas 从第 0 行(’ index ')开始,
- Excel 用以 A 开头的字母标记列,而 Pandas 用变量名标记列
让我们开始深入研究如何与熊猫一起完成 Excel 任务。
Python 中的 IF 函数
在 Excel 中使用 IF 函数非常方便,它允许我们根据另一个单元格中的条件应用某个标签。假设我们想要创建一个新列,让我们知道 B 列的单元格中的值是否大于 500。在 Excel 中,我们将 E 列标记为大于 500,我们将进入单元格 E2 并写入:
=IF([@Sales]>500, "Yes", "No")
在 Excel 中应用 IF 函数(来源:Nik Piepenbreier)
如果我们想在 Pandas 中这样做,我们可以使用列表理解来轻松应用相同的 If 语句:
sales['MoreThan500'] = ['Yes' if x > 500 else 'No' for x in sales['Sales']]
解释的理解列表(资料来源:Nik Piepenbreier)
列表理解是这类工作的好工具,它减少了编写复杂 if/else 语句的需要。您可以用 if/else 语句完成同样的事情,但是这样可以节省时间,并使代码更加简洁。你可以通过查看这篇文章来了解更多关于列表理解的细节。
想了解更多关于列表理解的知识吗?看看我的视频!
Python 中的列表理解。资料来源:Nik Piepenbreier
熊猫视频
在我们的数据集中,城市在一张表上,州/省在另一张表上。这并不理想,但是我们可以在 Excel 中使用 VLOOKUP 来链接数据。VLOOKUP 的工作方式类似于左连接,左数据集中的每个记录都被保留。我们告诉 Excel 在查找表中垂直上下查找某一列中的特定值,然后返回位于该列右侧特定列数的值。
让我们添加一个名为“State”的列,并使用 VLOOKUP 从 states 表中返回相应的状态。
使用 VLOOKUP 添加州/省信息(来源:Nik Piepenbreier)
在 Python 中,我们可以使用 Pandas merge 函数来完成同样的事情。Merge 获取两个数据帧并将其合并。为此,我们将编写以下代码:
sales = pd.merge(sales, states, how='left', on='City')
让我们一个论点一个论点地来分析:
- 第一个参数是原始数据帧
- 第二个参数是我们要查找值的数据帧
- 如何指定我们要进行的连接类型
- On 指定我们想要合并的变量(如果变量在每个数据帧中被称为不同的东西,还有 left_on 和 right_on)。
熊猫的数据透视表
数据透视表是 Excel 最强大的功能之一,它允许我们以令人难以置信的速度从大型数据集提取有意义的数据。让我们创建一个关于每个城市销售额的数据透视表。
在 Excel 中生成数据透视表(来源:Nik Piepenbreier)
为此,我们只需将 City 字段拖到 Rows 部分,将 Sales 字段拖到 Values 部分。Excel 会自动合计数据集中每个城市的销售额。
为了在 Pandas 中生成相同的数据透视表,我们将编写以下代码:
sales.pivot_table(index = 'City', values = 'Sales', aggfunc = 'sum')
让我们再来分解一下:
- 我们使用 sales.pivot_table 让 Pandas 知道我们想要基于销售数据框架创建一个数据透视表
- Index 指定了我们想要聚合的值
- Values 指定我们要聚合的值
- Aggfunc 指定了我们想要使用的函数(我们也可以使用 mean,max,min 等)。)
包扎
在本文中,我们学习了如何将 Excel 数据导入 Pandas,如何完成 IF 和 VLOOKUP 函数,以及如何生成数据透视表。但是你可能会问自己,如果你可以在 Excel 中做这里列出的所有事情,为什么还要用熊猫呢?这里没有一个明确的答案。Python 让我们能够生成可重用、可追踪的代码,让我们能够轻松地复制我们的分析设计。对于较小的分析,Excel 可能就足够了。我鼓励你给熊猫打一针,看看你是否会喜欢上它。
学习如何(轻松!!)用 Python 做 3 个更高级的 Excel 任务
Excel 高级用户对熊猫的更多介绍
让我们用 Python 来承担一些更高级的 Excel 任务吧!资料来源:Nik Piepenbreier
在另一篇文章中,我们学会了如何(轻松!!)用 Python 做 3 个高级 Excel 任务。在这里,我们将继续这项任务,并学习另外 3 项你可以轻松掌握的高级技能!我希望这篇文章让 Python 变得更加平易近人,同时在这两个伟大的工具之间提供一些有趣的比较。
我们将从导入 pandas 开始,并根据工作簿中的工作表加载两个数据帧。我们使用与上一篇文章相同的数据集。
如果你想继续的话,我已经为这篇文章上传了一个完整的笔记本。在可以找到这个链接。遗憾的是,颜色格式没有遵循,但是您可以很容易地从那里复制并粘贴代码。同样,如果你想在 Excel 中跟进,你可以通过这个链接下载文件。
让我们开始吧!
Pandas 中的彩色地图格式
条件格式是 Excel 中非常棒的工具之一,它可以让我们快速挑出数据中的异常值,例如最高值或最低值。让我们先在我们的 Excel 文件中这样做!
在 Excel 中应用色彩映射表很容易!资料来源:Nik Piepenbreier
选择要格式化的列。
在“主页”选项卡下,选择条件格式、色标和
选择您想要使用的比例。我们用了绿-黄-红。
在熊猫身上,我们想应用。背景 _ 渐变样式方法。我们可以通过输入:
sales.style.background_gradient(subset=[‘Sales’], cmap = ‘YlGnBu’)
这将返回:
在熊猫身上应用色阶的结果。资料来源:Nik Piepenbreier
让我们稍微分解一下这个语法:
- 子集:识别您想要应用这个的列。如果您想要多个,请将它们嵌套在列表中。
- cmap:Matplotlib 中的颜色映射。这确定了我们想要应用的色阶类型。更多细节可以在这里找到。
Python 中的数据栏
与色标类似,数据条使我们能够轻松地识别单元格中值的大小。
在 Excel 中添加数据栏。资料来源:Nik Piepenbreier
要在 Excel 中添加数据栏:
选择要格式化的列。
在主页选项卡上,转到条件格式→数据栏。
为此,我们选择了纯蓝。
为了用 Python 和 Pandas 实现这一点,我们可以编写以下代码:
sales.style.bar(subset=['Sales'], color = '#50C878')
在 Python 中用熊猫应用数据栏。资料来源:Nik Piepenbreier
让我们再细分一下:
- 子集再次引用我们想要应用格式的列,而
- 颜色是指我们要应用的颜色的十六进制代码!
熊猫中的 SUMIFs
最后,我们将探索如何用 Python 完成 SUMIFs。SUMIF 函数允许我们根据条件将值相加(该条件是否出现在另一列取决于我们)。
在 Excel 中计算 SUMIFs。资料来源:Nik Piepenbreier
在左边的例子中,我们计算所有香蕉销售的总销售额。我们通过使用以下公式实现了这一点:
=SUMIF(sales[Product], "Bananas", sales[Sales])
我们可以通过编写以下代码在 Python 中完成同样的事情:
sales.loc[sales["Product"] == "Bananas", "Sales"].sum()
就像在 Excel 中一样,这将返回 5843。让我们来看看这里发生了什么:
如何承担熊猫的 SUMIF 功能?资料来源:Nik Piepenbreier
结论:学会如何(轻松!!)用 Python 做 3 个更高级的 Excel 任务
在这篇文章中,我们学习了如何在 Excel 和 Pandas 中承担三个额外的高级任务。我们学习了如何在熊猫身上应用色标、色带和 SUMIF 函数。
如果你还没有,请通过点击此链接查看这篇文章的第一部分。
感谢阅读!
现在学习如何掌握 Python 中的 groupby 函数
Pandas 中的 GroupBy 比 SQL 中的 groupby 更加复杂和强大。
麦克斯韦·尼尔森在 T2 的照片
熊猫套餐中一个受欢迎的功能是分组功能。相信之前用熊猫的几乎都一定也用过 groupby 功能。它之所以如此受欢迎,是因为它有效地提供了概括而详细的结果。如熊猫包装文件所述,
“分组依据”指的是涉及一个或多个以下步骤的过程:
根据某些标准将数据分组。
将功能独立应用于每组。
将结果组合成一个数据结构。【1】
SQL 中还有一个 groupby 函数。因此对于有 SQL 经验的人来说,学习 Python 中的 groupby 函数并不是一件困难的事情。但问题是 Pandas 中的 groupby 可以执行比 SQL 更多的分析,这使得 Pandas 中的 groupby 成为一个常见但重要的函数。
熊猫里的 groupby 之所以更厉害,是因为第二步“申请”。在 SQL 中,“应用”步骤中的大多数操作都是统计相关的,比如 min、max、count 等。然而,在熊猫身上,“应用”可以表现得更多。
从熊猫的文档中,
在应用步骤中,我们可能希望执行以下操作之一:
聚合:计算每个组的汇总统计数据。
转换:执行一些特定于组的计算,并返回一个相似索引的对象。
过滤:根据评估真或假的分组计算,丢弃一些分组。【1】
在本文中,我将介绍一些 groupby 应用程序。这些应用程序不仅向我展示了数据的洞察力,还帮助我确定了分析数据的下一步行动。
我们开始吧。
本文使用的数据是来自 Kaggle 的《学生饮酒》中的“student-por.csv”。你可以从这个链接下载数据。
**# Input**
import pandas as pd
data = pd.read_csv('student-por.csv')
data.info()**# Output** <class 'pandas.core.frame.DataFrame'>
RangeIndex: 649 entries, 0 to 648
Data columns (total 33 columns):
school 649 non-null object
sex 649 non-null object
age 649 non-null int64
address 649 non-null object
famsize 649 non-null object
Pstatus 649 non-null object
Medu 649 non-null int64
Fedu 649 non-null int64
Mjob 649 non-null object
Fjob 649 non-null object
reason 649 non-null object
guardian 649 non-null object
traveltime 649 non-null int64
studytime 649 non-null int64
failures 649 non-null int64
schoolsup 649 non-null object
famsup 649 non-null object
paid 649 non-null object
activities 649 non-null object
nursery 649 non-null object
higher 649 non-null object
internet 649 non-null object
romantic 649 non-null object
famrel 649 non-null int64
freetime 649 non-null int64
goout 649 non-null int64
Dalc 649 non-null int64
Walc 649 non-null int64
health 649 non-null int64
absences 649 non-null int64
G1 649 non-null int64
G2 649 non-null int64
G3 649 non-null int64
dtypes: int64(16), object(17)
memory usage: 167.4+ KB
第一步:拆分数据
第一步相当简单,根据一列或多列中的值对数据进行分组。您只需要指定如何执行分组。大多数人都知道一个列名或一组列名可以用于分组。但是,您也可以为分组传递一个函数。该函数将使用索引值作为参数并执行分组。欲了解更多信息,[2]
groupby 函数返回的对象是“DataFrameGroupBy 对象”。分组后,您可以使用group
来查看分组。
**#Groupby one column****# Input**
data.groupby('school')
**# Output** <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000024D28C9DF98>**# Input** data.groupby('school').groups
**# Output** {'GP': Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
...413, 414, 415, 416, 417, 418, 419, 420, 421, 422],
dtype='int64', length=423),
'MS': Int64Index([423, 424, 425, 426, 427, 428, 429, 430, 431, 432,
...639, 640, 641, 642, 643, 644, 645, 646, 647, 648],
dtype='int64', length=226)}**# Groupby a function** **# Input**
def grouping(int):
if int%10==0:
return 'Group1'
if int%5==0:
return 'Group2'
return 'Group3'
data.groupby(grouping).groups
**# Output** {'Group1': Int64Index([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640], dtype='int64'),
'Group2': Int64Index([ 5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125,135, 145, 155, 165, 175, 185, 195, 205, 215, 225, 235, 245, 255, 265, 275, 285, 295, 305, 315, 325, 335, 345, 355, 365, 375, 385, 395, 405, 415, 425, 435, 445, 455, 465, 475, 485, 495, 505, 515, 525, 535, 545, 555, 565, 575, 585, 595, 605, 615, 625, 635, 645], dtype='int64'),
'Group3': Int64Index([ 1, 2, 3, 4, 6, 7, 8, 9, 11, 12,... 637, 638, 639, 641, 642, 643, 644, 646, 647, 648],dtype='int64', length=519)}
在上面使用函数进行分组的例子中,数据帧中的索引是行号。因此,根据行号将一行分配给三个组之一。然后 groupby 函数将这三组分组。
要获得每个组的数据,您可以使用get_group()
函数并输入组名。
**#Input** data.groupby(grouping).get_group('Group1')
data.groupby(分组)。get_group('Group1 ')
此外,如果要按非索引列对数据进行分组,可以同时使用 apply 和 lambda 函数进行分组。
**# Input** data.groupby(data['famsize'].apply(lambda x: x.startswith('GT'))).get_group(False)
data.groupby(data[‘famsize’]。apply(lambda x: x.startswith('GT '))。get_group(False)
分组后,您已经可以应用许多计算或统计函数。例如,size()
可以给你每组的行数;sum()
返回每组所有数字列的总和。要知道更多适用的函数,3
**#Input** data.groupby(data['famsize'].apply(lambda x: x.startswith('GT'))).size()**#Output** famsize
False 192
True 457
dtype: int64
步骤 2:应用函数并组合结果
是时候报道 groupby 的重要部分了。Pandas 中的 Groupby 函数比 SQL 中的功能更强大,因为你不仅可以使用常见的统计函数,如min(), max(), mean(),...
,还可以使用许多更复杂的函数。您也可以应用您定义的函数。在下面的部分,我将分别解释这三个动作。
聚合(agg)
关于聚合的一个简单解释是根据以前分组的数据执行计算。聚合应用于每个组,并返回其各自的结果。
一些常见的计算如sum
、min
、max
、…您可以对所有数值列执行计算,也可以指定一列来执行计算。
**#Input** mjob_gp = data.groupby('Mjob')
mjob_gp.agg('mean')
mjob_gp.agg('mean ')
**#Input** mjob_gp['age'].agg('mean')**#Output** Mjob
at_home 16.955556
health 16.312500
other 16.802326
services 16.661765
teacher 16.583333
Name: age, dtype: float64
关于聚合,一个不太为人所知的情况是,您可以在一个或多个列上同时执行多个计算。如果您想研究一个列的统计数据,这个选项很有用。
**#Input** mjob_gp.agg({'age':['mean','max']})
mjob_gp.agg({‘age’:[‘mean ‘,’ max’]})
然而,一个问题是这些列是多索引的,这对于进一步的处理不是很好(我个人不喜欢多索引)。因此,我们可以更进一步,将pd.NamedAgg
(熊猫 0.25.0 版本新增)包含到agg
功能中。关于pd.NamedAgg
的更多信息,4
**#Input** mjob_gp.agg(avg_age=pd.NamedAgg(column='age', aggfunc='mean'),
min_age=pd.NamedAgg(column='age', aggfunc='min'),
max_age=pd.NamedAgg(column='age', aggfunc='max'))
mjob_gp.agg(avg_age=pd。NamedAgg(column='age ',aggfunc='mean '),
min_age=pd。NamedAgg(column='age ',aggfunc='min '),
max_age=pd。NamedAgg(column='age ',aggfunc='max '))
使用pd.NamedAgg
有两个好处。当然,第一个优点是列上没有多索引。第二个优点是您可以自定义列名。
毫不奇怪,您也可以在聚合中使用自定义函数。
**#Input** def range_function(x):
return max(x) - min(x)mjob_gp.agg(max_age = pd.NamedAgg(column='age',aggfunc='max'),
min_age = pd.NamedAgg(column='age',aggfunc='min'),
range_age = pd.NamedAgg(column='age',aggfunc=range_function),)
mjob_gp.agg(max_age = pd。NamedAgg(column='age ',aggfunc='max '),
min_age = pd。NamedAgg(column='age ',aggfunc='min '),
range_age = pd。NamedAgg(column='age ',aggfunc=range_function),)
变换(transform)
回到变形的描述,
T 转换:执行一些特定于组的计算,并返回一个相似索引的对象。
关键部分是“特定于组的计算”。不同组的计算是不同的。例如,max
将为每个组提供一列的最大值,但不是跨整个数据集。
转换的另一个特征是,计算应用于每一行,并返回每个组长度相同的结果,而不像长度减少的聚合。如果您熟悉 SQL 中的窗口函数,Pandas 中的转换与此类似。(PS:你还不知道 SQL 中的窗口函数?!?!查看我以前的一篇文章,这篇文章帮助您理解为什么 SQL 中的窗口函数如此重要)
[## 为什么 SQL 中的窗口函数如此重要,以至于你现在就应该学习它?
如果我告诉你这个问题会在每次数据分析职位的面试中被问到,你会怎么想?
towardsdatascience.com](/why-window-function-in-sql-is-so-important-that-you-should-learn-it-right-now-1274b6096a86)
**#Input** mjob_gp['G1','G2','G3'].transform(lambda x: (x-x.mean())/x.std())
mjob_gp[‘G1 ‘,’ G2 ‘,’ G3’]。transform(λx:(x-x . mean())/x . STD())
在上面的例子中,对于每个组,G1 到 G3 的值基于相应组的平均值和标准偏差被归一化。
过滤器
从《熊猫》中的描述来看,
R 返回数据帧的副本,排除不满足 func 指定的布尔标准的组中的元素。【5】
您可以使用filter
功能过滤掉任何不符合标准的组。
**#Input** mjob_gp.filter(lambda x: x['G1'].mean() > 12)
mjob_gp.filter(lambda x: x[‘G1’]。平均值()> 12)
在上面的示例中,只返回“健康”和“教师”下的 Mjob,因为它们的“G1”的平均值大于 12。
**#Input** mjob_gp['G1'].mean()**#Output** Mjob
at_home 10.451852
health 12.395833
other 11.275194
services 11.610294
teacher 12.555556
Name: G1, dtype: float64
关闭
Pandas 中的 Groupby 函数是执行大量分析和数据转换的便捷工具。我希望这篇文章能帮助你理解熊猫中 groupby 的威力和用处。我相信您现在已经更加了解如何在日常数据分析中使用 groupby 了。和熊猫玩得开心,下次再见。
我的另一篇文章
如果您是 Python 新手(尤其是自学 Python 的话),请将此加入书签
(第二部分)如果你是 Python 新手(尤其是自学 Python 的话)请将此加入书签
Web Scrape Twitter by Python Selenium(第 1 部分)
Web Scrape Twitter by Python Selenium(第二部分)