TowardsDataScience 博客中文翻译 2021(二十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

在 Python 中本地存储和读取凭证的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-store-and-read-credentials-locally-in-python-5195fc1881b6?source=collection_archive---------24-----------------------

秘密被称为秘密是有原因的。我们不希望其他人知道它们,无论是在现实生活中还是在 Python 中

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

作者图片

原帖【realpythonproject.com】

LinkedIn Twitter 上与我联系

我们将讨论使用 Python 存储和读取凭证的 3 种不同方式。

  • 将它们存储为系统变量
  • 将它们作为变量存储在虚拟环境中
  • 将它们存储在. env 文件中
  • 最便捷的方式

吉姆·梅德洛克的这篇文章对环境变量、它们的用例以及如何使用它们进行了深入的解释。

https://medium.com/chingu/an-introduction-to-environment-variables-and-how-to-use-them-f602f66d15fa

将它们存储为全局环境变量

如果凭据存储为全局环境变量,则在您 PC 上的任何环境中运行的任何脚本都可以访问它们。

要创建一个全局环境变量,请在您的终端中运行

export varName=varValue

确保“=”之间没有空格。如果您得到一个错误“zsh: Bad Assignment”,这可能是由于“=”之间的空格引起的。

让我们创建几个全局环境变量

export globalSecretUser=global_rahul1999
export globalSecretKey = global_xy76hUihk

在 Windows 中,您可能必须使用“设置”而不是“导出”

上面的脚本需要在终端中运行。现在,让我们尝试访问我们之前创建的变量。

import os
print(os.environ) 
# This will print a dictionary with 
# all the global environment variables

我们可以使用字典访问方法来读取环境变量,即使用。get()或[ ]

print(os.environ.get('globalSecretUser'))
print(os.environ.get('globalSecretKey'))'''
global_rahul1999
global_xy76hUihk
'''

要更新环境变量,只需再次运行 export 语句

export globalSecretUser=Updated_rahul1999

让我们再次尝试访问 Python 中的变量

import os print(os.environ.get('globalSecretUser'))'''
Updated_rahul1999
'''

要删除环境变量,我们使用 unset 关键字

unset globalSecretUser

如果您尝试在 Python 中访问该变量,根据您用来访问字典中的值的方法,您将要么得到一个 KeyError,要么没有。

将它们作为变量存储在虚拟环境中

这些环境变量只能由在创建变量的虚拟环境中运行的脚本访问。我们可以将它们视为“局部”环境变量。

首先,我们必须创建一个虚拟环境

在 Mac 上

python3 -m venv venv

在 Windows 上

python -m venv venv

这将在您的当前目录中创建一个虚拟环境。bin 文件夹中应该有一个名为“activate”的文件。如果您使用的是 Windows,它应该在 Scripts 文件夹中。每当我们激活虚拟环境时,这个脚本就会运行。

我们将在这个脚本中添加变量。因此,每次我们激活虚拟环境时,都会创建环境变量。打开文件。

在创建变量之前,我们需要添加一些代码,以确保一旦虚拟环境被停用,这些变量就不存在了。

我们将使用 unset 关键字,转到 activate 脚本中的函数 deactivate()并在函数的开头取消设置变量

deactivate () {
    unset localSecretUser
    unset localSecretKey
    # Some Code
}

现在,我们将使用 export 关键字来定义变量。这段代码应该位于激活脚本末尾的停用函数之外

deactivate(){
     # Some Code
}
# Some More Code
export localSecretUser=local_secret_rahul199
export localSecretKey=local_secret_xyudJIk12AA

在 Windows 中,您可能必须使用“设置”而不是“导出”

现在我们需要激活我们的虚拟环境。如果您已经激活了您的虚拟环境,您可以使用 deactivate 关键字来停用您的虚拟环境

deactivate

在终端中键入以上内容。

现在让我们激活我们的虚拟环境。
在苹果电脑上

source venv/bin/activate

在 Windows 上

venv/Scripts/activate

您可以在终端中使用以下命令列出当前环境的变量

printenv

现在让我们尝试访问我们刚刚创建的变量。这类似于我们访问全局环境变量的方式

import os print(os.environ.get('localSecretUser'))
print(os.environ.get('localSecretKey'))'''
local_secret_rahul199
local_secret_xyudJIk12AA
'''

现在,让我们停用虚拟环境,并尝试再次运行 python 脚本

deactivate
python3 main.py

它应该不返回任何值。

要了解更多关于 Python 中虚拟环境的知识,请查看达科塔·莉莉艾的这篇文章

https://medium.com/@dakota.lillie/an-introduction-to-virtual-environments-in-python-ce16cda92853

将它们存储在. env 文件中

在您的根文件夹(包含您的虚拟环境的文件夹)中,创建一个名为“. env”的文件。在该文件中添加变量

#inside file named .env
secretUser = "secret_user_rahul1999"
secretKey = "secret_key_adfdsaUj12"

我们需要安装一个 python 库来读取变量

pip3 install python-dotenv

让我们来阅读 Python 中的变量

from dotenv import load_dotenv
import os load_dotenv()
print(os.environ.get('secretUser'))
print(os.environ.get('secretKey'))'''
secret_user_rahul1999
secret_key_adfdsaUj12
'''

不要忘记添加。的. env 文件。gitignore 文件。这将确保您的凭证不会被推送到您的 git 存储库。

# Inside .gitignore.env

最方便的方法

在我看来,最方便的方法是将它们存储在. env 文件中。

  • 它们位于您项目的本地
  • 您不需要担心“取消设置”它们
  • 如果您将它们添加到您的。gitignore 文件,它对外界是安全的
  • 如果您将脚本部署为无服务器函数,您将需要使用“load_dotenve()”来读取 Azure/AWS 环境的配置文件中存储的环境变量。

虽然它有很多优点,但是一个缺点是当我们在。与全局环境变量同名的 env 文件。在 Python 中访问变量将返回全局值,因为我们没有使用“unset”来取消变量值的设置,也没有使用“export”来为变量赋值。

让我知道你是否喜欢任何其他方法,或者是否认为其中一个比另一个更安全。

用 Python 调优机器学习模型超参数的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-tune-hyperparameters-of-machine-learning-models-with-python-cda64b62e0ac?source=collection_archive---------19-----------------------

从零开始到网格搜索—包括动手示例。

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

马泰奥·卡塔内塞Unsplash 上的照片

机器学习模型开箱即可相当准确。但通常情况下,精度可以通过超参数调整来提高。

超参数调整是一个通过调整超参数来提高模型准确性的漫长过程,这些值无法学习,需要在训练前指定。

今天,您将学习三种超参数调谐方法。您将从最手工的方法转向用 Scikit-Learn 库实现的GridSearchCV类。

这篇文章的结构如下:

  • 数据集加载和准备
  • 手动超参数调谐
  • 基于环路的超参数调谐
  • 使用 GridSearch 进行超参数调整
  • 结论

你可以点击下载这篇文章的笔记本

数据集加载和准备

没必要在这里发疯。简单的数据集就可以了。您将使用直接从 web 加载的 Iris 数据集。

就库而言,您将需要 Pandas 来处理数据,以及 Scikit-Learn 中的几个类/函数。以下是如何加载库和数据集:

调用head()函数将显示以下数据帧子集:

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

图片 1 —虹膜数据集的头部(图片由作者提供)

数据集非常干净,所以不需要额外的准备。接下来,您将把它分成训练和测试子集。方法如下:

最后,让我们建立一个默认模型。它将向您展示使用默认超参数的模型有多精确,并且它将作为调整后的模型应该超越的基线。

下面是如何在训练集上训练决策树模型,获得准确率得分和混淆矩阵:

相应的准确度和混淆矩阵如下所示:

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

图片 2 —基线模型准确性和混淆矩阵(图片由作者提供)

简而言之——您需要一个在测试集上准确率超过 97%的模型。让我们看看超参数调优是否能做到这一点。

手动超参数调谐

您不需要专门的库来进行超参数调优。但这将是一个乏味的过程。

在开始之前,您需要知道可以优化哪些超参数。您可以在库文档中找到完整的列表。这里是决策树的文档页面。在本文中,您将只针对这三个方面进行优化。这些是:

  • criterion–衡量分割质量的函数,可以是基尼(默认)或
  • splitter–在每个节点选择拆分的策略,可以是最佳(默认)或随机
  • max_depth–一棵树的最大深度,一个整数值

您可以将一组超参数值定义为一个字典(键-值对),然后根据它们构建单独的模型。方法如下:

以下是相应的精度:

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

图 3-手动调整模型的精确度(图片由作者提供)

总结一下——您已经设法超越了基线模型,但是这种方法是不可扩展的。想象一下,如果您想要测试 1000 种组合,这实际上是一个很小的数字——以这种方式编写代码不是一条路。接下来我们来改进一下。

基于环路的超参数调谐

您可以通过在列表中指定可能的超参数值来改进前面的解决方案。超参数有多少,列表就有多少。然后在嵌套循环中对模型进行训练和评估。

下面是一个示例代码片段:

如您所见,测试集上的模型精度和相应的超参数值作为字典存储在一个列表中,该列表后来被转换为数据框。很容易对数据框进行排序,并查看哪个超参数组合做得最好:

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

图 4 —手动调整模型的分数和超参数的数据框架(图片由作者提供)

总结一下——这种方法非常有效,但是您注定要使用嵌套循环。三个超参数没问题,但是想象一下优化十个。一定有更好的办法。

使用 GridSearch 进行超参数调整

Scikit-Learn 附带了GridSearchCV类,它让超参数调优变得非常有趣。优化可能需要很长时间(与类无关),但是您可以不用手动编写东西。

您需要将超参数空间声明为一个字典,其中每个键都是超参数的名称,其值是可能值的列表。然后,您可以通过调用fit()函数,使用GridSearchCV类来找到一个最优集合。

这种方法还有内置交叉验证的好处,消除了结果中的“机会”。

以下是完整的代码片段:

然后,您可以将结果存储在 Pandas 数据框中(以便于检查),方法如下:

这是数据框的一部分:

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

图 5 —网格搜索参数数据框(图片由作者提供)

让我们过滤此数据框,仅保留感兴趣的列—平均测试分数和已用超参数值,并按平均测试分数排序:

结果如下:

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

图 6 —使用 GridSearch 调整的模型的分数和超参数的数据框架(图片由作者提供)

如果您对检查多种组合感兴趣,这是一个很好的方法。如果您只想获得最佳价值,有一种更简单的方法:

该属性返回一个字典:

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

图片 7-最佳超参数(图片由作者提供)

可以直接把字典传给机器学习模型(使用拆包— **dict_name)。

这就是为机器学习算法找到最佳超参数有多容易。接下来让我们总结一下。

结论

最后一种方法将在大多数情况下完成工作。你可以手动进行优化,但这有什么意义呢?

网格搜索可能需要很长时间才能完成。假设你有 5 个参数,有 5 个可能的值。这是 55 种可能的组合(3125)。将交叉验证添加到图片中(假设 10 倍),这就是你需要训练和评估的 31250 个模型。

对于这些情况,随机网格搜索可能是一个更好的选择。从代码角度来说,它与非随机化方法的工作原理相同,所以这就是今天没有讨论它的原因。

感谢阅读。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

https://medium.com/@radecicdario/membership

加入我的私人邮件列表,获取更多有用的见解。

了解更多信息

原载于 2021 年 1 月 21 日 https://betterdatascience.comhttps://betterdatascience.com/3-ways-to-tune-hyperparameters/

在 Python 中可视化循环进度的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-visualize-loop-progress-in-python-7eea7dfa512a?source=collection_archive---------13-----------------------

不要等待意想不到的结局

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

沃洛德梅尔·赫里先科Unsplash 拍摄的照片

在编程语言中,循环用于迭代一组对象。在迭代时,我们可以根据各种条件对每个对象采取不同的操作来完成任务。

有时,当列表非常大,或者列表中的对象维数很高时,处理列表需要很长时间。在这种情况下,就像打勾一样,我们通常会尝试打印索引号来检查列表的进度。

我们无法记住每次运行代码时循环的大小。为了解决这个问题,我们可以利用 python 库显示进度条来直观地检查进度,而不是打印列表索引来检查进度。

本文将介绍我们如何利用 python 库来制作进度条,并介绍我们可以使用该库的各种地方。

tqdm——一个 Python 库

tqdm 源自阿拉伯语单词 taqaddum ,意为“进步”,是西班牙语中“我如此爱你”的缩写( te quiero demasiado )。

这个库帮助我们显示任何循环的进度条。它还支持嵌套循环功能,也可以用于熊猫Keras&Jupyter 笔记本以及许多其他地方

让我们探索一些最佳实践,在这些实践中,我们通常使用这种方法来使我们的任务更易管理和更智能。

装置

在开始库使用部分之前,让我们首先使用 python 中的 pip 命令安装它。

pip install tqdm

就是这样。让我们探索一下可以利用tqdm 模块的一些领域。

使用第 1 部分— IPython/Jupyter 集成

我们可以利用 Jupyter 笔记本的tqdm模块来跟踪进度。在机器学习领域,当我们使用一组时期训练我们的模型时,为了可视化每个时期的完成进度,我们可以使用tqdm

使用tqdm.notebook子模块支持 IPython/Jupyter。

from tqdm.notebook import trange, tqdm
from time import sleepfor i in trange(4): #first loop
    for j in tqdm(range(100)): #Nested loop
        sleep(0.01)

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

作者 Jupyter 笔记本截图

使用第 2 部分— Keras 集成

一个keras callback也可与tqdm一起使用,以可视化模型拟合的进度。我们可以如下使用它:

from tqdm.keras import TqdmCallback

...

model.fit(..., verbose=0, callbacks=[TqdmCallback()])

keras callback也有一个 display()方法,可以在拟合机器学习模型时与tqdm一起使用,如下所示:

from tqdm.keras import TqdmCallback
cbk = TqdmCallback(display=False)cbk.display()
model.fit(..., verbose=0, callbacks=[cbk])

使用第 3 部分-通用 Python 脚本

我们可以利用通用 python 的tqdm,编写任务脚本来可视化任务进度,包括从数据库中提取数据和可视化完整流程。范围是无限的。

def improve_guess_func(rt, n):
    return (rt + n/rt) / 2guess = 1
target = 2
for i in trange(10):
    guess = improve_guess(guess, target)

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

作者 Jupyter 笔记本截图

结论

本文到此为止。我们已经介绍了如何有效地使用 python 中的tqdm函数来可视化和跟踪循环在不同地方的进展。

我们可以在任何情况下使用这个函数,在这种情况下,我们不知道一个循环要花多少时间来处理它的元素。在那种情况下,tdqm扮演了一个很有希望的角色。

感谢阅读!

在你走之前……

如果你喜欢这篇文章,并且想继续关注关于 Python &数据科学的更多精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为一名中级会员。

请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。

还有,可以随时订阅我的免费简讯: 普朗加尔的简讯

将 Python 列表写入雪花表的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-write-python-lists-to-a-snowflake-table-802318e56c64?source=collection_archive---------15-----------------------

了解如何存储可以用 SQL 查询的大量数据,从 Python 嵌套列表到雪花数据库

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

建议的点播课程:

你是想通过成为 数据工程师 还是 机器学习工程师 来推进自己的职业生涯吗?我强烈建议您查看以下课程:

简介

在构建数据管道时,您可能最终会在 Python 列表中存储大量数据。

通常,该对象采用列表的列表的形式,其中每个嵌套列表可以表示数据库表中的一行,并且属于它的每个元素可以被分配给特定的列:

***lst** = [[x1, y1, z1], [x2, y2, z2], [x3, y3, z3],...,[xn, yn, zn]]*

尽管 Python 列表不是存储数据的最有效方式,但使用它们来保存中间输出还是很方便的。

例如,假设您的管道是以这样一种方式编写的,它利用 Python 算法来操作和丰富数据(,这种逻辑在 SQL* 中不容易复制),并且算法的输出最终被附加到一个列表中。*

但是,在某些时候,您可能需要将该列表的内容存储在数据库中。这通常发生在以下情况:

  • 数据不需要进一步处理。可以提供给分析师进行报告。
  • 数据确实需要额外处理。然而,使用 Python 列表不再是一种选择,因此您决定将中间结果保存在一个辅助表中。

根据您正在使用的数据库,可以应用多种策略。然而,在本教程中,我将向您展示使用将 Python 列表写入雪花数据库的 3 种方法:

  • snowflake.connector自行打包;
  • snowflake.connectorpandas套餐的组合;
  • snowflake.sqlAlchemypandas套餐的组合。

在开始编写代码之前,让我们简要描述一下您在日常工作中可能会遇到的一个实际用例。

*💔-nanodegrees-you-should-consider-to-advance-your-data-engineering-career-in-2021-baf597debc72>

插入、更新或删除数据

在现实世界中,向目标表中插入新记录是不够的。同时,数据工程师通常还需要更新(或删除)其中已经存在的记录。

在现实世界中,向目标表中插入新记录是不够的。同时,数据工程师通常还需要更新(或删除)已经存在的记录。

在雪花中,这可以通过使用MERGE INTO语句来实现,引用文档 " 根据第二个表(源)或子查询中的值插入、更新和删除表中的值,其语法如下:

MERGE INTO *<target_table>* USING *<source>* ON *<join_expr>* { **matchedClause** | **notMatchedClause** }

令人烦恼的是,为了决定在<target_table>中插入哪些记录,更新(或删除)哪些记录,MERGE INTO语句要求<source>(读作:您希望插入、更新或删除到目标表中的新 记录)作为标准表严格可检索,或者作为子查询进行查询。

反过来,这也就意味着,截至目前,雪花并不支持一个 Python 列表作为USING语句下的 **<source>**

这正是数据需要额外处理,但使用 Python 列表不再可能的情况:嵌套的对象需要转换成其他格式并写入数据库表,然后后者才能用作合并的源。

下面描述了需要发生的事情的流程:

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

作者在 Lucidchart 上创建的流

这又把我们带回了最初的问题:**如何把 Python 列表写到雪花表?**要回答这个问题,我们先创建一个模拟数据集。

创建模拟 Python 列表

下面我所做的是创建一个data_to_insert列表,它本身包含五个子列表,其中存储了关于模拟金融交易的数据。

这个列表表示 ETL 管道的输出,它必须被写入雪花中的目标表。为了实现这一点,首先需要将该列表插入到一个辅助表中。

然后我把这个列表转换成一个df_to_insert熊猫数据框架,很快就会用到。正如所料,数据帧具有形状(5,5):

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

使用与 DataFrame 相同的列定义,我最终在 SnowFlake 中创建了一个空的辅助(source_t)表,现在可以存放数据了:

让我们看看如何通过 Python 连接到 SnowFlake 来填充它,以便通过游标对象执行 SQL 查询。

如何给雪花写一个 Python 列表

方法#1 | SF 连接器+ ExecuteMany()

将 Python 列表批量插入雪花表的第一种方法是通过snowflake.connector包连接到雪花。

一旦建立了连接(通过external browser认证或者通过user + password的组合),您可以简单地将INSERT语句传递给executemany()方法:

现在,可以使用 SQL 检索最初存储在列表中的数据:

SELECT * FROM SCHEMA.SOURCE_T 

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

通过以下方式获得的输出

优点:executemany()方法非常简单,因为它只需要一个INSERT语句,不需要将列表转换成另一种格式。

CONS: 为了使这种方法成功,列表中的 最大表达式数必须是 < 16,385 ,这意味着如果您正在处理较大的批处理,这不是一个可以考虑的选项。

此外,对于您希望插入的每一列,您需要添加一个%s作为VALUES()语句的一部分,这使得键入操作有点重复,代码也不够优雅。

方法#2 | Pandas + SF 连接器+ WritePandas()

如果您正在处理大批量,我建议您:

  • 通过snowflake.connector包连接雪花(和上面描述的一模一样);
  • 将 Python 列表转换成 pandas DataFrame(之前获得df_to_insert时也是这样做的);
  • 使用write_pandas()功能将df_to_insert写入表格:

优点:write_pandas()在幕后高效地将数据保存在 Parquet 文件中,然后使用PUT命令将这些文件上传到临时阶段,最后运行COPY INTO <table>命令将数据从文件复制到表中

CONS: 从内存的角度来看,将 Python 列表转换成 DataFrame 可能很麻烦。此外,write_pandas()不允许您指定当数据已经出现在表中时要做什么。这意味着,如果您希望每次运行时清空source_t,您将需要运行单独的TRUNCATE TABLE命令。

方法#3 | Pandas + SQLAlchemy + To_SQL()

当您可以自由选择建立与雪花连接的包时,我强烈建议您使用sqlalchemysnowflake.sqlalchemy的组合来创建一个engine对象。

创建engine的好处在于,这是唯一一种在传递给to_sql() pandas 方法时工作良好的连接对象(然而,如果您试图传递用方法#1 和#2 创建的db_conn_sf连接对象,它将抛出一个错误)。

要将df_to_insert写入雪花表格,您可以使用类似于下面的脚本,在我看来这是一个很好的解决方案:

**优点:**当数据已经出现在source_t表中时,to_sql()方法比write_pandas()方法更先进。例如,在这种情况下,我将if_exists参数设置为等于'replace’,这样我就不需要单独的命令来截断表。

CONS: 另一方面,方法背后的算法在转换和存储记录时不如write_pandas()函数高效。在插入到source_t表之前,数据没有被压缩和保存到 Parquet 文件中,这意味着并行性不能被应用,并且在处理大批量数据时对内存的影响可能是相关的。

结论

在本教程中,我已经和你分享了三种可以用来将 Python 列表写入雪花表的方法。现在数据在source_t中可用,我可以通过运行类似于 thisMERGE INTO查询来完成我的管道上的工作。您可以使用它作为模板来处理您的项目。

但是我也想从你那里了解更多:你曾经面临过这样的问题吗?和…有没有用过其他方法把 Python 列表转换成雪花表?请随意发表评论😁

给我的读者一个提示: 这篇文章包括附属链接,如果你购买的话,我可以从中赚取一小笔佣金,不需要额外的费用。*

30 个例子让你从新手变成高级熊猫用户

原文:https://towardsdatascience.com/30-examples-to-get-you-from-a-novice-to-an-advanced-pandas-user-e6eb4e8750b7?source=collection_archive---------3-----------------------

全面和结构化的实用指南

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

照片由恒电影Unsplash 上拍摄

Pandas 是 Python 的一个数据分析和操作库。它是数据科学家和分析师中最受欢迎的工具之一。

熊猫可以处理整个数据分析管道。它提供了多种功能和方法来清理、转换、分析和绘制数据。在本文中,我们将做 30 个例子来演示每个步骤中最常用的函数。

我们将从基本操作开始,然后逐渐增加复杂性。前 4 个示例将涵盖创建您自己的数据框以供练习的不同方式。对于本文的剩余部分,我们将使用 Kaggle 上提供的墨尔本房屋数据集。

示例 1

DataFrame函数可用于使用 Python 字典创建数据框。键用作列,值代表行。

import numpy as np
import pandas as pddict_a = {
   "name": ["John", "Jane", "Emily"],
   "height": [178, 175, 177],
   "age": [25, 22, 27]
}df = pd.DataFrame(dict_a)df

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

(图片由作者提供)

示例 2

在第一个例子中,我们只对字典值使用列表。也可以使用其他数据结构。

dict_b = {
   "date": pd.date_range("2020-01-01", periods=5, freq="D"),
   "store": "A",
   "sales": np.random.randint(50, 100, size=5)
}df = pd.DataFrame(dict_b)df

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

(图片由作者提供)

第一列包含连续 5 天的DatetimeIndex。第二列用相同的字符串填充,第三列用随机整数的 numpy 数组创建。

示例 3

如果您只需要一个由随机数组成的数据框,那么二维 numpy 数组比字典更实用。

df = pd.DataFrame(np.random.randint(0, 20, size=(3,4)))df

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

(图片由作者提供)

实例 4

如果没有定义列名,Pandas 会分配一个整数索引作为列名。我们总是可以使用columns参数定制列名。

df = pd.DataFrame(
   np.random.randint(0, 20, size=(3,4)),
   columns = list("ABCD")
)df

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

(图片由作者提供)

实例 5

对于其余的例子,我们将使用墨尔本住房数据集。让我们首先将数据集读入数据框并检查其大小。

df = pd.read_csv("/content/melb_housing.csv")print(df.shape)
(63023, 13)df.columns
Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG','Date', 'Postcode', 'Regionname', 'Propertycount', 'Distance','CouncilArea'],dtype='object')

read_csv功能唯一需要的参数是文件路径。尽管它有许多可选参数。我们将在下面的例子中看到其中的一些。

数据帧有 63023 行和 13 列。我们可以通过在数据框上应用columns方法来检查列名。

实例 6

read_csv函数允许根据列或行选择数据集的一部分。我只需要郊区、地址、日期、类型、地区名称、距离和价格列

df = pd.read_csv(
   "/content/melb_housing.csv",
   usecols = ["Suburb", "Address", "Date", "Type", "Regionname",  
              "Distance", "Price"]
)df.head()

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

(图片由作者提供)

usecols参数用于选择特定的列。head方法显示数据帧的前 5 行。

例 7

有几个函数可以处理日期和时间。为了使用它们,日期必须以适当的数据类型存储。我们可以在创建数据框后随时更改数据类型。然而,更好的方法是在读取 csv 文件时解析日期。

df = pd.read_csv(
   "/content/melb_housing.csv",
   usecols = ["Suburb", "Address", "Date", "Type", "Regionname",  
              "Distance", "Price"],
   parse_dates = ["Date"]
)df.dtypes
Suburb                object 
Address               object 
Type                  object 
Price                float64 
Date          datetime64[ns] 
Regionname            object 
Distance             float64 df.head()

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

(图片由作者提供)

dtypes方法可以用来检查每一列的数据类型。

实施例 8

原始数据并不总是最理想的格式。我们很可能会遇到缺失的价值观。为了保持数据的准确性和一致性,正确检测和处理缺失值至关重要。

isna函数返回用布尔值填充的数据框,指明丢失的值。由于 True 被视为 1,我们可以应用 sum 函数来计算每一列中缺失值的数量。

df.isna().sum()Suburb            0 
Address           0 
Type              0 
Price         14590 
Date              0 
Regionname        0 
Distance          0

我们只在价格列中缺少值。

示例 9

fillna功能可用于替换丢失的值。有不同的方法来处理它们。最佳方案取决于手头的数据。

我们可以用列中值的平均值、中值或众数来填充缺失值。另一种选择是使用常数来替换丢失的值。

在某些情况下,我们可以选择删除缺少值的行或列。dropna功能用于此类任务。它还允许根据条件删除缺少值的行。例如,可以将其定制为删除缺失值超过 3 个的行。

因为数据集的焦点是价格列,所以我选择删除缺少价格的观察值(即行)。

df.dropna(axis=0, how="any", inplace=True)df["Price"].isna().sum()
0

axis参数选择行或列。默认值为 0(即行数)。how参数被设置为“any”以删除有任何缺失值的行。最后,将inplace参数设置为“真”以保存数据框中的更改。

实例 10

astype函数可用于改变列的数据类型。例如,我可能选择用整数而不是浮点数来表示价格。

df.Price = df.Price.astype("int")df.Price.dtypes
dtype('int64')

实施例 11

数据分析中的一个常见操作是基于现有列派生列。我们既可以更新一列中的值,也可以根据现有的值创建一个新的值。

例如,我将创建一个以百万为单位显示价格的列。简单用价格栏除以 100 万就可以算出来。

df["PriceMillion"] = df["Price"] / 1000000df.head()

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

(图片由作者提供)

实例 12

正如我们在前面的示例中看到的,新列被添加到数据帧的末尾。但是,我希望它在价格栏旁边。

insert函数允许使用列索引在特定位置添加列。让我们首先删除新列,然后将其插入到所需的位置。

df.drop("PriceMillion", axis=1, inplace=True)df.insert(4, "PriceMillion", df["Price"] / 1000000)df.head()

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

(图片由作者提供)

第一个参数指定新列的索引。另外两个参数是列名和值。

实施例 13

当处理分类变量时,我们可能需要检查列中的唯一值。考虑我们的数据框中的区域名称列。了解该列中有多少不同的值以及它们是什么会很有用。

nunique函数返回不同值的数量,而unique函数显示它们。

df.Regionname.nunique()
8df.Regionname.unique()
array(['Northern Metropolitan', 'Western Metropolitan',        'Southern Metropolitan', 'South-Eastern Metropolitan',        'Eastern Metropolitan', 'Northern Victoria', 'Eastern Victoria',        'Western Victoria'], dtype=object)

实施例 14

过滤观察值(即行)是数据分析的基本部分。我们试图通过根据某些条件检查数据来获得对数据的更好理解。

例如,我们可能想计算价格超过 100 万英镑的房子的数量。

len(df[df.PriceMillion > 1])
17268df[df.PriceMillion > 1]["Price"].count()
17268

我们使用列名在方括号内应用条件。必须使用数据框的名称指定列名。

len是一个内置的 Python 函数。当用于数据框时,它返回行数。count函数,顾名思义,计算一列中的项数。

实施例 15

上述方法还允许基于多个条件进行过滤。我们来查一下造价 100 万以上,类型为“u”的房子有多少?

len(df[(df.PriceMillion > 1) & (df.Type == "u")])
598

实施例 16

如果过滤器有几个值,我们可以使用isin功能。

suburbs = ['Abbotsford', 'Aberfeldie', 'Airport West', 'Albert Park', 'Albion']len(df[df.Suburb.isin(suburbs)])
661

我们创建一个所需值的列表,然后使用它进行过滤。

实例 17

Pandas 提供了几个函数和方法来处理文本数据。我们可以通过 str 访问器来使用它们。

我们也可以使用字符串方法进行过滤。让我们找到以字母 d 开头的郊区的房子。

suburb_D = df[df.Suburb.str.startswith("D")]suburb_D.head()

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

(图片由作者提供)

实施例 18

在前面的示例中,我们通过过滤原始数据框创建了一个数据框。正如我们在前 5 行中注意到的,这些行的索引与原始索引保持一致。

最好有一个从 0 开始的索引,这可以通过在过滤后应用reset_index函数来实现。

suburb_D = df[df.Suburb.str.startswith("D")].reset_index(drop=True)suburb_D.head()

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

(图片由作者提供)

如果我们没有将drop参数设置为 True,那么原始索引将作为一个新列保存在数据框中。

实施例 19

另一种过滤行的方法是query函数。它接受字符串形式的条件,这在某些情况下可能更实用。

让我们使用与之前相同的过滤条件,以确保它能够准确工作。

len(df.query("PriceMillion > 1"))
17268len(df.query("PriceMillion > 1 and Type == 'u'"))
598

实施例 20

str 访问器提供了许多操作字符串的函数。常用的一个就是 split 函数。

例如,我们可以通过从 region name 列中提取第一个单词来创建 region group 列。这可以通过如下的分割功能来实现。

df["RegionGroup"] = df.Regionname.str.split(" ", expand=True)[0]df.head()

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

(图片由作者提供)

当设置为 True 时,expand参数在分割后为每个片段创建单独的列。我们使用索引 0 选择第一个单词。

实施例 21

另一个功能强大的访问器是 dt 访问器。它用于操作和处理日期和时间。

例如,我们可以从日期中提取月和年,如下所示。

df["Month"], df["Year"] = df["Date"].dt.month, df["Date"].dt.yeardf[["Date", "Year", "Month"]].head()

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

(图片由作者提供)

dt 访问器提供了许多函数和方法。我们不能在这里涵盖所有这些,但是请记住,dt 访问器是我们在处理日期和时间时使用的。

实施例 22

groupby函数在数据分析中经常使用。我们可以根据一些其他值来比较一列中的组或不同值。

例如,我们可以计算每个地区组的平均房价。我们选择感兴趣的列,并指定用于分组的列。然后,对每个组应用聚合函数。

df[["RegionGroup", "PriceMillion"]].groupby("RegionGroup").mean()

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

(图片由作者提供)

实施例 23

在前面的示例中,我们在应用groupby函数之前选择了 region group 和 price 列。如果我们将 groupby 函数应用于整个数据框,则聚合将应用于所有适当的列。

在计算平均值的情况下,我们将得到所有数值列的平均值。如果只需要对特定列执行聚合,则命名聚合更为实用。

df.groupby("RegionGroup", as_index=False)\
  .agg(avg_price = ("PriceMillion", "mean"))

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

(图片由作者提供)

使用命名聚合的另一个优点是,我们可以为聚合列分配信息性名称。使用“avg_price”作为列名比只使用 price 更有意义。

我们可以使用as_index参数将组放在数据框的一列中,而不是作为索引。

实施例 24

rank函数用于根据列中的值为观察值(即行)分配等级。例如,我们可以根据价格对房屋进行排名。

df["Rank"] = df["Price"].rank(method="first",  
                              ascending=False).astype("int")df[["Price", "Rank"]].head()

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

(图片由作者提供)

默认情况下,这些值按升序排列,但是我们可以使用ascending参数来改变这种行为。

实施例 25

sort_values函数根据给定列中的值对行进行排序。让我们用它来根据价格对房屋进行排序。

df.sort_values(by="Price", ascending=False)[["Price", "Rank"]].head()

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

(图片由作者提供)

我想在排序后显示前 5 行,以确认在前面的例子中分配的等级。

实施例 26

lociloc方法用于选择数据框中的特定行和列。

  • iloc 通过索引工作
  • loc 按标签工作

让我们举几个例子来演示它们是如何使用的。

#rows between 5 and 10 , first 3 columns
df.iloc[5:10, :3]

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

(图片由作者提供)

#rows between 20 and 25, address and price columns
df.loc[20:25, ["Address", "Price"]]

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

(图片由作者提供)

我们使用 loc 和 iloc 方法使用相同的值来选择行,因为默认情况下,行的标签是它们的索引。除非创建自定义索引,否则 loc 和 iloc 对行采用相同的值。

实施例 27

Pandas 不是一个数据可视化库,但它允许创建基本的绘图。它可以方便地快速生成用于数据分析的图表。

让我们通过绘制直方图来看看距离列的分布。

df.Distance.plot(
   kind="hist",
   figsize=(8,5),
   title = "Histogram of Distance"
)

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

(图片由作者提供)

实施例 28

我们也可以画一个显示每日平均价格的线图。我们首先需要根据日期列对行进行分组,然后应用绘图函数。

df.groupby("Date").agg(price = ("Price", "mean")).plot(
   kind="line",
   figsize=(10,5),
   title = "Daily Average Price"
)

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

(图片由作者提供)

实施例 29

探索性数据分析中使用的另一个常用图是散点图。它概述了两个数值变量之间的相关性。

让我们也创建一个价格和距离列的散点图。

df.plot(
   kind="scatter",
   x="Price",
   y="Distance",
   figsize=(8,6)
)

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

(图片由作者提供)

距离和价格是负相关的。这是有道理的,因为离市中心越近,房价越贵。

示例 30

最后一个例子是关于sample函数。在某些情况下,我们从大型数据集中随机抽取样本进行分析。

print(df.shape)
(48433, 12)df_sample = df.sample(frac=0.5)print(df_sample.shape)
(24216, 12)

我们取原始数据帧一半大小的样本。我们可以使用n参数获取一定行数的样本。

df_sample = df.sample(n=30000)print(df_sample.shape)
(30000, 12)

结论

我们做了 30 个例子,涵盖了熊猫常用的功能和方法。他们一定会给你提供相当不错的熊猫知识。

当然,除了这篇文章,还有更多关于熊猫的内容。当你需要的时候,你可以随时学习它们。

感谢您的阅读。如果您有任何反馈,请告诉我。

掌握 SQL 的 30 个例子

原文:https://towardsdatascience.com/30-examples-to-master-sql-c8004705479a?source=collection_archive---------6-----------------------

综合实践教程

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

汤姆·温克尔斯在 Unsplash 上的照片

SQL 是一种编程语言,用于管理关系数据库中以表格形式(即表格)存储的数据。

关系数据库由多个相互关联的表组成。表之间的关系是在共享列的意义上形成的。

有许多不同的关系数据库管理系统(如 MySQL、PostgreSQL、SQL Server)。他们采用的 SQL 语法可能略有不同。然而,差别很小,所以如果你学会了如何使用一个,你可以很容易地切换到另一个。

在本文中,我们将介绍 30 个示例,涵盖了以下 SQL 操作:

  • 创建数据库和表
  • 将数据插入表格
  • 从表中删除数据
  • 更新表格
  • 使用各种 select 语句查询表

在您的机器或云上使用 SQL 有许多替代方法。我目前通过终端在 linux 机器上使用 MySQL。另一个常用的替代方法是安装 MySQL Workbench。

示例 1

我们首先从终端连接到 MySQL 服务器并创建一个数据库。

~$ sudo mysql -u root

系统会提示我们输入密码。我们现在连接到我们机器中的 MySQL 服务器。

以下命令创建一个名为“retail”的数据库。

mysql> create database retail;
mysql> use retail;

我们不在零售数据库中,该数据库还不包含任何表。

示例 2

我们将首先使用 create table 命令创建一个名为“customer”的表。

mysql> create table customer (
    -> cust_id int primary key,
    -> age int,
    -> location varchar(20),
    -> gender varchar(20)
    -> );

我们在括号内定义列名和相关的数据类型。cust_id 列被指定为主键。

主键是唯一标识每行的列。这就像熊猫数据框的索引。

示例 3

我们将创建第二个名为“订单”的表。

mysql> create table orders (
    -> order_id int primary key,
    -> date date,
    -> amount decimal(5,2),
    -> cust_id int,
    -> foreign key (cust_id) references customer(cust_id)
    -> on delete cascade
    -> );

在开始时,我们提到关系表通过共享列相互关联。关联两个表的列是外键。

外键是将一个表与另一个表联系起来的东西。外键包含另一个表的主键。

orders 表中的 cust_id 列是一个外键,它将 orders 表与 customer 表相关联。我们在创建表时指定了这个条件。

在最后一行,我们用“on delete cascade”短语指定了另一个条件。它告诉 MySQL 当 customer 表中的一行被删除时该做什么。orders 表中的每一行都属于一个客户。customer 表中的每一行都包含一个唯一的客户 id,代表一个客户。如果 customer 表中的一行被删除,这意味着我们不再拥有该客户。因此,属于该客户的订单不再有关联的客户 id。“在删除级联时”表示没有关联客户 id 的订单也将被删除。

实例 4

零售数据库现在包含两个表。我们可以使用 show tables 命令查看数据库中的表。

mysql> show tables;+------------------+
| Tables_in_retail |
+------------------+
| customer         |
| orders           |
+------------------+

注意:SQL 中的命令以分号(";"结尾).

实例 5

desc 或 describe 命令根据列名、数据类型和一些附加信息提供了表的概述。

mysql> desc orders;+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| order_id | int(11)      | NO   | PRI | NULL    |       |
| date     | date         | YES  |     | NULL    |       |
| amount   | decimal(5,2) | YES  |     | NULL    |       |
| cust_id  | int(11)      | YES  | MUL | NULL    |       |
+----------+--------------+------+-----+---------+-------+

实例 6

我们可以修改现有的表格。例如,alter table 命令可用于添加新列或删除现有列。

让我们向 orders 表添加一个名为“is_sale”的列。

mysql> alter table orders add is_sale varchar(20);

我们编写列名和数据类型以及 add 关键字。

mysql> desc orders;+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| order_id | int(11)      | NO   | PRI | NULL    |       |
| date     | date         | YES  |     | NULL    |       |
| amount   | decimal(5,2) | YES  |     | NULL    |       |
| cust_id  | int(11)      | YES  | MUL | NULL    |       |
| is_sale  | varchar(20)  | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+

is_sale 列已添加到 orders 表中。

例 7

alter table 还可以用于删除一个列,只需对语法稍作修改。

mysql> alter table orders drop is_sale;

使用 drop 关键字代替 add。我们也不必编写数据类型来删除列。

实施例 8

我们有表格,但它们不包含任何数据。填充表的一种方法是 insert 语句。

mysql> insert into customer values (
    -> 1000, 42, 'Austin', 'female'
    -> );

指定的值以相同的顺序插入到列中。因此,我们需要保持顺序一致。

示例 9

我们可以通过分隔每一行来同时插入多行。

mysql> insert into customer values 
    -> (1001, 34, 'Austin', 'male'),
    -> (1002, 37, 'Houston', 'male'),
    -> (1003, 25, 'Austin', 'female'),
    -> (1004, 28, 'Houston', 'female'),
    -> (1005, 22, 'Dallas', 'male'),
    -> ;

我添加了更多的行,并以同样的方式填充了 orders 表。

用数据填充表还有其他方法。例如,我们可以使用 load data infile 或 load data local infile 语句加载一个 csv 文件。

实例 10

delete from 语句可用于删除表中的现有行。我们需要通过提供一个条件来确定要删除的行。例如,下面的语句将删除订单 id 为 17 的行。

mysql> delete from orders 
    -> where order_id = 17;

如果我们不指定条件,给定表中的所有行都将被删除。

实施例 11

我们还可以更新现有的行。让我们更新 orders 表中的一行。

+----------+------------+--------+---------+
| order_id | date       | amount | cust_id |
+----------+------------+--------+---------+
|        1 | 2020-10-01 |  24.40 |    1001 |
+----------+------------+--------+---------+

这是订单表中的第一行。我们想把订单金额改为 27.40。

mysql> update orders
    -> set amount = 27.40
    -> where order_id = 1; mysql> select * from orders limit 1;
+----------+------------+--------+---------+
| order_id | date       | amount | cust_id |
+----------+------------+--------+---------+
|        1 | 2020-10-01 |  27.40 |    1001 |
+----------+------------+--------+---------+

我们将更新后的值写在 set 关键字之后。通过在 where 关键字后提供条件来标识要更新的行。

实例 12

如果我们想通过复制现有表的结构来创建一个表,我们可以使用带有 like 关键字的 create table 语句。

mysql> create table orders_copy like orders;mysql> show tables;
+------------------+
| Tables_in_retail |
+------------------+
| customer         |
| orders           |
| orders_copy      |
+------------------+

orders_copy 表与 orders 表具有相同的结构,但不包含任何数据。

实施例 13

我们还可以通过同时使用 create table 和 select 语句来创建包含数据的现有表的副本。

mysql> create table new_orders
    -> select * from orders;

这看起来像是两个独立陈述的结合。第一行创建表,第二行用 orders 表中的数据填充该表。

实施例 14

drop table 语句可用于删除数据库中的表。

mysql> drop table orders_copy, new_orders;mysql> show tables;
+------------------+
| Tables_in_retail |
+------------------+
| customer         |
| orders           |
+------------------+

我们已经成功地删除了上一个示例中创建的表。

我们在一个数据库中有两个关系表。以下示例将演示如何使用 select 查询从这些表中检索数据。

实施例 15

最简单的查询是查看表中的所有列。

mysql> select * from orders
    -> limit 3;+----------+------------+--------+---------+
| order_id | date       | amount | cust_id |
+----------+------------+--------+---------+
|        1 | 2020-10-01 |  27.40 |    1001 |
|        2 | 2020-10-01 |  36.20 |    1000 |
|        3 | 2020-10-01 |  65.45 |    1002 |
+----------+------------+--------+---------+

“*”选择所有列,limit 关键字对要显示的行数进行约束。

实施例 16

我们可以通过写列的名称而不是“*”来只选择一些列。

mysql> select order_id, amount 
    -> from orders
    -> limit 3;+----------+--------+
| order_id | amount |
+----------+--------+
|        1 |  27.40 |
|        2 |  36.20 |
|        3 |  65.45 |
+----------+--------+

实例 17

我们可以使用 where 子句为要选择的行指定一个条件。以下查询将返回 2020 年 10 月 1 日的所有订单。

mysql> select * from orders
    -> where date = '2020-10-01';+----------+------------+--------+---------+
| order_id | date       | amount | cust_id |
+----------+------------+--------+---------+
|        1 | 2020-10-01 |  27.40 |    1001 |
|        2 | 2020-10-01 |  36.20 |    1000 |
|        3 | 2020-10-01 |  65.45 |    1002 |
+----------+------------+--------+---------+

实施例 18

where 子句接受多个条件。让我们在前一个示例中的查询上添加另一个条件。

mysql> select * from orders
    -> where date = '2020-10-01' and amount > 50;+----------+------------+--------+---------+
| order_id | date       | amount | cust_id |
+----------+------------+--------+---------+
|        3 | 2020-10-01 |  65.45 |    1002 |
+----------+------------+--------+---------+

实施例 19

我们可能希望对查询结果进行排序,这可以通过使用 order by 子句来完成。

以下查询将返回 2020–10–02 的订单,并根据金额对它们进行排序。

mysql> select * from orders
    -> where date = '2020-10-02'
    -> order by amount;+----------+------------+--------+---------+
| order_id | date       | amount | cust_id |
+----------+------------+--------+---------+
|        5 | 2020-10-02 |  18.80 |    1005 |
|        6 | 2020-10-02 |  21.15 |    1009 |
|        4 | 2020-10-02 |  34.40 |    1001 |
|        7 | 2020-10-02 |  34.40 |    1008 |
|        8 | 2020-10-02 |  41.10 |    1002 |
+----------+------------+--------+---------+

实施例 20

默认情况下,order by 子句按升序对行进行排序。我们可以用 desc 关键字把它改成降序。

mysql> select * from orders
    -> where date = '2020-10-02'
    -> order by amount desc;+----------+------------+--------+---------+
| order_id | date       | amount | cust_id |
+----------+------------+--------+---------+
|        8 | 2020-10-02 |  41.10 |    1002 |
|        4 | 2020-10-02 |  34.40 |    1001 |
|        7 | 2020-10-02 |  34.40 |    1008 |
|        6 | 2020-10-02 |  21.15 |    1009 |
|        5 | 2020-10-02 |  18.80 |    1005 |
+----------+------------+--------+---------+

实施例 21

SQL 是一种通用语言,也可以用作数据分析工具。它提供了许多功能,可以在从数据库查询时分析和转换数据。

例如,我们可以计算 orders 表中唯一天数。

mysql> select count(distinct(date)) as day_count
    -> from orders;+-----------+
| day_count |
+-----------+
|         4 |
+-----------+

orders 表包含 4 个不同日期的订单。“as”关键字用于重命名查询结果中的列。否则,列的名称将是“count(distinct(date))。

实施例 22

订单表中有 4 个不同的日期。我们还可以找出每天有多少订单。group by 子句将帮助我们完成这项任务。

mysql> select date, count(order_id) as order_count
    -> from orders
    -> group by date;+------------+-------------+
| date       | order_count |
+------------+-------------+
| 2020-10-01 |           3 |
| 2020-10-02 |           5 |
| 2020-10-03 |           6 |
| 2020-10-04 |           2 |
+------------+-------------+

我们对订单进行计数,并按日期列进行分组。

实施例 23

我们将计算每天的平均订单金额,并根据平均金额按降序排列结果。

mysql> select date, avg(amount)
    -> from orders
    -> group by date
    -> order by avg(amount) desc;+------------+-------------+
| date       | avg(amount) |
+------------+-------------+
| 2020-10-01 |   43.016667 |
| 2020-10-04 |   42.150000 |
| 2020-10-03 |   37.025000 |
| 2020-10-02 |   29.970000 |
+------------+-------------+

实施例 24

我们希望修改上一个示例中的查询,只包含平均数量高于 30 的天数。

mysql> select date, avg(amount)
    -> from orders
    -> group by date
    -> having avg(amount) > 30
    -> order by avg(amount) desc;+------------+-------------+
| date       | avg(amount) |
+------------+-------------+
| 2020-10-01 |   43.016667 |
| 2020-10-04 |   42.150000 |
| 2020-10-03 |   37.025000 |
+------------+-------------+

需要注意的是,查询中语句的顺序很重要。例如,如果我们将 order by 子句放在 having 子句之前,就会出现错误。

实施例 25

我们想知道每天的最大订购量。

mysql> select date, max(amount)
    -> from orders
    -> group by date;+------------+-------------+
| date       | max(amount) |
+------------+-------------+
| 2020-10-01 |       65.45 |
| 2020-10-02 |       41.10 |
| 2020-10-03 |       80.20 |
| 2020-10-04 |       50.10 |
+------------+-------------+

实施例 26

我们希望在一个 select 语句中组合多个聚合函数。为了证明这一点,让我们详细说明前面的例子。我们希望看到每个客户的最大订单和最小订单之间的差异。我们还希望按照升序对结果进行排序,并显示前三个结果。

mysql> select cust_id, max(amount) - min(amount) as dif
    -> from orders
    -> group by cust_id
    -> order by dif desc
    -> limit 3;+---------+-------+
| cust_id | dif   |
+---------+-------+
|    1007 | 46.00 |
|    1009 | 28.95 |
|    1002 | 24.35 |
+---------+-------+

dif 栏是从最大金额中减去最小金额得到的。

实施例 27

我们现在切换到客户表。让我们找出我们在每个城市有多少女性和男性顾客。我们需要在 group by 子句中写入位置和性别列。

mysql> select location, gender, count(cust_id)
    -> from customer
    -> group by location, gender;+----------+--------+----------------+
| location | gender | count(cust_id) |
+----------+--------+----------------+
| Austin   | female |              2 |
| Austin   | male   |              1 |
| Dallas   | female |              2 |
| Dallas   | male   |              2 |
| Houston  | female |              2 |
| Houston  | male   |              1 |
+----------+--------+----------------+

实施例 28

customer 和 orders 表基于 cust_id 列相互关联。我们可以使用 SQL 连接查询两个表中的数据。

我们希望在客户表中看到每个城市的平均订单量。

mysql> select customer.location, avg(orders.amount) as avg
    -> from customer
    -> join orders
    -> on customer.cust_id = orders.cust_id
    -> group by customer.location;+----------+-----------+
| location | avg       |
+----------+-----------+
| Austin   | 33.333333 |
| Dallas   | 34.591667 |
| Houston  | 44.450000 |
+----------+-----------+

因为我们从两个不同的表中选择列,所以列名由关联的表名指定。上述查询的第二、第三和第四行根据每个表中的 cust_id 列连接 customer 和 orders 表。

请注意,列名不必相同。无论我们用“on”关键字提供什么列名,比较或匹配都是基于这些列进行的。

实施例 29

我们希望看到 2020 年 10 月 3 日有订单的客户的平均年龄。

mysql> select avg(c.age) as avg_age
    -> from customer c
    -> join orders o
    -> on c.cust_id = o.cust_id
    -> where o.date = '2020-10-03';+---------+
| avg_age |
+---------+
| 30.0000 |
+---------+

我们也可以为表名使用别名。当我们需要多次输入表名时,这很方便。

示例 30

我们希望看到订单量最高的客户的位置。

mysql> select c.location, o.amount
    -> from customer c
    -> join orders o
    -> on c.cust_id = o.cust_id
    -> where o.amount = (select max(amount) from orders)
    -> ;+----------+--------+
| location | amount |
+----------+--------+
| Dallas   |  80.20 |
+----------+--------+

我们在这个查询中有一个嵌套的 select 语句。使用 orders 表中单独的 select 语句计算金额条件。

这项任务可以用不同的方式来完成。我选择了这种方法来引入嵌套查询的概念。

结论

我相信本文中的 30 个例子全面介绍了 SQL。我们讨论了以下主题:

  • 用关系表创建数据库
  • 修改表格
  • 将数据插入表格
  • 从表中删除数据
  • 编写查询以从表中检索数据

当然,使用 SQL 可以完成更高级的查询和操作。一旦你熟练掌握了基础知识,最好是继续学习更高级的操作。

感谢您的阅读。如果您有任何反馈,请告诉我。

数据科学家的 30 个概率和统计面试问题

原文:https://towardsdatascience.com/30-probability-and-statistics-interview-questions-for-data-scientists-7524622801a3?source=collection_archive---------5-----------------------

30 个概率和统计面试问题,可以帮助你提高技能,赢得数据科学面试

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

作者在 Canva 上创建的图片

在数据科学面试中,关于统计或概率概念的问题可能很难处理。这是因为与产品问题不同,统计和概率问题有明确的正确或错误答案。这意味着你关于具体统计和概率概念的知识将在面试中得到充分的检验。因此,在数据科学面试之前,有必要温习一下你的统计学知识,做好充分的准备。

在这篇文章中,我们将通过提供来自不同公司的三十个相关面试问题以及解决方案来帮助你提高你的统计和概率技能。

请注意,在本文中,我们将只讨论面试问题及其解决方案。理论上的概念只简单解释一下。如果你想更新你关于统计和概率的理论知识,你可能想在这里查看我们的统计和概率问题终极指南

所以,让我们直截了当地开始吧。

概率面试问题

在数据科学面试中,至少有三个常见的大概率话题:

  1. 独立和从属事件
  2. 排列和组合
  3. 概率分布

我们将逐一讨论这三个主题。先说独立事件和从属事件。

独立和从属事件

在概率上,如果一个事件发生的概率不影响另一个事件发生的概率,那么这个事件可以说是一个独立事件。

独立事件最常见的例子是投掷两个不同的骰子或多次投掷一枚硬币。当我们掷硬币时,我们在第二次投掷中得到一条尾巴的概率不会受到第一次投掷结果的影响。我们得到尾巴的概率永远是 0.5。

同时,如果一个事件发生的概率影响另一个事件发生的概率,则该事件可以被称为从属事件。

从属事件的一个例子是从一副牌中抽牌。假设我们想知道从一副牌中得到红心的概率。如果你之前没有抽过牌,那么你得到红心的概率是 13/52。假设你在第一次听牌中拿到了一张黑桃。那么,你在第二次抽牌中得到红心的概率就不再是 13/52,而是 13/51,因为你从这副牌中抽了一张牌。

以下是来自不同公司的数据科学面试问题的示例,这些问题将在独立和非独立事件中测试我们的知识:

来自脸书的问题:

“从同一副牌中抽出两张有相同花色的牌的概率是多少?”

这是从属事件的一个例子。在相关事件的情况下,两个事件发生的概率可以定义为:

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

这意味着事件 A 和事件 B 同时发生的概率等于事件 A 发生的概率乘以事件 B 发生的概率,给出事件 A 的结果。

在我们的例子中,一副牌中有四个花色,每个花色有 13 张牌。

在第一次抽牌中,我们拿到特定花色牌的概率是 13/52。在第二次抽牌时,我们得到与第一次相同套房的牌的概率不再是 13/52,而是 12/51。因此:

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

来自简街的问题:

“从一副牌中选出 2 张皇后的概率是多少?”

这也是从属事件的一个例子。第一次抽牌,我们拿到皇后的概率是 4/52。如果我们在第一次抽牌中得到一个皇后,那么我们在第二次抽牌中得到另一个皇后的概率是 3/51。因此:

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

来自脸书的问题:

假设你有两个骰子。至少得一个 4 的概率有多大?”

与前面的问题不同,这个问题是独立事件的一个例子,因为投掷一个骰子的结果不会对投掷第二个骰子的结果产生任何影响。

假设:

A =在第一次骰子中得到 4
B=在第二次骰子中得到 4

独立事件 AB 都发生的概率可以定义为:

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

并且得到至少一个 4 的概率可以用两个事件合并的概率来计算:

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

我们知道掷骰子得到任何特定结果的概率是⅙.因此,

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

来自脸书的问题:

三只蚂蚁坐在一个等边三角形的三个角上。每只蚂蚁随机选择一个方向,开始沿着三角形的边移动。没有蚂蚁相撞的概率是多少?”

虽然这是隐含的,但这是独立事件的情况。每只蚂蚁可以随机选择方向,要么向左,要么向右。一只蚂蚁向左走的决定不会影响另外两只蚂蚁向左还是向右走的决定。

既然决策是随机的,那么蚂蚁挑某个方向的概率就是 0.5。如果三只蚂蚁都向左走或都向右走,它们就不会相撞。

因此:

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

排列和组合

排列和组合可能听起来相似,我们可能在现实生活中互换使用这两个词。然而,它们在概念上有明显的区别,知道如何区分组合和排列是很重要的,因为它们有不同的公式。

排列和组合的一大区别是顺序的重要性。顺序在排列中很重要,但在组合中不重要。这个顺序的概念会在下面的数据科学面试问题的例子中有更深入的解释。

来自 Kabbage 的问题:

“如何在一个 200 人的小组里发现谁在论文写作上作弊?”

我们有不同的方法可以发现谁在考试中作弊。一种方法是逐个比较一对学生考试。

如果我们想一想,将学生 A 的考试与学生 B 的考试进行比较,与将学生 B 的考试与学生 A 的考试进行比较是一样的。换句话说, AB***=***BA 。顺序不重要。

既然顺序不重要,那么我们就可以用组合的概念。组合的一般方程式是:

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

其中 n 是项目总数, k 是要订购的项目总数。

由于有 200 名学生,并且有两次考试要进行比较,因此我们有:

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

来自 IBM的问题:

“从一副编号从 1 到 100 的牌中,我们随机抽取两张牌。其中一张卡上的数字恰好是第二张卡上数字的两倍的概率是多少?”

这个问题也可以用组合的概念来回答。这是因为当我们从同一副牌中抽出两张牌时,顺序并不重要。这意味着,如果我们在第一次抽牌中得到 10 号牌,在第二次抽牌中得到 40 号牌,这与我们在第一次抽牌中得到 40 号牌,在第二次抽牌中得到 10 号牌是一样的。

因此,通过将问题中已知的值代入组合方程,我们将得到:

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

这意味着我们有 4950 个组合对。

在这 4950 种组合中,一张卡是另一张卡的两倍的可能性是 50,因为我们总共有 100 张卡。因此,我们可以将概率计算为:

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

来自峰值 6 的问题:

三个人,在一场比赛中获得第一、第二和第三名,有多少种不同的组合

在这个问题中,顺序实际上很重要,因为处于第一位置与处于第二或第三位置是不同的。

这意味着,如果我们有运动员 A、B、C 和位置 1、2、3,那么组成 ABC 不同于*, BA 也不是 B 因此,我们在这个问题中处理排列的概念。*

排列问题的一般方程是:

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

其中 n 是项目总数, k 是要订购的项目总数。

在问题中,我们有三名运动员和三个位置需要排序,因此:

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

概率分布

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

作者创造的形象

在你去参加数据科学面试之前,关于概率分布的知识是必须的。关于概率分布的问题是最受欢迎的数据科学面试问题之一。

下面是一个测试你对概率分布的一般知识的面试问题:

来自 IBM的问题:

“非高斯分布的数据集示例是什么?”

我们可以通过提供一个二项式分布数据的例子来回答这个问题,例如,你掷 1000 次硬币得到 500 个反面的频率,我们掷 10 次骰子得到 2 个 5 的频率,等等。

问题是,如果你一开始就不知道概率分布,你就无法回答这个问题。更糟糕的是,有很多不同的概率分布。那么我们需要知道所有的概率分布吗?

当然不是。

在所有概率分布中,二项式分布、均匀分布和高斯分布是数据科学面试中最常见的。如果你是概率分布的新手,你可以先从这三个开始,然后再扩展到其他的概率分布。

在数据科学面试中,通常会问两类与概率分布相关的问题:要么要求你计算分布的概率质量函数(PMF) /概率密度函数(PDF),要么要求你计算分布的期望值。

先说二项分布。

二项分布

二项式分布是离散概率分布的一种,它衡量某一事件在一定次数的试验中成功的概率。

二项分布的概率质量函数(PMF)如下:

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

其中 n 是试验次数, k 是成功次数。同时,二项分布的期望值可以计算如下:

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

以下是各公司的数据科学面试问题示例,涵盖了二项分布的概念。

来自威瑞森无线的问题:

“掷骰子 7 次得到 1 个 5 的概率有多大?”

这个问题可以通过简单地将数值代入二项式分布方程来回答。我们可以认为成功的次数是 1(因为我们看到的是 1/5),而试验的次数是 7。同时,我们都知道,一掷中得 5 分的概率是⅙.因此:

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

来自简街的问题:

“掷 5 次硬币获得 2 条尾巴的概率有多大?”

与前一个问题相同,这可以通过简单地将数值代入二项式分布的 PMF 方程来回答。在这种情况下,成功的次数是 2,因为我们要获得 2 条尾巴,而试验的总次数是 5。在每一次公平的掷硬币中得到一条尾巴的概率是 0.5。因此:

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

来自 Lyft 的问题:

“给 N 个骑手一张打折券。使用优惠券的概率是 p,其中一张优惠券被使用的概率是多少?”

同样,这个问题也可以通过将数值代入二项式分布的 PMF 方程来回答。

从题中我们可以说成功次数为 1(因为只会使用一张券)物品数为 N ,而单次试吃成功的概率为 P

因此,

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

Lyft 提出的问题:

“给 N 个骑手一张 5 美元的折扣券。使用息票的概率是 p,公司的预期成本是多少?”

与上一个问题不同,现在我们需要用二项分布计算变量的期望值,而不是计算 PMF。我们可以通过将这些值代入二项分布的期望值方程来回答这个问题。

根据上面的等式,我们有 N 优惠券,使用优惠券的概率是 P

因此,预期值将是:

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

预期成本是:

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

来自脸书的问题:

“我们有两个在新闻提要中投放广告的选项:
1。每 25 个故事中,就有一个是广告。每个故事都有 4%的几率成为广告。
对于每个选项,100 篇新闻报道中显示的广告的预期数量是多少?如果我们选择第二种方式,在 100 个故事中,用户只看到一个广告的可能性有多大?”

这个问题测试你对二项分布的期望值和 PMF 的知识。

第一个问题是,100 个新闻故事中显示的广告的预期数量,该问题是:

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

同时,第二个问题可以用二项式分布的 PMF 来回答,其中试验总次数为 100,成功总次数为 1(只有单个广告),每个故事有 0.04 的概率成为广告。

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

均匀分布

根据使用情况,均匀分布可以分为离散和连续概率分布。它衡量一个事件有 n 个可能结果的概率,其中每个 n 发生的可能性相等。正因为如此,它有一个平面的 PMF/PDF。

均匀分布的常见例子是投掷骰子。我们从六面骰子中得到任何一面的概率总是⅙.

离散均匀分布的期望值为:

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

其中 a 是最小可能结果, b 是最大结果。例如,当我们掷出 6 面骰子时,最小可能结果是 1,最大可能结果是 6。

以下是测试您对均匀分布的了解的数据科学面试问题示例。

来自简街的问题:

“掷骰子的期望值是多少?”

通过将这些值代入均匀分布的期望值公式,我们可以很容易地解决这个问题,如下所示:

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

来自沃尔玛的问题:

“假设你掷骰子,得到你想要的任何一张脸。现在假设你有机会掷出第二个骰子。如果你掷骰子,你将赢得你得到的任何牌面,但你将失去第一轮的收入。第二遍应该什么时候滚?”

这个问题在某种程度上是上一个问题的延伸。从上一个问题中您已经知道,一个 6 面骰子的期望值是:

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

要回答这个问题,我们需要这样想:

如果我们在第一次掷骰中得到超过 3.5(单次掷骰的期望值),那么我们就不应该掷出第二次骰子并保留收益。同时,如果我们得到的少于 3.5,那么我们应该掷出第二个骰子。

来自 PayPal 的问题:

“从一个均匀分布中抽取一个 1 到 N 之间的数并乘以它本身,或者从一个均匀分布中抽取两个 1 到 N 之间的数并乘以它们,哪个具有更大的期望值?”

这个问题可以解释为这两个中的任何一个:

第一种解读:取一个样本,将样本本身相乘,然后计算我们乘以样本后的期望值。

要回答这个问题,我们需要知道均匀分布变量的一般方差方程:

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

  • 对于第一种情况,我们采样 1 到 N 之间的一个数,姑且称之为 X 。如果我们将这个 X 乘以自身,那么我们得到 X 并且它的期望值将是 E(X )
  • 对于第二种情况,我们对 1 到 N 之间的两个数字进行独立采样,因此这两个数字相乘后的期望值将是**【X】E(X)= E(X)**。

如果我们看上面的方差方程,我们知道方差的值应该总是正的。为了满足这个条件,那么**【X】**必须大于 E(X) 。因此,对 1 和 N 之间的一个数进行采样并乘以其自身的期望值总是较大。

第二种解释:取一个样本,计算该样本的期望值,然后将该期望值乘以自身。

  • 对于第一种情况,我们首先从一个均匀分布中抽取一个介于 1 和**【N】之间的数,然后我们将该数的期望值乘以自身,因此我们得到【E(X)**
  • 对于第二种情况,我们对两个独立的数字进行采样,并将它们的期望值相乘,因此我们得到 E(X) E(X) = E(X)

因此,我们可以得出结论,这两种方法产生了相似的期望值。

高斯分布

高斯分布或正态分布是一种钟形曲线,其特征在于两个参数:平均值和标准差。

关于正态分布的面试问题通常与推断统计学范围内的其他主题相关联,例如如何推断 p 值、样本大小、误差范围、置信区间和假设检验。

你可以在下一节看到这些面试问题的例子。

统计学面试问题

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

作者在 Canva 上创建的图像

在数据科学访谈中,至少有三个大的统计学主题是经常被问到的,它们是:

  1. 中心和价差的度量(平均值、方差、标准差)
  2. 推论统计
  3. 贝叶斯定理

先讨论一下中心和扩散的度量。

还有,查看我们的 综合统计小抄 了解统计和概率的重要术语和方程。

均值、方差、标准差

中心度量(均值、中值、众数)和分布度量(方差、标准差)的概念是您在深入研究统计学之前应该掌握的首要概念。

这就是为什么关于这些概念的问题在数据科学面试中非常受欢迎。公司想知道你有没有统计学的基础知识。下面是一个询问这些概念的例子。

来自脸书的问题:

“在墨西哥,如果取平均值和年龄中位数,哪个会高,为什么?”

这个问题测试你对中心度量概念的了解。为了找出平均值和中间值之间哪个会更高,我们需要找出墨西哥的年龄分布。

根据统计数据,墨西哥的年龄分布呈右偏分布。如果你看下图,右偏分布的平均值比中位数高。

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

作者创造的形象

因此,墨西哥的平均年龄高于中位年龄。

来自微软的问题:

“方差的定义是什么?”

顾名思义,方差衡量数据集的数据点相对于其平均值的分布。下面是方差的一般等式:

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

其中 S 为方差, x 为样本, x 条 为样本均值, n 为样本总数。

推断统计学

推断统计是数据科学面试中非常受欢迎的话题。这是因为通过在这个话题中问一个问题,公司可以在从数据中得出一些见解时衡量你的思维过程。

推断统计有不同的步骤和术语,如假设检验、置信区间、p 值、误差幅度和样本大小。

先说几个关于 p 值的例题。

p 值

来自亚马逊的问题:

“你如何向工程师解释如何解释 p 值?”

国营农场的问题:

“什么是 p 值?如果您有一个不同的(大得多,例如 300 万条记录),您对 p 值的解释会改变吗?)数据集?”

p 值代表统计领域的概率值,通常用于假设检验。p 值描述了假设你的零假设为真,你刚刚观察到的数据有多不可能。

通常,我们在假设检验之前设定一个显著性水平。如果 p 值低于我们的显著性水平,那么我们拒绝零假设。同时,如果 p 值高于显著性水平,那么我们用我们的零假设。

如果数据集越来越大,对 p 值的解释不会改变,但更大的数据集意味着我们的 p 值结果更可靠、更可靠。

置信区间、样本量和误差幅度

由于置信区间、样本大小和误差幅度之间的关系,它们的概念通常会一起出现,正如您将在以下置信区间等式中看到的:

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

上式中, X_bar 为样本均值, Z 为置信值, σ 为样本标准差, n 为样本量。

同时,误差范围可以定义为:

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

从上面可以看出,置信区间、误差幅度和样本大小值之间存在关系。这就是为什么这些术语之间的问题紧密联系在一起。

现在我们来看看谈论这些概念的面试问题。

来自谷歌的问题:

“对于样本量 n,误差幅度为 3。我们还需要多少样本才能将误差幅度降至 0.3?”

这个问题可以通过简单地将数值代入上面的误差范围公式来回答。

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

这意味着我们需要比初始样本量多 100 倍的样本,才能将误差幅度降至 0.3。

来自脸书的问题:

“假设脸书人口点击广告的点击率为 P。我们选择一个大小为 N 的样本,并检查样本的转化率,用 hat{P}表示,使概率(ABS(hat{P} — P) < DELTA ) = 95%的最小样本大小 N 是多少?换句话说,找到最小样本量 N,使得我们的样本估计值{P}在真实点击率 P 的增量内,置信度为 95%。”

这个问题测试我们关于置信区间、误差范围、样本大小和二项分布的知识。问题中的转换率遵循二项分布,这意味着我们需要用二项分布的方差平方根来估计标准差。**

二项式分布方差的一般公式为:

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

从这个问题中,我们知道我们有一个 95%的置信区间,这意味着 Z 值等于 1.96(参见 Z 表以获得该值)。将该方程代入方程误差范围,我们得到:

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

来自特斯拉的问题:

“有 100 种产品,其中 25 种是坏的。置信区间是多少?”

和上一个问题一样,这个问题也测试我们关于置信区间、误差范围、样本大小和二项分布的知识。

问题中陈述的问题遵循二项分布,所以我们需要从二项分布的期望值和二项分布的方差的标准差来计算样本均值。

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

一旦我们从二项式分布公式中计算出平均值和标准偏差,那么我们就可以将这些值代入置信区间的等式中来找出答案。

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

假设检验

关于假设检验的面试问题通常以用例的形式出现。公司会给你一个关于他们产品的具体用例,他们会问你如何知道一种产品在市场上是否比另一种产品表现得更好。下面是这样的例子:

来自脸书的问题:

“我们有一种产品被两个不同的群体以不同的方式使用。
1。你的假设是什么?
2。你将如何着手检验你的假设?”

这个问题测试我们在进行假设检验时应该采取的不同步骤的知识。

下面是我们应该如何进行假设检验的分步示例:

  • 阐明我们的零假设和替代假设
  • 选择重要性级别。显著性水平可以根据我们的用例而变化。但是,我们可以选择默认值 0.05。
  • 根据我们的数据计算样本平均值和样本标准误差。
  • 计算与您的用例相对应的 t 统计,无论是配对 t 检验、总体均值的单样本 t 检验、双样本 t 检验、方差分析还是卡方检验。
  • 如果结果检验的 p 值低于我们的显著性值,那么我们拒绝我们的零假设,支持另一个假设。同时,如果得到的 p 值高于显著性值,那么我们采用零假设。

来自亚马逊的问题:

“在 A/B 测试中,你如何检查对不同存储桶的分配是否真的是随机的?”

如果桶真的是随机分配的,那么在统计学方面,我们不会注意到每个桶中的变量样本之间有任何显著的差异。但是我们如何知道桶之间的样本差异是否显著呢?

我们可以用统计测试来衡量这一点。

如果我们观察的变量是连续变量,并且只有一种处理,我们可以使用双样本 t 检验。同时,如果有多种治疗方法,那么我们可以使用方差分析。

在进行统计测试后,我们将得到一个 p 值,我们可以使用这个 p 值来推断桶之间是否存在显著差异。

贝叶斯定理

贝叶斯定理也是数据科学面试问题中经常被问到的。这种统计方法与我们在上面的推理统计部分看到的频率统计方法不同。事实上,一些公司可能会问你贝叶斯统计和频率统计的区别如下:

来自 Yelp 的问题:

“贝叶斯统计和频率统计的区别是什么?”

这两者的主要区别在于:

  • 在频率统计中,推论被解释为长期频率。这意味着,如果我们重复试验无限次,我们要测量每次试验的平均值在总体的 95%置信区间内的次数。
  • 在贝叶斯统计中,该过程被解释为一种主观信念。最后,我们的目标是基于数据的证据更新你的信念。

贝叶斯推理与我们人类如何进行推理有着相同的类比。一开始,我们总是对某事发生的可能性有一定程度的信心。然后,随着我们看到越来越多的证据,我们的信念也会更新。

贝叶斯法则中有四个基本术语:先验、后验、似然和边际,正如你从下面的等式中看到的。

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

下面是一些数据科学面试问题的例子,测试我们关于贝叶斯定理的知识。

来自脸书的问题:

“你即将登上去西雅图的飞机。你想知道你是否应该带一把伞。你打电话给住在那里的三个朋友,分别问他们是否在下雨。你的每个朋友都有 2/3 的机会对你说真话,1/3 的机会用谎言来搞乱你。三个朋友都告诉你“是的”下雨了。西雅图真的下雨的概率有多大?”

要回答这个问题,你需要对西雅图下雨的概率做一个假设。假设是 0.5。

我们的每个朋友都有⅔说出真相的机会,所以如果我们的朋友说西雅图会下雨,那么西雅图下雨的概率就是⅔.同样,假设我们的朋友说西雅图不会下雨,那么不下雨的概率也是⅔.

**基于此,我们来定义一个事件如下:

  • A =西雅图下雨
    -A’=西雅图没下雨
  • Xi =服从伯努利分布的随机变量,其中这个变量的值代表我们朋友的答案:下雨(1)或不下雨(0)**

因此,假设我们的朋友用贝叶斯定理说西雅图会下雨,我们就可以估算出它下雨的概率。

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

来自脸书的问题:

“你从 100 个硬币中随机抽取一个硬币——1 个不公平硬币(正面朝上),99 个公平硬币(正面朝下),然后掷 10 次。如果结果是 10 个头,硬币不公平的概率是多少?”

要回答这个问题,我们需要定义一个事件:
A =硬币不公平
A’=硬币公平
B =随机掷硬币 10 次的结果是 10 个头。

定义上述事件后,我们可以将这些值代入贝叶斯方程,如下所示:

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

来自 Zenefits 的问题:

“1 号瓮中有 30 颗红色弹珠和 10 颗黑色弹珠。你在 2 号瓮中有 20 颗红色和 20 颗黑色弹珠。你从随机骨灰盒中取出一个弹球,发现它是红色的。它从 1 号瓮中取出的概率是多少?”

我们可以用与上一个问题相同的方法来回答这个问题,首先定义一个事件:

A =弹珠从# 1
A’=弹珠从#2
B =弹珠是红色的

现在,在我们定义了上述事件之后,我们可以将这些值代入贝叶斯定理方程,如下所示:

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

Lyft 的问题:

“给 2 个骑手一张折扣券。使用优惠券的概率是 p,假设他们中至少有一个人使用优惠券,那么两个骑手都使用优惠券的概率是多少?”

这个问题测试你关于两个概念的知识:贝叶斯定理和二项分布。

利用二项式分布的 PMF,恰好有一名乘客使用优惠券的概率可以计算如下。

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

他们使用优惠券的概率也可以用二项分布的 PMF 来计算。

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

至少一个优惠券被使用的概率是互斥事件的例子,这意味着:

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

接下来,像往常一样,我们需要定义一个事件,让我们更容易理解贝叶斯定理方程中的每一项代表什么。

A =至少一名乘客使用优惠券
B =两名乘客都使用优惠券

现在,我们可以将这些值代入贝叶斯定理方程,如下所示:

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

这是所有 30 个来自不同公司的概率统计面试问题。我们希望这些问题可以帮助您提高技能,在数据科学面试中胜出。请记住,解决统计和概率面试问题的能力不会来自一次静坐,而是来自你通过持续学习养成的习惯。

原载于https://www.stratascratch.com/blog/30-probability-and-statistics-interview-questions-for-data-scientists/?utm_source=blog&utm_medium=click&utm_campaign=medium。****

您下一个数据科学项目的 31 个数据集

原文:https://towardsdatascience.com/31-datasets-for-your-next-data-science-project-6ef9a6f8cac6?source=collection_archive---------7-----------------------

基于任务的数据集的汇编,可用于构建下一个数据科学项目

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

内森·麦克布赖德在 Unsplash 上的照片

浏览 Kaggle 上的数据集,我总是发现很难找到一个数据集来尝试我最近学到的一个新的机器学习概念。每天都有新的数据集发布在这些流行的网站上,为新项目寻找合适的数据集的努力很快变得势不可挡。

带着这种想法,因为我在互联网上找不到一个合适的基于任务的编译列表,我决定自己制作另一个列表——实际上是一个主列表,当我需要选择一个数据集来练习新获得的技能时,我总是会回来。希望这对你也有好处!

如果你想阅读我几个月前发表的这个列表的旧版本, 你可以在这里阅读。

这篇文章是关于什么和不是关于什么

在我们进入列表之前,我想澄清一件事*。让这篇文章成为一个参考,让你考虑尝试一个新的算法数据集,你学习并想实验*

然而,请不要认为这是机器学习任务数据集的详尽列表——我或任何人都不可能查看每个网站上的每个单个数据集。

好了,现在我们已经完成了,让我们继续列表。😃

数据集列表

我将尽可能多地涵盖我所能想到的基于机器学习/深度学习的任务及其应用的相关数据集,我还将从更新这篇文章(这是数据集文章的第二次迭代)。所以,如果你愿意的话,也可以考虑用书签来保护它。

我加入了我在整个数据科学之旅中使用的数据集,包括我个人最喜欢的数据集,以及一些我希望在未来尝试的数据集。

一般分类问题

  1. 校园招聘——根据学生的教育程度、成绩等各种特征来决定他们是否被公司录用。
  2. 澳大利亚 1989 年至 2021 年致命道路事故 —这是一个相当新的数据集,你需要从关于车祸的各种可用特征中对车祸类型进行分类,例如车祸的时间和日期、车速等。
  3. 心脏病 UCI——基于个体的一组 76 个不同的生理属性来预测患者是否存在心脏病。
  4. 名人面孔属性(CelebA)数据集——这是一个流行的数据集,使用超过 20 万张名人图像,并使用计算机视觉概念来实现面部识别。

回归数据集

  1. 波士顿房价 —一个展示你回归能力的经典数据集,也是我的数据集主列表的第一部分中推荐的。
  2. 特斯拉数据集——一个面向所有特斯拉粉丝以及那些喜欢涉足错综复杂的金融行业的人的股票价格数据集。
  3. 世卫组织预期寿命——也是一个试验你的 EDA 技能的好机会。
  4. 红酒质量 —使用葡萄酒属性(如固定酸度、氯化物、柑橘含量等)预测葡萄酒质量的数据集。这是一个有趣的数据集,如果你已经熟悉了一点回归,并在上面的数据集 1 上练习过,我建议你尝试一下。

推荐系统

  1. 来自 IMDb 的热门电影——经典的众包电影信息数据库,在里面你需要预测哪部电影值得推荐。
  2. Goodreads Books —通过众多专栏提供关于图书的详细信息,用于构建图书推荐引擎。这是我个人最喜欢的,让我从实际尝试推荐任务中获得乐趣。
  3. 网飞数据 —收集到 2019 年的电影和电视节目细节,也是对现实世界应用程序的一些实际曝光。
  4. 子编辑推荐器 —这是我最近最喜欢的一个,有了这个数据集,你需要考虑每个用户在子编辑中的评论,然后预测一些新的子编辑推荐给他们。如果你厌倦了所有重复的电影数据集,我会说一定要试试这个!

时间序列分析

  1. 电子商务销售 —用于预测商店的销售/交易。经典的时间序列预测工作。
  2. 房产销售——如果你刚刚开始时间序列分析,我肯定会推荐这本书。
  3. 每日最低气温-该数据集描述了澳大利亚墨尔本市 10 年来的每日最低气温。
  4. 微软股票 —另一个供你试验的股票数据集,这个数据集希望你根据五到六年的历史数据预测微软的股票价格。
  5. 家庭电力消耗 —以一分钟的采样率测量一个家庭 4 年内的电力消耗。

文本摘要数据集

  1. CNN-DailyMail News —一个从文本摘要开始的奇妙数据集。你需要总结 30 万条 CNN 记者写的独特新闻。你可以为他们做提取和抽象的总结。
  2. 维基百科数据集——另一个总结你可能经常在网上找到的维基百科指南文章的好工具。
  3. 一个 rxiv 数据集—arxiv 研究论文的集合,用于构建文本生成、抽象摘要和问题回答系统。

文本问答系统

  1. 新冠肺炎开放研究挑战赛 —拥有大量 Covid 研究文章的全文,这是一个很好的数据集,可以从文本摘要、语义搜索和问答系统开始。如果你也设法围绕它开发了一个网络应用,这将是一个非常好的简历。
  2. 斯坦福问答数据集——这是一个经典的数据集,基于对一组维基百科文章上的群众工作者提出的问题的阅读理解。

用于 NLP 任务的其他大规模文本数据集

  1. 亚马逊评论(Amazon Reviews)——一个用于情感分析任务的经典数据集。有点过度使用,是的,但不可否认的是,如果你刚开始,这是一个伟大的经典。
  2. StackOverflow 标签和问题它拥有来自 StackOverflow 的 60k 个问题,可以预测问题的标签,并根据分数将问题分类为高质量或低质量。
  3. 新闻标题 —这是另一个经典数据集,你可以用它建立一个模型来检测新闻标题中的讽刺,这是一个二元分类任务。
  4. WikiBooks 数据集 —这个数据集由 12 种语言的所有 WikiBooks 的完整内容集组成。您可以使用它在笔记本中创建一个交互式知识库。

多用途数据集——用于尝试任何大或小的算法

  1. ka ggle Titanic Survival Competition—用于尝试各种基础+高级 ML 算法进行二分类的数据集,也尝试执行广泛的特征工程
  2. 时尚 MNIST —一个数据集,用于基于不同类别(如服装、鞋子、手袋等)执行多类图像分类任务。
  3. 信用卡审批 —信用评分好坏的二元分类任务,如果人们可能是拖欠信用卡贷款的风险。
  4. 石头剪刀布s——图像分类为那三类。
  5. 基于客户行为的贷款预测 —根据客户档案中的众多财务属性,在批准客户贷款时对风险标志进行二元分类。

最后几句话

在推荐这些数据集时,我试图尽可能包含更多的多样性。在制作这个列表时,我还试图将 Kaggle 数据集的可用性因素牢记在心,这样你就可以愉快地阅读它们,并有希望选择在你的项目中使用它们。

暂时就这样了。我会回来再次更新这个列表,因为我会遇到并尝试更多的数据集。

想从我这里读到更多就加入 Medium。它支持我的写作,对我来说意味着整个世界!

快乐学习!😃

您可能会感兴趣的另一个相关内容是:

人人都爱忽视的 35 条软件开发法则

原文:https://towardsdatascience.com/35-software-development-laws-everyone-loves-to-ignore-5ebba515852d?source=collection_archive---------9-----------------------

与 IT 相关的原则、格言和其他智慧的集合…

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

作者图片

软件开发是由范例和原则组织起来的终极学科,这些范例和原则不仅与编码实践和标准相关联,还与人类心理学的基本方面相关联,关注于实现平衡的软件开发过程。尽管我们将它们命名为与科学定律同名的定律,但它们是已经被证明是真实的观察结果,它们讽刺的本质使它们令人难忘——T2 墨菲定律是一个众所周知的例子,但还有很多这样的定律。

在这篇文章中,我根据我迄今为止的职业生涯,整理了一些我最感兴趣的。

论技术

“我们倾向于高估一项技术的短期效果,而低估其长期效果”
ℝ𝕠𝕪 𝔸𝕞𝕒𝕣𝕒

*“任何足够先进的技术都无法与魔法区分开来”
——*ℂ𝕝𝕒𝕣𝕜𝕖’𝕤𝕋𝕙𝕚𝕣𝕕𝕃𝕒𝕨

“机构会努力保存它们所解决的问题”
— ℂ𝕝𝕒𝕪 𝕊𝕙𝕚𝕣𝕜𝕪

“这个行业很奇怪:我们不仅没有从错误中吸取教训,也没有从成功中吸取教训”
——𝕂𝕖𝕚𝕥𝕙𝔹𝕣𝕒𝕚𝕥𝕙𝕨𝕒𝕚𝕥𝕖

关于编程

“提高资源使用的效率,就提高了该资源的使用率”
— 𝕁𝕖𝕧𝕠𝕟’𝕤 ℙ𝕒𝕣𝕒𝕕𝕠𝕩

“如果你把一堆乱七八糟的东西自动化,你就会得到一堆自动化的乱七八糟的东西”
——ℝ𝕠𝕕𝕄𝕚𝕔𝕙𝕒𝕖𝕝

“一个好的程序员总是在穿过单行道之前先看两边”
——𝔻𝕠𝕦𝕘𝕃𝕚𝕟𝕕𝕖𝕣

“任何你自己的代码,如果你已经有六个月或者更长时间没有看,那也可能是别人写的”
——𝔼𝕒𝕘𝕝𝕖𝕤𝕠𝕟’𝕤𝕃𝕒𝕨

“一个人的蹩脚软件是另一个人的全职工作”
— 𝕁𝕖𝕤𝕤𝕚𝕔𝕒 𝔾𝕒𝕤𝕥𝕠𝕟

关于编写无错误代码

“最便宜、最快、最可靠的组件是那些不存在的”
— 𝔾𝕠𝕣𝕕𝕠𝕟 𝔹𝕖𝕝𝕝

“如果调试是清除软件 bug 的过程,那么编程一定是把 bug 放进去的过程”
— 𝔼𝕕𝕤𝕘𝕖𝕣 𝔻𝕚𝕛𝕜𝕤𝕥𝕣𝕒

【删除的代码是调试过的代码】
— 𝕁𝕖𝕗𝕗 𝕊𝕚𝕔𝕜𝕖𝕝

“虫子潜伏在角落,聚集在边界”
——𝔹𝕠𝕣𝕚𝕤𝔹𝕖𝕚𝕫𝕖𝕣

“有两种方法可以写出没有错误的程序;
——𝔸𝕝𝕒𝕟ℙ𝕖𝕣𝕝𝕚𝕤只有第三部作品

浅谈建筑与设计

—𝕃𝕒𝕣𝕣𝕪ℂ𝕠𝕟𝕤𝕥𝕒𝕟𝕥𝕚𝕟𝕖“雇人写代码来推销并不等同于雇人设计和构建持久、可用、可靠的软件”

“设计最难的部分是……把特征挡在外面”
— 𝔻𝕠𝕟𝕒𝕝𝕕 ℕ𝕠𝕣𝕞𝕒𝕟

“一个建立在脆弱架构之上的软件系统,会因为自身成功的重量而沉没”
——𝕋𝕙𝕖𝔸𝕣𝕔𝕙𝕚𝕞𝕖𝕕𝕖𝕒𝕟ℙ𝕣𝕚𝕟𝕔𝕚𝕡𝕝𝕖

“在软件可以重用之前,它首先必须是可用的”
——ℝ𝕒𝕝𝕡𝕙𝕁𝕠𝕙𝕟𝕤𝕠𝕟

“一个有效的复杂系统总是被发现是从一个有效的简单系统进化而来的”
——𝔾𝕒𝕝𝕝’𝕤𝕃𝕒𝕨

根据要求

“在水面上行走和从一个规范开发软件都很容易,如果两者都冻结了”
— 𝔼𝕕𝕨𝕒𝕣𝕕 𝔹𝕖𝕣𝕒𝕣𝕕

“用户永远也不会知道他们想要什么,直到系统投入生产之后(甚至可能那时都不知道)”
——ℍ𝕦𝕞𝕡𝕙𝕣𝕖𝕪’𝕤𝕃𝕒𝕨

“改变规格以适应程序比反之更容易”
— 𝔸𝕝𝕒𝕟 ℙ𝕖𝕣𝕝𝕚𝕤

“一个需求被认为越稳定,它被改变的概率就越大”
—ℍ𝕖𝕚𝕤𝕖𝕟𝕓𝕖𝕣𝕘’𝕤ℙ𝕣𝕚𝕟𝕔𝕚𝕡𝕝𝕖

“增加选择的数量会对数地增加决策时间”
— ℍ𝕚𝕔𝕜’𝕤 𝕃𝕒𝕨

“有手表的人知道现在是什么时候。一个有两只手表的人永远不会确定”
— 𝕊𝕖𝕘𝕒𝕝’𝕤 𝕃𝕒𝕨

关于评估和时间管理

“前 90%的代码占了开发时间的前 90%。剩下的 10%代码占了另外 90%的开发时间”
— 𝕋𝕠𝕞 ℂ𝕒𝕣𝕘𝕚𝕝𝕝

“从现在到项目完成的时间趋于恒定”
— ℍ𝕒𝕣𝕥𝕣𝕖𝕖’𝕤 𝕃𝕒𝕨

“工作扩大以填补其完成的可用时间”
— ℙ𝕒𝕣𝕜𝕚𝕟𝕤𝕠𝕟’𝕤 𝕃𝕒𝕨

“它总是比你想象的要长,即使你考虑到霍夫斯塔德定律”
——ℍ𝕠𝕗𝕤𝕥𝕒𝕕𝕥𝕖𝕣’𝕤𝕃𝕒𝕨

“时间永远不够做好,但总有足够的时间重做”
——𝕁𝕒𝕔𝕜𝔹𝕖𝕣𝕘𝕞𝕒𝕟

浅谈项目管理

“给一个迟到的软件项目增加人力会让它迟到”
—𝔹𝕣𝕠𝕠𝕜𝕤’𝕤 𝕃𝕒𝕨

“许多现象 80%的后果源于 20%的原因”
—ℙ𝕒𝕣𝕖𝕥𝕠 ℙ𝕣𝕚𝕟𝕔𝕚𝕡𝕝𝕖

“没有什么东西能按时或在预算内建成”———ℂ𝕙𝕖𝕠𝕡𝕤𝕃𝕒𝕨

“任何可能出错的事情都会出错”
——𝕄𝕦𝕣𝕡𝕙𝕪’𝕤𝕃𝕒𝕨

“我一直发现,计划无用,但计划必不可少”
— 𝔻𝕨𝕚𝕘𝕙𝕥 𝔼𝕚𝕤𝕖𝕟𝕙𝕠𝕨𝕖𝕣

软件开发社区大量创建和接受同名法律。我希望你喜欢反思这个集合。

感谢阅读!

我经常在媒体上写关于领导力、技术&的数据——如果你想阅读我未来的帖子,请‘关注’我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值