如何在Redis中设置/获取pandas.DataFrame?

时间:2016-06-21 11:56:38

标签: python pandas dataframe redis

将DataFrame设置为redis,然后将其恢复,redis返回一个字符串,我无法找到将此str转换为DataFrame的方法。

我怎样才能恰当地完成这两项工作?

5 个答案:

答案 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的其他答案更好 - 如果它适合您,请使用它
  • 酸洗可能很危险 - 您的Redis服务器需要安全或者您要求麻烦

答案 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)

to_msgpack 在 Pandas 的最新版本中不可用。

(".... VALUES ($1::date)",std::string)

output