专利申请和授权分析及展示

通过DataWorks Notebook利用SQL、Python和Markdown Cell对“中国大陆专利申请和授权数据集”进行数据开发、分析和展示,本文为您介绍具体的操作流程。

背景信息

本实践将基于公开数据集“中国大陆专利申请和授权数据集”,在DataWorks Notebook中使用EMR Spark SQL、Hologres SQL、EMR StarRocks SQL、MaxCompute SQL、Python和Markdown Cell来完成数据开发、分析和展示。公开数据集“中国大陆专利申请和授权数据集”存储在OSS中,包含了2003年至2021年间,中国大陆各省份的三大类专利申请和授权数据。基于该数据集,可以通过省份、年份来查询和探索各地区的发明专利、实用新型专利和外观设计专利的申请情况和授权数量。

前提条件

  • 已创建DLF 2.0数据目录。如未创建,详情请参见创建数据目录

    说明

    如果是RAM用户,在进行数据操作之前,需要先授予相应的资源权限。详情请参见授权管理

  • 已创建Serverless StarRocks实例,实例版本需要不低于3.2。如未创建,详情请参见创建实例

  • 已创建EMR Serverless Spark工作空间,引擎版本需要选择esr-2.3 (Spark 3.4.2, Scala 2.12)。

  • 已创建Hologres实例,实例版本需要不低于3.0.7。

  • 已开通MaxCompute外部项目。

  • 已创建DataWorks工作空间,并绑定Serverless Spark工作空间、Serverless StarRocks实例、Hologres实例和MaxCompute外部项目的计算资源。

操作流程

前置步骤:载入Notebook案例

  1. 登录DataWorks Gallery控制台

  2. 找到对应的案例卡片(OpenLake解决方案快速入门),单击卡片中的载入案例

  3. 选择载入到的工作空间和实例,单击确认,进入DataWorks数据开发页面。

步骤1:环境准备

说明

设置DataLakeFormation(DLF)相关的全局参数,便于在后续运行代码时直接引用。

  • 连接DLF服务所需的全局参数

    # 请在下方填写全局参数1-4的值,再运行代码
    
    # 1)请将 [dlf_region] 替换为您的DLF所在区域ID,例如cn-beijing
    dlf_region = "[dlf_region]"
    
    # 2)请将 [dlf_catalog_id] 替换为您DLF数据目录ID;如果已进行OpenLake一体化开通,推荐填写:"openlake_demo_dlf" 对应的DLF数据目录ID
    dlf_catalog_id = "[dlf_catalog_id]"
    
    # 3)请将 [dlf_catalog_accessKeyId] 替换为您访问DLF服务所需的AccessKeyId
    dlf_catalog_accessKeyId = "[dlf_catalog_accessKeyId]"
    
    # 4)请将 [dlf_catalog_accessKeySecret] 替换为您访问DLF服务所需的AccessKeySecret
    dlf_catalog_accessKeySecret = "[dlf_catalog_accessKeySecret]" 
    
    # DLF服务的VPC网络Endpoint 和 Hologres访问DLF的Endpoint,格式已适配,以下配置无需修改
    dlf_endpoint = f"dlfnext-vpc.{dlf_region}.aliyuncs.com"
    dlf_endpoint_for_holo = f"dlfnext-share.{dlf_region}.aliyuncs.com"

    配置项

    描述

    dlf_region

    DLF所在区域ID,例如cn-hangzhou、cn-beijing等,详情请参见地域及访问域名

    dlf_catalog_id

    DLF数据目录ID,请在数据湖构建控制台上查看数据目录对应的ID,详情请参见数据目录

    dlf_catalog_accessKeyId

    访问DLF服务所需的Access Key ID,获取方法请参见查看RAM用户的AccessKey信息

    dlf_catalog_accessKeySecret

    访问DLF服务所需的Access Key Secret,获取方法请参见查看RAM用户的AccessKey信息

  • 使用DLF数据目录、数据库和数据表所需的全局参数

    # 请在下方填写全局参数1-4的值,再运行代码设置DataLakeFormation(DLF)相关的全局参数,便于在后续运行代码时直接引用。
    # 1)请将[dlf_catalog_name]替换为您的目标DLF Catalog名称。如果已进行OpenLake一体化开通,推荐填写:"MyFirstCatalog"。
    dlf_catalog_name = "[dlf_catalog_name]" 
    
    # 2)请将[dlf_database_name]替换为您的目标DLF数据库名称。如果已进行OpenLake一体化开通,推荐填写:"default"。
    dlf_database_name = "[dlf_database_name]" 
    
    # 3)请将[dlf_table_name]替换成自定义表名称,推荐填写:"mainland_domestic_patents_application"
    dlf_table_name = "[dlf_table_name]" 
    
    # 4)请将[dlf_catalog_name_for_mc]替换为MC外部项目名称。如果已进行OpenLake一体化开通,推荐填写:"openlake_demo_mc_expj_随机字符"
    dlf_catalog_name_for_mc = "[dlf_catalog_name_for_mc]"

    配置项

    描述

    dlf_catalog_name

    DLF数据目录名称,请在数据湖构建控制台上查看数据目录名称,详情请参见数据目录

    dlf_database_name

    DLF数据库名称,请在数据湖构建控制台上查看数据目录下的数据库名称,详情请参见数据库

    dlf_table_name

    自定义表名称。

    dlf_catalog_name_for_mc

    MaxCompute外部项目名称,具体信息请参见MaxCompute控制台

