本文为您介绍Mars的功能、与PyODPS DataFrame的区别和使用场景。
随着MaxCompute MaxFrame的上线发布,将逐步替换PyODPS DataFrame及Mars接口,同时在算子兼容性以及分布式能力上有明显提升,建议新用户/新作业直接基于MaxFrame进行Python开发工作。
使用场景
Mars与PyODPS DataFrame使用场景如下:
Mars
经常使用PyODPS DataFrame的to_pandas()方法,将PyODPS DataFrame转换成Pandas DataFrame的场景。
熟悉Pandas接口,但不愿意学习PyODPS DataFrame接口的场景。
使用索引的场景。
创建DataFrame后需要保证数据顺序的场景。
Mars DataFrame通过iloc等方法可以获取某个偏移的数据。例如,
df.iloc[10]
可以获取第10行数据。Mars DataFrame也支持需要保证数据顺序才可以使用的特性接口df.shift()
和df.ffill()
。需要并行和分布化Numpy或Scikit-learn,以及支持分布式运行TensorFlow、PyTorch和XGBoost的场景。
数据量在TB级别以下的场景。
PyODPS DataFrame
使用MaxCompute调度作业的场景。PyODPS DataFrame会将DataFrame编译成MaxCompute SQL。如果需要通过MaxCompute调度作业,建议您使用PyODPS DataFrame。
稳定性要求较高的作业场景。PyODPS DataFrame会将作业编译至MaxCompute执行,由于MaxCompute相当稳定,而Mars相对比较新,如果对稳定性有很高要求,建议您使用PyODPS DataFrame。
数据量在TB级别以上的场景,建议您使用PyODPS DataFrame。
与PyODPS DataFrame的区别
API
Mars
Mars DataFrame完全兼容Pandas。Mars Tensor兼容Numpy。Mars Learn兼容Scikit-learn。
PyODPS
只有DataFrame接口,和Pandas的接口差异较大。
索引
Mars
Mars DataFrame支持索引操作,包含行和列索引。示例代码如下。
In [1]: import mars.dataframe as md In [5]: import mars.tensor as mt In [7]: df = md.DataFrame(mt.random.rand(10, 3), index=md.date_range('2020-5-1', periods=10)) In [9]: df.loc['2020-5'].execute() Out[9]: 0 1 2 2020-05-01 0.061912 0.507101 0.372242 2020-05-02 0.833663 0.818519 0.943887 2020-05-03 0.579214 0.573056 0.319786 2020-05-04 0.476143 0.245831 0.434038 2020-05-05 0.444866 0.465851 0.445263 2020-05-06 0.654311 0.972639 0.443985 2020-05-07 0.276574 0.096421 0.264799 2020-05-08 0.106188 0.921479 0.202131 2020-05-09 0.281736 0.465473 0.003585 2020-05-10 0.400000 0.451150 0.956905
PyODPS
不支持索引操作。
数据顺序
Mars
Mars DataFrame创建后,会保证数据顺序,支持时序操作(
shift
)、向前(ffill
)、向后(bfill
)和填空值操作。In [3]: df = md.DataFrame([[1, None], [None, 1]]) In [4]: df.execute() Out[4]: 0 1 0 1.0 NaN 1 NaN 1.0 In [5]: df.ffill().execute() #空值用上一行的值。 Out[5]: 0 1 0 1.0 NaN 1 1.0 1.0
PyODPS
PyODPS使用MaxCompute计算和存储数据,而MaxCompute并不保证数据顺序,因此PyODPS不保证数据顺序,不支持时序操作。
执行层
Mars
Mars包含客户端和分布式执行层。您可以通过调用
o.create_mars_cluster
,在MaxCompute内部创建Mars集群,并将计算作业直接提交至Mars集群,调度费用极小。在数据规模较小时,Mars更有优势。PyODPS
PyODPS是一个客户端,不包含任何服务端部分。执行PyODPS DataFrame时,系统会将计算作业编译至MaxCompute SQL。因此,PyODPS DataFrame支持的操作,取决于MaxCompute SQL。此外,您每次调用
execute
方法时,会提交一次MaxCompute作业,需要在集群内调度作业。
使用说明
Mars是一个基于张量的统一分布式计算框架。Mars能利用并行和分布式技术,为Python数据科学栈加速,包括Numpy、Pandas和Scikit-learn。
Mars常用接口如下:
和Numpy保持一致,且支持大规模高维数组。示例代码如下。
import mars.tensor as mt a = mt.random.rand(10000, 50) b = mt.random.rand(50, 5000) a.dot(b).execute()
Mars DataFrame接口
和Pandas保持一致,且支持大规模数据处理和分析。示例代码如下。
import mars.dataframe as md 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()
Mars Learn接口
和Scikit-learn保持一致。示例代码如下。Mars Learn可以集成TensorFlow、PyTorch和XGBoost。
import mars.dataframe as md from mars.learn.neighbors import NearestNeighbors df = md.read_csv('data.csv') nn = NearestNeighbors(n_neighbors=10) nn.fit(df) neighbors = nn.kneighbors(df).fetch()
参考文档
技术支持
如果您在使用Mars过程中遇到问题,请单击申请链接加入技术支持钉钉群进行咨询。