TowardsDataScience 博客中文翻译 2021(三百七十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何改进时间序列的深度学习预测—第 2 部分

原文:https://towardsdatascience.com/how-to-improve-deep-learning-forecasts-for-time-series-part-2-c11efc8dfee2?source=collection_archive---------24-----------------------

时序数据聚类背后的代码。

之前的文章中,我们解释了时间序列数据的聚类是如何工作的。在本帖中,我们将深入探究代码本身。

所有的东西都会用 python 写,但是大多数库都有 R 版本。我们将努力保持相对较高的水平,但如果你想了解更多,代码会有一些有用的资源。

事不宜迟,我们开始吧。

0 —数据创建

为了有助于解释,让我们利用一个理论上的例子:我们试图通过使用来自世界各地本地市场的信息来预测黄金价格。

首先,我们开发一个 1000 x 10 的数据帧。每行对应一个独特的时间点,在我们的例子中是一天,每列对应一个不同的黄金市场。我们数据框中的所有值都是价格。

# create data
rng = pd.date_range('2000-01-01', freq='d', periods=n_rows)
df = pd.DataFrame(np.random.rand(n_rows, n_cols), index=rng)

上面的代码极大地简化了我们的例子。一个概念性的问题是,价格总是取 0 到 1 之间的值,然而代码的教训仍然适用。

创建了一个合成数据框,让我们把它变脏。

# "unclean" data
df = df.apply(lambda x: make_outliers_on_col(x), axis='index')
df = df.apply(lambda x: make_nan_on_col(x), axis='index')

上面的函数在我们的数据框中随机输入了 10 个异常值和 10 个空值。我们生成的数据框看起来像这样…

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

图 1:合成数据会丢失值和异常值。作者图片

1 —数据清理

有两个主要的数据清理步骤:缺失数据插补和异常值剔除。幸运的是,熊猫有一些简单的内置方法可以帮助我们。

# interpolate missing values
df = df.interpolate(method='spline', order=1, limit=10, limit_direction='both')# interpolate outliers
df = df.apply(lambda x: nullify_outliers(x), axis='index')
df = df.interpolate(method='spline', order=1, limit=10, limit_direction='both')

我们的策略很简单。我们首先使用样条插值法估算所有缺失的数据。然后,我们用空值替换所有异常值,并再次使用样条插值。

论文提出了多种缺失值插补方法,其中一些包括插值(如上所示)奇异值分解(SVD)插补K 近邻(KNN)插补

如果你在乎速度,SVD 或者插值是你最好的选择。KNN 可能会提供更好的结果,但它的计算量更大。

在这一步结束时,我们将得到如图 2 所示的数据框:

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

图 2:合成清理数据将缺失值和离群值进行估算。作者图片

2 —聚类

有了清晰的数据集,我们现在将寻找具有相似特征的黄金市场。我们的假设是,相似的市场将更容易被模型拟合,从而导致更准确的预测。

论文中引用的最有效的分类类型包括利用每个时间序列的特征。我们会看两种类型:时间序列和信号处理特征

# TS-specific features
autocorrelation = df.apply(lambda x: acf(x, nlags=3), axis='index')
partial_autocorrelation = df.apply(lambda x: pacf(x, nlags=3), axis='index')# Signal-processing-specific features
fast_fourier_transform = df.apply(lambda x: np.fft.fft(x), axis='index')
variance = df.apply(lambda x: np.var(x), axis='index')

从这里,我们可以对每对特征集执行 k-means 聚类。为了简单起见,我们只限于两个特性,但是本文列举了两个组的四个潜在特性。

import numpy as np
from scipy.cluster.vq import kmeans2# setup ts and signal features for clustering
features = [np.array([autocorrelation, partial_autocorrelation]),
            np.array([fast_fourier_transform, variance])]for f in features:
    # cluster
    out = kmeans2(f, 2)
    cluster_centers, labels = out # ...

上面的代码将我们的 10 个黄金市场分成两个不同的组,如图 3 所示。

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

图 3:我们的时间序列数据的聚类。左图使用时间序列特征,右图使用信号处理特征。图片作者。

既然我们已经将数据分组到“相似的”时间序列中,我们就可以为每个组建模了。

3 —预测模型

该论文认为双向 LSTM 具有最好的精确度。尽管名字很吓人,双向 LSTM 只是两个 LSTM。第一种是用常规输入进行前向后向训练。第二种是用反向输入向量从后向前训练的。

通过在一个时期内创建两个学习结构,模型通常会更快地收敛,并更完整地学习数据中的结构。

然而,为了简单起见,我们将使用基本的 LSTM,但是这些概念可以很容易地应用于更复杂的模型结构。

在这样做之前,重要的是要注意我们在每个聚类中对时间序列值进行了平均。有些模型,如 DeepAR ,适合多个时间序列,并输出单一预测。然而,普通 LSTMs 需要单变量数据。

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM# fit basic LSTM
model = Sequential()
model.add(LSTM(4, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=n_epoch, batch_size=1, verbose=2)

上面的代码在所有 4 个数据集上迭代运行,它们的精度如图 4 所示。

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

图 4:我们每个集群的时间序列预测。蓝色是原始数据,橙色是训练 preds,绿色是我们的预测。图片作者。

仅通过视觉判断,我们的预测似乎没有太大差异,所以让我们看看每个模型的均方根误差(RMSE)。

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

图 5:我们四个模型的 RMSE。图片作者。

图 5 为我们的评估增加了更多的粒度。我们可以看到,TS 功能在群集 1 上的表现优于信号功能,但在群集 2 上表现较差。总的来说,每组的聚类 1 和聚类 2 之间的平均 RMSE 是相似的。

现在你可能想知道为什么不同组的表现如此相似。如果你还记得,我们的数据生成机制对所有时间序列都是一样的。

聚类的目的是提取时间序列模型中的系统差异。然后我们可以为每一个开发一个专门的模型。

如果数据具有相同的底层数据生成机制,聚类将无助于预测性能。

4 —后续步骤

以上演练的完整代码可以在这里看到。然而,对于具有真实世界数据的建模项目,建议进行更多的尝试。

例如,利用主题知识来了解时间序列应该如何分组也是非常有益的。黄金数据的一个例子是在相似的地理位置对时间序列进行聚类。如果你没有主题知识,这里有更多的想法:

  • 聚集更多功能
  • 同时在 TS 和基于信号的功能上集群
  • 使用更复杂的深度学习结构
  • 介绍静态特性(文章讨论了这方面的架构)

感谢阅读!我会再写 30 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。

提高你的编程技能

原文:https://towardsdatascience.com/how-to-improve-programming-skills-for-data-scientists-and-machine-learning-practitioners-d865d8aadab1?source=collection_archive---------26-----------------------

编程;编排

从机器学习从业者的角度来看,提高编程技能的五种方法。

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

罗曼·辛克维奇在 Unsplash 上拍摄的照片

我讨厌编程!

这是七年前我实习时对我的同学们说的话。这是真的。我避免像公共交通工具上的无面具人一样编写项目。

快进到今天,我已经获得了编码相关学科的两个高级学位,在五家不同的公司担任 web 开发人员,现在我是一名计算机视觉工程师。

我爱编程!

如果有人问我为什么对技术如此热情,我会这么说。我对编程的热爱源于这样一种认识,即用代码实现一个应用程序实际上在一个技术驱动的社会中打开了机会。

这篇文章介绍了我用来确保我的编程技能不断提高的方法。对你来说,这篇文章将介绍五个策略,你可以采用它们来提高你的编程技能

1.练习算法

算法往往会吓跑很多 ML 从业者,包括我。机器学习领域作为一种消除实现启发式算法来检测模式的需要的方法而出现,我们将特征检测留给神经网络。

尽管如此,算法在软件和计算领域仍有一席之地,当然在机器学习领域也有一席之地。

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

Pankaj PatelUnsplash 上拍摄的照片

练习算法的实现是提高编程技能的推荐方法之一。

除了在实现内存高效代码上建立直觉的明显好处之外,处理算法还有另一个好处,那就是发展解决问题的思维

实现算法包括在您选择的编程语言中探索各种数据结构和数据修改方法。理解如何在编程语言中利用数据对象、方法和其他有用的功能可以提高编程效率

数据科学家经常实现数据挖掘和 web 抓取算法。对算法和数据结构有很好的理解可以帮助实现高效的代码,在生产中执行得更快。这具有减少总项目交付时间的连锁效应。

算法有不同的复杂程度,但这里有一个简单算法对的解释,可以让你热身。

亲身经历

作为一名移动计算机视觉工程师,我利用许多深度学习模型来完成常见的 CV 任务,如姿势估计、对象检测等。

尽管 PyTorch、TensorFlow 和 Keras 等平台抽象了模型实现的复杂性,但我发现需要为特定用例实现定制算法。

例如,创建具有余弦相似度的姿态匹配算法,或者有效地遍历作为机器学习模型的输出而获得的数据结构。

为了确保我对各种算法有足够的了解,以至于*危险,*我购买了圣杯

《算法导论》教科书可能不是一个完全对初学者友好的算法世界介绍,在这种情况下,像 HackerRankCodeWars 这样的平台是有益的。

2.技术书籍

从书本中学习确实让我感觉像回到了学校——没有被拘留,但是没有什么能比得上从写得很好的健壮的技术书籍中获得的知识。

在我职业生涯的早期,我一直认为我最终会停止观看 YouTube 教程和购买编码书籍,主要是因为我将获得*‘忍者级’*编码技能。

几年过去了,我已经意识到,无论你消费多少,关于编程语言,你总能学到更多。尽管我很喜欢通过 YouTube 编码教程学习,但是没有什么可以取代优秀的技术编码书籍中丰富而简明的知识。

以 Python 为例,它是数据科学家的标准编程语言。Python 是一种容易掌握的语言。经过几周对语法、数据结构和常用函数的学习,实现和运行定制 python 脚本变得很容易。你或许可以通过视频将 Python 学习到中级技能。

但是,Python 编程语言还有很多东西需要探索,可以提高您的编程技能。我发现更多关于 Python 语言的一种方式是通过技术书籍,更具体地说是 流利的 Python 。这本书对初学者来说并不友好,但它的目标读者是希望提高 Python 语言熟练程度的中级到专家程序员。

总之,技术书籍通过提供对编程语言的简单介绍,提高了数据科学家的编程技能。此外,通过对编程语言的深入探索,提升数据科学家的现有编程技能。

3.阅读其他开发人员的代码

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

照片由海拉戈斯蒂奇Unsplash 上拍摄

最近我尝试实现了 Inception Network,这是一个深度学习卷积神经网络。

虽然我有自己的方法来使用 Python 和 TensorFlow 库实现网络,但我很好奇其他 ML 从业者是如何实现网络的。

我的探索将我带到了几个 GitHub 库。我研究了其他开发人员的代码,不用说,我学习了改进我的实现方法的方法,并在我现有的编程技能基础上进行更广泛的开发。

有大量的公共 GitHub repos 可供探索和学习。你不必在谷歌或脸书这样的科技公司工作,也可以向他们的开发者学习。简单地探索由他们的工程师开发的项目的公共存储库。对于数据科学家来说,这可能意味着探索 repos,例如最近发布的 Detectron2 或其他开源机器学习工具。

在您的工作场所,在您的内部开发团队中进行代码评审是一种合适的学习方法。通过理解其他开发人员实现方法背后的推理和直觉,您间接地扩展了您的视野和编程知识。

4.学习其他编程语言

致力于编程语言的多样性是提高编程技能的可靠途径。程序员实现代码来解决问题,多种编程语言的知识扩展了解决问题的工具。

仅仅了解 Python 就可以帮助你学习数据科学的核心实践方面。也就是说,在专业/实践环境中,软件开发包含不同的平台,每个平台都有特定的语言用于访问和实现功能。

一个专业的 ML 从业者角色可能在下面显示的方法中利用不同的编程语言:

  • JavaScript 从互联网上抓取数据
  • SQL 修改和查询数据库
  • Python 实现算法和 ML 模型
  • Swift/Kotlin/Java 开发集成了 ML 模型的移动设备应用
  • 还有很多。

一旦你已经精通了一门编程语言,学习一门新的编程语言就更容易了。如果你理解传统的软件开发范例,比如面向对象编程、函数式编程等等,那就更容易了。软件开发范例知识适用于各种编程语言。

5.遵守软件开发原则

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

阿尔瓦罗·雷耶斯在 Unsplash 上拍摄的照片

拥抱简单,避免重复,提高可读性。

这些是我在多年的编码工作中积累的经验。它们可能听起来很简单,但是这些原则是大多数开发人员所缺乏的,我有时会忘记坚持这些实践。

因此,在软件工程领域中,教授并实施了一些原则,以确保开发人员实践干净高效的软件开发。下面我列举了几个。

在开发软件时,eepItSimpleStupid 加强了简单的概念。一个问题的解决方案不需要很复杂,在软件开发的设计和实现阶段采用简单性可以确保编写的代码容易理解和维护。

是的,炫耀可能很诱人,但为了可读性,保持简单— 你是 而不是机器人先生

固体

Solid 包含一组原则,旨在确保面向对象的开发人员构建可重用、可伸缩、可维护和高效的程序。要了解 SOLID 中所涵盖的原理的更多用法和实用性,请查看 Katerina Trajchevska 的视频。

  • 单一责任原则
  • O 关笔原理
  • L 伊斯科夫替代原理
  • I 界面偏析原理
  • D 依赖反转原理

干燥的

DDtReY我们自己动手。这个原则非常自我描述。在实现程序时,编写执行现有功能的代码是对开发时间的低效利用。避免重复的一个好方法是利用项目文件夹中的实用程序文件。实用程序文件包含经常在源代码中执行的常见任务。

值得注意的提及

个人项目

承担一个个人项目向一些 ML 从业者介绍新的领域、库、平台、框架和编程语言。

使用个人项目来提高你的编程技能的主要好处在于可以接触到开发软件产品时遇到的不同问题。通过编程解决的每个问题都会增加您的总体技术经验。

教学

教育他人如何用你有经验的语言编写程序是一种行之有效的方法,可以提高你的编程技能,展示你的专业知识。

你可以用各种方式教学,或者通过 YouTube 视频,在线课程,或者我最喜欢的媒体文章。

结论

提升你的编程技能是一段没有目的地的旅程。编程总有你可以学习或改进的地方。

学会享受学习的过程。

有时事情确实变得棘手,StackOverflow 可能没有所有的答案,但请记住,每一次努力和每一分钟磨练你的手艺都会走向精通。

感谢阅读

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮箱列表 获取每周简讯
  2. 跟我上
  3. LinkedIn Twitter 上连接并联系我

如何提高回归模型的准确性

原文:https://towardsdatascience.com/how-to-improve-the-accuracy-of-a-regression-model-3517accf8604?source=collection_archive---------0-----------------------

提高模型精度的提示和技巧

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

马克 A 在 Unsplash 上的照片

在这篇文章中,我们将看到如何处理回归问题,以及如何通过使用特征转换、特征工程、聚类、boosting 算法等概念来提高机器学习模型的准确性。

数据科学是一个迭代的过程,只有经过反复实验,我们才能获得满足我们需求的最佳模型/解决方案。

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

数据科学流程图-作者图片

让我们通过一个例子来关注上面的每个阶段。我有一个健康保险数据集 (CSV 文件),里面有保险费用、年龄、性别、身体质量指数等客户信息。我们必须根据数据集中的这些参数来预测保险费用。这是一个回归问题,因为我们的目标变量——费用/保险成本——是数字。

让我们从加载数据集和探索属性(EDA 探索性数据分析)开始

#Load csv into a dataframe
df=pd.read_csv('insurance_data.csv')
df.head(3)#Get the number of rows and columns
print(f'Dataset size: {df.shape}')
**(1338,7)**

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

健康保险数据框架—作者图片

数据集有 1338 条记录和 6 个特征。吸烟者、性别和地区是分类变量,而年龄、身体质量指数和儿童是数字变量。

处理空值/缺失值

让我们检查数据集中缺失值的比例:

df.isnull().sum().sort_values(ascending=False)/df.shape[0]

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

列中空值的百分比-按作者排序的图像

年龄和身体质量指数有一些空值——尽管很少。我们将处理这些丢失的数据,然后开始我们的数据分析。Sklearn 的simple imputr允许您根据相应列中的平均值/中值/最频繁值替换缺失值。在这个例子中,我使用中间值来填充空值。

#Instantiate SimpleImputer 
si=SimpleImputer(missing_values = np.nan, strategy="median")
si.fit(df[[’age’, 'bmi’]])

#Filling missing data with median
df[[’age’, 'bmi’]] = si.transform(df[[’age’, 'bmi’]])

数据可视化

既然我们的数据是干净的,我们将通过可视化和地图来分析数据。一个简单的 seaborn pairplot 可以给我们很多见解!

sns.pairplot(data=df, diag_kind='kde')

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

Seaborn Pairplot —作者图片

我们看到了什么…?

  1. 收费和孩子是倾斜的。
  2. 年龄与电荷呈正相关。
  3. 身体质量指数服从正态分布!😎

Seaborn 的箱线图和计数图可用于显示分类变量对电荷的影响。

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

分类变量的 seaborn 计数图—作者图片

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

作者图片

基于上述图的观察结果:

  1. 男性和女性在数量上几乎相等,平均而言,男性和女性的平均收费也相同,但男性的收费范围更大。
  2. 吸烟者的保险费相对较高。
  3. 有两到三个孩子的人收费最高
  4. 客户几乎平均分布在四个地区,所有的都有几乎相同的费用
  5. 女性吸烟者的百分比低于男性吸烟者的百分比。

因此,我们可以得出结论,“吸烟者”对保险费有相当大的影响,而性别的影响最小。

让我们创建一个热图来了解费用和数字特征(年龄、身体质量指数和儿童)之间的关联强度。

sns.heatmap(df[['age', 'bmi', 'children', 'charges']].corr(), cmap='Blues', annot=True)
plt.show()

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

相关图-作者提供的图片

我们看到年龄和身体质量指数与电荷有平均+ve 的相关性。

现在,我们将逐一介绍模型准备和模型开发的步骤。

  1. 特征编码

在这一步中,我们将分类变量——吸烟者、性别和地区——转换为数字格式(0、1、2、3 等)。)因为大多数算法不能处理非数值数据。这个过程称为编码,有许多方法可以做到这一点:

  1. LabelEncoding 将分类值表示为数字(例如,值为意大利、印度、美国、英国的区域可以表示为 1、2、3、4)
  2. OrdinalEncoding 用于将基于等级的分类数据值表示为数字。(例如用 1,2,3 表示高、中、低)
  3. 一键编码-将分类数据表示为二进制值-仅限 0 和 1。如果分类特征中没有很多唯一值,我更喜欢使用一次性编码而不是标签编码。在这里,我在 Region 上使用了 pandas 的一个热编码函数( get_dummies ),并将它分成 4 列——location _ NE、location_SE、location_NW 和 location_SW。你也可以为这个专栏使用标签编码,然而,一个热门编码给了我一个更好的结果。
#One hot encoding
region=pd.get_dummies(df.region, prefix='location')
df = pd.concat([df,region],axis=1)
df.drop(columns='region', inplace=True)df.sex.replace(to_replace=['male','female'],value=[1,0], inplace=True)
df.smoker.replace(to_replace=['yes', 'no'], value=[1,0], inplace=True)

2。特征选择和缩放

接下来,我们将选择对“费用”影响最大的功能。我选择了除性别之外的所有特征,因为它对“电荷”的影响很小(从上面的 viz 图表得出的结论)。这些特征将形成我们的“X”变量,而电荷将成为我们的“y”变量。如果有许多功能,我建议您使用 scikit-learn 的 SelectKBest 进行功能选择,以获得顶级功能。

#Feature Selection 
y=df.charges.values
X=df[['age', 'bmi', 'smoker', 'children', 'location_northeast', 'location_northwest', 'location_southeast', 'location_southwest']]#Split data into test and train
X_train, X_test, y_train, y_test=train_test_split(X,y, test_size=0.2, random_state=42)

一旦我们选择了我们的特征,我们需要“标准化”的数字——年龄,身体质量指数,儿童。标准化过程将数据转换为 0 到 1 范围内的较小值,以便所有数据都位于相同的范围内,并且一个不会超过另一个。我这里用的是标准定标器

#Scaling numeric features using sklearn StandardScalar
numeric=['age', 'bmi', 'children']
sc=StandardScalar()
X_train[numeric]=sc.fit_transform(X_train[numeric])
X_test[numeric]=sc.transform(X_test[numeric])

现在,我们已经准备好创建我们的第一个基本模型😀 .我们将尝试线性回归和决策树来预测保险费用

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

模型分数-按作者分类的图片

平均绝对误差( MAE )和均方根误差( RMSE )是用于评估回归模型的指标。你可以在这里阅读更多关于它的。我们的基准模型给出了超过 76%的分数。在两者之间,决策树给出了更好的 MAE 2780。不错…!

让我们看看如何使我们的模型更好。

3A。特征工程

我们可以通过操纵数据集中的一些特征来提高我们的模型得分。经过几次尝试后,我发现以下项目可以提高准确性:

  1. 使用 KMeans 将相似的客户分组。
  2. 在区域列中,将东北和西北区域分为“北”,将东南和西南区域分为“南”。
  3. 将“children”转换为名为“more_than_one_child”的分类特征,如果孩子的数量大于 1,则为“Yes”
from sklearn.cluster import KMeans
features=['age', 'bmi', 'smoker', 'children', 'location_northeast', 'location_northwest', 'location_southeast', 'location_southwest']
kmeans = KMeans(n_clusters=2)
kmeans.fit(df[features])df['cust_type'] = kmeans.predict(df[features])df['location_north']=df.apply(lambda x: get_north(x['location_northeast'], x['location_northwest']), axis=1)df['location_south']=df.apply(lambda x: get_south(x['location_southwest'], x['location_southeast']), axis=1)df['more_than_1_child']=df.children.apply(lambda x:1 if x>1 else 0)

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

所有功能-按作者分类的图像

3B。特征转换

从我们的 EDA 中,我们知道“电荷”(Y)的分布是高度偏斜的,因此我们将应用 scikit-learn 的目标转换器— QuantileTransformer 来使这种行为正常化。

X=df[['age', 'bmi', 'smoker', 'more_than_1_child', 'cust_type', 'location_north', 'location_south']]#Split test and train data
X_train, X_test, y_train, y_test=train_test_split(X,y, test_size=0.2, random_state=42)model = DecisionTreeRegressor()
regr_trans = TransformedTargetRegressor(regressor=model, transformer=QuantileTransformer(output_distribution='normal'))
regr_trans.fit(X_train, y_train)
yhat = regr_trans.predict(X_test)
round(r2_score(y_test, yhat), 3), round(mean_absolute_error(y_test, yhat), 2), round(np.sqrt(mean_squared_error(y_test, yhat)),2)**>>0.843, 2189.28, 4931.96**

哇…高达 84%…而 MAE 已经减少到 2189 了!

4。使用集成和增强算法

现在我们将在基于系综的 RandomForest、GradientBoosting、LightGBM 和 XGBoost 上使用这些特性。如果你是一个初学者,不知道助推和装袋方法,你可以在这里阅读更多关于它们的内容。

X=df[['age', 'bmi', 'smoker', 'more_than_1_child', 'cust_type', 'location_north', 'location_south']]model = RandomForestRegressor()
#transforming target variable through quantile transformer
ttr = TransformedTargetRegressor(regressor=model, transformer=QuantileTransformer(output_distribution='normal'))
ttr.fit(X_train, y_train)
yhat = ttr.predict(X_test)r2_score(y_test, yhat), mean_absolute_error(y_test, yhat), np.sqrt(mean_squared_error(y_test, yhat))**>>0.8802, 2078, 4312**

是啊!我们的随机森林模型确实表现不错——2078 年的👍。现在,我们将尝试一些增强算法,如梯度增强、LightGBM 和 XGBoost。

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

模型分数-按作者分类的图像

好像都表现不错:)

5。超参数调谐

让我们调整一些算法参数,如树深度、估计器、学习率等,并检查模型的准确性。手动尝试不同的参数值组合非常耗时。Scikit-learn 的 GridSearchCV 自动完成这一过程,并计算这些参数的优化值。我已经将 GridSearch 应用到上述 3 个算法中。下面是 XGBoost 的例子:

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

GridSearchCV 中参数的最佳值—按作者排序的图像

一旦我们有了参数的最佳值,我们将用这些值再次运行所有 3 个模型。

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

模型分数-按作者分类的图像

这样看起来好多了!我们已经能够提高我们的准确性——XGBoost 给出了 88.6%的分数,错误相对较少👏👏

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

1.费用预测值和实际值的分布图;2.剩余情节—作者提供的图像

分布图和残差图证实预测费用和实际费用之间有很好的重叠。然而,有一些预测值远远超出了 x 轴,这使得我们的 RMSE 更高。这可以通过增加我们的数据点来减少,即收集更多的数据。

我们现在准备将该模型部署到生产中,并在未知数据上进行测试。干得好的👍

简而言之,提高我的模型准确性的几点

  1. 创建简单的新功能
  2. 转换目标变量
  3. 聚类公共数据点
  4. 升压算法的使用
  5. 超参数调谐

你可以访问我的笔记本这里。并不是所有的方法都适用于你的模型。挑选最适合您的场景的方案:)

如何提高 k-Means 聚类算法的解释性

原文:https://towardsdatascience.com/how-to-improve-the-interpretability-of-k-means-clustering-algorithm-3cf0fd0943ba?source=collection_archive---------48-----------------------

k-Means 和 k-Medoids 聚类的深度分析

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

Andri Klopfenstein 在 Unsplash 上拍摄的照片

C 聚类是一种无监督的机器学习技术,它将数据点分离或划分为几个聚类或组,使得同一聚类中的点彼此相似,而不同聚类中的点彼此不同。有各种聚类算法,例如:

  • k 均值聚类
  • 基于密度的噪声应用空间聚类
  • 等级聚类(聚集和分裂)
  • 光学
  • 模糊聚类

还有很多。k-Means 聚类是一种流行的无监督聚类算法。在本文中,您可以了解 k-Means 算法的数学背景,以及如何使用 k-Medoids 算法提高其可解释性。

k 均值聚类:

k 均值聚类是一种基于质心的聚类算法。它将数据点分组成 k 个簇,使得相同簇中的点彼此相似不同簇中的点不同 t。形成的每个簇具有相等的数据点分布。每个聚类由其质心表示。

k 均值算法概述:

k-Means 聚类算法将整个数据集聚类成 k 个独立的聚类。k 均值算法的成本函数为:

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

K-Means 算法的思想是找到 K 个质心点(C1,C1,.。。C_k)通过最小化每个聚类上该点与其质心之间距离的平方和。

这个代价是 NP 难的,并且具有指数级的时间复杂度。所以我们采用劳埃德算法的近似思想,步骤如下:

1。k 个簇形心的初始化:

k 个聚类点被随机初始化。

2。分配:

对于每个数据点,计算这些点和每个聚类质心之间的欧几里德距离。这些点将被分配给质心最近的聚类。

3。质心更新:

通过取分配给该聚类的所有点的平均值来更新每个质心的值。

4。重复步骤 2 和 3,直到收敛:

收敛是指质心的值等于或几乎等于前一次迭代的质心点的值的情况。

k-均值聚类的一个问题是质心点的可解释性。最初,k 个质心中的每一个实际上是来自数据集的点,随着劳埃德算法的迭代,每个质心点的值被更新。质心点的这种更新导致可解释性的损失。

这里,k-Means 的一个更新算法来拯救,被称为 k-Medoids 算法。

k-Medoids 聚类:

k-均值聚类的问题是质心点的可解释性的损失。换句话说,质心点不是数据集中的实际点。k-Medoids 聚类的思想是使每个质心点成为数据集中的一个实际点。这将导致质心点可解释。

k-Medoids 算法的算法与 Lloyd 算法的算法几乎相同,只是在最后一步略有变化。k-Medoids 的算法称为 PAM(围绕 Medoids 划分)。

k-Medoids PAM 算法的步骤:

  1. k 个聚类质心的初始化。
  2. 分作业。
  3. 更新质心:

在 Llyod 算法的情况下,通过计算该聚类中所有点的平均值来更新质心点。

对于 PAM 算法,质心点被更新为,如果在一个聚类中有 m 个点,则用来自该聚类的所有其他(m-1)个点交换先前的质心,并将该点最终确定为具有最小损失的新质心。PAM 算法的损失函数:

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

4。重复步骤 2 和 3,直到收敛。

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

(图片由作者提供),数据集中的 k-Medoids 可解释聚类中心

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

(图片由作者提供),聚类结果散点图

结论:

本文讨论了 k-Means 算法和 k-Medoids 算法的逐步工作算法。此外,如何通过使质心点成为实际数据点来增加 k-Means 算法的可解释性。

PAM 算法使用贪婪方法,可能无法找到全局最优解。与质心相比,Medoids 对异常值更加稳健,但是对于高维数据,它们需要更多的计算。

感谢您的阅读

如何提高(监督)机器学习算法的性能

原文:https://towardsdatascience.com/how-to-improve-the-performance-of-a-supervised-machine-learning-algorithm-c9f9f2705a5c?source=collection_archive---------43-----------------------

性能改进

提高机器学习模型性能的不同技术探讨

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

图片由来自 PixabayJess Foami 提供

如今,每个数据科学家都能够编写代码来训练机器学习算法:加载一个数据集,将其分成训练集和测试集,建立模型并使用训练集训练它就足够了。最后,算法的性能可以在测试集上进行评估。

好吧。一切都显得很简单。但是,当您在实际情况中利用经过训练的模型时,可能会发生它无法正确预测输出的情况。

在本文中,我描述了如何通过以下技巧来提高监督机器学习算法的性能:

  • 数据集的大小
  • 特征选择
  • 平衡数据集
  • 模型的选择

数据集的大小

第一个技巧是增加数据集的大小。可能您的数据集太小,因此模型无法正确学习输出。在监督算法的情况下,您需要手动注释数据集。手工标注可能需要很多时间,所以你可以依赖一些外部平台,比如亚马逊机械土耳其人,相对便宜。

特征选择

构建模型时最重要的一个方面是特征选择,即哪些元素会影响输出。您可能有许多特征,但可能没有一个影响输出,因此您的算法性能很差。为了确定哪些特性会影响输出,您可以使用相关性特性选择方法,该方法计算每个特性与输出之间的相关性,并仅选择相关性大于某个阈值的特性。

下表显示了候选特征和输出(最后一列)之间的相关性示例。影响输出的唯一特征是 PROPNprevious ,阈值大于 0.5。因此,我们只能选择 PROPNprevious 作为输入特征。

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

作者图片

如果你想深化话题,可以阅读Vishal R的这篇有趣的文章。

选择输入特征的其他方法包括信息增益(IG)、卡方(CS)、最佳优先搜索(BFS)、线性向前选择(LFS)和贪婪逐步搜索。如果你想了解这些方法,请继续关注

平衡数据集

平衡数据集意味着所有输出类对应相同数量的输入记录。因此,如果我有 10.000 条输入记录和 2 个输出类,那么一个好的数据集应该有每个输出类 5.000 条输入记录。如果数据集不平衡,您需要平衡它。可以遵循两种可能的策略:

  • 使用例如随机欠采样算法欠采样过估计的类输出;
  • 对低估类输出进行过采样,生成例如合成数据(例如合成少数过采样技术算法)。

模型的选择

这听起来可能很明显,但有时改变模型可以极大地提高性能:)因此,您可以谷歌搜索哪个模型最适合您的目的。

