将DataFrame设置为redis,然后将其恢复,redis返回一个字符串,我无法找到将此str转换为DataFrame的方法。
我怎样才能恰当地完成这两项工作?
答案 0 :(得分:33)
组:
redisConn.set("key", df.to_msgpack(compress='zlib'))
得到:
pd.read_msgpack(redisConn.get("key"))
答案 1 :(得分:2)
由于我的数据框中有Decimal
个对象,我无法使用msgpack。 Intead我将pickle和zlib结合在一起,假设有一个数据帧df
和一个本地redis实例:
import pickle
import redis
import zlib
EXPIRATION_SECONDS = 600
r = redis.StrictRedis(host='localhost', port=6379, db=0)
# Set
r.setex("key", EXPIRATION_SECONDS, zlib.compress( pickle.dumps(df)))
# Get
rehydrated_df = pickle.loads(zlib.decompress(r.get("key")))
没有任何关于此事项的数据框架。
注意事项
msgpack
的其他答案更好 - 如果它适合您,请使用它答案 2 :(得分:1)
要缓存数据框,请使用它。
import pyarrow as pa
def cache_df(alias,df):
pool = redis.ConnectionPool(host='host', port='port', db='db')
cur = redis.Redis(connection_pool=pool)
context = pa.default_serialization_context()
df_compressed = context.serialize(df).to_buffer().to_pybytes()
res = cur.set(alias,df_compressed)
if res == True:
print('df cached')
要获取缓存的数据帧,请使用此。
def get_cached_df(alias):
pool = redis.ConnectionPool(host='host',port='port', db='db')
cur = redis.Redis(connection_pool=pool)
context = pa.default_serialization_context()
all_keys = [key.decode("utf-8") for key in cur.keys()]
if alias in all_keys:
result = cur.get(alias)
dataframe = pd.DataFrame.from_dict(context.deserialize(result))
return dataframe
return None
答案 3 :(得分:1)
import pandas as pd
df = pd.DataFrame([1,2])
redis.setex('df',100,df.to_json())
df = redis.get('df')
df = pd.read_json(df)
答案 4 :(得分:1)