From 0c89fcd8f74764599c8a524f938f3f38ce757fd9 Mon Sep 17 00:00:00 2001 From: ValueRaider Date: Tue, 19 Nov 2024 21:41:42 +0000 Subject: [PATCH 1/5] Version 0.2.50 --- CHANGELOG.rst | 9 +++++++++ meta.yaml | 2 +- yfinance/version.py | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 56cc0234..d44aa13a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,15 @@ Change Log =========== +0.2.50 +------ +Fixes: +- price repair #2111 #2139 +- download() appearance 2109 +- isin() error #2099 +- growth_estimates #2127 +Also new docs #2132 + 0.2.49 ------ Fix prices-clean rarely discarding good data #2122 diff --git a/meta.yaml b/meta.yaml index 444528f9..aaea9148 100644 --- a/meta.yaml +++ b/meta.yaml @@ -1,5 +1,5 @@ {% set name = "yfinance" %} -{% set version = "0.2.49" %} +{% set version = "0.2.50" %} package: name: "{{ name|lower }}" diff --git a/yfinance/version.py b/yfinance/version.py index 76144501..756b7abb 100644 --- a/yfinance/version.py +++ b/yfinance/version.py @@ -1 +1 @@ -version = "0.2.49" +version = "0.2.50" From f95eef6489a465633376f11a9f9ccbd3394fd7da Mon Sep 17 00:00:00 2001 From: R5dan Date: Sun, 8 Dec 2024 17:28:41 +0000 Subject: [PATCH 2/5] Remove mkdocs --- .github/workflows/ci.yml | 18 ------------------ mkdocs.yml | 19 ------------------- 2 files changed, 37 deletions(-) delete mode 100644 .github/workflows/ci.yml delete mode 100644 mkdocs.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 7611ffee..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: ci -on: - push: - branches: - - master - - main -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 - with: - python-version: 3.x - - run: pip install -r requirements.txt - - run: pip install mkdocstrings==0.14.0 - - run: pip install mkdocs-material - - run: mkdocs gh-deploy --force diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index b8e6aa4b..00000000 --- a/mkdocs.yml +++ /dev/null @@ -1,19 +0,0 @@ -# site_name: My Docs - -# # mkdocs.yml -# theme: -# name: "material" - -# plugins: -# - search -# - mkdocstrings - -# nav: -# - Introduction: 'index.md' -# - Installation: 'installation.md' -# - Quick Start: 'quickstart.md' -# # - Ticker: 'Ticker.md' -# - TickerBase: 'TickerBase.md' -# # - Tickers: 'Tickers.md' -# - utils: 'utils.md' -# - multi: 'multi.md' From e242617237850c769c8ead02337b21ce711991b3 Mon Sep 17 00:00:00 2001 From: jeong Date: Fri, 6 Dec 2024 00:31:02 +0900 Subject: [PATCH 3/5] Fix Ticker.earnings_dates --- yfinance/base.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/yfinance/base.py b/yfinance/base.py index a22dd108..b258035f 100644 --- a/yfinance/base.py +++ b/yfinance/base.py @@ -41,7 +41,7 @@ from .scrapers.funds import FundsData from .const import _BASE_URL_, _ROOT_URL_ - +from datetime import date class TickerBase: def __init__(self, ticker, session=None, proxy=None): @@ -557,7 +557,7 @@ def get_news(self, proxy=None) -> list: return self._news @utils.log_indent_decorator - def get_earnings_dates(self, limit=12, proxy=None) -> Optional[pd.DataFrame]: + def get_earnings_dates(self, limit=12, proxy=None, add_cookies=None) -> Optional[pd.DataFrame]: """ Get earning dates (future and historic) @@ -566,6 +566,7 @@ def get_earnings_dates(self, limit=12, proxy=None) -> Optional[pd.DataFrame]: Default value 12 should return next 4 quarters and last 8 quarters. Increase if more history is needed. proxy: requests proxy to use. + add_cookies: additional cookies to use Returns: pd.DataFrame @@ -579,7 +580,7 @@ def get_earnings_dates(self, limit=12, proxy=None) -> Optional[pd.DataFrame]: page_offset = 0 dates = None while True: - url = f"{_ROOT_URL_}/calendar/earnings?symbol={self.ticker}&offset={page_offset}&size={page_size}" + url = f"{_ROOT_URL_}/calendar/earnings?day={date.today()}&symbol={self.ticker}&offset={page_offset}&size={page_size}" # Fixed data = self._data.cache_get(url=url, proxy=proxy).text if "Will be right back" in data: @@ -621,15 +622,20 @@ def get_earnings_dates(self, limit=12, proxy=None) -> Optional[pd.DataFrame]: dates = dates.drop(["Symbol", "Company"], axis=1) # Convert types - for cn in ["EPS Estimate", "Reported EPS", "Surprise(%)"]: + for cn in ["EPS Estimate", "Reported EPS", "Surprise (%)"]: dates.loc[dates[cn] == '-', cn] = float("nan") dates[cn] = dates[cn].astype(float) # Convert % to range 0->1: - dates["Surprise(%)"] *= 0.01 + dates["Surprise (%)"] *= 0.01 # Parse earnings date string cn = "Earnings Date" + dates[cn] = dates[cn].astype(str) # Fixed + # - remove "at" + dates[cn] = dates[cn].replace(' at', ',', regex=True) # Fixed + # - remove EDT/EST + dates[cn] = dates[cn].replace(' E[DS]T', '', regex=True) # Fixed # - remove AM/PM and timezone from date string tzinfo = dates[cn].str.extract('([AP]M[a-zA-Z]*)$') dates[cn] = dates[cn].replace(' [AP]M[a-zA-Z]*$', '', regex=True) @@ -638,7 +644,7 @@ def get_earnings_dates(self, limit=12, proxy=None) -> Optional[pd.DataFrame]: tzinfo.columns = ["AM/PM", "TZ"] # - combine and parse dates[cn] = dates[cn] + ' ' + tzinfo["AM/PM"] - dates[cn] = pd.to_datetime(dates[cn], format="%b %d, %Y, %I %p") + dates[cn] = pd.to_datetime(dates[cn], format="%B %d, %Y, %I %p") # Fixed # - instead of attempting decoding of ambiguous timezone abbreviation, just use 'info': self._quote.proxy = proxy or self.proxy tz = self._get_ticker_tz(proxy=proxy, timeout=30) @@ -657,4 +663,4 @@ def get_funds_data(self, proxy=None) -> Optional[FundsData]: if not self._funds_data: self._funds_data = FundsData(self._data, self.ticker) - return self._funds_data \ No newline at end of file + return self._funds_data From 70243657a70b3accb78de07139e05e1e3d344819 Mon Sep 17 00:00:00 2001 From: ValueRaider Date: Wed, 18 Dec 2024 21:07:30 +0000 Subject: [PATCH 4/5] Earnings dates: fix time-shift, remove 'add_cokies' --- yfinance/base.py | 60 ++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/yfinance/base.py b/yfinance/base.py index b258035f..3bca8471 100644 --- a/yfinance/base.py +++ b/yfinance/base.py @@ -29,6 +29,7 @@ import pandas as pd import requests +from datetime import date from . import utils, cache from .data import YfData @@ -41,7 +42,7 @@ from .scrapers.funds import FundsData from .const import _BASE_URL_, _ROOT_URL_ -from datetime import date + class TickerBase: def __init__(self, ticker, session=None, proxy=None): @@ -557,7 +558,7 @@ def get_news(self, proxy=None) -> list: return self._news @utils.log_indent_decorator - def get_earnings_dates(self, limit=12, proxy=None, add_cookies=None) -> Optional[pd.DataFrame]: + def get_earnings_dates(self, limit=12, proxy=None) -> Optional[pd.DataFrame]: """ Get earning dates (future and historic) @@ -566,7 +567,6 @@ def get_earnings_dates(self, limit=12, proxy=None, add_cookies=None) -> Optional Default value 12 should return next 4 quarters and last 8 quarters. Increase if more history is needed. proxy: requests proxy to use. - add_cookies: additional cookies to use Returns: pd.DataFrame @@ -580,7 +580,7 @@ def get_earnings_dates(self, limit=12, proxy=None, add_cookies=None) -> Optional page_offset = 0 dates = None while True: - url = f"{_ROOT_URL_}/calendar/earnings?day={date.today()}&symbol={self.ticker}&offset={page_offset}&size={page_size}" # Fixed + url = f"{_ROOT_URL_}/calendar/earnings?day={date.today()}&symbol={self.ticker}&offset={page_offset}&size={page_size}" data = self._data.cache_get(url=url, proxy=proxy).text if "Will be right back" in data: @@ -621,36 +621,40 @@ def get_earnings_dates(self, limit=12, proxy=None, add_cookies=None) -> Optional # Drop redundant columns dates = dates.drop(["Symbol", "Company"], axis=1) + # Compatibility + dates = dates.rename(columns={'Surprise (%)': 'Surprise(%)'}) + + # Drop empty rows + for i in range(len(dates)-1, -1, -1): + if dates.iloc[i].isna().all(): + dates = dates.drop(i) + # Convert types - for cn in ["EPS Estimate", "Reported EPS", "Surprise (%)"]: + for cn in ["EPS Estimate", "Reported EPS", "Surprise(%)"]: dates.loc[dates[cn] == '-', cn] = float("nan") dates[cn] = dates[cn].astype(float) - # Convert % to range 0->1: - dates["Surprise (%)"] *= 0.01 - # Parse earnings date string cn = "Earnings Date" - dates[cn] = dates[cn].astype(str) # Fixed - # - remove "at" - dates[cn] = dates[cn].replace(' at', ',', regex=True) # Fixed - # - remove EDT/EST - dates[cn] = dates[cn].replace(' E[DS]T', '', regex=True) # Fixed - # - remove AM/PM and timezone from date string - tzinfo = dates[cn].str.extract('([AP]M[a-zA-Z]*)$') - dates[cn] = dates[cn].replace(' [AP]M[a-zA-Z]*$', '', regex=True) - # - split AM/PM from timezone - tzinfo = tzinfo[0].str.extract('([AP]M)([a-zA-Z]*)', expand=True) - tzinfo.columns = ["AM/PM", "TZ"] - # - combine and parse - dates[cn] = dates[cn] + ' ' + tzinfo["AM/PM"] - dates[cn] = pd.to_datetime(dates[cn], format="%B %d, %Y, %I %p") # Fixed - # - instead of attempting decoding of ambiguous timezone abbreviation, just use 'info': - self._quote.proxy = proxy or self.proxy - tz = self._get_ticker_tz(proxy=proxy, timeout=30) - dates[cn] = dates[cn].dt.tz_localize(tz) - - dates = dates.set_index("Earnings Date") + try: + dates_backup = dates.copy() + # - extract timezone because Yahoo stopped returning in UTC + tzy = dates[cn].str.split(' ').str.get(-1) + tzy[tzy.isin(['EDT', 'EST'])] = 'US/Eastern' + # - tidy date string + dates[cn] = dates[cn].str.split(' ').str[:-1].str.join(' ') + dates[cn] = dates[cn].replace(' at', ',', regex=True) + # - parse + dates[cn] = pd.to_datetime(dates[cn], format="%B %d, %Y, %I %p") + # - convert to exchange timezone + self._quote.proxy = proxy or self.proxy + tz = self._get_ticker_tz(proxy=proxy, timeout=30) + dates[cn] = [dates[cn].iloc[i].tz_localize(tzy.iloc[i], ambiguous=True).tz_convert(tz) for i in range(len(dates))] + + dates = dates.set_index("Earnings Date") + except Exception as e: + utils.get_yf_logger().info(f"{self.ticker}: Problem parsing earnings_dates: {str(e)}") + dates = dates_backup self._earnings_dates[limit] = dates From 5adddf3e88f39720ef24a04927738848dee76761 Mon Sep 17 00:00:00 2001 From: ValueRaider Date: Thu, 19 Dec 2024 22:46:16 +0000 Subject: [PATCH 5/5] Version 0.2.51 --- CHANGELOG.rst | 9 +++++++++ meta.yaml | 2 +- yfinance/version.py | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d44aa13a..04d1a829 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,15 @@ Change Log =========== +0.2.51 +------ +Fixes: +- earnings_dates #2169 +Features: +- Screener tweaks #2168 +- Search #2160 +- get_news() expose count #2173 + 0.2.50 ------ Fixes: diff --git a/meta.yaml b/meta.yaml index aaea9148..79f27c55 100644 --- a/meta.yaml +++ b/meta.yaml @@ -1,5 +1,5 @@ {% set name = "yfinance" %} -{% set version = "0.2.50" %} +{% set version = "0.2.51" %} package: name: "{{ name|lower }}" diff --git a/yfinance/version.py b/yfinance/version.py index 756b7abb..8142a0d9 100644 --- a/yfinance/version.py +++ b/yfinance/version.py @@ -1 +1 @@ -version = "0.2.50" +version = "0.2.51"