摘要

在这篇文章中,我简要地说明了一些技巧,以提高监督机器学习模型的性能。如果你知道更多的方法和技巧,请给我留言或留言:)

分析技巧包括增加数据集的大小、特征选择、平衡数据集,以及最终选择模型。

在我的下一篇文章中,我将写一些关于如何用 Python 实现每个技巧的教程。敬请期待:)

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

如何用基函数和正则化改进线性回归

原文:https://towardsdatascience.com/how-to-improve-your-linear-regression-with-basis-functions-and-regularization-8a6fcebdc11c?source=collection_archive---------9-----------------------

基础函数和正则化介绍,理论和 Python 实现

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

对过度拟合的模型增加正则化的说明。图片作者。

内容

这篇文章是我将要发表的一系列文章的一部分。你可以通过点击这里在我的个人博客上阅读这篇文章的更详细版本。下面你可以看到该系列的概述。

1.机器学习导论

2。回归

3.分类

基本函数

之前的帖子中我们讨论了线性回归模型

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

我们说一个模型是线性的,如果它在参数中是线性的,而不是在输入变量中。然而, (1)在参数和输入变量中都是线性的,这限制了它适应非线性关系。我们可以通过用输入变量的非线性基函数代替输入变量来扩充模型

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

在哪里

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

