PyOdps DataFrame来临,数据分析从未如此简单!

PyOdps正式发布DataFrame框架(此处应掌声经久不息),DTer的福音!有了它,就像卷福有了花生,比翼双飞,哦不,如虎添翼。

快过年了,大家一定没心情看长篇大论的分析文章。作为介绍PyOdps DataFrame的开篇文章,我只说说其用起来爽的地方。其余的部分,从使用、问题到实现原理,我会分文章细说。

如果不知道是DataFrame什么,它是存在于pandas和R里的数据结构,你可以把它当做是表结构。如果想快速浏览PyOdps DataFrame能做什么,可以看我们的快速开始文档

让我们开始吧。

强类型支持

DataFrame API在计算的过程中,从字段到类型都是确定的,因此,若取一个不存在的字段,会丢给你个大大的异常。

In [4]: from odps.df import DataFrame

In [5]: iris = DataFrame(o.get_table('pyodps_iris'))

In [6]: iris.dtypes
Out[6]:
odps.Schema {
  sepallength           float64
  sepalwidth            float64
  petallength           float64
  petalwidth            float64
  name                  string
}

In [7]: iris.field_not_exist
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-fc8de079a0de> in <module>()
----> 1 iris.field_not_exist

/Users/chine/Workspace/pyodps/odps/df/expr/expressions.pyc in __getattr__(self, attr)
    510                 return self[attr]
    511
--> 512             raise e
    513
    514     def output_type(self):

AttributeError: 'DataFrame' object has no attribute 'field_not_exist'

如果取存在的字段,自然是没问题啦。

In [11]: iris.sepalwidth.head(5)
|==========================================|   1 /  1  (100.00%)         0s
Out[11]:
   sepalwidth
0         3.5
1         3.0
2         3.2
3         3.1
4         3.6

有些方法,比如说取平均数,非数字肯定是不能调用的咯。

In [12]: iris['name'].mean()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-3f90cae4a19f> in <module>()
----> 1 iris['name'].mean()

/Users/chine/Workspace/pyodps/odps/df/expr/expressions.pyc in __getattribute__(self, attr)
    171                 if new_attr in self._get_attr('_args'):
    172                     return self._get_arg(new_attr)
--> 173             raise e
    174
    175     def _defunc(self, field):

AttributeError: 'Column' object has no attribute 'mean'

数字类型的字段则可以调用。

In [10]: iris.sepalwidth.mean()
|==========================================|   1 /  1  (100.00%)        27s
3.0540000000000007

操作数据如此简单

我们常常需要select一个表字段,但是只是不需要一个字段,却需要写一堆SQL。在DataFrame API里,调用exclude方法就行了。

In [13]: iris.exclude('name').head(5)
|==========================================|   1 /  1  (100.00%)         0s
Out[13]:
   sepallength  sepalwidth  petallength  petalwidth
0          5.1         3.5          1.4         0.2
1          4.9         3.0          1.4         0.2
2          4.7         3.2          1.3         0.2
3          4.6         3.1          1.5         0.2
4          5.0         3.6          1.4         0.2

使用DataFrame写出来的代码,天然有Python的特点,清晰易懂。某些快捷API,能使得操作更加简单。

比如我们要取name的个数从大到小前10的值分别是多少。

In [16]: iris.groupby('name').agg(count=iris.name.count()).sort('count', ascending=False)[:10]
|==========================================|   1 /  1  (100.00%)        37s
Out[16]:
              name  count
0   Iris-virginica     50
1  Iris-versicolor     50
2      Iris-setosa     50

直接使用value_counts来得更快。

In [17]: iris['name'].value_counts()[:10]
|==========================================|   1 /  1  (100.00%)        34s
Out[17]:
              name  count
0   Iris-virginica     50
1  Iris-versicolor     50
2      Iris-setosa     50

很多时候,写一个SQL,我们需要检查中间结果的执行,就显得很麻烦,我们常常需要选取中间的SQL来执行,在DataFrame的世界,中间结果赋值一个变量就行了,这都不是事儿。

