是否有用于打开 SPSS 文件的 Python 模块?

Posted

技术标签:

【中文标题】是否有用于打开 SPSS 文件的 Python 模块?【英文标题】:Is there a Python module to open SPSS files? 【发布时间】:2013-01-16 19:22:18 【问题描述】:

是否有用于 Python 的模块来打开 IBM SPSS(即 .sav)文件?如果有最新的东西不需要任何额外的 dll 文件/库,那就太好了。

【问题讨论】:

Exporting to SPSS files in Python Django? 的可能重复项如果您愿意,还有一个 recipe 处于活动状态 嗨,巴库留。它不是重复的,因为我没有引用 Django 框架,我说的是打开,而不是导出/写入文件,并且我提到了对不需要外部库/dll 的最近的东西的偏好。这些问题之间有一些共同点,但它们可以引发不同的以及相似的回答。感谢您的链接,但如果可能的话,我再次尝试避免使用 dll 文件。 另一个答案引用了Django,但实际上与它无关。由于导出需要能够写入文件,因此您也可以读取它的机会很高。阅读周围我坚信您只有一个选择:使用 IBM 发布的.dll。我找不到该文件格式的任何开放规范,这意味着读取这些文件的唯一方法是使用 IBM 的库。您总是可以尝试对格式进行逆向工程,但这需要更多的时间和精力。 谢谢,巴库留。很不幸,但正如您所说,IBM 的 .dll 版本看起来很可能是要使用的东西。 【参考方案1】:

我发布了一个 python 包“pyreadstat”,它可以读取 SPSS(sav、zsav 和 por)、Stata 和 SAS 文件。它是 C 库 ReadStat 的包装器,因此速度非常快。 Readstat 是 R 库 Haven 后面使用的库,应用广泛,非常健壮。

包是自动包含的。它不需要使用 R(不需要安装额外的应用程序)并且不依赖于 IBM dll 或其他外部库。

例如,为了读取 SPSS sav 文件,您可以:

import pyreadstat

df, meta = pyreadstat.read_sav("/path/to/sav/file.sav")

df 是一个熊猫数据框。 Meta 包含元数据,例如变量标签或值标签。 read_sav 读取 sav 和 zsav(压缩)文件。还有一个函数 read_por 用于旧的 por(便携式)文件。

你可以在这里找到它:https://github.com/Roche/pyreadstat

【讨论】:

这就是我喜欢 Python 的原因。搞砸了很多地方,最后想到让我们使用Python。它第一次奏效。谢谢。 性能惊人的神奇库!非常感谢。 我迟到了,但是我想加两分钱。对我来说,我在一个远程服务器上工作,我偶尔会在尝试 pip 安装新包等时破坏一些东西,所以scipy.io 中的readsav 函数对我有用,并且已经包含在内.使用pandas.rpy.common 的另一个最佳答案对我也不起作用,因为显然这不是rpy 包含的属性。 @StevenThomas 注意到 scipy.io.readsav 读取和 IDL sav 文件,而不是 SPSS sav 文件(此线程的主题)。 IDL 是一个完全不同的编程环境。 Pyreadstat 不读取 IDL 文件,只读取 SPSS。 @OttoFajardo 感谢您的澄清,我没有意识到有不同类型的 .sav 文件。也许我应该删除我的评论?【参考方案2】:

取决于您想要做什么——使用来自rpy2 的与 R 相关的命令处理数据,或者切换到 Python——相关线程上的solution provided by @Spacedman 可能很容易适应您的需要。

否则,Pandas 包含 convenient wrapper for rpy2。下面是使用 Peat 和 Barton 的 weights.sav 数据集的示例:

>>> import pandas.rpy.common as com
>>> filename = "weights.sav"
>>> w = com.robj.r('foreign::read.spss("%s", to.data.frame=TRUE)' % filename)
>>> w = com.convert_robj(w)
>>> w.head()
     ID  WEIGHT  LENGTH  HEADC  GENDER  EDUCATIO              PARITY
