要资料 文章 文库 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
 
  
每天15篇文章
不仅获得谋生技能
更可以追随信仰
 
 
     
   
分享到
使用 Web Service 集成 IBM SPSS Statistics
 
作者 Casimir Saternos,火龙果软件    发布于 2014-06-03
 

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 的调用结果。

相关文章 相关文档 相关视频



我们该如何设计数据库
数据库设计经验谈
数据库设计过程
数据库编程总结
数据库性能调优技巧
数据库性能调整
数据库性能优化讲座
数据库系统性能调优系列
高性能数据库设计与优化
高级数据库架构师
数据仓库和数据挖掘技术
Hadoop原理、部署与性能调优
 
分享到
 
 
     


MySQL索引背后的数据结构
MySQL性能调优与架构设计
SQL Server数据库备份与恢复
让数据库飞起来 10大DB2优化
oracle的临时表空间写满磁盘
数据库的跨平台设计
更多...   


并发、大容量、高性能数据库
高级数据库架构设计师
Hadoop原理与实践
Oracle 数据仓库
数据仓库和数据挖掘
Oracle数据库开发与管理


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...   
 
 
 
 
 
每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号