判断实证论文优劣的 10 条戒律
审查人员通用指南
有许多与当前同行评议制度相关的病态问题已经成为许多讨论的主题。最实质性的问题之一是,在主要期刊上报道的结果通常是具有最令人兴奋和最有新闻价值的发现的论文。这里的问题是,对一些人来说可能是新奇的和有新闻价值的东西,对其他人来说可能是过分的,其有效性值得怀疑。研究设计中的各种问题,如小样本和赢家诅咒、多重比较和选择性报告结果,往往有助于发表有效性存疑的“性感”发现。
幸运的是,这些问题已经成为所有学科的科学家们进行大量讨论和自我反思的主题。虽然职业激励可能会导致研究人员为了发布令人兴奋的发现而对他们的分析漫不经心,但最常见的问题是错误信息加上认知偏差的结果,例如确认偏差,我们都容易受到影响(例如,我们往往只看到我们想看到的证据),而不是任何渎职行为。最终,我觉得这在很大程度上是统计教育的问题,更普遍的问题是专注于教授一种技术,而不是面向问题的技能组合,没有适当关注批判性思维技能。当然,毕业后我可以做各种各样的分析技术,而不需要真正理解我在做什么!
这一领域的大部分焦点正确地集中在试图让研究人员改变他们的行为,在介绍他们的方法时更加反思和透明。较少关注审稿人和编辑的行为。评论者应该注意什么?很难区分新颖但有效的结果和有效性有问题的结果,特别是对于那些没有大量数据处理经验的人。这个博客试图提供一些通用规则来指导评论者。
特别是,本着应用计量经济学的深刻而吸引人的 10 条戒律,我为评论者准备了 10 条戒律。这不是一份详尽的清单,也不是一份完整的清单,主要针对的是经验性的而不是纯理论的论文。研究人员如何组织和撰写论文的一个主要动机(如果不是主要动机的话)是,他们遵循的方法是他们认为最有可能被编辑/审稿人视为可发表的论文。研究人员会对激励做出反应,我建议,如果评审人员遵循这些简单的步骤,我们就可以改变“游戏规则”,因此,最终会改变提交实践和行为。
1.对不确定性持更开放的态度:至少在我的经验中,评论者更喜欢关于因果关系的强有力的陈述,但事情并不总是非黑即白的。作者应该可以(甚至被鼓励)展示他们的发现作为提示,承认局限性并提出未来需要做的工作。然而,评论家们越来越需要的是可靠的确定性。通常,研究人员的目的是证明估计效果的“证据”,并通过一系列稳健性检查证明没有其他可能的替代解释。这反过来会导致作者夸大他们的发现,因为害怕如果他们更谨慎的话会受到评论者的惩罚。
2.更能接受小的/适度的效应大小:并不是每项研究都会证明关键感兴趣变量的变化会导致研究结果的巨大变化。事实上,大多数人不会或至少不应该这么做。研究逐步进行,要求大的效果尺寸是不现实的。这里的主要问题是,效应大小通常可以以多种不同的方式呈现,这种预期扭曲了激励,因此作者可以找到创造性的方式来呈现他们估计的“大”效应。虽然出版不应依赖于展示大的效应尺寸,但效应尺寸也不应小到微不足道。统计显著性应该是不够的,除了关于效应大小的实际大小的报告的问题之外,一个同样成问题的问题是相对常见的是根本不努力报告效应大小。这也是审稿人应该劝阻的。
3.不要被复杂性所迷惑 : 计量经济学的复杂性不应该被误认为是严谨的。简单的分析通常不仅更容易理解和交流,而且不太可能导致严重的错误或失误。如果需要复杂的模型,那么要确保研究人员展示了所有必要的细节,以便“技术细节”能够容易理解。一些根据上下文谨慎提问的例子可能包括:简单的二元关系看起来像什么?即使没有看起来有些奇怪的功能规范,结果还成立吗?在添加控制变量之前,与对照组的处理进行简单比较,结果看起来像什么?
4.作为上述方法的自然延伸,应用笑声测试:应用 Kennedy (2002) 所称的“笑声”测试,或者 Hamermesh (2000,第 374 页)所称的“嗅嗅”测试:“问问自己,如果向一个深思熟虑的外行人仔细解释这些发现,听众是否能避免大笑”。有时,如果结果看起来好得令人难以置信,那么事实往往就是如此。这在低功效研究(小样本)中尤其如此,因为看似意外/新颖的发现往往只是噪声数据集中的随机波动,不太可能是可再现的效果。
5.问正确的问题:我发现自己经常问的一些潜在有用的问题包括:对为什么只在特定的小组或特定的情况下观察到结果的解释是否可信?与这一点相关的是,我经常问自己,给出的解释是否符合结果(观察数据本来就有噪音!)或者作者事先有这些前科是否合理。采用看似更明智的不同程序是否会对实质性结果产生重大影响?这可能包括函数形式的改变或控制变量的选择。我想强调的是,这些问题不应该被设计成“零黑客”调查结果(也考虑这里的第 10 点),而是对分析的合理程度和结论是否有根据有一个总体感觉。
6.不要被稳健性检查所迷惑,也不要要求太多:稳健性检查可能很重要,但不应该让你相信主要发现的真实性。也许还值得注意的是,从作者的角度来看,建议额外的健壮性检查可能会增加大量时间,但通常不会带来额外的好处。
7.不要歧视 : 根据研究的优点来判断研究,而不是根据它是否是你喜欢的主题或来自知名研究人员或研究所。出版偏见是这样的,做仔细和深思熟虑的研究的人可能不总是有大“声誉”的人。
8.与上述观点相关的还有一个针对编辑的观点不要根据报道结果的新闻价值来拒绝。
9.警惕浮夸的陈述,晦涩的语言或抽象的理论框架。
10.不要纠结于 p 值:据美国统计协会报道,“一个结论不会立刻在分界线的一边变成‘真’而在另一边变成‘假’”。一个 p 值和一个估计的效应大小传递了一些有用的信息,但它不应该是全部。正如美国儿科学会的声明所总结的那样,“没有一个单一的指标可以替代科学推理。”就个人而言,在判断一篇论文的科学价值时,我会寻找许多东西(其中许多在上面讨论过),但实际报告的 p 值,无论是 0.01 还是 0.10,都远远低于列表。
每个数据科学家都应该知道的 10 个概念
面试中可能遇到的概念。
泰勒·凯西在 Unsplash 上的照片
数据科学是一个如此广阔的领域。如果这是一个食谱,主要成分将是线性代数,统计学,软件,分析技能,讲故事,所有与一些领域知识的经验丰富。配料的数量根据你所做的工作而变化。
作为一名数据科学家,无论您做什么,都有一些术语和概念您绝对应该熟悉。在这篇文章中,我将介绍其中的 10 个概念。请注意,这篇文章的目的绝不是要列出你需要知道的所有话题。然而,了解以下概念绝对会增加你的技能组合的价值,并在你的旅程中帮助你学习更多。
我们开始吧。
1。中心极限定理
我们首先需要引入正态(高斯)分布让中心极限定理有意义。正态分布是一种看起来像钟的概率分布:
x 轴代表数值,y 轴代表观察这些数值的概率。正态分布用于表示分布未知的随机变量。因此,它被广泛应用于包括自然科学和社会科学在内的许多领域。证明为什么它可以用来表示未知分布的随机变量的理由是中心极限定理(CLT) 。
根据 CLT ,当我们从一个分布中抽取更多样本时,样本平均值将趋向于一个正态分布,而不管总体分布如何。
考虑一个案例,我们需要学习一个国家所有 20 岁人的身高分布。收集这些数据几乎是不可能的,当然也是不切实际的。所以,我们在全国范围内抽取 20 岁人群的样本,计算样本中人群的平均身高。根据 CLT,当我们从总体中抽取更多样本时,抽样分布将接近正态分布。
为什么正态分布如此重要?正态分布用平均值和标准偏差来描述,它们很容易计算。如果我们知道正态分布的均值和标准差,我们就可以计算出关于它的几乎所有东西。
2。p 值
P 值是获得我们的观察值或有相同或较少机会被观察的值的概率。考虑随机变量 a 的以下概率分布。很可能观察到 10 左右的值。随着值变得更高或更低,概率降低。
我们有另一个随机变量 B,想看看 B 是否大于 a,从 B 得到的平均样本均值是 12.5。12.5 的 p 值是下图中的绿色区域。绿色区域表示获得 12.5 或更极端值(在我们的例子中高于 12.5)的概率。
假设 p 值是 0.11,但是我们如何解释它呢?p 值为 0.11 意味着我们对结果有 89%的把握。换句话说,有 11%的概率结果是随机的。类似地,p 值为 0.5 意味着有 5%的概率结果是随机的。
p 值越低,结果越确定。
如果随机变量 B 的样本平均值是 15,这是一个更极端的值,p 值将低于 0.11。
3。偏差—方差权衡
偏差发生在我们试图用一个简单得多的模型来近似一个复杂或错综复杂的关系的时候。我认为它是一个懒惰的模型。考虑一种情况,其中自变量(特征)和因变量(目标)之间的关系非常复杂并且是非线性的。但是,我们尝试使用线性回归建立一个模型。在这种情况下,即使我们有数百万个训练样本,我们也无法建立准确的模型。通过使用简单的模型,我们限制了性能。不能反映特征和目标之间的真实关系。偏高的型号倾向于欠配。
方差发生在模型对自变量(特征)的变化高度敏感的时候。该模型试图选取关于特征和目标之间关系的每个细节。它甚至学习数据中可能随机出现的噪声。特征中非常小的变化可能会改变模型的预测。因此,我们最终得到了一个模型,它捕获了训练集的每一个细节,因此训练集的准确性将非常高。然而,新的、以前未见过的样本的准确性不会很好,因为特征中总是存在不同的变化。这种情况也被称为过拟合。该模型过度适应训练数据,但未能很好地概括数据集内的实际关系。
所以高偏差和高方差都不好。完美的模型是低偏差和低方差的模型。然而,完美的模型很难找到,如果可能的话。偏差和方差之间有一个权衡。我们应该力求在它们之间找到恰当的平衡。作为一名机器学习工程师,成功的关键是掌握在偏差和方差之间找到正确的平衡。
4。L1 和 L2 正规化
过拟合是数据科学领域中的一个重要问题,需要小心处理,以便建立一个健壮和准确的模型。当模型试图很好地拟合训练数据,以至于不能推广到新的观察结果时,就会出现过度拟合。过度拟合模型捕捉训练数据中的细节和噪声,而不是总体趋势。
过度拟合问题的解决方案是降低模型复杂度。例如,如果我们有一个多项式模型,我们可以通过减少自由度来降低模型的复杂性。多项式模型是非线性的。对于线性模型,我们需要另一种正则化技术,即正则化。
正则化通过惩罚模型中较高的项来控制模型的复杂性。如果增加一个正则项,该模型试图最小化损失和模型的复杂性。
L1 正规化
它也被称为针对稀疏性的正则化。顾名思义,它用于处理主要由零组成的稀疏向量。稀疏向量通常导致非常高维的特征向量空间。因此,模型变得很难处理。
L1 正则化通过在每次迭代中从权重中减去一个小的量来强制无信息特征的权重为零,从而最终使权重为零。
L1 正则化惩罚|权重|。
L2 正规化
为了简单性它也被称为正则化。如果我们把模型的复杂度作为权重的函数,那么特征的复杂度与它的权重的绝对值成正比。
L2 正则化迫使权重趋向于零,但并不使它们完全为零。L2 正则化就像在每次迭代中去除一小部分权重的力。因此,权重永远不会等于零。
L2 正则化惩罚(权重)
注: 岭回归使用 L2 正则化,而拉索回归使用 L1 正则化。弹性网回归结合了 L1 和 L2 正则化。
5。维度的诅咒
简而言之,维数灾难意味着有太多的特征。更多的数据是好的,但是如果数据结构良好。如果我们有许多特征(列)但没有足够的观察值(行)来处理,那么我们就有问题了。
拥有许多特征但没有足够的观察值会导致过度拟合。正如预期的那样,该模型捕捉了数据集中的观察细节,而不是概括要素和目标之间的真实关系。
当我们试图对观察结果进行聚类时,会出现另一个缺点。聚类算法使用距离度量。拥有太多的特征会导致观测值之间的距离非常相似,因此很难将观测值分组到聚类中。
维数灾难的一个解决方案是通过保持特征数量不变来收集更多的观测值(行)。然而,这将是耗时的,并且不总是可行的。此外,它会给模型增加额外的计算负担。更好的解决方案是使用一种降维算法,比如 PCA。降维是通过从现有特征中提取新特征来减少特征的数量,目的是保持数据集中的方差。
6。装袋增压
在机器学习领域,通过组合许多基本估计器(即算法)来设计集合学习方法。例如,随机森林是通过组合几个决策树创建的集成学习算法。打包和提升是组合基本估计量的两种不同方法。
Bagging 的意思是集合几个弱学习者的预测。我们可以把它想成平行结合弱学习者。将几个弱学习者的预测平均值作为整体预测。
随机森林创建与装袋许多决策树
Boosting 就是把系列的几个弱学习者组合起来。我们最终从许多顺序连接的弱学习者中得到一个强学习者。梯度增强决策树(GBDT)是最常用的集成学习算法之一。像在随机森林中一样,GBDT 中的弱学习器(或基估计器)是决策树。
GBDT 创建了许多决策树
7。熵和信息增益
熵是不确定性或随机性的度量。一个变量的随机性越大,熵就越大。均匀分布的变量具有最高的熵。例如,掷一个公平的骰子有 6 个概率相等的可能结果,所以它有均匀的分布和高熵。
熵 vs 随机性
在处理决策树时,我们很可能会遇到熵和信息增益。它们是算法决定拆分时的决定性因素。选择导致更纯节点的分裂。这些都表示“信息增益”,基本上就是分裂前后的熵差。
当选择一个特征进行分割时,决策树算法试图实现
- 更多的预测
- 杂质少
- 低熵
8。精度和召回
精确度和召回率是用于评估分类模型的度量。在描述这些指标之前,最好先解释一下混淆矩阵。
混淆矩阵显示了每个类别的正确和错误(即真或假)预测。在二进制分类任务的情况下,混淆矩阵是 2×2 矩阵。如果有三个不同的类,那就是一个 3x3 的矩阵,以此类推。
假设 A 类是正类,B 类是负类。混淆矩阵的关键术语如下:
- 真阳性(TP) :预测阳性类别为阳性(ok)
- 假阳性(FP) :将阴性类别预测为阳性(不正常)
- 假阴性(FN) :将阳性类别预测为阴性(不正常)
- 真阴性(TN) :预测阴性类别为阴性(ok)
精度表示有多少正面预测是正确的。精度的焦点是正面预测。
Recall 表示模型能够正确预测多少个阳性类别。召回的重点是实际正班。
9.ROC 曲线和 AUC
ROC(接收器工作特性)曲线通过组合所有阈值处的混淆矩阵来总结分类模型的性能。ROC 曲线的 x 轴是真阳性率(灵敏度),ROC 曲线的 y 轴是假阳性率(1-特异性)。
如果阈值设置为 0,模型将所有样本预测为阳性。在这种情况下,TPR(灵敏度)为 1。然而,FPR(1-特异性)也是 1,因为没有阴性预测。如果阈值设置为 1,TPR 和 FPR 都变为 0。因此,将阈值设置为 0 或 1 不是一个好的选择。
我们的目标是提高真阳性率(TPR ),同时保持低假阳性率(FPR)。正如我们在 ROC 曲线上看到的,随着 TPR 增加,FPR 也增加。所以最终决定了我们能容忍多少假阳性。
我们可以使用另一个称为 AUC (曲线下面积)的指标,而不是试图在 ROC 曲线上找到最佳阈值。AUC 是介于(0,0)和(1,1)之间的 ROC 曲线下的面积,其可以使用积分来计算。AUC 基本上汇总了模型在所有阈值的表现。AUC 的最佳可能值是 1,这表示一个完美的分类器。AUC 越接近 1,分类器越好。在下图中,分类器 A 比分类器 b 好。
10。朴素贝叶斯分类器的假设
与其他监督学习算法一样,朴素贝叶斯使用特征对目标变量进行预测。关键区别在于,朴素贝叶斯假设特征是相互独立的,特征之间没有相关性。然而,现实生活中并非如此。这种特征不相关的天真假设是这种算法被称为“天真”的原因。
所有特征都是独立的假设使得朴素贝叶斯算法比复杂算法更快。在某些情况下,速度优先于更高的精度。它可以很好地处理文本分类和垃圾邮件检测等高维数据。
感谢您的阅读。如果您有任何反馈,请告诉我。
10 种配置让您的 Kafka Producer 更具弹性
让你的卡夫卡制作人更上一层楼
afka 以其弹性、容错和高吞吐量而闻名。但是它的表现并不总是符合所有人的预期。在某些情况下,我们可以通过横向扩展或纵向扩展代理来改进它。而在大多数情况下,我们不得不玩配置的游戏。
卡夫卡生态系统里真的有吨的配置。几乎不可能掌握每一种配置的想法。一方面,它们无疑使系统更加灵活,但另一方面,开发人员可能会对如何使用它们感到非常困惑。
幸运的是,大多数配置都是预先定义好的,在大多数情况下都能很好地工作。首先,他们需要了解的强制性配置非常有限。
但是当然,我假设你正在读这篇文章,因为你想把你的卡夫卡制作人带到一个新的水平。因此,在这篇文章中,我想分享 10 个配置,我认为它们对提高生产商的适应能力非常重要。
本文将要讨论的配置有acks
、replica.lag.time.max.ms
、min.insync.replicas
、retries
、enable.idempotent
、max.in.flight.requests.per.connection
、buffer.memory
、max.block.ms
、linger.ms
、batch.size
。
ack(确认)
ack 是生产者从 Kafka 代理那里得到的确认,以确保消息已经成功提交给该代理。config acks
是生产者在考虑成功提交之前需要接收的确认数量。
ack=1 和 ack=all 的区别,高创造
默认值为 1,这意味着只要生产者收到来自该主题的主代理的 ack,它就会将其视为成功的提交,并继续处理下一条消息。不建议设置acks=0
,因为那样你在提交上没有任何保证。acks=all
将确保生产者从该主题的所有同步副本中获得确认。它提供了最强的消息持久性,但也需要很长时间,从而导致更高的延迟。所以,你需要决定什么对你更重要。
同步副本
acks=all
会从所有的同步副本(ISR)那里得到确认,那么什么是同步副本呢?创建主题时,必须定义想要多少个副本。副本只不过是其中一个代理中消息的副本,因此副本的最大数量就是代理的数量。
在这些复制品中,有一个领导者,其余的都是追随者。领导者处理所有的读写请求,而从者被动地复制领导者。**同步副本是在最后 10 秒完全赶上领先的副本。**时间段可以通过replica.lag.time.max.ms
进行配置。如果某个代理出现故障或出现网络问题,那么他就无法与负责人联系,10 秒钟后,该代理就会从 ISR 中删除。
默认最小同步副本(min.insync.replicas
)为 1。这意味着,如果所有的追随者都倒下了,那么 ISR 就只剩下领导者了。即使acks
设置为 all,它实际上只将消息提交给 1 个代理(领导者),这使得消息容易受到攻击。
由高创建的不同最小同步副本之间的差异
配置min.insync.replicas
基本上定义了生产者在考虑成功提交之前必须接收多少副本。这个配置添加在acks=all
之上,使你的消息更加安全。但另一方面,你必须平衡延迟和速度。
失败时重试
假设你设置了acks=all
和min.insync.replicas=2
。出于某种原因,跟随者完成了,然后生产者识别出一个失败的提交,因为它不能从min.insync.replicas
代理那里得到确认。
您将收到来自生成器的错误消息:
KafkaError{code=NOT_ENOUGH_REPLICAS,val=19,str="Broker: Not enough in-sync replicas"}
您将看到来自正在运行的代理的以下错误消息。这意味着,即使代理正在运行,如果当前的 ISR 不足,Kafka 也不会将消息附加到正在运行的代理。
ERROR [ReplicaManager broker=0] Error processing append operation on partition test-2-2-0 (kafka.server.ReplicaManager)
org.apache.kafka.common.errors.NotEnoughReplicasException: The size of the current ISR Set(0) is insufficient to satisfy the min.isr requirement of 2 for partition test-2-2-0
默认情况下,生成器不会处理这个错误,因此会丢失消息。这被称为最多一次语义。但是您可以通过配置retries=n
让生产者重新发送消息。这基本上是提交失败时生成器可以重试的最大次数。默认值为 0。
由高创建的重试次数=0 和重试次数> 0 之差
如果您设置了retries=5
,那么生产者将最多重试 5 次。您不会注意到生成器日志中的重试次数,因为它只显示提交最终是否成功。但是你可以在代理端看到retries+1
日志消息。
避免重复的消息
在某些情况下,消息实际上已提交给所有同步副本,但由于网络问题(例如,只允许单向通信),代理无法发回 ack。同时,我们设置retries=3
,然后生产者将重新发送消息 3 次。这可能会导致主题中出现重复的消息。
假设我们有一个向主题发送 100 万条消息的生产者,在消息提交后但生产者收到所有 ack 之前,代理失败。在这种情况下,我们可能会收到超过 100 万条关于这个话题的消息。这也被称为一次性租赁语义。
最理想的情况是恰好一次语义,在这种情况下,即使生产者重新发送消息,消费者也应该只收到一次相同的消息。
我们需要的是一个幂等生产者。 幂等是指一个操作应用一次或者应用多次效果相同。用配置enable.idempotent=true
很容易打开这个特性。
它是如何工作的?消息是分批发送的,每批都有一个序列号。在代理端,它跟踪每个分区的最大序列号。如果一个具有较小或相等序列号的批次进入,代理不会将该批次写入主题。这样,也保证了批次的顺序。
高创造的禁用幂等元和启用幂等元的区别
按顺序发送消息
保证顺序的另一个重要配置是max.in.flight.requests.per.connection
,默认值是 5。这表示可以在生成器端缓冲的未确认请求的数量。如果retries
大于 1,并且第一个请求失败,但是第二个请求成功,那么第一个请求将被重新发送,并且消息将处于错误的顺序。
根据文档:
请注意,如果此设置设置为大于 1,并且发送失败,则存在由于重试(即,如果启用重试)而导致消息重新排序的风险。
如果您没有启用幂等,但是仍然希望保持消息有序,那么您应该将该设置配置为 1。
但是如果您已经启用了幂等,那么您就不需要显式定义这个配置。卡夫卡会选择合适的价值观,如这里所说的。
如果用户没有明确设置这些值,将选择合适的值。如果设置了不兼容的值,将抛出一个
ConfigException
。
发送消息太快
当生产者调用send()
时,消息不会立即发送,而是添加到内部缓冲区。默认的buffer.memory
是 32MB。如果生产者发送消息的速度比发送给代理的速度快,或者出现了网络问题,那么超过了buffer.memory
,那么send()
调用将被阻塞到max.block.ms
(默认为 1 分钟)。
buffer.memory 和 max.block.ms 由高创建
增加这两个值可以缓解这个问题。
另外两个可以玩的配置是linger.ms
和batch.size
。linger.ms
是批次准备发送前的延迟时间。默认值为 0,这意味着即使批处理中只有一条消息,也会立即发送批处理。有时候,人们增加linger.ms
来减少请求的数量,提高吞吐量。但是这将导致更多的消息保存在内存中。所以,确保你照顾到双方。
还有一个和linger.ms
相当的配置,就是batch.size
。这是单批的最大数量。当满足这两个要求中的任何一个时,将发送批次。
结论
以下是我认为可以让你的卡夫卡制作人更有弹性的 10 个配置。当然,它们不是您需要注意的唯一配置,但这可能是一个很好的起点。请务必阅读官方 Apache Kafka 文档以获得可靠的参考。
如果你有任何其他想法,请在下面留下你的评论。保重!
参考
[## 阿帕奇卡夫卡中的同步副本到底是什么意思?- CloudKarafka,阿帕奇卡夫卡留言…
Kafka 认为,当同步副本集(ISR)中的所有副本都确认它们…
www.cloudkarafka.com](https://www.cloudkarafka.com/blog/2019-09-28-what-does-in-sync-in-apache-kafka-really-mean.html) [## 恰好一次语义是可能的:下面是阿帕奇卡夫卡如何做到这一点
我很高兴我们达到了 Apache Kafkaand 社区期待已久的激动人心的里程碑:我们已经…
www.confluent.io](https://www.confluent.io/blog/exactly-once-semantics-are-possible-heres-how-apache-kafka-does-it/)
给 Python 开发者的 10 个很酷的 Python 项目想法
您可以使用 Python 构建的有趣想法和项目列表
来自 Pexels 的 Andrea Piacquadio 的照片
编写 Python 代码的乐趣应该在于看到短小、简洁、易读的类,这些类用少量清晰的代码表达了大量的动作——而不是让读者厌烦得要死的大量琐碎代码。
吉多·范·罗苏姆
Python 是世界上使用最多的编程语言之一,这可以归功于它的通用性质,这使它成为行业中各个领域的合适候选。使用 Python,你不仅可以为 web 开发程序**,还可以为桌面和命令行开发程序。Python 可以适合不同技能水平的程序员,从学生到中级开发人员,再到专家和专业人员。但是每一种编程语言都需要不断的学习,Python 也是如此。**
如果你真的想获得深入的实践知识,没有比从事一些很酷的项目更好的方法来使用 Python 了,这些项目不仅能让你在空闲时间有所事事,还能教会你如何更好地使用 Python。
你知道吗?
根据 Stackoverflow 的说法,python 是最受欢迎的语言,这意味着大多数开发人员都使用 Python。
这里列出了大一新生最常被问到的 python 面试问题和答案,涵盖了核心…
blog.digitalogy.co](https://blog.digitalogy.co/python-interview-questions-and-answers-for-freshers/)
选择项目平台
Python 在合适的人手里可以是一种非常通用的编程语言,你可以用它构建许多漂亮的程序来加强你对这种语言的掌握。与理论知识相比,更多地接触实践知识是至关重要的,尤其是在学习编程语言(如 Python)时。
但是在我们开始我们为你准备的有趣的项目之前,你必须决定你将在哪个平台上工作。本文提及的项目平台可分为以下三类**😗*
● 网页
构建一个 web 应用程序允许你和其他人通过互联网从任何地方访问它。为此,您需要在应用程序的前端、可视部分和后端工作,在那里实现业务逻辑。工具&框架比如 Django 、 烧瓶 和 Web2Py 是你可以使用的许多选项中的一些。
● 桌面 GUI
桌面应用程序也非常普遍,并且迎合了相当大一部分用户的需求。当涉及到构建桌面应用程序时,Python 使得使用其 PySimpleGUI 包开发桌面应用程序变得非常容易,这允许您使用 Python 构建所有必要的元素。框架 PyQt5 也提供了高级的 GUI 构建元素,但是有一个更陡峭的学习曲线。
● 命令行
命令行程序只能在控制台窗口中运行,根本没有 GUI。用户交互是通过命令进行的,这是最古老的与程序交互的方法,但是不要把它缺少 GUI 误认为它没有用处。数百家顶级企业依赖命令行程序来执行其日常业务活动。构建命令行程序,可以使用 docopt ,Python Fire,plac,以及** cliff 等工具。**
“Python 从一开始就是 Google 的重要组成部分,并且随着系统的成长和发展而保持不变。如今,数十名谷歌工程师使用 Python,我们正在寻找更多掌握这种语言的人。”
——彼得·诺维格,谷歌公司搜索质量总监
Python 正被 IT 界的一些巨头积极使用
towardsdatascience.com](/10-world-class-companies-using-python-26cde24919a8)**
Python 开发者的 Python 项目理念
如果您已经决定了要使用的平台,让我们直接进入项目。下面提到的是一些面向所有技能水平的开发人员的有趣项目,这些项目将在将他们的 Python 技能和信心提升到下一个水平方面起到至关重要的作用。
1。内容聚合器
对于总是在网上寻找东西的数百万人来说,互联网是主要的信息来源。对于那些寻找特定主题的大量信息的人来说,使用内容聚合器可以节省时间。
内容聚合器是一种工具,它从一个地方的大量网站中收集并提供关于某个主题的信息。要制作一个,您可以借助 requests 库来处理 HTTP 请求,借助beautiful soup来解析和抓取所需的信息,并借助一个数据库来保存收集到的信息。
内容聚合器的例子:
- AllTop
- 赫普
2。网址缩写
URL 是导航到互联网上任何资源的主要来源,无论是网页还是文件,有时,其中一些 URL 可能非常大,带有奇怪的字符。URL 缩写在减少这些 URL 中的字符并使它们更容易记忆和使用方面起着重要的作用。
制作 URL 缩短器的想法是使用随机和字符串模块从输入的长 URL 生成一个新的短 URL。一旦你完成了,你就需要映射长 URL 和短 URL,并将它们存储在数据库中,以允许用户将来使用它们。
网址缩写示例—
这里是免费参加课程的链接:——
** [## 免费 Django 教程-尝试 Django 1.10 |创建一个 URL 缩短服务
这一切都始于一个想法。我想要自由…很糟糕。从工作中解脱,从无聊中解脱,最重要的是…
www.udemy.com](https://www.udemy.com/course/try-django-1-10/)
3.文件重命名工具
照片由来自 Pexels 的 Brett Sayles 拍摄
如果您的工作需要您经常管理大量文件,那么使用文件重命名工具可以节省您大量的时间。它的基本功能是使用一个定义好的初始标识符来重命名数百个文件,这个标识符可以在代码中定义,也可以从用户那里获得。
为此,您可以使用 Python 中的库,如 sys 、 shutil 和os 来即时重命名文件。要实现向文件添加自定义初始标识符的选项,您可以使用正则表达式库 来匹配文件的命名模式。
批量文件重命名工具示例—
用于自然语言处理的流行 python 库概述
towardsdatascience.com](/python-libraries-for-natural-language-processing-be0e5a35dd64)
4.目录树生成器
目录树生成器是一种工具,您可以在希望可视化系统中的所有目录并确定它们之间的关系的情况下使用。目录树本质上指示的是哪个目录是父目录,哪个是它的子目录。如果您处理大量目录,并且希望分析它们的位置,像这样的工具会很有帮助。为了构建这个,你可以使用 os 库 列出文件和目录以及 docopt 框架。
目录树生成器示例—
5. MP3 播放器
如果你喜欢听音乐,你会惊讶地发现你可以用 Python 来构建一个音乐播放器。您可以构建一个带有图形界面的 mp3 播放器,该播放器带有一组用于播放的基本控件,甚至可以显示集成的媒体信息,如艺术家、媒体长度、专辑名称等。
您还可以选择导航到文件夹并为您的音乐播放器搜索 mp3 文件。为了使在 Python 中处理媒体文件更容易,可以使用**simple audio、 pymedia 和 pygame 库。**
MP3 播放器示例—
6.井字游戏
井字游戏是一个经典游戏,我们相信你们每个人都很熟悉。这是一个简单有趣的游戏,只需要两个玩家。目标是在一个 3x3 的网格上创建一条由三个 x 或 o 组成的不间断的水平、垂直或对角线,谁先完成,谁就是游戏的赢家。像这样的项目可以使用 Python 的 pygame 库 ,它带有所有需要的图形和音频,让你开始构建这样的东西。
图片来自 Pixabay
这里有几个教程你可以试试:
- https://techvidvan . com/tutorials/python-game-project-TIC-tac-toe/
- 用 Python 制作游戏& Pygame
- 用 Pygame 开发游戏
游戏开发中更有趣的 Python 项目:
7.测验应用程序
使用 Python 可以构建的另一个流行而有趣的项目是一个测验应用程序。一个流行的例子是 卡豪特,,它因使学习成为学生们的一项有趣活动而闻名。该应用程序提供了一系列具有多个选项的问题,并要求用户选择一个选项,稍后,该应用程序会显示正确的选项。
作为开发人员,您还可以创建功能来添加任何需要的问题以及要在测验中使用的答案。要制作一个测验应用程序,您需要使用一个数据库来存储所有的问题、选项、正确答案和用户分数。
问答应用示例—
了解最好的 Python IDEs 和代码编辑器—
** [## 2020 年你必须使用的最好的 Python IDEs 和代码编辑器
具有显著特性的顶级 Python IDEs 和代码编辑器
towardsdatascience.com](/best-python-ides-and-code-editors-you-must-use-in-2020-2303a53db24)
8.计算器
当然,任何人都不应该错过在学习新的编程语言的同时开发计算器的古老想法,即使只是为了好玩。我们相信你们都知道什么是计算器,如果你已经尝试过,你可以尝试用一个更好的 GUI 来增强它,使它更接近今天操作系统的现代版本 T21。为了实现这一点,您可以使用 tkinter 包来将 GUI 元素添加到您的项目中。
9.打造虚拟助手
如今,几乎每部智能手机都有自己的智能助手版本,可以通过语音或文本接收你的命令,管理你的电话、笔记、预订出租车等等。这方面的一些例子有谷歌助手、Alexa、Cortana 和 Siri 。如果你想知道如何制作这样的东西,你可以使用诸如speecher recognitiongTTS、 和 Wikipedia 之类的软件包。这里的目标是记录音频,将音频转换为文本,处理命令,并使程序根据命令进行操作。
这是免费参加课程的链接—
**** [## 免费 Python 教程-学习 Python:构建虚拟助手
我是一个自学的程序员和学习爱好者。我的专长主要是人工智能,Ruby on Rails…
www.udemy.com](https://www.udemy.com/course/learn-python-build-a-virtual-assistant-in-python/?LSNPUBID=JVFxdTr9V80&ranEAID=JVFxdTr9V80&ranMID=39197&ranSiteID=JVFxdTr9V80-l6XGdgLohub6YYv8_fu5pA&utm_medium=udemyads&utm_source=aff-campaign)
10.货币转换器
顾名思义,这个项目包括构建一个货币转换器,允许您以基础货币输入所需的值,并以目标货币返回转换后的值。一个好的做法是对从互联网获取更新的转换率的能力进行编码,以获得更准确的转换。为此,您也可以使用 tkinter 包来构建 GUI。****
更多的 Python 项目想法要建立—
- 用 Django 构建一个简单的网页
- 密码生成器
- 制作一个推特机器人
- 年龄和性别检测
- 乳腺癌分类
- 驾驶员睡意检测
- 语音情感识别
- 用 Python 创建加密应用
- Python 中的速度打字测试
- 用 Python 检测所有假新闻
- Python 中的网络爬虫
- Python 中的剽窃检查器
- Python 文件浏览器
- 闹钟
- 一款实时价格提醒应用
- 站点连接检查器
- 正则表达式查询工具
- 费用跟踪器
- Youtube 视频下载程序
结论
总结我们列出的一些有趣的想法和可以使用 Python 构建的项目,我们可以说 Python 是一种非常有用的编程语言,可以用来开发各种类型和规模的应用程序。此外,Python 提供的包在很大程度上简化了开发过程,为开发人员提供了巨大的价值。总结一下,我们想说 Python 的潜力是无限的,您可能缺少的唯一东西就是正确的想法。
如果你有更多的建议或想法,我们很乐意倾听。
更多有趣的读物
我希望这篇文章对你有用!以下是一些有趣的读物,希望你也喜欢
使用谷歌人工智能中心将想法变为现实
towardsdatascience.com](/top-google-ai-tools-for-everyone-60346ab7e08) [## Python vs. Node。JS:哪个最适合你的项目?
使用一组预定义的因素对 Python 和 Node.js 进行详细比较
towardsdatascience.com](/python-vs-node-js-which-one-is-best-for-your-project-e98f2c63f020) [## 面向数据科学的顶级 Python 库
面向数据科学的流行 Python 库概述
towardsdatascience.com](/top-python-libraries-for-data-science-c226dc74999b) [## 机器学习和深度学习的最佳 Python 库
现代机器学习模型和项目的 Python 库
towardsdatascience.com](/best-python-libraries-for-machine-learning-and-deep-learning-b0bd40c7e8c)
关于作者
克莱尔 D 。是位于Digitalogy—的内容制作者和营销人员,这是一个技术采购和定制匹配市场,根据全球各地的特定需求,将人们与预先筛选的&顶尖开发人员和设计师联系起来。在LinkedinTwitterinsta gram上连接Digitalogy*。***********
Python 开发者的 10 个疯狂的酷项目创意
PYTHON 编程
挑战您的 Python 技能的疯狂项目想法
西蒙·艾布拉姆斯在 Unsplash 上拍摄的照片
你知道 Python 被称为全能编程语言吗?
是的,的确如此,尽管它不应该用在每一个项目上,
您可以使用它来创建桌面应用程序、游戏、移动应用程序、网站和系统软件。它甚至是最适合实现人工智能和机器学习算法的语言。
所以,我花了几周时间为 Python 开发者收集独特的项目想法。这些项目想法有望让你重拾对这门神奇语言的兴趣。最好的部分是,您可以通过这些有趣但具有挑战性的项目来增强您的 Python 编程技能。
让我们一个一个来看看。
1-使用语音命令创建软件 GUI
互动样本—原照片由 Headway 在 Unsplash 上拍摄—作者编辑
如今,桌面应用程序开发领域已经取得了巨大的进步。你会看到许多拖放 GUI 生成器和语音识别库。那么,为什么不把它们结合在一起,通过与计算机对话来创建一个用户界面呢?
这纯粹是一个新概念,经过一些研究,我发现从来没有人试图这样做。所以,这可能比下面提到的那些更有挑战性。
下面是一些使用 Python 开始这个项目的说明。首先,你需要这些包:-
现在,我们的想法是硬编码一些语音命令,比如:
你明白了,对吧?添加更多这样的命令非常简单明了。
因为这将是一个最低可行产品(MVP) 。所以,如果你不得不硬编码许多条件语句(比如 if…else),这完全没问题。
设置了一些基本命令后,就该测试代码了。现在,您可以尝试在窗口中构建一个非常基本的登录表单。
这个想法最大的灵活性在于它可以应用于游戏开发、网站和移动应用。即使在不同的编程语言中。
2-人工智能赌博机器人
网球比赛——照片由 Moises Alex 在 Unsplash 上拍摄
赌博是一种人们预测结果的活动,如果他们是正确的,那么他们就会得到回报。现在,有许多技术进步发生在过去几年的人工智能或机器学习中。
例如,你可能听说过像 AlphaGo Master 、 AlphaGo Zero 和 AlphaZero 这样的程序,它们可以比任何职业人类棋手更好地玩 Go (game) 。你甚至可以获得一个叫做 Leela Zero 的类似程序的源代码。
我想传达的观点是,AI 正在变得比我们更聪明。这意味着它可以通过考虑所有的可能性并从过去的经验中学习来更好地预测一些事情。
让我们应用 Python 中的一些监督学习概念来创建一个 AI 下注机器人。这里有一些你需要开始使用的库。
- 熊猫——数据分析
- NumPy——多维数组、矩阵和数学函数
- scikit-learn——机器学习
- XGBoost —梯度增强
- Matplotlib —绘图
- seaborn —统计数据可视化
- pickle — Python 对象序列化
首先,你需要选择一个游戏(如网球、足球等。)来预测结果。现在搜索可用于训练模型的历史匹配结果数据。
例如,网球比赛的数据可以在。csv 格式来自tennis-data.co.uk 网站。
如果你不熟悉赌博,这里是它是如何工作的。
- 你想在罗杰·费德勒身上赌 10 美元,赔率为 1.3。
- 如果他赢了,你将获得 10 美元(实际金额),外加 3 美元(利润)。
- 如果他输了,你也会输掉你的钱(例如 10 美元)。
在训练模型之后,我们必须计算每个预测的置信水平,通过检查预测正确的次数来找出我们的机器人的性能,最后还要关注投资回报(ROI) 。
下载 Edouard Thomas 的类似开源人工智能赌博机器人项目。
3-交易机器人
交易—照片由 Nick Chong 在 Unsplash 上拍摄
交易机器人与之前的项目非常相似,因为它也需要 AI 进行预测。
现在的问题是,一个 AI 能否正确预测股价的波动?
答案是肯定的。
在开始之前,我们需要一些数据来开发一个交易机器人。
- 雅虎!金融—获取股票数据
- Alpha Vantage —财务数据实时 API
来自 Investopedia 的这些资源可能有助于训练机器人。
读完这两篇文章后,你现在会对什么时候买股票,什么时候不买有更好的理解。这些知识可以很容易地转换成 Python 程序,自动为我们做出决定。
你也可以参考这个叫做 freqtrade 的开源交易机器人。它是使用 Python 构建的,实现了几种机器学习算法。
4-钢铁侠贾维斯(基于人工智能的虚拟助手)
AI 助手界面——Joshua Sortino 在 Unsplash 上拍照
这个创意取自好莱坞电影系列钢铁侠。这部电影围绕技术、机器人和人工智能展开。
在这里,钢铁侠利用人工智能为自己打造了一个虚拟助手。这个程序被称为贾维斯,帮助钢铁侠完成日常任务。
钢铁侠用简单的英语给贾维斯下达指令,贾维斯也用英语回应。这意味着我们的程序将需要语音识别以及文本到语音的功能。
我建议使用这些库:
现在,您可以像这样硬编码语音命令:
您还可以使用 Jarvis 完成大量其他任务,例如:
- 在手机上设置闹钟。
- 持续检查家庭安全摄像头,并在有人在外面等候时通知。您可以添加更多功能,如面部检测和识别。它能帮助你找出那里有谁或有多少人。
- 打开/关闭房间窗户。
- 开灯/关灯。
- 自动回复邮件。
- 计划任务。
甚至脸书的创始人“马克·扎克伯格”也做了一个 Jarvis 作为副业。
5-监控网站,了解即将到来的艺术家音乐会
门票——安迪·李在 Unsplash 上的照片
Songkick 是一项非常受欢迎的服务,提供关于即将举行的音乐会的信息。它的 API 可以用来搜索即将到来的音乐会:
- 艺术家
- 位置
- 举办地点
- 日期和时间
您可以创建一个 Python 脚本,使用 Songkick 的 API 每天检查特定的音乐会。最后,只要音乐会有空,就给自己发一封电子邮件。
有时 Songkick 甚至会在他们的网站上显示购票链接。但是,这个链接可以转到不同音乐会的不同网站。这意味着即使我们利用网络抓取,也很难自动购买门票。
相反,我们可以简单地显示 buy tickets 链接,就像在我们的手动操作应用程序中一样。
6-自动免费续订让我们加密 SSL 证书
让我们加密 Logo—https://letsencrypt.org/
让我们加密是一个提供免费 SSL 证书的认证机构。但是,问题是这个证书的有效期只有 90 天。90 天后,你必须续费。
在我看来,这是使用 Python 实现自动化的一个很好的场景。我们可以编写一些代码,在网站 SSL 证书到期前自动更新证书。
在 GitHub 上查看这个代码以获得灵感。
7-识别人群中的个人
人脸识别—作者图片
如今,各国政府在公共场所安装了监控摄像头,以加强公民的安全。大多数这些摄像机仅仅是为了记录视频,然后法医专家必须手动识别或追踪个人。
如果我们创建一个 Python 程序,实时识别摄像机中的每个人,会怎么样?首先,我们需要进入一个全国性的身份证数据库,我们可能没有。
因此,一个简单的选择是用你的家庭成员的记录创建一个数据库。
然后你可以使用一个人脸识别库,把它和相机的输出连接起来。
8 触点跟踪
联系人追踪应用程序——照片由 Unsplash 上的 Markus Winkler 拍摄
接触追踪是一种识别在特定时间段内相互接触的所有人的方法。它在像新冠肺炎或艾滋病毒这样的疫情最有用。因为没有任何关于谁被感染的数据,我们无法阻止它的传播。
Python 可以与名为 **DBSCAN(基于密度的带噪声应用空间聚类)**的机器学习算法一起用于接触追踪。
由于这只是一个附带项目,所以我们无法获得任何官方数据。现在,最好使用 Mockaroo 生成一些真实的测试数据。
具体代码实现你可以看看这篇文章。
9-自动将文件从一个文件夹移动到另一个文件夹
Ubuntu 中的 Nautilus 文件管理器——图片由作者提供
这是一个非常基本的 Python 程序,可以持续监控一个文件夹。每当文件被添加到该文件夹中时,它检查其类型并相应地将其移动到特定的文件夹。
例如,我们可以跟踪我们的下载文件夹。现在,当一个新的文件被下载后,它会根据其类型自动移动到另一个文件夹中。
。exe 文件很可能是软件设置,所以把它们移到“软件”文件夹中。然而,在“图像”文件夹内移动图像(png、jpg、gif)。
这样我们可以组织不同类型的文件以便快速访问。
10-从 YouTube 上收集职业道路视频
YouTube 主页——照片由 Kon Karampelas 在 Unsplash 上拍摄
创建一个应用程序,接受我们在职业生涯中需要学习的技能名称。
例如,要成为一名 web 开发人员,我们需要学习:
- HTML5
- CSS3
- Java Script 语言
- 后端语言(PHP、Node.js、Python、ASP.NET 或 Java)
- 自举 4
- wordpress 软件
- 后端框架(Laravel,Codeigniter,Django,Flask 等。)
- 等等。
进入技能后会有一个**“生成职业路径”**按钮。它指示我们的程序搜索 YouTube 并根据每个技能选择相关的视频/播放列表。如果有很多类似的技能视频,那么它会选择一个最多的观点,评论,喜欢等。
该程序然后根据技能将这些视频分组,并在 GUI 中显示它们的缩略图、标题和链接。
它还会分析每个视频的持续时间,汇总它们,然后通知我们学习这条职业道路需要多长时间。
现在,作为用户,我们可以观看这些按部就班订购的视频,成为这一职业的大师。
结论
用独特的编程项目挑战自己让你保持活跃,提高你的技能,并帮助你探索新的可能性。
我上面提到的一些项目思路也可以作为你的最后一年项目。
是时候用 Python 编程语言展示你的创造力了,把这些想法变成你会引以为豪的东西。
感谢阅读!
确保数据和代码质量的 10 个数据工程实践
入门
我从不同公司的数据工作中学到了什么
来自 Pexels 的 Kehn Hermano 摄影
数据工程是本世纪发展最快的职业之一。自从我开始在这个领域工作以来,我遇到了各种确保跨组织的数据和代码质量的方法。尽管每个公司可能遵循不同的过程和标准,但有一些通用的原则可以帮助我们提高开发速度,改进代码维护,并使数据工作更容易。
1.函数式编程
我在学习期间学习的第一门编程语言是 Java。尽管我理解面向对象编程在创建可重用的类和模块方面的好处,但我发现在处理数据时很难应用它。两年后,我遇到了 R——一种函数式编程语言,当时我就爱上了它。能够使用dplyr
包并简单地通过管道传递函数来转换数据并快速看到结果,这改变了我的生活。
但是最近, Python 允许我们将两个世界结合起来:编写面向对象的模块化脚本的能力,同时利用函数式编程,这种编程在与 r。
函数式编程在处理数据方面如此出色的原因是,几乎任何数据工程任务都可以通过以下方式来完成:获取输入数据,对其应用一些函数(即 ETL 中的 T:转换、清理或丰富数据),然后将其输出加载到某个集中的存储库中,或者为报告或数据科学用例提供服务。
函数式编程范式在数据工程中非常常见,以至于许多博客文章都是关于它的。例如,下面链接的文章已经由 Apache Airflow 的创始人 Maxime Beauchemin 在 2018 年初发布:
批量数据处理——历史上称为 ETL——极具挑战性。这很耗时,也很脆弱,而且经常…
medium.com](https://medium.com/@maximebeauchemin/functional-data-engineering-a-modern-paradigm-for-batch-data-processing-2327ec32c42a)
类似地,许多数据工程工具已经被创建来促进这个过程。函数式编程让我们可以创建代码,这些代码可以在许多数据工程任务中重用,并且可以在对大量生产数据运行 ETL 之前,通过向函数提供小块数据来轻松地进行测试。
2.设计你的函数来做一件事
为了使函数可重用,以这样一种方式编写它们是一个很好的实践,即它们只做一件事。你总是可以有你的主要功能,可以把不同的部分联系在一起。总的来说,我发现通过将功能变小(,即专注于做好一件事,我倾向于更快地开发代码,因为单个元素的失败可以更容易地被识别和修复。
更小的功能也更容易更换单个组件,并将其用作乐高积木,可以根据不同的使用情况组合在一起。
3.正确的命名约定至关重要
一个好的做法是给对象命名,这样一个看你代码的新人就能立即理解你的意图。如果有些缩写不是每个人都能理解的,最好避免使用它们,并写出全称。此外,我见过的大多数数据工程师倾向于使用以下约定:
- 作为功能名称的动词,例如。
get_dataframe_from_google_ads()
可能比google_ads()
更容易理解——更长的版本不仅显示了源系统,还显示了函数执行的动作和它返回的对象类型(一个数据帧)。你可以认为它很罗嗦,但是通常,你只需要写两次:一次在你定义它的时候,一次在你调用它的时候。因此,在我看来,那些更长的名字是值得的。 - 大写全局变量 —我合作过的大多数数据工程师都将全局变量定义为大写,以区别于局部变量(例如主函数中的那些)
- 许多人认为最好只在脚本的顶部定义imports——理论上,您可以在函数或类中导入库,但是如果所有的导入都在脚本的顶部,可能会更容易跟踪包的依赖关系。
理想情况下,您的命名可以使您的代码自文档化,这也可以使您更快地编写代码。
4.通过编写更少更好的代码,使您的代码易于维护
一般来说,我们读代码的频率要比写代码的频率高得多。因此,让我们的代码易读、易理解是有意义的。有了正确的命名和良好的结构,我们可以让未来的自己和其他使用我们代码的人更容易。
简洁也是有帮助的:我们写的代码越少,我们需要维护的代码就越少。如果我们可以用更少的代码完成一些事情,这是一个潜在的胜利。
5.文档是关键,但前提是处理得当
这听起来可能违背直觉,但是我们不应该记录我们的代码在做什么。相反,我们应该记录为什么我们的代码正在做它正在做的事情。我经常看到代码注释陈述显而易见的事情。
图片来自 Reddit 上的节目幽默[1]
例如,我们的函数get_dataframe_from_google_ads()
不必说我们正在从谷歌广告下载数据,而是说这样做的原因。“下载广告支出数据,用于以后的营销成本归属.”
最重要的是,使用 docstrings 或类型注释来记录函数的预期输入和输出非常有用!它会立即让你成为更好的数据工程师。
6.避免硬编码值
我见过许多与 ETL 相关的 SQL 查询使用了一些阈值,却没有解释使用它们的原因。例如,假设有一个脚本从某个表中提取数据,但只针对 2020 年 9 月 30 日之后发生的事件。而且绝对没有文件证明为什么有人选择了这个特定的日期!如果不解释原因,人们以后怎么会发现为什么这个值被硬编码了呢?这可能是因为,在那一天,公司过渡到一个新的源系统、数据提供商,或者他们可能改变了一些业务策略。
我并不是说在代码中指定这样的业务逻辑是错误的。但是,如果没有记录为什么有人选择了这样一个任意的阈值,这个硬编码的值在未来几年对下一代数据工程师来说可能仍然是一个谜。
7.避免保留僵尸代码
我经常遇到的一个常见的反模式是,有人保留了已经被放弃但在脚本中被注释掉的代码。也许有人想测试一些新的行为,并保留旧的版本,以防新的不工作。或者这个人想保留历史。在这两种情况下,我认为最好避免这种情况,因为这可能会使后来的开发人员难以区分什么是真正正确的版本。
例如,我经历过这样一种情况,被注释掉的代码片段比没有被注释掉的版本更有意义。可能在某个时候,有人会调换这两个版本,因为他或她会认为注释掉这个更符合逻辑的版本是错误的。因此,保留一个僵尸代码可能是危险的。
8.模块化做得好:将你的业务逻辑与实用功能分开
混合实用功能和业务逻辑是有意义的,但是将它们分开仍然是有益的。如果使用得当,公共功能可以被推到不同的包中,并在以后的许多项目中重用。这种分离需要更多的前期工作。通过为这样的包建立一个发布过程,但是可重用性和只定义一个功能一次的好处从长远来看是值得的。
9.保持简单
根据 Python 的禅[2]:
“简单比复杂好。”
许多数据工程师,尤其是那些有计算机科学背景的人,有时可以创建复杂但过于复杂的解决方案。例如,如果某个东西可以表示为一个简单的函数,该函数将一些数据作为输入,并返回一个转换后的版本作为输出,那么为这样的操作编写一个自定义类对象可能会被认为是一个过度设计的解决方案。
10.考虑长远
有时候,我们需要在正确做事和快速做事之间做出权衡。创建足够通用的解决方案,以便在不同的用例中重用,这将使我们的长期生活更轻松,需要更长的时间来开发。例如,为跨项目共享的模块建立一个发布过程和 CI/CD 管道可能会在前期花费大量时间,但是这种额外的努力通常会在后期得到回报。花时间创建持续验证和监控数据质量的脚本也是如此。
结论
在本文中,我们讨论了数据工程的最佳实践,以确保高质量的数据和代码的可维护性。我们已经展示了大多数数据工程任务可以表示为函数,这些函数接受一些输入数据,并根据特定的业务需求对其进行转换。
理想情况下,这些函数应该被设计为做一件事,并被记录下来,这样任何阅读代码的人都知道什么是需要的输入,什么是函数生成的输出。
我们还研究了有用的命名约定,以及构造、编写和记录代码的最佳方式,以使其长期有用。
感谢您的阅读!如果这篇文章对您有帮助,请 关注我的 来看我的下一篇文章。
资源:
[1] Reddit — 猫咪图片
【2】Python 之禅
10 天来改进我的 Python 代码
对代码进行小的日常修改如何对效率产生大的影响
照片由 chuttersnap 在 Unsplash 上拍摄
在之前的一篇文章中,我谈到了通过每天早上对你前一天写的代码做一个修改来提高你的 Python 代码的效率。无论我做了什么更改,我都会确保在将来使用新的方法,这意味着我的代码的质量和效率总体上有所提高。
做出这些改变后,我会给我的团队发一条消息,让他们知道我做了什么。以下是我在头 10 天发出的消息,它们被汇编成一篇文章,这样你就可以看到这种日常练习对你的代码的重大影响。
注意:这些是我在两周的工作中用来改进代码的真实例子。其中一些可能看起来有点随意或明显,但它们都适用于我当时的代码。不管怎样,我希望你能理解和欣赏代码改进的基本方法。
第一天
仔细定义 Pandas 中的列类型如果您正在使用 Pandas 中的大型数据集,那么在使用dtype
参数读取数据或使用astype
更改类型时,定义模式总是值得的。存储为 0 和 1 的布尔值通常被设置为 int32 或 int64 类型。在某些情况下,将它们转换为 bool 类型可以大大减少数据帧占用的内存。
将列的类型从 int64 更改为 bool 会导致该列占用八分之一的内存
第二天
快速遍历 Pandas DataFrame 如果您需要遍历 Pandas DataFrame,那么遍历作为 NumPy 数组的值可能会更快。在下面的例子中,这导致代码运行速度提高了两个数量级!
迭代数据帧的值而不是使用 iterrows 可以使时间减少 2 个数量级
第三天
海象操作符 从 Python 3.8 开始,海象操作符(:= see eyes and tucks)已经可以用于变量的赋值,同时也可以用作更大表达式的一部分。
if (n := len(a)) > 5: print(f’The length of a is {n}’)
代替
n = len(a)
if n > 5:
print(f’The length of a is {n}’)
照片由 Jay Ruzesky 在 Unsplash 上拍摄
第四天
羽毛文件格式 在漫长的数据处理流水线中,在关键的里程碑处保存输出是一个很好的做法。 Apache arrow (你需要安装 pyarrow )已经创建了羽化格式,非常适合这些情况。文件比 csv 小,它是语言不可知的(可以在 R,Python,Julia 等中使用)。),而且它的读/写速度一般只受本地磁盘性能的速度限制。Pandas 能够读写 feather 文件,因此当您想要快速保存中间数据帧时,它是完美的。
羽化格式几乎是 CSV 格式的三分之一,读/写速度更快
第五天
字符串格式化 Python 提供了许多不同的方法来格式化字符串,其中一个要避免的就是将字符串加在一起。这增加了内存占用,因为 Python 必须在将每个单独的字符串相加之前为它们分配内存。两个更好的选择是使用%符号,或 f 字符串。f 字符串通常是最快的选择,可以让你的代码更容易阅读。
f 字符串速度更快,提高了代码的可读性。(是的,58 个,还在继续)
第六天
Cython Jupyter 扩展 Cython 是 Python 的库和超集语言。它允许你编写编译成 C 语言的 Python 代码,所以它通常运行得更快。 Jupyter 笔记本有一个扩展用于在一个单元内运行 Cython。和 C 一样,你需要确保使用cdef
来指定每个变量的类型。
注意:记得先 安装 cython 。
Cython 将这个斐波那契函数的速度提高了 2 个数量级!
第七天
布尔比较 有几种方法可以将变量与布尔进行比较。在 if 语句中,删除比较运算符通常是最快的方法。时差可能看起来不是很大,但这是一个很容易做到的改变,可以使您的代码更具可读性。
对布尔变量使用不带比较运算符的 if 语句会更快,并提高可读性
第八天
NumPy 掩码数组 NumPymasked array类是 NumPy 数组类的子集,在有数据缺失时使用。当一个特定的值已经被用于缺失数据,并且您想从一个操作中排除它时,例如 np.max,它特别有用。
MaskedArray 可以从操作中排除丢失的数据,而无需从对象中移除数据
第九天
排序函数 Python 中有几种排序的方法。两个内置方法是sorted
和sort
,用于基本排序,可以互换使用。然而,因为sort
方法就地修改列表,而不是像sorted
那样创建一个新列表,所以它通常更快。即使在使用key
参数时也是如此,它在排序前对每个元素应用一个函数。
然而,值得注意的是sorted
方法的功能比sort
广泛得多。例如,sorted
可以接受任何 iterable 作为输入,而sort
只能接受一个列表。
对于简单的排序任务,排序方法通常比 sorted 快
第 10 天
使用 pandas 进行多重处理 沿给定轴应用的 Pandas 操作,如 apply 和 map 方法,非常容易并行化,其中沿轴的每一行/列都被单独处理。当数据帧很大或者您想要应用/映射计算开销很大的函数时,这尤其有用。这可以使用 Python 多处理库相对简单地实现。
但是,请记住,对于较小的数据,在内核之间分配作业所花费的时间可能会超过在单个内核上顺序运行作业所花费的时间。
多处理库可用于在多个内核之间分配作业以加快处理速度,但对于较小的数据帧,处理速度通常会较慢
对一些读者来说,这些变化中的一些似乎是显而易见的或无用的,而对其他人来说,它们可能是你从未见过的或真正有用的。不管怎样,我希望看到这篇文章能让你明白,每天花一点时间改进你的 Python 代码(或任何其他语言)会对你的编码技能和效率产生持久的影响。
“程序员深度学习”10 天
我对“fastai”的课程和书籍的体验
图片由来自 Pixabay 的 Ryan McGuire 拍摄
背景
10 天前开始针对编码员的实用深度学习。我不得不说他们务实的态度正是我所需要的。
我通过在短短几个月内学习 Python、Pandas、NumPy 以及任何我需要的东西开始了数据科学。我做了我需要做的任何课程(例如 Kaggle 微课)和我需要阅读的任何书籍(例如 Python for Data Analysis )。所有这些都是我在今年四月开始的为期 90 天的 MOOC’athlon 学习挑战的一部分。这是我一生中最伟大的学习时期之一。在这之后,我在 Kaggle 完成了 Iris 数据和波士顿房价预测项目。然后我从网上搜集数据,用我的熊猫技能把它们清理掉。实施研究论文仍然令人困惑和沮丧。我在研究论文和 Kaggle 项目中挣扎。我擅长 C 语言。你可以给我任何编程语言,我可以比大多数人学得更快,因为编程是我的第二天性。计算机编程只是在我的脑海中流动。而这并没有发生在数据科学上。尽管有学习和大量的工作,但最终,我不记得我做了什么(是的,数据争论是一个地狱般的工作)。我一直处于沮丧的状态。我开始为小事生气,这也影响到了我的个人生活。我想到了退出数据科学和机器学习。已经 4 个月了,我根本没有能力完成任何被认为对商业有用的事情。我感觉被困在一个 4x4 英尺的混凝土盒子里。
挫折的终结
我总是在不断寻找解决问题的不同方法。我认为不同的观点是来自宇宙的祝福。是的,我们都有自己的“观点”,当有人从一个你从未想过的不同而奇怪的角度来看待同一个问题时,总是令人耳目一新。改变我处境的是 Caleb Kaiser 的一篇博文:
学习如何用 ML 模型构建软件
towardsdatascience.com](/dont-learn-machine-learning-8af3cf946214)
他的博客文章让我明白,这种沮丧不仅仅属于我,这是每个程序员都会有的,我并不孤单。这完全改变了我的观点,我决定采用他的方法。我决定两样都做:看书和看视频。
在仅仅一周的课程中,我就能够理解T2 应用数据科学关于体重中毒的研究论文。
又过了几天,在经历了多次失败之后,我成功地在 binder 上实现了熊探测模型。你可以试试这个网络应用。给它传一张以下图片:
1.美国黑熊
2.灰色的
3.北极熊
4.玩具熊
它会检测出是哪一个。给它传递任何其他东西,比如一只鞋,它会尝试将它与模型中 150x4 的熊图片匹配,并尽最大努力。不是人类=:o):
我似乎记得我做过的大部分事情。数据科学终于成为我的第二天性。这次 fastai 的课程让我更有信心去追求更多更高的机器学习知识。我认为如果一些学习方法对你不起作用,那么你需要试试这门课的实用方法。
为什么
这并不是说,传统的学习方法,如做 MOOCs,然后 Kaggle 项目或大学毕业的数据科学路线不起作用。他们可能会,也可能不会。人们是不同的,我们都有不同的背景,我们不可能都遵循传统或混合的方法。时代变了。多亏了互联网,它的去中心化特性,以及网络中立性,世界比过去更加紧密地联系在一起。世界变得越来越小,每个人都可以相互联系。这导致了第四次工业革命:
Christoph Roser 在 http://AllAboutLean.com拍摄的图片
克劳斯·施瓦布,世界经济论坛创始人兼执行主席,文字来自维基百科
第四次工业革命将导致:
- 熄灯制造(全自动工厂,不需要人在现场)
- 智能工厂将监控物理过程,创建物理世界的虚拟副本,并做出分散决策。
- 通过物联网,信息物理系统在内部以及跨越价值链的参与者所使用的组织服务,彼此之间以及与人类之间进行实时通信和合作
按照我的理解,第四次工业革命方式说我们需要快速学习工具,我们需要快速适应新技术和新系统。不要花 2-4 年的时间来学习和准备工作,你需要有能力和态度直接投入工作,建立一些有用的东西,在接下来的几个月里为企业增加价值的东西。我们需要以不同于以往的方式学习。我认为杰瑞米·霍华德、 雷切尔·托马斯、和西尔万·古格这种不酷的学习方法正是这个 21 世纪的行业所需要的。
Kaggle 竞赛和现实生活项目的 10 个区别
Kaggle 竞赛和真实项目之间有一些非常重要的区别,新手数据科学家应该了解这些区别。Kaggle 创造了梦幻般的竞争精神。它的排行榜促使人们提供越来越好的解决方案,将准确性推向极限。Kaggle 的笔记本和讨论让分享知识和学习变得很容易。然而,现实生活中的项目有些不同。我希望这篇文章对考虑从 Kaggle 竞赛开始进入数据科学的人有所帮助。我记得在我的第一个现实生活项目中,所有通常在 Kaggle 上运行良好的模型都悲惨地失败了,这让我有点不知所措。我希望我对此有所准备。
1。数据决定一切,而不是众多型号。在 Kaggle 比赛中,你通常只能使用组织者提供的数据集。在现实生活中,没有这样的限制。你可以挖掘(即收集、准备)尽可能多的新数据。通常是数据造成了差异。也可能有这样的情况,你根本没有任何数据集,你必须定义你想要收集什么数据。你是从零开始,这是另一天的话题。
**2。领域专长的确很重要。**当杰瑞米·霍华德说没有的时候,他实际上指的是卡格尔竞赛。在 Kaggle 上,您已经创建了一个数据集。这完全是关于理解数据分布、制作特性、构建和堆叠模型。您不需要太多关于 data domain 的知识。然而,只要您对数据收集过程有所控制,您就可以从领域专业知识中受益匪浅。这当然有助于你对数据做出更好的假设,从而改进你的建模。我发现收集适当的数据比建模要困难得多。
3。该死,没有排行榜。 Kaggle 排行榜让你注意到自己犯的一个错误。如果你是项目中唯一的数据科学家,就很难对你的模型性能进行基准测试。排行榜显示了准确性的上限,您总是知道您还可以做多少来改进您的模型。不幸的是,这在现实生活中并不适用。
**4。数据清理很重要。**没有人为你清理数据。你独自承担在数据收集过程中犯下的所有错误。通常有很多这样的例子。大量的改进来自于数据清理。
5。解决方案的复杂性很重要。在 Kaggle 比赛中,你只需复制一次你的代码。在现实生活中,有时你必须每 5 或 15 分钟复制一次代码。一种新的 Kaggle 竞争(又名内核竞争)正在缩小这种差距,但它们相当罕见。模型响应时间通常对实时预测非常重要。
**6。您的测试集是动态的。**您的列车组是动态的。在 Kaggle 竞赛中,你要进行大量的测试来挑选最好的特征和模型。您的环境大部分时间是固定的——训练集和测试集不会改变。通常你不会有这么舒适的设置。在 Kaggle 比赛中完成一次的事情,一旦你的火车设置发生变化,就必须一遍又一遍地重做。在某些领域,你的火车设置会每小时改变一次!您的整个解决方案(包括功能和型号选择)应该完全自动化。
7。测试和重构。您的代码的生命周期可能超过 2 个月,您通常会进行几轮深入的重构。良好的测试块将有助于这一点。看一下 pytest。
8。模型部署。你训练出来的模型很棒,但对公司没用。它必须以某种方式部署到生产中。部署通常意味着模型被加载到内存中,有接收请求的接口,可以处理请求并返回预测。像 tornado/flask 这样的网络服务器可能会有所帮助。MOOCs 很少提到这一点,Kaggle 也是。
9。性能控制。一旦你的模型被部署,你需要控制它的性能。通常,当数据集发生重大变化或收集到新数据时,您会希望重新训练模型。报告(比如开源 Dash 或 RShiny)不仅可以帮助你控制模型的准确性,还可以吸引更多的商业注意力到你公司的数据科学项目中。麦肯锡的“用图表说话”或 Dona M. Wong 的“华尔街日报信息图表指南”就像是数据展示世界中的圣经。
**10。伐木。**通常在 Kaggle 上使用,仅用于控制训练流程。不需要使用不同的日志记录级别来记录训练/预测管道中的每一点。在现实生活项目中,任何事情都可能发生,因为环境要复杂得多—它不仅限于笔记本电脑或服务器上的一台笔记本电脑。良好的日志记录实践有助于减少调试时间。
塞尔吉·马卡雷维奇,2020 年 1 月 8 日,https://www.linkedin.com/in/sergii-makarevych-78b62339/
数据科学家必备的 10 款 Jupyter 笔记本扩展
近距离观察最佳 jupyter contrib 扩展
目录
- 介绍
- 扩展ˌ扩张
- 摘要
- 参考
介绍
作为一名主要在 Jupyter Notebook 工作的数据科学家,我在我的笔记本中经历了几次开发的好处,同时也遇到了许多各种各样的问题。其中一些问题可以通过jupyter _ contrib _ nb extensions[2]解决。如果没有解决,那么笔记本可以增强。这个 Python 包有许多 nb 扩展,您可以配置这些扩展来帮助简化您的数据科学开发过程。重要的是要注意,一旦你安装了这个软件包,你将需要从你的终端重启你的笔记本电脑才能看到它的效果。下面,我将描述在我的数据科学过程中帮助我的 10 大或基本 Jupyter 笔记本扩展。
扩展ˌ扩张
nb 扩展选项卡。作者截图[3]。
正如您从上面的截图中看到的,您可以启用大量的扩展来简化 Jupyter 编码和数据科学开发。我已经选择并启用了 10 个扩展,我也将在下面描述。有几个已经预先点击过的,比如jupyter-js-widgets/extensions,一旦你启用了你的扩展,它就会显示小部件和图标。同样,也有 Nbextensions 编辑菜单项已经预选。
代码美化
- 该扩展有助于美化或正确格式化 Jupyter 笔记本单元格中的 Python 代码。您可以单击图标在当前单元格中重新格式化您的代码。下面是这个扩展执行前后的情况。这段代码已经很好地格式化了,所以我想展示一下它在右边正确地创建了格式化的间距。对于一些笔记本来说,这可能是一个小变化,但对于其他人来说,你可能有数百个功能的格式不正确,这个扩展可以立即修复你的格式。
美化前后。作者截图[4]。
可折叠标题
- 如果您用标题构建 Jupyter 笔记本,您可以使用标题左侧的向下箭头折叠同一标题部分中的信息和单元格。以下是可折叠标题的使用前和使用后。当你有,比如说一个笔记本有 10 个标题,而你想在代码评审或涉众会议上只突出一个标题部分,或者只是为了帮助你自己更专注于一个部分时,这是很有用的。除了选项、CSS、内部构件和导出更改之外,还有更多重要的参数可以添加到您的扩展中(一旦您安装了这个库,这些以及其他进一步的实现将包含在大多数扩展中)。
可折叠标题的前后。作者截图[5]。
通知
这个扩展允许您的笔记本在您的内核空闲时向您发送 web 通知。如果您有一个长时间的任务在运行,这个扩展可以通过了解您当前的进程而变得有用。你也可以选择 0 秒、5 秒、10 秒和 30 秒。这是您笔记本中的下拉菜单示例。
通知下拉菜单。作者截图[6]。
代码折叠(和编辑器中的代码折叠)
这可能是我最喜欢的扩展。与可折叠的标题类似,这个扩展可以折叠您的代码部分,以便您可以更容易地滚动和查看您的笔记本。
如果您有一个长字典或长函数,您可以折叠它们,以便它们主要是隐藏的,但仍然显示函数命名,以便您仍然可以看到主要部分。在下面的例子中,你可以看到函数是如何折叠的,你甚至可以折叠到注释级别来隐藏这两个函数,只保留你的注释文本。紫色箭头图标表示代码在那里,但是被隐藏了。当与他人共享您的代码时,或者当您想专注于笔记本的某些部分时,这种扩展是有益的。
代码折叠示例。作者截图[7]。
荧光笔
这个扩展相当简单,不言自明。您可以通过点击荧光笔图标来高亮显示您的减价文本。你可以看到有几个选项,如下面使用的红色和黄色。下面是这个简单而有用的扩展的前后对比。
荧光笔延伸之前和之后。作者截图[8]。
拼写检查器
拼写检查器也很简单,但是很有用。如果您正在共享您的笔记本,将它推送到 GitHub,或者向利益相关者展示它,这个扩展特别有用。你需要确保在你的减价单元格中拼写正确。你不会看到拼写错误的单词出现在你显示的减价中,而只会出现在你的编辑中。这个特性是有益的,因此如果你确实有一些你不同意拼写检查的单词,比如 Jupyter Notebook ( 实际上不是 Jupiter Notebook ),你仍然可以显示它而没有令人分心的红色高亮文本。
拼写检查示例。作者截图[9]。
代码字号
如果你想改变代码的字体大小,这个扩展允许你这样做。当共享和协作时,尤其是共享您的屏幕时,这个特性可以证明是有益的,这样您的代码更容易查看。
日戳
这个扩展允许你粘贴你当前的日期和时间到你的单元格中。我建议将其保存为 markdown,这样格式就不会像代码一样运行很难看到格式。如果您想跟踪何时启动了一个涉及不同单元和功能的进程,这个扩展可能会很有用(在流行的 tqdm 库之上*)。*
草稿栏
这个扩展非常有用。您可以通过选择键盘上的 Ctrl-B 来使用便签簿,如下所示。您可以修改当前的代码,也可以在相同的内核上运行。如果您需要在笔记本中比较代码和注释,这对于并排查看代码和注释也很有用。
便签簿示例。作者截图[10]。
跳过回溯
这种独特的扩展允许您忽略在 Jupyter 笔记本单元格中看到的一些重复或冗长的错误消息。它的工作原理类似于可折叠的标题和代码折叠。在下面的截图中,您可以看到错误的主要部分仍然在右边,但是减少了重复的错误信息,这些错误信息有时会导致头痛,使您无法修复相同的错误。
跳过追溯示例。作者截图[11]。
摘要
杰斯·贝利在 Unsplash 上拍摄的照片。
这是 Jupyter 笔记本的 10 个基本扩展,适用于数据科学家或任何喜欢在 Jupyter 笔记本上编程和开发的人。我希望你学到了一些新的技巧,可以让你作为数据科学家的工作变得更容易。请记住,还有很多扩展需要探索。这些是我觉得特别有趣和有用的。
这里是我上面提到的所有扩展:
Code prettifyCollapsible HeadingsNotifyCodefoldinghighlighterspellcheckerCode Font SizedatestamperScratchpadSkip-Traceback
感谢您的阅读!如果您曾经使用过这些或其他 Jupyter 笔记本扩展,请在下面评论。
参考
[2] Jupyter Contrib 团队,Jupyter-Contrib-nb extensions,(2015–2018)
[3] M.Przybyla,NBextensions 选项卡截图,(2020 年)
[4] M.Przybyla,美化前后截图,(2020 年)
[5] M.Przybyla,可折叠标题前后的截屏,(2020 年)
[6] M.Przybyla,通知下拉菜单截图,(2020 年)
[7] M. Przybyla,代码折叠示例截图,(2020 年)
[8] M.Przybyla,荧光笔扩展截图之前和之后,(2020 年)
[9] M.Przybyla,拼写检查示例截图,(2020 年)
[10] M.Przybyla,Scratchpad 示例截图,(2020 年)
[11] M.Przybyla,作者提供的跳过追溯示例截图,(2020 年)
[12]Jess Bailey 在Unsplash上拍摄的照片,(2018)
数据科学统计学中的 10 个重要数字摘要(理论、Python 和 R)
理解并使用 Python 和 R 在 stats 中应用基本的数字汇总来描述数据的中心、分布、最可能的值。
在本文中,我们将回顾以下数值摘要的理论和应用(用 Python 和 R 编写的示例):
- 平均
- 中位数
- 方式
- 百分位
- 四分位数(五位数汇总)
- 标准偏差
- 差异
- 范围
- 比例
- 相互关系
平均
这是平衡点,描述了正态分布数据的最典型的值。我说“正态分布”数据是因为平均值受异常值的影响很大。
平均值将所有数据值相加,然后除以值的总数,如下所示:
平均值的公式
“ x 条用于表示样本均值(数据样本的均值)。“∑”( sigma)表示从“ i =1”直到“ i = n ”的所有值的加法运算(“n”是数据值的数量)。然后将结果除以’ n '。
Python: **np.mean([1,2,3,4,5])**
结果为 3。
R: **mean(c(2,2,4,4))**
结果是 3。
异常值的影响:
平均值中异常值的影响
第一个图的范围是从 1 到 10。平均值是 5.5。当我们用 20 代替 10 时,平均值增加到 6.5。在下一个概念中,我们将讨论“中位数”,这是忽略异常值的最佳选择。
中位数
这就是“中间数据点”,一半数据在中位数以下,一半在中位数以上。这是数据的第 50 个百分位数(我们将在本文后面讨论百分位数)。它也主要用于有偏差的数据,因为异常值不会对中位数产生大的影响。
有两个公式来计算中位数。选择使用哪个公式取决于 n (样本中数据点的数量,或样本大小)是偶数还是奇数。
n 为偶数时的中位数公式。
当 n 为偶数时,没有“中间”数据点,所以取中间两个值的平均值。
n 为奇数时的中位数公式。
当 n 为奇数时,中间数据点为中值。
Python:np.median([1,2,3,4,5,6])
(n是偶数)。结果是 3.5,3 到 4 之间的平均值(中间点)。
R:(n为奇数)。结果是 4,中间点。
异常值的影响:
异常值对中位数的影响很小。在这种情况下没有。
在上图中,我们使用了计算平均值时使用的相同数据。请注意,当我们用 20 代替 10 时,第二张图中的中位数保持不变。并不意味着中位数会一直忽略离群值。如果我们有大量的数字和/或异常值,中位数可能会受到影响,但异常值的影响很小。
方式
该模式将返回最常出现的数据值。
Python: statistics.mode([1,2,2,2,3,3,4,5,6])
结果是 2。
R 并没有给你具体的均值,但是你可以通过下面的操作得到每个数据值的频率: R: table(c('apple','banana','banana','tomato','orange','orange','banana'))
结果是apple:1, banana:3, orange:2, tomato:1
。“香蕉”出现的频率更高,有 3 次。下面是这个水果矢量的直方图。
使用直方图的模式示例。
百分位
等于或小于给定数据点的数据百分比。它有助于描述数据点在数据集中的位置。如果百分位数接近于零,那么观察值是最小的。如果百分位数接近 100,那么该数据点是数据集中最大的一个。
Python:
from scipy import statsx = [10, 12, 15, 17, 20, 25, 30]## In what percentile lies the number 25?
stats.percentileofscore(x,25)
# result: 85.7
R:
library(stats)x <- c(10, 12, 15, 17, 20, 25, 30)## In what percentile lies the number 25?
ecdf(x)(25)
# resul: 85.7## In what percentile lies the number 12?
ecdf(x)(12)
# resul: 0.29
四分位数(五位数汇总)
四分位测量中心,也很好地描述了数据的分布。对有偏差的数据非常有用。有四个四分位数,它们组成了五数汇总(结合最小值)。五数汇总由以下部分组成:
- 最低限度
- 第 25 百分位(下四分位)
- 第 50 百分位(中位数)
- 第 75 百分位(上四分位数)
- 第 100 百分位(最大值)
Python:
import numpy as npx = [10,12,15,17,20,25,30]min = np.min(x)
q1 = np.quantile(x, .25)
median = np.median(x)
q3 = np.quantile(x, .75)
max = np.max(x)print(min, q1, median, q3, max)
R:
x <- c(10,12,15,17,20,25,30)min = min(x)
q1 = quantile(x, .25)
median = median(x)
q3 = quantile(x, .75)
max = max(x)paste(min, q1, median, q3, max)## You can also use the function favstats from the mosaic
## It will give you the five-number summary, mean, standard deviation, sample size and number of missing values.librarylibrary(mosaic)
favstats(x)
一个箱线图是一个很好的方法来绘制五个数字的摘要和探索数据集。
“mtcars”数据集(mpg x gear)的箱线图。
箱线图的底端代表最小值;第一条水平线代表下四分位数;正方形内部的线是中间值;下一行是上四分位数,最上面是最大值。
标准偏差
标准差广泛用于统计学和数据科学。它测量数据集的变化量或离差量,计算数据相对于平均值的分散程度。小值意味着数据是一致的,并且接近平均值。较大的值表示数据高度可变。
**偏差:**这个想法是把平均值作为一个参考点,一切都从这个点开始变化。偏差被定义为观察值与参考点之间的距离。该距离通过从平均值( x-bar )中减去数据点( xi )获得。
计算标准差的公式。
**计算标准偏差:**所有偏差的平均值将始终为零,因此我们对每个偏差进行平方,并将结果相加。然后,我们将其分为’ n-1’ (称为自由度)。我们对最终结果求平方根,以取消偏差的平方。
标准差是数据中所有偏差的代表。它从不为负,只有当所有值都相同时,它才为零。
萼片的密度图。虹膜数据集中的宽度。
这张图显示了萼片的密度。虹膜数据集中的宽度。标准差为 0.436 。蓝线代表平均值,红线距离平均值一个和两个标准差。例如,萼片。值为 3.5 的宽度与平均值相差 1 个标准偏差。
Python:
R:
**离群值的影响:**标准差和均值一样,受离群值的影响很大。下面的代码将使用 R 来比较两个向量的标准差,一个没有异常值,另一个有异常值。
x <- c(1,2,3,4,5,6,7,8,9,10)
sd(x)
# result: 3.02765#Replacing 10 by 20:
y <- c(1,2,3,4,5,6,7,8,9,20)
sd(y)
# result: 5.400617
差异
方差几乎是标准偏差的相同计算,但它停留在平方单位。所以,如果你求方差的平方根,你就得到了标准差。
方差的公式。
注意用’ *s 平方’*表示,标准差用’ s’ 表示。
Python:
R:
范围
最大值和最小值之差。对于一些基本的探索性分析很有用,但不如标准差强大。
范围的公式。
Python:
R:
比例
它通常被称为“百分比”。定义数据集中满足某些要求的观察值的百分比。
相互关系
定义两个定量变量之间关联的强度和方向。它的范围在-1 和 1 之间。正相关意味着一个变量随着另一个变量的增加而增加。负相关意味着一个变量随着另一个变量的增加而减少。当相关性为零时,则完全没有相关性。结果越接近其中一个极端,两个变量之间的关联就越强。
计算相关性的公式。
巨蟒: stats.pearsonr(x,y)
R: cor(x,y)
MPG 和体重的相关性。
该图显示了 mtcars 数据集中 MPG 和重量 (-0.87)之间的相关性。这是一个很强的负相关,意味着随着体重的增加,MPG 下降。
当您探索和分析数据时,这些基本摘要是必不可少的。它们是深入研究统计和高级分析的基础。如果你有什么想让我加入的总结,请随意回复。
作为数据科学家,我不得不处理的 10 个糟糕数据的例子
一瞥使用数据令人沮丧的黑暗面
蒂姆·高在 Unsplash 上拍摄的照片
您可能知道也可能不知道,数据科学的很大一部分都在处理坏数据。
我写这篇文章很开心,所以希望你也能从中得到乐趣。这里有 10 个我不得不处理极其混乱的数据的例子。我相信你们中的许多人会对这些观点产生共鸣!
1)美国,美国,还是美国?
**问题:**我把这作为第一点,因为我认为这是我们许多人都能体会到的。我从来不明白为什么一个应用程序应该让用户选择拼写他们的国家,而不是给他们一个可搜索的列表,因为这导致了必须处理这个问题。
我曾经处理过地理数据,不得不处理不同拼写的国家,例如美国,美国,美国,美利坚合众国。
**解决方案:**我们创建了一个映射表来解决这个问题,但这意味着我们必须不断更新它,以应对系统中出现的任何新变化。
2)一周的第一天是星期天还是星期一?
**问题:**这是我遇到过的最令人沮丧的问题之一——有两个不同的表按周汇总信息,每个表包含两个不同指标的信息。
问题是一个表假定一周的第一天是星期天,而另一个表假定一周的第一天是星期一,这意味着这两个表是不可比的。
想象一下,由于无法匹配时间段,无法正确比较收入和成本。
**解决方法:**没有。
3)缺少用户 ID
我认为你在数据架构或 SQL 中学到的第一件事是主键的概念,所以我发现这一点令人难以置信。
问题:信不信由你,在多个实例中,我不得不处理对每个用户都没有可靠主键的用户数据。换句话说,我必须处理缺少用户 ID 的表。更糟糕的是,我们没有其他可以使用的标识符,比如电子邮件。
**解决方案:**除了将问题提交给数据工程团队之外,没有其他解决方法,所以只能这样了。如果你认为那不好,那会变得更好…
4)不使用主键和外键连接表,第 1 部分
通常,如果您想要连接两个表,通常两个表中都有一个列可以用来连接它们。例如,用户 ID 可能在每个表中,允许您执行连接。
**问题:**曾经有一段时间,我不得不联接两个没有主键和外键的不同表。
**解决方案:**我们最终不得不通过在交叉连接的表上使用欧几里德距离来计算相似性得分,从而连接两个表,匹配彼此最相似的行。
一切都感觉不对劲,但我们别无选择。
5) 5 万不等于 5 万零 105
**问题:**我确信这也是非常相关的——处理不一致的数据。例如,一个表可能告诉我,我们的月收入是 50,000 美元,但另一个具有类似信息的表可能说我们的月收入是 50,105 美元。
这是一个非常简单的例子,但是当处理不一致的数据时,会非常令人沮丧,因为您不知道该相信什么!
**解决方案:**我们的短期解决方案是使用整个公司更常用的表格。长期的解决方案实际上是找出数字不匹配的原因,并从根本上重建管道。
6) Psh。谁在乎逻辑
**问题:**最糟糕的事情之一是处理逻辑被破坏的数据。举个例子,假设有一个记录显示某个用户卸载了同一个应用程序两次,中间没有重新安装。
**解决方案:**除了举起一面红旗,让数据工程师们一头扎进去,我这方面做不了什么。有时候,这才是你真正能做的!
7)我是使用表 A、B 还是 C?是的。
**问题:**令人惊讶的是,我不止一次遇到过这个问题,我不得不处理被划分到几个不同的表中的数据——例如,一个表在 Google Sheet 中,而其他表从 web 应用程序本身被摄取到 Google BigQuery 中。
**解决方案:**这不是一个太大的问题,但这只是意味着我们必须确保每次我们想要处理这些数据时不会忘记 Google Sheet。
8)缺失数据?只是估算平均值对吗?…
每个人都遇到过丢失数据的情况,但并不是所有的丢失数据都可以用同样的方法处理。更重要的是,处理丢失的数据首先要理解数据丢失的原因。
在工作环境中处理丢失的数据一点也不像 Kaggle。当涉及到 Kaggle 时,您只是简单地接受数据本身,但当涉及到现实世界时,如果您注意到不应该丢失的数据,这将是一个大问题。
**问题:**我们想要获得各种应用程序的安装指标,所以我们构建了数据管道,却发现它缺少了我们想要的一半应用程序的指标。
**解决方案:**长话短说,我们使用不同的数据源多次重建管道,结果发现问题与安装如何被跟踪有关——本质上,一半的应用程序在网站上有一个安装按钮,而另一半必须通过完全不同的过程安装,只有安装按钮的应用程序才会被跟踪。因此,为了跟踪我们想要的东西,必须解决这个问题。
9)错别字,错别字,tpyos
**问题:**有一段时间,我的全部工作包括清理和处理客户输入的数据,这意味着的打字错误。糟糕的是,一些客户拼错了他们的名字,一些人输入的电子邮件没有@符号,等等。
**解决方案:**我最终构建了一些函数来确保电子邮件、邮政编码和省份等信息有效。这解决了大约 80%的矛盾。至于剩下的 20%,那是手动解决的,没办法。
10)不使用主键和外键连接表,第 2 部分
仅供参考,这涉及到使用微软 Excel,但它仍然处理坏数据!
**问题:**同样,有一次我必须用金融证券的名称将两个表连接在一起,但是它们没有遵循相同的命名约定,也没有唯一的标识符。
比第一部分更糟糕的是,这是在我了解相似性分数之前,所以只有一个解决方案。
**解决方案:**我不得不手动将这些行相互匹配。我按照字母顺序对每个表进行了排序,并在出现不匹配时移动行。
感谢阅读!
希望这能给现实世界中存在的各种问题一个更清晰的概念。这 10 个例子只是你可能遇到的所有不同类型的场景和问题的一小部分。
你可能已经注意到,有些问题会比其他问题更容易解决。在少数情况下,有些问题会完全超出你的控制范围,这可能会导致沮丧,但要知道这是工作的正常部分。
我希望你读这篇文章的时候和我写这篇文章的时候一样开心!让我在评论中知道你不得不处理的任何其他坏数据的例子。
不确定接下来要读什么?我为你挑选了另一篇文章:
为什么数据科学工作可能不适合你
towardsdatascience.com](/4-reasons-why-you-shouldnt-be-a-data-scientist-e3cc6c1d50e)
特伦斯·申
- 如果你喜欢这个, 在 Medium 上关注我 获取更多
- 报名我的邮箱列表 这里 !
- 我们连线上LinkedIn
- 有兴趣合作?查看我的 网站 。
掌握 Python 中*args 和**kwargs 的 10 个例子
如何使用和不使用它们
安德鲁·西曼在 Unsplash 上拍摄的照片
函数是 Python 中的构建块。它们接受零个或多个参数并返回值。就参数如何传递给函数而言,Python 相当灵活。*args 和**kwargs 使处理参数变得更加容易和简洁。
重要的部分是“*”和“**”。你可以用任何单词来代替 args 和 kwargs,但是通常的做法是用 args 和 kwargs。因此,没有必要进行不必要的冒险。
在这篇文章中,我们将讨论 10 个例子,我认为这些例子将使*args 和**kwargs 的概念变得非常清楚。
示例 1
考虑下面这个对两个数字求和的函数。
def addition(a, b):
return a + bprint(addition(3,4))
7
这个函数只对两个数求和。如果我们想要一个三四个数相加的函数呢?我们甚至不想限制传递给函数的参数数量。
在这种情况下,我们可以使用*args 作为参数。
*args 允许函数接受任意数量的位置参数。
def addition(*args):
result = 0
for i in args:
result += i
return result
传递给加法函数的参数存储在一个元组中。因此,我们可以迭代 args 变量。
print(addition())
0print(addition(1,4))
5print(addition(1,7,3))
11
示例 2
在第二个例子之前,最好解释一下位置论元和关键字论元的区别。
- 位置参数仅由名称声明。
- 关键字参数由名称和默认值声明。
调用函数时,必须给出位置参数的值。否则,我们会得到一个错误。
如果我们没有为关键字参数指定值,它将采用默认值。
def addition(a, b=2): #a is positional, b is keyword argument
return a + bprint(addition(1))
3def addition(a, b): #a and b are positional arguments
return a + bprint(addition(1))
TypeError: addition() missing 1 required positional argument: 'b'
我们现在可以做第二个例子。可以同时使用*args 和命名变量。下面的函数相应地打印传递的参数。
def arg_printer(a, b, *args):
print(f'a is {a}')
print(f'b is {b}')
print(f'args are {args}')arg_printer(3, 4, 5, 8, 3)
a is 3
b is 4
args are (5, 8, 3)
前两个值给 a 和 b,其余的值存储在 args 元组中。
示例 3
Python 希望我们把关键字参数放在位置参数之后。在调用函数时,我们需要记住这一点。
考虑下面的例子:
arg_printer(a=4, 2, 4, 5)SyntaxError: positional argument follows keyword argument
如果我们给位置参数赋值,它就变成了关键字参数。因为它后面是位置参数,所以我们得到一个语法错误。
实例 4
在下面的函数中,选项是一个关键字参数(它有一个默认值)。
def addition(a, b, *args, option=True):
result = 0
if option:
for i in args:
result += i
return a + b + result
else:
return result
如果选项为真,此函数执行加法运算。由于默认值为 True,除非 option parameter 声明为 False,否则该函数将返回参数的总和。
print(addition(1,4,5,6,7))
23print(addition(1,4,5,6,7, option=False))
0
实例 5
**kwargs 收集所有没有明确定义的关键字参数。因此,除了关键字参数之外,它的操作与*args 相同。
**kwargs 允许函数接受任意数量的关键字参数。
默认情况下,kwargs 是一个空字典。每个未定义的关键字参数都作为键值对存储在kwargs 字典中。
def arg_printer(a, b, option=True, **kwargs):
print(a, b)
print(option)
print(kwargs)arg_printer(3, 4, param1=5, param2=6)
3 4
True
{'param1': 5, 'param2': 6}
实例 6
我们可以在函数中同时使用args 和**kwargs,但是args 必须放在**kwargs 之前。
def arg_printer(a, b, *args, option=True, **kwargs):
print(a, b)
print(args)
print(option)
print(kwargs)arg_printer(1, 4, 6, 5, param1=5, param2=6)
1 4
(6, 5)
True
{'param1': 5, 'param2': 6}
例 7
我们可以使用*args 和**kwargs 打包和解包变量。
def arg_printer(*args):
print(args)
如果我们将一个列表传递给上面的函数,它将作为一个单独的元素存储在 args tuple 中。
lst = [1,4,5]arg_printer(lst)
([1, 4, 5],)
如果我们在 lst 前加一个星号,那么列表中的值会被解包,单独存储在 args tuple 中。
lst = [1,4,5]arg_printer(*lst)
(1, 4, 5)
实施例 8
我们可以将多个 iterables 与单个元素一起解包。所有值都将存储在 args 元组中。
lst = [1,4,5]
tpl = ('a','b',4)arg_printer(*lst, *tpl, 5, 6)
(1, 4, 5, 'a', 'b', 4, 5, 6)
示例 9
我们也可以用关键字参数进行打包和解包。
def arg_printer(**kwargs):
print(kwargs)
但是作为关键字参数传递的 iterable 必须是一个映射,比如字典。
dct = {'param1':5, 'param2':8}arg_printer(**dct)
{'param1': 5, 'param2': 8}
实例 10
如果我们还将额外的关键字参数与字典一起传递,它们将被合并并存储在 kwargs 字典中。
dct = {'param1':5, 'param2':8}
arg_printer(param3=9, **dct){'param3': 9, 'param1': 5, 'param2': 8}
结论
总结一下我们所讲的内容:
- 函数中有两种类型的参数,即位置参数(仅由名称声明)和关键字参数(由名称和默认值声明)。
- 调用函数时,必须给出位置参数的值。关键字参数是可选的(如果没有指定,则采用默认值)。
- *args 收集未显式定义的位置参数,并将它们存储在元组中
-
- 除了关键字参数,kwargs 与args 的作用相同。它们存储在字典中,因为关键字参数存储为名称-值对。
- Python 不允许位置参数跟在关键字参数后面。因此,我们首先声明位置参数,然后声明关键字参数。
感谢您的阅读。如果您有任何反馈,请告诉我。
参考
https://calmcode.io/args-kwargs/introduction.html
掌握 Python 元组的 10 个例子
综合实践指南
Javier Allegue Barros 在 Unsplash 上拍摄的照片
数据结构是任何编程语言的关键部分。为了创建健壮且性能良好的产品,人们必须非常了解数据结构。
在这篇文章中,我们将研究 Python 编程语言的一个重要数据结构,那就是元组。
元组是由逗号分隔并包含在括号中的值的集合。与列表不同,元组是不可变的。不变性可以被认为是元组的识别特征。
我将举例说明元组的特征和对它们的操作。
1.创建元组
元组由括号中的值组成,用逗号分隔。
a = (3, 4)print(type(a))
<class 'tuple'>
元组可以存储不同数据类型的值和重复值。
a = (3, 3, 'x', [1,2])print(a)
(3, 3, 'x', [1, 2])print(type(a))
<class 'tuple'>
我们也可以在不使用括号的情况下创建元组。由逗号分隔的值序列将创建一个元组。
a = 3, 4, 5, 6print(type(a))
<class 'tuple'>
2.创建包含 0 或 1 个元素的元组
具有零元素的元组只是一个空元组,创建如下:
a = ()print(type(a))
<class 'tuple'>
但是,有一个小技巧可以创建一个只有一个元素的元组。你需要在元素后面加一个逗号。否则,您将创建一个值类型的变量。
a = (3)
print(type(a))
<class 'int'>b = ([1,2])
print(type(b))
<class 'list'>
让我们做同样的事情,但是在值后面使用逗号:
a = (3,)
print(type(a))
<class 'tuple'>b = ([1,2],)
print(type(b))
<class 'tuple'>
3.元组是可迭代的
就像列表一样,您可以迭代一个元组。
a = (1, 2, 3)
for i in a:
print(i**2)
1
4
9
4.索引和切片
索引和切片元组与列表相同。
a = (3, 5, 'x', 5)
print(f'The first element of tuple a is {a[0]}')
print(f'The last element of tuple a is {a[-1]}')The first element of tuple a is 3
The last element of tuple a is 5
和切片:
a = (1, 2, 5, 6, 7)print(a[-2:])
(6, 7)print(a[:3])
(1, 2, 5)
5.元组是不可变的,但是可以有可变的元素
不变性可能是元组最具识别性的特征。我们不能给元组中的单个项赋值。
a = (3, 5, 'x', 5)
a[0] = 7 #error
然而,元组可以包含可变元素,比如列表。
a = ([1,2], ['x', 'y'])a[0][0] = 99
a[1][0] = 't'print(a)
([99, 2], ['t', 'y'])
6.排序与已排序
因为元组是不可变的,所以我们不能对它们进行排序:
a = (3, 0, 2)a.sort() #error
'tuple' object has no attribute 'sort'
但是,排序函数可以将元组作为参数,并返回元组中值的排序列表。请注意,它不返回排序的元组。返回变量的类型是 list。
a = (3, 5, 8, 2)
b = sorted(a)print(b)
[2, 3, 5, 8]print(type(b))
<class 'list'>
创建于 pythontutor (图片由作者提供)
7.元组的长度
len 函数可以用来获得一个元组的长度。
a = (3, 0, 2)
len(a)
3
8.计数和索引方法
元组有计数和索引方法。count 方法返回一个值在元组中出现的次数。
a = (1, 'x', 1, 1, 'x')print(a.count('x'))
2print(a.count(1))
3
index 方法返回元组中某个值的索引。
a = (1, 'x', 3, 5, 'x')print(a.index('x'))
1print(a.index(1))
0
注意:如果一个值在一个元组中多次出现,index 方法返回第一次出现的索引。
9.将元组相加
“+”运算符可用于将元组相加。
a = (1, 2)
b = ('x', 'y')
c = a + bprint(c)
(1, 2, 'x', 'y')
10.返回多个值的函数
元组最常见的一个用例是使用返回多个值的函数。下面的函数采用一个数组,并返回数组中项目的总数和计数。
def count_sum(arr):
count = len(arr)
sum = arr.sum()
return count, sum
这个函数返回的是一个包含两项的元组:
import numpy as np
arr = np.random.randint(10, size=8)a = count_sum(arr)print(a)
(8, 39)print(type(a))
<class 'tuple'>
奖金
元组和列表都是值的集合。最显著的区别是不变性。
由于不变性,复制元组和列表是不同的。我们在复制列表时需要更加小心,因为它们是可变的。
我们有三种方法复制一个列表并赋给一个新的变量:
x = [1, 2, 3]y = x
z = x[:]
t = x.copy()
列表 y、z 和 t 包含与 x 相同的值。然而,y 指向 x 的值,而 z 和 t 是完全不同的列表。
创建于 pythontutor (图片由作者提供)
因此,x 的任何变化都会引起 y 的变化。
x.append(4)print(y)
[1, 2, 3, 4]print(t)
[1, 2, 3]
复制列表时,我们需要非常小心。然而,我们不应该对元组有同样的关注,因为它们是不可变的。
当你复制一个元组并把它赋给一个新变量时,它们都指向内存中相同的值。
a = (1, 2, 3)b = a
c = a[:]
创建于 pythontutor (图片由作者提供)
感谢您的阅读。如果您有任何反馈,请告诉我。
10 个优秀的 GitHub 库,适合每一个 Java 开发者
面向 Java 开发人员的基本 GitHub 库的精选列表
ava 是无可争议的企业软件开发之王,也是最受欢迎的编程语言之一。它最近庆祝了自己的 25 岁生日,在未来几年里,它仍将是领先的编程语言之一。
GitHub 拥有超过 1 亿个知识库,就像软件开发中的“亚历山大图书馆**”。GitHub 包含框架、库、教程、书籍,甚至编程语言。**
如果你是一名 Java 开发人员,你想提高你的 Java 技能,那么 GitHub 对你来说就像一座金矿。但是从 GitHub 中找到合适的库就像大海捞针。
通过阅读本文,您将了解到 10 个优秀的 Java GitHub 库,分别是:
- 教程
- 学习材料
- 软件设计技能
- 演示应用
请注意,我没有列出流行的 Java 框架,也没有列出有用的 Java 库。
1.Java 设计模式
来源:GitHub
软件设计模式是软件工程师解决软件设计中反复出现的问题的可重用的通用解决方案。它还提供了一个通用的词汇表来讨论软件工程师和架构师之间的常见问题。设计模式可以通过使用久经考验的开发范例来提高代码质量和编码速度。学习设计模式的最好方法是看它们的实际应用,例如代码示例。
这个优秀的 GitHub 存储库拥有各种设计模式的 Java 实现:从最常见和最古老的设计模式(迭代器、单例)到最现代的设计模式(聚合器微服务、无服务器)。这个 GitHub 库不仅会提高你的编码技能,还会让你成为一个更好、更高效的开发者。
如果你是一名 Java 开发人员,从职业生涯开始到退休,你都需要这个 GitHub 库。
链接:
设计模式是程序员可以用来解决设计和开发时常见问题的最佳形式化实践
github.com](https://github.com/iluwatar/java-design-patterns)
2.面谈
来源:GitHub
给一份编程工作面试是具有挑战性的。许多人只是在准备不充分的情况下去面试,然后责怪自己运气不好,没能得到这份工作。为面试做好充分的准备将会大大增加你获得理想工作的机会。这个 GitHub 知识库包含了你准备面试所需的一切:YouTube 视频、文章、现场编码实践、数据结构、算法、面试书籍、视频讲座。访谈还包含了针对 Java 中常见编码问题的 Leetcode。
这是另一个令人印象深刻的 GitHub 库,不仅对 Java 开发人员如此,对所有开发人员也是如此。在你的职业生涯中,你可能需要访问这个 GitHub 网站。
链接:
得到这份工作你需要知道的一切。通过在…上创建帐户,为 kdn 251/访谈的发展做出贡献
github.com](https://github.com/kdn251/interviews)
3.算法
来源:GitHub
如果你是一名软件工程师,那么算法就是你日常生活的面包和黄油。使用正确的算法可以提高软件的性能。通常,为给定的约束(CPU 复杂性、内存消耗)选择正确算法的能力表明了软件工程师的素质。难怪算法在面试过程中被大量使用:无论是谷歌、微软这样的科技巨头公司,还是一家初创公司。
如果您是初级或中级 Java 开发人员,那么您会经常需要这个 GitHub 存储库。如果你是一个有多年经验的 Java 开发人员,你仍然会发现这个 GitHub 库很有用。
链接:
注意:为这个 repo 创建了一个开发分支,我们试图将现有项目迁移到一个 Java 项目…
github.com](https://github.com/TheAlgorithms/Java)
4.真实世界
来源:GitHub
如果您正在用 Java 开发现代的 Fullstack 应用程序,那么您很有可能在前端使用最新的 JavaScript SPA,在后端使用 Java。 Realworld 提供开发一个应用程序“ Conduit ”(一个中型克隆),使用几乎所有的前端和后端组合。开发者称它为“所有演示应用之母,”,因为它允许开发真实世界的应用。考虑到它所支持的前端/后端技术的庞大目录, Realworld 当然符合这个口号。
目前支持所有主流编程语言中所有可能的 JavaScript 前端框架(如 React、Angular、Vue、Svelte、AngularJS、Ember.js、Aurelia、Vanilla JS……)和所有可能的后端框架。在 Java 中,支持 Quarkus 和 Vert.x。
Realworld 也是你整个职业生涯都需要的 GitHub 资源库,尤其是如果你从事全栈开发的话。
链接:
虽然大多数“待办事项”演示提供了一个框架功能的极好的粗略浏览,但它们通常不会传达…
github.com](https://github.com/gothinkster/realworld)
5.牛逼的 Java
来源:GitHub
经常会发生这样的情况,我们需要找一些和 Java 相关的东西,花上几个小时在 Google 上找。幸运的是,对于 Java 开发人员来说,这个 GitHub 库可以解决这种情况。牛逼 Java 包含了几乎所有和 Java 有关的东西,就像一本字典。无论你是在寻找一个字节码操作器还是机器学习库或实用程序库,Awesome Java 都有一个链接。
由非常活跃的 ca 社区维护。300 个贡献者,这个库定期更新。
链接:
Java 编程语言的优秀框架、库和软件的精选列表。— akullpp/awesome-java
github.com](https://github.com/akullpp/awesome-java)
6.贝尔东教程
来源:GitHub
如果你是一名 Java 开发人员,你可能会遇到由 Baeldung 提供的各种教程和例子。目前,它是 Java、Web 和 Spring 开发教程的头号在线资源。Baeldung 与其他类似资料的不同之处在于,它涵盖了 Java/Spring 开发中从基础到高级的主题。除了教程,它还包含课程,指南,电子书等。Baeldung 的另一个重要特性是所有的例子和教程都是通过运行 GitHub 代码来支持的。
这个 GitHub 存储库包含 Java 和 Spring 开发领域的小型集中教程的集合,包括到教程文章的链接,其中对代码进行了更详细的解释。这也是 Spring 开发人员和普通 Java 开发人员必备的存储库。
链接:
更新:“Learn Spring Security OAuth”的价格将在 12 月 11 日永久更改,同时…
github.com](https://github.com/eugenp/tutorials)
7.吉普斯特
来源:GitHub
如果你在企业 Java 领域工作,那么你可能听说过 JHipster 。JHipster 提供了一个开发平台,用于生成、开发和部署基于生产级单片/微服务的 Web 应用程序。在前端,它提供前 3 名的 SPA 框架(Angular、React、Vue),在后端,它提供 Spring Boot。它还支持所有主要的数据存储(Oracle、PostgreSQL、MySQL、MS-SQL、MongoDB、Cassandra、ELK、Kafka)。JHipster 还提供了非常高级的安全特性,比如 OAuth2+OpenID Connect。它还提供了许多扩展,这将帮助您开发一个基于 Spring Boot 的企业应用程序,几乎适用于任何环境,包括云。
这个项目非常强大和成熟,您可以用它开发您的 POC 甚至生产级应用程序。
链接:
你好,Java 潮人!完整的文件和信息可在我们的网站 https://www.jhipster.tech/…
github.com](https://github.com/jhipster/generator-jhipster)
8.RxJava Android 示例
来源:GitHub
近年来,反应式编程通过提供一个很好的抽象来处理异步和基于事件的编程,变得越来越流行。 RxJava 是react vex的 Java 实现,它通过可观察对象提供反应式编程。学习 Java 中的反应式编程有点挑战性,因为默认情况下,Java 提供了同步编程方式。在这个 GitHub 项目中,给出了 RxJava 的真实例子。尽管这些例子是针对 Android 开发给出的,但是 Java 开发人员也可以很容易地将它们应用于非 Android 开发。
链接:
[## kaushikgopal/rx Java-Android-Samples
这是一个知识库,其中包含了在 Android 上使用 RxJava 的真实有用的例子。它通常会在一个常数…
github.com](https://github.com/kaushikgopal/RxJava-Android-Samples)
9.Java8 教程
来源:GitHub
Java8 是发布的最具颠覆性和创新性的 Java 之一,因为它在 Java 中引入了“函数式编程”。有了 Lambda 和 Streaming 这样的概念,Java 最终进入了函数式编程领域,同时保持了其传奇的整体向后兼容性。
不幸的是,并不是所有的 Java 开发人员都充分利用了 Java 的新功能。我见过很多有经验的 Java 开发人员,他们还在用老派的方式开发 Java 程序。原因之一是,与传统的面向对象编程相比,函数式编程是一种范式转变,开发人员希望保持在他们的舒适区。
这个 GitHub 库包含了许多函数式编程概念的小而有用的例子(Lambda、Streams、函数接口、并行流等)。)写得很棒,可读性很强。如果您是 Java 函数式编程的新手,这个库将会给你很大的帮助。
链接:
你也应该看看我的 Java 11 教程(包括 Java 9、10 和 11 的新语言和 API 特性)。欢迎来到…
github.com](https://github.com/winterbe/java8-tutorial)
10.破解 Java 中的编码面试
来源:GitHub
无论你应聘的是世界 500 强公司的编程工作,还是创业公司,你都很可能会经历一次编码面试。广受好评的书《破解编码面试**》将帮助你准备富有挑战性的编码面试。这本书涵盖了所有类型和种类的编码挑战,包括算法复杂性、数学和逻辑难题、动态编程、排序和搜索、多线程等等。**
使这本书与众不同的是,它还简单而优雅地解释了所有的例子。这个 GitHub 库包含了本书第六版的所有 Java 示例。即使你买不到原版书,浏览一下这个知识库对你的下一次面试也会很方便。
链接:
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/careercup/CtCI-6th-Edition/tree/master/Java)
类似文章:
[## 每个开发人员都应该遵循的 20 个惊人的 GitHub 库
一个 GitHub 库集合,用于提高您的开发技能和促进您的职业发展
towardsdatascience.com](/20-amazing-github-repositories-every-developer-should-follow-d8ce4c728351) [## 每个 Java 开发人员都应该知道的 10 大库
Java 和 JVM 软件开发中基本 Java 库的精选列表
towardsdatascience.com](/top-10-libraries-every-java-developer-should-know-37dd136dff54) [## 您应该尝试的 25 个鲜为人知的 Java 库
对 Java 和 JVM 软件开发有很大帮助的库
towardsdatascience.com](/25-lesser-known-java-libraries-you-should-try-ff8abd354a94)
10 多种免费资源,用于下载机器学习数据集
为您的机器学习和人工智能项目搜索和下载数据集的在线资源列表
我们可以这样说:这篇文章是数据集的集合[图片来自维基媒体的莫恩图书馆]。]
如果您正在从事机器学习(ML)项目,您可能知道为您的模型找到正确的数据集有多难。你可能致力于你的问题,把它定义为一个 ML 问题,但是现在没有数据来训练你的模型。也许你确实有一些数据,但不足以养活那些渴求数据的神经网络。或者也许你有很多数据,但是没有正确标记。谁说 ML 容易?
我去过那里很多次,一路上我发现了很多在线资源,这些资源帮助我找到了这些珍贵的数据。为了让你的工作更容易,我列出了这个免费的在线资源列表,你可以用它来获取你的 ML 项目的数据,任何你喜欢的主题。希望你觉得有用!
如果你正在寻找强化学习环境,我建议你查看一下我的文章,里面有一个列表。
谷歌数据集搜索
你可能已经知道了。它于 2018 年首次发布为测试版,最终在今年 1 月正式发布。没有它我们怎么活了这么久?我不确定,但我知道现在,当你寻找一个数据集时,它是第一个要去的地方。
谷歌数据集搜索首页。
这个搜索引擎实际上搜索了我下面列出的许多其他资源,并把你引导到数据集的下载页面。一旦你输入了你的关键词,你也可以使用许多选项来过滤你的搜索:最后更新,下载格式,使用权,主题和免费(或不免费)。这是非常有用的,是任何人在 ML,AI 或数据科学的必备。
链接:https://datasetsearch.research.google.com
卡格尔
Kaggle 是一个数据科学和 ML 实践者的在线社区(有趣的事实:它是 Google 的子公司。)Kaggle 非常适合学习和提高你的 ML 技能,事实上,我进入 ML 的第一步就是在 Kaggle 上。你可以找到几个比赛,在这些比赛中你可以比较和分享你的 ML 算法,如果你取得了最好的成绩,你甚至可以赢得金钱。
但除此之外,Kaggle 还有自己的数据集页面,你可以用它来搜索 Kaggle 上目前托管的超过 40,000 个数据集。您还可以根据许可证、数据集大小和文件类型过滤您的搜索。尽管许多数据集质量非常高,但要注意的是,大多数数据集是由像你我这样的人提供的,很多时候数据的质量可能不是最好的。
链接:【https://www.kaggle.com/datasets
令人惊叹的公共数据集
由 Github 贡献者维护的大量免费数据集。该列表目前相当大,涉及许多不同的主题。正如你所料,搜索不像这个网站的其他选项那么容易,因为它只是一个。md 文件,其中包含数据集及其链接的列表,但它包含每个数据集的总体状态信息。
这是一个伟大的贡献,它拥有网络社区的温暖,所以至少对我来说,这增加了一些特别的东西。你也可以加入他们的休闲频道,如果你想为这个不断增长的列表做贡献的话。
链接:https://github.com/awesomedata/awesome-public-datasets
全球开放数据倡议
世界上有几个国家已经免费发布了各种主题的可用数据,如人口统计、领土、预算、法律、环境等。这些是非常宝贵的资源,我们必须感谢开放数据倡议。
全球开放数据指数地图视图【来自官网。]
在全球开放数据指数中,你可以找到一个国家及其开放数据指数的列表,该指数根据它们发布的数据源数量以及更新和管理的程度对它们进行排名。你也可以找到官方网站的链接,在那里你可以找到下载的数据资源。
你还可以在欧盟最近推出的开放数据门户中找到几个由欧盟发布的数据集。
嗯,这是谷歌在这个列表中的第三个,我保证这是最后一个。另一种找到数据集的方法是在 Google scholar 上搜索发表这些数据集的论文。这不是那么直接,事实上,这是一个有点老的学校,但它可以取得很大的成果。只需输入你喜欢的数据,然后输入“数据集”,幸运的话,一些研究人员可能已经发布了你可以使用的数据集。
你还可以在欧盟最近推出的 开放数据门户 中找到几个由欧盟发布的数据集。
谷歌学术
嗯,这是谷歌在这个列表中的第三个,我保证这是最后一个。另一种找到数据集的方法是在 Google scholar 上搜索发表这些数据集的论文。这不是那么直接,事实上,这是一个有点老的学校,但它可以取得很大的成果。只需输入你喜欢的数据,然后输入“数据集”,幸运的话,一些研究人员可能已经发布了你可以使用的数据集。
尽管不像前两个选项那么容易,但你能找到的数据集的质量通常非常好,因为论文通常由同行评审,并且必须达到一定的质量标准才能发表。此外,像这样发布的数据集几乎总是可以免费获得,并且可以以任何方式重用,只要你引用了正确的出版物。
AWS 开放数据
AWS 上开放数据注册中心的主页。
亚马逊已经推出了自己的公开数据集存储库,你可以从这里进行搜索。亚马逊将这些数据集免费存储在亚马逊网络服务中,供所有公众使用,这使我认为这里的数据集列表将随着时间的推移继续增长。在撰写本文时,这个存储库中有 157 个数据集,因此没有太多选项可供选择。然而,发布的数据集质量非常高,因为亚马逊在发布之前会对其进行审查。
加州大学欧文分校机器学习知识库
加州大学欧文分校也拥有大约 500 个面向 ML 从业者的数据集。你可以找到各种各样的数据集:从最基本和最流行的如虹膜,到更复杂和新的如用于肩植入 X 射线制造商分类。
尽管数据集是由用户在其网站上捐赠的,但数据的质量总体来说似乎相当不错。我猜有一些来自 UCI 的人提供的数据集的“策展”,所以质量应该普遍良好。你可以在这里看到数据集的完整列表,并通过名称、默认任务和其他属性搜索它们。
链接:【https://archive.ics.uci.edu/ml/index.php
微软研究院开放数据
微软也加入了开放数据的行列,现在正在为研究人员和 ML 从业者共享几个有趣的数据集。他们目前托管着大约 100 个不同主题的数据集,如生物学、计算机科学、信息科学、教育等。
数据的质量非常好,因为所有的数据集在发布到这里之前都是由微软策划的。他们可能会继续发布更多的数据集,所以这个知识库有很大的潜力。
学术洪流
学术洪流是一个很不错的网站,几周前才知道。它拥有一个非常大的数据集目录,用于研究目的,但你也可以用它们来学习和尝试。
您可以按名称或描述搜索数据集,并按大小排序。每个数据集都有一个很长的描述页面,您还可以在其中找到注释、许可条款以及在使用数据集时应该在出版物中使用的引用。顾名思义,你需要一个 BitTorrent 客户端来下载数据集,所以这有点复杂。
链接:http://academictorrents.com/browse.php
五三八
FiveThirtyEight 是一个专注于民意调查分析、政治、经济和体育博客的网站。我是通过查看他们的民意调查了解到这一点的,大部分是关于政治的,也用简单的情节进行了总结。但是 FiveThirtyEight 有一个不太为人知的功能:你可以从它的民意调查中下载数据。
数据的质量并不总是最好的,许多民意调查只有摘要,通常对 ML 来说是不够的。然而,你可以找到一些非常有趣的民意调查,你可以结合其他来源,我认为这是值得一提的。
链接:https://fivethirtyeight.com
股票数据:羊驼
好的,这不是一个真正的数据集资源,但是它给了你从股票市场下载历史数据和免费实时数据的可能性。多酷啊。
羊驼 是一家公司,其使命是为所有人提供使用算法进行交易的可能性。这意味着你不仅可以实时访问股票市场的数据,还可以用真钱或在模拟环境中进行交易。如果你想下载任何交易或投资 ML 项目的历史数据,你可以按照我上一篇文章中的步骤进行:
[## 如何在 Python 上访问股票市场数据进行机器学习
如果您想使用 ML 进行股票交易,您需要创建一个股票市场数据的数据集。了解如何…
towardsdatascience.com](/how-to-access-stocks-market-data-for-machine-learning-on-python-c69db51e7a0d)
包裹
老规矩,感谢阅读!我会试着用我发现的新资源来更新这个列表。如果你有任何其他的建议,请让我在回复中知道,这样我就可以把它添加到这个列表中。