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

Ale*_*uya 19 python redis dataframe pandas

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

我怎样才能做到这两个呢?

Ale*_*uya 39

组:

redisConn.set("key", df.to_msgpack(compress='zlib'))
Run Code Online (Sandbox Code Playgroud)

得到:

pd.read_msgpack(redisConn.get("key"))
Run Code Online (Sandbox Code Playgroud)

  • 从熊猫0.25.1开始,不推荐使用to_msgpack,而推荐使用pyarrow。查看[this SO post](/sf/answers/4059038301/),以获取“ pandas + pyarrow + redis”的完整示例。 (3认同)

Mar*_*ian 8

由于Decimal数据框中的对象,我无法使用 msgpack 。相反,我像这样将 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")))
Run Code Online (Sandbox Code Playgroud)

没有任何关于此的特定数据框。

注意事项

  • 使用的另一个答案msgpack更好 - 如果它适合您,请使用它
  • 酸洗可能很危险——你的 Redis 服务器需要安全,否则你会自找麻烦


小智 7

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

import redis
import pandas as pd

# Create a redis client
redisClient = redis.StrictRedis(host='localhost', port=6379, db=0)
# Create un dataframe
dd = {'ID': ['H576','H577','H578','H600', 'H700'],
  'CD': ['AAAAAAA', 'BBBBB', 'CCCCCC','DDDDDD', 'EEEEEEE']}
df = pd.DataFrame(dd)
data = df.to_json()
redisClient.set('dd', data)
# Retrieve the data
blob = redisClient.get('dd')
df_from_redis = pd.read_json(blob)
df_from_redis.head()
Run Code Online (Sandbox Code Playgroud)

输出


小智 5

要缓存数据帧,请使用它。

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')
Run Code Online (Sandbox Code Playgroud)

要获取缓存的数据帧,请使用它。

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
Run Code Online (Sandbox Code Playgroud)