计算的过程和结果展示

在DataFrame的执行过程中,我们在终端里和IPython notebook里,都会有进度条显示任务的完成情况。结果的输出也会有更好的格式化展现,在IPython notebook里会以HTML表格的形式展现。

绘图集成

DataFrame的计算结果能直接调用plot方法来制作图表,不过绘图需要安装pandasmatplotlib

In [21]: iris.plot()
|==========================================|   1 /  1  (100.00%)         0s
Out[21]: <matplotlib.axes._subplots.AxesSubplot at 0x10feab610>

导出数据再用excel画图,这事儿……咳咳,未来我们还会提供更好的可视化展现,比如提供交互式的图表。

自定义函数和Lambda表达式

DataFrame支持map方法,想对一个字段调用自定义函数非常方便。

In [30]: GLOBAL_VAR = 3.2

In [31]: def myfunc(x):
    if x < GLOBAL_VAR:
        return 0
    else:
        return 1

In [32]: iris['sepalwidth', iris.sepalwidth.map(myfunc).rename('sepalwidth2')].head(5)
|==========================================|   1 /  1  (100.00%)        18s
Out[32]:
   sepalwidth  sepalwidth2
0         3.5            1
1         3.0            0
2         3.2            1
3         3.1            0
4         3.6            1

可惜apply和聚合的自定义函数,暂时还不支持,期待吧!

延迟执行

DataFrame API的所有操作并不会立即执行,除非用户显式调用execute方法或者一些立即执行的方法。在交互式界面下,打印或者repr对象的时候,内部也会调用execute方法,方便用户使用。

执行优化

DataFrame框架在执行前会对整个查询进行优化,比如连续的projection合并。当用户查看原始表(或者选取某个分区)时,会使用tunnel来获取结果。

PyOdps DataFrame的下一步发展

好了,说了这么多,聊一聊我们DataFrame接下来要做的事情,首先,我们会实现多计算后端,包括pandas,当数据量比较小的时候,我们可以使用本地计算,而不需要等待ODPS的调度;其次,DataFrame框架和我们的机器学习部分会有更多的集成,从数据分析,到算法,一气呵成,大伙看到文章的时候,相关功能应该已经可用了。

PyOdps非常年轻,才短短几个月的时间。我们的整个项目,在GitHub上,是开源的。我个人非常希望大家能参与到开源的建设中来,能提个建议也是极好的。所以,我会写文章详述我们PyOdps的实现原理,希望大家一起把ODPS建设得更好。

github:https://github.com/aliyun/aliyun-odps-python-sdk
文档:http://pyodps.readthedocs.org/zh_CN/latest/

时间: 2024-11-02 14:36:37

PyOdps DataFrame来临,数据分析从未如此简单!的相关文章

什么是PyODPS DataFrame

最近已经写了几篇有关PyODPS DataFrame的文章,但是还是有些同学不明白PyODPS DataFrame是什么,以及能做什么事情.这篇文章,我会做出解释,以及简单介绍一下实现的原理. PyODPS DataFrame 首先什么是DataFrame,我在以前的文章也解释过,我们可以把它认为是二维表结构.在单机上,数据科学家一般会使用R或者Python库pandas来做数据分析,DataFrame是它们上广泛使用的数据结构.在DataFrame上,我们可以做过滤.列筛选.join.unio

PyODPS DataFrame:统一的数据查询语言

前几天,PyODPS发布了0.7版本,这篇文章给大家介绍下PyODPS新版本带来的重要特性. 之前也有若干篇文章介绍过了,我们PyODPS DataFrame是延迟执行的,在调用立即执行的方法,比如execute.persist等之前,都只是构建了表达式.而真正的执行根据具体的输入数据,来决定执行的后端. 比如,我们可以根据输入是pandas DataFrame(本地数据),还是MaxCompute Table(MaxCompute数据)来决定是在本地执行,还是在MaxComput上执行. In

接口测试从未如此简单 - Postman (Chrome插件)

