Python 熊猫用大的.dta文件读取_stata()
我使用的是一个大约3.3g字节的Stata.dta文件,所以它很大,但不会太大。我对使用IPython感兴趣,并尝试使用Pandas导入.dta文件,但出现了一些问题。我的盒子有32 GB的RAM,试图加载.dta文件会导致所有的RAM都被使用(大约30分钟后),我的电脑会熄火。这“感觉”不对,因为我可以使用外部包中的read.dta()在R中打开文件,没有问题,在Stata中使用该文件也可以。我使用的代码是:Python 熊猫用大的.dta文件读取_stata(),python,pandas,stata,Python,Pandas,Stata,我使用的是一个大约3.3g字节的Stata.dta文件,所以它很大,但不会太大。我对使用IPython感兴趣,并尝试使用Pandas导入.dta文件,但出现了一些问题。我的盒子有32 GB的RAM,试图加载.dta文件会导致所有的RAM都被使用(大约30分钟后),我的电脑会熄火。这“感觉”不对,因为我可以使用外部包中的read.dta()在R中打开文件,没有问题,在Stata中使用该文件也可以。我使用的代码是: %time myfile = pd.read_stata(data_dir + 'm
%time myfile = pd.read_stata(data_dir + 'my_dta_file.dta')
我在Enthough的天篷计划中使用了IPython。之所以使用“%time”,是因为我有兴趣将其与R的read.dta()进行基准测试
我的问题是:
.dta
文件导出到.csv
,然后使用中的读取csv()
。事实上,您可以使用新创建的.csv
文件,将其用作R的输入,并与pandas进行比较(如果感兴趣的话)<代码>读取csv可能比读取stata
进行了更多的测试
运行
help outsheet
以了解导出的详细信息。对于所有在此页面结束的用户,请将Pandas升级到最新版本。我在加载过程中遇到了一个死机计算机的问题(300 MB的Stata文件,但只有8 GB的系统ram),从v0.14升级到v0.16.2很快就解决了这个问题
目前,它是V0.16.2。虽然我不知道具体细节,但速度有了显著的提高。请参阅:这里有一个对我来说很方便的小功能,它使用了一些最初提出问题时可能不可用的功能:
def load_large_dta(fname):
import sys
reader = pd.read_stata(fname, iterator=True)
df = pd.DataFrame()
try:
chunk = reader.get_chunk(100*1000)
while len(chunk) > 0:
df = df.append(chunk, ignore_index=True)
chunk = reader.get_chunk(100*1000)
print '.',
sys.stdout.flush()
except (StopIteration, KeyboardInterrupt):
pass
print '\nloaded {} rows'.format(len(df))
return df
我用它在100分钟内加载了一个11G Stata文件,如果我厌倦了等待并点击了cntl-c
,我就可以玩它了
.您不应该将3GB以上的文件读入内存中的数据对象,这会导致灾难(与熊猫无关)。 正确的方法是mem映射文件并根据需要访问数据
您应该考虑将您的文件转换为更合适的格式(<代码> CSV 或<代码> HDF),然后您可以使用围绕BANDAS DATAFRAM的包装器按需要加载块:
from dask import dataframe as dd
# If you don't want to use all the columns, make a selection
columns = ['column1', 'column2']
data = dd.read_csv('your_file.csv', use_columns=columns)
这将透明地处理数据块加载、多核数据处理和所有这些问题。有一种更简单的方法可以使用Pandas的内置函数
read\u stata
解决这个问题
import pandas as pd
reader=pd.read_stata("large.dta",chunksize=100000)
df = pd.DataFrame()
for itm in reader:
df=df.append(itm)
df.to_csv("large.csv")
假设您的大文件名为large.dta
import pandas as pd
reader=pd.read_stata("large.dta",chunksize=100000)
df = pd.DataFrame()
for itm in reader:
df=df.append(itm)
df.to_csv("large.csv")
你用的是64位的机器吗。您的R可能是64位版本,Python是32位版本吗?在您的特定情况下,
hdf
将是比csv
更好的格式