From 35fc06d72358ad7065065d52a02958087d0c4114 Mon Sep 17 00:00:00 2001 From: Juan Pablo Amoroso Date: Tue, 4 Jun 2019 15:46:27 -0300 Subject: [PATCH] Added method to allow iteration over dates. Data object passes unimplemented method calls to underlying pd.DataFrame. --- .../datahandler/historical_options_data.py | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/backtester/datahandler/historical_options_data.py b/backtester/datahandler/historical_options_data.py index 091dce5..697e5bb 100644 --- a/backtester/datahandler/historical_options_data.py +++ b/backtester/datahandler/historical_options_data.py @@ -15,7 +15,6 @@ class HistoricalOptionsData: columns = self._data.columns assert all((col in columns for _key, col in self.schema)) - self.index = self._data.index self._data["dte"] = (self._data["expiration"] - self._data["quotedate"]).dt.days self.schema.update({"dte": "dte"}) @@ -24,6 +23,23 @@ class HistoricalOptionsData: """Apply Filter `f` to the data. Returns a `pd.DataFrame` with the filtered rows.""" return self._data.query(f.query) + def iter_dates(self): + """Returns `pd.DataFrameGroupBy` that groups contracts by date""" + return self._data.groupby(self.schema["date"]) + + def __getattr__(self, attr): + """Pass method invocation to `self._data`""" + + method = getattr(self._data, attr) + if hasattr(method, "__call__"): + + def df_method(*args, **kwargs): + return method(*args, **kwargs) + + return df_method + else: + return method + def __getitem__(self, item): key = self.schema[item] return self._data[key] @@ -33,6 +49,9 @@ class HistoricalOptionsData: if key not in self.schema: self.schema.update({key: key}) + def __len__(self): + return len(self._data) + def __repr__(self): return self._data.__repr__()