class_docstr: # Watchlist Class (** This is subject to change! **)
  A simple Class to load/download financial market data and automatically
  apply Technical Analysis indicators with a Pandas TA Strategy.
  
  Default Strategy: pandas_ta.CommonStrategy
  
  ## Package Support:
  ### Data Source (Default: AlphaVantage)
  - AlphaVantage (pip install alphaVantage-api).
  - Python Binance (pip install python-binance). # Future Support
  - Yahoo Finance (pip install yfinance). # Almost Supported
  
  # Technical Analysis:
  - Pandas TA (pip install pandas_ta)
  
  ## Required Arguments:
  - tickers: A list of strings containing tickers. Example: ["SPY", "AAPL"]
class_docstr_tok: ["#","Watchlist","Class","(","*","*","This","is","subject","to","change","!","*","*",")","A","simple","Class","to","load\/download","financial","market","data","and","automatically","apply","Technical","Analysis","indicators","with","a","Pandas","TA","Strategy",".","Default","Strategy",":","pandas_ta.CommonStrategy","#","#","Package","Support",":","#","#","#","Data","Source","(","Default",":","AlphaVantage",")","-","AlphaVantage","(","pip","install","alphaVantage-api",")",".","-","Python","Binance","(","pip","install","python-binance",")",".","#","Future","Support","-","Yahoo","Finance","(","pip","install","yfinance",")",".","#","Almost","Supported","#","Technical","Analysis",":","-","Pandas","TA","(","pip","install","pandas_ta",")","#","#","Required","Arguments",":","-","tickers",":","A","list","of","strings","containing","tickers",".","Example",":","[","``","SPY","''",",","``","AAPL","''","]"]
docstr: Loads or Downloads (if a local csv does not exist) the data from the
  Data Source. When successful, it returns a Data Frame for the requested
  ticker. If no tickers are given, it loads all the tickers.
docstr_tok: ["Loads","or","Downloads","(","if","a","local","csv","does","not","exist",")","the","data","from","the","Data","Source",".","When","successful",",","it","returns","a","Data","Frame","for","the","requested","ticker",".","If","no","tickers","are","given",",","it","loads","all","the","tickers","."]
code: def load(
      self,
      ticker: str = None,
      tf: str = None,
      index: str = "date",
      drop: list = [],
      plot: bool = False,
      **kwargs,
  ) -> pd.DataFrame:
      """Loads or Downloads (if a local csv does not exist) the data from the
      Data Source. When successful, it returns a Data Frame for the requested
      ticker. If no tickers are given, it loads all the tickers."""
  
      tf = self.tf if tf is None else tf.upper()
      if ticker is not None and isinstance(ticker, str):
          ticker = str(ticker).upper()
      else:
          print(f"[!] Loading All: {', '.join(self.tickers)}")
          self._load_all(**kwargs)
          return
  
      filename_ = f"{ticker}_{tf}.csv"
      current_file = Path(self.file_path) / filename_
  
      # Load local or from Data Source
      if current_file.exists():
          file_loaded = f"[i] Loaded {ticker}[{tf}]: {filename_}"
          # if self.ds_name == "av":
          if self.ds_name in ["av", "yahoo"]:
              df = pd.read_csv(current_file, index_col=0)
              if not df.ta.datetime_ordered:
                  df = df.set_index(pd.DatetimeIndex(df.index))
              print(file_loaded)
          else:
              print(
                  f"[X] {filename_} not found in {Path(self.file_path)}"
              )
              return
      else:
          print(f"[+] Downloading[{self.ds_name}]: {ticker}[{tf}]")
          if self.ds_name == "av":
              df = self.ds.data(ticker, tf)
              if not df.ta.datetime_ordered:
                  df = df.set_index(pd.DatetimeIndex(df[index]))
          if self.ds_name == "yahoo":
              yf_data = self.ds.Ticker(ticker)
              df = yf_data.history(period="max")
              to_save = f"{self.file_path}/{ticker}_{tf}.csv"
              print(f"[+] Saving: {to_save}")
              df.to_csv(to_save)
  
      # Remove select columns
      df = self._drop_columns(df, drop)
  
      if kwargs.pop("analyze", True):
          if self.debug:
              print(
                  f"[+] TA[{len(self.strategy.ta)}]: {self.strategy.name}"
              )
          df.ta.strategy(self.strategy, timed=self.timed, **kwargs)
  
      df.ticker = ticker  # Attach ticker to the DataFrame
      df.tf = tf
  
      if plot:
          self._plot(df, **kwargs)
      return df
  
imports: import datetime
  from pathlib import Path
  from random import random
  from typing import Tuple
  import pandas
  from pandas_datareader import data
  import yfinance
  from numpy import arange
  from numpy import append
  from numpy import array
  import alphaVantageAPI
  import pandas_ta
label_desc: Use image node_id 6 for calling the Watchlist obj's underlying member method code with example usage: obj.load(ticker, tf, index, drop, plot) and returns: df