IBM
SPSS Statistics 是目前世界上应用最广泛的专业数据预测统计分析软件。它不仅为用户提供了丰富的算法来完成各种各样的统计分析任务,还提供了可编程插件。本文通过实例描述如何一步步得将
SPSS 的统计分析功能集成到 J2EE 应用程序当中,读者可以在较短时间内了解如何通过结合 Python
Plug-in 和 Web Service 的平台中立性,将 SPSS Statistics 强大的统计分析功能集成到企业应用程序当中,为企业的业务分析,数据挖掘和商务智能提供强有力的支持。
简介
IBM SPSS Statistics 统计分析预测软件是一款在调查统计行业,市场研究,医学统计,政府和企业的数据分析应用中久享盛名的统计分析工具,是世界上最早的统计分析软件,全球约有
28 万家产品用户,他们分布于通讯,医疗,银行,证券,保险,制造,商业,市场研究,科研教育等多个领域和行业,是目前世界上应用最广泛的专业数据预测统计分析软件。
IBM SPSS Statistics 不仅为用户提供了丰富的算法来完成各种各样的统计分析任务,还提供了可编程插件
: 包括 Python plug-in,R plug-in 和 Microsoft .NET plug-in。通过使用
Python 插件可以启动 Statistics 后台程序,在 Python 中读取和写入数据文件,调用
SPSS Statistics 的统计分析功能,并输出 Statistics,数据库,EXCEL,CSV
等格式的文件。通过结合 Python Plug-in 和 Web Service 的平台中立性,可以将
SPSS Statistics 强大的统计分析功能集成到企业应用程序当中,为企业的业务分析,数据挖掘和商务智能提供强有力的支持,帮助企业进一步提高决策有效性。
本文将用实例描述如何一步步得将 SPSS 的统计分析功能集成到 J2EE
应用程序当中。
搭建开发环境
我们首先搭建如下开发环境以用 Web Service 和 Python
插件集成 IBM SPSS Statistics:
1.SPSS Statistics Server 19.0: SPSS
Statistics 从 16.0 版本开始支持 Python plug-in, 这些插件都是基于 Python
2.6 的。2009 年 IBM 收购 SPSS 公司之后,IBM SPSS Statistics 成为
IBM 商业智能分析优化解决方案的重要组成部分,当前最新的发布版本是 19.0 多国语言版,其集成插件依然基于
Python 2.6。
2.Python 2.6: Python 语言的开发运行环境,自带 IDE,可以从
Python 的官网上获取 windows 安装包,和 Statistics Server19.0 交互的
Python 版本号为 2.6。
3.SPSS Statistics Python Essentials
19.0: Python 和 SPSS 集成的插件包,安装该包后可以通过 Python 编程调用 SPSS
的统计分析功能。安装该包以前必须安装好同版本的 SPSS Statistics Server 和 Python
环境。
4.PyXML: PyXML 是 Python 中的一个 XML 工具集,里面包括有很多处理
XML 文档的程序,如 PySAX,Expat 和 xmlproc 等。Python 通过该套工具能很好地处理
xml 文档,是 ZSI 安装成功的前提条件,该包的版本和 Python 版本一致才能成功安装。另外,该包中一些程序涉及到对
C/C++ 函数库的调用,需要有 VC 的编译环境,若程序中出现此类错误:
清单 1. 使用 PyXML 时出现的一类错误
Error: Python was built with Visual Studio version 7.1, and extensions need to be built with the same version of the compiler, but it isn ’ t installed. |
需安装 VS2003 或者是 MinGW 作为编译器。打开 Python 编译器,出现如下版本信息,说明安装成功:
清单 2. 打开 Python 编译器出现的版本信息
IDLE 2.6.4 >>> import xml >>> xml.__version__ ‘ 0.8.4 ’ >>> |
5.Fpconst: Fpconst 是一系列支持 IEEE754 double-precision
特殊值的常量和函数。提供了对 Not-a-Number (NaN), Positive Infinity
(Inf) 和 Negative Infinity (-Inf) 等特殊值得支持,这是 SOAP 数据类型规范的组成部分。Fpconst
0.7 以后的版本可以支持 Python2.6。安装成功会出现下列版本信息:
清单 3. Fpconst 安装成功后列出的版本信息
>>> import fpconst >>> fpconst. __version__ ‘ 0.7.2 ’ >>> |
6.SOAPpy:Python 的 SOAP 包,从 SourceForge
下载包安装以后需要修改“SOAPpy-0.11.5\SOAPpy” 目录下的 server.py,types.py,__init__.py
和 Client.py 这些文件。将这些文件里的 import 语句移动至首行,然后用命令行将该包安装至
Python 2.6 的 lib 库中。安装成功后出现下列版本信息:
清单 4. SOAPpy 安装成功后列出的版本信息
>>> import SOAPpy >>> SOAPpy. __version__ ‘ 0.11.5 ’ >>> |
7.SI:实现 Python Web Service 发布和 SOAP
消息通信机制的包。成功安装 SOAPpy 和 PyXML 后,可以安装 ZSI 包。从 SourceForge
网站上下载 ZSI 2.0 即可:
图 1. 安装 ZSI 包
8.Eclipse WTP 和 Pydev:Eclipse 的 J2EE
开发工具以及 Python 项目的插件包 Pydev,从官网下载即可。
9.SOAPUI:Web Service 的测试工具 , 通过该工具可以验证服务的正确性,从
Sourceforge 网站下载即可。
使用 Python plug-in 调用 SPSS 功能
以一元回归的调用和处理为例进行说明。编写 Python 脚本,通过 Python Integration
plug-in 驱动 SPSS 对指定路径处 EXCEL 文件进行一元回归计算,生成 EXCEL 报表;并对
EXCEL 报表处理,提取需要值,如清单 5 所示:
清单 5. 使用 Python plug-in 调用 SPSS 样例
import xlrd import spss
def spss_regression(filepath):
string1="GET DATA /TYPE =XLS /FILE ="+"'"+filepath
+"'"+
" /SHEET=name 'sheet1' /CELLRANGE=range 'A1:B195'
/READNAMES=on."
print string1
spss.Submit(string1)
# 计算一元线性回归贝塔值 COEFF
# 将结果写回 excel 文件
string3="OMS /DESTINATION
FORMAT= XLS
OUTFILE='C:/pythonResults.xls'. \n
REGRESSION /MISSING LISTWISE /STATISTICS COEFF
/DEPENDENT=y /METHOD=ENTER x. \n
OMSEND."
spss.Submit(string3)
filename = 'C:\pythonResults.xls'
excel = xlrd.open_workbook(filename)
sheet = excel.sheet_by_index(0)
beta=sheet.cell(27,4)
return beta |
Xlrd 是对 Excel 进行处理的 Python 包,可以通过 SourceForge 网站下载。
上述程序定义了一元回归的计算方法。首先引入 SPSS Statistics 包,然后根据 SPSS Statistics
的语法规范编写读取数据的命令语句 stringGetData,并通过 spss.Submit(stringGetData)
的方法驱动 SPSS Statistics。实现读取指定路径下文件,将数据保存在当前默认 Active
DataSet 的功能。stringOutput 语句定义了将当前 Active DataSet 进行的函数处理方法和输出的路径。SPSS
Statistics 的命令调用语法可以查阅 SpssSyntaxBook。
为服务编写 WSDL 文件
本文提供一个服务做为示例,服务的输入参数是文件路径,输出参数是文件中自变量和因变量的一元线性回归 Beta
值。根据提供的服务编写 WSDL 文件,如清单 6 所示:
清单 6. 为服务编写 WSDL 文件样例
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/NewWSDLFile/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="regression" targetNamespace="http://www.example.org/NewWSDLFile/"> <wsdl:types> <xsd:schema targetNamespace="http://www.example.org/NewWSDLFile/"> <xsd:element name="getBeta"> <xsd:complexType> <xsd:sequence> <xsd:element name="filepath" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="getBetaResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="beta" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types> <wsdl:message name="getBetaRequest"> <wsdl:part element="tns:getBeta" name="parameters"/> </wsdl:message> <wsdl:message name="getBetaResponse"> <wsdl:part element="tns:getBetaResponse" name="parameters"/> </wsdl:message> <wsdl:portType name="regression"> <wsdl:operation name="getBeta"> <wsdl:input message="tns:getBetaRequest"/> <wsdl:output message="tns:getBetaResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="regressionSOAP" type="tns:regression"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getBeta"> <soap:operation soapAction="http://www.example.org/NewWSDLFile/getBeta"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="regression"> <wsdl:port binding="tns:regressionSOAP" name="regressionSOAP"> <soap:address location="http://www.example.org/"/> </wsdl:port> </wsdl:service> </wsdl:definitions> |
利用 ZSI 实现和发布 Python Web Service
成功安装 ZSI 包之后,在 Python 的安装目录下会生成 Scripts 文件夹,该文件夹下包含
2 个文件,wsdl2py 和 wsdl2dispatch, 如图 2 所示:
图 2. 安装 ZSI 包之后 Python
的安装目录下 Scripts 文件夹
将这 2 个文件的后缀名更改为 wsdl2py.py 和 wsdl2dispatch.py。
图 3. 改变以上 Scripts 文件夹下的文件的后缀名
将编写好的服务 WSDL 文件拷至该目录下,并启用命令行进行服务端构建 , 如图 4 所示:
4. 启用命令行进行服务端构建
Warning 提示的版本问题可以忽略。运行完命令后可生成文件 regression_services.py,regression_services_types.py
和 regression_services_server.py,这三个文件共同构成了服务端的代码框架。其中
regression_services_server.py 提供了我们构建服务的入口,要提供完整的服务编写文件实现
regression_services_server.py 中定义的方法即可 , 如清单 7 所示 :
清单 7. 文件 regression_services_server.py 的代码片段
def __init__(self, post='/', **kw): ServiceSOAPBinding.__init__(self, post) def soap_getBeta(self, ps): self.request = ps.Parse(getBetaRequest.typecode) return getBetaResponse() soapAction['http://www.example.org/NewWSDLFile/getBeta'] = 'soap_getBeta' root[(getBetaRequest.typecode.nspname,getBetaRequest.typecode.pname)] = 'soap_getBeta' |
为了实现调用一元回归的功能,编写 regressionImpl.py 继承并实现 regression_services_sever
中定义的 soap_getBeta 功能:
清单 8. 编写 regressionImpl.py 实现一元回归调用
def __init__(self, post='/', **kw): ServiceSOAPBinding.__init__(self, post) def soap_getBeta(self, ps): self.request = ps.Parse(getBetaRequest.typecode) return getBetaResponse() soapAction['http://www.example.org/NewWSDLFile/getBeta'] = 'soap_getBeta' root[(getBetaRequest.typecode.nspname,getBetaRequest.typecode.pname)] = 'soap_getBeta' |
服务实现完成以后可以利用 ZSI 包自带的 ServiceContainer 对服务进行发布,如清单
9 所示:
清单 9. 利用 ZSI 包自带的 ServiceContainer 对服务进行发布
from ZSI.ServiceContainer import AsServer from regressionImpl import regressionImpl from ZSI import dispatch if __name__=="__main__": port = 8888 AsServer(port,(regressionImpl('getBeta'),)) |
通过运行此脚本,可以将服务发布至本机的 8888 端口,路径为:http://localhost:8888/getBeta?wsdl。
利用 Web Service 将 SPSS Statistics 功能集成至
J2EE 应用程序
服务发布并利用 SOAPUI 测试确保正确性以后,可利用 Eclipse 快速构建本地客户端,将 SPSS
Statistics 功能集成至 J2EE 应用程序当中。
我们首先新建一个 Dynamic Web Project,命名为 SpssIntegration:
图 5. 在 Eclipse 中新建一个
Dynamic Web Project 工程
然后新建一个 Web Service Client 文件,如图 6 所示:
图 6. 在 Eclipse 中新建一个
Web Service Client 文件
然后输入服务地址:http://localhost:8888/getBeta?wsdl
图 7. 在 Eclipse 中输入服务地址
Eclipse 会生成下列文件,如图 8 所示:
图 8. 在 Eclipse 中生成的文件
其中 ServiceLocator 用来定位服务,SOAPStub 是本地桩,用来和远程交互,通过 ServiceLocator
返回 SOAPStub,即可和远程 Web Service 进行交互,测试代码如清单 10 所示:
清单 10. 测试代码样例
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Regression_ServiceLocator sl=new Regression_ServiceLocator();
try {
Regression_PortType pt=(Regression_PortType)sl.getregressionSOAP();
try {
String beta=pt.getBeta("c:\\python.xls");
System.out.println(beta);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} |
更换文件路径,运行此段代码,即可得到 Web Service 的调用结果。
|