
正文
python函数包装器 python封装包
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Python 数据处理(三十九)—— groupby(过滤)
filter 方法可以返回原始对象的子集.
例如,我们想提取分组内的和大于 3 的所有分组的元素
filter 的参数必须是一个函数,函数参数是每个分组,并且返回 True 或 False
例如,提取元素个数大于 2 的分组
另外,我们也可以过滤掉不满足条件的组,而是返回一个类似索引对象。在这个对象中,没有通过的分组的元素被 NaN 填充
对于具有多列的 DataFrames ,过滤器应明确指定一列作为过滤条件
在进行聚合或转换时,你可能想对每个分组调用一个实例方法,例如
但是,如果需要传递额外的参数时,它会变得很冗长。我们可以直接使用分派到组对象上的方法
实际上这生成了一个函数包装器,在调用时,它接受所有传递的参数,并在每个分组上进行调用。
然后,这个结果可以和 agg 和 transform 结合在一起使用
在上面的例子中,我们按照年份分组,然后对每个分组中使用 fillna 补缺失值
nlargest 和 nsmallest 可以在 Series 类型的 groupby 上使用
对分组数据的某些操作可能并不适合聚合或转换。或者说,你可能只是想让 GroupBy 来推断如何合并结果
我们可以使用 apply 函数,例如
改变返回结果的维度
在 Series 上使用 apply 类似
对于之前的示例数据
假设,我们想按 A 分组并计算组内的标准差,但是 B 列的数据我们并不关心。
如果我们的函数不能应用于某些列,则会隐式的删除这些列,所以
直接计算标准差并不会报错
可以使用分类变量进行分组,分组的顺序会按照分类变量的顺序
可以使用 pd.Grouper 控制分组,对于如下数据
可以按照一定的频率对特定列进行分组,就像重抽样一样
可以分别对列或索引进行分组
类似于 Series 和 DataFrame ,可以使用 head 和 tail 获取分组前后几行
在 Series 或 DataFrame 中可以使用 nth() 来获取第 n 个元素,也可以用于获取每个分组的某一行
如果你要选择非空项,可以使用关键字参数 dropna ,如果是 DataFrame ,需要指定为 any 或 all (类似于 DataFrame.dropna(how='any|all') )
与其他方法一样,使用 as_index=False 分组名将不会作为索引
你也可以传入一个整数列表,一次性选取多行
使用 cumcount 方法,可以查看每行在分组中出现的顺序
可以使用 ngroup() 查看分组的顺序,该顺序与 cumcount 的顺序相反。
注意 :该顺序与迭代时的分组顺序一样,并不是第一次观测到的顺序
相关问答
Q1: 推荐 8 个炫酷的 Python 装饰器
1、 lru_cache
这个装饰器来自functools模块。该模块包含在标准库中,非常易于使用。它还包含比这个装饰器更酷的功能,但这个装饰器是非常受人喜欢的。此装饰器可用于使用缓存加速函数的连续运行。当然,这应该在使用时记住一些关于缓存的注意事项,但在通用使用情况下,大多数时候这个装饰器都是值得使用的。
2、JIT
JIT是即时编译的缩写。通常每当我们在Python中运行一些代码时,发生的第一件事就是编译。这种编译会产生一些开销,因为类型被分配了内存,并存储为未分配但已命名的别名,使用即时编译,我们在执行时才进行编译。
在很多方面,我们可以将其视为类似于并行计算的东西,其中Python解释器同时处理两件事以节省时间。Numba JTI编译器因将这一概念提到Python中而闻名,可以非常轻松地调用此装饰器,并立即提高代码的性能。Numba包提供了JIT装饰器,它使运行更密集的软件变得更加容易,而不必进入C。
3、do_twice
do_twice装饰器的功能与它的名字差不多。此装饰器可用于通过一次调用运行两次函数,对调试特别有用。它可以用于测量两个不同迭代的功能。
4、count_calls
count_calls装饰器可用于提供有关函数在软件中使用多少次的信息。与do_twice一样,对调试也特别有用。
5、dataclass
为了节省编写类的时间,推荐使用dataclass装饰器。这个装饰器可用于快速编写类中常见的标准方法,这些方法通常会在我们编写的类中找到。
6、singleton
singleton是一个单例装饰器。通常,单例装饰器是由用户自己编写的,实际上并不是导入的。
7、use_unit
在科学计算中经常派上用场的一种装饰器是use_unit装饰器。此装饰器可用于更改返回结果的表示单位。这对于那些不想在数据中添加度量单位但仍希望人们知道这些单位是什么的人很有用。这个装饰器可不是在任何模块中真正有用,但它是非常常见的,对科学应用程序非常有用。
Q2: Python语言下的机器学习库
Python语言下的机器学习库
Python是最好的编程语言之一,在科学计算中用途广泛:计算机视觉、人工智能、数学、天文等。它同样适用于机器学习也是意料之中的事。当然,它也有些缺点;其中一个是工具和库过于分散。如果你是拥有unix思维(unix-minded)的人,你会觉得每个工具只做一件事并且把它做好是非常方便的。但是你也需要知道不同库和工具的优缺点,这样在构建系统时才能做出合理的决策。工具本身不能改善系统或产品,但是使用正确的工具,我们可以工作得更高效,生产率更高。因此了解正确的工具,对你的工作领域是非常重要的。
这篇文章的目的就是列举并描述Python可用的最有用的机器学习工具和库。这个列表中,我们不要求这些库是用Python写的,只要有Python接口就够了。我们在最后也有一小节关于深度学习(Deep Learning)的内容,因为它最近也吸引了相当多的关注。
我们的目的不是列出Python中所有机器学习库(搜索“机器学习”时Python包索引(PyPI)返回了139个结果),而是列出我们所知的有用并且维护良好的那些。另外,尽管有些模块可以用于多种机器学习任务,我们只列出主要焦点在机器学习的库。比如,虽然Scipy包含一些聚类算法,但是它的主焦点不是机器学习而是全面的科学计算工具集。因此我们排除了Scipy(尽管我们也使用它!)。
另一个需要提到的是,我们同样会根据与其他科学计算库的集成效果来评估这些库,因为机器学习(有监督的或者无监督的)也是数据处理系统的一部分。如果你使用的库与数据处理系统其他的库不相配,你就要花大量时间创建不同库之间的中间层。在工具集中有个很棒的库很重要,但这个库能与其他库良好集成也同样重要。
如果你擅长其他语言,但也想使用Python包,我们也简单地描述如何与Python进行集成来使用这篇文章列出的库。
Scikit-LearnScikit Learn是我们在CB Insights选用的机器学习工具。我们用它进行分类、特征选择、特征提取和聚集。我们最爱的一点是它拥有易用的一致性API,并提供了很多开箱可用的求值、诊断和交叉验证方法(是不是听起来很熟悉?Python也提供了“电池已备(译注:指开箱可用)”的方法)。锦上添花的是它底层使用Scipy数据结构,与Python中其余使用Scipy、Numpy、Pandas和Matplotlib进行科学计算的部分适应地很好。因此,如果你想可视化分类器的性能(比如,使用精确率与反馈率(precision-recall)图表,或者接收者操作特征(Receiver Operating Characteristics,ROC)曲线),Matplotlib可以帮助进行快速可视化。考虑到花在清理和构造数据的时间,使用这个库会非常方便,因为它可以紧密集成到其他科学计算包上。
另外,它还包含有限的自然语言处理特征提取能力,以及词袋(bag of words)、tfidf(Term Frequency Inverse Document Frequency算法)、预处理(停用词/stop-words,自定义预处理,分析器)。此外,如果你想快速对小数据集(toy dataset)进行不同基准测试的话,它自带的数据集模块提供了常见和有用的数据集。你还可以根据这些数据集创建自己的小数据集,这样在将模型应用到真实世界中之前,你可以按照自己的目的来检验模型是否符合期望。对参数最优化和参数调整,它也提供了网格搜索和随机搜索。如果没有强大的社区支持,或者维护得不好,这些特性都不可能实现。我们期盼它的第一个稳定发布版。
StatsmodelsStatsmodels是另一个聚焦在统计模型上的强大的库,主要用于预测性和探索性分析。如果你想拟合线性模型、进行统计分析,或者预测性建模,那么Statsmodels非常适合。它提供的统计测试相当全面,覆盖了大部分情况的验证任务。如果你是R或者S的用户,它也提供了某些统计模型的R语法。它的模型同时也接受Numpy数组和Pandas数据帧,让中间数据结构成为过去!
PyMCPyMC是做贝叶斯曲线的工具。它包含贝叶斯模型、统计分布和模型收敛的诊断工具,也包含一些层次模型。如果想进行贝叶斯分析,你应该看看。
ShogunShogun是个聚焦在支持向量机(Support Vector Machines, SVM)上的机器学习工具箱,用C++编写。它正处于积极开发和维护中,提供了Python接口,也是文档化最好的接口。但是,相对于Scikit-learn,我们发现它的API比较难用。而且,也没提供很多开箱可用的诊断和求值算法。但是,速度是个很大的优势。
GensimGensim被定义为“人们的主题建模工具(topic modeling for humans)”。它的主页上描述,其焦点是狄利克雷划分(Latent Dirichlet Allocation, LDA)及变体。不同于其他包,它支持自然语言处理,能将NLP和其他机器学习算法更容易组合在一起。如果你的领域在NLP,并想进行聚集和基本的分类,你可以看看。目前,它们引入了Google的基于递归神经网络(Recurrent Neural Network)的文本表示法word2vec。这个库只使用Python编写。
OrangeOrange是这篇文章列举的所有库中唯一带有图形用户界面(Graphical User Interface,GUI)的。对分类、聚集和特征选择方法而言,它是相当全面的,还有些交叉验证的方法。在某些方面比Scikit-learn还要好(分类方法、一些预处理能力),但与其他科学计算系统(Numpy, Scipy, Matplotlib, Pandas)的适配上比不上Scikit-learn。但是,包含GUI是个很重要的优势。你可以可视化交叉验证的结果、模型和特征选择方法(某些功能需要安装Graphviz)。对大多数算法,Orange都有自己的数据结构,所以你需要将数据包装成Orange兼容的数据结构,这使得其学习曲线更陡。
PyMVPAPyMVPA是另一个统计学习库,API上与Scikit-learn很像。包含交叉验证和诊断工具,但是没有Scikit-learn全面。
深度学习尽管深度学习是机器学习的一个子节,我们在这里创建单独一节的原因是,它最新吸引了Google和Facebook人才招聘部门的很多注意。
TheanoTheano是最成熟的深度学习库。它提供了不错的数据结构(张量,tensor)来表示神经网络的层,对线性代数来说很高效,与Numpy的数组类似。需要注意的是,它的API可能不是很直观,用户的学习曲线会很高。有很多基于Theano的库都在利用其数据结构。它同时支持开箱可用的GPU编程。
PyLearn2还有另外一个基于Theano的库,PyLearn2,它给Theano引入了模块化和可配置性,你可以通过不同的配置文件来创建神经网络,这样尝试不同的参数会更容易。可以说,如果分离神经网络的参数和属性到配置文件,它的模块化能力更强大。
DecafDecaf是最近由UC Berkeley发布的深度学习库,在Imagenet分类挑战中测试发现,其神经网络实现是很先进的(state of art)。
Nolearn如果你想在深度学习中也能使用优秀的Scikit-learn库API,封装了Decaf的Nolearn会让你能够更轻松地使用它。它是对Decaf的包装,与Scikit-learn兼容(大部分),使得Decaf更不可思议。
OverFeatOverFeat是最近猫vs.狗(kaggle挑战)的胜利者,它使用C++编写,也包含一个Python包装器(还有Matlab和Lua)。通过Torch库使用GPU,所以速度很快。也赢得了ImageNet分类的检测和本地化挑战。如果你的领域是计算机视觉,你可能需要看看。
HebelHebel是另一个带有GPU支持的神经网络库,开箱可用。你可以通过YAML文件(与Pylearn2类似)决定神经网络的属性,提供了将神级网络和代码友好分离的方式,可以快速地运行模型。由于开发不久,就深度和广度上说,文档很匮乏。就神经网络模型来说,也是有局限的,因为只支持一种神经网络模型(正向反馈,feed-forward)。但是,它是用纯Python编写,将会是很友好的库,因为包含很多实用函数,比如调度器和监视器,其他库中我们并没有发现这些功能。
NeurolabNeuroLab是另一个API友好(与Matlabapi类似)的神经网络库。与其他库不同,它包含递归神经网络(Recurrent Neural Network,RNN)实现的不同变体。如果你想使用RNN,这个库是同类API中最好的选择之一。
与其他语言集成你不了解Python但是很擅长其他语言?不要绝望!Python(还有其他)的一个强项就是它是一个完美的胶水语言,你可以使用自己常用的编程语言,通过Python来访问这些库。以下适合各种编程语言的包可以用于将其他语言与Python组合到一起:R - RPythonMatlab - matpythonJava - JythonLua - Lunatic PythonJulia - PyCall.jl
不活跃的库这些库超过一年没有发布任何更新,我们列出是因为你有可能会有用,但是这些库不太可能会进行BUG修复,特别是未来进行增强。MDPMlPyFFnetPyBrain如果我们遗漏了你最爱的Python机器学习包,通过评论让我们知道。我们很乐意将其添加到文章中。
Q3: Python进阶精华-编写装饰器为被包装的函数添加参数
注意:这种发方法并不是装饰器最常用的功能,但是在降低代码重复上可谓是首屈一指。比如:如果不使用装饰器,上述代码可能会很多:
当然,这里也有一个潜在的风险,就是当装饰器包裹的函数已经用了debug作为参数名,那么装饰器这里将会报错,所以要添加额外的一些判断来完善代码:
最后还剩下一部分比较难理解的地方,我将理解的注释在每行代码上方,这个问题就是,在打印被修饰函数的参数签名时,其实并不能正确显示参数签名,原因是因为被wrapper修饰过后的函数实际上应该使用的是wrapper的参数签名表,例如:
所以,接下来,完成最后最难的一步:
python函数包装器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python封装包、python函数包装器的信息别忘了在本站进行查找喔。







