QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2013|回复: 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 也不错
    . N+ z5 I8 Q+ X* o! {7 h, r' M7 Q2 y1 N
    可用来做人工智能建模预测的工具非常多,比如Python, R, SAS,SPSS等,其中Python由于简单易学、丰富的数据科学库、开源免费等特点备受欢迎。但是对于不太熟悉数据建模算法的程序员来说,使用Python建模还是比较复杂,很多时候拿到数据并不清楚该做怎样的处理,选择什么样的算法。其实,在做数据分析和数据建模时,SPL也是不错的选择,它比Python更简单易用,计算速度也快,交互式的界面对数据分析十分友好,同时还提供自动数据建模功能和一些数据处理以及统计学函数,用起来也很方便。- T* o0 H' l! ^8 D# S
    # g7 F$ n# q* k1 a' n: Y
    下面就以一份用户贷款违约预测的数据为例,使用SPL手把手的进行数据建模预测。& H# V4 D/ C/ z

    1 b- V3 d0 a! j6 N. |1. 确定目标,准备数据  |/ g5 p9 R4 E0 P: v  x1 A7 {6 d
    建模预测就是从历史数据中挖掘出规律,然后使用规律对未来可能发生的事情做出预测。这个规律就是一般所说的模型。
    ! C/ E  [( k9 V3 M8 W$ D
    ; O5 s+ G* A4 w- _5 |历史数据通常是一张我们俗称的宽表,比如在用户贷款违约预测的例子中历史数据是如下图这样的Excel表格:% r) h, i) B# z4 k# r  n

    % q& U% N6 F  {" d. w, Y首先,宽表中一定要包括我们想预测的事情,通常称作预测目标,上图中的预测目标就是历史用户的违约行为,也就是图中y那一列,yes表示违约,no表示不违约。预测目标还可以是一个数值,比如产品的销量、售价……,或者是预测属于什么种类,比如预测产品质量是优、良、合格还是差。有时目标在原始数据里就有,可以直接使用,有时目标还需要人工标注。% h& P$ |8 m& n/ E

    - _( i0 u% y/ g# ~+ t除了预测目标外,这里还需要很多信息,如表中的用户年龄、工作,房产,贷款情况……,这里的每一列称为变量,也就是和贷款人将来是否违约可能会相关的信息,原则上能收集到的变量越多越好。例如预测客户是否会购买产品,可以搜集客户的行为信息,购物偏好,以及产品的特征信息,促销力度等;预测汽车保险理赔风险,需要保单数据,车辆信息、车主交通习惯以及历史理赔情况等等,如果是预测健康险还需要一些被保人的生活习惯,身体状况,就医看病的信息;预测商场超市的销售情况,需要历史的销售订单,客户信息,商品信息;预测不良产品,需要生产的工艺参数,环境,原料情况等数据。总之,收集到的相关信息越多,预测效果也会越好。0 N/ @+ O! ]  k2 i
    : Q: ]2 ]# A' |
    采集数据时,通常会截取某一段时期的历史数据来制作宽表,比如我们想预测7月份用户的违约情况,可以采集1-6月份的数据来训练建立模型。数据采集的时间范围并不是固定的,可以灵活操作,例如也可以是近1年或者近3个月等等。) ~1 X- Y: L& @0 z6 r, S4 J3 b& j  p

    8 E9 |( P' s. f# \$ Q; f准备好的宽表可以是Excel格式或csv格式,第一行是标题,后面每一行都是一条历史记录。( e( B" ~: A( w5 s

    5 p5 ]: Z5 z3 ?. b) A5 o7 w' c如果企业有建设好的信息系统,那可以找IT部门要这些数据,很多企业的BI系统中可以直接导出这种数据。7 `+ G. }  Z2 Q2 z

    $ D7 M- }+ [% g0 t: a2. 下载软件,配置建模外部库( Y! `7 Y4 B( ~9 H1 n) s6 q
    SPL 在易明建模外部库的配合下可以提供全自动化的建模预测功能。$ y7 y- Y; A: ]7 R
    0 d9 N. A- H2 F) J$ k: ?$ C6 Y
    (1)下载安装集算器(SPL)和易明建模软件3 S8 h0 F7 _; ?
    集算器下载:
    " [- u# ]) T6 H5 ]“http://c.raqsoft.com.cn/article/1595816810031”
    2 G. e# c( `. {% G! Y  f6 W$ d) p' O& O1 a: o: o8 l8 L, ^
    易明建模下载: “http://www.raqsoft.com.cn/download/download-ymodel”2 [& M7 {4 n( s9 n+ Q+ S' T0 ^8 R

    + |. [, T/ }0 M7 ~! W4 }安装集算器和建模软件,并记录安装目录,比如:C:\Program Files\raqsoft\ymodel
    1 P" V7 R4 t4 `0 D
    9 V+ ^$ H1 `6 a
    + p3 K. r8 P! R  s% K: U. M7 V; \% _, S- d* w& P
    (2)在SPL中配置外部库
    % r" U  w: X+ Y% C: B) s' k(a)复制外部库所需要的文件
    5 Q7 h+ ]" {% n  K& T在易明建模的安装目录下找 YModelCil 和 lib 文件夹7 I0 C! g7 U6 m( ^

    1 ]: z5 _' Z; W8 C0 v# a) Y2 e: C$ V5 }& y
    " t9 k1 h, e1 c" T% I0 C( y# g0 v
    然后去这两个文件夹里找到建模外部库所需要的文件,复制到集算器目录(【安装根目录】\esProc\extlib\YModelCil),比如C:\Program Files\raqsoft\esProc\extlib\YModelCli。0 A3 c9 ?# T; }- V" t$ J- u1 @8 p8 b
    2 x" Q" X, W& N2 \" F0 I
    建模外部库所需的文件有:
    & }) n5 [$ @0 d0 l8 _- Y
    & }6 e; _$ ]: _5 l% i1>易明建模目录的YModelCil中含有以下jar和xml1 K! u* E$ p2 u; j8 X! `6 x+ }( R
    * M- `  f5 E9 f. R. b% s
    ant-1.8.2.jar
    ; ]7 D1 G. H' R! C' _, icommons-beanutils.jar
    5 t: x+ h. j6 p4 _! pcommons-lang-2.6.jar3 @; {+ v: H+ c  R3 o/ i
    ezmorph-1.0.2.jar+ v4 a: i$ m0 L$ u
    json-lib-1.1-jdk13.jar0 C* t/ r' t. x( ~* ?: ?
    raq-ymodel-cli-2.10.jar/ {, Y  E" @+ e) i5 Q2 t, h5 F
    userconfig.xml
    3 [+ U! i9 r+ h  p/ G3 O
    9 L0 C8 d/ _4 P4 v* d9 R- r2>易明建模的lib中含有以下jar
    2 L& }, ]( x" B( r. P! ^7 _& ?
    " E  {1 F( A2 I. p% R5 Ocommons-io-2.4.jar
    ! J% q0 v4 P; w0 desproc-ext-20211104.jar
      g* L7 h* X& f! b2 m( U+ l- U) Pfastjson-1.2.58.jar3 ]& Z/ `; y3 m: y* G
    gson-2.8.0.jar
    . d/ T5 v1 k. U) y9 `jackson-annotations-2.9.6.jar
    . }8 p1 z; [( u+ O$ Hjackson-core-2.9.6.jar1 N; x- Q8 G6 \4 Y4 d* C) [
    jackson-databind-2.9.6.jar
    9 W, R+ a, m+ c0 }: a1 Djackson-databind-2.9.6-sources.jar( ~" O; c7 S4 l. x- o5 P  s8 P
    jackson-dataformat-msgpack-0.8.14.jar# X# E7 ~; p2 I% O5 \% E: Z9 G
    mining.jar
    3 x4 {4 i$ U) Q  B7 b$ }6 nmsgpack-0.6.12.jar0 h9 H0 p- z  f3 [* Y4 t
    msgpack-core-0.8.16.jar
    0 A7 m1 m8 K7 s* ]
    ! e( ?- S. T8 H3 J(b)设置userconfig.xml文件参数
    + [' C  Y  m( Y1 ]" _" B在集算器目录esProc\extlib\YModelCil下的userconfig.xml文件中设置参数
    4 R. V1 q/ a% ^3 J
    * r7 d1 [/ P. W" O6 e5 b名称        参数说明
    ; k8 x" h6 [2 W- u) }  T9 zsAppHome        易明建模的安装目录
    % X" S1 N3 ~' y* O; A, v' y' TsPythonHome        易明建模目录的Python路径 Windows: raqsoft\ymodel\Python37 Linux: raqsoft/ymodel/Python37/bin/python3.7' D; o+ u4 h7 Q4 @  r( a
    iPythonServerPort        Python服务网络端口; V/ e0 C  a2 R4 D9 W6 d
    iPythonProcessNumber        Python进程数3 L# N- S: e/ W2 `2 V( Y0 g- G
    bAutoDecideImpute        是否智能补缺. V6 H$ ^7 h: y; X4 t
    iResampleMultiple        重抽样次数
    " P' K/ [: W8 B) O# ]其中必须要配置的参数为sAppHome和sPythonHome,其他参数可以采用默认值,有需要再进行修改。比如可以配置参数如下,加粗部分是必须要配置的,根据自己的安装路径。
    ! b# F3 o6 w# f' y
    6 ~% |5 B+ F+ w/ T7 R<?xml version="1.0" encoding="UTF-8"?>
    ( P. z& F/ N1 i- A& ~<Config Version="1">' k# D  @6 y( v) V, T9 S
        <Options>
    ' |2 }3 p5 w, K        <Option Name="sAppHome" Value="C:\Program Files\raqsoft\ymodel"/>
    . C% s% L% ^, p( {9 z. t                <Option Name="sPythonHome" Value="C:\Program Files\raqsoft\ymodel\Python37\python.exe"/>
    ( C9 |8 J  z) y; f; [                <Option Name="iPythonServerPort" Value="8510"/>( R; b! @/ ]1 s, h$ L. K
                    <Option Name="iPythonProcessNumber" Value="2"/>4 `. c$ S3 W- k6 m$ a$ R7 \
                  <Option Name="bAutoDecideImpute" Value="true"/>) S: Z+ _1 s8 ~: B+ Y
                    <Option Name="iResampleMultiple" Value="150"/>                               
    - L* B: D1 k0 x; u    </Options>: T% u: E4 ~, S
    </Config>
    . D( Y. i, ]) q1 x& C1
    7 T. r" U  z  F# L; N$ a* L" m27 R# \5 J" l  i3 P1 b3 z+ w. i7 v
    3
    , h: a/ L7 n5 N4 F0 i6 I& A3 @48 j  m; ?  k" j' P9 |# j
    5+ C3 m4 s% e; c' p' `2 D& G9 x( n/ q
    6
    * U2 |( _, e( M& S1 Z7& ?- u0 K) X% l& T) B
    8
    ) D/ {' x0 s2 e2 L9( Q6 N% \$ `1 x* }
    10
    4 u, }3 s4 b& Y: r. L118 k; K  N  x6 P/ \9 Q& o
    其实,从这里可以看出,易明建模也是基于Python写的,但它将Python算法做了封装后,程序员就不必再理解算法的数学原理和运行细节了。# d- |- Y+ t* L$ }' x! A0 e
    % n4 `$ w" k/ u* Y% d
    (c)SPL环境配置
    + Y0 r$ F/ _. J1>. 配置外部库* j! b  B# ^- M# L0 D

    2 f( K7 @! G. v! S) b3 ^打开SPL,在选项菜单里,外部库选择里勾选YModelCli,使其生效。外部库的路径为第(1)步骤中集算器YModelCli的安装路径。- N( P  j" C1 ^4 A6 Q) H, h. b$ D

      V( i2 p' R/ q! x8 v; s  N2 F9 J

    7 x7 @  ]/ d$ S- u6 O" g在无图形界面的服务器中去集算器的安装目录下esProc\config\raqsoftConfig.xml文件中进行配置外部库路径和名称。
    * q/ u) b# Q4 H3 S7 L* O2 F, Z8 X6 w# ~* l7 ~$ M' ~
    <extLibsPath>外部库路径
    ! o3 c. J! Y9 s" f4 s3 T
    ' r5 o3 @# I/ r0 b2 I<importLibs>外部库名称(可多个)6 ]* S" R; u7 E5 v- Z$ ^& k
    4 u' w9 n, H1 w8 e
    2>. 线程数设置
    9 R: M% a* d! \5 O' W3 r- R  B# I2 q7 q2 h9 Q5 X
    如果有并发预测,还需要在SPL设置“最大并行数”,也就是线程数。设置多少用户根据需求和机器情况自行设定。
    4 q' X* X% O/ M4 q! c% b7 M2 l- Y, Z7 _  R

    & `4 G$ a! v) Q
    ! ?5 b* p' O& R3 {* J+ I! p2 E在无图形界面的服务器中去集算器的安装目录下esProc\config\raqsoftConfig.xml文件中进行配置。$ a9 S* |, ^4 `
    * d, W, b" e- X$ d: t
    <parallelNum>最大并行数
    1 S3 A! P* y; W  e# K/ O" T' h5 W2 X, s4 a' N/ L# v! ]& @
    到此,环境配置完成。! Q/ e( W/ `7 I  W2 M/ c" ?) q0 @2 B
    ' M8 ]& V& ?" o
    3. 建模和预测. B! D% O; }& p2 s
    (1)加载数据
    9 Z7 Y/ f6 g& x1 ^7 Y0 g3 rSPL能支持csv,excel或数据库中的数据用于建模,这里以csv为例,其它数据源类似。; a- W( C0 ~# v: K

    " J5 |6 M4 p. ^设有一个贷款违约数据表如下,需要建模来预测新用户是否会发生违约行为。! J" G! J3 U2 r) @9 z

    ; m( n6 c# h# q# v" {* F9 @  G: H" S  |) x1 m' @' W  ^
    : i; K9 ~) W: [; s3 m; T
    文件命名为bank-full.csv;
    9 K; Y4 F0 j5 s, Q( P/ U: i- L8 k$ M3 ?/ E1 \# i+ o
    A
    ( H4 G% H/ o* F, d1        =file("bank-full.csv").import@tc()
    ; B9 e" J' v# e$ z9 I# c: c2        =ym_env()
    ' b  n8 t7 ?+ i$ z3        =ym_model(A2,A1)) o/ y9 H) ?  F5 t+ A9 s0 c
    A1 导入建模数据,读成序表
    2 U' |0 P" y: R+ ^5 l0 F9 J2 \4 E1 M( L  k6 Y+ P) O  K5 C7 m
    1 [( F6 L8 E/ K7 W8 L$ e% c; p- b

    ! G0 U- L( `3 k# z6 }* S* f5 O( ]+ q4 dA2 初始化环境,执行A2后会在易明建模的安装目录下生成store目录及子目录用以保存数据及结果文件。
    9 C5 W2 Q7 q- p5 K) S9 N: m
    , q- w8 z, C6 e+ j. S8 aA3 加载建模文件,生成md对象
      ]& E8 `  l7 m6 i
    % j; M) F0 {+ g; Q(2)目标变量设置和变量统计
      r5 k- k: r1 G, D, Z% J数据加载进来后要设置目标变量" _+ b% _; _. i0 Y  }

    0 }6 w1 U/ L  `( N4 k7 AA  `) v8 P+ s& V& u1 x: P9 N
    …        …
    " A" h. J2 ~* J  \/ K2 C4        =ym_target(A3,"y")
    3 w" I3 N* B! z. M* P4 U0 E9 l* b2 [5 d- g5        =ym_statistics(A3,"age")0 u* P) I0 z& o' W, o! G
    6        =A1.fname().(ym_statistics(A3,~))
    4 {8 t- \5 ?2 [. M) A) h+ v  ZA4 表示将字段“y”设置为目标变量,目标变量可以是二值变量或数值型变量。- z6 e$ Z% F7 r( Z' e! c
    % U: D" r' C' @$ o- x3 F
    A5 查看某个变量的统计指标,比如 “age”,返回值中可以看到缺失率,最大最小值,异常值,数据分布图等参数。9 v* u3 x$ E. e5 ]

    6 _" l4 Y$ O1 D1 N# `) n7 @5 v9 g
    ! m- w# x0 Y4 e/ J3 Z
    . E8 ?. O  [/ U) zA6 循环变量名查看所有字段的统计信息,返回包含所有字段的统计信息二级序列。
    1 l5 z2 W" B' ^, i0 [! K: W( i' a2 R( j( a" f+ ]) R9 M
    # K' W+ g( Z, P' {, e

    % o2 }! j4 v3 V; r+ P5 g4 D(3)建立模型和模型表现
    7 j& |$ n- c% q! w- N" L6 X0 CA6 b! W# A; X8 ^2 h9 C
    …        …; Y8 U' F5 W" B3 S/ U+ G7 K
    7        =ym_build_model(A3)5 V, z( V4 a, h! \/ Q- O
    8        =ym_present(A7)$ G8 t' B: Y8 B# }2 v2 V
    9        =ym_performance(A7)
    0 b- P, e7 i. l10        =ym_importance(A7).sort@z(Importance)
    ' }/ N3 G) r6 J: \+ `A7 使用建模函数建立模型,执行后在后台会进行全自动化数据预处理和建模过程,此过程会耗费一些时间,时间长短取决于数据量。结果返回pd模型对象。* u- K  [; `0 A' U

    ( M: p8 N* |5 u+ h# S模型建好后,可以调用pd模型对象查看模型信息、模型质量和重要度。
    6 x0 ]" ^/ `3 S. |' X, I
    & r- y* \. m* Q$ {A8 返回模型AUC值及参数
    . V; q# h" [, l! j- `& X& f) @* B* l. b6 z) {& N

    . }- Z6 E$ x+ u: J' H
    , I+ f. Y  N' k+ f7 ?9 ?3 yA9 返回多种模型指标和图形,诸如AUC,ROC, Lift……7 c8 W& R1 _2 Q, O! l, ]
    2 O: v8 o8 }7 G' o

    ) H! d! @6 R9 H: s! @4 K7 X8 ]
    比如点击A9的第6条记录的Value,然后点击右上角“图形浏览”图标,数值字段选择“Lift”,就可以查看Lift曲线
    , E; y! |  u1 _% J
    4 ?2 M* ~1 M9 c0 [
    ( d% F1 c, [  K% v' l% M5 Y+ x  |! _7 t
    A10 会返回每个变量对目标变量的影响程度并且按照重要度降序排列。数值越大对目标变量的影响程度越大。降序排列分析起来更加直观。7 Y  d2 r. S5 D* {

    * R. J: M* W& {& L' D1 f
    $ F2 ~/ o3 v. ]2 i' x; P" A. M
    . R  ~+ T9 A$ o+ g1 z(4)保存模型- r" n( G* C& k5 m' ~" ^
    A+ P' Y/ @& \8 i2 @9 {: w
    …        …: V3 a& f# V$ C2 ~# L) _, q1 X) V. D
    11        =ym_save_pcf(A7,"bankfull.pcf")
    % N# F1 x  u$ t; k6 R; |12        =ym_json(A7)
    8 R" ^7 Q9 W3 [7 D! }( x4 K13        >ym_close(A2)
    $ [- I" j4 @2 M2 i! X5 lA11 将模型保存为”bankfull.pcf”,默认保存路径为[sAppHome]/store/predict。* @- u  W! b2 a. Z# C( Q. ^# M

    . \+ e# M/ I: _A12 将模型信息以json串形式返回。json内容详解可参考在线文档《json参数说明》( e: Y* f" u' ~% y8 H
    ) p% R5 w: e5 O* n
    A13 关闭环境,释放资源。$ h1 p. z* v7 F7 w  M9 G
    ' X9 O5 K* F, k6 V: J# |, Q  g4 `
    (5)预测
    : b* `. w9 U1 A# M6 v& A  o预测之前需要有pcf模型文件和预测数据集
    + ?! Y! d0 D) @8 _
    : p2 V# ^; ^4 J; d; p' AA, o! r, W) z  S1 @
    1        =ym_env()/ i/ q" k' F/ {$ J
    2        =ym_load_pcf("bankfull.pcf")
    + b; h) J& o0 T) V3        =file("bank-full2.csv").import@tc()
    3 z7 |' [0 Z7 L% L5 j' _4        =ym_predict(A2,A3)
    * j- I- X2 U, j" o5 u; H5        =ym_result(A3)
    8 @1 T: |, N, v; ?$ a6        =file("bank-full_result.csv").export@tc(A4)
    ' f+ k# ^# q3 G7        >ym_close(A1)7 }: K7 J- E+ @( Y
    A1 初始化环境
    + x, l: n; z4 z+ w. J
    2 i# N3 l9 j* y- Z# ?A2 导入pcf模型文件,生成pd模型对象。' X2 ]1 f0 z7 Y5 O' y) H6 h3 W3 x# J

    4 R8 k! @: L- P" e+ QA3 导入预测数据集,读成序表
    - O, N! v3 R3 E
    1 f6 Q9 d: |4 ^1 E" Q: ^A4 对序表数据执行预测。除序表外,还支持游标、csv文件和mtx文件,比如A4也可以直接写成ym_predict(A2,“bankfull2.csv”); g, Z7 x+ f* [4 @2 ?

    $ m2 C7 A: U0 q  O  B' iA5 获取预测结果
    : N3 Z+ w% n2 X0 F& _7 `
    " `$ x2 Q1 i0 J# N% ]. o/ `A6 将预测结果导出,在本例中预测结果为用户发生违约行为的概率。1 y% ^* B% d3 m6 i! }
    * D3 `1 l! s, t$ w& M

    " k- ^6 u; r* ]: QA7 关闭环境,释放资源& D/ l( C. k1 D; `: z
    9 ]# }9 `1 U1 M9 p
    4. 集成调用, y8 P) x; L& a& Q# o
    SPL还可以被上层应用集成调用,比如SPL可以嵌入到Java应用,详情请参考:http://c.raqsoft.com.cn/article/1615765346560/ g* |( ]+ x+ j/ ?
    ' |2 T# p7 W/ I# X# r2 Q
    总结* t/ a( |% E( V" l. m; ]4 b9 J
    使用SPL配合易明建模来实现数据建模预测非常简单,程序员不需要理解深奥的数学原理,只要准备好训练数据,简单几步就可以完成数据建模任务了。而且还可以轻松地把这个功能嵌入到应用程序中,高深的人工智能不再是少量数据科学家的专利。
    % E% @( N( {% L: e9 |8 b: w  d; l# J# G  _' l7 s
    SPL本来就超强的数据处理能力,能更方便地完成人工智能算法之前的数据准备工作,同时也提供了丰富的数学函数: SPL Math 例程,有些数学基础想自己实现建模过程的同学也可以进一步研究。
    " d/ {3 q* s9 H4 \————————————————5 w; H& S$ p4 u$ ]2 O  G4 t: @
    版权声明:本文为CSDN博主「java李杨勇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    + t, t3 v; ^) r6 ]- c' ]原文链接:https://blog.csdn.net/weixin_39709134/article/details/126698462
    ' y  l( O0 `7 Q
    : {3 O+ _/ d% T- {+ N2 V$ ?. V- C' T6 Z1 }+ s7 v
    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-5-26 05:17 , Processed in 0.457508 second(s), 51 queries .

    回顶部