【DSW Gallery】MaxCompute(ODPS)Python SDK使用指南

直接使用

请打开MaxCompute(ODPS)Python SDK使用指南,并点击右上角 “ 在DSW中打开” 。

【DSW Gallery】MaxCompute(ODPS)Python SDK使用指南

阿里云MaxCompute

MaxCompute 是面向分析的企业级 SaaS 模式云数据仓库,以 Serverless 架构提供快速、全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您可以经济并高效的分析处理海量数据。详情查看:阿里云MaxCompute。

前提条件

  • 阿里云账号
  • 开通MaxCompute
  • 创建MaxCompute项目
  • 开通PAI
  • 至少有一个正在运行的DSW实例

⌨️ 使用方法

配置账号

PyODPS 提供了命令行下的增强工具。首先,用户可以在任何地方配置了帐号以后,下次就无需再次输入帐号信息

from odps.inter import setup, enter, teardown

odps setup函数参数列表里填写您的 access_id、access_key,pyodps需要使用AK连接MaxCompute。

project使用 创建MaxCompute项目 或 前往MaxCompute控制台,endpoint根据project region而不同(例如杭州: http://service.cn-hangzhou.maxcompute.aliyun.com/api )。

本文所使用的数据来自MaxCompute公开数据集 。此外数加体验馆也提供了工具来查询和分析MaxCompute公开数据集,帮助您近距离的感受阿里云其他大数据产品。

AccessKey(AK)获取

config需要您当前账号的AccessKey(AK)信息。获取AK的方式,请参见 获取AccessKey

setup(
    '**your-access_id**',
    '**your-access-key**',
    '**your-project**', # 填写您创建的MaxCompute项目
    endpoint='**project-endpont**',
    # 填入您的 MaxCompute 项目所在区域对应的Endpoint,
    # 可参考 https://help.aliyun.com/document_detail/34951.html
    # 例如: 杭州region endpoint(http://service.cn-hangzhou.maxcompute.aliyun.com/api)
    room='default')

在不指定room这个参数时,会被配置到叫做default的room里。以后,在任何命令行打开的地方,都可以直接调用:room = enter(), 我们可以拿到ODPS的入口:o = room.odps

room = enter()
o = room.odps

查看数据集

二手房产数据集是MaxCompute提供的公开数据集,位于项目public_data下,表名:dwd_prouduct_house_basic_info_out

house = o.get_table('public_data.dwd_prouduct_house_basic_info_out')
house
odps.Table
  name: public_data.`dwd_prouduct_house_basic_info_out`
  schema:
    house_id                                : string      # 房产ID
    house_city                              : string      # 房产所在城市
    house_total_price                       : string      # 房产总价
    house_unit_price                        : string      # 房产均价
    house_type                              : string      # 房产类型
    house_floor                             : string      # 房产楼层
    house_direction                         : string      # 房产方向
    house_deckoration                       : string      # 房产装修
    house_area                              : string      # 房产面积
    house_community_name                    : string      # 房产所在小区
    house_region                            : string      # 房产所在地区
    proj_name                               : string      # 楼盘名称
    proj_addr                               : string      # 项目地址
    period                                  : string      # 产权年限
    property                                : string      # 物业公司
    greening_rate                           : string      # 绿化率
    property_costs                          : string      # 物业费用
  partitions:
    ds                                      : string      

使用sql查询MaxCompute

sql = '''
    select *
        from public_data.dwd_prouduct_house_basic_info_out
        where ds=20170113
        limit 2
'''
with o.execute_sql(sql).open_reader() as reader:
    for record in reader:
        print(record)

【DSW Gallery】MaxCompute(ODPS)Python SDK使用指南

Click to hideodps.Record {
  house_id                                '4fb6a8e5078045cd294d437ea8a06a75'
  house_city                              'beijing'
  house_total_price                       '38'
  house_unit_price                        '58282'
  house_type                              '1室1厅'
  house_floor                             '低楼层/共16层'
  house_direction                         '北'
  house_deckoration                       '平层/简装'
  house_area                              '65'
  house_community_name                    '优筑'
  house_region                            '丰台\xa0玉泉营\xa0三至四环'
  proj_name                               None
  proj_addr                               None
  period                                  None
  property                                None
  greening_rate                           None
  property_costs                          None
  ds                                      '20170113'
}
odps.Record {
  house_id                                'e5d9a95cac927a3f3e92ce4fc1612f18'
  house_city                              'beijing'
  house_total_price                       '878'
  house_unit_price                        '76916'
  house_type                              '3室2厅'
  house_floor                             '低楼层/共24层'
  house_direction                         '东南'
  house_deckoration                       '精装'
  house_area                              '114'
  house_community_name                    '首科花园'
  house_region                            '丰台\xa0太平桥\xa0二至三环'
  proj_name                               None
  proj_addr                               None
  period                                  None
  property                                None
  greening_rate                           None
  property_costs                          None
  ds                                      '20170113'
}

ipython 插件

为了改善Jupyterlab中的使用体验,dsw提供ipython增强插件dswmagic。执行%load_ext dswmagic 加载,在之前请安装dswmagic (pip install dswmagic)

安装dswmagic
!pip install dswmagic>3.0
%load_ext dswmagic

odps 提供了 SQL 插件(通过magic函数%%sql调用),来执行 ODPS SQL

%%sql  select *
        from public_data.dwd_prouduct_house_basic_info_out
        where ds=20170113
        limit 10
house_id house_city house_total_price house_unit_price house_type house_floor house_direction house_deckoration house_area house_community_name house_region proj_name proj_addr period property greening_rate property_costs ds
0 4fb6a8e5078045cd294d437ea8a06a75 beijing 38 58282 1室1厅 低楼层/共16层 平层/简装 65 优筑 丰台 玉泉营 三至四环 None None None None None None 20170113
1 e5d9a95cac927a3f3e92ce4fc1612f18 beijing 878 76916 3室2厅 低楼层/共24层 东南 精装 114 首科花园 丰台 太平桥 二至三环 None None None None None None 20170113
2 a22be76021c1e3321cfdcad402a85157 beijing 35 66 2室1厅 低楼层/共24层 东南 平层/其他 53 太平桥东里 丰台 太平桥 二至三环 None None None None None None 20170113
3 52cb0fbe98837aaba513cc99a2c81e57 beijing 46 53814 3室1厅 底层/共18层 东南 北 平层/精装 85 石榴园北里小区 丰台 刘家窑 三至四环 None None None None None None 20170113
4 447aa6a735d1e8f2c0fe8dc9a3c09f4f beijing 4 57972 3室1厅 高楼层/共6层 南 北 平层/简装 69 东大街东里 丰台 七里庄 三至四环 None None None None None None 20170113
5 e11808eefcc90e4917d3582183b57038 beijing 36 67164 2室1厅 低楼层/共5层 其他 53 东安街头条1号院 丰台 北大地 三至四环 None None None None None None 20170113
6 c63afea5ffe18c7fc6137c8be4b5df03 beijing 37 6 2室1厅 高楼层/共6层 南 北 平层/精装 6 东木樨园 丰台 木樨园 二至三环 None None None None None None 20170113
7 9bab0c7460c2e8e07de365f56538671a beijing 45 42 3室2厅 低楼层/共25层 西南 平层/精装 1 东阁雅舍 通州 新华大街 五至六环 None None None None None None 20170113
8 f58ed5d2353b60a03cf00f67eb051ff7 beijing 16 88398 4室2厅 低楼层/共16层 南 北 平层/精装 181 中海九号公馆 丰台 科技园区 四至五环 None None None None None None 20170113
9 74aa3b8a0ae7d41a6237be9e91db0730 beijing 28 6814 5室2厅 联排/共3层 南 北 毛坯 41 中海九号公馆 丰台 科技园区 四至五环 None None None None None None 20170113
odps变量

更多关于odps的使用细节,参考开发者文档(https://help.aliyun.com/document_detail/27990.html)

  1. maxcompute 系统变量
  2. pyodps 设置变量
%%sql
set odps.sql.submit.mode=script;
@a := select * from public_data.dwd_prouduct_house_basic_info_out where ds=20170113 limit 200;
@b := select * from @a limit 10;
select * from @b;
house_id house_city house_total_price house_unit_price house_type house_floor house_direction house_deckoration house_area house_community_name house_region proj_name proj_addr period property greening_rate property_costs ds
0 4fb6a8e5078045cd294d437ea8a06a75 beijing 38 58282 1室1厅 低楼层/共16层 平层/简装 65 优筑 丰台 玉泉营 三至四环 None None None None None None 20170113
1 e5d9a95cac927a3f3e92ce4fc1612f18 beijing 878 76916 3室2厅 低楼层/共24层 东南 精装 114 首科花园 丰台 太平桥 二至三环 None None None None None None 20170113
2 a22be76021c1e3321cfdcad402a85157 beijing 35 66 2室1厅 低楼层/共24层 东南 平层/其他 53 太平桥东里 丰台 太平桥 二至三环 None None None None None None 20170113
3 52cb0fbe98837aaba513cc99a2c81e57 beijing 46 53814 3室1厅 底层/共18层 东南 北 平层/精装 85 石榴园北里小区 丰台 刘家窑 三至四环 None None None None None None 20170113
4 447aa6a735d1e8f2c0fe8dc9a3c09f4f beijing 4 57972 3室1厅 高楼层/共6层 南 北 平层/简装 69 东大街东里 丰台 七里庄 三至四环 None None None None None None 20170113
5 e11808eefcc90e4917d3582183b57038 beijing 36 67164 2室1厅 低楼层/共5层 其他 53 东安街头条1号院 丰台 北大地 三至四环 None None None None None None 20170113
6 c63afea5ffe18c7fc6137c8be4b5df03 beijing 37 6 2室1厅 高楼层/共6层 南 北 平层/精装 6 东木樨园 丰台 木樨园 二至三环 None None None None None None 20170113
7 9bab0c7460c2e8e07de365f56538671a beijing 45 42 3室2厅 低楼层/共25层 西南 平层/精装 1 东阁雅舍 通州 新华大街 五至六环 None None None None None None 20170113
8 f58ed5d2353b60a03cf00f67eb051ff7 beijing 16 88398 4室2厅 低楼层/共16层 南 北 平层/精装 181 中海九号公馆 丰台 科技园区 四至五环 None None None None None None 20170113
9 74aa3b8a0ae7d41a6237be9e91db0730 beijing 28 6814 5室2厅 联排/共3层 南 北 毛坯 41 中海九号公馆 丰台 科技园区 四至五环 None None None None None None 20170113
可视化查询结果

dswmagic 提供了可视化命令(%%dsw_sql),需要用户筛选,查找以及图表可视化查询结果。 并将结果保存到变量df1, 方便继续对数据进行转换。后面以一个例子来讲解。

setup(
    'LTAI4GFCfB44DYvUnFN4P1uD',
    'hefFIs34Fe7PG0de14sQQe1IOpWbbC',
    'mc_494979319_1', # 填写您创建的MaxCompute项目
    endpoint='http://service.cn-hangzhou.maxcompute.aliyun.com/api',
    # 填入您的 MaxCompute 项目所在区域对应的Endpoint,
    # 可参考 https://help.aliyun.com/document_detail/34951.html
    # 例如: 杭州region endpoint(http://service.cn-hangzhou.maxcompute.aliyun.com/api)
    room='default')
%%dsw_sql
set odps.sql.submit.mode=script;
@a := select * from public_data.dwd_prouduct_house_basic_info_out where ds=20170113 limit 10;
@b := select * from @a limit 10;
select * from @b;
The maximum number of previews is 5000
Execution result in the variable:df1
DataFrame
PyODPS 提供了 DataFrame API,它提供了类似 pandas 的接口,但是能充分利用 ODPS 的计算能力; 同时能在本地使用同样的接口,用 pandas 进行计算。文档
创建DateFrame
pt = o.get_table('public_data.dwd_prouduct_house_basic_info_out').get_partition('ds=20170113')
from odps.df import DataFrame
house = DataFrame(pt)
查看数据
house.head(3)
house_id house_city house_total_price house_unit_price house_type house_floor house_direction house_deckoration house_area house_community_name house_region proj_name proj_addr period property greening_rate property_costs
0 4fb6a8e5078045cd294d437ea8a06a75 beijing 38 58282 1室1厅 低楼层/共16层 平层/简装 65 优筑 丰台 玉泉营 三至四环 None None None None None None
1 e5d9a95cac927a3f3e92ce4fc1612f18 beijing 878 76916 3室2厅 低楼层/共24层 东南 精装 114 首科花园 丰台 太平桥 二至三环 None None None None None None
2 a22be76021c1e3321cfdcad402a85157 beijing 35 66 2室1厅 低楼层/共24层 东南 平层/其他 53 太平桥东里 丰台 太平桥 二至三环 None None None None None None

describe odps表格,该操作比较耗时

house.describe()
type house_id house_city house_total_price house_unit_price house_type house_floor house_direction house_deckoration house_area house_community_name house_region proj_name proj_addr period property greening_rate property_costs
0 count 6576128 6576128 6576128 6576128 6576128 6576128 6576128 6576128 6576128 6576128 6576128 16 16 16 16 16 16
1 unique 30070 2 681 17715 48 232 66 22 308 2789 316 3 3 1 3 2 3
数据转换
准备数据

从odps表中取小批量数据(1k条)进行实验。test_batch_data是ResultFrame类型,只能查看数据。为了能够完成数据变换,将其转化为DataFrame。这里我们只关心房屋单价, 房屋地区, 房屋朝向。

test_batch_data = house.head(1000)
df_test = DataFrame(test_batch_data.to_pandas(), unknown_as_string=True, as_type={
    'house_unit_price': 'int',
    'house_region': 'string',
    'house_direction': 'string'
})
按地区计算房屋均价

数据变换文档

def map_house_region(row):
    yield int(row.house_unit_price), row.house_region.strip()[0:2]
df_test_region = df_test.apply(map_house_region, axis=1,  names=['house_unit_price', 'house_region'], types=['float', 'string'] )
df_test_region

【DSW Gallery】MaxCompute(ODPS)Python SDK使用指南

按房价进行分组

price_count = df_test.house_unit_price.value_counts()
price_count

【DSW Gallery】MaxCompute(ODPS)Python SDK使用指南

结果探索

PyODPS DataFrame提供了绘图的方法。如果要使用绘图,需要 pandas 和 matplotlib 的安装。

%matplotlib inline

查看区域房价图表

price_mean = df_test_region.groupby('house_region').agg(df_test_region.house_unit_price.mean().rename('price_mean'))
price_mean

【DSW Gallery】MaxCompute(ODPS)Python SDK使用指南

使用拼音代替中文

!pip install pypinyin
import pypinyin
from functools import reduce
region_table = dict()
def pinyin_camel(pinyin):
    return reduce(lambda acc,x: acc + x[0].capitalize(), pinyin, '')
def pinyin(region):
    py = pypinyin.pinyin(region, style=pypinyin.NORMAL)
    alias = pinyin_camel(py)
    region_table[region] = alias
    return alias
def map_house_region(row):
    yield int(row.price_mean), pinyin(row.house_region.strip())
df_test_region_pinyin = price_mean.apply(map_house_region, axis=1,  names=['price_mean', 'house_region'], types=['float', 'string'] )
df_test_region_pinyin

【DSW Gallery】MaxCompute(ODPS)Python SDK使用指南

df_test_region_pinyin.plot(kind='bar', x='house_region', ylabel='price_mean', figsize=(12, 5))
<AxesSubplot:xlabel='house_region', ylabel='price_mean'>

【DSW Gallery】MaxCompute(ODPS)Python SDK使用指南

# 房价分布
price_count[price_count.count > 3].plot(kind='bar', x='count', ylabel='price_mean', figsize=(12, 5))
<AxesSubplot:xlabel='count', ylabel='price_mean'>

【DSW Gallery】MaxCompute(ODPS)Python SDK使用指南