QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2081|回复: 0
打印 上一主题 下一主题

搞 AI 建模预测都在用 Python,其实入门用 SPL 也不错

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-7 15:33 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    搞 AI 建模预测都在用 Python,其实入门用 SPL 也不错0 X* c8 {, i, {0 G' N

    ' c, x  X& ?2 |9 I可用来做人工智能建模预测的工具非常多,比如Python, R, SAS,SPSS等,其中Python由于简单易学、丰富的数据科学库、开源免费等特点备受欢迎。但是对于不太熟悉数据建模算法的程序员来说,使用Python建模还是比较复杂,很多时候拿到数据并不清楚该做怎样的处理,选择什么样的算法。其实,在做数据分析和数据建模时,SPL也是不错的选择,它比Python更简单易用,计算速度也快,交互式的界面对数据分析十分友好,同时还提供自动数据建模功能和一些数据处理以及统计学函数,用起来也很方便。
    ( U6 F! y& _6 R# C" w2 S) F- S$ ~7 T1 s- P
    下面就以一份用户贷款违约预测的数据为例,使用SPL手把手的进行数据建模预测。! s+ _# U2 p6 a4 {/ }5 X/ |
    & r3 b) t5 y3 v, D+ T
    1. 确定目标,准备数据: J7 S, R( F% M( P  c  k
    建模预测就是从历史数据中挖掘出规律,然后使用规律对未来可能发生的事情做出预测。这个规律就是一般所说的模型。9 b* Z7 G( a9 H- b3 y. x
    * E$ Z" Q5 L# N  L
    历史数据通常是一张我们俗称的宽表,比如在用户贷款违约预测的例子中历史数据是如下图这样的Excel表格:/ X  c$ b% G1 {; N

    0 K3 q9 }- I" V( q首先,宽表中一定要包括我们想预测的事情,通常称作预测目标,上图中的预测目标就是历史用户的违约行为,也就是图中y那一列,yes表示违约,no表示不违约。预测目标还可以是一个数值,比如产品的销量、售价……,或者是预测属于什么种类,比如预测产品质量是优、良、合格还是差。有时目标在原始数据里就有,可以直接使用,有时目标还需要人工标注。
    ' \' G7 }* u* {
    % W) G5 K2 y! |8 H& W( L除了预测目标外,这里还需要很多信息,如表中的用户年龄、工作,房产,贷款情况……,这里的每一列称为变量,也就是和贷款人将来是否违约可能会相关的信息,原则上能收集到的变量越多越好。例如预测客户是否会购买产品,可以搜集客户的行为信息,购物偏好,以及产品的特征信息,促销力度等;预测汽车保险理赔风险,需要保单数据,车辆信息、车主交通习惯以及历史理赔情况等等,如果是预测健康险还需要一些被保人的生活习惯,身体状况,就医看病的信息;预测商场超市的销售情况,需要历史的销售订单,客户信息,商品信息;预测不良产品,需要生产的工艺参数,环境,原料情况等数据。总之,收集到的相关信息越多,预测效果也会越好。
    9 W+ n# \2 r9 m. D5 R5 A, W0 _
      J, d. C- I9 f采集数据时,通常会截取某一段时期的历史数据来制作宽表,比如我们想预测7月份用户的违约情况,可以采集1-6月份的数据来训练建立模型。数据采集的时间范围并不是固定的,可以灵活操作,例如也可以是近1年或者近3个月等等。% v; r+ W, m4 T
    5 z$ T4 y& ^, Z4 v. B
    准备好的宽表可以是Excel格式或csv格式,第一行是标题,后面每一行都是一条历史记录。
    3 q4 B: x9 B8 L* f( P. r% H6 a& w. I5 a
    如果企业有建设好的信息系统,那可以找IT部门要这些数据,很多企业的BI系统中可以直接导出这种数据。: h! K' X1 H  I' P& s

    - v$ v: n9 t$ b( l# q# l+ J/ H2. 下载软件,配置建模外部库
    0 Q7 M. i" B. g9 @6 E1 nSPL 在易明建模外部库的配合下可以提供全自动化的建模预测功能。1 ^& J1 ]  @- q, m; e6 d3 X
    - D+ Q0 P& b0 Z( p" H: F1 p4 {# _
    (1)下载安装集算器(SPL)和易明建模软件
    0 M( e$ D* g# E. f* {( M集算器下载:! R  y4 t1 y# {: a
    “http://c.raqsoft.com.cn/article/1595816810031”4 v6 d2 w  H4 w

    9 s* q; m8 C; t* B0 L0 E5 T易明建模下载: “http://www.raqsoft.com.cn/download/download-ymodel”
    $ i- o0 r1 _* ]8 d: a9 S3 u9 n$ Q. \7 h
    安装集算器和建模软件,并记录安装目录,比如:C:\Program Files\raqsoft\ymodel
    0 r6 m* K0 f% v. ^, Z" E) D2 \; c$ D1 |$ V4 r, m" `

    & a9 m, T: N% N( s# g0 o% T2 d0 ?3 Z& _
    (2)在SPL中配置外部库
    ) R2 f' u# V+ Y( T2 D  r3 e4 o(a)复制外部库所需要的文件
    + ~; p+ P1 ]; {9 ~% z在易明建模的安装目录下找 YModelCil 和 lib 文件夹/ W7 v& @' t+ C2 v; v

    ! P6 I& o7 c# u7 n$ S! i. J* K* J- Z8 R! f" W7 B5 n
    2 a) O0 s) v" N6 V+ @/ t: P
    然后去这两个文件夹里找到建模外部库所需要的文件,复制到集算器目录(【安装根目录】\esProc\extlib\YModelCil),比如C:\Program Files\raqsoft\esProc\extlib\YModelCli。
    % X8 B1 o+ K- {/ b* f" C) w" F% ]8 u. t
    建模外部库所需的文件有:% n/ H% ^9 o  s' N# S7 b

    3 y( b, g( P% E; u1 }1>易明建模目录的YModelCil中含有以下jar和xml- I* p2 L: X. I6 Y6 H& f( h7 `

    9 \) D, w0 ]/ I$ C7 {& lant-1.8.2.jar: r. ~3 m5 \/ `  C
    commons-beanutils.jar
    4 j7 ?  i& a1 O- rcommons-lang-2.6.jar: t/ V! j  ^( i* C* S
    ezmorph-1.0.2.jar
    ( f+ N& V. L7 d. j! [& g, ljson-lib-1.1-jdk13.jar, T- \0 U$ C: t: B1 ~* v' r
    raq-ymodel-cli-2.10.jar) Y) [/ a' [" J  S% o
    userconfig.xml
    # c; W! _- }2 h3 v7 F
    # V. Q5 K+ U+ y. v2>易明建模的lib中含有以下jar( W. ?) ~6 v# i

    ; Z0 ^" V" _8 R9 I  T  C# Ycommons-io-2.4.jar
    & R# w& m8 n# M5 S' V, E/ T' V* A+ ]esproc-ext-20211104.jar
    + P0 y2 y- ~- C: Ifastjson-1.2.58.jar; e3 L- p  U" {( H3 \- V4 w% h% w
    gson-2.8.0.jar
    6 _& L8 h( M  ~  ijackson-annotations-2.9.6.jar
    & O' b: K5 Q; A) b9 |+ ajackson-core-2.9.6.jar- S% M/ {% Y% g3 M
    jackson-databind-2.9.6.jar! G3 X: y& a. ~+ x
    jackson-databind-2.9.6-sources.jar' U4 H8 V& ^# m% @
    jackson-dataformat-msgpack-0.8.14.jar
    + Y) [- N/ J! F- a8 jmining.jar
    # }7 S* v3 w- W/ k8 nmsgpack-0.6.12.jar& t2 X0 O0 [6 C  d7 \, m; h; B! T
    msgpack-core-0.8.16.jar
    % v* b4 W! r. ]* v* n- Y
    2 L" M& P* p2 q(b)设置userconfig.xml文件参数  R6 g8 R3 P" ~6 M2 k
    在集算器目录esProc\extlib\YModelCil下的userconfig.xml文件中设置参数
    5 g7 o3 k9 k' A( P
    9 w8 @  k# b( d名称        参数说明( I. U% x( {) n: K% j
    sAppHome        易明建模的安装目录
    " B3 f& h) c5 [+ \- E9 B" q" L2 RsPythonHome        易明建模目录的Python路径 Windows: raqsoft\ymodel\Python37 Linux: raqsoft/ymodel/Python37/bin/python3.77 e4 W2 F: g* D. O7 I4 A" l. Z
    iPythonServerPort        Python服务网络端口
    - F' z3 s" Y; a% f% Z. XiPythonProcessNumber        Python进程数
    ( m! d9 D! ^7 H7 vbAutoDecideImpute        是否智能补缺# O: h) s, G8 t% M! q( E  @
    iResampleMultiple        重抽样次数
    ; V& w6 q! ?* g# c4 N5 q其中必须要配置的参数为sAppHome和sPythonHome,其他参数可以采用默认值,有需要再进行修改。比如可以配置参数如下,加粗部分是必须要配置的,根据自己的安装路径。
    % j+ M  h. u' y6 Q, K, A
    ; ?* _' y; z; H+ \0 L7 w2 o<?xml version="1.0" encoding="UTF-8"?>
    - _$ l6 @6 n/ y2 K/ e: g2 t<Config Version="1">2 I3 V9 y4 @( n3 }. C# J/ G
        <Options>
    0 C! U( Q0 \' O. a, u! g! b        <Option Name="sAppHome" Value="C:\Program Files\raqsoft\ymodel"/>! C7 }/ V( q: c  N9 J4 y  p
                    <Option Name="sPythonHome" Value="C:\Program Files\raqsoft\ymodel\Python37\python.exe"/>$ p) B+ w/ G4 O
                    <Option Name="iPythonServerPort" Value="8510"/>" i8 f1 t; _. C; N: @+ p
                    <Option Name="iPythonProcessNumber" Value="2"/>. R  k% G. S% w4 _
                  <Option Name="bAutoDecideImpute" Value="true"/>
    ( x, A3 D$ Z; l& n- }                <Option Name="iResampleMultiple" Value="150"/>                               
    # F, |# `/ _- ~: @2 L    </Options>
    2 t8 z/ f9 m5 A5 p/ M! K6 x</Config>
    6 ?3 h) u, |6 Y7 Z) A- ^1
    5 z3 K6 u2 O7 g; S& c8 X& y2
    / m  e$ _( k! e% U( M8 I" z3
    ' w2 T9 A% u4 k' z+ S: d4& R* Q2 _$ ^) |0 `/ e3 q
    5
    ! h+ p9 q5 F$ o9 e, g, }7 D! c6
    + U7 m6 ~" h/ A; t# k6 J6 D7
    3 r5 D9 D& g+ J: v) c8
    2 I  z! S# Q& Y6 S; v- k& O; O5 k9/ ^8 J, I0 [; E- c% d1 F
    10
    1 |" H' b6 j: w. z114 l. L* @9 S7 R- H" J
    其实,从这里可以看出,易明建模也是基于Python写的,但它将Python算法做了封装后,程序员就不必再理解算法的数学原理和运行细节了。
    & t2 ~" W  c8 {4 |1 Z/ L6 m
    3 o3 W( Q: }1 g# T# ^2 ?# e(c)SPL环境配置/ w- D2 X! N8 V
    1>. 配置外部库
    , `' W5 g, a- d2 V& u9 S6 ^% K9 G* T- e* N8 e0 F4 W  r
    打开SPL,在选项菜单里,外部库选择里勾选YModelCli,使其生效。外部库的路径为第(1)步骤中集算器YModelCli的安装路径。
    + U4 _8 ?3 O( g# \  l4 T  B
    / B8 l: u; W0 ^) \
    ! L/ h& _( k% w7 T( m( ?% @: t* F5 \  \6 ]( S9 O% Z. s
    在无图形界面的服务器中去集算器的安装目录下esProc\config\raqsoftConfig.xml文件中进行配置外部库路径和名称。
    : _6 g  d# W' U% _/ Y9 f7 }8 x) A1 [7 w) x) f
    <extLibsPath>外部库路径
    " @: K+ z% @- b2 j1 d* n& w2 G4 ~' Y. `
    <importLibs>外部库名称(可多个)
    6 e1 |9 ~0 A# S- Y4 h6 ?2 o4 \  L/ Z- A6 p; f  f# E/ ?# E
    2>. 线程数设置# h. G" _8 `0 h0 I4 Z1 X( S& j/ j
    6 w4 A% ]7 u9 R, b) R8 [0 M
    如果有并发预测,还需要在SPL设置“最大并行数”,也就是线程数。设置多少用户根据需求和机器情况自行设定。
    & a+ n3 a4 H7 i
    ' _7 o, d+ V/ Z# E2 L: E" B& R' y/ Z

    . }: w; f- ~3 U! F0 k1 p在无图形界面的服务器中去集算器的安装目录下esProc\config\raqsoftConfig.xml文件中进行配置。
    5 o/ \* z" u: k+ Y) b' P3 \( U; l( g9 g' N9 A
    <parallelNum>最大并行数
    & n( A5 q0 h9 W- C) a- g9 N. A6 s& P' |, J# @$ F
    到此,环境配置完成。
    " A& Q$ G5 Z+ [
    # e# P( S* {! E' D3. 建模和预测
    # t! Z! E( q4 @* U(1)加载数据! d. @- A# m) G- G
    SPL能支持csv,excel或数据库中的数据用于建模,这里以csv为例,其它数据源类似。
    & Z* w! w* }. R2 ~8 p8 x' v
    " K1 }9 e% }* E) p5 W# d设有一个贷款违约数据表如下,需要建模来预测新用户是否会发生违约行为。. \, t- K0 T& c0 h0 N

    ( L4 q4 V: A% ^) z
    2 E( y3 }4 {% z$ C# y( Y  g! R9 Z3 d
    # R4 z0 ^) `' p* w7 w: A  Z文件命名为bank-full.csv;( u1 }6 {+ j, Z+ N4 n

    " c% @5 w+ o7 [- t1 j3 g; WA( L5 T5 A/ A  G& O2 ~
    1        =file("bank-full.csv").import@tc()
    9 c$ v- ]$ t( G5 q$ Z) u4 W! D2        =ym_env()  d( y; d& ?: Z# [* k' ~1 c% i
    3        =ym_model(A2,A1)
    : n$ q0 }  J  Z$ E- e+ u" ]4 o9 [A1 导入建模数据,读成序表
      H( m1 Y- S5 U9 ]9 m. ]& Z3 a7 s8 m, J
    1 \* G; E! Z7 N" Y& X$ p# r+ Q' [5 q

    5 H/ G4 i& H2 w0 R3 EA2 初始化环境,执行A2后会在易明建模的安装目录下生成store目录及子目录用以保存数据及结果文件。
    2 g9 b6 n9 M# P' d$ n- [4 S2 n) o5 `3 w: n3 z! z
    A3 加载建模文件,生成md对象
    1 n2 g9 ?: [+ }! F$ j/ q: o' s' i/ \: e( j" t& `: k7 E/ v
    (2)目标变量设置和变量统计0 @% c; |& g2 l# a
    数据加载进来后要设置目标变量7 K, ?2 C9 E! S- k! o

    " X9 g& g* k  X- u( HA5 O3 N* o5 E- I0 Q
    …        …
    ! i% X$ N5 k! W6 R) T1 n7 H3 X4        =ym_target(A3,"y"), T5 j& P8 O9 ]+ E5 ~4 o
    5        =ym_statistics(A3,"age")
    6 C- y0 Z# G6 y5 ]/ a5 a6        =A1.fname().(ym_statistics(A3,~))# C0 @* j! E0 ]1 c- ~
    A4 表示将字段“y”设置为目标变量,目标变量可以是二值变量或数值型变量。
    6 O- C2 {5 r+ ]7 i* x, M  F" b( e4 z! ]2 s) {/ v. H* n! r
    A5 查看某个变量的统计指标,比如 “age”,返回值中可以看到缺失率,最大最小值,异常值,数据分布图等参数。
      y' O' `; p! x% B" \
    & `3 q! e; ?6 @, M$ d1 `- V
    $ ]1 y) ?- J  o6 p/ n! I. R. J- c+ N+ F8 V
    A6 循环变量名查看所有字段的统计信息,返回包含所有字段的统计信息二级序列。
    $ e' j7 l, L" ^9 A* Q. a0 e' v$ h: W3 z3 ]+ S# B

    ; ]' l, Y. u2 D
    9 W( X* [6 O! u/ g(3)建立模型和模型表现2 K2 z: r5 v7 L9 J
    A
    - j- c4 j7 ]9 H' s& {# V# L% O0 w9 @4 Q# n…        …
    9 N/ d& p1 @1 V$ B2 e4 t7        =ym_build_model(A3), @% c) K( @8 m0 z8 a. l% B" U
    8        =ym_present(A7)
    7 [. n; L  z- I3 k9        =ym_performance(A7)  [3 \9 }6 t2 G- b; w" `& h5 M9 {
    10        =ym_importance(A7).sort@z(Importance)
    9 v& x1 V  J- M: E* l( D1 AA7 使用建模函数建立模型,执行后在后台会进行全自动化数据预处理和建模过程,此过程会耗费一些时间,时间长短取决于数据量。结果返回pd模型对象。
    , ]- |& [4 ~  \
    2 P/ O: a" n2 G3 F5 A, K8 |/ k模型建好后,可以调用pd模型对象查看模型信息、模型质量和重要度。
    " R, h. z' h' \+ _" `
    0 C* E6 q0 O1 k, KA8 返回模型AUC值及参数
    ' k. z1 s4 X$ {! P1 |  |, C# V; Z( m
    % z, }" H! \6 P7 s) t
    0 ?$ A6 R8 ?9 D5 x: P  D; X( b, U; C8 q+ ~
    A9 返回多种模型指标和图形,诸如AUC,ROC, Lift……
    6 i8 t/ r: P& [9 |6 L$ O2 {- C0 \' k! U* T/ M

    . l: j5 _% _8 b% S8 z
    / u/ E) G$ I( Q: I比如点击A9的第6条记录的Value,然后点击右上角“图形浏览”图标,数值字段选择“Lift”,就可以查看Lift曲线# @5 \  i2 e& D+ J9 U6 v
    ( I/ `. D. [  A

    6 E) A/ g& J7 J$ M, s4 g
    : k+ t. h  A2 e* e& p9 d; NA10 会返回每个变量对目标变量的影响程度并且按照重要度降序排列。数值越大对目标变量的影响程度越大。降序排列分析起来更加直观。/ W: o6 S5 u$ |. X

    . i% o( w# B; b/ f6 d/ X' t: l4 z) b% Q9 C) N2 o& K3 C

    ( H* E% x2 H$ Q# i% _* b. N(4)保存模型
    1 o) c. j: N- W) ?" R' F+ qA
    2 V- r2 B& K+ t6 s( }" U4 z…        …( \* u% Q3 ~' ^$ O/ F# n) L
    11        =ym_save_pcf(A7,"bankfull.pcf")
    ( l* Q! H7 [) V2 |3 o12        =ym_json(A7)  D  p; K/ i4 _2 h5 E
    13        >ym_close(A2)) A. {+ W: m. j1 R
    A11 将模型保存为”bankfull.pcf”,默认保存路径为[sAppHome]/store/predict。
    , I! ~  K, W7 K- y% r! K. r8 Z1 e/ ^& R8 r, {9 K# J0 c
    A12 将模型信息以json串形式返回。json内容详解可参考在线文档《json参数说明》
    & [; J4 f) S9 S3 x& R$ {0 d6 ]. L6 {: ~
    A13 关闭环境,释放资源。
    " v( [0 s5 P" ]7 G( E' K8 H$ M' G
      y$ N& D4 ?9 A, |( H2 y- e(5)预测
    6 y7 ^( m3 @6 r2 n" k预测之前需要有pcf模型文件和预测数据集6 s0 D2 c6 c, W# ^

    . r* U5 T+ |6 x" u1 |& g, U, WA) K( w% U; _4 u# d
    1        =ym_env()
    % J* Z+ W- {  M, p. O- p2        =ym_load_pcf("bankfull.pcf")
    5 K+ t% R! d( x5 v7 d7 H+ y, {) t3        =file("bank-full2.csv").import@tc()8 s. e* l/ h9 F; V) K* I" ~1 f
    4        =ym_predict(A2,A3)! ]; w2 N* i) I
    5        =ym_result(A3)
    ; Q& x( |4 m( k6 X  f5 w6        =file("bank-full_result.csv").export@tc(A4)
    . s0 l3 Y- A1 [! g5 q7        >ym_close(A1). n" u$ E! g8 B" c4 Z
    A1 初始化环境
    % Y5 y( M& A% k8 g# F( t1 X1 @! k) ^* a+ j' o- r; R
    A2 导入pcf模型文件,生成pd模型对象。
    " c9 C; v+ y! i# l( n0 s2 E7 D# U6 E$ \1 u) m, @6 F" a: z
    A3 导入预测数据集,读成序表9 g( n" g% r' x. }# `/ l) O, K/ p

    & g  `& C" Y6 e% \  `+ j# ^8 eA4 对序表数据执行预测。除序表外,还支持游标、csv文件和mtx文件,比如A4也可以直接写成ym_predict(A2,“bankfull2.csv”)
    5 E; G& B7 j; p' Y9 y& p/ V. N2 O0 L: g/ y# @
    A5 获取预测结果( v3 i- P* \: W( h: r) F, G
    2 A- T7 `" j4 |, j& q/ \
    A6 将预测结果导出,在本例中预测结果为用户发生违约行为的概率。5 g! l, O/ H6 f: ]& g, h

    $ O; h  V( X: N/ M4 q0 E1 n3 {6 b1 O
    A7 关闭环境,释放资源) t2 U9 i) e' x5 A9 E7 |1 n

    2 T; f# X: K8 [# _, s9 H4. 集成调用% c, ^: r, d8 H# [- V3 D
    SPL还可以被上层应用集成调用,比如SPL可以嵌入到Java应用,详情请参考:http://c.raqsoft.com.cn/article/1615765346560
    4 Q2 h6 c& r& ^1 S5 |$ p0 h7 a5 w- N' C3 N
    总结" l$ J9 C, Q& ]# }2 K# J( I
    使用SPL配合易明建模来实现数据建模预测非常简单,程序员不需要理解深奥的数学原理,只要准备好训练数据,简单几步就可以完成数据建模任务了。而且还可以轻松地把这个功能嵌入到应用程序中,高深的人工智能不再是少量数据科学家的专利。
    / c8 ^( K2 {2 y. w/ s3 G
    ' w* o  x7 N  h" C2 `SPL本来就超强的数据处理能力,能更方便地完成人工智能算法之前的数据准备工作,同时也提供了丰富的数学函数: SPL Math 例程,有些数学基础想自己实现建模过程的同学也可以进一步研究。
    ! Q8 I- y6 [. q6 y8 Y; \) U————————————————
    0 L6 a% w# X8 G9 j+ P% ]- J版权声明:本文为CSDN博主「java李杨勇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( e9 v' m/ h+ H  r/ ?, [1 M原文链接:https://blog.csdn.net/weixin_39709134/article/details/126698462
    % Z, @$ K% H5 Q' e' o$ A( p' R, f  p5 w9 n7 o5 r, w

    4 M5 C( j2 H) D3 f' {! a. V4 ]
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-1 22:17 , Processed in 0.428992 second(s), 50 queries .

    回顶部