QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1990|回复: 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 也不错7 @& L% F' a$ ?. x1 |/ S: C
    - m) z- \' |! `: p2 `/ p
    可用来做人工智能建模预测的工具非常多,比如Python, R, SAS,SPSS等,其中Python由于简单易学、丰富的数据科学库、开源免费等特点备受欢迎。但是对于不太熟悉数据建模算法的程序员来说,使用Python建模还是比较复杂,很多时候拿到数据并不清楚该做怎样的处理,选择什么样的算法。其实,在做数据分析和数据建模时,SPL也是不错的选择,它比Python更简单易用,计算速度也快,交互式的界面对数据分析十分友好,同时还提供自动数据建模功能和一些数据处理以及统计学函数,用起来也很方便。
    , x& M- X" R3 {& p, V# ^! j! K0 L0 a5 p9 s, X$ t& N
    下面就以一份用户贷款违约预测的数据为例,使用SPL手把手的进行数据建模预测。
    ) S2 z& s3 ?: l5 r
    ) n" w, b4 o" H: f4 _1. 确定目标,准备数据
    9 h3 b1 N8 l2 J1 ]建模预测就是从历史数据中挖掘出规律,然后使用规律对未来可能发生的事情做出预测。这个规律就是一般所说的模型。/ |" g) r& _0 U6 r
    ' [, F" J& T. g& M9 m# x: f6 ~6 d
    历史数据通常是一张我们俗称的宽表,比如在用户贷款违约预测的例子中历史数据是如下图这样的Excel表格:
    5 P; a( u. D. q) A; l' N4 Z  B0 P, a' l, d- C, r
    首先,宽表中一定要包括我们想预测的事情,通常称作预测目标,上图中的预测目标就是历史用户的违约行为,也就是图中y那一列,yes表示违约,no表示不违约。预测目标还可以是一个数值,比如产品的销量、售价……,或者是预测属于什么种类,比如预测产品质量是优、良、合格还是差。有时目标在原始数据里就有,可以直接使用,有时目标还需要人工标注。2 t. g- r6 o$ V4 p, v8 Q, O9 p9 D
    7 A' d6 G" @' M9 c  W
    除了预测目标外,这里还需要很多信息,如表中的用户年龄、工作,房产,贷款情况……,这里的每一列称为变量,也就是和贷款人将来是否违约可能会相关的信息,原则上能收集到的变量越多越好。例如预测客户是否会购买产品,可以搜集客户的行为信息,购物偏好,以及产品的特征信息,促销力度等;预测汽车保险理赔风险,需要保单数据,车辆信息、车主交通习惯以及历史理赔情况等等,如果是预测健康险还需要一些被保人的生活习惯,身体状况,就医看病的信息;预测商场超市的销售情况,需要历史的销售订单,客户信息,商品信息;预测不良产品,需要生产的工艺参数,环境,原料情况等数据。总之,收集到的相关信息越多,预测效果也会越好。
      Z( Y  @3 R" @8 A; S+ U$ q1 n2 I7 [3 T' D8 a6 O
    采集数据时,通常会截取某一段时期的历史数据来制作宽表,比如我们想预测7月份用户的违约情况,可以采集1-6月份的数据来训练建立模型。数据采集的时间范围并不是固定的,可以灵活操作,例如也可以是近1年或者近3个月等等。
    ; Q" ]( e. q$ F; g5 I3 Y7 P# x# o1 {3 U/ [7 z0 V0 |
    准备好的宽表可以是Excel格式或csv格式,第一行是标题,后面每一行都是一条历史记录。  N/ ~+ @; u5 P/ t" w7 W

    6 z3 q& X. T. w5 c4 X, Z如果企业有建设好的信息系统,那可以找IT部门要这些数据,很多企业的BI系统中可以直接导出这种数据。
    - D8 I* K+ Z+ r$ K% q
    & G6 p6 y. M4 O( x) H2. 下载软件,配置建模外部库0 a6 U" I- x3 f2 _
    SPL 在易明建模外部库的配合下可以提供全自动化的建模预测功能。
    7 F8 ]- c; ^# {* ~3 K' R4 w* \* o! {$ _$ L* c7 M
    (1)下载安装集算器(SPL)和易明建模软件
    . b6 F' P! g0 E1 g/ C集算器下载:. }$ M, a( L; _: G" F1 Q8 y1 a
    “http://c.raqsoft.com.cn/article/1595816810031”
    1 O, v( A; G' ~* x, x) j+ V" s. Q; J1 i% a  K
    易明建模下载: “http://www.raqsoft.com.cn/download/download-ymodel”
    2 C% K3 `/ E7 g2 u' f7 _/ O2 E  G% P7 a
    - d' X% l! Y' D  N9 c% ]安装集算器和建模软件,并记录安装目录,比如:C:\Program Files\raqsoft\ymodel. ]) T. o4 A  ]  v, m# O

    - M" t) ]# y; F+ ~& N5 t: Q1 |7 K3 g- N" `

    5 ~0 c9 U/ E/ g7 G(2)在SPL中配置外部库$ T. {% I/ j  t. m) ?
    (a)复制外部库所需要的文件0 m) y8 ^/ i$ A4 ^+ i/ b
    在易明建模的安装目录下找 YModelCil 和 lib 文件夹
      Z, W9 i4 X$ Z9 m
    1 p1 g3 r4 U2 _
    * ^" W9 t- `& V0 G! P; m; r* n4 d! l, z8 X9 _
    然后去这两个文件夹里找到建模外部库所需要的文件,复制到集算器目录(【安装根目录】\esProc\extlib\YModelCil),比如C:\Program Files\raqsoft\esProc\extlib\YModelCli。
    - x1 z8 J/ F7 M* D
    + N$ H, C& V5 A$ p建模外部库所需的文件有:# p) |$ i3 S- B3 P3 m

    / J6 ?/ {" `8 v0 g/ u5 o' z1>易明建模目录的YModelCil中含有以下jar和xml
    - Y6 x4 U4 Q+ Z) X, [" R, K+ S
    1 K, B, F% U  ~, |' x/ Pant-1.8.2.jar
    + O1 o; t! m" Jcommons-beanutils.jar- o5 h5 ?: e; |0 S/ @. g
    commons-lang-2.6.jar
    ) I7 b) X( M1 l4 M" eezmorph-1.0.2.jar
    " r( {9 W: k6 h) Ajson-lib-1.1-jdk13.jar7 f9 S9 p* i# D) s
    raq-ymodel-cli-2.10.jar
    ( H; Y9 V4 v2 c4 J$ u, ]7 luserconfig.xml9 |4 A& f6 K) o9 U3 m

    . R9 E, s/ `; {' L9 `# [5 ~1 z2>易明建模的lib中含有以下jar8 X* c$ E3 M! g1 R2 I; r7 a* O
    ; S0 L2 J" L# J- \
    commons-io-2.4.jar
    ' N* d5 O' _4 i/ R% H+ [esproc-ext-20211104.jar
    ; [0 e0 I( C' X/ kfastjson-1.2.58.jar+ n) L+ h7 ^* x7 i
    gson-2.8.0.jar3 f& U! ~9 @2 |! }5 U8 T) m
    jackson-annotations-2.9.6.jar& v9 O8 j5 B4 T/ P8 u
    jackson-core-2.9.6.jar' C" W! L; {0 T" \( o# Z
    jackson-databind-2.9.6.jar
    * Y8 W. `1 K! {6 h: b! w1 Pjackson-databind-2.9.6-sources.jar
    * S4 h1 g  l! ?) M# P9 zjackson-dataformat-msgpack-0.8.14.jar
    ' x! V+ N5 R- p) r# }mining.jar/ G) \5 N% V1 V1 R
    msgpack-0.6.12.jar
    5 W0 n& q- A/ k, W7 omsgpack-core-0.8.16.jar
    ! D/ S/ y" i: f: Z+ X
    % Z8 q3 a, L6 w" L1 y3 S' d8 c8 K(b)设置userconfig.xml文件参数( `  X+ H) h+ k; |- K
    在集算器目录esProc\extlib\YModelCil下的userconfig.xml文件中设置参数
    " E; ]0 s$ g6 c! D: [
    / y2 j1 D( E! B. ?6 A, l5 H- R名称        参数说明8 p$ q' I0 R* f% n
    sAppHome        易明建模的安装目录
    " X4 E* D# s+ usPythonHome        易明建模目录的Python路径 Windows: raqsoft\ymodel\Python37 Linux: raqsoft/ymodel/Python37/bin/python3.7
    4 x, K8 q. o: S( K5 fiPythonServerPort        Python服务网络端口" L! ?: a/ a; J' x3 O: X
    iPythonProcessNumber        Python进程数
    ) Y, k: C; r/ k: `; }9 Y3 o3 HbAutoDecideImpute        是否智能补缺
    & _; b) I! c& u$ C( V9 e2 giResampleMultiple        重抽样次数
    6 s5 y+ Z- X8 _7 ^# {其中必须要配置的参数为sAppHome和sPythonHome,其他参数可以采用默认值,有需要再进行修改。比如可以配置参数如下,加粗部分是必须要配置的,根据自己的安装路径。# n6 b, m3 A0 ?6 ~" k# |2 H

    ( c( C/ e& q1 Q& d. Y<?xml version="1.0" encoding="UTF-8"?>
    * u  ^/ T1 ~; l# T# R+ C# }<Config Version="1">
    5 W4 g5 q: y4 x! g; l    <Options>: f2 W0 c1 R9 |1 c; J  I
            <Option Name="sAppHome" Value="C:\Program Files\raqsoft\ymodel"/>! J5 j2 S8 f* ?3 B# L, ^7 w
                    <Option Name="sPythonHome" Value="C:\Program Files\raqsoft\ymodel\Python37\python.exe"/>
    3 ^6 V) }, u6 v) l; D                <Option Name="iPythonServerPort" Value="8510"/># r; ]% ]; t4 C
                    <Option Name="iPythonProcessNumber" Value="2"/>
    2 n$ K, ~! F8 i" H              <Option Name="bAutoDecideImpute" Value="true"/>
    " S2 ^6 M5 A+ O' a5 |2 V3 O                <Option Name="iResampleMultiple" Value="150"/>                               
    5 C; |( Z! t: t1 Q" N7 w8 U' q    </Options>
    3 J8 w! F7 M1 F) d+ c$ g</Config>
    + w2 ~& v- q8 s+ D: f1
    ' t. L9 A0 i+ R& [9 E! T21 e) D5 f# t  _) E7 N
    37 G1 K9 @" N( Q' ]" g, S
    4
    & _8 Y( f# v! {3 Z- j5
    " ^' N+ W: D& z60 w) U9 o0 f! m2 z: i
    7
    , k- C: @* Y; \0 n8/ ~/ a& v, n5 T4 u9 |! r5 e
    9
    + A/ G) d) q7 ?" R10' I4 {9 }  _0 `( X" I7 j" N1 ~
    11: G8 y8 L6 O. Q6 H" ?
    其实,从这里可以看出,易明建模也是基于Python写的,但它将Python算法做了封装后,程序员就不必再理解算法的数学原理和运行细节了。
    4 T0 ?' m( S9 r* t
    4 J0 B5 {( y5 J' p. _+ c* s& }/ X(c)SPL环境配置
    4 U4 [' Y8 ]1 U8 k6 g1>. 配置外部库
    , n  ~4 d$ P3 u: f) O# }
    ' T% ~' ]5 `4 P3 v打开SPL,在选项菜单里,外部库选择里勾选YModelCli,使其生效。外部库的路径为第(1)步骤中集算器YModelCli的安装路径。7 Z. \& w6 u* q# W0 w9 F
    4 P1 I* f! J/ g' `4 _0 l% f9 [

    # k2 u# |$ ~' r0 G+ P% z- S' k. j0 d" p1 G: d  {
    在无图形界面的服务器中去集算器的安装目录下esProc\config\raqsoftConfig.xml文件中进行配置外部库路径和名称。
    5 {- m; N( r, B, ^3 ?
    : \' X5 [* @/ f<extLibsPath>外部库路径7 g7 C& g" h! z) ]8 N* D
      @2 a" V! D; B/ u( @
    <importLibs>外部库名称(可多个)) q( n: U! B4 ?3 w: B" f0 Y
    * E9 t. U& b& @4 a
    2>. 线程数设置( ~' C% [' m$ L6 c8 s; Y- U

    ' R4 K6 M: `; t如果有并发预测,还需要在SPL设置“最大并行数”,也就是线程数。设置多少用户根据需求和机器情况自行设定。9 R5 D8 N, `' _3 g6 h

    # C# P* z5 M# w  V. \- ~4 c; f
    * U( Y! u9 X* S! M8 T$ R
    4 ]' T8 t3 G9 E+ W0 U2 n在无图形界面的服务器中去集算器的安装目录下esProc\config\raqsoftConfig.xml文件中进行配置。
    * [) U8 p2 \4 s% S0 W2 K- q$ L9 Q. `
    <parallelNum>最大并行数' `$ G" S* Z/ w# E1 I0 ~9 J+ M' @/ o

    & V; A& r% z" Q+ A' X到此,环境配置完成。
    5 c: i. F& x. {) {3 W% q6 R0 U, T9 u! X3 Q7 _2 A0 p% |: [" S8 A; b
    3. 建模和预测9 J! U- e4 c7 b( W! f8 D
    (1)加载数据: u2 k3 Q0 i- i8 s* [8 f$ ^/ H
    SPL能支持csv,excel或数据库中的数据用于建模,这里以csv为例,其它数据源类似。! ~4 L" @! [3 J0 x" D  m
    + G+ F0 c; c7 d* i
    设有一个贷款违约数据表如下,需要建模来预测新用户是否会发生违约行为。
    - n6 w$ k/ Q& X' z( z. C- N. ~7 K4 ]
    0 h. }' S4 i2 [$ C. K; o5 w. J( V
    ' G! B- C9 F1 I! o* q* R$ D( ~; p, g( ^) E
    文件命名为bank-full.csv;
    1 S! p! M9 E2 h+ w% ]! s, p$ A
    9 n+ ?) M1 d- K$ lA/ C; v$ V7 K, B8 B7 E
    1        =file("bank-full.csv").import@tc()3 k% H! R0 }- m  s
    2        =ym_env()
    % F0 O/ B  T, K# P* n1 x: r3        =ym_model(A2,A1)$ p3 o% ]# z/ d1 j  q* j0 k
    A1 导入建模数据,读成序表
    $ a6 D) z0 t/ v- [, P  D. |6 M( b7 C
    # d4 }' B! G9 T8 e- W' n; D2 R
    + W: e) F9 t) }# p
    ) W* a7 ~* m+ E# Z) C: bA2 初始化环境,执行A2后会在易明建模的安装目录下生成store目录及子目录用以保存数据及结果文件。7 x7 V' m" n# T5 Q+ s
    8 V, u: n( t, }$ m9 h: W$ E
    A3 加载建模文件,生成md对象) h8 m7 I4 e7 [8 |8 }, A! X/ \! e$ f
    & |5 ~2 Y  o5 ?2 m- W
    (2)目标变量设置和变量统计
    - w* m" q3 p- v3 P3 |5 M# [! \. E* ~数据加载进来后要设置目标变量8 d9 v% y  C( n" k; J
    ) y/ {0 G( j2 C- F1 E  O
    A
    6 X, k6 P1 y7 o3 ]" S% A…        …
    / l* L4 z" M9 t4        =ym_target(A3,"y")
    7 u& H  q7 s8 c1 i) `5        =ym_statistics(A3,"age")
    , D# w% ]( _2 M; r" ?1 S6        =A1.fname().(ym_statistics(A3,~))8 a! x5 y) V# O0 J" c
    A4 表示将字段“y”设置为目标变量,目标变量可以是二值变量或数值型变量。
    * g$ ?% `* [* k4 @" h& t
    * \' V/ K. R, R% h% `0 z, }A5 查看某个变量的统计指标,比如 “age”,返回值中可以看到缺失率,最大最小值,异常值,数据分布图等参数。& Q; K% d. K) X" \( S

    0 y5 M5 T8 z, y, O+ X! @. k% X% X  l0 _2 I+ u2 k% x

    2 ]+ g+ q3 P. y3 A; i  A3 [A6 循环变量名查看所有字段的统计信息,返回包含所有字段的统计信息二级序列。* z& \, h; h1 L1 O$ k; R* Y

    7 N3 K  o4 T: y3 C9 X' a" r! j. x, _$ O, c
    , b; Y' |6 p2 \$ n
    (3)建立模型和模型表现
    ) X2 Z# g& c; D$ o( EA8 A' @0 e; y. h5 Z0 z8 J" Y
    …        …
    9 O' |& R4 l+ o) d' ^- _* g7        =ym_build_model(A3)+ ]( o" a0 C% l  X- l8 ^! C1 W
    8        =ym_present(A7)
    4 r# {$ `: V/ T: I9        =ym_performance(A7)
    3 n/ f& [, m7 E5 A10        =ym_importance(A7).sort@z(Importance)# y$ n& g2 ]% @6 ?( W
    A7 使用建模函数建立模型,执行后在后台会进行全自动化数据预处理和建模过程,此过程会耗费一些时间,时间长短取决于数据量。结果返回pd模型对象。" F3 X, O" V/ N/ n. Y$ r  c, d
    " ~& E( ^3 X$ L3 \$ ]
    模型建好后,可以调用pd模型对象查看模型信息、模型质量和重要度。" a4 C# d8 y5 H2 T# ~

    - n+ J) X/ s9 ]9 V4 }0 h* K! uA8 返回模型AUC值及参数
      |, K1 i$ j; B: R( ^* G0 s3 j: \( [! z. a9 S6 \5 C

    0 [" z  z' K( d8 Z3 f9 s
    7 l) ~- y# O$ F: p8 ^% ]A9 返回多种模型指标和图形,诸如AUC,ROC, Lift……
    5 v7 r1 D3 n% d/ ]" @! |( N0 }0 z4 [5 B3 U$ ?

    # N& O8 S' U$ ^! c1 E# d3 o1 G
    " q0 [8 N0 i7 E9 w( B: P3 F比如点击A9的第6条记录的Value,然后点击右上角“图形浏览”图标,数值字段选择“Lift”,就可以查看Lift曲线; v6 D' d! D" Z% q
    ; Q( C: O8 @" f

    8 v9 U8 W: Z4 h! }' Y4 M2 v) d0 D3 q% ?- f9 N7 A+ N) ~0 ~
    A10 会返回每个变量对目标变量的影响程度并且按照重要度降序排列。数值越大对目标变量的影响程度越大。降序排列分析起来更加直观。# |$ T( B' q8 C! {/ |- w4 y
    * a! v( W0 c) _$ N; H3 O) s4 |

    & h& Y% D  ]* T) {- i  n7 q$ {7 F2 z. p0 b- |  ]' U( \, U# H$ D
    (4)保存模型7 p. y3 y8 I" j! G3 r
    A$ l* @/ ?+ k" S' a( T9 F* q
    …        …
    ! u" v! K$ B4 T; A6 ~% E" e11        =ym_save_pcf(A7,"bankfull.pcf")
    ! f) J' E6 D/ Y6 O3 D+ p12        =ym_json(A7)' r+ D2 K- \: |8 H
    13        >ym_close(A2)
    3 h7 ~2 x* c$ e, |! KA11 将模型保存为”bankfull.pcf”,默认保存路径为[sAppHome]/store/predict。
    1 x) B6 M3 {0 @3 {7 T: O1 r
    1 o% s( o, k0 F! d. LA12 将模型信息以json串形式返回。json内容详解可参考在线文档《json参数说明》9 C# o2 h, A* H2 A/ v+ s

    : L) Q+ [+ W8 H# xA13 关闭环境,释放资源。# M- B  Y! N' t2 `3 L0 `

    : ]. `) ^; n" @, |8 T(5)预测  I6 X- F* A) c# k8 [2 M
    预测之前需要有pcf模型文件和预测数据集
    2 P# j. a8 q6 m
    9 T$ U" S' @' c& H1 b- {A& _# P" r! B1 O( G, C. P
    1        =ym_env(). Y6 [: o/ p  }# B! [
    2        =ym_load_pcf("bankfull.pcf")! d1 L9 h# H0 N: g" C- K% y
    3        =file("bank-full2.csv").import@tc()6 b; w! v" |: \. F0 R6 C, L' |  C
    4        =ym_predict(A2,A3)
    + i3 i5 J% k' o2 {5        =ym_result(A3)$ B0 y: O8 i2 M/ k/ f
    6        =file("bank-full_result.csv").export@tc(A4)
      W5 a. B8 W& v) H7 [5 a7        >ym_close(A1)
    % B7 a' p* D' n; ?/ B. N# E1 LA1 初始化环境) s& g" [+ E3 B  h. g3 D

    - V/ J+ V& i) A% G0 aA2 导入pcf模型文件,生成pd模型对象。
    # _- c6 G0 A+ _$ X
    $ i& A8 l# i7 Z1 LA3 导入预测数据集,读成序表7 u3 |, Y/ t4 ~0 \( V1 E: d( o: {
    5 H1 ~7 M! m8 j( }! k+ b6 m
    A4 对序表数据执行预测。除序表外,还支持游标、csv文件和mtx文件,比如A4也可以直接写成ym_predict(A2,“bankfull2.csv”)& H  E7 _; M; y* ?! g7 @: }- F7 Y
    : Q4 c! B. h# G2 O" A7 N9 y
    A5 获取预测结果
    ! i' M/ H6 f; z* H7 f7 g: K
    " n1 y* }7 U: J3 H' h3 lA6 将预测结果导出,在本例中预测结果为用户发生违约行为的概率。
    # h$ W" I& j/ e; x
    3 b% J$ `$ I" x; M! f  \, f/ T0 J" {
    A7 关闭环境,释放资源
    , |- C2 c% N) i% H- K7 v
    5 w/ X) G( a/ r0 t/ y0 L5 f4. 集成调用$ N* E( s' E, F( f
    SPL还可以被上层应用集成调用,比如SPL可以嵌入到Java应用,详情请参考:http://c.raqsoft.com.cn/article/1615765346560) Q3 m: ?( u- _( v

    " _# ^8 L& `: Q" c  F$ I总结
    8 Y$ m, ^7 a* R% m0 t使用SPL配合易明建模来实现数据建模预测非常简单,程序员不需要理解深奥的数学原理,只要准备好训练数据,简单几步就可以完成数据建模任务了。而且还可以轻松地把这个功能嵌入到应用程序中,高深的人工智能不再是少量数据科学家的专利。5 S! q( j4 C" [( g

    2 u" M4 Y1 x/ N4 PSPL本来就超强的数据处理能力,能更方便地完成人工智能算法之前的数据准备工作,同时也提供了丰富的数学函数: SPL Math 例程,有些数学基础想自己实现建模过程的同学也可以进一步研究。1 q( m: x# w& u% P" M
    ————————————————$ @5 \+ l) w! H- d
    版权声明:本文为CSDN博主「java李杨勇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % b) `6 z3 j6 s  s原文链接:https://blog.csdn.net/weixin_39709134/article/details/126698462
    1 a" i/ T& K, |
    / b" d* e1 M; y2 m; M/ p
    5 `$ M0 A4 ]7 l
    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-4-10 23:33 , Processed in 0.370168 second(s), 51 queries .

    回顶部