通过使用非线性基函数, h 有可能适应 x 的非线性关系,我们将很快看到——我们称这些模型为线性基函数模型

我们已经在系列文章的第一篇文章中看到了基函数的一个例子,其中我们用 x 的幂的基函数扩充了简单的线性回归模型,即,

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

另一种常见的基函数是高斯函数

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

遵循与上一篇文章中相同的推导,我们发现 wα 的最大似然解为

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

在哪里

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

下图显示了具有 M -1 个高斯基函数的线性基函数模型。我们可以看到增加基函数的数量会产生更好的模型,直到我们开始过度拟合

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

使用 m1 高斯基函数(加上截距)的效果图。图片作者。

履行

使用与前几篇文章相同的数据集,我们得到了下面的实现。

正规化

在关于贝叶斯推理的文章中,我们简要地讨论了正则化的概念,我们将其描述为一种防止过度拟合的技术。如果我们回头看看我们在上一篇文章中定义的目标函数(用基函数扩充),我们可以引入一个正则项

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

其中 q > 0 表示正则化的类型, λ 控制正则化的程度。

q 最常见的值是 1 和 2,分别称为 L1 正则化和 L2 正则化。当我们使用 L1 正则化时,我们称之为套索回归,当我们使用 L2 正则化时,我们称之为岭回归

岭回归的目标函数

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

特别方便,因为它是 w 的二次函数,因此具有唯一的全局最小值。其解决方案是

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

其中 α 保持不变,因为正则项对其没有影响。

当我们引入正则化时,模型选择的过程从找到合适数量的基函数到找到正则化参数λ的合适值。

下图显示了一个线性基函数模型,其中 λ 的值不同,而基函数的数量保持不变 M =8。我们可以看到即使我们开始时过度拟合,我们也可以调整正则化参数 λ 来防止它——事实上,当正则化过度时,我们开始欠拟合。另一件有趣的事情是,我们的不确定性随着正则化而增加。

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

对过度拟合的模型增加正则化的说明。图片作者。

履行

摘要

  • 使模型线性的是它在参数而不是输入中是线性的。
  • 我们可以用基函数增加线性回归,产生线性基函数模型
  • 多项式回归是线性基函数模型。
  • 规则化是一种防止过拟合的技术。
  • 在线性回归中有不同种类的正则化,如 L1 和 L2 正则化。

如何在 Python 笔记本中包含 R 和 ggplot

原文:https://towardsdatascience.com/how-to-include-r-and-ggplot-in-a-python-notebook-f2b76091353d?source=collection_archive---------25-----------------------

您可以在同一个 Jupyter 笔记本中混合使用匹配的 Python 和 R——方法如下

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

Python 笔记本中 R 的 ggplot2 中的图片-作者图片

你要么是 R 人,要么是 Python 人,对吧?当然,除非你喜欢 Python 的某些方面和 r 的其他方面。

那么为什么不混搭呢?例如,R 的 ggplot2 是一个很棒的可视化包,那么能够在 Python 程序中使用它不是很好吗?

我们将看看如何实现这一点——这很容易——然后你可以决定是否值得努力。

我将从 Python 用户的角度来处理这个问题,所以我假设您的计算机上已经安装了 Python 和 Jupyter。这意味着你还需要两样东西:R 和一个名为 rpy2 的 Python 包。需要安装 R,因为我们将运行 R 脚本(尽管是在 Python 上下文中),而 rpy2 是两种语言之间的桥梁。

所以,你可以去 R 网站下载你的操作系统版本,然后按照说明安装 R。

完成了吗?好了,接下来我们将打开 R 控制台,看起来像这样:

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

r 控制台—作者图片

我们将使用 ggplot2 可视化软件包,因此需要安装该软件包。在控制台中键入以下内容:

packages.install("tidyverse")

小包装包括 ggplot2 。(如果你想遵循这里的所有代码,你还需要安装软件包 ggalt 。)现在可以关闭 R 控制台了。

接下来,我们用 pip 安装 rpy2 包:

pip install rpy2

我们现在准备编写一个 Python Jupyter 笔记本,它可以运行用 r 编写的单元格。

%load_ext rpy2.ipython

这将加载 rpy2 包并启用 rmagic 命令(我们很快就会看到)。但是首先让我们导入熊猫并创建一个数据框架。

import pandas as pd

这是一个数据帧,代表了 2018 年伦敦记录的月气温。

w = {
  "Month":[1,2,3,4,5,6,7,8,9,10,11,12],
  "Tmax":[9.7,6.7,9.8,15.5,20.8,24.2,28.3,24.5,20.9,16.5,12.2,10.7],
  "Tmin":[3.8,0.6,3.0,7.9,9.8,13.1,16.4,14.5,11.0,8.5,5.8,5.2]
  }weather=pd.DataFrame(w)

这给了我们一个这样的数据框架:

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

天气数据框—图片由作者提供

现在我们将使用 r 中的 ggplot2 绘制一个图形。因此我们打开一个新的单元格,我们需要输入的第一行是这样的:

%%R -i weather -w 15 -h 10 --units cm

%%R将单元标识为 R 代码,随后是一些决定单元如何工作的参数。-i weather将之前创建的 Python 变量导入到 R 单元格、-w 15-h 10— units cm中,使创建的任意图形宽 15 厘米,高 10 厘米。

这是一个完整的单元格,包含了%%R魔法,导入了 ggplot2 库,然后从weather数据帧绘制了一个线图。

%%R -i weather -w 15 -h 10 --units cm 
# import df from Python and set figure size 15 by 10cmlibrary("ggplot2")ggplot(weather,aes(Month, Tmax)) + 
    geom_line() +
    ggtitle("Temperature")

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

简单线形图—作者提供的图片

默认图并不理想,因为 x 刻度实际上应该是从 1 到 12,它可以更漂亮一点。让我们解决这个问题。

%%R -i weather -w 15 -h 10 --units cm 
# import df from Python and set figure size 15 by 10cmlibrary("ggplot2")ggplot(weather) + 
    geom_line(aes(Month, Tmax),color="Red",size=1.25) +
    scale_x_continuous(breaks=seq(1, 12, 1))+
    scale_y_continuous(breaks=seq(-10, 40, 5))+
    labs(y="Temperature", x="Month", 
         title="London Monthly Temperatures 2018") +
    theme_light() +
    theme(panel.grid.minor=element_blank())

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

更好的线图—作者图片

在 R 的 ggplot2 中,我们可以看到一种简洁的方式,一层一层地构建图表。

