从这 5 个基本功能开始使用 PyTorch。
PyTorch 基础
对深度学习的需求不断增长。更多的开发人员和数据科学家正在加入深度学习的行列,提供量身定制的库。
功能 1 —火炬.设备()
PyTorch 是一个由脸书开发的开源库,在数据科学家中很受欢迎。其崛起背后的一个主要原因是 GPU 对开发者的内置支持。
torch.device 使您能够指定负责将张量加载到内存中的设备类型。该函数需要一个指定设备类型的字符串参数。
您甚至可以传递一个序号,如设备索引。或者不指定 PyTorch 使用当前可用的设备。
示例 1.1
示例 1.2
对于 例 1.1 ,我们选择运行时要存储张量的设备类型。注意,我们已经将我们的设备类型指定为 cuda ,并在相同的字符串中附加了序号,用“:”分隔。
例 1.2 通过为设备类型和索引传入单独的参数,获得了相同的结果。
创建张量时定义设备类型
torch.device()中预期的设备类型是 cpu、cuda、mkldnn、opengl、opencl、ideep、hip、msnpu 。为了正确使用此方法,设备类型应该存在于预期设备列表中。
让我们看看当我们尝试将 GPU 指定为设备类型时会发生什么。
示例 1.3 (a) —创建“gpu”类型设备实例时出现运行时错误
运行笔记本的计算机上应该有指定的设备类型。否则将导致错误,如示例 1.3 (b)所述。
在 1.3 (b) 中,我们使用需要 NVIDIA GPU 的 cuda 设备类型定义了一个张量。由于我们的机器没有任何可用的 GPU,内核抛出了一个运行时错误。
示例 1.3 (b) —指定不存在的设备类型时出现运行时错误
功能 2 — torch.view()
torch.view()方法将张量(无论是向量、矩阵还是标量)的视图更改为所需的形状。转换后的张量修改了表示维度,但保留了相同的数据类型。
让我们来看一个例子——定义一个样本张量 x,并转换它的维度以存储在另一个张量 z 中。
示例 2.1
在 例 2.1 中,我们对一个表示为单行向量的 4 x 5 矩阵的维数进行了变换。默认情况下,行优先顺序连续打印行的元素。变换视图中的每个行元素都以与原始张量中相同的顺序出现。
此外,新张量的形状必须支持原始张量中相同数量的元素。您不能在 5 x 3 视图中存储 4 x 5 形状的张量。
对于 例 2.2 ,我们将用-1 来表示一个维度。PyTorch 自动从其他维度解释未知维度。变换张量在大小和步幅上与原始张量兼容。
示例 2.3 —不正确的形状
请注意,一次只能推断一个维度。对多个维度使用-1 只会引入歧义和运行时错误!
PyTorch 只允许-1 作为最多 1 维的可接受值。如果不止一个维度作为-1 传递,它将抛出一个运行时错误。
函数 3 — torch.set_printoptions()
很多时候,你想在执行某些任务之前打印出张量的内容。为此,在笔记本中打印张量时,您可能需要更改显示模式。
使用 set_printoptions,您可以调整精度级别、线宽、结果阈值等属性。
在我们的例子中,我们将采用一个代表 20 x 30 矩阵的张量。通常不需要在笔记本中表示如此庞大的矩阵。打印张量变量背后的一个常见用例是查看前几行和最后几行。
示例 3.1(a)-使用默认打印选项打印
我们将根据自己的喜好,利用阈值、边项和线宽属性来改变张量的视觉表示。我们还可以使用 precision 属性改变小数点后显示的位数。
示例 3.1 (b) —更新了打印选项以显示更少的行
在该方法中,我们有三种可用的配置文件:默认、微小和完整。将配置文件名与其他属性一起传递是不正确的用法。在这种情况下,该函数会忽略 profile 属性。
示例 3.2
函数 4 — Tensor.backward()
张量用于简化机器学习管道中所需的常见任务。为了执行梯度下降(一种流行的损失最小化技术),我们需要计算损失函数的梯度(召回导数)。
PyTorch 使用 backward()方法简化了这一过程,它在每次方法调用时存储渐变。注意:PyTorch 仅在其 require_grad 属性设置为 True 时计算张量的梯度。
示例 4.1
我们会用线性方程 y = mx + c 来求 y w.r.t 对方程中每个变量的偏导数。
示例 4.1 (a)
在调用 y.backward()方法并打印出计算出的梯度后,我们可以访问。张量 x 的梯度性质。
示例 4.1 (b)
因为我们没有将 require_grad 选项设置为 True,所以我们在调用时不会得到结果。m 的 grad 属性。
再次调用 y.backward()将导致 y . w . r . t 张量的二阶微分。注意 PyTorch 累积存储梯度。
函数 5 — torch.linspace()
linspace()方法返回一个包含一系列数字的一维张量。与随机生成数字的 rand()函数不同,返回的数字是 linspace()中等差数列的成员。
每个成员的差异由 steps 属性和范围(end-start)指定。
示例 5.1
输出张量包含 50 个 1-10 范围内的等距数字。 dtype 属性是 int 所以不存储小数位。
例 5.2—out属性也可用于指定张量来存储方法的结果。
请注意,在使用 linspace()方法创建张量时, dtype 值必须与输出张量定义的 dtype 一致。
示例 5.3-dtype 属性不匹配
结束语
本文介绍了 PyTorch API 中的一些基本方法,帮助您开始使用它。由于大部分实现都是从 NumPy 库中借用来的,以 Python 开发人员现有的理解和经验为基础,因此该 API 很容易上手。
通读这些功能后的下一步是浏览官方文档。由于 PyTorch 是一个深度学习库,所以强烈建议您在开始使用这些函数之前先学习 ML 基础知识。
就这样,你坚持到了我 PyTorch 系列的第一篇博客的结尾!
参考
PyTorch 官方文件https://pytorch.org/docs/stable/torch.html
如果你喜欢这篇文章,并希望在未来阅读我的更多内容,你可以在这里以及在 LinkedIn 和 Twitter 上关注我。此外,请在评论中提出你的建议,告诉我在这一页上还能覆盖哪些功能。
在 LinkedIn和 Twitter上关注我,获取关于数据科学、机器学习和数据结构的内容。
如何使用 Python 获取每日新闻
使用 Python 中的 NewsAPI 获取新闻,并生成词云来理解新闻和观点。
图片来源:作者
你有没有想过如何通过编程获得最新的新闻?新闻 API 就是 Python 中的一个这样的模块,可以在这方面帮助你。它有大约 120 个来源的数据,包括路透社、BBC 新闻、ABC 新闻、ESPN。
[## Python 客户端库—新闻 API
使用非官方的 Python 客户端库将新闻 API 集成到您的 Python 应用程序中,而不用担心…
newsapi.org](https://newsapi.org/docs/client-libraries/python)
首先,从 NewsAPI 获取 API 密钥,开始提取新闻文章。你可以在这里看到更多关于如何得到一个。
[## 开始—文档—新闻 API
要开始使用,您需要一个 API 密钥。它们免费用于开发、开源和非商业用途,您可以…
newsapi.org](https://newsapi.org/docs/get-started)
导入相关的库。
from newsapi import NewsApiClient
这是用于 NewsAPI 导入的。现在初始化 NewsAPI 的变量
newsapi = NewsApiClient(api_key=api_key)from pandas.io.json import json_normalizeimport pandas as pd
我们将使用 Python 中漂亮的 Soup 包来帮助清理数据中的 HTML 标签。
from bs4 import BeautifulSoup
现在,让我们看看实际用途。
L最新消息
获取最新消息:
def top_headlines():
country=input("Which country are you interested in?")
category=input("""Which category are you interested in? \nHere
are the categories to choose from:\nbusiness\nentertainment
\ngeneral\nhealth\nscience\ntechnology""")
top_headlines =newsapi.get_top_headlines(category=category,
language='en',country=country)
top_headlines=json_normalize(top_headlines['articles'])
newdf=top_headlines[["title","url"]]
dic=newdf.set_index('title')['url'].to_dict()
让我们来谈谈这段代码是做什么的。我写过一个函数叫 top_headlines。我接受两个输入,国家和类别。当我向该国提供输入时,你必须以特定的格式书写。新闻 API 中的国家参数遵循以下代码系统:
[## ISO 3166 国家代码列表
下面的可排序表格包含 249 个国家中每个国家的三组 ISO 3166-1 国家代码,链接到…
en.wikipedia.org](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes)
USA 是“us”,英国是“gb”,印度是“in”。有关其他国家的标志,请参考上面的链接。
在代码本身中,我已经提到了如何向 category 参数提供输入。“一般”代表一般新闻,“体育”代表体育新闻,以此类推。
使用 get_top_headlines,您可以获得最新的新闻。现在,输出是 JSON 格式的,所以我想把它转换成数据帧。因此,我使用了在本教程前面导入的 json_normalize 方法。然后,我将它存储到一个新的 Dataframe 中,该 data frame 只包含从 JSON 输出中返回的列列表中选择的几个列。
然后我决定,我要搞清楚这个新闻信息。我用了一个案例来看媒体的观点在一个特定的时间段内是如何变化的。新闻 API 有一个付费版本,提供长达两年的信息。在免费版本中,你可以检索 30 天的新闻,这也是我选择的时间范围。
搜索特定的主题
为了进行这种分析,我们需要使用这种方法:
get_everything(query,language,sort_by='relevancy',from_param,to)
这意味着它可以获得与特定搜索查询相关的所有信息。比方说,您想要获取有关当今世界最热门话题——新冠肺炎病毒或冠状病毒——的所有信息,您可以在上述函数的“query”参数中指定。
上述函数中的“from_param”参数和“to”参数是日期参数。它会要求您指定希望获得搜索查询结果的时间范围。因为我提到过,我想获得 30 天的所有结果,这是免费版本允许的最大时间范围,我将指定 from_param 为今天的日期前 30 天。然而,我需要在一个循环中写这个,这样我可以确保我每天都得到。
所以,我首先构建了一个日期函数来帮助我。
import datetime
from datetime import datetime, timedelta
def date(base):
date_list=[]
yr=datetime.today().year
if (yr%400)==0 or ((yr%100!=0) and (yr%4==0)):
numdays=366
date_list.append([base - timedelta(days=x) for x in
range(366)])
else:
numdays=365
date_list.append([base - timedelta(days=x) for x in
range(365)])
newlist=[]
for i in date_list:
for j in sorted(i):
newlist.append(j)
return newlist
def last_30(base):
date_list=[base - timedelta(days=x) for x in range(30)]
return sorted(date_list)
def from_dt(x):
from_dt=[]
for i in range(len(x)):
from_dt.append(last_30(datetime.today())[i-1].date())
return from_dt
def to_dt(x):
to_dt=[]
for i in range(len(x)):
to_dt.append(last_30(datetime.today())[i].date())
return to_dt
from_list=from_dt(last_30(datetime.today()))
to_list=to_dt(last_30(datetime.today()))
我构建的第一个日期函数(date)是一个更通用的日期函数,如果需要的话,我想在很长的时间内使用它。我正在使用 first date 函数获取所有日期的列表。我只需要 30 天,所以我确保使用 last_30 来完成。这将给我从当前日期和时间开始的过去 30 天的列表。继续讨论 from_dt 函数,它专门用于上面提到的 get_everything 函数的 from_param。这是您需要所有新闻文章的时间范围的开始,to_dt 是结束日期。
我现在有两个单独的列表,分别是开始日期和结束日期。
现在我们将处理查询参数,它是 get_everything 函数的搜索词。
def func(query):
newd={}
newdf=pd.DataFrame()
for (from_dt,to_dt) in zip(from_list,to_list):
all_articles =
newsapi.get_everything(q=query,language='en',
sort_by='relevancy',from_param=from_dt,to=to_dt)
d=json_normalize(all_articles['articles'])
newdf=d[["url","publishedAt","source.name","author"]]
dic=newdf.set_index(["source.name","publishedAt","author"])
["url"].to_dict()
for (k,v) in dic.items():
page = requests.get(v)
html = page.content
soup = BeautifulSoup(html, "lxml")
text = soup.get_text()
d2=soup.find_all("p")
newd[k]=re.sub(r'<.+?>',r'',str(d2))
return newd
遍历日期的 from 和 to 列表的压缩版本,我们得到了 30 天时间范围内的所有文章的列表。我选择循环的原因是,这样我就可以对每一天进行分析。然后我将它存储在数据框中。然后,我获取相关的列,并将它们存储回字典中。我想解析新闻 URL 中的内容,以便只从文章中获取内容。我在这里使用 Python 中的 BeautifulSoup 包来解析内容,并获取信息所在的相关
标签。因为我们在这里主要关注文本数据,所以我们需要这些段落标签之间的信息。你可以在这里找到更多关于 BeautifulSoup 的信息:
Beautiful Soup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据。它与您最喜欢的解析器一起工作…
www.crummy.com](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
一旦我们有了更清晰的数据,我们现在就可以继续使用单词云来分析模式。
N使用 WordCloud 进行 ews 分析
现在,我们来看看单词云。我们可以从新闻中理解数据的部分。有哪些常见的模式?
def wordcld(dictionary):
newd={}
for (k,v) in dictionary.items():
if v!='[]':
wordcloud = WordCloud().generate(str(dictionary[k]))
fig, axes= plt.subplots(figsize=(20,12),clear=True)
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()
else:
print(str(k[0])+"_"+str(k[1][5:10])+"_"+str(k[1][11:13])
+"_"+str(k[1][14:16]) +"_"+str(k[1][17:19])+"_"+str(k[2]))
print("Wordcloud Not applicable")
dic=func("Indian Economy")
wordcld(dic)
我在搜索一些关于印度经济的常用词,得到了下面的图片。我得到的图像是一天。我上面的代码会给你 30 天的结果。
图片来源:作者
试试这个,如果你有任何问题,请随时告诉我。
下一步,您可以使用 Twilio API/SendGrid 电子邮件 API 将此作为文本消息/电子邮件通知发送给自己,我将在另一个教程中介绍,或者您可以看到一些现有的 API,如下所示:
[## 用 AWS Lambda & Twilio 创建一个无服务器的 SMS-Twitter 应用程序
我们将使用 AWS Lambda 函数来创建 Tweets,并通过 SMS 向/从 Twilio 发送 Twitter 事件通知…
medium.com](https://medium.com/@osaimola/creating-a-serverless-sms-twitter-app-with-aws-lambda-twilio-b33f63254cbb) [## v3 API Python 代码示例
让我们知道我们做得怎么样!请评价此页面:如果您需要 Twilio SendGrid 的即时帮助,请…
sendgrid.com](https://sendgrid.com/docs/for-developers/sending-email/v3-python-code-example/)
总结一下:
图片来源:作者
如果你有任何问题,欢迎在这里评论或者给我发邮件。你也可以在 GitHub 上看到这段代码:https://github.com/mukund14/News/tree/news_api_Python
mukundan.sankar14@gmail.com
充分利用 scikit——学习面向对象编程
浏览一个数据科学示例,增强您的 Python 编码能力!
作为数据科学家,我们都熟悉 scikit-learn ,这是 Python 中最常用的机器学习和数据分析库之一。我个人在我的大部分专业项目中都使用它和熊猫。
然而,直到最近,当我需要构建一个定制的回归估计器时,我才充分利用了 scikit-learn。我惊喜地发现,创建一个新的兼容的估计器类是如此容易,这都归功于 scikit-learn 组件的面向对象设计。
在本文中,我将带您了解一个常见的数据科学工作流,并演示面向对象编程(OOP)的一个用例。特别是,您将学习如何使用继承的概念来定制 transformer 对象,这允许我们扩展现有类的功能。由于继承,这个转换器将很容易适合 scikit-learn 管道,以构建一个简单的机器学习模型。
激励人心的例子。
为了更清楚地说明问题,让我们看一个受零售商营销启发的实际例子。假设我有一个数据集,其中每条记录代表一个客户,并且有与购买最近、频率和货币价值相关的度量(即特征)。使用这些功能,我们希望预测客户是否会加入零售商的奖励卡计划。这模拟了一个真实的场景,我们希望预测哪些客户是营销的最佳目标。请参见下面的客户记录数据示例:
我们客户数据的前十行。请注意用红色圈出的缺失值。
数据的一个显著特点是缺失,即在观察值中存在缺失值。这些值将被渲染为 NaN 的,一旦被熊猫读取,将不会在我们的机器学习模型中工作。为了构建我们的模型,我们需要估算缺失特征的值(即,用推断的数量替换缺失值)。虽然有多种数据插补技术,但为了简单起见,假设我们想尝试对任何缺失值进行列均值或中值插补。
那么,我们应该使用哪个统计量,平均值还是中间值?找出答案的一个简单方法是尝试两个选项,并评估哪一个在网格搜索中产生最佳性能,也许可以使用 scikit-learn 的 GridSearchCV 。
一个错误是计算整个训练集的平均值和中值,然后用这些值进行估算。更严格地说,我们需要计算这些数据的统计数据,不包括坚持折叠。这看起来很复杂,但是多亏了 OOP,我们可以通过继承轻松实现我们自己的转换器,它将与 scikit-learn 兼容。从那里,我们可以将 transformer 插入到 scikit-learn 管道 中,这是一个与 transformer 对象列表以及 estimator 对象一起排序的对象,用于构建我们的模型。
构建自定义输入转换器。
为了开始为我们的转换器构建类,我们将编写类定义和构造函数。特别注意( TransformerMixin , BaseEstimator ),这表明我们继承了这两个类。这将使我们创建的custom impute transformer类的对象与 scikit-learn 的其他组件兼容,方法是提供 GridSearchCV (如 get_params )所期望的方法的实现,并指示我们创建的对象是正确的类型(如 transformers)。
接下来,我们将实现 fit 方法。给定数据集X,fit计算每列的平均值或中值,可用于以后的插补。
最后,我们编写了 转换 的方法。该方法将我们希望转换的数据集作为参数,应用已经计算的“估算值”并用它们填充 NaN 值。
下面是一个在小样本上使用自定义 transformer 对象的例子。
以下是打印到控制台的结果:
红色表示 x1 的平均值,蓝色表示特征 x2 的平均值。
注意,我们创建的功能已经在 scikit-learn 的simple impute类中可用。我决定在这里从头实现它,因为它易于构建,并且很好地展示了创建更复杂的转换器所需的内容。
将转换结果传输到 ML 模型中。
我们将创建一个管道,将自定义转换器的结果级联到逻辑回归模型中。
加载数据。
通过传递元组列表来创建管道。每个元组都有流水线阶段的名称(在这个例子中是估算和模型)以及用于估计器的变换器的对象。
对于网格搜索,我们将搜索以确定哪种类型的插补是最好的,因此在 param_grid 中有条目" imput _ _ imput _ type “:[” mean “,” median"]。
我们将获得最好的管道,并从中获得训练预测。注意,我们可以在 best_pipe 对象上调用 预测 函数。这有效地将首先从custom impute transformer运行 转换 ,然后从逻辑回归运行 预测 。
最佳流水线和训练精度的输出如下。
GridSearchCV 确定的最佳管道。请注意红色方框中的最佳超参数值。
演示变压器做我们想要的。
在这个例子中,我们清楚地表明,我们需要 transformer 来计算除了保留折叠之外的所有折叠的统计数据。为了证明我们的代码确实做到了这一点,我们将进一步利用继承来构建一个 impute transformer 对象,该对象完全执行我们最初的 transformer 所做的事情,并添加了在交叉验证的每次迭代中输出不同统计数据的功能。
我们将再次使用继承来创建customimputoutputtransformer,它是customimputtransformer的子类:
我们唯一需要实现的功能就是 fit 。事实上,我们将使用通过使用调用标准 fit 函数得到的结果,并简单地用控制台输出扩充它,如下所示。
现在我们需要做的就是改变我们在管道中使用的对象,并在运行它时监视输出是什么。
为了简洁起见,我可视化了一个特性的输出。你可以在 Github 上看到实际的打印输出。
它的行为符合预期。 GridSearchCV 的每次迭代都产生四个训练折叠的统计数据,而不是计算一个全局值。
结论
在本文中,我们了解了如何使用继承(OOP 的一个基础方面)来解决现实世界中的数据科学问题。我展示的例子很简单,但是,您可以使用相同的框架为您的项目构建更复杂的类。
所有的代码、数据和结果都可以从这个 Github repo 中提取。本文中展示的例子是完全可复制的,所以您可以随意提取代码并自己使用它。
用自然语言处理认识你的朋友
准备、探索、了解 WhatsApp 用户使用 Python 的习惯。
马科斯·保罗·普拉多在 Unsplash 上的照片
D 做一个新项目并有一个好的想法可能具有挑战性。在过去的几个月里,在奇怪的情况下,我们都在,我不知道该做什么项目。我开始了几个项目,但没有完成,因为结果并不乐观,不值得一篇文章。我知道我不想使用 Kaggle 或其他地方的数据集,但我想通过使用我需要收集的数据来做一个端到端的项目。
在浏览了 Medium 上的文章/项目后,多亏了 Samir Sheriff 的文章,我发现可以分析来自 WhatsApp 组的数据,由于我没有做过自然语言处理或 NLP 的项目,我认为这是提高我的技术技能的绝佳机会。
使用 Python 的分步指南
towardsdatascience.com](/build-your-own-whatsapp-chat-analyzer-9590acca9014)
什么是自然语言处理?
自然语言用于人类之间的日常交流,如 Messenger、电子邮件、Whatsapp、社交媒体(Twitter、脸书等)。).这些来源的数据对于文本和语音来说都是高度非结构化的,因此很难被机器解析和理解。自然语言处理(NLP)涉及自然人类语言和计算机之间的交互。它是语言学、计算机科学和人工智能领域的交叉。
如今,大部分数据被归类为非结构化数据,这意味着收集的数据没有像在 Microsoft Excel 中那样组织在表格中。因此,它更难分析,也不容易搜索,这就是为什么它直到最近几年才对组织有用。往往需要大量的时间来清理和组织数据到一个有用的数据框中,这对于很多人来说是一个枯燥的任务。如果这一信息被忽视,公司就没有利用他们所能获得的一切来取得成功。现在在就业市场上,越来越多的公司正在寻找专家来分析这些数据,因为他们希望利用这些宝贵的信息。我以前写过一篇类似的文章,讲的是如何收集和处理推文到亚马逊 S3 桶。
通过使用 Python 和 Tweepy
medium.com](https://medium.com/analytics-vidhya/how-to-create-a-dataset-with-twitter-and-cloud-computing-fcd82837d313)
人工智能算法现在有助于从每天生成的大量非结构化数据中自动提取意义。公司使用 Hadoop 等大数据工具和软件从原始非结构化数据中准备、挖掘、集成、存储、跟踪、索引和报告业务见解。
我把 NLP 的主要应用总结如下:
- 分类:根据内容对文档进行分类,这种技术用于电子邮箱中的垃圾邮件过滤器或分析产品评论。
- 推荐:通过基于内容的算法,根据给定的信息选择最相关的文档。这项技术被谷歌、网飞、亚马逊用来根据你之前的搜索推荐一些东西。
- 主题建模:通过解释模式来理解文本的含义,并识别每个个体背后的结构。
现在让我们看看我的项目
作为 WhatsApp 小组的一员,我可以导出数据并开始探索它。这个组是在 2015 年创建的,但由于 WhatsApp 数据的加密最近发生了变化,我只能从 2019 年 10 月开始拉数据。此外,为了让广大公众理解这篇文章,我不打算将我的代码粘贴到文章中。相反,你会看到用包 plotly 制作的很酷的图。如果你对代码感兴趣,请查看我在 GitHub 上的库。
请注意,WhatsApp 群组中的任何人都可以从对话中提取数据,在 messenger 上也可以这样做。请随意复制我的代码,并使用它来研究您的数据。
现在回到我的项目,从 Whatsapp 应用程序中提取数据后,我获得了一个文本文件,看起来就像这样:
文本文件—非结构化数据
正如我之前提到的,我不能使用这种格式的数据,这些数据是非结构化的,一团乱麻。为了将这些数据转换成包含列的数据框架,我对数据进行了标记。但是,什么是标记化呢?
标记化是对输入字符串的各部分进行划界和可能的分类的过程。
在一个文本文件中,每行代表一个注释,我确定了 4 个标记:
<2019–10–19>T3
经过进一步的清理,我能够生成下面的数据框。我不会深入讨论我如何获得数据帧的所有细节。相反,我建议查看我在上文和文章末尾链接的回购。
结构化数据帧
此外,为了确保所有这些信息的隐私,并且因为我希望我的朋友在这篇文章发表后仍然是我的朋友,我用一些著名的职业自行车运动员代替了我们的名字,因为群聊最初是由于我们对自行车和山地自行车的共同爱好而创建的。以下是该小组 17 位作者的名单:
克里斯·弗鲁姆、伊根·贝尔纳尔、阿尔贝托·康塔多、奈罗·金塔纳、罗曼·巴尔德、文森佐·尼巴里、彼得·萨根、伊曼纽尔·布赫曼、朱利安·阿拉菲利普、托尼·盖洛平、蒂博·皮诺、汤姆·杜穆林、法比奥·阿鲁、亚当·耶茨、沃伦·巴吉尔、沃特·范阿尔特、鲍克·莫勒姆。
群组中最活跃的用户
现在让我们开始研究数据。群聊包含 8,337 条消息、2,818 个表情符号和 229 个链接。对数据的第一个简单观察是检查谁在聊天中发送了最多的消息。下面是每个作者的邮件数量和字数的图表。
Vincenzo 是该组中发送消息最多的作者(1,470 条),其次是 Chris、Egan、Julian 和 Nairo,大约有 1,000 条消息。让我们看看尼巴利在环法自行车赛上是否会像在这个团体中一样活跃。
Jonny Kennaugh 在 Unsplash 上拍摄的照片
我们还可以看看谁发送了最多的表情符号,上面的图显示,文森佐·尼巴里在聊天中发送了最多的表情符号,其次是伊根、克里斯和彼得。前 5 名和之前剧情差不多。我注意到朱利安·阿拉菲利普发送的表情符号很少。
探索不同变量之间是否存在相关性的另一种方法是创建一个相关矩阵。基于此,变量之间没有强相关性。表情符号的数量和每个表情符号的字数比率(0.38)之间有相当的相关性。字母数和单词数之间有很强的相关性,这种相关性被认为是单词越多字母越多。
网址专员
为了完成描述部分,我查看了每个作者发送的 URL,你会注意到 Nairo 将大多数链接(118 个)发送到该组,接下来是 Julian (36 个)和 Vincenzo(28 个)。
关于前 5 名作者的更多统计数据
接下来,我总结了该组中每个用户的统计数据,长话短说,我只公布了该组中的前 5 名用户。
我还观察了一周中哪一天最活跃。根据下面的雷达图,周二、周五和周六是最忙的日子:这几天大约发送了 1400 条消息。
时间
雷达图—一周中每天的消息数量
现在让我们来看看通过时间发送的消息数量。在下图中,可以明显看出,自 2020 年 3 月左右以来,该群体明显比以前更加活跃(p 值:2.63e-06)。
我认为这种增长可能是由于法国在三月和五月之间的封锁:更多的空闲时间=更多的时间发送信息。
最活跃的一天是 4 月 27 日,这一天已经发送了 150 条消息。
你会说表情符号吗?
截至 2020 年 8 月,Unicode 标准中共有 3304 个表情符号。在我的 Whatsapp 群中,总共使用了 143 个独特的表情符号。下面的饼状图显示了该群体中表情符号的总使用比例:
使用表情符号的总比例
大约 50%的表情符号被分成 4 种类型:
😂: 脸上带着喜悦的泪水
😁:眉开眼笑的脸
👍:竖起大拇指
尽管 WhatsApp 包含了 3304 个表情符号,但绝大多数作者只使用了 4 个表情符号。看起来这个群聊真的很有趣,因为大多数表情符号都有很多微笑和喜悦的泪水,这很有意义,因为我们一直在相互开玩笑。
作为一名训练有素的生物学家,我不禁注意到多样性指数是如何应用在这个场景中的。多样性指数是一种定量方法,反映了一个生态系统中有多少种类的物种,基于每个物种的丰度和物种的多样性。因此,我开始计算表情符号的丰富程度,也就是说我统计了群聊中每个作者使用的独特表情符号的数量。我们可以通过比较不同的生态系统来解释多样性指数。在这种情况下,每个作者就是一个生态系统。在前 5 名用户中,Vincenzo 是多样性最高的用户,Egan 是多样性最低的用户,尽管他正在发送大量表情符号!我们可以从建议 Egan 多样化他的表情符号开始。为了更深入地挖掘,我们来看看文森佐和伊根使用表情符号的比例:
文森佐·尼巴里 vs 伊根·伯纳尔
在前 5 名中,文森佐的多样性指数最高,伊根的多样性指数最低。文森佐 50%以上的时间使用 3 个表情符号,伊根 75%以上的时间使用一个表情符号。
云之语
单词云是文本数据的可视化表示,其中大小表示每个单词的频率,在本例中,是群聊。创建单词云的第一步是将所有评论合并成一个包含 335,093 个单词的长字符串。
WordCloud
英语中的“Oui”或“yes”用了 118 次,“moi”或“me”用了 214 次。我在这个云上看到一些和骑行有关的词:“vélo”、“Zwift”、“Garmin”、“vtt”、“strava”、“course”、“sortie”。令人惊讶的是,我没有看到关于饮料或食物的单词。“bière”或“beer”这个词用了 17 次,而“vin”或“wine”只用了 8 次。在冠状病毒时代,封锁或“禁闭”这个词已经被使用了 33 次。在做这个分析之前,我预计会看到更多不健康的习惯,但根据单词 cloud,这个群体相当健康,并且更加关注体育运动。
这个分析现在即将结束,如果你对代码感兴趣,可以通过我的 GitHub repo 访问。作为总结,在这篇文章中,我探讨了人们如何互相发短信的倾向,什么是最忙的日子,以及随着时间的推移趋势是什么。此外,我还可以进行一些有趣的分析,分析哪些作者发送的表情符号最多或最少,以及使用的表情符号的多样性如何。
我希望你喜欢阅读这篇文章,希望你学到了一些关于如何准备和探索 Whatsapp 数据的见解,希望你现在看到了 NLP 对企业的潜力,或者只是想了解你的朋友和他们的习惯。
为了进一步探索这些数据,我可以进行情感分析,试图找到作者之间的倾向。例如,我可以调查谁是最积极/消极的作者?或者,随着时间的推移,情绪在变化吗?
这个项目打开了我对数据科学的视野,我迫不及待地想继续探索 NLP 世界。例如,我读过 Sharon Lim 的一篇非常酷的文章,他在文章中应用了主题建模和朴素贝叶斯进行分类。在文章中,Sharon 能够找到最佳的主题数量,并确定各种主题类别和结构。
主题建模的潜在狄利克雷分配和文本分类的朴素贝叶斯
medium.com](https://medium.com/towards-artificial-intelligence/unlock-the-power-of-text-analytics-with-natural-language-processing-2e6d83b35f99)
最后,如果你喜欢我的工作,你可以在 LinkedIn 上联系我。
让您的决策树模型随车移动
由 Pixabay 上的 Alexas_Fotos 拍摄的照片
基尼杂质——另一种决策树节点划分标准
作为最流行的经典机器学习算法之一,决策树在可解释性方面比其他算法更直观。在我以前的文章中,我介绍了用于构建决策树模型的 ID3 和 C4.5 算法。
决策树机器学习算法简介
towardsdatascience.com](/go-out-for-exercise-or-not-let-data-science-decide-34f8f28ce7b4)
展示 ID3 中信息获取的局限性以及使用 C4.5 的优势
towardsdatascience.com](/do-not-use-decision-tree-like-this-369769d6104d)
在本文中,我将介绍另一种叫做 CART 的算法,用于构建决策树模型,这可能也是最常用的。顺便说一句,当你使用 Scikit-Learn 库作为决策树分类器时,这是默认的算法。
什么是 CART 算法?
CART 算法是 C 分类AdR回归 T rees 的缩写。它是由 Breiman 等人在 1984 年发明的[1]。
它通常与 C4.5 非常相似,但具有以下主要特征:
- 与可能有多个分支的一般树不同,CART 使用二叉树,每个节点只有两个分支。
- CART 使用 Gini 杂质作为划分节点的标准,而不是信息增益。
- CART 支持数字目标变量,这使得它能够成为预测连续值的回归树。
本文将把重点放在 CART 作为分类树上。
基尼杂质
就像 ID3 和 C4.5 算法依赖信息增益作为分割节点的标准一样,CART 算法使用另一个称为 Gini 的标准来分割节点。
如果你学过经济学,你一定熟悉基尼指数,它表明一个国家或任何其他人群内部的收入不平等或财富不平等[2]。
在 CART 算法中,出于类似的目的,直观地使用基尼系数。即基尼系数越大,意味着节点的杂质越大。类似于 ID3 和 C4.5 使用信息增益选择不确定性较大的节点,基尼系数会引导 CART 算法找到不确定性较大(即杂质)的节点,然后进行分裂。
基尼系数的公式比我们在其他两个决策树算法中使用的信息增益和信息增益比率相对简单。如下图所示。
- p(Ck|t) 是节点 t 成为类别 Ck 的概率。
- 节点 t 的基尼系数为 1 减去所有类别的概率之和。
不要被公式吓到。我们举个例子来演示一下。我保证不难理解。
下面的例子在我写的所有关于决策树的文章中都被使用过。
假设我们想通过使用“天气”特性进行分割来启动决策树。然后,我们需要计算其条件下的基尼系数。让我们关注天气属性和结果,如下表所示。
计算概率 *p(Ck|t)是相当容易的。*例如,如果我们考虑属性“天气=晴朗”,则总共 3 个样本中有 1 个“是”和 2 个“否”。因此,类别“是”的概率是 1/3,类别“否”的概率是 2/3。然后我们可以很容易地计算出基尼系数如下。
我们从上面 3 个等式中得到的直觉是
- 当天气晴朗时,会有一些不确定性,因为我们可能会出去跑步,也可能不会。
- 当天气多云时,我们肯定要出去跑步。完全没有不确定性(100%纯度)
- 当天气下雨时,我们肯定不会出去跑步。也没有任何不确定性(100%纯度)
这些数字也反映了我们的直觉。天气晴朗的时候基尼系数是 0.444,因为不纯。当天气多云或下雨时,基尼系数为 0。因此,使用属性“天气=多云”和“天气=下雨”来分割节点没有任何意义,因为我们知道决策必须是全是或全否。
CART 算法如何选择根/下一个节点
由 cocoparisienne 在 Pixabay 上拍摄的照片
我们如何决定根节点,从而使用相同的逻辑来决定如何分割内部节点?这与使用所有可能的子节点的基尼系数的加权和一样简单。
由于 CART 算法是利用二叉树的 CART 算法,每次我们只需要计算两个节点的基尼系数的加权和。公式如下。
- |t_left|和|t_right|分别是左边和右边节点的样本大小。
- |T|是候选父节点 T 的样本大小
还是那句话,不要被公式吓到。让我们用同样的例子,天气特征。
如果我们使用天气作为根节点,有 3 种不同的情况:
- 除以“晴”和“不晴”,基尼系数= 0.476
2.除以“多云”和“不多云”,基尼系数= 0.229
3.除以“多雨”和“不多雨”,基尼系数= 0.343
同样的逻辑将应用于所有其他可能性,直到我们找到最大的基尼系数,这将是根节点。类似地,对于内部节点,应用相同的逻辑来确保每个分裂具有最大的基尼系数。
摘要
在本文中,我介绍了另一种决策树算法,称为 CART(分类和回归树)。它构造只有两个分支的二叉树。它还支持将连续数值作为目标。CART 最显著的特点是使用基尼系数作为划分节点的标准。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
参考
[1] Breiman,Leo,等.分类和回归树.CRC 出版社,1984 年。
[2]基尼系数。维基百科。https://en.wikipedia.org/wiki/Gini_coefficient
我如何用 AWS 构建一个可伸缩的 Web Scraper
我对完全托管的基于云的 Python scraper 的提议
我如何想象我的 AWS 控制台…(照片由帕特里克·grądys在 Unsplash 上拍摄)
去年年初,我在 Craigslist 上发现了一个疯狂的二手车交易。经过反复检查,证明这不是一个骗局(事实并非如此)。我很自然地直接去了《凯利蓝皮书》,以了解我的新车的“真正价值”——但这让我想到:
凯利蓝皮书是如何计算私人汽车价值的?我凭什么相信他们?
似乎他们必须使用的第一个资源是 Craigslist——因为这是最受欢迎的点对点二手车列表平台(直到最近,也是唯一的主要平台)。如果是这种情况,凯利蓝皮书必须以某种方式访问 Craigslist 的数据。然而,Craigslist 不提供 API,也不向公众开放他们的数据集(假设他们有)。这让我想到,也许像 KBB 这样的公司正在搜集他们的一些数据(这可能是一个安全的猜测)。
因此,我决定收集数据来建立我自己的凯利蓝皮书式的平台。为此,我需要构建一个满足以下要求的刮刀:
- 易于扩展和动态的刮板,以适应许多 Craigslist 城市,上市,和上市类型。
- 每天管理数百个作业的处理——交错并仔细安排,以避免 DDoS Craigslist 服务器(或被它们阻塞)。
- 监控每个作业,以便在出现任何运行时故障时立即通知我。
- 最后,CI/CD 用于管理所有相关服务的快速部署。
这是我的解决方案的高级示意图:
作者图片
本质上,我需要构建一个 ETL 管道来每天收集 Craigslist 数据,以便记录每个汽车列表的生命周期和事件(价格变化、除名)。本文重点介绍这些数据的提取过程。在接下来的几周里,我会写更多关于我如何转换/加载和处理数据的内容(稍后先看一些结果——继续阅读!).
免责声明:请理解这个项目只是为了研究而建。虽然它有能力在很短的时间内点击 Craigslist 上千个请求(或者让你的电脑崩溃),但我一直很小心地限制给定时间内的请求数量,通过战略性地间隔作业,以免垃圾邮件/DDoS Craigslist 服务器。如果你在 Craigslist(或任何这方面的网站),一定要阅读并遵守robots . txt。
让我们开始吧…
虽然我不会像教程那样一步一步地讲解整个过程;我想给你一个刮刀本身如何工作的概念。
scraper 在 Docker 容器中运行——代码本身非常简单,你可以在这里找到整个项目。它是用 Python 构建的,并使用了 BeautifulSoup 库。
有几个环境变量被传递给 scraper。这些变量定义了每个作业的搜索参数。本质上,容器的生命周期遵循以下三个步骤:
- 向容器传递几个变量,主要是城市/搜索区域和车辆制造商。
- 容器根据给定的参数搜索 Craigslist,并从 HTML 生成结构化结果。
- 容器将这些结果以 CSV 格式发送给 S3。
流程和基础设施
这是最酷的部分…
现在,让我们详细回顾一下提取/调度流程。
- 每天,我的 AWS CloudWatch 事件规则触发 lambdas 为不同的州和汽车制造商分派刮擦工作。
- 调度程序将每个城市的任务提交给 AWS 批处理。
- AWS Batch 加速计算环境( ECS )并根据环境的配置运行作业(计算环境决定作业并发性——点击阅读更多关于 AWS Batch 的信息)。
- CloudWatch 在批处理发送状态更新时处理并通知故障。
- 在每个批处理作业结束时,scraper 将发送一个新生成的搜索结果 CSV 到我的 S3 桶,命名约定为:search type _ make _ city _ timestamp . CSV。我选择将“品牌”放在“城市”之前,因为品牌对车辆列表的价格和寿命更重要。
下面是刮擦过程的高级示意图:
作者图片
从图中可以看出,我用的是 CloudWatch,Lambda,Batch,S3。我还将 SNS 用于由“批处理-作业-监视器”触发的通知
以下是我选择服务的理由:
CloudWatch 拥有“规则”,其行为类似于 Cron 作业,可以将 JSON 有效负载传递给 lambda 函数。这使我能够提交多个带有 JSON 格式的作业参数的 CloudFormation 模板,以便根据预先确定的 Cron 表达式执行。
Lambda 对于较小的任务(分派和通知)来说非常棒,并且可以很容易地与几乎所有的亚马逊服务集成。
AWS 批次非常适合我的刮刀容器。我决定以每个城市为基础运行作业,这意味着在相对较短的时间内会有数千个请求。为了提高每项工作的速度,我决定在 python scraper 中对请求进行多线程处理。这意味着我需要一个允许长运行时间和高 I/O 速率的服务。由于这些条件,Lambda 是不可能的(并且 Lambda 不支持 Python 的多线程包)。我发现 AWS Batch 是完美的——我能够配置计算环境以满足我的需求(和预算),同时在按使用付费的服务中拥有易于维护的 Dockerized scraper。另一个主要的好处是,AWS Batch 使用 ECS 来运行作业,因此,每次处理新队列时,AWS Batch 都会启动新的 EC2 实例— 和新的 IP 地址(实质上是轮换 IP)。
S3… 好吧,S3 是一个快速又便宜的方法,可以把我的半结构化刮刀暂时存放在一个容易接近的位置。我确实必须考虑我的对象命名标准。如果不考虑命名标准,S3 桶可能会对成千上万的对象造成混乱 AWS SDK 不提供健壮的对象搜索功能。很快,我将把我的数据从 S3 迁移到一个结构化的关系数据库中。
对于我需要自己发送的少量文本通知来说,SNS 非常棒——并且很容易与 CloudWatch 和 Lambda 集成。
CI/CD 概述
这一部分对我来说很重要,主要是因为我的铲运机有许多移动部件 AWS 控制台可能很乏味。
对于提交触发的构建/部署,我使用了代码管道和 TravisCI 。这主要是为了我自己的实验。我发现 TravisCI 能够做我需要的一切,所以我将把我的代码管道项目转移到 TravisCI,每月节省额外的 1 美元😉
我使用了 无服务器框架 通过 TravisCI 的构建脚本来处理 Lambda 部署。
python scraper 被打包并部署到 Amazon 的 ECR 中,AWS Batch 根据需要引用/启动图像。
我承认,我对我的 Cron 事件规则采取了一种黑客式的方法:我编写了 CloudFormation 模板,将事件有效负载嵌入为 JSON。
转义的“jsonInput”有点混乱,但是我可以通过这些模板轻松地添加或删除作业。例如,如果我想添加另一个抓取作业,我只需添加带有新的“jsonInput”和“cronExpression”值的“group2a”。
我应该注意到“TemplateURL”路由到指向单个 Lambda 函数的事件规则 CloudFormation 模板,该函数被配置为接收“jsonInput”并相应地将作业分派给 AWS 批处理。
当需要更改时,模板被修改并提交给 Github。一旦 pull-request 被合并到我的主分支,TravisCI 就用最新的更改更新 CloudFormation 堆栈。这个过程让我可以非常简单地放大或缩小我的可伸缩刮刀。
现在整个事情
…这是我的整个解决方案—从 CI/CD 到文本提醒:
作者图片
敬请期待!
你想知道如何在这样一个美女身上得到一笔好交易(你不会相信它的价格)吗?或者你可能对项目本身更感兴趣…
1998 年奔驰 SLK 230(机械增压),50k 英里,硬顶敞篷车(一切工作完美)。是的,它是我的。(图片作者)
如上所述,我将很快写关于我的数据集的后处理。作为先睹为快,我对来自加利福尼亚-梅赛德斯-奔驰两个月的数据的样本数据集进行了一些分析(我现在有大约 6 个月的数据!).猜猜我发现了什么?
根据这个(小)数据集,我的 SLK 是 Craigslist 上所有梅赛德斯-奔驰房源中销售率最高的!
看看这个:
有一款 SLK,销售率约为 38%。作者创建的图表。
这是一些很酷的数据,对不对?
我很想听听你对这个解决方案的想法——剥猫皮的方法不止一种。在下面留下评论!
我们上 Linkedin 连线吧!
干杯!
—亚伦·兰利
使用 Python 获取您的 Spotify 流媒体历史记录
上面有美味的歌曲。
没有这些特征就不一样了。来源
这是我的第一个媒介故事!感谢任何反馈。
如果你像我一样是一个专注的 Spotifyer,通过查看你的流数据,你可以学到很多东西。你倾向于在冬天听悲伤的歌吗?恋爱时你的音乐喜好发生了什么变化?
幸运的是,Spotify 允许你请求下载你所有的流媒体历史记录*。*在本教程中,我将向您展示如何提取这些数据,用美妙的歌曲特色为其调味,并将其组织成一个方便的 CSV 文件,您可以用自己喜欢的工具进行分析。
但是还有更多。到那时,你也将基本了解 Spotify API 如何工作,如何完成授权代码流,以及如何构建自己的 **Spotify 应用。**继续读下去!
但是如果你赶时间的话,完整的代码可以在我的 GitHub 获得。
特征,特征
Spotify 的音频特征是复杂的指标,旨在描述一首歌曲的个性和对听众的总体印象。以下是对每种方法的简要描述:
声学 —如何声学 舞蹈性 —不言自明 能量 —如何‘快、大、吵’ 乐器性 —人声较少, 活跃度越高 —录音中是否有听众 响度 —不言而喻 语速*—* 价态越高
Spotify 还会测量每个曲目的时长、调、模式和拍号。你可以在 Spotify 的文档中了解更多关于功能的信息。
我们需要做的是
首先,我们从 Spotify 获取流媒体数据。由于不包含这些功能,我们从 Spotify API 请求它们。最后,我们将数据导出为我们喜欢的格式。
要求
这个任务的主要需求是 Spotipy 库。我们还将使用请求模块来处理 API。虽然不是必需的,但我还包含了 Pandas ,因为它使得保存和加载表格数据变得非常容易。
确保安装了必要的依赖项:
行动
获取数据
在https://www.spotify.com/访问您的 Spotify 账户仪表盘。在隐私设置中,您会发现请求您的数据的选项。这需要一些耐心。Spotify 说需要 30 天,但通常要快得多。就我而言,我等了三天。
最终你会收到一封电子邮件,里面有你的 Spotify 数据,格式为. zip 文件。提取 MyData 文件夹,并将其复制到您的工作文件夹中。
获取流
我们的文件夹里有几个文件。让我们感兴趣的是这样的: StreamingHistory0.json 。您可能有一个或多个文件,这取决于您的流历史的大小。让我们打开文件。我的第一首歌是这样的:
不错的选择,对吧?
让我们编写一个 Python 函数,它将收集所有的 StreamingHistory 文件,提取 JSON 对象并将它们转换成 Python 字典。
就是这样。现在我们有了历史上所有曲目的时间戳列表。
成为 Spotify 开发者
Spotify 的数据下载中不包括歌曲功能。我们必须通过 Spotify API 请求它们。
访问 API 是免费的,但我们需要注册一个 Spotify 应用程序。别担心:只需要几分钟。在这里报名即可。
恭喜你:你正式成为 Spotify 开发者了!
转到您的新开发者仪表板并点击“创建应用”。不要担心细节。Spotify 将允许你创建虚拟应用,只要你承诺不将它们货币化。但你应该避免在名字中使用“Spotify ”,否则它可能会被屏蔽。
授权代码流
没人能简单地向我解释,所以我来了。一个应用程序可以访问 Spotify API,但前提是它必须获得至少一个用户的许可。因此,我们将使用该应用程序询问自己是否允许访问我们的用户的数据。
*我们需要提供一个“重定向链接”,我们将用来收集用户的许可。在开发者仪表盘的应用面板中,点击“编辑设置”并在**重定向 URIs 下添加一个链接。*这不一定是真实的链接:如果你没有网站,你可以简单地使用http://localhost:7777/callback。
你还需要你的应用程序的客户端 ID 和客户端密码。您可以在应用面板中的应用名称下找到它们。现在,您已经拥有了访问 Spotify API 所需的一切!
访问 Spotify API
现场救援。在这些字段中插入您刚刚收集的变量:
该函数将一个请求打包,该请求从您的应用程序(通过客户端 Id 和客户端机密识别)发送给用户(通过 Spotify 用户名识别)。
该请求有一个范围,它定义了您将要请求的权限。你可以在这里了解更多关于示波器的信息。
最后,你需要提供一个重定向 URI 。这必须与您在应用程序设置中列入白名单的项目相对应(见上一节)。
该函数返回一个令牌,它基本上是一个字符串,我们将使用它向 Spotify API 保证我们拥有用户授权。
一旦您使用正确的参数运行该函数,它将在您的 web 浏览器中打开一个授权面板。点击链接,使用您的 Spotify 凭据登录,您应该会看到如下内容:
现在您终于可以授权您的应用程序了。一旦你点击同意,你将被带到重定向 URI,这很可能是一个不存在的页面。只需复制地址并将其粘贴到 Python 控制台中。
就是这样。如果您在控制台中打印您的令牌变量,您应该会看到类似这样的内容:
访问令牌和刷新令牌
但是还有更多。如果您关闭代码并再次运行,您将不必提供授权,尽管内存中已经丢失了令牌变量。斯波蒂皮似乎记得你的令牌。这里发生了什么事?
如果您进入工作文件夹并启用隐藏文件可视化,您将看到 Spotipy 已经创建了一个名为的新文件。缓存您的用户名。**
如您所见,您的访问令牌有一个有效期,通常为一个小时。但是 Spotify 也给你提供了一个刷新令牌。当原始令牌过期时,您的应用程序可以使用刷新令牌来请求新令牌。
因此,每次运行脚本时调用 prompt_for_user_token 函数来加载令牌是很重要的。如果它找到一个缓存文件,它将使用它。如果您移动或删除缓存文件,您的令牌将会丢失,用户必须再次授权您。
获取身份证
*Spotify 数据下载没有为我们提供曲目的**id。*我们需要这些 id 来获取特性。
我们可以通过使用 API 来搜索我们的轨道名称,获取第一个结果并提取 ID,从而获得 ID。Spotify 在文档中展示了如何构建这样的请求。
我想使用 Python 中的请求库来执行这个任务。由于我还不熟悉它,我在 https://curl.trillworks.com/使用脚本将 curl 命令转换成 Python 请求代码。以下是 Spotify 的 curl 命令示例:
*curl -X GET "https://api.spotify.com/v1/search?q=tania%20bowra&type=artist" -H "Authorization: Bearer {your access token}"*
这是我在 curlconverter 的帮助下写的函数:
让我们测试我们的功能:
很好。将 ID 粘贴到 Open Spotify 中,获得大量经典音乐。
获取特征
现在我们有了自己的 id,从 API 中获取特性就变得轻而易举了。
让我们在赛道上测试一下:
包装它
精彩!现在我们已经拥有了构建我们的流历史数据框架所需的一切。最简单的方法是创建一个字典列表:
(如果您的历史记录中有数千首歌曲,从 API 获取数据可能需要相当长的时间。我建议您首先在一个样本上测试您的代码。)
瞧。我们有一堆不错的流媒体工具,还有一些功能。现在,我们可以使用 Pandas 将字典列表转换成数据帧,并将其导出为 CSV 格式。
我们完成了!
如果你浏览我的 GitHub ,你会发现我的代码有点不同。当您重复 API 请求时,您可能会得到在第一次运行时被拒绝的响应。此外,将来您可能希望用新的一批流重新运行代码。但是 API 请求很慢,所以我添加了保存已经收集的 id 和特性的函数,允许您在不重复旧请求的情况下提出新请求。
下一步是什么?
一旦你有了所有特性的流媒体历史,你就可以拿出你的 Pandas/Matplotlib 技能来分析和绘制它们。你甚至可以应用机器学习来回答一些有趣的问题。
如果你有一个朋友和伙伴喜欢 Spotify,你可以用这个脚本向他们展示他们的历史。只需在您的代码中输入他们的用户名,向他们发送授权链接,并确保他们向您发送重定向 URI。
接下来,我将探讨如何分析我们刚刚收集的数据。同时,你可以查看其他关于这个主题的酷文章。
我的第一个媒介故事到此结束。感谢阅读!
在亚马逊获得商业智能实习:我是如何做到的
办公时间
这个过程的不同阶段,这样你也能做到。
尼古拉斯·J·勒克莱尔在 Unsplash 上的照片
获得第一份工作经历是有史以来最难的事情。如果你在此之前做过一两次实习,事情会变得容易得多。这就是为什么我决定用间隔年的时间让自己获得一些实习经验。我的第一份实习是在巴黎的一家法国初创公司,当时我是一名全栈开发人员。就在刚才,我得到了我在亚马逊卢森堡的第二份实习,作为一名商业分析师。
我总是从外部寻找力量和信心,但它来自内心。它一直都在那里。—安娜·弗洛伊德
我知道没错。亚马逊。这是一次如此伟大而宝贵的经历。除了作为一家知名的科技公司,他们还会给实习生提供真实、有趣的工作,所以他们有具体的工作主题和产品。
在亚马逊或其他大型科技公司实习也不是不可能的。这个过程可能会很长,但如果这是你想要的,那就值得你花时间去做。
我 6 个月前开始申请
回到 2020 年 4 月,深陷新冠肺炎危机的我不得不找一份实习工作。所以我打开了亚马逊工作和申请每一个符合我兴趣和能力的实习岗位。我没有错过一个,我不断地检查我的申请状态,并检查新开放的职位。
它可能看起来又长又整洁,而且完全令人沮丧。但这是值得的。亚马逊有大量的应用程序,所以可能他们还没有打开你的。直到他们知道。就那一次你确实被注意到了。这就是我的遭遇。
我参加了第一轮面试
我记不太清楚了,因为那是 6 个月前的事了,当时我从没想过我会真的得到实习机会。但是有三个主要步骤:
- **30 分钟 RH 筛选,**关于我的背景和性格的基本问题。
- 1h 技术面试关于我的项目、经验和知识。这是由亚马逊领导原则和技术问题准备押韵。
- 1h 技术面试,真的技术,关于机器学习和数据科学。这是一个带有基本问题的研究案例。
不幸的是,当时我对数据科学并不是很感兴趣,我在机器学习方面的知识也很贫乏。第三位面试官给了我一些关于阅读书籍和在线课程的建议。很明显,他告诉我他不能接受我的实习。
我学习了很多。
虽然我很失望,因为我觉得我的机会已经消失了,但我也对自己能够走这么远印象深刻。事实上,上一位面试官建议我如何进步并获得实习机会,这意味着我可以做到。
所以我一头扎进去,打开书,订阅课程,用额外的时间争取实习机会。这是他告诉我要学的东西,为了在亚马逊获得应用科学实习。
- 【Coursera.org】**😗*机器学习,作者吴恩达。斯坦福大学。如果你之前没有任何机器学习方面的知识,或者你想加强你的知识,这是从哪里开始。
- coursera . org:深度学习专业化(5 门课程证书)。Deeplearning.ai. 是更高级的课程,几乎涵盖了你开始职业生涯需要知道的一切。
- **书 : **统计学习入门。特雷弗·哈斯蒂和艾尔。这本书很棒,可以让你更多地了解数据科学的数学方面。没有任何统计知识,感觉一个人对机器学习理解不了多少。
我向前看了。
最终,我需要找到一份实习工作。由于危机,我不能出国,所以我把注意力集中在巴黎的报价上。在那里,我找到了一份完整的开发者实习。获得一些新的经验,迈出在团队和公司工作的第一步,这很棒。
6 个月后我又试了一次
终于,我到了需要找第二份实习的时候了。我在想我想做什么,我想研究的课题。我知道我不想成为一名网络开发人员,尽管我喜欢这种经历,但我想尝试一些新的东西。
机会向我走来。
一天早上,我在 LinkedIn 上收到了一条私人信息,然后是一封来自亚马逊招聘人员的电子邮件,问我是否有兴趣在一个尚未确定的团队和地点进行商业智能实习。我想了想,尽管存在不确定性,但实习的目的吸引了我。我决定试一试。这一次,它可能会成功。
我又经历了一遍面试过程。
由于实习的主题不同,实习的过程也不同。我需要其他技能。事情是这样的。
- 与招聘人员打 10 分钟电话,确认我对实习感兴趣,并向我解释接下来的步骤。
- 1 技术带回家测试。这是 3 个 SQL 问题。
- 2 个 30 分钟的技术访谈。同样,他们是基于亚马逊领导原则和他们的问题准备。
关于 SQL 带回家测试。
任何形式的实习都需要技术测试。有用来测试你的逻辑技能,你的效率,和你的能力,以提供适当的结果。这里有一个 SQL 测试是有意义的,因为我将不得不使用数据库。
这个测试是一个基本的 SQL 测试。我得到了一个大约有 5 个表的数据库,我必须回答 3 个带有查询的问题。它们的难度相同,但是测试了不同的 SQL 行为和功能。
这里唯一的准备方法是了解你的 SQL 基础知识(实际上不仅仅是基础知识)。参加一个课程,或者读一本书,练习一下。你需要掌握 SQL 函数和特性。
关于技术面试。
对于技术面试,亚马逊明确告诉你如何准备。你必须准备好将你的经验与他们的领导原则联系起来,并且准备好回答他们的问题。
如果招聘人员问你的问题并不总是在他们的问题清单上(这是最好的),所有的问题都非常相关,如果你准备好回答他们列出的所有问题,你应该能够正确回答。
招聘人员不是来骗你的,他们是真的对你和你的工作感兴趣。试着向他们展示你对自己的工作充满热情,一切都会进展顺利。
分析采访。
在两次 30 分钟的面试后,我思考了一下,发现了招聘者感兴趣的四大类。我把我被问到的问题分成了几类,这样你就可以知道会发生什么了。
关于自己
- 你为什么对这个实习感兴趣?
- 你认为你的实习会怎么样?
- 在技术团队中工作,你会更舒服,还是与从事技术性较低主题的人一起工作更舒服?
经历
- 你什么时候冒过险,犯过错误,或者失败过?你是如何回应的,你是如何从那次经历中成长的?
- 告诉我你培养同事的一次经历:阻止他们犯错,帮助他们?
- 告诉我你分析过的最大的课题。你是如何进行的?为什么?结果如何?
团队项目
- 说说你作为工程师在团队中的角色?具体做了什么?
- 你是如何在团队之间分配工作的?你是如何计划时间,组织你们之间的工作的?
- 你从这个团队项目中学到了什么?
手法
- 您必须处理的最大数据集是什么?你害怕处理那么多数据吗?
- 习惯使用 SQL 和 Python 吗?
- 你最习惯哪种编码语言?给我一些你做过的项目的例子。
现在呢?
技术面试后的第二天,我收到了一封电子邮件,提供了运输和物流团队的一个职位。考虑过后,权衡利弊,我接受了这个提议。现在我正处于入职流程中。不过不用担心,一旦到了,就顺其自然吧,一切都会按时发生的。
所以,如果这是你真正想要的,请不要放弃。努力工作。即使你没有马上看到结果,你的工作总会在以后得到回报。如果上个月有招聘人员联系我,那是因为我已经花了一些时间事先申请、参加考试、回答问题等。
当你觉得某样东西是为你而做的时候,得到它的最好方法是努力完成过程的每一步,并确保你检查了每一个要求。祝好运!
获得数据科学工作比以往任何时候都难
如何利用找工作的困难来为自己谋利
马丁·佩希在 Unsplash 上的照片
介绍
在写这篇文章的时候,我正在寻找一份新的工作,作为一名数据科学家,因为我和前一家公司的新冠肺炎通信有困难。
这一次,我注意到事情似乎比我上次上市时要困难得多,但我没有利用这些挑战来延长我们成为数据科学家的梦想,或在最糟糕的情况下结束这些梦想,而是努力更好地理解这些挑战,以便我可以提出一些解决方案,使它们最有利于我,现在也有利于你!
古怪的工作要求
这似乎是我与数据科学求职者进行的大多数讨论中的一个主题
没人觉得自己有资格了。
许多数据科学职位描述没有传达广告中角色的实际要求。
这种情况的一个主要影响是,有抱负的数据科学家根据工作描述优先考虑他们的个人和技术技能,这可能会误导对履行角色的要求。另一个问题是招聘人员会收到大量不符合要求的申请。
根据 Jeremie Harris 的一篇精彩文章,标题为 数据科学职位发布的问题 有很多原因可以解释为什么一份工作描述看起来难以理解,这取决于你来辨别你所在的职位属于哪一类:
- 解决问题的方法很多,所以很难把范围缩小到一个工作描述
- 新的数据科学团队可能会鼓励人们成为万事通,这将转化为工作描述
- 公司缺乏经验来了解他们有什么问题,以及能够解决这些问题的人应该具备什么能力
- 由招聘人员撰写
解决方案
虽然这需要你有一定的洞察力,但重要的是要确定奇怪的工作描述的潜在原因,因为一些场景可能对你作为数据科学家的成长有害,例如成为一名万事通。
克服这一挑战的一个很好的方法是承认职位描述只是公司的愿望清单,他们想雇用他们认为有能力解决他们实际存在的问题的人。
关于这一点,一定要展示你的能力,让别人(公司)觉得你有能力应对他们的挑战。此外,如果你满足了任何职位描述中至少 50%的要求,那么你很有可能是合格的,并且绝对应该尝试去应聘这个职位——如果你 100%满足了职位描述,那么你很有可能资历过高。
数据科学变得越来越商业化
能够旋转 Jupyter 笔记本并进行一些可视化,然后建立一个模型,这在过去是可行的,但在我看来,这已经不足以引起你的注意。
Jupyter 笔记本电脑非常适合进行实验,但是当你进入现实世界时,我们就会越过实验阶段。我相信,每个数据科学家都应该知道如何组装 Jupyter 笔记本,但随着数据科学变得越来越生产化,可以编写生产级代码的数据科学家会获得加分,因为这样可以节省成本和时间。
以下是每个数据科学家都应该知道如何编写生产级代码的 3 个理由:
- 在从数据科学家到工程师的翻译过程中,有些东西可能会丢失
- 消除流程中的延迟
- 一石二鸟,因为一个人可以做两个人的工作——让你更有价值
解决方案
虽然有争议,但我相信当涉及到面向数据科学应用的产品时,数据科学家和软件工程师的技能正在趋同,因此更多的数据科学家应该学习软件工程最佳实践。
成为不可或缺的数据科学家
towardsdatascience.com](/data-scientist-should-know-software-engineering-best-practices-f964ec44cada)
鉴于你已经知道如何编写生产级代码,你可能想看看肖恩·惠勒的文章标题为 “生产化”数据科学意味着什么? 异常总结了数据科学生产的代码级最佳实践之外的系统应用焦点——至少可以说这是一篇非常有趣的文章。
“某样东西‘投入生产’意味着它是从企业到客户的管道的一部分。[……]在数据科学中,如果某样东西在生产中,它就在将信息放在消费它的地方的路上。”
竞争
数据科学是这个星球上发展最快的新兴技术之一,成千上万的人蜂拥而至更新他们的技能,以尝试成为一名数据科学家。如果你不相信我,自 Coursera 开设吴恩达机器学习课程(这是数据科学的重要组成部分)以来,已经有超过 350 万人注册了该课程。
这是 21 世纪最性感的工作。
现在越来越多的人试图进入这个领域,因此工作竞争非常激烈。但是,这不一定要成为决定不找工作的理由!
解决方案
是的,我们应该做得更多来脱颖而出,但是根据我最近在 LinkedIn 上做的一项民意调查,这并不一定意味着拥有最漂亮的简历。
来源: Kurtis Pykes 领英
当然,拥有一个优秀的投资组合是脱颖而出的一个很好的方式,然而,在增加你获得机会的机会方面,似乎是不可战胜的是接触招聘经理或你申请的职位中的高级职位的数据科学家。
LinkedIn 让找到在特定公司工作的人变得如此容易,所以在申请工作时,它应该成为工作申请过程的一部分。
结论
在数据科学领域很难找到工作的事实永远不应该成为你没有工作的理由。任何工作本身都会面临许多挑战,获得这份工作只是一个资格阶段,看看雇主是否相信你有能力面对挑战,以及你是否相信雇主是你希望加入的团队。永远寻求提升自己,不要等着准备好申请,因为你可能永远都不会觉得自己准备好了,不要害怕被拒绝或拒绝与你的目标不一致的公司。
让我们在 LinkedIn 上继续讨论…
[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
获得一份机器学习工程学士学位的工作
在 Unsplash 上发现的图像。com
我是一名机器学习工程师,是人工智能语音识别初创公司的一部分。现在,对于机器学习工程师来说,有大量不同的工作描述,所以让我们定义一下我是做什么的。
我是我们小型创业公司深度学习团队的一员。为了强调我们有多小,我是整个创业公司的第二个机器学习工程师和第三个雇员。我的工作是研究和开发各种深度学习方法,这需要实施和训练新的神经网络架构,在大型计算集群上扩展我们的 ml 训练基础设施,并找出如何最佳地优化生产模型。作为一个小团队,我很自豪地说,我们已经构建了世界上性能最好的语音识别服务之一,击败了谷歌、AWS 和微软等科技巨头!
我从经验中知道,看任何机器学习的招聘信息都会令人沮丧。遇到要求硕士或博士等高层次学位的职位是很常见的。有些帖子甚至要求一个框架的经验比这个框架存在的时间还要长。
我有计算机科学的学士学位。我和拥有非相关计算机科学领域学位的人一起工作过。我和一些连学位都没有,还在专业做机器学习的人合作过。
在这篇文章中,我想谈谈我为找一份机器学习的工作所采取的步骤,以及它对你来说是如何可能的。现在我知道我的道路不是唯一的道路,但它是一条适合我的道路,我希望向你展示一条通往你想要的职业生涯的可行之路。
从对基本面的高度理解开始
我几乎是从有史以来最伟大的知识库–互联网上学习机器学习的。很多资源会建议你先从基础开始,比如统计和概率、线性代数和微积分。他们说你需要在开始之前深刻理解那些数学科目。这是因为这是一个博士持有人最有可能进入机器学习的方式。
但我是一名创造者,通过构建项目学习效果最好,所以我选择了一条可以让我最快开始创作的道路,那就是对 ML 理论有一个非常简要和高层次的理解。对 ml 理论有一个简要和高层次的理解就像有一个指南针来指导你解决 ML 问题。你可以通过阅读一堆与 ml 相关的博客文章、快速浏览一本综合书籍或参加在线课程来达到这种理解水平。
开始建造吧
第二步是我学到最多的地方。开始制造垃圾吧。任何事。做什么项目都不用想太多。当你开始自己动手建造时,你会遇到各种各样的问题。你的 ml 算法不行,你的数据乱七八糟,你连一个简单的 python 库都无法正确安装。这是你在实际工作中会遇到的事情。
当这种情况发生时,不要放弃,使用互联网,寻求帮助,解决你和你的目标之间的问题。当你被迫深入挖掘,让东西发挥作用时,那就是你真正开始理解直觉的时候。你将知道什么是张量,或者正确的损失函数如何依赖于你的模型目标,或者为什么数据的基本统计和分布很重要。
我建议继续建设,从一个项目跳到另一个项目。一个项目建议是选择一个你感兴趣的人工智能领域,例如,deep fakes。通读一些论文,然后尝试实现它们。作为一名机器学习工程师,我花了很多时间阅读和实现不同的论文,因此技能集至关重要。
但是说实话,你已经完成的任何项目在你的投资组合中都是不错的,因为这是你在专业工作中会接触到的东西。目标是获得一些实际的实施经验,而不需要大量的手工操作,同时也形成一个体面的投资组合来炫耀。
如果你想加入一个社区来展示你的项目,提出问题,分享知识,或者只是一般的互相帮助,加入我的不和谐频道 人工智能黑客 。
接触创业公司
第三步,说服一家公司给你一个机会。对某些人来说,这可能是你旅途中最艰难的部分,但也不尽然。我说服了我以前工作过的一家初创公司给我一个实习机会。我被许多人忽视,但我很自信。为了获得我在机器学习领域的第一个实习机会,我发出了多封电子邮件,让他们知道如果他们愿意,我有信心为他们提供价值。
不要发太多垃圾邮件,那样会让人讨厌,所以在找工作时要考虑周到。他们最终雇用了我,因为我就像一只友好的蜜蜂在他们的空间附近嗡嗡叫,提醒他们嘿,如果你让我,我可以给你做一些非常甜的蜂蜜。
这一部分并不容易,甚至会比到达这里的学习之旅更加令人沮丧。充分利用大数定律。走出去,向各种各样的公司推销自己。
如果你坚持不懈,就会有回报。
交付!
如果你获得了第一份工作,现在你需要去实现它!你已经从自己的项目中获得了大量解决 ml 问题的技巧,你只需要在为一家公司工作时运用同样的原则和技巧。
唯一的区别是你现在有公司资源。这意味着更多的计算、更多的数据和一个让你负责的老板。这是你学习机器学习或大规模进行机器学习的实用性的地方。当你有公司资源的时候。你将开始在 ML 的真正力量上建立直觉。您还将学习如何在现实世界的约束下构建可用的系统。例如,构建一个需要在移动设备上实时运行的模型。
机器学习专家
在你的第一份工作之后,无论是实习还是全职,你现在都有了 ML 工程师的职业经验。现在如果你选择开始申请其他工作,你会更有信心。你会成为一个非常抢手的人,可能比拥有博士学位的人有更多的行业经验。
包裹
这是我走上尖端 ML 的道路。它对我有效,我相信如果这是你的选择,这条路也会对你有效。归根结底,不管你有没有学士学位、硕士学位,或者根本没有学位,ML 领域都是部分艺术部分科学。
科学是理论,艺术是将理论付诸实践。如果你能在 ml 中建立理论和艺术的能力,即使你有更高的学位也没关系。无论如何,许多公司都不再需要学位了。如果你生活在一个前所未有的获取知识的世界,那么你能做的就是一切,有收据为证。
🥇注册我的 电子邮件简讯 ,了解最新文章和视频!
✍🏽想要更多内容?查看我的博客https://www.michaelphi.com
📺喜欢看基于项目的视频?看看我的 Youtube !
使用这个 Python 脚本获取 Amazon 价格下降警报
刮亚马逊获得降价预警!
格伦·卡斯滕斯·彼得斯——Unsplash的照片
Python 做了很多奇妙的事情。而且,这种美丽的语言几乎没有做不到的事情。当涉及到数据分析、web 抓取或任务自动化时,大量的库使得这种语言一枝独秀。
试想一下,你想买一部新 iPhone。你厌倦了一遍又一遍地查看亚马逊网站。但是,它的价格没有下降,你总是失望。
如果,有一个自动价格检查器,会给你一个电子邮件提醒,如果有价格下降。令人兴奋,不是吗?让我们通过编写一个 Python 脚本来做同样的事情。
库配料
import smtplib
import time
import requests as rq
from bs4 import BeautifulSoup
主要有三个库可以为我们完成这项工作。Requests 库将与 HTTP 服务器通信,Beautiful Soup 将与网页通信并提取网页元素,smtplib 将向您发送电子邮件警报。
肉 码
site = "https://www.amazon.in/Apple-iPhone-11-64GB-Green/dp/B07XVKBY68/ref=sr_1_7?keywords=iphone+11&qid=1573668357&sr=8-7"header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'}
首先,我已经请求了亚马逊 iPhone 网页的网络服务器。然后,我创建了一个 soup 对象来解析网页。我们只想要产品的价格。所以,使用“选择”方法,我们可以得到产品的价格。
def get_price():
html = rq.get(site, headers=header).text
soup = BeautifulSoup(html, 'html.parser')
price = [i.get_text() for i in
soup.find_all('span', {'class': 'a-size-medium a-color-price priceBlockBuyingPriceString'})]
final_price = ''.join(price)[2:8]
final_price = int(final_price.replace(',', ''))
if final_price < 64900:
send_email()
现在,每当“新价”变得小于“刮价”时。必须向用户发送一封关于价格下降的电子邮件。
我们将使用 smtplib 库向用户发送电子邮件。首先,我们将创建一个 SMTP 对象来与域的 SMTP 服务器通信。
一旦一切都完成并设置好,我们就可以登录我们的电子邮件帐户了。然后,将电子邮件发送给收件人。
def send_email():
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.ehlo()
server.login('Your email address', 'Application-specific password')
subject = "Price fell down"
body = "Check this link: https://www.amazon.in/Apple-iPhone-11-64GB-Green/dp/B07XVKBY68/ref=sr_1_7?keywords=iphone+11&qid=1573668357&sr=8-7"
msg = f"Subject:{subject}\n\n{body}"
server.sendmail('Sender's email', 'Recipient email', msg)
print("Hey, email has been sent!")
server.quit()
注意:smtplib 中的参数可能会更改。SMTP()取决于域的 SMTP 服务器。如果您有 Gmail 帐户,您必须为您的电子邮件地址生成特定于应用程序的密码。否则,当您的程序试图登录时,您将得到一个特定于应用程序的需要密码的错误消息。
while True:
get_price()
time.sleep(60)
这 40-50 行代码将为您完成这项工作。下一次,你不必一次又一次地查看网站上的价格下降。为其他电子商务网站制作这样的程序,节省您的时间和精力。
有关讨论和疑问,请通过 Linkedin 联系我!
Shell + 5 常用命令入门
面向初学者的 Shell 介绍
Goran Ivos 在 Unsplash 上的照片
唱空壳可能会令人生畏。喜欢拥有漂亮用户界面的工具是可以理解的。在我们看 shell 之前,shell 到底是什么?
定义外壳
让我们简单点,从我们如何使用电脑开始。把你的电脑想象成一个等待指令的机器人。对于您的大多数需求,您使用应用程序让计算机执行操作。例如,现在你正在使用一个互联网浏览器应用程序(比如谷歌 Chrome)来阅读这篇文章(除非你使用的是中型移动应用程序,我绝对推荐下载)。应用程序是你与计算机交流的方法。换句话说,我们不会对着电脑说话,口头告诉它“打开互联网浏览器,进入 Medium。”我们让应用程序来做这件事。应用程序扮演着重要的角色——它们将我们想要做的事情翻译成计算机可以理解的指令。不同的应用服务于不同的角色。谷歌 Chrome 用于浏览互联网,微软 Word 用于键入文章,Finder/File Explorer 用于访问文件。
**Shell 是我们与计算机交流并使其执行动作的直接方式。用专业术语来说,它是一种命令解释程序和编程语言。**不用通过 Finder 之类的应用程序来查看你的文档,你可以使用 shell 直接指示电脑显示你的文档。这种与计算机直接交流的渠道给了我们更多的权力去控制我们想要计算机做的事情。
看贝壳
现在回到我们关于壳牌令人生畏的观点。让我们看一个例子。
在 Finder vs. Shell 上删除文件
假设您想要删除一个名为myFile
的文件。在 Finder(或 PC 的文件资源管理器)上这样做既简单又直观。你进入 Finder,找到myFile
,右键点击文件,选择移动到垃圾桶/删除。简单。
使用 Finder 删除文件
当使用命令行时,它可能看起来更困难和可怕,尤其是对于第一次使用的用户。在 Mac 上,打开“终端”(按 command 和空格键,键入 Terminal,然后按 Enter)。要删除myFile
,你可以输入代码进入你的文档,然后输入代码查看你的文档以确保myFile
在那里,最后用更多的代码删除myFile
。见下文。
使用终端删除文件
如果你以前从未打开过命令行界面(命令行界面是你输入 shell 命令的程序 Mac 上的终端或 Windows 上的命令提示符),你可能对上面的 gif 很感兴趣。或者受到恐吓。或者两者都有。以下是用户喜欢避免 shell 的三个原因:
- **你需要知道命令。**在 Finder 上你可以用鼠标导航,但是命令行界面只接受通过键盘输入的文本。这需要记忆必要的命令。在上面的例子中,
rm
是删除文件的命令(rm 是 remove 的缩写)。 - 更容易搞砸。使用 shell 可以让您更好地控制任务。所以害怕输入错误的文本,害怕做错事,比如删除一堆文件,是可以理解的。
- 有好用的应用 (Finder/File Explorer,FileZilla 等。)
您可能已经被说服避免使用命令行界面。但是壳牌证明了它的强大。
为什么要用 Shell?
大多数开发人员角色都需要了解 Shell
如果您正在从事任何涉及编码的工作(软件开发人员、数据工程师、数据科学家等),您可能会在职业生涯的某个阶段使用 shell。熟悉使用 shell 将提高您的工作效率,并向您的团队展示您的经验。
对于许多开发人员工作来说,如果一个候选人不知道如何使用 shell,那么得出他们没有太多经验的结论是合理的。作为一名数据工程师/科学家,我每天都需要使用 shell。
Shell 允许您自动化重复的任务
您可以在命令行上完成许多任务,而使用 Finder 等标准应用程序则不那么容易。假设你正在研究加拿大的新冠肺炎病例。要获得每日更新病例数的 CSV 文件,您需要访问加拿大公共卫生网站并下载 CSV 文件。如果文件每天下午 6 点更新,那么您需要每天获取更新的文件。这意味着每天下午 6 点以后,你需要去网站下载文件。
从加拿大公共卫生部下载新冠肺炎病例的 CSV 文件
将这与在 Shell 中下载文件进行比较。你所需要做的就是打开终端,并键入以下内容:
curl -O [https://health-infobase.canada.ca/src/data/covidLive/covid19.csv](https://health-infobase.canada.ca/src/data/covidLive/covid19.csv)
让我们分解代码。curl
是从链接下载文件的命令(curl 是 C lient URL 的简称)。-O
是一个可选的标志(我们将很快探索这个标志),它告诉计算机我们想要以原始名称保存文件(O 代表原始)。最后我们传递下载链接。总而言之,我们告诉计算机在给定的链接下载文件,并以其原始名称 covid19.csv 保存文件。
使用 Shell 下载文件链接
真快!无需打开互联网浏览器,转到链接,然后滚动到下载按钮。只需键入一行,就大功告成了。你可能会想,从网站上下载文件真的没什么大不了的。但是,如果您的研究需要您每天下载文件,您可以使用编写一个简单的 shell 脚本(只需一次)来自动完成这项日常任务。因此,每天下午 6:05(或者我们在脚本中指定的任何时间),新的每日文件都在您的下载文件夹中。这已经为你节省了几分钟的时间。现在想象一下,如果您每天需要下载多个文件,您将节省多少时间。
使用 shell 还有许多额外的好处。但是我们先来探究一下 shell,简单了解一下如何使用。
Shell 命令快速介绍
Shell 命令的使用方式如下:
command [-flag] [parameter]
- 命令是您想要采取的操作。例如,
ls
命令的意思是列出一个文件夹的内容。我们将很快回到ls
。 - [-flag]是您可以指定的可选详细信息。请注意,您实际上不需要键入方括号。方括号表示这部分代码是可选的。例如,默认情况下,
ls
命令不会列出以点号开头的文件。你的探测器也一样。要列出这些文件,键入ls -a
(-a 表示列出 a ll 文件)。
- [parameter]是要对其执行命令或操作的实体(路径/文件/链接)。注意方括号,意味着参数部分是可选的。对于
ls
,默认情况下,它会列出你所在文件夹的内容。你可以通过阅读%
符号前的文字来判断你在哪个文件夹。在这种情况下,我们在文档中。如果要列出不同文件夹的内容,需要将文件夹名作为参数传递。假设我们的文档中有一个名为“StayPositive”的文件夹。要查看 StayPositive 文件夹中的内容,请将 StayPositive 作为参数:ls StayPositive
。
保持乐观的 5 个理由:)
需要知道的 5 个命令
你不需要掌握使用命令行界面。如果你试图学习它,你会不知所措。另外,如果您不经常使用命令,您很可能会忘记它们。这里有五个您应该知道的经常使用的 shell 命令。
ls(列表)
List 的缩写,ls
是列出一个目录的命令。如果你输入ls
并按下回车键,你会得到一个存储在你所在文件夹中的文件列表。
光盘(更改目录)
cd
命令用来改变你正在查看的目录。这就像在 Finder 中用鼠标点击目录/文件夹来查看其内容一样。例如,cd Documents
将带您到您的文档目录。使用前面的命令,如果您键入ls
,您可以列出您的文档中的内容。
cd 和 ls
手动(手动)
每当你不知道如何使用一个命令,或者忘记传递哪个标志时,使用man
。man
将显示你作为参数传递的命令的帮助手册。这里我们用man
来列出如何使用ls
。请注意,您可以使用鼠标或按空格键来滚动手册。每按一次space
,页面就会向下滚动。当您准备退出手册时,按q
退出。
rm (删除文件)
rm
用于删除一个文件。需要注意的是rm
将会完全删除文件,而不是将它移动到垃圾箱。要使用rm
,包括文件名作为参数。所以要删除我的文件,输入rm myFile
。
mkdir (制作目录)
mkdir
将制作一个目录/文件夹。将目录名作为参数传递。要创建 myFolder,请键入mkdir myFolder
。
学习 Shell 的后续步骤
虽然这篇文章向您介绍了 shell 和常见命令,但我建议您参加一个关于 shell 的入门课程,以便更好地理解。网上可以找到一堆。谷歌一下“学壳”就行了。我最喜欢的两个 shell 课程是 DataCamp 的—Shell 简介和使用 Shell 进行数据处理。注意,这些课程只有第一章是免费的。我和 DataCamp 没有任何关系,我只是从他们的互动练习中受益匪浅。
当你遇到一个你要执行的任务并想自动完成它时,你的学习成果就会显现出来。一定要在 google 上搜索如何使用 shell 自动完成这项任务。很可能有人已经问过同样的问题并得到了答案。你将开始自动化你从来不知道的任务,这些任务是如此容易自动化。下次再见,学习愉快!
更有效地利用谷歌搜索查找数据
作者图片
“数据!数据!数据!”他不耐烦地喊道。“没有粘土,我无法制砖。”
《铜榉树历险记》中的夏洛克·福尔摩斯,亚瑟·柯南·道尔爵士
在数据科学过程中,数据的重要性怎么强调都不为过。数据分析任务的结果代表了输入其中的数据类型。但是,有时候获取数据本身也是一大痛点。最近,我用免费工具做了一个名为 数据新闻和可视化的短期课程,通过这个课程分享了一些很棒的资源。我将通过一系列文章来分享一些有价值的技巧。在这些文章中,我将试图强调一些你可以在互联网上免费找到数据的方法,然后用它来创造一些有意义的东西。
这篇文章是寻找好数据集的完整系列文章的一部分。以下是该系列中包含的所有文章:
第 1 部分 : 为数据分析任务获取数据集——高级谷歌搜索
第 2 部分 : 为数据分析任务寻找数据集的有用站点
第三部分 : 为深度学习项目创建定制图像数据集
第四部分 : 毫不费力地将 HTML 表格导入谷歌表单
第 5 部分 : 使用 Camelot,从 pdf 中提取表格数据变得很容易。
第六部分 : 从 XML 文件中提取信息到熊猫数据框架
第 7 部分 : 5 个真实世界的数据集,用于磨练您的探索性数据分析技能
高级谷歌搜索
让我们从高级谷歌搜索开始,这是访问公开可用数据集的最常见方式之一。只需在搜索栏中键入所需数据集的名称,我们就可以访问大量的资源。然而,这里有一个简单的技巧,可以在很大程度上简化这个过程,并帮助您在互联网上找到特定类型的文件。
1.使用要下载的文件的文件名和扩展名
假设我们手头有一项任务,要查找 CSV 格式的医疗保健相关数据。CSV 文件表示逗号分隔值文件,允许以表格形式保存数据。要获取此类文件,请进入谷歌搜索栏并键入以下内容:
filetype < the extension of the file to be downloaded>: <category of data> data
作者图片
谷歌将列出与搜索结果最匹配的链接。大多数情况下,这将是指向网站上特定文件的直接链接,这些文件可以下载到本地系统上,供以后分析。
2.使用文件名、扩展名和站点名称
如果你想进一步缩小搜索范围,这个选项会派上用场。提到文件名就会指向很多文件。但是,如果您想查找特定网站的数据,也可以在搜索栏中提及,如下所示:
filetype < the extension of the file to be downloaded> : site <website> <category of data> filetype xlsx: who.int health
作者图片
现在所有的结果都只与世卫组织有关,这有助于大大缩小搜索结果的范围。
与搜索命令兼容的文件
与搜索命令兼容的文件有哪些种类?可以通过主页上的设置轻松访问这些信息,如下所示:
- 点击
Settings
>Advanced Search
- 向下滚动到
file type
选项,寻找可用的类型。您会看到有许多选项,包括 pdf 和 ppt 文件类型。
作者图片
结论
在本文中,我们研究了通过标准的 google 搜索更快更有效地找到我们想要的数据集的方法。我们研究了仅仅添加一个文件扩展名和一个网站名称如何帮助更有效地过滤结果。当我们知道我们在寻找什么样的数据时,这些技术会很方便。
最初发表于【parulpandey.com】。
通过 Streamlit 获得能力:为数据科学家创建和部署 web 应用程序
如何开始
无论是新手还是经验丰富的数据科学家,我敢打赌,在某个时候,您可能会想到超越本地 machine & Jupyter 笔记本,将您的数据科学项目发布到野外。
那么是什么阻碍了你呢?
人们普遍认为数据科学家是无所不知的独角兽——从 HTML、CSS、Javascript 到各种软件工程工具和框架。但我们知道事实并非如此。仅仅因为你擅长为数据科学问题编写代码,不一定你也会有 web 开发和软件工程技能。将代码投入生产需要完全不同的技能,你可能有也可能没有。
现在在这条生产流水线上有了一条捷径。你可以成为一名伟大的数据科学家,并且仍然能够部署你的项目,而不需要具备 web 开发和软件工程技能。
由 Streamlit 为您带来。
什么是 Streamlit?
" Streamlit 的开源应用框架是数据科学家和机器学习工程师在几个小时内创建漂亮、高性能应用的最简单方法!全是纯 Python。全部免费”——这解释了你需要知道的关于定义的一切。
在所有这些好东西的背景下,我想提前警告你——Streamlit 是为 Pythonistas 准备的!不幸的是,如果您对 R 或另一种编程语言感兴趣,除了将几个项目翻译成 Python 并探索 Streamlit 及其功能之外,您什么也做不了。
为什么说 Streamlit 是革命性的?
在公共话语中,我们经常听到诸如赋权、赋权于人等流行词汇。我认为描述 Streamlit 对数据科学领域的贡献的最简单的方式是,它真正赋予了所有应用领域的数据科学家力量。
我已经说过了,但如果还不够清楚的话——你不必是 web 开发或软件工程方面的专家,Streamlit 让你只需付出一点点努力,就能把你的项目变成一个专业外观的应用程序。我几乎可以保证,即使你以前从未听说过 Streamlit,你仍然可以在接下来的一两天内创建你的第一个 web 应用。试一试吧!
如何开始
首先,除了streamlit
包本身,你完全不需要任何东西来开始构建第一个应用。将包导入到您的 Python 环境中,您就可以开始了!
以下是我对你从绝对起点开始的建议:
- 首先,查看一些其他人制作的示例项目,以便您了解 Streamlit 的功能。例子: COVID 数据跟踪器;文本分类。
- 观看 Streamlit 团队发布的 4 个 YouTube 视频:简介、安装、搭建 app 、用例。
- 查看 Streamlit 的欢迎页面了解如何安装软件包。
- 通读 API 参考页面(将该页面标记为书签,因为您会经常回到该页面)。
- 启动您的 Python 环境,开始您自己的项目。不要从一个复杂的项目开始,而是做一些非常简单的事情。你所在领域的探索性数据分析的 app 怎么样?
总之,我要再次强调的是,Streamlit 的真正贡献是它能够让数据科学家做一些事情,如开发和部署应用程序,这些工作传统上是由组织中不同类型的专家完成的。如果你已经在用 Python 做你的项目了,这只是感觉被授权的一个额外的步骤!
熟悉生物朱莉娅:朱莉娅的生物信息学
走出我的舒适区,用 Julia 语言尝试一门新的应用科学。
ulia 是一种伟大的编程语言,通常与它强大的统计分析和机器学习能力联系在一起。然而,许多人可能知道,Julia 实际上有一套相当成熟和成熟的其他应用科学软件包。一些著名的例子包括 Yao.jl 的量子模拟,JuliaAstro.jl 的天文学(我也很想看看这个),QuantEcon.jl 的定量经济学,甚至 QuantumBFS.jl 和 QuantumOptics.jl 的量子物理学。有了 Julia 的这个丰富的科学计算生态系统,就很容易明白为什么许多科学家在业余爱好或工作上是朱利安。
这个软件包生态系统激起了我的兴趣,所以我决定利用最近由于病毒而有的空闲时间深入其中一个。毕竟,这是做一些有成效的事情的好时机,比如用我最喜欢的编程语言学习一门新的应用科学;因为我认为这很有成效。或许这也是学习更多生物学和基因组测序的最佳时机。明确地说,我在生物信息学领域没有任何领域知识,但我正在寻求在其中获得一个立足点,随着时间的推移,我可以通过实践和研究来提高。我也有兴趣看看我如何能够与 Julia 一起将机器学习和统计学应用于生物学,并交叉我非常感兴趣的两个应用科学。
添加包
为了使用 BioJulia 的软件包,我们当然需要添加它们。对于我的选择,我几乎去了 BioJulia 的 Github 并挑选了一些听起来有趣的库。在我的方法中我没有意识到的是,BioJulia 实际上有自己的包注册表。我没有通过 Pkg REPL 和 Github 单独添加软件包,而是决定使用注册表。在 Pkg REPL 中,我们可以使用以下命令添加 BioJulia 注册表:
registry add https://github.com/BioJulia/BioJuliaRegistry.git
然后我就可以像平常一样添加我的包了。这些包激起了我的兴趣:
- 生物序列. jl
- GenomeGraphs.jl
- BioSymbols.jl
然而,这种体验最终有点不像我添加我一无所知的包,而有点像糖果店的孩子……我还决定选择 XAM.jl 和 BigBed.jl。我们还需要 BioCore.jl,我继续选择了 BioGenerics.jl(不确定我是否需要它。)最后,我打开了一大堆 Github 页面。幸运的是,我在谷歌浏览器上启用了实验性的标签分组。
我喜欢这个功能。
pkg> add BioCore
pkg> add BioSymbols
pkg> add GenomeGraphs
pkg> add BioGenerics
pkg> add BigBed
pkg> add BioSequences
pkg> add XAM
令人惊讶的是,我的包列表看起来还不算太差!
当然,现在我要做的只是进行超出人类能力范围的研究,并从我刚刚添加的几个包中选择一个…
但是我全押了!
我偶然发现了这个视频,如果你想看的话:
这真的很有帮助,让我知道我可以从哪里开始学习,以便有一个坚实的知识基础来处理这些包。实际上,我最初并没有意识到我的机器学习、编程和统计领域知识会在这里应用到多大程度,当我知道她的第一个复选框完全为我所用时,我非常高兴。总而言之,她说在开始学习生物信息学时要做五件事:
№1:编程基础
- 统计编程语言中的 Apt 能力。✔
- 熟悉 Bash。✔
- 能够将数据读入您选择的编程语言。✔
- 能够进行基本的统计检验(如 t 检验,卡方检验,f 检验)✔
№2:做一个项目
- 找到一些有趣的数据,并将其读入您选择的编程语言中。
- 使用绘图库可视化数据。
这里是她建议的获取数据的网站:
2000 年 6 月 22 日,UCSC 和国际人类基因组计划联盟的其他成员完成了第一个…
genome.ucsc.edu](https://genome.ucsc.edu/)
强调了理解所收集数据的重要性。
她还建议机器学习——这一天我是一个快乐的年轻人。我不认为我意识到生物信息学和机器学习有多少共同之处。
№3:带着工具旅行
(我已经这样做了,我喜欢狩猎)
- 在做之前,找到与你想做的事情相关的行业标准工具。
- 一旦你有了更多的经验,拓展业务,甚至尝试创建自己的工具。
№4:重复步骤 2 和 3
所以在看完这个简短的介绍后,我决定下一步最好的行动是开始我的第一个项目。
我的第一个项目
对于我的第一个生物信息学项目,我决定浏览前面提到的 UCSC 网站寻找数据。该网站不仅有大量的数据,而且有很多查看这些数据的好方法!今天,我只是读取数据,但在未来,我将探索它,用它进行可视化和测试,也许我甚至可以找到一些实用的机器学习用途。
我从这个网站上得到了一些我认为很酷的穿山甲数据。这样做有点奇怪,因为你被带到一个没有样式的 html 页面,花了 30 分钟谈论如何用 wget 获得一个文件……这当然很奇怪,并使找到 ftp://或 http://链接变得非常困难。这是我最后使用的一个:
wget --timestamping
'ftp://hgdownload.cse.ucsc.edu/goldenPath/manPen1/bigZips/*'
有趣的是,我的 512GB NVME 驱动器的存储空间非常低,因为我是一个数据囤积者,所以我非常害怕我可能会用这些数据填满我的 SSD,并需要四处清理。你知道我真正需要什么吗?
NAS。
以下是我用 wget 从存储库中收集的文件:
现在,我将在这个目录中创建一个笔记本服务器。
cd ~/Projects/bioproject
jupyter-notebook
这是一个巨大的数据量,所以我决定尝试进入 Julia 的第一个是 manPen1.2bit。这是因为虽然我不知道如何将这些数据读入 Julia,但我知道我有一个包可以做到这一点。BioSequences.jl 中有一个 2 位阅读器,您可以在此处找到文档:
2bit 是一种二进制文件格式,用于存储由多个染色体序列组成的基因组。阅读…
biojulia.net](https://biojulia.net/BioSequences.jl/v1.0/io/twobit.html)
BioSequences.jl 有一个存储在名为 TwoBit 的子模块中的类型。然而,当我试图导入它时,我遇到了一个问题…
" TwoBit 未定义"
考虑到这一点,我决定检查我拥有的 BioSequences.jl 的版本:
在文档页面的左侧,我将版本更改为我电脑上的正确版本,然后搜索 TwoBit。这表明这个包不再是一个子模块,而是成为了它自己的包,所以我必须添加它:
pkg> add TwoBit
现在我们可以将它导入 Julia 并创建我们的阅读器:
using TwoBit
reader = TwoBit.Reader(open("manPen1.2bit", "r"))
现在,我们可以在我们的阅读器上使用 seqnames()方法查看刚刚读入的基因组序列:
sequences = TwoBit.seqnames(reader)
现在我们有了生物数据!
结论
那相当有趣!我非常兴奋地看到所有的基因组学,我将能够在朱莉娅身上进行实验。虽然我肯定还有很长的路要走,但我认为一些实践和反复会让我达到可以开始用核苷酸和 DNA 进行机器学习的地步。虽然这肯定不是我的知识领域或技能领域,但我真的认为我会喜欢基因组学,因为我一开始就很喜欢生物学。
我的下一步是尝试将数据可视化,并从中得出结论。我真的没有意识到这和我每天做的事情有多么相似。我很感激这一点,也非常兴奋地想了解更多。我在亚马逊上订购了一些可能有助于我了解这些海量信息的书籍,但现在,我只想熟悉与基因组学相关的工具和数据格式。
熟悉 Keras
两个神经网络回归问题
神经网络是由大脑连通性松散启发的计算系统。简而言之,神经网络对输入进行一系列转换,其结果在学习过程中被用作特征。Keras 是 python 中的一个开源库,可以轻松地对神经网络进行实验。Keras 提供了许多神经网络的构建模块,包括目标函数、优化器、激活函数、各种类型的层和许多附加工具。
在本帖中,我们将使用 Keras 库构建三个回归神经网络模型。
我们开始吧!
预测汽车的价值
在第一个例子中,我们将根据客户属性预测汽车销售的潜在价值。这些属性包括年龄、收入和性别等信息。数据可以在这里找到。
首先,让我们导入 pandas 并将数据读入数据框:
import pandas as pd
df = pd.read_csv("cars.csv")
让我们打印前五行:
print(df.head())
接下来,我们将定义输入和输出变量。我们将使用“年龄”、“性别”、“英里数”、“债务”和“收入”来预测“销售额:
import numpy as np
X = np.array(df[['age', 'gender', 'miles', 'debt', 'income']])
y = np.array(df['sales'])
我们现在需要分割数据用于训练和测试。我们将从“sklearn”中导入“train_test_split”方法:
from sklearn.model_selection import train_test_split
然后,我们将测试集定义为随机样本(20%的数据):
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 42)
接下来,我们需要重塑我们的标签系列:
y_train = np.reshape(y_train, (-1,1))
现在我们可以定义我们的模型了。首先,我们需要导入几个包:
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense
接下来,我们定义一个顺序模型对象:
model = Sequential()
让我们建立一个简单的神经网络,它有一个输入层、一个隐藏层和一个输出层。我们还将在输入层和隐藏层使用“ReLu”激活功能。对于输出层,我们将使用线性激活函数。输入层和隐藏层将有 32 个神经元:
model.add(Dense(32, input_dim=5, kernel_initializer='normal', activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='linear'))
接下来,我们编译模型。我们将使用“adam”优化器和均方误差损失函数:
model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
最后,我们拟合我们的模型。让我们以 100 个时期和 10:
model.fit(X_train, y_train, epochs=100, batch_size=10)
我们看到,与销售额相比,均方误差和平均绝对误差都非常低,这很好。
现在,让我们对测试集进行预测:
y_pred = model.predict(X_test)
接下来,我们可以可视化我们的结果。让我们导入 matplotlib 和 seaborn,并显示真实值与预测值的散点图:
import matplotlib.pyplot as plt
plt.scatter(y_test, y_pred)
plt.xlabel('True Values')
plt.ylabel('Predictions')
对于第一次传球来说,这是一个不错的表现。通过进一步的超参数调整,我们可以做得更好。为了进一步提高性能,我鼓励您尝试一下层数、神经元、时期和批量大小。你也可以尝试一些其他的优化器,而不是“adam”,比如“rmsprop”或“sgd”。您还可以尝试使用规范化、标准化或最小/最大缩放来转换数据。
预测燃油效率
现在,让我们继续讨论另一个问题。在本例中,我们将以每加仑英里数来预测燃油效率。我们将使用马力、重量和气缸数量等信息作为预测模型的输入。数据可以在这里找到。
让我们导入数据并打印前五行:
df = pd.read_csv("auto-mpg.csv")
print(df.head())
接下来我们将定义我们的输入和输出。我们将使用“气缸”、“排量”、“马力”、“重量”、“加速度”、“车型年”和“来源”来预测每加仑英里数(MPG):
X = np.array(df[['Cylinders','Displacement','Horsepower','Weight',
'Acceleration', 'Model Year', 'Origin']])
y = np.array(df['MPG'])
我们现在需要分割数据用于训练和测试。我们将测试集定义为数据的随机样本:
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 42)
接下来,我们需要重塑我们的标签系列:
y_train=np.reshape(y_train, (-1,1))
现在让我们定义我们的模型。让我们从一个具有 64 个神经元的输入和隐藏层的神经网络开始。输入维度为 7,优化器为“adam”,损失函数为“mse”。我们还将使用 1000 个历元和 10:
model = Sequential()
model.add(Dense(64, input_dim=7, kernel_initializer='normal', activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'], validation_split = 0.2)
model.fit(X_train, y_train, epochs=1000, batch_size=10)
现在,让我们来看看我们的结果:
y_pred = model.predict(X_test)
plt.scatter(y_test, y_pred)
plt.xlabel('True Values')
plt.ylabel('Predictions')
我们可以看到性能相当不错。我鼓励您尝试提高性能,或者尝试为其他预测问题建立神经网络模型。例如,您可能对使用神经网络来预测野火规模感兴趣,使用美国野火数据。
总之,在这篇文章中,我们介绍了两个回归问题的建模过程:预测汽车的价值和预测燃油效率。我们讨论了如何初始化顺序模型对象、添加层、添加神经元、指定优化器、指定时期和指定批量大小。我们还使用真实散点图和预测散点图进行了模型验证。我希望这篇文章对你有用。这篇文章的代码可以在 GitHub 上找到。感谢阅读,机器学习快乐!
熟悉 Julia 中的循环
朱莉娅综合教程
Julia 编程语言中循环和条件一起使用的介绍。
(图片由作者提供)
介绍
如果一个人想进一步提高他们在软件工程方面的技能,仅仅通过观看是很难学会的。即使对文献或多媒体中的所有概念都了如指掌,如果不实际创建代码并查看代码如何与数据交互,也很难学习。大约十五年前,我一头扎进了 C++这门美丽的语言。为了学习 C++,我会花几个小时研究和复制粘贴代码,以找出它是做什么的。问题是我没有自己写代码,即使它是直接复制的。
需要澄清的是,我并不是说复制和粘贴代码是一件坏事,我总是从我以前的笔记本、我当前的项目,甚至是万维网上复制和粘贴代码片段。然而,很多工程是关于学习如何学习的。其中一部分是知道什么时候复制和粘贴,而不是什么时候你需要进一步研究材料。在我的 C++例子中,我记得使用了 STD 库和<
有趣的是,在地球上所有的语言中,我从未真正对 Python 感兴趣,直到大约三年前。虽然没错——它确实比 C++容易学得多,但我发现许多不同之处令人震惊。不管这种语言与其祖先相比有多简单,我发现自己陷入了一个陷阱,从谷歌上转移大量我并不真正理解的代码,这阻碍了我对这种新语言的学习能力。
所有这些证据都是为了支持一个说法:
想学编程,需要写代码。
我有一个导师,他参考了 Zed Shaw 的书《艰难地学习 Python》。这本书里的观点反映了我所讨论的内容的重要性,并且让我真正认识到,只要有互动,教育就变得简单多了。我也认为自己是一个视觉学习者,所以对我来说,这可以适用于任何试图学习计算机编程的人。
带着这些想法,我想如果我要提供具体和充分的教程,将一个人从一个绝对的初学者变成一个绝对的专业人士,那么我当然应该包括学生自己学习的资源。Github repo 中现在提供了笔记本的空副本,我坚持让较新的程序员自己键入代码!
环
在编程领域,开发人员可以使用一些不同的操作来处理数据。最常用的两种操作是循环和条件。循环是一种编程技术,它不仅允许检查、比较和计算类型内部的元素,而且是程序本身的基础。
编程中使用的循环主要有三种类型,一些独特的应用与特定的语言有关,例如 Julia 的语法循环。在 Julia 中,我们有以下循环应用程序供我们使用:
- 迭代循环
- 循环时
- 递归循环
- 语法循环
也就是说,语法循环**仍然使用迭代器,**只是在迭代器旁边使用语法表达式,用更多的表达式进行更快的循环——迭代也是如此。
让我们来看看一个迭代循环。迭代循环不同于递归循环和 while 循环,因为它们需要 dim 来循环。包含这种 dim 的类型的一个例子是数组。在数组的例子中,我们可以使用迭代循环连续地逐个循环每个元素。这也可以使用生成器类型来完成,它只是一种能够自己创建类型的类型。一个基本的例子是一个范围,其中范围类型生成一个位于范围的给定边界之间的 dims 数组。在这个例子中,我们将遍历一个由 10 到 20 之间的所有整数组成的数组:
**for** number in 10:20
println(number)
**end**
(图片由作者提供)
while 循环将采用 bool 类型,这是一个读取 true 或 false 的条件,并将其用作循环的中断。只要不满足提供的条件,循环就会停止。而循环实际上是在机器上运行的大多数应用程序的基础。这是因为,只要你想让他们执行任务,他们就能始终如一地执行任务。当然,为了创建 while 循环,我们将使用关键字“while”,后跟一个条件。
*# while loop*
number = 1
**while** number <= 5
number += 1
print(number)
**end**
另一个要看的是打破循环的能力。这通常是在有条件的情况下完成的,但它使用了关键字“break”例如,虽然上面的循环将打印 1 到 6 之间的每个数字,但如果我们打破它,我们将得不到任何打印结果。
*# while loop*
number = 1
**while** number <= 5 break
number += 1
print(number)
**end**
最后,还有递归循环。递归以及何时使用它是一个完全不同的讨论。一般来说,递归会降低性能,但是,有许多函数式算法是利用递归的现代计算的基础。也就是说,在迭代和 while 循环不能完成工作的情况下,递归有一些很好的用途。阶乘的计算是递归在科学、高级计算中合理应用的一个完美例子。大多数递归算法将使用一个条件来决定是否应该用一个返回来中断一个循环。在阶乘函数中,我们要做的第一件事是检查我们想要阶乘的数字是否为 1。如果是这样的话,1 的阶乘当然只是 1,所以我们将返回 1。
**function** fact(n)
**if** n == 1
**return**(1)
这会打破我们的循环。考虑递归循环的一个很好的方法是想象函数本身既是循环又是循环的初始化。接下来,我们要把这个数乘以它本身的阶乘减一。这在数学上本质上是非常递归的,因此计算中的应用程序也应该是递归的。
**else**
**return** n * fact(n-1)
只要满足 else 条件,这个函数就会调用自己。如果 n-1 不等于 1,那么它将再次调用自己——这就是递归。这是我们的最终结果:
**function** fact(n)
**if** n == 1
**return**(1)
**else**
**return** n * fact(n-1)
**end**
**end**
有趣的事实:
Julia 的基本阶乘函数 factorial()实际上并没有使用递归来计算阶乘。相反,它使用查找表将值与相应的阶乘相匹配。这意味着大于一个数的值,在 Julia 的例子中是 22,是无法计算的。虽然这可能是一个缺点,但这也意味着数字小于 22 的运算要比其他情况快得多。
拉链环
zip 循环是一个很好的工具,当你想同时遍历多个数组的时候可以使用它。这对于阈值以及跨数组比较或操作值都很有用。Julia 中的 zip 语法与大多数语言略有不同,所以确保应用正确的语法很重要,使用 zip 作为方法,两个 dim 成对使用。
array2 = [30, 40, 50, 60]
**for** (i, w) in zip(array, array2)
println(i, w)
**end**
把我们知道的和循环结合起来
现在我们已经有了循环、条件和函数的坚实基础知识,让我们把所有这些技能结合起来。
newarray = [] **for** element in array
**if** element == 10
append!(newarray, element)
**elseif** element == 20
append!(newarray, element)
**end**
**end**
在这个例子中,我们循环遍历一个数组。如果它满足等于 10 的条件,那么我们将把它附加到新的空数组中。如果数字不等于 10 和等于 20,我们也将这样做。然而,如果它等于 10 和 20,那么它将只运行初始 if。
你自己试试!
你能创建一个函数来遍历字符串“Hello World”中的每个字母,并且只打印 H、W、l、r、o 或 D 中的一个字母吗?
我们要做的第一件事当然是定义我们的 hello world 字符串变量。
Hello = "hello world"
接下来,让我们写一个函数。
**function** filterstring(input)
该方法的下一步是遍历字符串中的每个字符。为此,我们可以用 for 循环调用字符串。
**for** character in input
接下来,我们需要检查该值是否在我们想要打印的值列表中。每当我们想要检查某个东西时,我们很可能会使用条件。对于这个例子,你可以使用 to 方法。其中一个是新手方法,另一个要简单得多。创建一个可接受值的列表并检查循环元素是否在该列表中,或者为每个单独的字符创建一个条件。无论哪种方式,都会产生相同的结果,坦率地说,只是简单和容易得多。
**function** filterstring(input)
validchars = ['H', 'W', 'l', 'r', 'o', 'd']
**for** character in input
**if** character in validchars
print(character)
**end**
**end**
**end**
(图片由作者提供)
结论
恭喜你!你正在成为一名优秀的 Julia 开发者。虽然事情在开始时看起来很复杂,但是您需要获得的大部分知识,至少在开始时,将会学习更多使用操作符、条件、类型和循环来处理数据的方法。虽然还有更多的东西需要学习,但是在这些教程中已经介绍了用 Julia 语言编程的基础知识。
被解雇,在新冠肺炎中部被聘为数据科学家
困难时期找工作的心得。
我在 YC 的一家初创公司开始了机器学习方面的新工作,该公司的核心产品是一个让计算机视觉 ML 建模变得简单的平台。产品、同事、文化和薪酬都很棒。几个星期后,我们开始在家工作,就像几乎所有其他与疫情打交道的公司一样。即使在那时,一切都超级顺利。
有一天,我在 slack 上收到一条 CEO 发来的 DM,说他想和我聊聊天。我就知道会这样。我只是不知道该如何反应。我问原因,我明明知道。不知何故,这场尴尬的对话在 5-10 分钟内就结束了。
老实说,我并不感到太难过。我在那里只呆了一个多月。令人烦恼的是未来——又一次求职。找工作很累人。通常情况下,你可以轻松地寻找工作,因为你已经有了一份工作。你花时间去评估公司,评估你在公司的未来。我没有。像我这样的人越来越多,而空缺职位却比以往任何时候都少。
我的第一反应
我做的第一件事就是处理这个情况。打电话给几个密友告诉他们这个消息。真的帮我镇定了神经,减少了紧张的兴奋感。
很快我为我的下一次狩猎做了一些预感—
- 我不能太挑剔。我需要尽快评估谁在招人。对于一份工作,我需要有一套清晰的最低标准。如此之少,以至于即使我拿掉一个,我的工作生活也会像地狱一样。
- 既然我被解雇了,我就可以公开放出消息说我正在找工作。我希望我的朋友和网络能帮助我。他们做到了。因为我在 LinkedIn 上的一篇帖子,我得到了这么多线索。
- 从我过去的求职经历中,我发现哪些求职网站有用,哪些没用。但是要注意,许多工作列表是存在的,但是没有人去检查它们。它们正在恢复黑洞。
工作— iimjobs , hirist , angel
浪费时间— Linkedin jobs - 除了工作列表网站,我更依赖推荐。不要申请 LinkedIn 的工作,使用搜索栏搜索带有数据科学、机器学习等标签的内容。 通过帖子连接到发布空缺职位的人员。
冷静一下:)
完全披露——那段时间我住在孟买的家里。我有足够的积蓄来养活自己和家人。
我对我的失业很轻松。我知道一件事——整天申请工作是没有意义的。我有一个清晰的申请策略——每两天,浏览工作列表,找到任何感兴趣的东西,然后申请。反正我在 LinkedIn 上很活跃。我留意了提到任何空缺职位的帖子。只需将它加入书签。在求职申请上浪费时间没有意义。我能做的最好的事就是耐心等待。对于每一份重要的申请,找一个可以推荐你的人。90%的时间都在工作。
同时,我养成了许多好习惯。我开始锻炼,玩很多室内和室外游戏(在我的社会里),对瑜伽感兴趣。
在技术方面,我决定学习新的东西。我一直有一个遗憾,就是没有学习数据结构和算法。至少有 4 次我开始学然后放弃了。这次我屁股下面着火了。任务完成。
https://giphy.com/explore/hacker-man
接下来,我真的很怀念孟买公司过去组织的技术聚会。我喜欢行业层面的讨论和结交新朋友。在这个失业+禁闭的时期,我决定和网上的人联系。这是最好的!我被介绍给很多人。不仅仅是数据科学,还有时尚、管理等等。
那么面试呢?
让我们看看。我完成了 6 次 T21 的任务,10-15 次面试,以及数不清的申请。我将突出重要的几个。
排名第一的大型食品订购公司
- 职位——ML 工程师
- 公司类型——大型创业公司
- 状态—第一轮后被拒绝
- 来源— LinkedIn 推荐
过程—
通常,当人力资源代表给你打电话寻求机会时,他们会问你具体的技能、目前的薪水和工作地点。但这次不同。她很好地向我解释了角色和问题陈述。直到她问了一些琐碎的人事细节,我才意识到她是一名人事。她问我知不知道 Scala。我没有。她以一种非常合法的方式解释了 Scala 对于他们的系统是多么的重要。印象深刻!
数据科学家/ML 工程师这两个术语可以互换使用。不在这里。整个面试基本上都是 ML 系统工程。我们只讨论了工程部分,没有讨论科学部分。我完全没有准备好。
总的来说,这是一次积极的学习经历!
危险信号——无
#2 大型美容和时尚电子商务公司
- 职位—数据科学家
- 公司类型——最近资助的大型创业公司
- 状态—在两轮和一次分配后被拒绝(因为蹩脚的原因)
- 来源——一名员工在 LinkedIn 上联系
过程—
采访者不是数据科学家。他是产品经理。该公司外包了大量的分析工作。第一轮很标准。谈到我过去的工作。他给了我一个任务,是关于产品描述的数据集。目标是为搜索查询排列产品。努力工作并取得了好成绩。在下一轮中,向他介绍了该方法,并展示了一些有趣的结果。
他没有问我任何关于我的方法。相反,有人问我能做些什么改进。我解释了我关于使用过去的购买和协作过滤等方法的想法。我得到的只有嗯嗯……
后来,当我询问我的申请情况时,他打电话告诉我,我被拒绝了。酷毙了。我要求反馈。他说了两件事—
- 我不是 CS 出身— 为什么你在让我做作业之前不看我的简历或者问我????
- 我们需要资深的人— 我已经在简历上明确提到我的经历和日期了!!数数并不难。
危险信号—
- 面试官不适合。
- 在讨论作业时,他没有质疑我的方法。我知道他没有技术知识。从业务或者产品角度还是可以问很多的。
#3 一家小型分析公司
- 职位—数据科学家
- 公司类型—分析公司(基于服务)
- 状态——我拒绝了他们
- 来源——一名员工在 LinkedIn 上联系
过程—
人力资源部打电话来了。询问关于我的标准信息。然后事情变得很奇怪。问我父亲的生意。我在想为什么?这合法吗?我说了那是什么。然后她问我爸爸挣多少钱?是时候说-
危险信号—
你知道的。
顺便说一句,要知道
非法工作面试问题从求职者那里获取信息,这些信息可能被用来歧视…
www.betterteam.com](https://www.betterteam.com/illegal-interview-questions)
#4 一家 SaaS 公司
- 职位—数据科学家
- 公司类型——Saas 公司
- 状态—报价已收到。我拒绝了他们。
- 来源——一名员工在 LinkedIn 上联系
过程—
总共 4 轮,1 次任务。这家公司在印度并不出名,至少在我的网络中是这样。经过跟踪,我发现了他们的产品,员工背景。不过没什么特别的。面试是标准的。解决了任务,并在其中一轮中与数据科学家进行了讨论。在随后的几轮中与高层管理人员进行了交谈。主要是案例研究。他们最终提供了一份不错的薪水。
我仍然对这家公司感到有些不安。没有任何危险信号。除了一件事——在作业讨论中,我提到了一些我无法在截止日期内尝试的方法。她说,“嗯,24 小时的期限在这里很常见。”然后一笑置之。当时我并没有过多地去理解它。
我看了 glassdoor 上的评论。积极的看起来是假的。消极的人有共同的痛点。我决定联系前雇员。最后,我出于绝望决定不打错电话,拒绝了他们的提议。
危险信号—
- 可疑文化
- 一致的负面评价
#5 一家位于硅谷的食品科技创业公司
- 职位—数据科学家
- 公司类型——A 轮募集
- 状态——在分配后出现幻影(在 4-5 次提醒后)。
- 来源—匹配天使
过程—
在我之前找工作的时候,我们在安吉尔上匹配过。因为我在比赛结束后得到了一份工作邀请,所以我们没有继续。这次我联系了他们是否还在招人?他们给了我一个任务。这是一个多标签分类任务。这似乎是他们正在解决的问题之一。
我在这项任务中工作最努力。无法完成所有子任务。然而,这足以表达我的努力。
我要求下周的审查和状态。他们说过几天。同样的动作重复 4 次以上。每次都有不同的蹩脚借口。
很可能,他们从申请人那里得到了解决问题的方法。
危险信号—
- 一连串的借口。除非你要求,否则人力资源部不会与你联系。
是什么让我保持理智?
虽然我说我对裁员感到非常冷静,但当我发现顶级公司都在裁员 1000 人时,我开始思考——我要如何同时与所有这些公司竞争?这么少的空缺也是这样吗?我得加快速度。
在这两个月里,我的朋友和家人给了我很多支持。朋友们经常来看我,我的家人给了我足够的空间来解决我的问题。
我第一份工作的 CEO 一听到我的消息就让我回来。我也确保在身体和精神上照顾好自己。
我学到了什么?
对我来说,处理不确定性的机会并不多。这段艰难的经历教会了我如何应对。有关心你的人让这种经历变得可以忍受。
尽快开始建立一个强大的网络。与人们联系,询问他们当前的项目,你如何帮助他们。尽可能多交朋友。意识到当你是一个团体的一部分时,你总是更强大。
我都不敢想象背负沉重助学贷款的应届毕业生有多难。如果你是一个很难找到工作的求职者,请在 LinkedIn 上联系我,并说明我可以如何帮助你(当然是免费的)。请具体说明你的问题。在这里找到我。
通过 Discord 服务器获得群体行为洞察
分析不和谐信息数据如何提供关于社交媒体行为和社交团体的有价值的见解。
介绍
在浏览互联网的时候,社交媒体基本上是不可避免的。几乎每个人都因为各种原因使用至少一个社交媒体平台,它们通常代表了一个人社交生活的重要部分。
正是因为这个原因,分析社交媒体平台中的行为数据是了解人们,甚至是群体的一种很好的方式。在基于聊天的社交媒体平台上,这种群体洞察变得更加明显。
出于这个原因,我将向您展示如何获得 Discord、消息传递数据,并为分析做好准备,以及使用一点点。您可以跟随包含本文代码的 google colab。
数据
在一个基于聊天的平台中,特别是像 Discord 这样的服务器被分成多个频道的平台,在制作数据集时,我们可以跟踪许多变量。
对于我将在这里使用的数据,所有消息都来自同一个通道,这意味着我们不需要跟踪消息被发送到哪里。对于我们将要进行的分析来说,所有重要的变量是消息的作者、消息发送的时间以及消息本身的内容。
我们将使用的数据框,总共包含 3 列。
在开始之前
当处理这样的数据时,如果这些数据包含其他人的姓名(在本例中是用户名),而这些人不一定允许您公开他们的信息,您应该始终匿名化这些数据,以避免任何不必要的问题,同时也尊重他们的隐私。
准备数据
在我们开始分析之前,我们必须确保我们的数据包含我们需要的一切。
使用 Pandas 查看文件概述后,您应该会注意到数据集中有丢失的值。其背后的原因是,在这个数据集中,在消息中发送的图像和嵌入被表示为 NaN 值。
data.info()
使用 DataFrame.info() 方法获得数据集的概览。
由于这些消息只代表了数据集的一小部分,对我们没有任何用处,我们可以简单地丢弃它们。我们还应该将 time 列转换成 DateTime 以便更容易地处理日期。
一旦我们解决了这个问题,我们就可以专注于做一些更好的工作来分析更多的列。例如消息中包含什么表情或者每条消息有多少单词。
除了我们都习惯的常规表情符号,discord 还有专属的公会表情符号,可以是动画的,也可以不是。为了表示所有这三种表情,我们将为每一种表情添加一个单独的列,每一列都由包含消息中发送的该类型的所有表情的数组组成。
要创建这些数组,我们可以使用正则表达式来识别哪些消息包含表情,然后将它们添加到各自的列中。
我利用 python 的表情库更容易地从消息中提取表情,因为并非所有表情都符合我使用的正则表达式模式。
之后,我们只需将字数统计列添加到数据框中,就可以开始处理数据了。
分析数据
有了转换后的数据集,我们可以开始分析,以深入了解我们的消息传递历史数据。
在经历了所描述的整个过程之后,数据帧的前 5 行。
例如,我们可以进行的一种可能的分析是,观察服务器中的用户活动在整个数据集内的表现,该数据集包含来自该服务器的一年多的信息。
然而,在这样做的时候,我们遇到了一个问题,即有太多的作者,他们中的许多人缺乏足够的数据来为分析做出任何实质性的贡献。
这是因为数据还包括来自服务器中不活动的机器人和用户的消息,因此不会告诉我们关于整个群体的任何信息。
fig = px.histogram(data, x='author', title='Messages Sent Per Author', labels={'author':'Author'})fig.update_layout(title_font_size=30, template='plotly_white')fig.show()
列出的大多数作者在服务器历史上几乎没有发送过消息。
通过设置一个最小的消息量作为基线,去掉发送少于这个数量的作者,我们可以过滤掉那些没有贡献足够数据的作者。
有了更少的作者,他们都贡献了大量的消息,我们最终可以绘制一个图表,更好地表示服务器中用户活动随时间的变化。
fig = px.histogram(data, x='time', color='author', opacity=0.5, title="User Activity Over Time", labels={'time':'Date'})fig.update_layout(barmode='overlay', title_font_size=30, template='plotly_white')fig.show()
通过缩小时间窗口,您可以深入了解服务器最近的活动情况,甚至可以发现服务器在一天中的哪些时段最活跃。
我们还可以画出每个作者发送的消息总量,看看谁是最活跃的,以及服务器成员在频率上如何比较。
fig = px.bar(x=data.author.value_counts().index, y=data.author.value_counts(), color=data.author.value_counts().index, title='Messages Sent per User', labels={'x': 'Author', 'y': 'Messages Sent'})fig.update_layout(title_font_size=30)fig.show()
请注意,上图计算了数据帧中包含的所有已发送消息。您还可以限制时间范围以获得更多的最新数据,而不是考虑这么大的时间窗口。
并且,通过对数据集进行简单的过滤,您可以用同一个图来表示包含某个字符串但仍被作者划分的消息的数量。
term = 'LOL'
term_data = data[data.content.str.contains(term)]# The exact same plot, but replaced data by term_datafig = px.bar(x=term_data.author.value_counts().index, y=term_data.author.value_counts(), color=term_data.author.value_counts().index, title=f'Messages Containing "{term}" Per User', labels={'x': 'Author', 'y': 'Messages Sent'})fig.update_layout(title_font_size=30, template='plotly_white')fig.show()
另一种可能的分析是绘制和比较每个用户发送的表情的总量,同时也根据表情的类型对它们进行划分,例如,这可以指示组中谁有 nitro,因为只有那些有 nitro 的用户才能发送动画表情。
然而,对于这个图,首先,我们需要将数据框转换成“整齐”的格式,这就是 Pyplot 用于条形图的格式,就像我们将要绘制的这样。我们可以通过使用 pd.melt() 方法来做到这一点,这是一种非常有用的方法,可以轻松地将数据帧转换为“整齐”的格式。
将 emote 列从数组转换为整型,并应用 pd.melt( )方法。
fig = px.bar(data_line, x ='author', y='value', color='variable', labels={'value':'Emotes Sent', 'author':'Author'}, title="Emotes Sent per User")fig.update_layout(title_font_size=30, template='plotly_white')fig.show()
结论
在所有这些例子之后,应该很明显,从聊天数据中可以获得很多潜在的洞察力,比如来自 Discord 服务器的聊天数据。
从洞察某人的日常行为到他们作为更广泛群体的一部分的行为,来自社交媒体的数据是发现人们新事物的最佳方式之一,这就是为什么它值得更多关注
参考
本文的灵感来自以下两个处理类似数据分析的仓库,但分别用于 WhatsApp 和 Telegram:
GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码、管理项目和构建…
github.com](https://github.com/kurasaiteja/Whatsapp-Analysis) [## 预期代码/电报分析
一个处理 telegram-history-dump Venn _ userlist . py 输出的工具:比较聊天之间的用户重叠…
github.com](https://github.com/expectocode/telegram-analysis)
从谷歌地图获得关于企业和位置的见解
让我们看看如何利用 Python 和 Selenium 的能力来挖掘 Google Maps 中关于感兴趣的企业和位置的数据
谷歌地图充满了你感兴趣的任何类型的商业或位置的有用数据。在这篇循序渐进的文章中,我将使用 Python 和 Selenium 从其中提取关于某个企业(或位置,我们将研究 3 个主要示例)的数据,然后以快速和自动化的方式对与之非常接近的类似或竞争企业进行同样的操作。
这个操作的输出是一个包含有用数据的数据帧(名字、商业类型、星级、联系信息、坐标、流行时间等。)我们可以用它来获得关于业务/位置及其周围环境的许多见解。
如果你想了解你的竞争对手的情况,这将是很有用的,但如果你想快速生成某个城市某类企业的列表,这也是很有用的。它还适用于历史地标、公园和各种景点,而不仅仅是企业,我们将在后面的第三个也是最后一个示例中看到。
您可以通过在我的 GitHub 存储库中下载 Jupyter 笔记本来阅读本文,这里是 、以及 CSV 格式的提取数据。
ps:我不隶属于任何企业。本文中的示例是随机选取的,仅用于说明和教育目的。
软件包和设置:
插图作者:明蒂·rawpixel.com
我们将需要Seleniumpython 包来执行数据抓取。如果您还没有它,您可以使用 pip: pip install selenium
或conda install selenium
安装它,如果您使用的是 Anaconda 发行版的话。
为了与浏览器互动,我们还需要一个网络驱动(这里我们将使用 Chrome),所以你必须 到这里并把它 下载到你的机器上(确保它与你当前的 Chrome 版本兼容) :
from selenium import webdriver
我们还需要 Selenium 中几个有用的类。我们将在这里导入它们:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException, TimeoutException, ElementNotInteractableException, ElementClickInterceptedException
现在我们来获取 tqdm ,一个必不可少的进度条 python 包。估计你的代码的 web 抓取部分要花多少时间是非常有用的(我用 tqdm_notebook 是因为我在 Jupyter 笔记本上工作。在 IDEs 中你应该做from tqdm import tqdm
,然后用tqdm
代替tqdmn
):
from tqdm import tqdm_notebook as tqdmn
除此之外,我们还需要 Pandas 来读取和操作数据集,以及 Numpy 来处理空值:
import pandas as pd
import numpy as np
同样,让我们导入 Matplotlib 和 Seaborn 来做数据可视化:
import matplotlib.pyplot as plt
import seaborn as sns
为了在地图上显示我们的企业/位置,我们需要 叶子 。如果没有叶子,使用pip install folium
或conda install -c conda-forge folium
安装:
import folium
最后,我们需要内置的 python 模块 time 和 re (第一个模块在元素加载时停止代码一段时间,第二个模块使用 RegEx 或正则表达式 从模式的原始文本中提取数据):
import time, re
这是可选的,只是为了给我们的数据帧添加一些 CSS 样式:
%%HTML
<style>.dataframe th,td:first-child{background: rgb(63,87,124);background: linear-gradient(180deg, rgba(63,87,124,1) 0%, rgba(101,124,161,1) 100%, rgba(0,212,255,1) 100%);;
padding: 10px;font-family: monospace;font-size: 110%;color: white;border:1px dashed white;text-align:left !important;
-moz-border-radius: 3x;-webkit-border-radius: 3px;}.dataframe thead{border:none; !important;}</style>
澳大利亚布里斯班的打印店:
图片由布拉德·斯克鲁斯——Flickr.com(CC)拍摄
Ryan 是一名获得印刷行业管理文凭的应届毕业生,他正在澳大利亚布里斯班找工作。他刚刚把他的简历送到了打印店 Kwik Kopy Brisbane (因为它碰巧离他家最近)。他还能在城市的什么地方找到合适的工作?让我们帮帮莱恩。
我们要做的第一件事是去谷歌地图搜索该企业的名称,或者我们可以在浏览器地址栏的www.google.com/maps/search/
后添加名称。然后,如果我们单击业务类别,这里是Print shop
(见下图),我们将获得不同打印相关业务的列表。我们航行的时间越长,就离我们最初的打印店越远:
在编写为我们进行网络搜集的代码之前,让我们先列出我们将经历的所有步骤:
1。绕场比赛:
- 答:取我们公司的名字,加在
www.google.com/maps/search/
之后,然后访问那个网址 - b:点击业务类别
- c:获取参赛者的姓名和地址,然后点击下一步按钮
>
。我们反复这样做,直到我们对有多少竞争者感到满意。这一步的输出是一个竞争对手的列表(名字和地址),让我们把它命名为competition
(名字本身不足以唯一地标识一个企业,这就是为什么我们还要捕获地址)
2。提取数据:
- d:获取
competition
的第一个元素并将其添加到www.google.com/maps/search/
之后,然后访问该 URL - e:提取名称、业务类别、平均评级、评论总数、地址、电话号码和网站,然后从
competition
开始使用另一个元素再次循环到步骤 D,直到结束。
下面是这样做的代码:
执行这段代码后,您将看到一个 Chrome 窗口打开,我们之前概述的步骤会自动一个接一个地执行。有时,谷歌地图会将一个企业名称/地址与另一个混淆,并给你一个选择:
出现这种情况时,只需在搜索栏中点击最接近查询的业务,代码就会正常继续。你也可以忽略它,由于有了try
和except
模块,代码会在 25 秒后自动跳到competition
中的下一次迭代。
如果一切按计划进行,让我们用提取的列表制作一个熊猫数据框架。姑且称之为PS
打印店:
PS = pd.DataFrame(data={'full_name':full_name, 'rating':rating, 'total_ratings':total_ratings, 'business_category':business_cat, 'address':address, 'phone':phone, 'website':website, 'latitude':lat, 'longitude':long})
这是我们的数据框架,包含 Kwik Kopy 和大约 100 家竞争对手的信息:
此时,最好将该数据帧保存为 CSV 文件以便安全保存:
PS.to_csv('print_shops.csv', index=False)
下次我们打开笔记本时,我们所要做的就是读取 CSV 文件,而不是再次运行 web 抓取代码:
PS = pd.read_csv('print_shops.csv')
经过一些数据清理和准备(见 Jupyter 笔记本),我们最终得到了 84 个不同的企业,Ryan 在找工作时可以考虑。还不错!但是它们在城市中有多分散呢?要回答这个问题,让我们将它们绘制出来,并在单击标记时显示的弹出窗口中添加它们的信息:
你可以在这里下载这个 HTML 格式的地图: ps_map.html
现在,这看起来更像是一个求职冒险的路线图!瑞安可以开始联系离他家最近的企业,如果需要的话,可以向外扩展。
在这个用例中,平均评级和评级总数对 Ryan 来说意义不大。在下一个例子中,我们将探索这两个变量更重要的行业:我们将在生机勃勃的格拉斯哥寻找最好的牛排馆。
苏格兰格拉斯哥的牛排馆:
戴夫·谢伊——Flickr.com(CC)摄影
Moira 想请她的男朋友吃一顿美味的牛排晚餐作为生日礼物,但她不知道具体去哪里。她在一个专门的博客上搜索,发现迷你烧烤牛排店是格拉斯哥最好的牛排店之一。让我们帮助 Moira 决定哪家牛排馆最适合这个场合,因为她认为好的葡萄酒(或鸡尾酒)和音乐是美好体验的必备条件。
我们将遵循与之前完全相同的步骤,除了添加两种新类型的有用信息:价格范围(从$
到$$$$
)和评论主题(数字指有多少评论谈到了该主题) :
下面是我们将使用的代码(有时谷歌地图根本不显示评论主题。如果发生这种情况,只需关闭 Chrome 窗口,停止代码并再次重新运行单元格) :
现在让我们用提取的列表制作一个数据框架。我们将它命名为SH
牛排餐厅:
SH = pd.DataFrame(data={'full_name':full_name, 'rating':rating, 'total_ratings':total_ratings, 'business_category':business_cat, 'price_range':price_range, 'address':address, 'phone':phone, 'website':website, 'review_topics':review_topics, 'latitude':lat, 'longitude':long})
让我们来看看我们得到的业务类别:
SH.business_category.value_counts()
我们希望只保留那些名称中带有“牛排”或“烧烤”字样的、酒吧、&烧烤店、餐馆。让我们称这个新的数据框架SBR
(用于牛排店、酒吧&烧烤店和餐馆) :
steak_houses = SH[SH.business_category == 'Steak house']
bar_grills = SH[SH.business_category == 'Bar & grill']
restaurants = SH[(SH.business_category.str.contains('Restaurant', case=False)) & (SH.full_name.str.contains('steak|grill', case=False, regex=True))]SBR = pd.concat([steak_houses, bar_grills, restaurants])
这就让出了 47 个名额。现在让我们帮助 Moira 从这些高级餐厅中挑选最划算的。如果你还记得的话,莫伊拉想要一次享受美酒、鸡尾酒和音乐的美好经历。让我们来看看有一个或多个这些要求的地方的review_topics
:
list(SBR[SBR.review_topics.str.contains('\Wwine|cocktail|music', case=False, regex=True)].review_topics)
正如我们在上面看到的,16 个不同的地方至少有 3 个关键词中的一个。为了能够做出选择,让我们添加 3 个新列wine
、cocktails
和music
,包含这些关键词被评论提及的次数(这是在提取的review_topics
中位于\\n
之后的数字)。我们没有统计这些词被提到了多少)。我们将使用 RegEx 提取我们想要的信息:首先我们用wine......|$
提取部分'wine\\n8'
,然后我们用\d+|$
提取数字。如果模式不存在,这里确保我们得到一个空值:
wine = []
for i in SBR.review_topics :
wine.append(re.findall('\d+|$', re.findall('wine......|$', i)[0])[0] )SBR['wine'] = winecocktail = []
for i in SBR.review_topics :
cocktail.append(re.findall('\d+|$', re.findall('cocktail......|$', i)[0])[0] )SBR['cocktail'] = cocktailmusic = []
for i in SBR.review_topics :
music.append(re.findall('\d+|$', re.findall('music......|$', i)[0])[0] )SBR['music'] = music
3 个新列wine
、cocktail
和music
是字符串类型。让我们将它们转换成数值(但在此之前,让我们用 0 替换空值) :
SBR.wine = SBR.wine.replace('', 0)
SBR.cocktail = SBR.cocktail.replace('', 0)
SBR.music = SBR.music.replace('', 0)SBR.wine = SBR.wine.astype(int)
SBR.cocktail = SBR.cocktail.astype(int)
SBR.music = SBR.music.astype(int)
现在让我们添加一个名为score
的新列,它是三个新变量wine
、cocktail
和music
的总和:
SBR['score'] = SBR.wine + SBR.cocktail + SBR.music
现在让我们按score
对SBR
数据框进行分类,假设机构满足这两个条件:
wine
和cocktails
中至少有一个不为空- 对于
music
,它没有空值
SBR[((SBR.wine != 0)|(SBR.cocktail != 0)) & (SBR.music != 0)].sort_values(by='score', ascending=False)
范围缩小到两个地方了!这对莫伊拉来说已经足够了,但是不行!她希望有一种方法来设想所有的选择,以便做出一个好的选择。好吧,莫伊拉,如你所愿!
让我们将变量rating
(代表平均升值幅度)total_ratings
(表示受欢迎程度)和price_range
(表示一个地方的可负担程度)考虑在内,并将SBR
中的所有机构绘制在一个网格上。
但在此之前,我们需要删除total_ratings
中的括号和逗号,将系列转换为数字,并将price_range
中的美元符号改为更有意义的符号(美元符号出于某种原因会导致错误) :
SBR.total_ratings = SBR.total_ratings.replace('(\(|\)|,)', '', regex=True)SBR.total_ratings = SBR.total_ratings.astype(int)SBR.price_range = SBR.price_range.replace({'$$':'Affordable', '$$$':'Pricy' })
现在是网格。我们将使用一个散点图,X 轴是total_ratings
,Y 轴是rating
。颜色会根据price_range
变化。我还添加了注释,以显示牛排馆**、【迷你烧烤牛排馆】(MG)** (博客推荐)的位置,以及获得良好评分的两个地方,、【肉吧】(MB) 和**、【生活格拉斯哥】(LG)** :
结果是,博客推荐的“迷你烧烤牛排屋”(Mini Grill steak house)(MG)(T13)在平均评分方面表现异常出色,但在对 Moira 最重要的东西(饮料和音乐)方面得分很低。“肉吧”(MB) 另一方面得分很高(33),在受欢迎程度和平均评分方面仅略低于 MG 。
莫伊拉现在很满意,她已经下定决心了。希望现在打电话预订还不算太晚!
意大利罗马的历史地标:
sbmeaper 1——Flickr.com 的照片(公共领域)
安东尼奥是一名高中历史老师。他计划和他的一群学生去意大利首都罗马进行为期三天的实地考察,参观那里最受欢迎的历史地标。然而,他知道每年的这个时候罗马都挤满了游客,他主要关心的是在参观某些地点时避免排长队和拥挤的人群,尤其是在高峰时段。这就是为什么我们要帮助他安排他的访问,以确保他的学生最大程度的舒适。
和往常一样,我们将使用我们的代码从谷歌地图中抓取有用的信息。这一次,我们将增加一种新的信息:流行次数:
当你访问万神殿的页面时,谷歌地图会显示上图(一个以前的大寺庙,现在是罗马的教堂)。根据谷歌地图:“在流行时间图上,任何给定小时的流行度相对于该企业一周的典型峰值流行度来显示”。因此,周六下午 4 点参观万神殿是一个非常糟糕的主意,因为这是一周中最繁忙的时间(因此属性aria-label
的值为 100%)。
在这种情况下,我们不会搜索特定的地方。我们将简单地在谷歌地图上搜索**【罗马旅游景点】**(尽量宽泛)。现在让我们运行我们的代码:
完成后,让我们用提取的列表制作一个数据框架。我们称之为HL
历史地标:
HL = pd.DataFrame(data={'full_name':full_name, 'rating':rating, 'total_ratings':total_ratings, 'landmark_category':landmark_cat, 'description':description, 'address':address, 'hours':hours})
像往常一样,让我们保存这个数据帧:
HL.to_csv('historical_landmarks.csv', index=False)
打开它:
HL = pd.read_csv('historical_landmarks.csv')
如果你记得的话,安东尼奥希望团队只参观最受欢迎的景点,因为行程只有 3 天。为了从HL
中选择 10 个最受欢迎的历史地标,我们需要将total_ratings
转换成一个数字向量:
HL.total_ratings = HL.total_ratings.replace('\(|\)|,', '', regex=True)HL.total_ratings = HL.total_ratings.astype(float)
让我们制作一个新的数据框架HL10
,包含来自HL
的最受欢迎的城市:
HL10 = HL.sort_values(by='total_ratings', ascending=False).head(10).copy()HL10
我们选择的罗马十大最受欢迎的景点(您的结果可能会有所不同)
我们主要关心的是在游览这些热门目的地时避开高峰时间。例如,让我们看看变量hours
在罗马竞技场中是什么样子的:
str(list(HL10[HL10.full_name == 'Colosseum'].hours))
在我们的HL10
数据帧中,hours
是一个列表,描述了 7 天内(从周日到周六)任何一个小时(从早上 6 点到晚上 11 点)有多忙。为了使分析更容易,我们将为HL10
中的 8 个位置中的每一个位置创建一个新的空数据帧,以天为索引,以小时为列。为此,我们将使用这个自定义函数:
让我们用斗兽场来测试一下:
colosseum = visit_planner('Colosseum')
colosseum
现在让我们用相应的值填充10 AM
列。我们将在这里使用正则表达式:首先,我们捕获字符串***% busy at 10 AM
,然后我们使用\d+
捕获其中的数字,由于这里有 2 个数字(百分比和 10),我们使用索引[0]
选择第一个数字。最后,我们将向量转换为整数:
成功了!让我们将相同的代码应用于循环中的所有时间:
现在让我们在热图上显示这些数据:
如果我们认为大约 50%的比率对团队来说已经足够舒适(其人口是一周中最繁忙时间的一半),并且我们需要至少 2 个小时才能参观完一个地方,那么参观罗马圆形大剧场的最佳日期和时间是:
- 星期三一天中的任何时间
- 周一、周二和周四上午8 点到 11 点和下午2 点到 7 点
- 周五和周末但仅从下午 4 点到 6 点
- 避开周末,尤其是从上午 11 点到下午 2 点(T42)
让我们在另一个地方尝试同样的事情,那就是梵蒂冈博物馆。在这种情况下,事情有点不同,因为这个地方在周日关闭,我们用于两个预览地方的方法将不起作用,除非我们将周日行从数据框中删除:
现在,这是一个很难安排的时间,因为我们只有 7 个小时的访问时间,从上午 9 点到下午 4 点。所以,参观梵蒂冈博物馆的最佳日子和时间是:
- 周三全天
- 周二下午2 点到 4 点和周四上午9 点到 11 点和下午2 点到 4 点****
- 周一**、周五和周六要避开**
安东尼奥对这一新获得的信息很满意。这将有助于他计划这次访问,最大限度地利用他与学生在欧洲最具历史意义的城市之一度过的三天时间。
注意:如果你想为一个地方做一个热图,你得到了错误Length of values does not match length of index
,确保那个地方的hours
列表有从早上 6 点到晚上 11 点的所有时间(总共 18 个,重复 7 次,总共 126 个元素)。如果缺少一个或多个,请尝试再次运行 web 抓取代码。
如果您有任何意见或问题,请随时在这里或 LinkedIn 上给我发消息。我很乐意回答。