pkl让你代码也可以见得不人
在写代码过程中,总有希望别人不知道代码怎么写的时候,那有些时候可以用api,以吐api给别人,别人给你的api传参数,那么你吐结果别人,这样子也可以,但是api就涉及要把ip放到公网,至少是局域的公网,那么就很麻烦了,这时候pkl就可以帮到你,pkl号称,一切皆可打包。
首先先跟大家介绍一下pkl是什么东西:
pickle模块详解
该pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议。 “Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。pickle模块对于错误或恶意构造的数据是不安全的。
pickle协议和JSON(JavaScript Object Notation)的区别 :
1. JSON是一种文本序列化格式(它输出unicode文本,虽然大部分时间它被编码utf-8),而pickle是二进制序列化格式;
2. JSON是人类可读的,而pickle则不是;
3. JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;
默认情况下,JSON只能表示Python内置类型的子集,而不能表示自定义类; pickle可以表示极其庞大的Python类型(其中许多是自动的,通过巧妙地使用Python的内省工具;复杂的案例可以通过实现特定的对象API来解决)。
pickle 数据格式是特定于Python的。它的优点是没有外部标准强加的限制,例如JSON或XDR(不能代表指针共享); 但是这意味着非Python程序可能无法重建pickled Python对象。
默认情况下,pickle数据格式使用相对紧凑的二进制表示。如果您需要最佳尺寸特征,则可以有效地压缩数据。
你对上面pkl的详解,看不懂,没关系的,因为我没看懂,但是我们会用就可以了是吧,上面这段话总结起来就是pkl有局限于python的打开,但是json是可以游走在各个软件之间的。
这篇的文章的分享,还是从代码介绍一下pkl,让大家了解多一些pkl的用处,会有以下几项用处:
1、打包dataframe:
1、打包dataframe:
import pickle
import pandas as pd
import os
os.chdir(r"\test_data")
import pandas as pd
gg=pd.read_csv('test_data1.csv')
with open(r'.\test_data1.pkl', 'wb') as f:
pickle.dump(gg, f)
with open(r'.\test_data1.pkl','rb') as f:
loaded_obj = pickle.load(f)
2、打包list&dict
import pandas as pd
a = ['Name', 'Age', 'Gender']
b = ['Ali', '19', 'China']
data = pd.DataFrame(zip(a, b), columns=['project', 'attribute'])
dict_country = data.set_index('project').T.to_dict('list')
with open(r'.\dict_country.pkl', 'wb') as f:
pickle.dump(dict_country, f)
with open(r'.\dict_country.pkl','rb') as f:
loaded_obj = pickle.load(f)
3、打包模型
import numpy as np
from sklearn import datasets
from utils.data_manipulation import make_diagonal, normalize, train_test_split
from utils.data_operation import accuracy_score
data = datasets.load_iris()
X = data.data[data.target != 0]
y = data.target[data.target != 0]
y[y == 1] = 0
y[y == 2] = 1
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, seed=1)
clf = LogisticRegression()
clf.fit(X_train, y_train)
with open(r'.\clf.pkl', 'wb') as f:
pickle.dump(clf, f)
with open(r'.\dict_country.pkl','rb') as f:
loaded_obj = pickle.load(f)
4、打包代码
import pickle
class gg():
def test():
print('跑数成功了吗')
with open('D:/python_code/mypickle.pickle', 'wb') as f:
pickle.dump(gg, f)
with open('D:/python_code/mypickle.pickle','rb') as f:
loaded_obj = pickle.load(f)
loaded_obj.test()
其实数据这些打包就是为了方便发送或者为了保证数据的好保存,其实其他方式也可以,映射关系这种放在python文件里面也可以,重点就是打包代码这块,打包的代码是看不到具体的代码的,只能按照参数指示输入参数,得到输出结果,那么在一些反欺诈策略,或者一些模型的组合中不想让别人看到其中的规则,就可以使用pkl打包的形式,把你的东西保密化。