但是如果我们想在同一个图表上绘制TmaxTmin呢?我们需要转换数据,以便两个值在同一列中。在 Python 中,我们可以通过打开一个新的单元格并输入以下 Python 代码来做到这一点。

weather2=pd.melt(weather, id_vars=['Month'], 
                 value_vars=['Tmax', 'Tmin'],var_name="Temp")

这创建了一个新的数据帧weather2,如下所示。

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

Weather2 数据框架—作者图片

我确信你也可以这样做,但是这里的想法是展示这两种语言是如何混合的。

现在我们可以用 ggplot2 绘制一个图表,通过创建一个像这样的新 R 单元格来绘制这两个值。

%%R -i weather2 -w 15 -h 10 --units cm 
# import df from Python and set figure size 15 by 10cmlibrary("ggplot2")ggplot(weather2,aes(Month, value)) + 
    geom_line(aes(color=Temp),size=1.25)+
    scale_x_continuous(breaks=seq(1, 12, 1))+
    scale_y_continuous(breaks=seq(-10, 40, 5))+
    labs(y="Temperature", x="Month", 
         title="London Monthly Temperatures 2018") +
    theme_light() +
    theme(panel.grid.minor=element_blank())

这给了我们下面的图表:

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

带有两个图的折线图—作者提供的图片

现在,在这一点上,你可能认为这一切都很好,但我可以用 Plotnine 做到这一点,而不会用一种新的语言搞乱我的 Python 笔记本。

from plotnine import *(ggplot(weather2,aes("Month", "value")) + 
    geom_line(aes(color="Temp"),size=1.25)+
    scale_x_continuous(breaks=range(1,13,1))+
    scale_y_continuous(breaks=range(-10, 40, 5))+
    labs(y="Temperature", x="Month", 
         title="London Monthly Temperatures 2018") +
    theme_light() +
    theme(panel_grid_minor=element_blank())
)

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

Plotnine plot —作者图片

当然,这是真的,你可以从上面的代码中看到。Plotnine 是一个很好的包,正如我在这里描述的一样,但它不是 ggplot 的完全克隆,因为它在它所基于的 Matplotlib 所能实现的方面受到限制。

例如,如果我想创建一个像这样的月温度的 dumbell 图会怎么样。

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

一个 dumbell 情节-作者的形象

这个简洁的图表显示了每个月的温度范围,当然,通过一点努力和独创性,我们可以在 Plotnine(或者,实际上,在 Matplotlib)中创建它。但也许这样更简单:

%%R -i weather -w 15 -h 10 --units cm 
# import df from Python and set figure size 15 by 10cmlibrary(ggplot2)
library(ggalt)ggplot(weather, aes(y=Month, x=Tmin, xend=Tmax)) +
  geom_dumbbell(size=1.25, color="Gray",
                colour_x = "Blue", 
                colour_xend = "Red",
                size_x=4,
                size_xend=4) +
  labs(x="Temperature", y="Month", 
       title="London Monthly Temperatures 2018") +
  scale_y_continuous(breaks=seq(1, 12, 1))+
  scale_x_continuous(breaks=seq(-10, 40, 5))+
  theme_light()

ggalt 用额外的绘图类型扩展了 ggplot2 ,这使得绘制 dumbell 图表非常简单。

除了%%R之外,还有一个神奇的命令%R,可以让你在一个 Python 单元格中使用单独的 R 代码行,但是,坦率地说,我认为混合不同语言的单元格会让笔记本变得很乱,所以我就讲到这里。

所以,R 和 Python 在同一个笔记本里——好主意?嗯,也许吧。我喜欢我可以直接使用 ggplot2 ,但是我也喜欢 Plotnine,它允许我专门使用 Python。

关于 rpy2 的内容比我在这里介绍的还要多。更多详情请看他们的网站

一如既往,感谢阅读。如果你想知道我什么时候发表新文章,请考虑在这里注册一个电子邮件提醒

如果你不是一个媒体订阅者,那就注册吧,这样你就可以每月花 5 美元阅读尽可能多的文章。在这里注册,我会赚一点佣金。

如何将 Python 图形插入 HTML 网站

原文:https://towardsdatascience.com/how-to-insert-a-python-graph-into-an-html-web-site-688754f67e1c?source=collection_archive---------1-----------------------

数据可视化

将 Altair 或 Plot.ly 中构建的图形与 HTML 网站集成的简短教程

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

图片来自 Pixabay

正如许多人所知,Python 是一种非常强大的数据操作语言,包括数据收集、数据分析和数据可视化。关于这最后一个方面,存在许多强大的库和框架,如 Plot.ly 图形库和 Altair

Plot.ly 图形库是一个非常强大的库,它允许用 Python、R 和 Javascript 构建图形和地图。Altair 是 Python 的另一个声明性统计可视化库,基于 VegaVega-lite

在本教程中,我假设您已经知道如何使用 Plot.ly 或 Altair 构建图形。我将只说明如何将一个现有的图形与一个 HTML 网站集成。

将 Python 图形集成到 HTML 网站需要三个步骤:

  • 在 Plot.ly 或 Altair 中生成图形
  • 将图表保存为 HTML 页面
  • 操作生成的 HTML

Plot.ly

首先,我在 Plot.ly 中构建了一个通用图。在这个具体的例子中,我将关于意大利新冠肺炎阳性病例数的时间序列作为输入数据。我利用以下 Python 代码绘制了一条线:

import plotly
import plotly.graph_objs as go
import pandas as pddf = pd.read_csv('[https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-andamento-nazionale/dpc-covid19-ita-andamento-nazionale.csv'](https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-andamento-nazionale/dpc-covid19-ita-andamento-nazionale.csv'))# Create a trace
data = [go.Scatter(
    x = df['data'],
    y = df['totale_positivi'],
)]layout = go.Layout(
        xaxis=dict(
            title='Data',    
        ),
        yaxis=dict(
            title='Totale positivi',  
        )
    )
fig = go.Figure(data=data, layout=layout)

下图显示了生成的输出:

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

作者图片

现在,我可以将该图保存为 HTML 文件。我利用了plotly.offline.plot()函数。作为一个配置参数,我指定在绘图中不显示模式栏(config={‘displayModeBar’: False})。这是为了避免让用户操纵 HTML 页面中的图像。

plotly.offline.plot(fig,filename='positives.html',config={'displayModeBar': False})

现在我可以打开文件positives.html并操作它。该文件类似于下面这段代码:

<html>
  <head><meta charset="utf-8" /></head>
  <body>
    <div>
        <script type="text/javascript">window.PlotlyConfig =  
             {MathJaxConfig: 'local'};
        </script> <script type="text/javascript">
          ...
        </script> <div id="9eec8ee0-8ebf-4199-8f61-7f86aab4cc81" class="plotly-graph-div" style="height:100%; width:100%;"></div> <script type="text/javascript"> 
          ... 
        </script> </div>
  </body>
</html>

该文件由 4 个主要部分组成。第二部分很长。第二部分和第四部分可以复制到两个不同的 javascript 文件中,没有开始和结束标记(<script type=”text/javascript”></script>),命名为chart-part1.jschart-part2.js。现在,我可以用包含的两个 javascript 文件替换 HTML 文件的第二和第四部分:

<html>
<head><meta charset="utf-8" /></head>
<body>
    <div>
        <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script src="js/chart-part1.js"></script>

        <div id="9eec8ee0-8ebf-4199-8f61-7f86aab4cc81" class="plotly-graph-div" style="height:100%; width:100%;"></div>
        <script src="js/chart-part2.js"></script>   
    </div>
</body>
</html>

注意,我已经将chart-part1.jschart-part2.js文件保存到了js文件夹中。现在,我可以将包含在div中的所有代码复制到我的 HTML Web 站点中的任何地方,只要我提醒也将js文件夹复制到我的 Web 站点文件夹中:

<div>
    <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
    <script src="js/chart-part1.js"></script>

    <div id="9eec8ee0-8ebf-4199-8f61-7f86aab4cc81" class="plotly-graph-div" style="height:100%; width:100%;"></div>
    <script src="js/chart-part2.js"></script>   
</div>

阿尔泰尔

在这个例子中,我使用默认的 vega 数据集构建了一个简单的散点图,包含在vega_datasets库中。

import altair as alt
from vega_datasets import datachart = alt.Chart(data.cars.url).mark_point().encode(
    x='Horsepower:Q',
    y='Miles_per_Gallon:Q',
    color='Origin:N'
)

现在我可以通过save()功能保存图表:

chart.save('chart.html', embed_options={'actions': False})

embed_options中,我指定我不想打印动作按钮。或者,正如@ 阿兰·琼斯所建议的,我可以在我的 Plotly 配置中设置staticPlot = True而不是隐藏工具栏(这实际上并不会停止交互)。静态图不是交互式的,也没有工具栏。

生成的 HTML 文件如下所示:

<!DOCTYPE html>
<html>
<head>
  <style>
    .error {
        color: red;
    }
  </style>
  <script type="text/javascript" src="[https://cdn.jsdelivr.net/npm//vega@5](https://cdn.jsdelivr.net/npm//vega@5)"></script>
  <script type="text/javascript" src="[https://cdn.jsdelivr.net/npm//vega-lite@4.8.1](https://cdn.jsdelivr.net/npm//vega-lite@4.8.1)"></script>
  <script type="text/javascript" src="[https://cdn.jsdelivr.net/npm//vega-embed@6](https://cdn.jsdelivr.net/npm//vega-embed@6)"></script>
</head>
<body>
  <div id="vis"></div>
  <script>
    (function(vegaEmbed) {
      var spec = {"config": {"view": {"continuousWidth": 400, "continuousHeight": 300}}, "data": {"url": "[https://cdn.jsdelivr.net/npm/vega-datasets@v1.29.0/data/cars.json](https://cdn.jsdelivr.net/npm/vega-datasets@v1.29.0/data/cars.json)"}, "mark": "point", "encoding": {"color": {"type": "nominal", "field": "Origin"}, "x": {"type": "quantitative", "field": "Horsepower"}, "y": {"type": "quantitative", "field": "Miles_per_Gallon"}}, "$schema": "[https://vega.github.io/schema/vega-lite/v4.8.1.json](https://vega.github.io/schema/vega-lite/v4.8.1.json)"};
      var embedOpt = {"actions": false, "mode": "vega-lite"};function showError(el, error){
          el.innerHTML = ('<div class="error" style="color:red;">'
                          + '<p>JavaScript Error: ' + error.message + '</p>'
                          + "<p>This usually means there's a typo in your chart specification. "
                          + "See the javascript console for the full traceback.</p>"
                          + '</div>');
          throw error;
      }
      const el = document.getElementById('vis');
      vegaEmbed("#vis", spec, embedOpt)
        .catch(error => showError(el, error));
    })(vegaEmbed);</script>
</body>
</html>

我将包含在<script>标签中的代码复制到一个名为chart.js的 javascript 文件中。如果我想将图表包含到 HTML 网页中,我必须将以下部分放在我的 HTML 网页中的任意位置:

<div id="vis"></div>
  <script src="js/chart.js"></script>

我还应该提醒在我的 HTML 页面的头部包含vegavega-litevega-embed javascript 文件。最终结果如下所示:

<!DOCTYPE html>
<html>
<head>
  <style>
    .error {
        color: red;
    }
  </style>
  <script type="text/javascript" src="[https://cdn.jsdelivr.net/npm//vega@5](https://cdn.jsdelivr.net/npm//vega@5)"></script>
  <script type="text/javascript" src="[https://cdn.jsdelivr.net/npm//vega-lite@4.8.1](https://cdn.jsdelivr.net/npm//vega-lite@4.8.1)"></script>
  <script type="text/javascript" src="[https://cdn.jsdelivr.net/npm//vega-embed@6](https://cdn.jsdelivr.net/npm//vega-embed@6)"></script>
</head>
<body>
  <div id="vis"></div>
  <script src="js/chart.js"></script>
</body>
</html>

摘要

在这篇简短的教程中,我演示了如何将 Plot.ly 或 Altair Python graph 包含到 HTML 网站中。

需要三个步骤:生成图形,将其保存为 HTML,并处理输出,使代码易于包含在另一个 HTML 页面上。

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

相关文章

https://codeburst.io/quick-start-with-html-through-bootstrap-bbe6f2f1793 [## 如何改进带注释的 D3.js 图形

towardsdatascience.com](/how-to-improve-d3-js-graphs-with-annotations-252fbb9c5bb5)

如何将 Observablehq 图形插入 HTML 页面

原文:https://towardsdatascience.com/how-to-insert-an-observablehq-graph-into-a-html-page-57a9f4546ecf?source=collection_archive---------23-----------------------

数据可视化

一个快速的教程,用你的可观察图形制作精彩的 HTML 页面。

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

作者图片

Observablehq 是一个非常流行的利用 D3.js 库编写代码的笔记本。由于网上有很多例子和教程,你可以根据自己的需要定制已经制作好的笔记本。

然而,一旦构建了一个图表,就不容易立即嵌入到另一个网站中。

在本教程中,我提出了两种在网站中嵌入图形的策略:

  • 通过 iframe
  • 生成图表的 Javascript。

在这两种情况下,首先,您必须通过点击发布按钮来发布您的笔记本。

