簡體   English   中英

如何在Redis中設置/獲取pandas.DataFrame?

[英]How to set/get pandas.DataFrame to/from Redis?

將 DataFrame 設置為 redis,然后將其取回后,redis 返回一個字符串,我想不出將這個 str 轉換為 DataFrame 的方法。

我怎樣才能適當地做到這兩個?

設置:

redisConn.set("key", df.to_msgpack(compress='zlib'))

得到:

pd.read_msgpack(redisConn.get("key"))

由於我的數據框中的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")))

沒有任何關於此的特定數據框。

注意事項

  • 使用msgpack的另一個答案更好 - 如果它適合您,請使用它
  • 酸洗可能很危險——您的 Redis 服務器需要安全,否則您會自找麻煩

要緩存數據幀,請使用它。

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

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()

輸出

現在是 2021 年,這意味着不推薦使用df.to_msgpack()並且pyarrow從 pyarrow 2.0 開始不推薦使用它們的自定義序列化功能。 (請參閱 pyarrow 的序列化頁面上的“任意對象序列化”部分

這留下了良好且可靠的msgpack來序列化對象,以便它們可以被推送/存儲到 redis 中。

import msgpack
import redis 

# ...Writing to redis (already have data & a redis connection client)
redis_client.set('data_key_name', msgpack.packb(data))

# ...Retrieving from redis
retrieved_data = msgpack.unpackb(redis_client.get('data_key_name'))


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM