Verance
Verance

Reputation: 127

Change the imported libraries of a saved pickle

Some time ago I saved a class function into a pickle file.

<library.module.Class at 0x1c926b2e520>

That class imports two libraries that changed their name meanwhile.

Is it possible to edit the pickle file so I can update those 2 new imports without regenerating the pickle all over again?

Thank you! Regards

EDIT:

This is how I am loading the pickle:

import pickle
model_path = os.getenv('MODELS_FOLDER') + 'model_20210130.pkl'
model = pickle.load(open(model, 'rb'))

This of the pickle class content. The two libraries I want to update are pinpointed.

**import socceraction.spadl.config** as spadlconfig
**from socceraction.spadl.base import** SPADLSchema

class ExpectedThreat:
    """An implementation of the model.

    """

    def __init__(self):
...
     

    def __solve(
        self) -> None:
        

    def fit(self, actions: DataFrame[SPADLSchema]) -> 'ExpectedThreat':
        """Fits the xT model with the given actions."""

        

    def predict(
        self, actions: DataFrame[SPADLSchema], use_interpolation: bool = False
    ) -> np.ndarray:
        """Predicts the model values for the given actions.

        

Upvotes: 3

Views: 269

Answers (1)

SystemSigma_
SystemSigma_

Reputation: 1435

I don't think you can do that.

Pickled objects are serialized content, and in order to be modified, it must be de-serialized properly.

Why can't you just load it, change it, and overwrite it?

You can still overwrite functions like properties with new ones:


# import new libraries
import new_socceraction.spadl.config as new_spadlconfig
from new_socceraction.spadl.base import new_SPADLSchema

import pickle

model_path = os.getenv('MODELS_FOLDER') + 'model_20210130.pkl'

with open(model_path, 'rb') as file:
    model = pickle.load(file)

# define new methods with different libraries 

def fit(self, actions: DataFrame[new_SPADLSchema]) -> 'ExpectedThreat':
    """Fits the xT model with the given actions."""
    pass # your new implementation
   
def predict(
        self, actions: DataFrame[new_SPADLSchema], use_interpolation: bool = False
    ) -> np.ndarray:
    """Predicts the model values for the given actions."""
    pass # your new implementation 


# overwrite new methods 
model.fit = fit
model.predict = predict 

# save it again
with open(model_path, 'wb') as file:
    pickle.dump(file)
...

Upvotes: 3

Related Questions