步骤2:数据准备

从OSS公开存储地址中获取原始数据,并存入Python Pandas DataFrame中(DataFrame对象的变量名称:df_data)。

  1. 读取OSS原始数据。

    import pandas as pd
    df_data = pd.read_csv('https://dataworks-dataset-cn-shanghai.oss-cn-shanghai.aliyuncs.com/public-datasets/L1_update/L2_mainland_domestic_patents_application/full_title_03_21_mainland_domestic_patents_application.txt', sep=',', header=0)
    
    df_data
  2. 创建Paimon格式的数据表。

    import os
    import pandas as pd
    import pyarrow as pa
    
    from paimon_python_java import Catalog
    from paimon_python_api import Schema
    
    # 连接DLF Catalog
    catalog_options = {
        'metastore': 'dlf-paimon',
        'dlf.endpoint': dlf_endpoint,
        'dlf.region': dlf_region ,
        'dlf.catalog.id': dlf_catalog_id,
        'dlf.catalog.accessKeyId': dlf_catalog_accessKeyId ,
        'dlf.catalog.accessKeySecret': dlf_catalog_accessKeySecret,
    }
    catalog = Catalog.create(catalog_options)
    
    # 新建Paimon表
    record_batch = pa.RecordBatch.from_pandas(df_data)
    schema = Schema(record_batch.schema)
    
    catalog.create_table(f'{dlf_database_name}.{dlf_table_name}', schema, True)
  3. 数据写入Paimon表。

    将之前步骤中获取的Python Pandas DataFrame对象(df_data)的数据写入Paimon表(表名为步骤1中定义的dlf_table_name参数取值)。

    # 将数据写入表
    table = catalog.get_table(f'{dlf_database_name}.{dlf_table_name}')
    write_builder = table.new_batch_write_builder()
    table_write = write_builder.new_write()
    table_commit = write_builder.new_commit()
    
    record_batch = pa.RecordBatch.from_pandas(df_data)
    table_write.write_arrow_batch(record_batch)
    commit_messages = table_write.prepare_commit()
    table_commit.commit(commit_messages)
    
    table_write.close()
    table_commit.close()
    print("成功写入数据到Paimon表!")

