Пример #1
0
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