此外,在这两种情况下,您都应该遵循以下步骤:

  • 从 Observable 下载嵌入代码
  • 将代码插入 HTML 页面。

在本教程中,我使用了链接中的示例图。

内联框架

第一个解决方案非常简单,也适用于其他网站。它基于 iframes 的使用。实际上,iframe 是一个嵌入在另一个 HTML 文档中的 HTML 文档。

下载嵌入代码

为了下载嵌入代码,您必须在 Observable notebook 中查看您的图表,并单击图表左侧的三个垂直点,如下图所示:

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

作者图片

将打开一个菜单,如下所示:

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

作者图片

您可以选择嵌入,然后从下拉菜单中选择 iframe:

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

图像

然后你可以点击复制按钮。现在代码被复制到你的剪贴板中。复制的代码如下所示:

<iframe width="100%" height="584" frameborder="0"
  src="[https://observablehq.com/embed/@alod83/italian-covid-19-positives?cells=chart](https://observablehq.com/embed/@alod83/italian-covid-19-positives?cells=chart)"></iframe>

将您的代码插入 HTML 页面

现在,您可以将复制的代码插入到您的 HTML 页面中,准确地插入到您希望图形显示的位置。

例如,您可以在段落后插入:

<html>
  <head>...</head>
  <body>
      <p>Before my graph</p>
      <iframe width="100%" height="584" frameborder="0"
  src="[https://observablehq.com/embed/@alod83/italian-covid-19-positives?cells=chart](https://observablehq.com/embed/@alod83/italian-covid-19-positives?cells=chart)"></iframe>
  </body>
</html>

利弊

使用这种技术的主要优点是非常

但是,iframe 不继承父文档属性,如字体。此外,通常 iframe 没有响应性,因为它不能适应小型设备屏幕,如智能手机和平板电脑。

下载 Javascript

将可观察图形嵌入 HTML 页面的另一个策略是下载生成它的完整 javascript。

下载嵌入代码

这一步与下载 iframe 代码的步骤非常相似:

  • 单击图表左侧的三个垂直点
  • 选择嵌入

唯一的区别是,当您必须从下拉菜单中选择代码类型时,您必须选择带有 Javascript 的运行时:

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

作者图片

然后你点击复制。您复制的代码可能很长,因此您应该传递到一个空文档中,并将其命名为graph.js。在我的例子中,生成的代码不是很长,如下所示:

<div id="observablehq-chart-0a7b99e8"></div>
<p>Credit: <a href="[https://observablehq.com/@alod83/italian-covid-19-positives](https://observablehq.com/@alod83/italian-covid-19-positives)">Italian COVID-19 positives by Angelica Lo Duca</a></p><script type="module">
import {Runtime, Inspector} from "[https://cdn.jsdelivr.net/npm/@observablehq/runtime@4/dist/runtime.js](https://cdn.jsdelivr.net/npm/@observablehq/runtime@4/dist/runtime.js)";
import define from "[https://api.observablehq.com/@alod83/italian-covid-19-positives.js?v=3](https://api.observablehq.com/@alod83/italian-covid-19-positives.js?v=3)";
new Runtime().module(define, name => {
  if (name === "chart") return new Inspector(document.querySelector("#observablehq-chart-0a7b99e8"));
});
</script>

你可以看到在代码的开头有一个div,然后是一个有演职员表的段落,最后是以<script>开头的 javascript。这最后一部分可能会很长。

将您的代码插入 HTML 页面

div将包含您的图表,因此您可以将它准确地复制到您希望它出现在 html 中的位置。div应该如下图所示:

<div id="observablehq-chart-0a7b99e8"></div>

例如,您可以在一个段落后复制:

<html>
  <head>...</head>
  <body>
      <p>Before my graph</p>
      <div id="observablehq-chart-0a7b99e8"></div>
  </body>
</html>

现在您可以清理文档chart.js,以便只包含 javascript 代码。您可以删除演职员表和script标签。

最终的chart.js应该如下所示:

import {Runtime, Inspector} from "[https://cdn.jsdelivr.net/npm/@observablehq/runtime@4/dist/runtime.js](https://cdn.jsdelivr.net/npm/@observablehq/runtime@4/dist/runtime.js)";
import define from "[https://api.observablehq.com/@alod83/italian-covid-19-positives.js?v=3](https://api.observablehq.com/@alod83/italian-covid-19-positives.js?v=3)";
new Runtime().module(define, name => {
  if (name === "chart") return new Inspector(document.querySelector("#observablehq-chart-0a7b99e8"));
});

最后一步是将生成的 javascript 文件包含到原始 HTML 页面中,紧跟在包含图表的div之后:

<html>
  <head>...</head>
  <body>
      <p>Before my graph</p>
      <div id="observablehq-chart-0a7b99e8"></div>
      **<script src='chart.js'></script>**
  </body>
</html>

您可以保存 HTML 页面,现在图表已经嵌入到您的 HTML 页面中了!

利弊

这个解决方案应该具有响应性,并继承父文档的所有布局。但是,它的实现比前一个更复杂。

摘要

在本文中,我描述了两种将 Observable 生成的图形插入 HTML 页面的策略:

  • 内联框架
  • java 描述语言

事实上,Observable 还提供了另一种策略, **Runtime with React,**我在本文中没有涉及到。

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

相关文章

[## 如何改进带注释的 D3.js 图形

towardsdatascience.com](/how-to-improve-d3-js-graphs-with-annotations-252fbb9c5bb5)

如何使用 Docker 安装 Apache Kafka 简单的方法

原文:https://towardsdatascience.com/how-to-install-apache-kafka-using-docker-the-easy-way-4ceb00817d8b?source=collection_archive---------0-----------------------

以及如何创建你的第一个卡夫卡主题。提供视频指南。

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

Unsplash 上拍摄的 ThisisEngineering RAEng

在大数据的世界里,可靠的流媒体平台是必不可少的。这就是卡夫卡出现的地方。今天,你将学习如何在你的机器上安装它,并创建你的第一个 Kafka 主题。

想袖手旁观吗?我掩护你:

今天的文章涵盖以下主题:

  • 安装卡夫卡的方法
  • 术语纲要—您需要知道的一切
  • 使用 Docker 安装 Kafka
  • 连接到 Kafka shell
  • 创建你的第一个卡夫卡主题
  • 将 Visual Studio 代码连接到 Kafka 容器
  • 总结和后续步骤

安装卡夫卡的方法

您可以在任何操作系统上安装 Kafka,如 Windows、Mac 或 Linux,但每个操作系统的安装过程都有所不同。因此,我的目标不是涵盖所有的内容,而是在虚拟机中安装 Kafka,并使用 Linux Ubuntu 作为发行版。

但是,由于我用的是装有 M1 芯片的 MacBook,管理虚拟机并不那么容易。将 ISO 映像附加到 VirtualBox 会失败。如果有人知道解决方法,请在下面的评论区告诉我。

因此,您将使用 Docker。我认为这是一个更好的选择,因为你不必手动安装工具。相反,您将编写一个简单的 Docker compose 文件,它将处理所有的事情。最棒的是,它可以在任何操作系统上运行。因此,如果您在 Windows 或 Linux 上阅读本文,一切都将正常工作。你只需要安装 Docker 和 Docker compose。

如果您需要安装 Docker 的说明,请参考视频。

术语纲要—您需要知道的一切

这篇文章绝不是多克尔或卡夫卡的详尽指南。见鬼,这甚至不应该是你关于这些话题的第一篇文章。本节的其余部分将只给出高层次的定义和概述。关于这些概念的更多内容已经超出了本文的范围。

卡夫卡——基本上是一个事件流平台。它使用户能够收集、存储和处理数据,以构建实时事件驱动的应用程序。它是用 Java 和 Scala 编写的,但你不必知道这些来与 Kafka 一起工作。还有一个 Python API。

Kafka broker —单个 Kafka 集群由经纪人组成。它们处理生产者和消费者,并在集群中保持数据复制。

卡夫卡专题 —记录发布的类别。假设你有一个大型新闻网站——每个新闻类别都可以是一个卡夫卡主题。

Kafka producer —你写的一个应用程序(一段代码)来获取数据给 Kafka。

Kafka consumer——你写的一个从 Kafka 获取数据的程序。有时,消费者也是生产者,因为它将数据放在卡夫卡的其他地方。

Zookeeper —用于管理 Kafka 集群,跟踪节点状态,维护主题和消息列表。Kafka 版本 2.8.0 引入了对没有 Zookeeper 的 Kafka 版本的早期访问,但它还没有为生产环境做好准备。

Docker —一个用于构建、部署和管理容器的开源平台。它允许您将应用程序打包到容器中,这简化了应用程序的分发。这样,您知道如果应用程序在您的机器上工作,它将在您部署它的任何机器上工作。

你现在对卡夫卡、动物园管理员和 Docker 中的概念有了一些基本的高层次理解。下一步是使用 Docker 安装 Zookeeper 和 Kafka。

使用 Docker 安装 Kafka

您将需要两个 Docker 映像来运行 Kafka:

你不必手动下载它们,因为docker-compose.yml会为你做的。下面是代码,所以你可以把它复制到你的机器上:

version: '3'

services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localhost
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

如果 2181 或 9092 在您的机器上不可用,请确保编辑端口。现在,您可以打开终端并导航到保存docker-compose.yml文件的文件夹。执行以下命令来提取图像并创建容器:

docker-compose -f docker-compose.yml up -d

-d意味着 Zookeeper 和 Kafka 都将在后台运行,所以它们启动后你就可以访问终端了。

现在,您应该看到下载和配置过程打印到了终端上。我的看起来是这样的,但是请记住,我已经配置了这两个:

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

图 1——Docker 为动物园管理员和卡夫卡创作(图片由作者提供)

就是这样!您可以使用docker ps命令来验证两者都在运行:

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

图 2 — Docker PS 命令(图片由作者提供)

但是你现在能用这两个容器做什么呢?让我们接下来讨论这个问题,打开一个卡夫卡终端,创建你的第一个卡夫卡主题。

连接到 Kafka shell

Zookeeper 和 Kafka 容器运行后,您可以执行以下终端命令来启动 Kafka shell:

docker exec -it kafka /bin/sh

如果你已经决定在docker-compose.yml文件中用不同的名字命名它,只需用container_name的值替换kafka

以下是您应该看到的内容:

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

图 3 —连接到 Kafka shell(图片由作者提供)

现在你已经拥有了创建你的第一个卡夫卡主题所需要的一切!

创建你的第一个卡夫卡主题

所有 Kafka shell 脚本都位于/opt/kafka_<version>/bin:

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

图 4 —所有 Kafka shell 脚本(图片由作者提供)

下面是创建 Kafka 主题必须发出的命令:

kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic first_kafka_topic

其中first_kafka_topic是您的主题名称。因为这是一个虚拟环境,你可以保持replication-factorpartitions为 1。

下面是您应该看到的输出:

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

图 5——创造一个卡夫卡主题(作者图片)

就是这样!大约一秒钟后,主题将被创建。您可以使用以下命令列出所有 Kafka 主题:

kafka-topics.sh --list --zookeeper zookeeper:2181

这是它在我的机器上打印的内容:

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

图 6 —列出卡夫卡主题(作者图片)

这就是你如何创造一个卡夫卡式的话题。你今天不会用它做任何事。下一篇文章将介绍如何用 Python 编写生产者和消费者,但是今天还有其他内容要介绍。

将 Visual Studio 代码连接到 Kafka 容器

不,你今天不会写生产者和消费者,但是你会在下面的文章中写。手动将 Python 文件从您的机器传输到 Docker 容器是非常繁琐的。可以用 Visual Studio 代码直接在 Kafka 容器上写代码。

你需要一个微软官方的 Docker 扩展,所以如果你还没有的话就安装它:

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

图 7 —安装 VSCode Docker 扩展(图片由作者提供)

安装完成后,点击左侧工具条中的 Docker 图标。您会看到所有正在运行的容器都列在顶部:

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

图 8-列出 Docker 容器(作者图片)

您可以通过右键单击该容器并选择附加 Visual Studio 代码选项,将 Visual Studio 代码附加到该容器中。它将打开一个新窗口,并询问您打开哪个文件夹。

转到根目录 (/),您应该会看到几分钟前您在 shell 中看到的所有文件夹:

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

图 9 —通过 VSCode 探索 Kafka 容器(图片由作者提供)

简单,对吧?嗯,的确如此,而且在编写消费者和生产者代码时,这会节省你很多时间。

总结和后续步骤

今天到此为止。您从安装 Docker、Kafka 和 Zookeeper 到创建您的第一个 Kafka 主题并通过 Shell 和 Visual Studio 代码连接到 Docker 容器。

如果您需要通过 Visual Studio 代码安装 Docker 和附加 Kafka shell 的详细说明,请参考视频。

下一篇文章将涉及 Python 中的消费者和生产者,如果你想了解更多关于卡夫卡的知识,请继续关注。

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

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

保持联系

原载于 2021 年 9 月 23 日 https://betterdatascience.comhttps://betterdatascience.com/how-to-install-apache-kafka-using-docker-the-easy-way/

如何在 R Google Colab 中安装包

原文:https://towardsdatascience.com/how-to-install-packages-in-r-google-colab-423e8928cd2e?source=collection_archive---------8-----------------------

