Skip to content

Commit

Permalink
add calendar events
Browse files Browse the repository at this point in the history
add calendar events
return is dict
test passed
  • Loading branch information
ghofi-dev committed Dec 14, 2023
1 parent 2f143c0 commit b992a1d
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 35 deletions.
17 changes: 17 additions & 0 deletions dev.py
Original file line number Diff line number Diff line change
@@ -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)
17 changes: 14 additions & 3 deletions tests/ticker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down
7 changes: 2 additions & 5 deletions yfinance/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
36 changes: 10 additions & 26 deletions yfinance/scrapers/quote.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
2 changes: 1 addition & 1 deletion yfinance/ticker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit b992a1d

Please sign in to comment.