Git Product home page Git Product logo

Comments (26)

ValueRaider avatar ValueRaider commented on September 23, 2024

This is certainly a bug and I can reproduce.

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

It seems I could only reproduce when using old yfinance version. What version is yours?

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

Currently using
yfinance 0.2.27
yfinance-cache 0.4.4

Did not update today, so this was also the version in my tests.
Note that when trying it out, I simply replaced the yfinance import with yfinance-cache, i.e., import yfinance-cache as yf
And the program only used the ticker and the history calls.

I can rerun this, if desired and rebuild a cache accordingly or post my experimental program or full error trace (but not public). Just let me know, what helps.

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

Update your packages, I sent out big updates today. You might still see error because YF may have corrupted your cache, but quickest fix is to delete your YFC cache folder.

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

Ok, just tried: Updated to
yfinance 0.2.28
yfinance-cache 0.4.5

crashes again, although differently. See below.

I started with an empty directory and removed all previous downloads. It seems to crash in the second call to history (below). There is a previous one, which aims to download everything in a daily resolution.

** again sanitized as it contains personal stuff ** last part of my call-stack is:
parthist = ticker.history(period="60d", interval="2m")

File /usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py:236, in Ticker.history(self, interval, max_age, period, start, end, prepost, actions, adjust_splits, adjust_divs, keepna, proxy, rounding, debug, quiet, trigger_at_market_close)
234 hist = self._histories_manager.GetHistory(interval)
235 if period is not None:
--> 236 h = hist.get(start=None, end=None, period=period, max_age=max_age, trigger_at_market_close=trigger_at_market_close, quiet=quiet)
237 elif interday:
238 h = hist.get(start_d, end_d, period=None, max_age=max_age, trigger_at_market_close=trigger_at_market_close, quiet=quiet)

File /usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py:827, in PriceHistory.get(self, start, end, period, max_age, trigger_at_market_close, repair, prepost, adjust_splits, adjust_divs, quiet)
825 if isinstance(y, (datetime, pd.Timestamp)):
826 if y > dt_now:
--> 827 ranges_to_fetch[i][1] = min(dt_now.ceil(), y)
828 elif y > d_now_exchange:
829 sched = yfct.GetExchangeSchedule(self.exchange, d_now_exchange, y + td_1d)

File /usr/local/lib/python3.11/site-packages/pandas/_libs/tslibs/timestamps.pyx:1890, in pandas._libs.tslibs.timestamps.Timestamp.ceil()

TypeError: ceil() takes at least 2 positional arguments (1 given)

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

I've pushed a fix to GitHub branch bug-fixes - can you install and test? Instructions: ranaroussi/yfinance#1080

Reason for not publishing = could be more bugs.
Reason for potentially more bugs = intraday price caching not thoroughly tested.
Thorough testing is hard with just unit tests - dynamic interplay of cache state & time-of-day. Case-in-point - I can't reproduce your error, but Pandas docs confirm it's genuine.

Thorough testing needs real-world use, and I only use 1d & 1wk data.

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

I tried it out. Seems to install correctly, but errors do not change:

