code: def boll(
      df,
      periods=20,
      boll_std=2,
      column=None,
      include=True,
      str="{name}({column},{period})",
      detail=False,
      **boll_kwargs,
  ):
      def _boll(df, periods, column):
          study = "BOLL"
          df, _df, column = validate(df, column)
  
          ## === talib ====
          # upper,middle,lower=talib.BBANDS(df[column].values,periods,boll_std,boll_std)
          # _df=pd.DataFrame({'SMA':middle,'UPPER':upper,'LOWER':lower},index=df.index)
          ## === /talib ====
  
          ## === pure python ====
          _df["SMA"] = df[column].rolling(window=periods).mean()
          _df["UPPER"] = (
              _df["SMA"]
              + df[column].rolling(window=periods).std() * boll_std
          )
          _df["LOWER"] = (
              _df["SMA"]
              - df[column].rolling(window=periods).std() * boll_std
          )
          ## === /pure python ====
  
          return rename(
              df,
              _df,
              study,
              periods,
              column,
              False,
              str,
              detail,
              output=output,
          )
  
      column = make_list(column)
      periods = make_list(periods)
      output = ["SMA", "UPPER", "LOWER"]
      __df = pd.concat(
          [
              _boll(df, column=x, periods=y)
              for y in periods
              for x in column
          ],
          axis=1,
      )
      if include:
          return pd.concat([df, __df], axis=1)
      else:
          return __df
  
imports: import pandas
  import numpy
  from plotly.graph_objs import Figure
  from .utils import make_list
label_desc: Use image node_id 14 for calling a global function with example usage: boll(df, periods, boll_std, column, include, str, detail) and returns: rename, pd, __df