需要将一个多列的dataframe写入redis,但是这个dateframe包含了DECIMAL对象,无法直接序列化。
第一步,需要先将dataframe中的多列转为基础类型。原来的dataframe结构:
char,char,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL
对于的名称:
'code','trade_day','open', 'close', 'high', 'low', 'amount','vol','ma5vol','ma10vol','ma20vol','ma30vol','ma5','ma10','ma20','ma30','ma60','pct_chg','macd','dea','dif'
同时将多列转为float类型:
all_stock_kdata[['open', 'close', 'high', 'low', 'amount', 'vol', 'ma5vol',
'ma10vol','ma20vol','ma30vol','ma5','ma10','ma20','ma30',
'ma60','pct_chg','macd','dea','dif']] = \
all_stock_kdata[['open', 'close', 'high', 'low', 'amount', 'vol', 'ma5vol',
'ma10vol','ma20vol','ma30vol','ma5','ma10','ma20','ma30',
'ma60','pct_chg','macd','dea','dif']].astype('float')
第二步,将dataframe序列化,写入redis
try:
all_stock_kdata[['open', 'close', 'high', 'low', 'amount', 'vol', 'ma5vol',
'ma10vol','ma20vol','ma30vol','ma5','ma10','ma20','ma30',
'ma60','pct_chg','macd','dea','dif']] = \
all_stock_kdata[['open', 'close', 'high', 'low', 'amount', 'vol', 'ma5vol',
'ma10vol','ma20vol','ma30vol','ma5','ma10','ma20','ma30',
'ma60','pct_chg','macd','dea','dif']].astype('float')
df_bytes = all_stock_kdata.to_msgpack(compress='zlib')
self.re.set(key_code, df_bytes)
except Exception as e:
print(e)
第三步,从redis读出,反序列化,转为dataframe
if self.re.exists(key_code):
print('from redis')
df_bytes = self.re.get(key_code)
all_stock_kdata = pd.read_msgpack(df_bytes)
最后读出来的类型,将是:
char,char,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float