class RedisCacheProxy(object): def __init__(self, backend="Vedis"): self._backend = backend self._conn = None self.get_connection() def get_connection(self): if self._backend == "Vedis": self._conn = Vedis(":mem:") def _get_hash(self, key): if self._backend == "Vedis": return self._conn.Hash(key) def _get_list(self, key): if self._backend == "Vedis": return self._conn.List(key) @staticmethod def _get_timestamp(dt): return int(time.mktime(dt.timetuple())) def get_ticker_bar_data(self, func): @wraps(func) def wrapper(ticker, timeframe, start, end): prefix = ticker + "." + timeframe dct = self._get_hash(prefix + ".index") si = dct[self._get_timestamp(start)] ei = dct[self._get_timestamp(end)] if si and ei: si = int(si) ei = int(ei) df = pd.DataFrame(columns=_BAR_FIELDS) for field in _BAR_FIELDS: df[field] = [ self._get_list(prefix + "." + field)[index] for index in range(si, ei + 1) ] else: df = func(ticker, timeframe, start, end) dt = df["datetime"].apply(lambda x: self._get_timestamp(x)) temp = pd.Series(df.index.astype(str), index=dt.astype(str)) try: del self._conn[prefix + ".index"] except KeyError: pass dct = self._get_hash(prefix + ".index") for key, value in temp.iteritems(): dct[key] = value for field in _BAR_FIELDS: try: del self._conn[prefix + "." + field] except KeyError: pass lst = self._get_list(prefix + "." + field) lst.extend(list(df[field].values)) return df return wrapper