本月,Mars 发布了 0.4.0b1 ,0.4.0b2 和 0.3.2 以及 0.3.3,点击链接查看详细的 Release Notes。本月两次发布版本是特殊情况,0.4.0b2 修复了 0.4.0b1 中比较紧急的问题。

Mars 项目发布周期

这里先简述下 Mars 的版本发布周期。Mars 以一个月为发布周期,采用双版本发布策略,一般会同时发布 Pre-release 版本和正式版。Pre-release 版本里会包含更多激进的功能或改动,可能会不稳定,而开发中我们认为稳定的功能或增强会被同步到正式版里。

查看 Github 项目的 milestones 可以看到最新的 Pre-release 和正式版本。

查看 Github Projects 页面 可以看到归类的 issues 和 PRs。

v0.4 Release 是我们按版本归档的进行中的 issues 和 PRs。其他则是按模块划分。

新版本功能 Highlight

新版本我们花了大量时间来完善 DataFrame API,经过这个版本的努力,pandas 中的一些常见的接口都得到了支持。

更完善的聚合和分组聚合

  • #1030 让 Groupby.aggregate 支持传入多个聚合函数。

  • #1054 支持了 DataFrame.aggregate 和 Series.aggregate。

  • #1019 和 #1069 支持了 cummax 等累积计算。

举个例子,在 pandas 中我们可以对 movielens 的数据 执行如下操作:

In [1]: import pandas as pd In [2]: %%time ...: df = pd.read_csv('Downloads/ml-20m/ratings.csv') ...: df.groupby('movieId').agg({'rating': ['max', 'min', 'mean', 'std']}) ...: ...: CPU times: user 5.41 s, sys: 1.28 s, total: 6.7 s Wall time: 4.3 s Out[2]: rating max min mean std movieId 1 5.0 0.5 3.921240 0.889012 2 5.0 0.5 3.211977 0.951150 3 5.0 0.5 3.151040 1.006642 4 5.0 0.5 2.861393 1.095702 5 5.0 0.5 3.064592 0.982140 ... ... ... ... ... 131254 4.0 4.0 4.000000 NaN 131256 4.0 4.0 4.000000 NaN 131258 2.5 2.5 2.500000 NaN 131260 3.0 3.0 3.000000 NaN 131262 4.0 4.0 4.000000 NaN [26744 rows x 4 columns]

我们根据电影的 ID 进行聚合,求用户评价的最大、最小、平均值以及标准差。

使用 Mars 则可以:

In [1]: import mars.dataframe as md In [2]: %%time ...: df = md.read_csv('Downloads/ml-20m/ratings.csv') ...: df.groupby('movieId').agg({'rating': ['max', 'min', 'mean', 'std']}).execute() ...: ...: CPU times: user 5.81 s, sys: 6.9 s, total: 12.7 s Wall time: 1.54 s Out[2]: rating max min mean std movieId 1 5.0 0.5 3.921240 0.889012 2 5.0 0.5 3.211977 0.951150 3 5.0 0.5 3.151040 1.006642 4 5.0 0.5 2.861393 1.095702 5 5.0 0.5 3.064592 0.982140 ... ... ... ... ... 131254 4.0 4.0 4.000000 NaN 131256 4.0 4.0 4.000000 NaN 131258 2.5 2.5 2.500000 NaN 131260 3.0 3.0 3.000000 NaN 131262 4.0 4.0 4.000000 NaN [26744 rows x 4 columns]

代码几乎一致,除了 Mars 需要通过 execute() 触发执行。

ratings.csv 有 500M+,使用 Mars 在我的笔记本上运行就可以有数倍加速。当数据量更大的时候,使用 Mars 还可以有更好的加速效果,如果单机无法胜任,也可以使用 Mars 分布式用一致的代码加速执行。

排序

  • #1053 支持了 sort_index。

  • #1046 支持了 sort_values。

还是以 movielens 数据 为例。

