class_docstr: Provides methods for retrieving daily stock data from
  Yahoo Finance API
  
  Attributes
  ----------
      start_date : str
          start date of the data (modified from neofinrl_config.py)
      end_date : str
          end date of the data (modified from neofinrl_config.py)
      ticker_list : list
          a list of stock tickers (modified from neofinrl_config.py)
  
  Methods
  -------
  fetch_data()
      Fetches data from yahoo API
docstr: Fetches data from Yahoo API
  Parameters
  ----------
  
  Returns
  -------
  `pd.DataFrame`
      7 columns: A date, open, high, low, close, volume and tick symbol
      for the specified stock ticker
docstr_tok: ["Fetches","data","from","Yahoo","API","Parameters","--","--","--","--","--","Returns","--","--","--","-","`","pd.DataFrame","`","7","columns",":","A","date",",","open",",","high",",","low",",","close",",","volume","and","tick","symbol","for","the","specified","stock","ticker"]
code: def fetch_data(self, proxy=None) -> pd.DataFrame:
      """Fetches data from Yahoo API
      Parameters
      ----------
  
      Returns
      -------
      `pd.DataFrame`
          7 columns: A date, open, high, low, close, volume and tick symbol
          for the specified stock ticker
      """
      # Download and save the data in a pandas DataFrame:
      data_df = pd.DataFrame()
      num_failures = 0
      for tic in self.ticker_list:
          temp_df = yf.download(
              tic, start=self.start_date, end=self.end_date, proxy=proxy
          )
          temp_df["tic"] = tic
          if len(temp_df) > 0:
              # data_df = data_df.append(temp_df)
              data_df = pd.concat([data_df, temp_df], axis=0)
          else:
              num_failures += 1
      if num_failures == len(self.ticker_list):
          raise ValueError("no data is fetched.")
      # reset the index, we want to use numbers as index instead of dates
      data_df = data_df.reset_index()
      try:
          # convert the column names to standardized names
          data_df.columns = [
              "date",
              "open",
              "high",
              "low",
              "close",
              "adjcp",
              "volume",
              "tic",
          ]
          # use adjusted close price instead of close price
          data_df["close"] = data_df["adjcp"]
          # drop the adjusted close price column
          data_df = data_df.drop(labels="adjcp", axis=1)
      except NotImplementedError:
          print("the features are not supported currently")
      # create day of the week column (monday = 0)
      data_df["day"] = data_df["date"].dt.dayofweek
      # convert date to standard string format, easy to filter
      data_df["date"] = data_df.date.apply(
          lambda x: x.strftime("%Y-%m-%d")
      )
      # drop missing data
      data_df = data_df.dropna()
      data_df = data_df.reset_index(drop=True)
      print("Shape of DataFrame: ", data_df.shape)
      # print("Display DataFrame: ", data_df.head())
  
      data_df = data_df.sort_values(by=["date", "tic"]).reset_index(
          drop=True
      )
  
      return data_df
  
imports: from __future__ import annotations
  import pandas
  import yfinance
label_desc: Use image node_id 2 for calling the YahooDownloader obj's underlying member method code with example usage: obj.fetch_data(proxy) and returns: data_df