GOOGLE COLAB | RSTATS |笔记本

一些限制以及如何克服其中一些限制

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

照片由埃弗顿维拉Unsplash 上拍摄

在我之前的文章中,我已经尝试解释过如何在 Google Colab 中运行 R。简而言之,有两种方式,第一种是使用rpy2在同一个运行时同时使用 R 和 Python,第二种是原生运行 R。

但是,运行 R notebook 时有几个限制。

第一个限制与运行时使用的 R 版本有关。要检查 R 在运行时运行的是什么版本,可以键入:version。这里我指的限制是我们不能选择运行哪个版本的 R。在这篇文章发表之前,Colab notebook 使用的 R 版本是:

platform       x86_64-pc-linux-gnu         
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          4                           
minor          0.4                         
year           2021                        
month          02                          
day            15                          
svn rev        80002                       
language       R                           
version.string R version 4.0.4 (2021-02-15)
nickname       Lost Library Book

这不同于 Python 运行时。你可以选择使用 Python 2 或 Python 3,尽管 Google 目前正试图在 Colab 上停止对 Python 2 的支持。Python 2 的弃用声明可以在 Google Colab FAQ 页面上获得。下面是它的内容:

**Does Colab support Python 2?**The Python development team has declared that Python 2 will no longer be supported after [January 1st, 2020](https://www.python.org/dev/peps/pep-0373/#maintenance-releases).  Colab has stopped updating Python 2 runtimes, and is gradually phasing  out support for Python 2 notebooks. We suggest migrating important  notebooks to Python 3.

但是,我们仍然可以通过此链接https://colab.to/py2.访问它

原生运行 R 的第二个限制与 Google Drive 有关。如果我们在 Colab 中本地使用 R,则不直接支持从 Google Drive 装载和获取数据并将其转换为 dataframe。在我的上一篇文章中,我还提供了一种从 Google Drive 或 BigQuery 检索数据的方法。

现在,假设您已经在 Colab 上成功地运行了 R。那那里有什么库或者包?如何安装一个我们需要的,但是默认不可用的包?有哪些选择?

在这篇文章中,我将尝试打破这一点。

Google Colab R 默认安装了哪些包?

要获得已安装库的列表,可以运行以下代码:

str(allPackage <- installed.packages())
allPackage [, c(1,3:5)]

上面的代码将生成如下表格:

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

结果表。图片作者。

或者,您也可以运行来显示一个帮助窗口,其中包含有关在 R 运行时安装了哪些软件包的信息:

library()

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

library():帮助结果。图片作者。

从这里我们知道有一些常用的软件包,比如说,dplyrbroomsurival都是默认安装的。

如何在 R Google Colab 中安装包?

要安装默认情况下不可用的包,我们可以像往常一样使用install.packages()函数。

但是有些时候我们会发现 CRAN 中没有的包,所以我们可能需要通过 Github 来安装。或者当 CRAN 中还没有更新版本的包时。在这种情况下,我们可以使用devtools::install_github (“DeveloperName/PackageName”)功能。

例如,让我们尝试安装“rsvg”包,它是将 svg 图像渲染为 PDF、PNG、PostScript 或位图数组所必需的。

我们将在运行时运行install.packages(“rsvg”)代码。稍等片刻,将出现一条错误消息:

Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)

Warning message in install.packages("rsvg"):
“installation of package ‘rsvg’ had non-zero exit status”

我认为这是在 Google Colab 中使用 R 的第三个限制。

显示的消息(错误或警告)不如我们使用 RStudio 时完整。

non-zero exit status表示这个包没有成功安装在我们的系统或运行时上,它没有说明原因。

这种不完整在某些方面对我们来说有点麻烦,因为信息不清晰。我们必须在搜索引擎中找到它的原因。

在示例中使用的rsvg包的情况下,问题在于存在一个系统依赖项,这个系统依赖项是需要的,但在我们使用的系统中并不存在。R 包通常依赖于系统库或 R 外部的其他软件。

如何在 R Google Colab 中安装系统库?

在 R 运行时与操作系统(Ubuntu 终端)的交互可以通过使用system()函数来完成。

继续上面关于rsvg包的例子,结果是这个包需要在我们的系统上安装librsvg2-dev。要安装它,我们需要运行如下代码:

system('sudo apt-get install -y librsvg2-dev', intern=TRUE)

或者,我们可以使用cat()来获得相对更漂亮的结果:

cat(system('sudo apt-get install -y librsvg2-dev', intern=TRUE), sep = "\n")

其他一些 R 包可能有不同的依赖关系。你可以用和上面一样的方法安装它。您可能需要的其他一些库是libcurl4-openssl-dev, libgsl0ldbl, gsl-bin, libgsl0-dev, g++, gcc, gfortran-8

结束语

可以在 Google Colab 上运行 R 是一件值得庆祝的事情,尽管有一些限制。Google Colab 提供的软件包可能足以完成我们处理数据的部分工作。这篇文章,以及上一篇文章,仅仅是如何绕过 R Google Colab 中存在的限制的例子。最后,希望这篇文章对有需要的人有用。

如何在 Android 设备上安装 Python 和 Jupyter Notebook

原文:https://towardsdatascience.com/how-to-install-python-and-jupyter-notebook-onto-an-android-device-900009df743f?source=collection_archive---------1-----------------------

环境设置

当您排队等候或在旅途中时,提高您的工作效率。

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

图片来自 Pixabay像素

由于移动技术的普及,我们几乎一天中的所有时间都在网上:开车或坐火车旅行时,准备晚餐时,甚至外出散步时。

对于像我一样,总是活跃和一心多用的人来说,可能会发生这样的情况,当她坐在电脑前时,她必须放下手头的工作去做别的事情。这意味着 PC 上的前一个任务被延迟。

我已经找到了这个问题的部分解决方案:为什么不继续在手机(或平板电脑)上完成任务,同时做其他事情呢?

由于我的主要工作是通过 Jupyter 笔记本处理 Python 中的编码,在这篇文章中,我将解释如何在 Android 上安装这两个组件。这个任务非常简单,因为 Android 是一个基于 unix 的操作系统。

1.获得 Python 3

首先,手机/平板上必须安装 Python。Google Play 上有很多应用。我建议为 Python 3 安装 Pydroid 3 — IDE。

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

作者图片

安装过程非常简单:访问 Google Play ,搜索应用,点击安装按钮即可。

2.运行 Pydroid 3

现在应用程序已经安装好了,我们可以运行它了。第一次启动应用程序时,会下载并安装 Python。之后,我们可以选择左上角的按钮打开一个菜单,选择 Pip ,如下图所示:

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

作者图片

一旦点击 Pip 按钮,搜索框就会打开。我们可以键入 jupyter 并检查设置:使用预构建的库储存库。我们点击安装,出现以下警告:

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

我们可以点击获取插件。Google Play 应用程序打开,要求安装 Pydroid 存储库插件

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

作者图片

我们点击安装,然后等待完成。现在我们回到 Pydroid 应用程序和 jupyter 的 Pip 安装。

一旦安装完成,我们就可以运行 jupyter 笔记本了。

3.运行 Jupyter 笔记本

我们回到 Pydroid 主页,从主菜单中选择终端

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

作者图片

终端打开,我们可以编写命令jupyter notebook。最终笔记本启动,应用程序询问我们是要在浏览器中还是在 Pydroid 应用程序中打开它。

4.将笔记本保存在共享驱动器上

最后一步是储存。为了让我们的笔记本在不同设备之间保持同步,我们应该在它们之间安装一个共享驱动器。一个可能的解决方案是使用 DropboxGoogle Drive 。在这篇文章中,我们描述了如何配置 Dropbox,它在免费版本中提供 2 GB 的空间。首先,我从这个链接下载桌面 Dropbox 应用程序,然后我们把它安装在电脑上。然后我们从 Google Play 下载智能手机上的相同应用

一旦安装到两台设备上,我们就可以同步它们。例如,我们可以从终端访问电脑上的 dropbox 文件夹,然后运行 Jupyter 笔记本。我们可以创建以下 hello world 笔记本,并将其命名为 Test.ipynb

print('Hello world!)

然后我们必须从智能手机访问 Test.ipynb 。我们从智能手机上运行 Dropbox,等待同步。然后,我们按住 Test.ipynb,访问右上角的菜单,单击“Save”。我们选择文件系统上的位置。

现在,我们可以通过 Pydroid 从智能手机运行 Jupyter 笔记本,并从 Jupyter 文件管理器访问包含 Test.ipynb 的文件夹。瞧啊。我们可以从智能手机继续我们的笔记本!请注意,我们的编辑不会在 dropbox 上自动同步。因此,一旦完成代码,我们需要从智能手机文件系统访问上一个文件夹,并与 dropbox 共享它。

摘要

在本文中,我展示了如何在基于 Android 的手机上安装和配置 Python 和 Jupyter。然后,我举例说明了如何同步计算机和智能手机,以便处理同一段代码。

所提出的机制的替代解决方案可以是完全在线执行 Python。例如,这可以通过 Google Colab 来实现。不过这个留作以后的帖子:)

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

我最新的文章

如何在 MacBook Pro M1 Pro 上轻松安装 TensorFlow 2.7

原文:https://towardsdatascience.com/how-to-install-tensorflow-2-7-on-macbook-pro-m1-pro-with-ease-744bfa978fe8?source=collection_archive---------10-----------------------

在苹果新推出的 M1 Pro 和 M1 Max 芯片上安装并测试 tensor flow 2.7

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

Anthony ChorenUnsplash 上拍摄的照片

早在 2020 年,苹果的 M1 芯片就彻底改变了这个行业。新的 M1 Pro 和 M1 Max 是专业用户一直在等待的。苹果向内容创作者推销这些,但请放心,作为一名数据科学家,你可以压榨的性能值得一谈。

我起初有点怀疑,决定不买新的笔记本电脑,但在商店里看到 16 英寸后,我忍不住了。照相机确实增加了 10 磅。新 M1 Pro 和 M1 Max macbook 在现实生活中看起来并不笨重。

总之,我选择了“基础”型号 16“M1 Pro Macbook Pro,配有 10 核 CPU、16 核 GPU 和 16 GB 内存。它用我去年的 M1 Macbook Pro 擦地板,在一些测试中接近我用 RTX 3060Ti 定制的配置。敬请关注博客,了解即将到来的数据科学基准测试和比较。

今天我将向大家展示如何在 MacBook Pro M1 Pro 上安装 TensorFlow 2.7。你将看到的一切都可以在普通的 M1 和 M1 Max 芯片上工作,只要是苹果硅芯片。我们还将通过训练一个简单的神经网络来验证 TensorFlow 是否已安装。

不想看书?请观看我的视频:

在 MacBook Pro M1 Pro 上安装 TensorFlow 必备软件

在你能想到 TensorFlow 之前,你需要安装一些东西——家酿XCode 工具Anaconda 。您可以使用以下命令通过 Mac 的终端安装前两个:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

xcode-select --install

如果您不能立即安装 XCode 工具,请重新启动终端窗口,然后再试一次。

最后,你需要一条蟒蛇。截至目前, Miniforge 原生运行在所有 M1 芯片上(M1、M1 Pro、M1 Max),所以我们会坚持下去。下载 Mac 版 ARM64 下图中标记的版本:

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

图 1-Miniforge 下载页面(图片由作者提供)

它将下载一个 SH 文件。您必须更改它的权限,并通过终端运行它:

cd <path_to_the_downloaded_file>

chmod -x Miniforge3-MacOSX-arm64.sh
./Miniforge3-MacOSX-arm64.sh

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

图 2 —从终端安装 Miniforge(图片由作者提供)

按照说明建议—按下进入继续。坚持使用默认选项,一分钟左右你就应该安装好 Miniforge 了!

现在基于 Python 3.9 创建一个新的虚拟环境。我给我的取名为env_tf:

conda create --name env_tf python=3.9

几秒钟后将创建新环境:

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

图 3 —创建新的虚拟环境(图片由作者提供)

从这里,激活环境:

conda activate env_tf

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

图 4 —激活新的虚拟环境(图片由作者提供)

这就是我们在 M1 Pro 芯片上安装 TensorFlow 所需的全部内容——接下来让我们开始吧。

如何在 M1 Pro 芯片上安装 TensorFlow 和 TensorFlow Metal

在过去的几个月里,安装有 GPU 支持的 TensorFlow 的过程变得更加顺畅。自从 macOS Monterey 发布以来,如果有人遵循这些说明遇到任何麻烦,我会感到惊讶。

我们将从安装来自 Apple 的 TensorFlow 依赖项开始:

conda install -c apple tensorflow-deps -y

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

图 5 —安装苹果的 TensorFlow 依赖项(图片由作者提供)

安装完成后,使用以下命令在 M1 专业版 Macbook 上安装 TensorFlow:

python -m pip install tensorflow-macos

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

图 6 —在 M1 Pro Macbook 上安装 TensorFlow(图片由作者提供)

安装将需要几分钟,因为 Miniforge 必须拉一吨相当大的包。最后一步是用 Metal 插件在 M1 Pro macbook 上安装对 TensorFlow 的 GPU 支持:

pip install tensorflow-metal

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

图 7 —在 M1 Pro Macbook 上安装 TensorFlow Metal(图片由作者提供)

