我正在尝试使用pickle来保存我通过其他数据集生成的少量大型数据集。虽然转储它并没有给我任何错误但是当我尝试加载这些数据集pickle退出时出现eof错误。下面是我为保存数据集而运行的代码:
from scipy.stats.mstats import mode
trainingSetCustomers = pd.DataFrame({'visitFrequency': trainingSet.size(),'totalAmountSpent': trainingSet['amountSpent'].sum(),'totalProducts': trainingSet['productCount'].sum(),'firstVisit': trainingSet['visitDate'].min(),'lastVisit': trainingSet['visitDate'].max(),'visitType':trainingSet['visitType'].apply(f),'country': trainingSet['country'].apply(f),'isReferred':trainingSet['isReferred'].sum()}).reset_index()
p2 = pickle.Pickler(open("trainingSetCustomers.p","wb")) #finaldatasetYear1AndYear2 #trainingset groupedCustomersWithDates dfOrdersNew groupedCustomersNew
p2.clear_memo()
p2.dump(trainingSetCustomers)
print "Training Set saved" #Done
trainingResultSetCustomers = pd.DataFrame({'futureVisitFrequency': trainingResultSet.size(),'futureTotalAmountSpent': trainingResultSet['amountSpent'].sum(),'futureTotalProducts': trainingResultSet['productCount'].sum(),'firstVisit': trainingResultSet['visitDate'].min(),'lastVisit': trainingResultSet['visitDate'].max(),'visitType':trainingResultSet['visitType'].apply(f),'country': trainingResultSet['country'].apply(f),'isReferred':trainingResultSet['isReferred'].sum()}).reset_index()
p3 = pickle.Pickler(open("trainingResultSetCustomers.p","wb")) #finaldatasetYear1AndYear2 #trainingset groupedCustomersWithDates dfOrdersNew groupedCustomersNew
p3.clear_memo()
p3.dump(trainingResultSetCustomers)
print "trainingresult set saved" #Done
此操作没有任何错误并打印消息。 但是当我运行以下代码时:
trainingResultSetCustomers = pickle.load( open( "trainingResultSetCustomers.p", "rb" ) )
它给了我一个EoFError。我需要存储4种这样的测试集,我真的很困惑,为什么会发生这种情况。如果这有任何区别,我通过ssh在IPython笔记本上运行它。 此外,如果我只用5行尝试它,它可以很好地工作
数据结构:从代码中可以看出,此数据框是由分组对象的属性生成的。
这是我得到的错误:
EOFError Traceback (most recent call last)
<ipython-input-10-86d38895c564> in <module>()
5 p = pickle.Pickler(o) #finaldatasetYear1AndYear2 #trainingset groupedCustomersWithDates dfOrdersNew groupedCustomersNew
6 p.clear_memo()
----> 7 trainingset = pickle.load(o)
8 o.close()
9 print "done"
/usr/lib/python2.7/pickle.pyc in load(file)
1376
1377 def load(file):
-> 1378 return Unpickler(file).load()
1379
1380 def loads(str):
/usr/lib/python2.7/pickle.pyc in load(self)
856 while 1:
857 key = read(1)
--> 858 dispatch[key](self)
859 except _Stop, stopinst:
860 return stopinst.value
/usr/lib/python2.7/pickle.pyc in load_eof(self)
878
879 def load_eof(self):
--> 880 raise EOFError
881 dispatch[''] = load_eof
882
答案 0 :(得分:0)
如果没有一些测试代码和版本号,我唯一能看到的就是你正在使用pandas.Dataframe
个对象。这些人经常需要一些内置于pandas
内置酸洗方法的特殊处理。我相信pandas
同时提供to_pickle
和save
方法,它们为Dataframe
提供酸洗。请参阅:How to store data frame using PANDAS, Python
和内部的链接。
而且,根据您试图挑选的Dataframe
的大小以及依赖项的版本,它可能会遇到64位的酸洗错误。请参阅:Pickling a DataFrame。
此外,如果您通过ssh
发送序列化数据,您可能需要检查您是否遇到某种ssh
数据包限制。如果您只是通过ssh
执行代码,那么这不应该是一个潜在的问题。