【问题标题】:dump and load a dill (pickle) in two different files在两个不同的文件中转储和加载莳萝(泡菜)
【发布时间】:2016-07-19 00:28:01
【问题描述】:

我认为这对许多知道如何处理泡菜的人来说很重要。但是,在尝试了几个小时后,我仍然不能很好地做到这一点。我有以下代码:

在第一个文件中

import pandas as pd

names = ["John", "Mary", "Mary", "Suzanne", "John", "Suzanne"]
scores = [80, 90, 90, 92, 95, 100]

records = pd.DataFrame({"name": names, "score": scores})
means = records.groupby('name').mean()

def name_score_function(record):
    if record in names:
        return(means.loc[record, 'score'])

import dill as pickle
with open('name_model.pkl', 'wb') as file:
    pickle.dump(means, file)

第二个文件

我想加载我在第一个文件中的内容,并通过函数 name_model(record) 使一个人(即 John、Mary、Suzanne)的分数可调用:

import dill as pickle
B = pickle.load('name_model.pkl')

def name_model(record):
    if record in names:
        return(means.loc[record, 'score'])

这里显示错误:

File "names.py", line 21, in <module>
B = pickle.load('name_model.pkl')
File "/opt/conda/lib/python2.7/site-packages/dill/dill.py", line 197, in load
pik = Unpickler(file)
File "/opt/conda/lib/python2.7/site-packages/dill/dill.py", line 356, in __init__
StockUnpickler.__init__(self, *args, **kwds)
File "/opt/conda/lib/python2.7/pickle.py", line 847, in __init__
self.readline = file.readline
AttributeError: 'str' object has no attribute 'readline'

我知道错误来自我对泡菜缺乏了解。我会虚心接受您的意见以改进此代码。谢谢!!

更新 我想实现的更具体的事情:

我希望能够使用我在第一个文件中编写的函数并将其转储,然后在第二个文件中读取它并能够使用此函数查询记录中任何人的平均分数.

这是我所拥有的:

import pandas as pd

names = ["John", "Mary", "Mary", "Suzanne", "John", "Suzanne"]
scores = [80, 90, 90, 92, 95, 100]

records = pd.DataFrame({"name": names, "score": scores})
means = records.groupby('name').mean()

def name_score_function(record):
if record in names:
    return(means.loc[record, 'score'])

B = name_score_function(record)

import dill as pickle
with open('name_model.pkl', 'wb') as file:
    pickle.dump(B, file)

with open('name_model.pkl', 'rb') as file:
    B = pickle.load(f)

def name_model(record):
   return B(record)

print(name_model("John"))  

当我执行这段代码时,我有这个错误File "test.py", line 13, in <module> B = name_score_function(record) NameError: name 'record' is not defined

非常感谢您的帮助和耐心。

【问题讨论】:

  • 嗯,record 未定义是您的代码。它是函数参数的名称,在全局命名空间中没有绑定到该名称。

标签: python pandas pickle dill


【解决方案1】:

谢谢。看起来下面的方法可以解决问题。

import pandas as pd

names = ["John", "Mary", "Mary", "Suzanne", "John", "Suzanne"]
scores = [80, 90, 90, 92, 95, 100]

records = pd.DataFrame({"name": names, "score": scores})
means = records.groupby('name').mean()

import dill as pickle
with open('name_model.pkl', 'wb') as file:
    pickle.dump(means, file)

with open('name_model.pkl', 'rb') as file:
    B = pickle.load(file)

def name_score_function(record):
    if record in names:
        return(means.loc[record, 'score'])

print(name_score_function("John"))

【讨论】:

    【解决方案2】:

    嗯。你需要按照你写它的方式来阅读它——将它嵌套在一个开放的子句中:

    import dill as pickle
    with open('name_model.pkl' ,'rb') as f:
        B = pickle.load(f)
    

    【讨论】:

    • 啊,我明白了。谢谢!!
    • 然而,在第二个文件中,当我运行它时,它显示NameError: global name 'city' is not defined 这是否意味着我也应该选择数据框?
    • @Hsun-YiHsieh 哪个城市?
    • 嗨,@eafit,对不起。这是我的错。我希望能够查询出现在means 中的任何可能的名称。具体来说,希望在第二个文件中写一个函数,结构为def name_model(record): return
    猜你喜欢
    • 2019-11-13
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多