至此,您已经安装了 TensorFlow 及其所有依赖项。我还将安装 JupyterLab,这样我们就可以轻松地构建和训练一个简单的神经网络:

conda install -c conda-forge jupyter jupyterlab -y

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

图 8 —安装 JupyterLab(图片由作者提供)

安装后,启动新的 Jupyter 会话:

jupyter lab

下一节我们再见,我们将在 M1 Pro 芯片上用 TensorFlow 训练一个简单的神经网络。

如何在 MacBook Pro M1 Pro 上用 TensorFlow 训练一个神经网络

在继续之前,您应该启动一个 JupyterLab 会话,或者打开任何其他代码编辑器。使用以下代码片段导入 TensorFlow 并验证它是否已安装:

import tensorflow as tf tf.__version__

此外,打印可用训练设备的列表-只是为了验证 M1 Pro Macbook 上的 TensorFlow 可以看到 GPU:

tf.config.list_physical_devices()

以下是两者的输出:

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

图 9 — TensorFlow 版本和可用设备(图片由作者提供)

现在,M1 Pro 芯片上的 TensorFlow 安装成功,它还将 CPU 和 GPU 视为可用的训练设备!

接下来,让我们为模型训练创建一个虚拟数据集。唯一的输入特征是范围从 1 到 100 的 1000 个数字的数组,步长为 0.1。目标变量是输入要素+ 10。两者都被转换为浮点张量对象:

import numpy as np

X = np.arange(1, 101, step=0.1)
y = [x + 10 for x in X]

X = tf.cast(tf.constant(X), dtype=tf.float32)
y = tf.cast(tf.constant(y), dtype=tf.float32)

从这里,我们将声明一个神经网络模型。体系结构随机设置,网络分为两层,每层 64 个节点。该模型是使用平均绝对误差(T2)来跟踪损失,亚当(T4)作为优化器。最后,该模型被训练 100 个时期:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, input_shape=(1,), activation='relu'),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])

model.compile(
    loss=tf.keras.losses.mean_absolute_error,
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.1),
    metrics=['mean_absolute_error']
)

model.fit(X, y, epochs=100)

培训结束后,您将看到以下内容:

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

图 10 —在 M1 Pro 芯片上用 TensorFlow 训练神经网络模型(图片由作者提供)

一切看起来都很好,所以让我们使用predict()函数对新数据进行预测:

model.predict([10, 20, 30])

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

图 11 —根据新数据进行预测(图片由作者提供)

实际值应该是 20、30 和 40。我们的简单模型不会太离谱。

结论

今天,您已经在 M1 Pro MacBook 上成功安装了支持 GPU 的 TensorFlow。上述循序渐进的指导应该适用于任何苹果芯片设备,从 Mac Mini 到 M1 Max。

**但是 M1 Pro 对于数据科学和机器学习有多好呢?**请继续关注,因为我做了大量真实世界的对比测试,我计划在未来几周内分享。

同时,参考以下资源,从头开始学习 TensorFlow:

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

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

保持联系

最初发表于 2021 年 12 月 30 日https://betterdatascience.com

如何将气候风险纳入信用风险评估

原文:https://towardsdatascience.com/how-to-integrate-climate-risk-into-credit-risk-assessments-f7eac5c01850?source=collection_archive---------25-----------------------

行业笔记

使用 NFIP 保险数据重新评估抵押贷款组合风险

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

NOAAUnsplash 上拍摄的照片

十年前,气候风险仅被视为对公司道德和声誉的潜在威胁。今天,越来越多的公司开始将它视为一种可能影响其战略和业务规划的财务风险。正如气候相关财务披露工作组(TCFD)建议中所述,有两大类气候风险会对公司造成财务影响:物理风险和过渡风险。

物理风险 : 由极端天气事件(即急性风险)的频率或严重性(如旋风、飓风或洪水)导致的财产价值减少或运营成本增加(如保险费增加);或长期气候模式转变(即慢性风险),如降水、气温上升和海平面上升。

转型风险 : 与向低碳经济转型相关的政策、技术、消费者行为和市场供应的变化,包括由于减排政策的突然变化而导致的化石燃料储备或管道(即搁浅资产)的注销或提前报废。

根据 TCFD 2020 年的最新状况报告,有超过 1700 家公司签署了通过其主要财务报告披露气候相关风险和机遇的协议。更重要的是,大量与气候相关的风险数据预计将在很大程度上由数据提供商和非政府组织补充,如 CDP2Degree InvestingCarbon4 Finance 等…预计为了将气候风险完全纳入(信贷)投资/业务决策,将会有越来越多的需求来探索非常规建模技术,以将气候情景、减排途径或碳管理 ESG 指标“转化”为财务影响

在本文中,我们将讨论如何利用国家洪水保险计划(NFIP)索赔数据来洞察洪水风险对财产价值的影响,从而揭示住宅抵押贷款风险中尚未捕捉到的隐藏风险(即在财产价值和抵押贷款组合的预期损失之间建立联系)。让我们开始吧。

什么是 NFIP 计划?

标准的房主和房客保险政策不包括洪水损害。然而,洪水保险是作为一项独立于 NFIP 的政策提供的,这是一项由国会在 1968 年创建的联邦计划,由联邦紧急事务管理局(FEMA)管理。NFIP 计划有两个主要目标:

  • 保护参与社区的财产所有者免受洪水损失;
  • 通过社区和州采用洪泛区管理条例来减少未来的洪水损失。

由于这两个主要目的,位于参与的 NFIP 社区和特殊洪水危险区(SFHA,又名 100 年一遇洪水危险区,因为这些地区每年有 1%的概率被洪水袭击)的建筑必须投保洪水保险,而一些抵押贷款人可能要求 SFHA 以外的房产投保洪水保险,作为其审批流程的一部分。此外,NFIP 计划的参与是以社区为基础的,而不是以个人为基础的,因为该保险仅在那些洪水易发地区提供,在这些地区,在其社区监督下采用了适当的设计和施工标准。

NFIP 提供两种保险保障,即建筑和内容保障,分别在两种计划下,即常规计划和紧急计划。以单户住宅为例,NFIP 保险公司在常规项目下可提供高达 25 万美元的建筑保险,在紧急项目下可提供 3.5 万美元的建筑保险;额外内容分别高达 100,000 美元和 10,000 美元。从历史上看,最高的 NFIP 支出属于 2005 年的卡特里娜飓风,为 163 亿美元,其次是 2017 年的哈维飓风,为 89 亿美元

洪水事件会如何影响你的抵押贷款行为?

在被洪水事件破坏或摧毁的地区,人们可能会看到拖欠率瞬间飙升。这是因为一些房主在支付短期住房租金的同时,可能不得不修复重大损坏,甚至重建他们的房产,因为他们尚未获得延期偿付计划或修改。下图显示了 2017 年 8 月飓风哈维过后,德克萨斯州的犯罪率急剧上升。

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

作者图片—德克萨斯州房地美拖欠状况(2014 年至 2019 年)

同样如上图所示,在向借款人提供金融援助计划(即延期、还款计划和/或贷款修改)后,大量拖欠贷款将在陷入严重拖欠或违约状态之前得到解决。贷款严重拖欠或违约的可能性主要取决于洪水损害的严重程度(或剩余房屋净值规模)和借款人的收入状况。根据基于房利美数据的飓风哈维的案例研究,与未受损害的财产相比,中度至重度损害(即超过财产价值 10%的损害)会使洪水后五个月内贷款逾期 90 天的几率增加三倍。

洪水过后,提前还款行为也会激增,尤其是在需要洪水保险的地区。这是因为这些房主可以用保险索赔来偿还未偿还的贷款。此外,一些受影响的房主可能希望搬到洪水易发区以外,这并不奇怪,其中这些受保的借款人更愿意以折扣价向投资者出售房屋,因为他们的损失已经得到补偿。哈维袭击一年后,房屋销售活动增长了 37.2%,这支持了这一点。

很明显,为了描述后洪水时期损失和提前还款行为的增加,传统信用风险分析中缺失的环节是使用保险单/索赔数据来回答以下关键问题:

  1. 如何预测洪水事件造成的财产损失?
  2. 如何预测贷款账簿中的保险范围随时间的变化?

我们在下面分析中的重点将放在第一个问题上。

数据下载

联邦应急管理局提供公共访问数据集,包括应急管理,减灾和 NIFP 等。,通过 OpenFEMA ,一个通过直接下载(csv 格式)或 API 端点交付数据的一站式商店。本分析中使用的数据集来源于 FIMA NFIP 修订索赔— v1 ,该数据集代表了自 20 世纪 70 年代以来超过 2,000,000 起索赔交易,涵盖所有州和地区。在这个分析中,我们使用保险索赔与承保范围的比率作为损失的衡量标准,我们的重点将放在独栋房屋上。

深度-损伤关系

由于洪水深度是估计财产损失的最佳代理,几十年来,估计洪水事件造成的经济损失的传统方法是基于深度损失函数。深度损伤函数的形状在很大程度上取决于以下性质特征:

楼层数

似乎楼层越高(此处联排别墅代表三层或三层以上的联排别墅),遭受洪水损害的风险就越低。最高的风险属于基础上的活动房屋或旅行拖车。

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

按作者分类的图片—基于 NFIP 索赔数据的按楼层数分类的损坏率(TX 和 FL)

地下室类型

与有地下室结构的房子相比,没有地下室(包括地下室类型——未知)的独户房子往往显示出更高的损坏风险。正如所料,当地下室更完整,更类似于楼上的生活区,财产往往显示较低的洪水损害风险。

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

按作者分类的图像—根据 NFIP 索赔数据按基底类型分类的损坏率(德克萨斯州和佛罗里达州)

洪水区(洪水保险评级图—公司)

联邦应急管理局指定并维护洪水区评级,以帮助抵押贷款机构确定保险要求,并帮助社区制定降低风险的策略。洪水区是根据洪水风险驱动因素定义的,如洪水袭击概率、区域特征(如海岸、积水等)。)、建设标准等…有关详细信息,请参考下表。

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

图片由作者提供;原文出处:https://floodpartners.com/flood-zones/

据观察,损坏率对洪水区相当敏感,但是最高的损坏率不一定总是与高风险洪水区相关联。在某些情况下,低到中等风险区(如 C 区和 X 区)也显示出较高的损坏率,情况正好相反。这可能是因为 FEMA 自 20 世纪 70 年代以来引入的静态洪水区评级不再能够提供该地区内在洪水风险的准确测量。事实上,今年早些时候,联邦应急管理局已经宣布在 2021 年 10 月推出风险评级 2.0 。新的风险评级方法预计将纳入更多的洪水风险变量,包括洪水频率、多种洪水类型——河流溢流、风暴潮、海岸侵蚀和暴雨——以及与水源的距离以及财产特征,如海拔和重建成本。

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

作者图片-基于 NFIP 索赔数据的洪灾区(德克萨斯州和佛罗里达州)损失比率

从下面的数字中可以得出类似的结论,这些数字显示了飓风哈维造成的损失比率的另一种观点,并与同一地区的 SFHA 区进行了比较。

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

按作者分类的影像-哈维 NFIP 飓风的破坏率和 SFHA 区域比较(使用 Python 中的底图创建)

将上面两个图放在一起,从下图中可以看出,许多遭受严重损坏的区域(蓝色阴影)实际上位于 SFHA 区之外。

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

按作者分类的影像-哈维·NFIP 飓风损害率和 SFHA 区域重叠(使用 Python 中的底图创建)

下一步是什么?

上述实证分析试图证明在气候相关信用风险分析中使用保险数据的直观性和重要性。如本文开头所述,作为下一步,人们可能希望探索深度损害函数,以生成各种气候情景下的财产级年损失曲线。FEMA 的 Hazus 洪水评估结构工具(FAST)工具 ,一个开源的解决方案,可以成为你一个很好的起点。尽管多年来许多水文学家对危险数据稀疏性限制提出了担忧,并对将 Hazus 模型应用于所有地区和洪水事件提出了批评,但在预测危险损失时,它仍然是各种气候分析供应商解决方案最受欢迎的基础。

另一个需要考虑的步骤是在长期气候情景分析中预测保险范围的演变。除了历史趋势之外,保险范围的建模应该考虑 1)被低估的洪水风险的暴露;以及 2)增加保险价格对低收入社区的不利影响。

结论

希望这篇文章能帮助你思考如何将保险数据纳入你的信用风险分析,并量化气候风险的影响。喜欢就在下面留下你的评论吧。以上分析的完整代码(包括底图邮编等级图)可以在 这里 找到。

使用底图绘制飓风哈维(德克萨斯州休斯顿)的邮政编码级别损害率和洪水区等级

脚注

[1]SFHA:在 30 年的抵押贷款期间,SFHA 地区至少有四分之一的几率会被洪水淹没。如果有人想知道他或她的房产是否在 SFHA 区,您可以使用您在 https://msc.fema.gov/portal/search的地址或坐标找到该信息。如果您想进一步了解如何通过 FEMA 的 NFHL(国家洪水灾害层)API 提取 SFHA 洪水区信息,请在下面留下您的评论。

如何将 Quickbooks 与 Python 集成