File [/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py:236](https://untitled+.vscode-resource.vscode-cdn.net/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py:236), in Ticker.history(self, interval, max_age, period, start, end, prepost, actions, adjust_splits, adjust_divs, keepna, proxy, rounding, debug, quiet, trigger_at_market_close)
    [234](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py?line=233) hist = self._histories_manager.GetHistory(interval)
    [235](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py?line=234) if period is not None:
--> [236](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py?line=235)     h = hist.get(start=None, end=None, period=period, max_age=max_age, trigger_at_market_close=trigger_at_market_close, quiet=quiet)
    [237](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py?line=236) elif interday:
    [238](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py?line=237)     h = hist.get(start_d, end_d, period=None, max_age=max_age, trigger_at_market_close=trigger_at_market_close, quiet=quiet)

File [/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py:628](https://untitled+.vscode-resource.vscode-cdn.net/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py:628), in PriceHistory.get(self, start, end, period, max_age, trigger_at_market_close, repair, prepost, adjust_splits, adjust_divs, quiet)
    [626](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py?line=625) f_repair = self.h["Repaired?"].to_numpy()
    [627](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py?line=626) f_na = self.h['Close'].isna().to_numpy()
--> [628](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py?line=627) f_repair = f_repair | f_na
    [629](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py?line=628) cutoff_dts = self.h.index + self.itd + timedelta(days=7)
    [630](file:///usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py?line=629) # Ignore repaired data if fetched/repaired 7+ days after interval end

TypeError: unsupported operand type(s) for |: 'float' and 'bool'

I also enclose the downloader program I use (only modification is the path variable should be set to a different directory, then it should work also for others. And potentially: modify the tickers list at the end.

It basically downloads the data and refines it with higher resolution data. (2m, 1m) to the degree the data is available and upon rerun it tries to minimize downloads and adds high-resolution data.

#%% 
# create a downloader of finance data from yahoo finance
# this should include caching and rate limiting.
# all data should be downloaded at the maximum resolution available, taking into account data that has already been downloaded.
# the data should be stored in a file per stock, with the name of the stock as the filename.

# perhaps this can sped up according to https://github.com/ranaroussi/yfinance/issues/1647
# however, we need to sure that we do not get banned from yahoo finance
# another option would be to use multi download:
# according to https://aroussi.com/post/python-yahoo-finance
# but this would lead to a different interface

from tracemalloc import start
from turtle import down
# import yfinance as yf
import yfinance_cache as yf
import pandas as pd
import numpy as np
import datetime
import time
import os

from requests import Session
from requests_cache import CacheMixin, SQLiteCache
from requests_ratelimiter import LimiterMixin, MemoryQueueBucket
from pyrate_limiter import Duration, RequestRate, Limiter

# Initializations:
# yf.pdr_override() # pandas_datareader override

path=""
suffix=".csv" # we will save the data as csv files

# lets store the cache in the path directory as well
cache_file = "yfinance.cache"
full_cache_path = os.path.abspath(os.path.join(path, cache_file))

def set_path(new_path):
    global path
    path=new_path

def set_suffix(new_suffix):
    global suffix
    suffix=new_suffix

def get_full_path(ticker_name):
    return os.path.abspath(path+ticker_name+suffix)

# based on https://github.com/ranaroussi/yfinance#smarter-scraping
class CachedLimiterSession(CacheMixin, LimiterMixin, Session): pass
session = CachedLimiterSession(
    limiter=Limiter(RequestRate(2, Duration.SECOND*5)),  # max 2 requests per 5 seconds
    bucket_class=MemoryQueueBucket,
    backend=SQLiteCache(full_cache_path), # alternative SQLiteCache(use_memory=True)
    cache_control=True, # Use Cache-Control response headers for expiration, if available
    expired_after=Duration.SECOND*60*60*24*7, # cache expires after 7 days
)

# non_cached_session = LimiterMixin(
#     limiter=Limiter(RequestRate(2, Duration.SECOND*5)),
#     bucket_class=MemoryQueueBucket
# )

# def get_history_no_cache(ticker, *args, **kwargs):
#     original_session = ticker._data._session
#     try:
#         # Replace the session with the non-cached version
#         ticker.session = non_cached_session
#         ticker._data._session = non_cached_session
#         # Call the method you want without caching
#         return ticker.history(*args, **kwargs)
#     finally:
#         # Revert back to the original session
#         ticker._data._session = original_session
#         ticker.session = original_session

# perform the downloading for a specific stock:
def get_ticker(stock="msft", start_date="2023-01-01", end_date="2023-01-01", force_download=False):
    session.headers['User-agent'] = 'my-program/1.0'
    ticker=yf.Ticker(stock, session=session)
    # The scraped response will be stored in the cache
    return ticker

# download or update data for a specific stock
def download_data(ticker_name):
    # we know the ticker name, so we can get the ticker and the filename
    # we assume they are all cached, so we can just get the ticker again
    # only the relevant data will be downloaded again. 
    # In case there is no data, we just redownload everything
    ticker = get_ticker(ticker_name)
    fullname=get_full_path(ticker_name)
    if os.path.exists(fullname):  # we need to download everything
        # we need to read the existing data from disk
        hist = pd.read_csv(fullname, index_col=0, parse_dates=True)
        # determine the last date
        last_date = hist.index[-1].tz_localize(None) # remove timezone from last date as datetime.now() does not have a timezone
        gap_days = (datetime.datetime.now() - last_date).days
    else: 
        gap_days=-1 # negative value to indicate that we need to download everything
    
    # at this point we have the ticker and the gap_days and the latter tells us how much data we need to download
    # >60 days: download with daily resolution; <=60 days: download with 2 minute resolution; <=7 days: download with 1 minute resolution
    
    print("ticker: " + ticker_name + " gap_days: " + str(gap_days))
    if (gap_days > 60) or (gap_days<0): # 
        # download everything
        # print("downloading everything for ticker " + ticker_name)
        hist = ticker.history(period="max")
        # the more recent part is not downloaded in higher resolution yet, so we do set gap_days=60
        gap_days = 60
    if gap_days > 7:
        # print("downloading 2m for ticker " + ticker_name)
        parthist = ticker.history(period="60d", interval="2m")
        hist = pd.concat([hist, parthist])
        gap_days = 7
    if gap_days > 0: # note that this will always be true if we make any new download (but not if the data on disk is from today)
        # get highest resolution data for the last 5 days
        # print("downloading 1m for ticker " + ticker_name)
        parthist = ticker.history(period="7d", interval="1m")
        # parthist = get_history_no_cache(ticker, period="7d", interval="1m")
        # combine the two
        hist = pd.concat([hist, parthist])
        # remove duplicates
        hist = hist[~hist.index.duplicated(keep='first')]
        # sort by date
        hist = hist.sort_index()
        # return the data
    else:
        print("no data to download for " + ticker_name)

    return hist
 
# save history data to a file
def save_data(ticker_name, data):
    data.to_csv(get_full_path(ticker_name))

# download all data for a list of tickers
def download_all_data(tickers):
    tst = time.time() 
    for ticker_name in tickers:
        # we time the download in msec
        start_time = time.time() 

        # download the data
        data = download_data(ticker_name)
        end_time = time.time()
        print("Download time for ticker " + ticker_name + " is " + str(round((end_time-start_time))) + " sec")
        # save the data
        save_data(ticker_name, data)
        end_time = time.time()
        print("Total time for ticker " + ticker_name + " is " + str(round((end_time-start_time))) + " sec")
    tet = time.time()
    print("Total time for all tickers is " + str(round((tet-tst))) + " sec")

# tickers=["msft", "aapl", "goog", "amzn", "meta", "tsla", "nvda", "pypl", "adbe", 
#        "crm", "intc", "nflx", "cmcsa", "cost", "pep", "amd", "avgo", "csco", "qcom",
#        "amgn", "txn", "chtr", "sbux", "intu", "isrg", "bkng", "atvi", "csx", "mu"]
tickers=["msft"]

download_all_data(tickers) 

not a beauty, but hacked together over the weekend.

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

I can't reproduce that error, but it looks like the yfinance problem still. I've pushed a commit that will, next time error occurs, hopefully print out variables I need to reproduce. Unless cause is different.

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

Hm, interesting. I would have assumed this to be independent of running machine.
Tried:

pip3 install git+https://github.com/ValueRaider/yfinance-cache.git@bug-fixes

Worked out ok. But no difference in output. No additional outputs.

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

Did you delete your local YFC cache before re-running?

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

yes, every time.
Perhaps I will find some time over the weekend to do some debugging.

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

I've added more debugging code.

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

parthist = ticker.history(period="60d", interval="2m")

File /usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py:236, in Ticker.history(self, interval, max_age, period, start, end, prepost, actions, adjust_splits, adjust_divs, keepna, proxy, rounding, debug, quiet, trigger_at_market_close)
234 hist = self._histories_manager.GetHistory(interval)
235 if period is not None:
--> 236 h = hist.get(start=None, end=None, period=period, max_age=max_age, trigger_at_market_close=trigger_at_market_close, quiet=quiet)
237 elif interday:
238 h = hist.get(start_d, end_d, period=None, max_age=max_age, trigger_at_market_close=trigger_at_market_close, quiet=quiet)

File /usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py:833, in PriceHistory.get(self, start, end, period, max_age, trigger_at_market_close, repair, prepost, adjust_splits, adjust_divs, quiet)
831 if isinstance(y, (datetime, pd.Timestamp)):
832 if y > dt_now:
--> 833 ranges_to_fetch[i][1] = min(dt_now.ceil('1D'), y)
834 elif y > d_now_exchange:
835 sched = yfct.GetExchangeSchedule(self.exchange, d_now_exchange, y + td_1d)

TypeError: 'tuple' object does not support item assignment

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

Spent a bit more time: the problem is insofar now clear. It seems to install the right version:

pip3 install git+https://github.com/ValueRaider/yfinance-cache.git@bug-fixes
Collecting git+https://github.com/ValueRaider/yfinance-cache.git@bug-fixes
  Cloning https://github.com/ValueRaider/yfinance-cache.git (to revision bug-fixes) to /private/var/folders/5p/rmdv_qj931j4vmt4ldbjqz6c0000gn/T/pip-req-build-0eo4xk00
  Running command git clone --filter=blob:none --quiet https://github.com/ValueRaider/yfinance-cache.git /private/var/folders/5p/rmdv_qj931j4vmt4ldbjqz6c0000gn/T/pip-req-build-0eo4xk00
  Running command git checkout -b bug-fixes --track origin/bug-fixes
  Switched to a new branch 'bug-fixes'
  branch 'bug-fixes' set up to track 'origin/bug-fixes'.
  Resolved https://github.com/ValueRaider/yfinance-cache.git to commit 07b8a883fcf6da69e8f5d7f1a149ef1554ecc170
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done

But, when I compare the error trace with the actual code in the repo. It seems, it is not accessing the bug-fixes version, but an old version

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

TypeError: 'tuple' object does not support item assignment

Good news: I reproduced this, and pushed a fix.

But, when I compare the error trace with the actual code in the repo. It seems, it is not accessing the bug-fixes version

? The stack trace matches latest bug-fixes (excluding this new fix).

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

hm, ok.
and another variant:

Traceback (most recent call last):
  File "/Users/schmid/Documents/Private-Programming/Private-Trades/Data-downloader/data-download.py", line 161, in <module>
    download_all_data(tickers)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/schmid/Documents/Private-Programming/Private-Trades/Data-downloader/data-download.py", line 146, in download_all_data
    data = download_data(ticker_name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/schmid/Documents/Private-Programming/Private-Trades/Data-downloader/data-download.py", line 120, in download_data
    parthist = ticker.history(period="7d", interval="1m")
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py", line 236, in history
    h = hist.get(start=None, end=None, period=period, max_age=max_age, trigger_at_market_close=trigger_at_market_close, quiet=quiet)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py", line 501, in get
    self._applyNewEvents()
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py", line 3915, in _applyNewEvents
    self._updatedCachedPrices(self.h)
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py", line 414, in _updatedCachedPrices
    raise Exception(msg)
Exception: _updatedCachedPrices() writing DF with corrupt 'Repaired?' column, investigate
ticker=MSFT
interval=1m DF range 2023-08-07 09:30:00-04:00 >- 2023-08-11 15:59:00-04:00

but at least also the diagnostic messages.

I think, this process is not that effective, we need s.th. that is 100% repeatable for you as well.


Here is a minimal program that seems to be reliably crashing for me with the current version:

import yfinance_cache as yf

ticker = yf.Ticker("msft")  
parthist = ticker.history(period="7d", interval="1m") 

(The error message is basically the same)

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

I think, this process is not that effective, we need s.th. that is 100% repeatable for you as well.

What might work is this:

  • pass a requests_cache object to YFC: yfc.Ticker(tkr, session=...)
  • run your code
  • upload the requests_cache file

As long as we both run code in same market session, then the cached data should be used.

EDIT: Also, add this to the top of code and upload STDOUT:
import yfinance as y ; y.enable_debug_mode()
Then I can confirm/deny my execution of YFC is requesting the same data from Yahoo.

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

I just eliminated the session and everything to ensure that specific details of its configuration do not lead to this behavior. ;-)

So, here is another version and the uploaded cache.

Program:

import yfinance_cache as yf
from requests import Session
from requests_cache import CacheMixin, SQLiteCache

class CachedSession(CacheMixin, Session): pass
session = CachedSession(
    backend=SQLiteCache("test.cache"), # alternative SQLiteCache(use_memory=True)
)

ticker = yf.Ticker("msft", session=session)  
parthist = ticker.history(period="7d", interval="1m") 

test.cache.zip

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

Didn't reproduce. Post/upload your STDOUT with yfinance.enable_debug_mode(). And confirm your yfinance version: yfinance.__version__

EDIT: And are you sure that cache file is from after execution? I'm not hitting it at all, and after I run code the cache file is 13x bigger. Something smells fishy here ...

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

For a moment, I thought, I have it working. - Then, I realized I am accessing yfinance instead of yfinance-cache.

I modified the program to detail it more:

import yfinance as yf
import yfinance_cache as yft
from requests import Session
import requests_cache

print(yf.__version__)
yf.enable_debug_mode()

session = requests_cache.CachedSession('test.cache')
session.headers['User-agent'] = 'my-program/1.0'
ticker = yft.Ticker('msft', session=session)
parthist = ticker.history(period="7d", interval="1m")

prints version and enables debug. Output below:

0.2.28
Traceback (most recent call last):
  File "/Users/schmid/Documents/Private-Programming/Private-Trades/Data-downloader/download-test.py", line 12, in <module>
    parthist = ticker.history(period="7d", interval="1m")
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py", line 236, in history
    h = hist.get(start=None, end=None, period=period, max_age=max_age, trigger_at_market_close=trigger_at_market_close, quiet=quiet)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py", line 501, in get
    self._applyNewEvents()
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py", line 3915, in _applyNewEvents
    self._updatedCachedPrices(self.h)
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py", line 414, in _updatedCachedPrices
    raise Exception(msg)
Exception: _updatedCachedPrices() writing DF with corrupt 'Repaired?' column, investigate
ticker=MSFT
interval=1m DF range 2023-08-07 09:30:00-04:00 >- 2023-08-11 15:59:00-04:00

Prior to running it, I deleted the existing cache, uninstalled yfinance and yfinance-cache and reinstalled them (the latter from github - bug-fixes)

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

I can't help if you ignore my requests. Twice I have asked you to put yfinance.enable_debug_mode() at top of your code (3x now).

I'll play with LLMs and see if I can get it to litter code with debug checks, print exception as soon as data is corrupted ..

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

As you see in the code (as I posted), I did introduce "yf.enable_debug_mode()".
It didn't do anything I could observe. I am also not exactly not sure, how yfinance and yfinance-cache are intertwined, as the calls are to yfinance-cache. hence, I do not know what should be going on.
But I agree.
yfinance works for me sufficiently well. yfinance-cache works for you. We are both wasting our time.

I cannot understand why my code doesn't throw problems when you are running it. Things are not working as they should, if I try it. Probably some pecularities of our respective setups.

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

With yf.enable_debug_mode() you should see verbose output like this:

DEBUG    Entering history()
DEBUG     MSFT: Yahoo GET parameters: {'period1': '2023-08-15 09:30:00-04:00', 'period2': '2023-08-17 11:30:00-04:00', 'interval': '1m', 'includePrePost': False, 'events': 'div,splits,capitalGains'}
DEBUG     MSFT: yfinance received OHLC data: 2023-08-15 13:30:00 -> 2023-08-16 20:00:00
...
DEBUG     MSFT: yfinance returning OHLC: 2023-08-15 09:30:00-04:00 -> 2023-08-16 15:59:00-04:00
DEBUG    Exiting history()

If you don't see any output, that itself is sign of another problem at your end.

You are not wasting my time, I want to resolve this bug. Try one more thing for me - latest commit will check every single DataFrame modification for corruption, should tell me exactly where it originates.

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

yes, this is how it looks like, when I do everything through yfinance.

double checked: yft has no version attribute and also no enable debug mode. Thus effectively, I am switching on debug mode for an imported yf, but then I am using yfc. yf is except for enable debug mode not referenced. It is probably referenced internally by yfc, but in some sense I am not to surprised, it does not turn on debug mode indirectly. Perhaps this is part of the problem, why it does not output for me? But I am not deep enough into the handling of modules in python to judge.
Another could be: I ran everything on a mac, s.th. may be different.

For reference, the test I ran:

import yfinance as yf
import yfinance_cache as yfc
from requests import Session
import requests_cache

print(yf.__version__)
yf.enable_debug_mode()


session = requests_cache.CachedSession('test.cache')
session.headers['User-agent'] = 'my-program/1.0'
ticker = yfc.Ticker('msft', session=session)
parthist = ticker.history(period="7d", interval="1m")

python-cache uninstall and reinstalled from github, cache erased.
Errors and output forwarded by python3 download-test.py >&out

out-file below

0.2.28
Traceback (most recent call last):
  File "** path removed ** / download-test.py", line 13, in <module>
    parthist = ticker.history(period="7d", interval="1m")
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_ticker.py", line 234, in history
    hist = self._histories_manager.GetHistory(interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py", line 60, in GetHistory
    self.histories[key] = PriceHistory(self, self.ticker, self.exchange, self.tzName, key, self.session, self.proxy, repair=True, contiguous=False)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py", line 354, in __init__
    self.h = self._getCachedPrices()
             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_prices_manager.py", line 379, in _getCachedPrices
    h = yfcu.CustomNanCheckingDataFrame(h)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_utils.py", line 16, in __init__
    self.check_nans()
  File "/usr/local/lib/python3.11/site-packages/yfinance_cache/yfc_utils.py", line 38, in check_nans
    raise Exception(f"NaNs detected in column 'Repaired?'!")
Exception: NaNs detected in column 'Repaired?'! 

Attached the generated cache (was erased before).

With this, I have to end this. If it is not repeatable debugging is just not realistic. Perhaps I check in again in a few months.

from yfinance-cache.

kschmid avatar kschmid commented on September 23, 2024

forgot to attach the cache.

test.cache.zip

from yfinance-cache.

ValueRaider avatar ValueRaider commented on September 23, 2024

When I get time I'll dig through that cache, should be able to deduce what requests sent to Yahoo.

The way yf.enable_debug_mode() works is it modifies the global singleton logger object for yfinance, so shouldn't matter where it is called. Just needs to be called before anything else uses yfinance and triggers initialising its logger. So it printing nothing for you is sign of a problem.

from yfinance-cache.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.