原文:接口测试从未如此简单 - Postman (Chrome插件) 接口测试从未如此简单 - Postman (Chrome插件)  一个非常有力的Http Client工具用来测试Web服务的, 我这里来介绍如何用它测试restful web service 注:转载请注明出处    安装 进入Chrome的设置->More tools->Extensions     点击最下面的Get more extensions 搜索Postman 选择第一个点击 点击Launch APP   如何

阿里巴巴大数据计算平台MaxCompute(原名ODPS)全套攻略(持续更新20171122)

  概况介绍 大数据计算服务(MaxCompute,原名ODPS,产品地址:https://www.aliyun.com/product/odps)是一种快速.完全托管的TB/PB级数据仓库解决方案.MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效降低企业成本,并保障数据安全.本文收录了大量的MaxCompute产品介绍.技术介绍,帮助您快速了解MaxCompute/ODPS. MaxCompute 2.0:阿里巴巴的大数

MaxCompute文章索引

概况介绍: MaxCompute 2.0 生态开放之路及最新发展 10年老兵带你看尽MaxCompute大数据运算挑战与实践 一分钟了解阿里云产品:大数据计算服务MaxCompute概述 数加平台如何通过Serverless 架构实现普惠大数据 淘宝大数据之路 应用案例: 日志分析: 云数据,大计算-海量日志数据分析与应用 <海量日志数据分析与应用>之数据采集 <海量日志数据分析与应用>之社交数据分析:好友推荐 <海量日志数据分析与应用>之报表分析与展现 <海量日

16篇大数据分析好文推荐!

<云数据·大计算:海量日志数据分析与应用>Workshop-入口 数据采集:日志数据上传 数据加工:用户画像 数据分析展现:可视化报表及嵌入应用 社交数据分析:好友推荐 阿里云数加(大数据)公开数据集(公测ing) 使用 MaxCompute Studio 开发大数据应用 墨迹天气-轻松处理每天2TB的日志数据,支撑运营团队进行大数据分析挖掘,随时洞察用户个性化需求 基于 MaxCompute 的极速的基因测序分析 使用MaxCompute进行拼车分析 MaxCompute在网络舆情监控系统中

Python运用于数据分析的简单教程_python

最近,Analysis with Programming加入了Planet Python.作为该网站的首批特约博客,我这里来分享一下如何通过Python来开始数据分析.具体内容如下:     数据导入         导入本地的或者web端的CSV文件:     数据变换:     数据统计描述:     假设检验         单样本t检验:     可视化:     创建自定义函数. 数据导入 这是很关键的一步,为了后续的分析我们首先需要导入数据.通常来说,数据是CSV格式,就算不是,至少

Python股市数据分析教程——学会它,或可以实现半“智能”炒股 (Part 1)

本文由北邮@爱可可-爱生活 老师推荐,阿里云组织翻译. 以下为译文 本篇文章是"Python股市数据分析"两部曲中的第一部分(第二部分的文章在这里),内容基于我在犹他州立大学MATH 3900 (Data Mining)课程上的一次讲座.在这些文章中,我将介绍一些关于金融数据分析的基础知识,例如,使用pandas获取雅虎财经上的数据,股票数据可视化,移动均线,开发一种均线交叉策略,回溯检验以及基准测试.第二篇文章会介绍一些实践中可能出现的问题,而本篇文章着重讨论移动平均线. 注意:本篇

PyODPS开发中的最佳实践

PyODPS 支持用 Python 来对 MaxCompute 对象进行操作,它提供了 DataFrame API 来用类似 pandas 的接口进行大规模数据分析以及预处理,并且可以用 ml 模块来执行机器学习算法. 现在为了让大家能更好地使用 PyODPS,我们总结开发过程中的最佳实践,来让大家更高效地开发 PyODPS 程序.当然,希望大家能一起来帮助我们来完善总结. 注:公共云由于未支持 Python UDF,因此本文中提到的自定义函数功能包括 apply 和 map_reduce 等功