def test_two_equity_data_objects_not_equal(self): d1 = EquityData(open=10, high=15.5, low=9.1, close=12.33, adj_close=12.33, volume=32000) d2 = EquityData(open=1, high=5.5, low=0.1, close=1.28, adj_close=1.28, volume=2240) self.assertNotEqual(d1, d2)
def scrape_eq_multiple_dates(self, ticker, date_list): if date_list is None or len(date_list) == 0: raise EmptyDateListError(ticker) clean_date_list = [Scraper._normalise_datetime(dt) for dt in date_list] page = Scraper._get_web_page(ticker) data_table = Scraper._get_hist_price_data_table(page, ticker) data = {} for row in data_table.children: values = [ col.next_element.text for col in row.children if col.find('span') ] dt = datetime.datetime.strptime(values[0], '%b %d, %Y') values[0] = dt.date() if values[0] in clean_date_list: d = EquityData(*(v.replace(',', '') for v in values[1:])) data[values[0]] = (values[0], d) if len(data) == len(date_list): break # NOTE(steve): we need to order the data based on the # order provided in the input date list ordered_data = [] errors = [] for date in clean_date_list: if date in data: ordered_data.append(data[date]) else: errors.append(InvalidDateError(date)) return ordered_data, errors
def test_all_fields_price_fields_are_decimals(self): d = EquityData() self.assertIsInstance(d.open, Decimal) self.assertIsInstance(d.high, Decimal) self.assertIsInstance(d.low, Decimal) self.assertIsInstance(d.close, Decimal) self.assertIsInstance(d.adj_close, Decimal)
def test_defaults_fields_to_zero(self): d = EquityData() self.assertEqual(d.open, 0) self.assertEqual(d.high, 0) self.assertEqual(d.low, 0) self.assertEqual(d.close, 0) self.assertEqual(d.adj_close, 0) self.assertEqual(d.volume, 0)
def get_expected_equity_data(): ticker = 'AMZN' dt = datetime.datetime(2019, 5, 10) expected_data = EquityData() expected_data.open = Decimal('1898.00') expected_data.high = Decimal('1903.79') expected_data.low = Decimal('1856.00') expected_data.close = Decimal('1889.98') expected_data.adj_close = Decimal('1889.98') expected_data.volume = int(5718000) return ticker, dt, expected_data
def get_test_data(test_data, ticker, dt): data = test_data[ticker] date_string = dt.strftime('%d-%b-%Y') equity_data = EquityData(open=data[date_string]["open"], high=data[date_string]["high"], low=data[date_string]["low"], close=data[date_string]["close"], adj_close=data[date_string]["adj_close"], volume=data[date_string]["volume"]) return equity_data
def get_equity_data(self, security, date): self._check_is_valid_security(security) ticker_id = self._get_security_id(security) rows = self._get_equity_data(ticker_id, date) if len(rows) == 0: raise InvalidDateError(date) elif len(rows) == 1: data = EquityData(*rows[0]) return data
def get_equity_data_series(self, security): self._check_is_valid_security(security) ticker_id = self._get_security_id(security) with self._conn: sql = """SELECT date, open, high, low, close, adj_close, volume FROM equity_prices WHERE (ticker_id = ?)""" cursor = self._conn.cursor() cursor.execute(sql, (ticker_id, )) rows = cursor.fetchall() data = [(row[0], EquityData(*row[1:])) for row in rows] return sorted(data, reverse=True)
def scrape_equity_data(self, ticker, date): date_only = Scraper._normalise_datetime(date) page = Scraper._get_web_page(ticker) data_table = Scraper._get_hist_price_data_table(page, ticker) for row in data_table.children: values = [ col.next_element.text for col in row.children if col.find('span') ] dt = datetime.datetime.strptime(values[0], '%b %d, %Y') values[0] = dt.date() if values[0] == date_only: d = EquityData(*(v.replace(',', '') for v in values[1:])) return d raise InvalidDateError(f'{ticker}: {date}')
def _from_dict(cls, dict_data): data = cls() data.securities = dict_data['securities'] data.equity_data = {} for sec in data.securities: if sec in dict_data: data.equity_data[sec] = {} for dt, equity_data in dict_data[sec].items(): data.equity_data[sec][dt] = EquityData( open=equity_data['open'], high=equity_data['high'], low=equity_data['low'], close=equity_data['close'], adj_close=equity_data['adj_close'], volume=equity_data['volume']) return data
def test_volume_field_is_an_integer(self): d = EquityData(volume=400.5) self.assertIsInstance(d.volume, int)