Как установить / получить pandas.DataFrame в / из Redis?
После установки для DataFrame значения redis, а затем его возврата, redis возвращает строку, и я не могу найти способ преобразовать эту строку в DataFrame.
Как я могу сделать эти два соответственно?
6 ответов
Задавать:
redisConn.set("key", df.to_msgpack(compress='zlib'))
получить:
pd.read_msgpack(redisConn.get("key"))
Я не мог использовать msgpack из-за Decimal
объекты в моем фрейме данных. Вот так я объединил 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 должен быть защищен, или вы требуете неприятностей
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()
Для кеширования фрейма данных используйте это.
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)
Это 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'))