在机器学习领域,由于Python中包含较多的机器学习资源,难免会涉及到不同语言之间的交互【Java调用python】。从而会涉及到非python基础数据类型的传输,如pandas中的DataFrame进行数据的传输。
可以通过pandas中的
1 # 1. msgpack 2 to_msgpack() # set 3 read_msgpack() # get 4 # 2. json 5 to_json() # set 6 read_json() # get
两种方式将数据序列化成redis中 set和get可操作的类型。
操作步骤
- 数据准备;
- redis准备;
- 使用DataFrame中的.to_msgpack()方法或者.to_json方法将数据类型为DataFrame的数据进行序列化;
- 为序列化后的变量set到redis中;
- 通过给序列化后的变量的名字(字符串)get redis中的内容;
- 使用.read_msgpack()方法或者.read_json()方法将序列化的内容进行反序列化。
下述代码中按照上述步骤,使用msgpack 和 json 依次将DataFrame放入redis中,再从redis中取出。并比较了二者的时间消耗。【msgpack在处理DataFrame的时间更快】
1 import redis 2 import json 3 import pandas as pd 4 import time 5 # json 的序列化和反序列化可以能够使redis中的set 和 get 实现字典和列表上传和下载 使用起来更加轻便 6 # 而用使用hash操作来针对字典类型, lpush类型来针对list类型 7 data_frame_info = pd.read_csv('data.csv') 8 r = redis.StrictRedis(host='localhost', port=6379, password=123456) 9 msgpack_time = time.time() 10 df_bytes = data_frame_info.to_msgpack() # 序列化 11 r.set("data_fram_info", df_bytes) # 存入redis 12 res_dataframe = r.get("data_fram_info") # 从redis中获取 13 res_data_frame = pd.read_msgpack(res_dataframe) # 反序列化为DataFrame 14 15 pd.set_option('display.max_columns', 1000000) # 可以在大数据量下,没有省略号 16 pd.set_option('display.max_rows', 1000000) 17 pd.set_option('display.max_colwidth', 1000000) 18 pd.set_option('display.width', 1000000) 19 20 # print(res_data_frame) 21 print("\033[42;1m%s\033[0m" %("msgpack_time:"), time.time()-msgpack_time) 22 23 json_time = time.time() 24 df_bytes1 = data_frame_info.to_json() 25 r.set("data_fram_info1", df_bytes1) 26 res_dataframe1 = r.get("data_fram_info1") 27 res_data_frame1 = pd.read_json(res_dataframe1) 28 29 pd.set_option('display.max_columns', 1000000) 30 pd.set_option('display.max_rows', 1000000) 31 pd.set_option('display.max_colwidth', 1000000) 32 pd.set_option('display.width', 1000000) 33 # print(res_data_frame1) 34 print("\033[42;1m%s\033[0m" %("json_time:"), time.time()-json_time)
如果同时需要从redis中获取多个DataFrame,可以使用map迭代调用rs.get()方法和pd.read_msgpack()方法,并将获取到的内容依次进行赋值。如下述代码所示:
1 rs_list = list(map(rs.get, [x_train, y_train, x_test, y_test, y_test_id])) 2 rs_context = list(map(pd.read_msgpack, rs_list)) 3 x_train, y_train, x_test, y_test, y_test_id = [i for i in rs_context]