docstr: get FeatureStorage end index
  
  Notes
  -----
  The  right index of the data range (both sides are closed)
  
      The next  data appending point will be  `end_index + 1`
  
  If the data(storage) does not exist, return None
docstr_tok: ["get","FeatureStorage","end","index","Notes","--","--","-","The","right","index","of","the","data","range","(","both","sides","are","closed",")","The","next","data","appending","point","will","be","`","end_index","+","1","`","If","the","data","(","storage",")","does","not","exist",",","return","None"]
code: def end_index(self) -> Union[int, None]:
      """get FeatureStorage end index
  
      Notes
      -----
      The  right index of the data range (both sides are closed)
  
          The next  data appending point will be  `end_index + 1`
  
      If the data(storage) does not exist, return None
      """
      raise NotImplementedError(
          "Subclass of FeatureStorage must implement `end_index` method"
      )
  
imports: import re
  from typing import Iterable, overload, Tuple, List, Text, Union, Dict
  import numpy
  import pandas
  from qlib.log import get_module_logger
label_desc: Use image node_id 4 for calling the FeatureStorage obj's underlying member method code with example usage: obj.end_index() without return types