In [1]: import pandas as pd In [2]: %%time ...: ratings = pd.read_csv('Downloads/ml-20m/ratings.csv') ...: movies = pd.read_csv('Downloads/ml-20m/movies.csv') ...: movie_rating = ratings.groupby('movieId', as_index=False).agg({'rating': 'mean'}) ...: result = movie_rating.merge(movies[['movieId', 'title']], on='movieId') ...: result.sort_values(by='rating', ascending=False) ...: ...: CPU times: user 5.17 s, sys: 1.13 s, total: 6.3 s Wall time: 4.05 s Out[2]: movieId rating title 19152 95517 5.0 Barchester Chronicles, The (1982) 21842 105846 5.0 Only Daughter (2013) 17703 89133 5.0 Boys (Drenge) (1977) 21656 105187 5.0 Linotype: The Film (2012) 21658 105191 5.0 Rocaterrania (2009) ... ... ... ... 26465 129784 0.5 Xuxa in Crystal Moon (1990) 18534 92479 0.5 Kisses for My President (1964) 26475 129834 0.5 Tom and Jerry: The Lost Dragon (2014) 24207 115631 0.5 Alone for Christmas (2013) 25043 119909 0.5 Sharpe's Eagle (1993) [26744 rows x 3 columns]

主要目标是将数据集中的电影按平均分从高到低进行排列。

到 Mars 这边,代码还是几乎一致。

In [1]: import mars.dataframe as md In [2]: %%time ...: ratings = md.read_csv('Downloads/ml-20m/ratings.csv') ...: movies = md.read_csv('Downloads/ml-20m/movies.csv') ...: movie_rating = ratings.groupby('movieId', as_index=False).agg({'rating': 'mean'}) ...: result = movie_rating.merge(movies[['movieId', 'title']], on='movieId') ...: result.sort_values(by='rating', ascending=False).execute() ...: ...: CPU times: user 4.97 s, sys: 6.01 s, total: 11 s Wall time: 1.39 s Out[2]: movieId rating title 19152 95517 5.0 Barchester Chronicles, The (1982) 21842 105846 5.0 Only Daughter (2013) 17703 89133 5.0 Boys (Drenge) (1977) 21656 105187 5.0 Linotype: The Film (2012) 21658 105191 5.0 Rocaterrania (2009) ... ... ... ... 26465 129784 0.5 Xuxa in Crystal Moon (1990) 18534 92479 0.5 Kisses for My President (1964) 26475 129834 0.5 Tom and Jerry: The Lost Dragon (2014) 24207 115631 0.5 Alone for Christmas (2013) 25043 119909 0.5 Sharpe's Eagle (1993) [26744 rows x 3 columns]

Mars 的排序采用了并行正则采样排序算法,在我们的文章(链接)中已经做了介绍,这里不再赘述。

更完善的索引支持

Mars 在之前的版本中就支持了 iloc,现在我们也支持了其他的索引方法。

  • #1042 中支持了 loc。

  • #1101 中支持了 at 和 iat。

  • #1073 中支持了 md.date_range 方法。

通过 loc 的支持,使得基于索引的数据的查找更加方便。

In [1]: import mars.dataframe as md In [3]: import mars.tensor as mt In [8]: df = md.DataFrame(mt.random.rand(10000, 10), index=md.date_range('2000-1-1', periods=10000)) In [9]: df.loc['2020-3-25'].execute() Out[9]: 0 0.372354 1 0.139235 2 0.511007 3 0.102200 4 0.908454 5 0.144455 6 0.290627 7 0.248334 8 0.912666 9 0.830526 Name: 2020-03-25 00:00:00, dtype: float64

自定义函数、字符串和时间处理

  • #1038 增加了 apply 的支持。

  • #1063 支持了 md.Series.str 和 md.Series.dt来处理字符串和时间列。

我们可以利用 apply 来计算每个城市(数据集)到杭州(东经120°12′,北纬30°16′)的距离。

