BUG: rolling panel data became misaligned after extend_back

This commit is contained in:
Joe Jevnik
2014-11-12 16:47:44 -05:00
parent 8df1a49031
commit c2aae2e0f4
3 changed files with 113 additions and 35 deletions
+39 -22
View File
@@ -38,7 +38,7 @@ class RollingPanel(object):
sids,
cap_multiple=2,
dtype=np.float64,
date_buf=None):
initial_dates=None):
self._pos = window
self._window = window
@@ -49,8 +49,20 @@ class RollingPanel(object):
self.cap_multiple = cap_multiple
self.dtype = dtype
self.date_buf = np.empty(self.cap, dtype='M8[ns]') \
if date_buf is None else date_buf
if initial_dates is None:
self.date_buf = np.empty(self.cap, dtype='M8[ns]') * pd.NaT
elif len(initial_dates) != window:
raise ValueError('initial_dates must be of length window')
else:
self.date_buf = np.hstack(
(
initial_dates,
np.empty(
window * (cap_multiple - 1),
dtype='datetime64[ns]',
),
),
)
self.buffer = self._create_buffer()
@@ -59,18 +71,18 @@ class RollingPanel(object):
return self.cap_multiple * self._window
@property
def start_index(self):
def _start_index(self):
return self._pos - self._window
@property
def start_date(self):
return self.date_buf[self.start_index]
return self.date_buf[self._start_index]
def oldest_frame(self):
"""
Get the oldest frame in the panel.
"""
return self.buffer.iloc[:, self.start_index, :]
return self.buffer.iloc[:, self._start_index, :]
def set_minor_axis(self, minor_axis):
self.minor_axis = _ensure_index(minor_axis)
@@ -109,22 +121,27 @@ class RollingPanel(object):
self.date_buf.resize(self.cap)
self.date_buf = np.roll(self.date_buf, delta)
self.buffer = pd.concat(
[
pd.Panel(
items=self.items,
minor_axis=self.minor_axis,
major_axis=np.arange(delta * self.cap_multiple),
dtype=self.dtype,
),
self.buffer
],
axis=1,
old_vals = self.buffer.values
shape = old_vals.shape
nan_arr = np.empty((shape[0], delta, shape[2]))
nan_arr.fill(np.nan)
new_vals = np.column_stack(
(nan_arr,
old_vals,
np.empty((shape[0], delta * (self.cap_multiple - 1), shape[2]))),
)
self.buffer = pd.Panel(
data=new_vals,
items=self.items,
minor_axis=self.minor_axis,
major_axis=np.arange(self.cap),
dtype=self.dtype,
)
self.buffer.major_axis = pd.Int64Index(range(self.cap))
# Fill the delta with the dates we calculated.
where = slice(self.start_index, self.start_index + delta)
where = slice(self._start_index, self._start_index + delta)
self.date_buf[where] = missing_dts
def add_frame(self, tick, frame):
@@ -144,7 +161,7 @@ class RollingPanel(object):
these objects because internal data might change
"""
where = slice(self.start_index, self._pos)
where = slice(self._start_index, self._pos)
major_axis = pd.DatetimeIndex(deepcopy(self.date_buf[where]), tz='utc')
return pd.Panel(self.buffer.values[:, where, :], self.items,
major_axis, self.minor_axis, dtype=self.dtype)
@@ -155,11 +172,11 @@ class RollingPanel(object):
passed panel. The passed panel must have the same indices as the panel
that would be returned by self.get_current.
"""
where = slice(self.start_index, self._pos)
where = slice(self._start_index, self._pos)
self.buffer.values[:, where, :] = panel.values
def current_dates(self):
where = slice(self.start_index, self._pos)
where = slice(self._start_index, self._pos)
return pd.DatetimeIndex(deepcopy(self.date_buf[where]), tz='utc')
def _roll_data(self):