1  L001    3.95    55.5   37.5  Female  tertiary  3 or more siblings
2  L003    4.63    57.0   38.5  Female  tertiary           Singleton
3  L004    4.75    56.0   38.5    Male    year12          2 siblings
4  L005    3.92    56.0   39.0    Male  tertiary         One sibling
5  L006    4.56    55.0   39.5    Male    year10          2 siblings

【讨论】:

【参考方案3】:

作为后来人们发现的注释(像我一样):pandas.rpy已在最新版本的 pandas (>0.16) 中被弃用,如 here 所述。该页面包含有关更新代码以使用rpy2 接口的信息。

【讨论】:

感谢分享。所以com.convert_robj(rdf) 应该替换为pandas2ri.ri2py(rdf)。但是com.robj.r('foreign::read.spss("%s", to.data.frame=TRUE)' % filename)呢?【参考方案4】:

当您拥有 pandas >= 0.25.0 后,您现在终于可以只做pd.read_spss()

# you need pandas >= 0.25.0 for this    
import pandas as pd
df = pd.read_spss('your_spss_file.sav')

这需要库 pyreadstat,因此您可能必须先安装它:

pip install pyreadstat

关于pd.read_spss()的参数的额外信息:

参数 ----------路径:字符串或路径 文件路径

usecols:类似列表,可选 返回列的子集。如果没有,则返回所有列。

convert_categoricals : bool,默认为 True 将分类列转换为 pd.Categorical。

退货 ------- 数据帧

【讨论】:

【参考方案5】:

但是使用 IBM 库的好处是他们可以正确地获得这种相当复杂的二进制文件格式。它们是免费的,减轻您为这种格式编写代码的负担,并且许可证允许您重新分发它们。你还能问什么?

【讨论】:

我会要求 ARM 支持 :) 在哪里可以找到 IBM 库? 您可以通过点击 IBM Predictive Analytics 社区站点 (developer.ibm.com/predictiveanalytics) 上的下载链接来获取它们【参考方案6】:

这里有你可能感兴趣的包

Bitbucket 上的savReaderWriter

savReaderWriter 3.4.2 在 Python 包索引存储库中

【讨论】:

【参考方案7】:

我和@Pyderman 有同样的问题,关于如何为熊猫更新这个 (>0.16)。这是我想出的:

from rpy2.robjects import pandas2ri, r
filename = 'weights.sav'
w = r('foreign::read.spss("%s", to.data.frame=TRUE)' % filename)
df = pandas2ri.ri2py(w)
df.head()

【讨论】:

【参考方案8】:

也许您会觉得这很有用:http://code.activestate.com/recipes/577811-python-reader-writer-for-spss-sav-files-linux-mac-/

【讨论】:

谢谢,SM,但该模块需要一个额外的 dll 文件,而这是我试图避免的。是否有一个模块(最好是最新的)包含所有必要的功能而不使用外部库? 没有一个我知道或无法使用谷歌找到的,抱歉。为什么使用您无法忍受的外部库?我想你每天都会使用很多,无论是 Python 还是其他任何东西,包括操作系统。 如果其他选项用尽,我不排除使用 dll 的可能性,但如果可能的话,我想避免这种情况。依赖项越少,事情就越干净,出错的可能性就越低。 而且不太可能做对,Lamps1829。 IBM 为运行 SPSS Statistics 的所有平台免费提供的 i/o 模块使用的代码与 Statistics 本身使用的代码相同,因此可以保证它们是同步的。并且上面提到的 Python 读取器/写入器实用程序也使用这些库。这些库也会随着新闻功能添加到 sav 文件格式而更新。 R 库,我上次查看时并没有得到正确的结果。【参考方案9】:

您可以使用python interface to R,然后在library(foreign) 中使用read.spss 导入数据。

【讨论】:

以上是关于是否有用于打开 SPSS 文件的 Python 模块?的主要内容,如果未能解决你的问题,请参考以下文章

SPSS中的转置

spss交互项检验如何做?

spsst检验怎么做

spss13.0安装后不能打开文件。说是少了序列号啥的。重新安装了很多遍都没用,不知道是怎么回事?

spss分析方法-卡方检验

spss数据库打开只有一个视图