In [1]: import numpy as np In [2]: def haversine(lat1, lon1, lat2, lon2): ...: dlon = np.radians(lon2 - lon1) ...: dlat = np.radians(lat2 - lat1) ...: a = np.sin(dlat / 2) ** 2 + np.cos(np.radians(lat1)) * np.cos(np.radians(lat2)) * np.sin(dlon / 2) ** 2 ...: c = 2 * np.arcsin(np.sqrt(a)) ...: r = 6371 ...: return c * r ...: In [4]: import mars.dataframe as md In [5]: df = md.read_csv('Downloads/world-cities-database/worldcitiespop.csv', chunk_bytes='16M', dtype={'Region': object} ...: ) In [6]: df.execute(fetch=False) In [8]: df.apply(lambda r: haversine(r['Latitude'], r['Longitude'], 30.25, 120.17), result_type='reduce', axis=1).execute() Out[8]: 0 9789.135208 1 9788.270528 2 9788.270528 3 9788.270528 4 9789.307210 ... 248061 10899.720735 248062 11220.703197 248063 10912.645753 248064 11318.038981 248065 11141.080171 Length: 3173958, dtype: float64

移动窗口函数

  • #1045 增加了 rolling 移动窗口的支持。

移动窗口函数在金融领域使用频率很高,rolling 是在一个固定长度(也可能是固定的时间间隔)上进行一些聚合计算。以下是一个例子。

In [1]: import pandas_datareader.data as web In [2]: data = web.DataReader("^TWII", "yahoo", "2000-01-01","2020-03-25") In [3]: import mars.dataframe as md In [4]: df = md.DataFrame(data) In [5]: df.rolling(10, min_periods=1).mean().execute() Out[5]: High Low Open Close Volume Adj Close Date 2000-01-04 8803.610352 8642.500000 8644.910156 8756.549805 0.0 8756.517578 2000-01-05 8835.645020 8655.259766 8667.754883 8803.209961 0.0 8803.177734 2000-01-06 8898.426758 8714.809896 8745.356445 8842.816732 0.0 8842.784180 2000-01-07 8909.012451 8720.964844 8772.374756 8844.580078 0.0 8844.547607 2000-01-10 8952.413867 8755.129883 8806.285742 8896.183984 0.0 8896.151172 ... ... ... ... ... ... ... 2020-03-19 10423.317090 10083.132910 10370.730078 10180.533887 4149640.0 10180.533887 2020-03-20 10202.623047 9833.786914 10105.280078 9971.761914 4366130.0 9971.761914 2020-03-23 9983.399023 9611.036914 9885.659082 9763.000977 3990040.0 9763.000977 2020-03-24 9821.716016 9436.392969 9703.275098 9591.208984 3927690.0 9591.208984 2020-03-25 9685.129980 9290.444922 9543.636035 9466.308984 4003760.0 9466.308984 [4974 rows x 6 columns]

下一个版本计划

下一个版本会是 0.4.0rc1 和 0.3.4,我们仍然会专注提升 DataFrame API 的覆盖率和性能,提升稳定性,并增加文档。

上云就看云栖号:更多云资讯,上云案例,最佳实践,产品入门,访问:https://yqh.aliyun.com/

本文为阿里云原创内容,未经允许不得转载。

