def price_variation(df):
  """
  Generate chart data for a box and whisker plot about price variation
  Receives sliced data

  :param df:
    Pandas dataframe
  :type df:
    Dataframe

  :returns:
    (Dict) with the chart data
  :example:
    [ { 'min': '590', 'max': 8090, 'whisker1': 590, 'q1': 1090 } ]
  """
  
  chart_data = {
                'domain': {
                  'x': [],
                  'y': []
                },
                'data': []
                }

  # Prep the dataframe
  s = df.loc[:,['contract_value_amount']]

  # Calculate the data
  qr1 = int(s.quantile(0.25))
  median = int(s.median(numeric_only=True))
  qr3 = int(s.quantile(0.75))
  iqr = qr3 - qr1

  # Outlier = less than Q1 or greater than Q3 by more than 1.5 the IQR
  outlier_min = qr1 - (iqr * 1.5)
  outlier_max = qr3 + (iqr * 1.5)
  ol_series = s[(s > outlier_min) & (s < outlier_max)]

  boxplot = {}
  boxplot['min'] = int(s.min(numeric_only=True))
  boxplot['max'] = int(s.max(numeric_only=True))
  boxplot['whisker1'] = int(ol_series.min())
  boxplot['q1'] = qr1
  boxplot['median'] = median
  boxplot['q3'] = qr3
  boxplot['whisker2'] = int(ol_series.max())

  # Calculate the domains of this slice
  chart_data['data'] = boxplot
  chart_data['domain']['x'] = [int(ol_series.min()), int(ol_series.max())]
  chart_data['domain']['y'] = None

  return chart_data