原文:https://towardsdatascience.com/how-to-integrate-quickbooks-with-python-8be2d69f96cb?source=collection_archive---------16-----------------------

使用 Python 构建轻量级 Quickbooks 数据集成管道

如果您是一名 B2B 开发人员,正在开发一个产品,最早的产品开发阶段之一就是创建一个数据集成管道来导入客户数据。

在本文中,我将向您展示如何利用 Singer 的 tap-quickbooks 从 quickbooks 中提取数据。在这里,我将带您了解如何使用 target-csv 解析来自 Singer 的 JSON 输出数据,并使用一个简单的 Python 脚本将其标准化。

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

来源: unDraw

笔记

这些例子的代码可以在 GitHub 这里上公开获得,还有我将带你浏览的信息的描述。

这些示例依赖于几个开源 Python 包:

  • 点击 quickbooks: 歌手点击 quickbooks 来提取数据。更多关于 GitHub 的信息。我们将使用 hotglue fork ,因为它与 target-csv 版本兼容。
  • target-csv: 一个 Singer 目标,将输入的 JSON 数据转换成 csv 文件。更多关于 GitHub 的信息。我们将使用热熔胶叉,它使用更新的依赖关系。
  • singer-discover :一个从歌手目录中选择流的开源工具。更多关于 GitHub 的信息。
  • pandas: 一个广泛使用的开源数据分析和操纵工具。关于他们的站点PyPi 的更多信息。
  • gluestick: 一个小型开源 Python 包,包含由 hotglue 团队维护的用于 ETL 的 util 函数。更多关于 PyPiGitHub 的信息。

事不宜迟,我们开始吧!

步骤 1:设置我们的环境

创造虚拟

Singer taps 之间往往会有很多依赖冲突——为了避免依赖地狱,我强烈建议在虚拟环境中运行这个示例。

# Install JupyterLab if you don't have it already
$ pip3 install jupyterlab# Create the virtual env
$ python3 -m venv ~/env/tap-quickbooks# Activate the virtual env
$ source ~/env/tap-quickbooks/bin/activate# Install the dependencies
$ pip install git+[https://github.com/hotgluexyz/tap-quickbooks.git](https://github.com/hotgluexyz/target-csv.git) git+[https://github.com/hotgluexyz/target-csv.git](https://github.com/hotgluexyz/target-csv.git) gluestick pandas ipykernel singer-python==5.3.1 requests==2.20.0 xmltodict==0.11.0 jsonpath-ng==1.4.3 pytz==2018.4 attrs==20.2.0[#](https://github.com/chrisgoddard/singer-discover/archive/master.zip#) Make our venv available to JupyterLab
$ python -m ipykernel install --user --name=tap-quickbooks# Create a workspace for this
$ mkdir quickbooks-integration# Enter the directory
$ cd quickbooks-integration

这些命令可能因您的操作系统和 Python 版本而异。欲了解更多关于 Jupyter venvs 的信息,请查看这篇关于数据科学的文章

步骤 2:配置歌手抽头

获取 OAuth 凭证

首先,你需要 Quickbooks OAuth 证书。Quickbooks 已经很好地记录了这个过程,所以我假设你可以遵循这个指南。

创建歌手点击配置

现在我们必须创建一个歌手配置。这将指定我们的 OAuth 凭证和一些特定于 Singer 的设置。他们的示例配置具有以下格式:

{
  "client_id": "secret_client_id",
  "client_secret": "secret_client_secret",
  "refresh_token": "abc123",
  "start_date": "2017-11-02T00:00:00Z",
  "api_type": "BULK",
  "select_fields_by_default": true,
  "sandbox": true,
  "realmId": "123456789"
}

填写您的凭证,并将其保存到本地目录中名为config.json的文件中。

跑步歌手发现

从 Quickbooks 获取数据的第一步是找出哪些数据是实际可用的。Singer taps 提供了一个 discover 命令,它打印一个描述所有这些内容的 JSON 对象。让我们现在运行它:

# Do the Singer discover and save to catalog.json
$ tap-quickbooks --config config.json --discover > catalog.json

如果成功,您的 catalog.json 应该如下所示:

# Check discover output
$ less catalog.json
{
    "streams": [
        {
            "stream": "Invoice",
            "tap_stream_id": "Invoice",
            "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "AllowIPNPayment": {
                        "type": [
                            "boolean",
                            "null"
                        ]
                    },
...

告诉辛格我们想要什么

在这里,我们想要选择我们实际想要同步的对象。为此,我们将使用之前下载的 singer-discover 实用程序。

# Switch singer-python version to meet singer-discover dep
$ pip install [https://github.com/chrisgoddard/singer-discover/archive/master.zip](https://github.com/chrisgoddard/singer-discover/archive/master.zip#) singer-python==5.4.1 prompt_toolkit==1.0.14# Build our selected catalog
$ singer-discover --input catalog.json --output properties.json

这将启动一个交互式实用程序,从 Quickbooks 中选择您想要的(对象)。我将选择发票(空格)并按回车键。这将提示您选择特定字段的选项。我将接受默认值并按 enter 键。

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

发票流的选定字段

这将为您提供以下输出

INFO Catalog configuration starting...
? Select Streams  [Invoice]
? Select fields from stream: `Invoice`  done (18 selections)
INFO Catalog configuration saved.

运行歌手同步

现在,我们终于可以使用我们生成的文件从 Quickbooks 中获取数据了,使用以下命令:

# Switch singer-python version to meet tap-quickbooks dep
$ pip install singer-python==5.3.1# Get Invoice data from Quickbooks and save as a CSV
$ tap-quickbooks --config config.json --properties properties.json | target-csv  > state.json

这将输出两个文件:

  • 包含 Quickbooks 数据的 CSV 文件(类似于Invoice-20210128T125258.csv)
  • 一个 JSON 文件state.json告诉tap-quickbooks它最后同步了什么。这可以在未来反馈到 tap-quickbooks,以避免再次同步相同的数据。

终于!我们已经从 Quickbooks 中提取了数据!不算太坏,对吧?如果你想在生产中使用它,你必须自动化创建properties.json的过程,并且很可能将所有这些都粘贴到 Docker 容器中(非常类似于 hotglueAirbyte 的工作方式)。

步骤 3:标准化数据

您可以在 Jupyter 笔记本中直接阅读这一部分(随意复制并尝试您自己的转换)。

https://github.com/hotgluexyz/recipes/blob/master/src/quickbooks.ipynb

看数据

先来看看tap-quickbooks给了我们什么。

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

Quickbooks 的 CSV 发票

不算太坏,对吧?让我们将数据加载到 Jupyter 笔记本中,并稍微整理一下数据。对于这篇文章,我将保持它非常简单,但是如果你想了解其他 ETL 操作,请查看我的关于数据科学的文章

发射 Jupyter

让我们发射 Jupyter

# You may have some issues in Jupyter if you don't do this
$ pip install prompt-toolkit==3.0.14# Deactivate the virtualenv
$ deactivate# Start Jupyter Lab
$ jupyter lab

这应该会在当前目录下启动 Jupyter 并打开浏览器。

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

JupyterLab 开始了

如果所有的设置命令都有效,您应该在笔记本部分看到 tap-quickbooks。让我们用 tap-quickbooks 内核创建一个新的笔记本。我将把我的名字命名为quickbooks.ipynb

加载数据

让我们使用 gluestick 和 pandas 库来加载数据并查看一下。我们这里的目标是能够容易地操作 tap-quickbooks 的输出。

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

熊猫数据框架中的数据预览

清理数据

现在我们有了熊猫的数据框架中的数据,你可以随意转换它。当然,你并不局限于使用 Pandas——你可以使用 Spark,或者任何你喜欢的基于 Python 的数据转换工具。

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

示例最终数据

结论

后续步骤

这实际上只是数据集成管道的起点。如果你想更进一步(在云上编排,将它连接到你的产品上),那就值得看一看专注于开发人员的工具,比如 hotglueMeltano ,它们都旨在让开发人员更容易进行数据集成。

考虑

我最近在 TowardsDataScience 上发表了一篇关于打造 Singer 的利与弊的文章。我建议在决定建立你的歌手管道之前,先看看 Airbyte

未来,你可以随意查看开源的热熔胶配方以获取更多样本。感谢阅读!我很乐意回答下面的任何评论或问题。

如何将 Quickbooks 与您的 SaaS 平台集成

原文:https://towardsdatascience.com/how-to-integrate-quickbooks-with-your-saas-platform-50e79d997fa7?source=collection_archive---------38-----------------------

我如何使用 Python 构建 QBO 集成来监控部门收入和成本

最近,我的任务是构建一个 Quickbooks Online (QBO)集成来处理损益(P & L)报告,并确定收入、销货成本(COGS)和部门费用——下面是我如何做的。

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

来源: unDraw

本文不是关于构建 OAuth 流或使用 cron 作业从 Quickbooks API 提取数据。这个过程相对来说是样板,已经被工具解决了,比如我将要使用的这个。如果您对自己构建感兴趣,请查看我的文章中关于使用 Singer 实现这一点的文章

相反,本文将带您完成更难的部分——如何理解数据。

获取数据

正如我上面提到的,在这篇文章中,我将使用 hotglue 来处理为 SaaS 平台构建 QBO 集成的所有样板文件。这包括:

  • 创建 OAuth 授权流
  • 允许用户在您的 UI 中连接 Quickbooks 并监控连接
  • 从 Quickbooks API 中提取必要的数据

创建授权流

hotglue 中,我将创建一个新的流并添加 Quickbooks sandbox 作为源。为此,我只需提供我的 OAuth 凭证并登录到我的 Quickbooks 沙盒帐户。如果您还没有 OAuth 凭证,您可以选择“使用测试令牌”

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

创建 Quickbooks OAuth 流

选择我们需要的数据

现在我们可以从 Quickbooks 中选择我们需要的数据。我们将选择帐户(会计科目表)、项目(产品和服务)、采购(费用)、发票和损益报告。

这将为我们提供准确分类交易所需的参考数据。

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

Quickbooks 选定的数据

将集成添加到您的 UI 中

通过一些基本的 JavaScript,我能够嵌入 hotglue widget ,它使用户能够连接他们的 Quickbooks 帐户,刷新同步的数据,并监视它上次刷新的时间。

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

嵌入式集成

标记交易

Quickbooks 本身不支持在特定部门或项目下标记事务。为此,我使用 Quickbooks 类字段来标记部门/项目下的事务。例如,下面的发票被标记为Pest Control:Project X,意思是害虫控制部门,项目 x。

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

使用类别标记 Quickbooks 发票

处理数据

现在是有趣的部分。我们将使用 Python 脚本,使用 pandasgluestick 将 Quickbooks 中的数据转换成 JSON 文件,如下所示。

我们想要生产的东西

正如您在下面看到的,JSON 文件获取了我们 P&L 报告中的每一笔交易,并将其归类到Pest Control部门的Project X下。此外,它将每笔交易分类为revenuecogs(销售成本)、laborcosts(费用)。

{
  "Pest Control": {
    "Project X": {
      "revenues": {
        "2021-11": {
          "Pest Control Services": {
            "Pest Control Services": {
              "Bed Bug Removal": {
                "total": 350,
                "qty": "10",
                "rate": 35
              }
            }
          }
        }
      },
      "cogs": {
        "2021-11": {
          "Supplies & Materials - COGS": {
            "Pest Control Services": {
              "Bed Bug Removal": {
                "total": 100,
                "qty": 1,
                "rate": 100
              }
            }
          }
        }
      },
      "labor": {
        "2021-11": {
          "Employee": {
            "Inspector": {
              "Employee Benefits": 10.8,
              "Payroll Tax": 61.2,
              "Payroll Wage Expenses": 800
            }
          }
        }
      },
      "costs": {
        "2021-11": {
          "Project Expenses": {
            "Automobile": {
              "Fuel": 100
            }
          }
        }
      }
    }
  }
}

写剧本

hotglue 具有内置功能,可以在每次从 Quickbooks API 同步新数据时运行 Python 脚本,并避免再次同步旧数据(增量同步)。

您可以浏览下面脚本的每个步骤。

如果您正在使用 hotglue 创建您的集成,您可以学习如何在文档中编写和部署脚本。

一起运行

选择数据应该放在哪里

如果你正在使用 hotglue,你需要指定一个最终数据交付的地方(一个目标)。默认情况下,hotglue 会使用 Mailgun 将新数据通过电子邮件发送给您。我使用谷歌云存储来整合我们的 Quickbooks。

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

配置 Google 云存储目标

运行作业

现在,我们可以运行同步作业了。这将连接到 Quickbooks API,查询任何新数据,将其保存为 CSV,运行我们的转换脚本,并将结果数据上传到我们的目标(Google 云存储)。

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

Quickbooks 作业已完成

现在我们可以在谷歌云存储中看到最终的actuals.json文件了!

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

Google 云存储桶中的结果数据

结论

在本文中,我们创建了一个 Quickbooks 集成,并将生成的 CSV 数据处理成可供 SaaS 应用程序使用的 JSON 有效负载。

希望这有助于您考虑如何构建自己的 SaaS 集成。我强烈推荐使用像 hotglue 这样的工具来处理样板集成步骤,这样您就可以专注于提取您需要的数据,而不是授权和编排问题。

感谢阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值