Mars 开源月报(2020.3)相关推荐

  1. Linux 发布全新 6.0 版; 谷歌超微软开源贡献第一; GitHub 遭数万恶意攻击 | 开源月报 Vol.9...

    「WeOpen Insight」是腾源会推出的「开源趋势与开源洞见」内容专栏,不定期为读者呈现开源圈内的第一手快讯.优质工具盘点等,洞察开源技术发展的风向标,预见未来趋势. 1 开源企业新闻 1.涉嫌 ...

  2. Linux阅码场 - Linux内核月报(2020年09月)

    关于Linux内核月报 Linux阅码场 Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向. 限于篇幅,只会对最新技术 ...

  3. Linux阅码场 - Linux内核月报(2020年08月)

    关于Linux内核月报 Linux阅码场 Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向. 限于篇幅,只会对最新技术 ...

  4. 多篇开源CVPR 2020 语义分割论文

    多篇开源CVPR 2020 语义分割论文 前言 DynamicRouting:针对语义分割的动态路径选择网络 Learning Dynamic Routing for Semantic Segment ...

  5. Log4j 爆发“核弹级”漏洞、工信部力推开源软件发展、“龙腾计划”启动|开源月报 Vol. 02...

    「WeOpen Insight」是腾源会全新推出的"开源趋势与开源洞见"内容专栏,不定期为读者呈现开源圈内的第一手快讯.优质工具盘点等,洞察开源技术发展的风向标,预见未来趋势. P ...

  6. 马斯克将Twitter算法开源、谷歌向CNCF捐赠Istio、甲骨文修复Java年度加密漏洞 | 开源月报 Vol. 05...

    「WeOpen Insight」是腾源会推出的「开源趋势与开源洞见」内容专栏,不定期为读者呈现开源圈内的第一手快讯.优质工具盘点等,洞察开源技术发展的风向标,预见未来趋势. 1 开源企业新闻 1.马斯 ...

  7. 两大开源平台、九个捐赠项目,走进百度开源的2020

    点击左上方蓝字关注我们 导读 "从 2009 年大规模定制 Hadoop 到 2013 年第一个前端可视化产品 ECharts率先开源,再到2016年和2017年分别正式对外开源飞桨(Pad ...

  8. 两大开源平台、九个基金会项目,走进百度开源的2020

    "从 2009 年大规模定制 Hadoop 到 2013 年第一个前端可视化产品 ECharts率先开源,再到2016年和2017年分别正式对外开源飞桨(PaddlePaddle).Apol ...

  9. 微软禁俄下载、开源投毒攻击、Rust不会重写Linux、开放原子峰会7月举办 | 开源月报 Vol. 07...

    「WeOpen Insight」是腾源会推出的「开源趋势与开源洞见」内容专栏,不定期为读者呈现开源圈内的第一手快讯.优质工具盘点等,洞察开源技术发展的风向标,预见未来趋势. 1 开源社区新闻 1.Li ...

最新文章

  1. 在Linux下配置TCP/IP
  2. Sizeof与Strlen的区别与联系(转)
  3. python3 异步 semaphore 信号量 控制并发
  4. Spring事务属性详解
  5. redis aof文件的格式 以及如何批量写入大量redis数据
  6. windows系统采用了那种访问控制模型_Linux-3.2 系统与硬件(下)(连载)
  7. php 返回页面重复提交,php防止表单重复提交
  8. 《MySQL——group by使用tips》
  9. 【分享】如何长时间高效学习
  10. Android内存优化2 了解java内存分配 2
  11. java对获取的字节数组进行处理
  12. IT技术人需要具备哪些才能成功
  13. 计算机的进制的转换公式,计算机进制转换公式
  14. 区块链入门导航-磨链社区
  15. stm32g474教程_杜洋老师:STM32教程,STM32视频教程
  16. 龙迅LT6911GX
  17. UI设计师和美工有哪些区别?
  18. Revit综合软件【加强过滤】的使用方法
  19. 构建去中心化安全桥梁 Conflux 与 Chainlink 达成战略合作
  20. 浙大PAT考试1013~1016(最伤的一次。。)

热门文章

  1. 图片处理-填充图片-numpy.pad
  2. hapi.js_Hapi.js入门
  3. 用MODIS数据借助MATLAB绘制世界植被分布图
  4. 尤雨溪:Vue Function-based API RFC
  5. 虚拟机 Linux 系统自定义桌面分辨率且重启后保持不变
  6. SEO搜索引擎优化步骤建议
  7. Be yourself——《按自己的意愿过一生》读后感
  8. 教师资格证考69分是怎么算的?
  9. Biotin-PEG2k-NHS,Biotin-PEG2000-NHS,PEG衍生物
  10. pyqt5中sender方法介绍_PyQt5学习记录(二):Event sender