是否有用于打开 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 模块?的主要内容,如果未能解决你的问题,请参考以下文章