步骤3:交互式分析

  1. 使用Python构建ipywidgets交互组件。

    import ipywidgets as widgets
    from IPython.display import display
    
    # 中国的所有省份、自治区和直辖市
    provinces = [
        '北京市', '天津市', '上海市', '重庆市',
        '河北省', '山西省', '辽宁省', '吉林省', '黑龙江省', '江苏省', '浙江省', '安徽省', '福建省', '江西省', '山东省',
        '河南省', '湖北省', '湖南省', '广东省', '广西壮族自治区', '海南省', '四川省', '贵州省', '云南省', '西藏自治区',
        '陕西省', '甘肃省', '青海省', '宁夏回族自治区', '新疆维吾尔自治区'
    ]
    
    # 创建复选框组件
    checkboxes = [widgets.Checkbox(description=province) for province in provinces]
    
    # 将复选框按5列排列
    checkbox_grid = widgets.GridBox(checkboxes, layout=widgets.Layout(grid_template_columns="repeat(5, 200px)"))
    
    print("选择要查询的省市地区:")
    # 显示复选框组件
    display(checkbox_grid)
    
    # 定义处理复选框变化的函数
    def handle_checkbox_change(change):
        global query_province
        selected_provinces = [checkbox.description for checkbox in checkboxes if checkbox.value]
        query_province = "'" + "','".join(selected_provinces) + "'"
    
    # 绑定复选框变化事件
    for checkbox in checkboxes:
        checkbox.observe(handle_checkbox_change, names='value')
  2. 使用SQL查询2021年不同省市地区的专利获批率。

    • EMR Spark SQL

      Cell类型选择EMR SPARK SQL,并选择已绑定的Serverless Spark计算资源,请注意Spark工作空间中的数据目录是否已经添加了步骤1中"dlf_catalog_name"变量对应的DLF数据目录。

      SELECT ROUND(designs_patents_granted/patents_application_granted*100,2)  AS designs_patents_granted_rate,    -- 专利申请获得授权的百分比
             region,    -- 地区
             year       -- 年份,枚举值从2003至2021
      FROM ${dlf_catalog_name}.${dlf_database_name}.${dlf_table_name}
      WHERE year = '2021'
      AND region IN ('北京市', '山西省', '浙江省', '河南省', '海南省', '陕西省')
      ;
    • Hologres SQL

      Cell类型选择Hologres SQL,并选择已绑定的Hologres计算资源。

      SELECT (designs_patents_granted::float4/patents_application_granted *100)::decimal(19,2)  AS designs_patents_granted_rate,    -- 专利申请获得授权的百分比
             region,    -- 地区
             year       -- 年份,枚举值从2003至2021
      FROM ${dlf_catalog_name}.${dlf_database_name}.${dlf_table_name}
      WHERE year = '2021'
      AND region IN ('北京市', '山西省', '浙江省', '河南省', '海南省', '陕西省')
      ;
    • EMR StarRocks SQL

      Cell类型选择StarRocks,并选择已绑定的StarRocks计算资源。

      -- 请先在EMR StarRocks中创建StarRocks External Catalog,映射至DLF Catalog
      DROP CATALOG `${dlf_catalog_name}`;
      CREATE EXTERNAL CATALOG `${dlf_catalog_name}`
      PROPERTIES (
      "type"  =  "paimon",
      "paimon.catalog.type"  =  "dlf-paimon",
      "dlf.catalog.instance.id"  = "${dlf_catalog_id}"
      );
      SELECT ROUND(designs_patents_granted/patents_application_granted*100,2)  AS designs_patents_granted_rate,    -- 专利申请获得授权的百分比
             region,    -- 地区
             year       -- 年份,枚举值从2003至2021
      FROM `${dlf_catalog_name}`.`${dlf_database_name}`.${dlf_table_name}
      WHERE year = '2021'
      AND region IN ('北京市', '山西省', '浙江省', '河南省', '海南省', '陕西省')
      ;
    • MaxCompute SQL

      Cell类型选择MaxCompute SQL,并选择已绑定的MaxCompute计算资源,请注意所选MaxCompute外部项目关联的DLF数据目录是否是步骤1中"dlf_catalog_name_for_mc"变量对应的DLF数据目录。

      set odps.namespace.schema=true;
      set odps.sql.allow.namespace.schema=true;
      
      SELECT ROUND(designs_patents_granted/patents_application_granted*100,2)  AS designs_patents_granted_rate,    -- 专利申请获得授权的百分比
             region,    -- 地区
             year       -- 年份,枚举值从2003至2021
      FROM `${mc_external_prj}`.`${dlf_database_name}`.${dlf_table_name}
      WHERE year = '2021'
      AND region IN ('北京市', '山西省', '浙江省', '河南省', '海南省', '陕西省')
      ;

步骤4:可视化图表

步骤3中的数据查询结果均已经存储至Python Pandas DataFrame对象中,分别是:

  • EMR Spark SQL查询结果:df_spark

  • Hologres SQL查询结果:df_hologres

  • StarRocks SQL查询结果:df_starrocks

  • MaxCompute SQL查询结果:df_maxcompute

执行以下Python脚本,可视化展示不同省份的外形设计专利占比柱状图。

import pandas as pd
import matplotlib.pyplot as plt
import math

#省份及地区名称
province = list(df_spark['region'])   # df_spark 支持替换为:df_spark 或 df_hologres 或 df_starrocks 或 df_maxcompute
province = [prov for prov in province]

#外形设计专利的占比
rate = list(df_spark['designs_patents_granted_rate'])   # df_spark 支持替换为:df_spark 或 df_hologres 或 df_starrocks 或 df_maxcompute
rate = [math.floor(float(tmp_rate)) for tmp_rate in rate]

plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = 'Source Han Serif SC'

#绘制柱状图
plt.bar(province, rate)
plt.ylim(0, 30)
plt.yticks(range(0, 30, 5))
plt.xlabel('province')
plt.xticks(rotation=45, ha="right")
plt.ylabel('designs_patents_granted_rate')
plt.title('designs_patents_granted_rate')
plt.show()