diff --git a/dev.py b/dev.py new file mode 100644 index 000000000..f0e626962 --- /dev/null +++ b/dev.py @@ -0,0 +1,17 @@ +# -*- coding: UTF-8 -*- +""" + Unit Test Lab + 2023-12-14 + Description: + +""" + +from yfinance import Ticker +from pprint import pprint +ticker = Ticker("AAPL") +print(ticker.ticker) +pprint(ticker.calendar) + +ticker = Ticker("LLY") +print(ticker.ticker) +pprint(ticker.calendar) diff --git a/tests/ticker.py b/tests/ticker.py index a93d0b507..e0760b4f7 100644 --- a/tests/ticker.py +++ b/tests/ticker.py @@ -713,9 +713,20 @@ def test_recommendations_history(self): # alias for upgrades_downgrades def test_calendar(self): data = self.ticker.calendar - self.assertIsInstance(data, pd.DataFrame, "data has wrong type") - self.assertFalse(data.empty, "data is empty") - + print(self.ticker.ticker) + print(data) + self.assertIsInstance(data, dict, "data has wrong type") + self.assertTrue(len(data) > 0, "data is empty") + self.assertIn("Earnings Date", data.keys(), "data missing expected key") + self.assertIn("Earnings Average", data.keys(), "data missing expected key") + self.assertIn("Earnings Low", data.keys(), "data missing expected key") + self.assertIn("Earnings High", data.keys(), "data missing expected key") + self.assertIn("Revenue Average", data.keys(), "data missing expected key") + self.assertIn("Revenue Low", data.keys(), "data missing expected key") + self.assertIn("Revenue High", data.keys(), "data missing expected key") + # dividend date is not available for tested ticker GOOGL + # self.assertIn("Dividend Date", data.keys(), "data missing expected key") + # ex-dividend date is not always available data_cached = self.ticker.calendar self.assertIs(data, data_cached, "data not cached") diff --git a/yfinance/base.py b/yfinance/base.py index ad6884818..16649a6a3 100644 --- a/yfinance/base.py +++ b/yfinance/base.py @@ -1733,12 +1733,9 @@ def get_upgrades_downgrades(self, proxy=None, as_dict=False): return data.to_dict() return data - def get_calendar(self, proxy=None, as_dict=False): + def get_calendar(self, proxy=None): self._quote.proxy = proxy or self.proxy - data = self._quote.calendar - if as_dict: - return data.to_dict() - return data + return self._quote.calendar def get_major_holders(self, proxy=None, as_dict=False): self._holders.proxy = proxy or self.proxy diff --git a/yfinance/scrapers/quote.py b/yfinance/scrapers/quote.py index f44d1e136..646d4afa6 100644 --- a/yfinance/scrapers/quote.py +++ b/yfinance/scrapers/quote.py @@ -726,41 +726,25 @@ def _fetch_complementary(self, proxy): else: self.info[k] = None - def _fetch_calendar(self): # secFilings return too old data, so not requesting it for now result = self._fetch(self.proxy, modules=['calendarEvents']) try: - dates = [] - events = [] - earnings_stats = None + self._calendar = {} _events = result["quoteSummary"]["result"][0]["calendarEvents"] if 'dividendDate' in _events: - dates.append(str(datetime.datetime.fromtimestamp(_events['dividendDate']).date())) - events.append('Dividend Date') + self._calendar['Dividend Date'] = datetime.datetime.fromtimestamp(_events['dividendDate']).date() if 'exDividendDate' in _events: - dates.append(str(datetime.datetime.fromtimestamp(_events['exDividendDate']).date())) - events.append('Ex-Dividend Date') + self._calendar['Ex-Dividend Date'] = datetime.datetime.fromtimestamp(_events['exDividendDate']).date() # splits = _events.get('splitDate') # need to check later, i will add code for this if found data earnings = _events.get('earnings') if earnings is not None: - _dates = earnings.get('earningsDate', []) - earnings['earningsDate'] = str(datetime.datetime.fromtimestamp(_dates[0]).date()) \ - if len(_dates) == 1 \ - else str(datetime.datetime.fromtimestamp(_dates[0]).date()) + ' - ' + str(datetime.datetime.fromtimestamp(_dates[1]).date()) - dates.append(earnings['earningsDate']) - events.append('Earnings Date') - earnings_stats = pd.DataFrame.from_dict(earnings, orient='index') - earnings_stats.columns = ['Value'] - earnings_stats.index.name = 'Key' - # return empty dataframe if no events - if len(dates) == 0: - self._calendar = pd.DataFrame() - return - # create calendar dataframe - df = pd.DataFrame({'Event': events, 'Date': dates}) - # add earnings stats as attributes - df.attrs['earnings'] = earnings_stats - self._calendar = df + self._calendar['Earnings Date'] = [datetime.datetime.fromtimestamp(d).date() for d in earnings.get('earningsDate', [])] + self._calendar['Earnings High'] = earnings.get('earningsHigh', None) + self._calendar['Earnings Low'] = earnings.get('earningsLow', None) + self._calendar['Earnings Average'] = earnings.get('earningsAverage', None) + self._calendar['Revenue High'] = earnings.get('revenueHigh', None) + self._calendar['Revenue Low'] = earnings.get('revenueLow', None) + self._calendar['Revenue Average'] = earnings.get('revenueAverage', None) except (KeyError, IndexError): raise YFinanceDataException(f"Failed to parse json response from Yahoo Finance: {result}") diff --git a/yfinance/ticker.py b/yfinance/ticker.py index b556f0f1f..34e56363a 100644 --- a/yfinance/ticker.py +++ b/yfinance/ticker.py @@ -158,7 +158,7 @@ def fast_info(self): return self.get_fast_info() @property - def calendar(self) -> _pd.DataFrame: + def calendar(self) -> dict: return self.get_calendar() @property