text: #----------------------------------------------------------------------------------#
  
  #Chapter 2 - Bootstrap confidence intervals
  
  
  
  #----------------------------------------------------------------------------------#
  
  #Visualizing bootstrap samples
  for _ in range(50):
      # Generate bootstrap sample: bs_sample
      bs_sample = np.random.choice(rainfall, size=len(rainfall))
  
      # Compute and plot ECDF from bootstrap sample
      x, y = ecdf(bs_sample)
      _ = plt.plot(x, y, marker='.', linestyle='none',
                   color='gray', alpha=0.1)
  
  # Compute and plot ECDF from original data
  x, y = ecdf(rainfall)
  _ = plt.plot(x, y, marker='.')
  
  # Make margins and label axes
  plt.margins(0.02)
  _ = plt.xlabel('yearly rainfall (mm)')
  _ = plt.ylabel('ECDF')
  
  # Show the plot
  plt.show()
  
  
  #----------------------------------------------------------------------------------#
  
  #Generating many bootstrap replicates
  def draw_bs_reps(data, func, size=1):
      """Draw bootstrap replicates."""
  
      # Initialize array of replicates: bs_replicates
      bs_replicates = np.empty(size)
  
      # Generate replicates
      for i in range(size):
          bs_replicates[i] = bootstrap_replicate_1d(data, func)
  
      return bs_replicates
  
  
  #----------------------------------------------------------------------------------#
  #Bootstrap replicates of the mean and the SEM
  
  # Take 10,000 bootstrap replicates of the mean: bs_replicates
  bs_replicates = draw_bs_reps(rainfall, np.mean, size=10000)
  
  # Compute and print SEM
  sem = np.std(rainfall) / np.sqrt(len(rainfall))
  print(sem)
  
  # Compute and print standard deviation of bootstrap replicates
  bs_std = np.std(bs_replicates)
  print(bs_std)
  
  # Make a histogram of the results
  _ = plt.hist(bs_replicates, bins=50, normed=True)
  _ = plt.xlabel('mean annual rainfall (mm)')
  _ = plt.ylabel('PDF')
  
  # Show the plot
  plt.show()
  
  
  #----------------------------------------------------------------------------------#
  #Bootstrap replicates of other statistics
  # Generate 10,000 bootstrap replicates of the variance: bs_replicates
  bs_replicates = draw_bs_reps(rainfall,np.var,size=10000)
  
  # Put the variance in units of square centimeters
  bs_replicates = bs_replicates / 100
  
  # Make a histogram of the results
  _ = plt.hist(bs_replicates, normed=True, bins=50)
  _ = plt.xlabel('variance of annual rainfall (sq. cm)')
  _ = plt.ylabel('PDF')
  
  # Show the plot
  plt.show()
  
  
  #----------------------------------------------------------------------------------#
  #Confidence interval on the rate of no-hitters
  
  # Draw bootstrap replicates of the mean no-hitter time (equal to tau): bs_replicates
  bs_replicates = draw_bs_reps(nohitter_times,np.mean,size=10000)
  
  # Compute the 95% confidence interval: conf_int
  conf_int = np.percentile(bs_replicates,[2.5,97.5])
  
  # Print the confidence interval
  print('95% confidence interval =', conf_int, 'games')
  
  # Plot the histogram of the replicates
  _ = plt.hist(bs_replicates, bins=50, normed=True)
  _ = plt.xlabel(r'$\tau$ (games)')
  _ = plt.ylabel('PDF')
  
  # Show the plot
  plt.show()
  
  
  #----------------------------------------------------------------------------------#
  #A function to do pairs bootstrap
  
  def draw_bs_pairs_linreg(x, y, size=1):
      """Perform pairs bootstrap for linear regression."""
  
      # Set up array of indices to sample from: inds
      inds = np.arange(len(x))
  
      # Initialize replicates: bs_slope_reps, bs_intercept_reps
      bs_slope_reps = np.empty(size)
      bs_intercept_reps = np.empty(size)
  
      # Generate replicates
      for i in range(size):
          bs_inds = np.random.choice(inds, size=len(inds))
          bs_x, bs_y = x[bs_inds], y[bs_inds]
          bs_slope_reps[i], bs_intercept_reps[i] = np.polyfit(bs_x, bs_y, 1)
  
      return bs_slope_reps, bs_intercept_reps
  
  #----------------------------------------------------------------------------------#
  #Pairs bootstrap of literacy/fertility data
  
  # Generate replicates of slope and intercept using pairs bootstrap
  bs_slope_reps, bs_intercept_reps = draw_bs_pairs_linreg(illiteracy, fertility, size=1000)
  
  # Compute and print 95% CI for slope
  print(np.percentile(bs_slope_reps, [2.5,97.5]))
  
  # Plot the histogram
  _ = plt.hist(bs_slope_reps, bins=50, normed=True)
  _ = plt.xlabel('slope')
  _ = plt.ylabel('PDF')
  plt.show()
  
  #----------------------------------------------------------------------------------#
  #Plotting bootstrap regressions
  # Generate array of x-values for bootstrap lines: x
  x = np.array([0, 100])
  
  # Plot the bootstrap lines
  for i in range(100):
      _ = plt.plot(x, bs_slope_reps[i] * x + bs_intercept_reps[i],
                   linewidth=0.5, alpha=0.2, color='red')
  
  # Plot the data
  _ = plt.plot(illiteracy, fertility, marker='.', linestyle='none')
  
  # Label axes, set the margins, and show the plot
  _ = plt.xlabel('illiteracy')
  _ = plt.ylabel('fertility')
  plt.margins(0.02)
  plt.show()
  
  
  
  
  
  #----------------------------------------------------------------------------------#
  
  
  
  #----------------------------------------------------------------------------------#
  #----------------------------------------------------------------------------------#
  #----------------------------------------------------------------------------------#
  #----------------------------------------------------------------------------------#
  
  #----------------------------------------------------------------------------------#
  #----------------------------------------------------------------------------------#
  #----------------------------------------------------------------------------------#
  #----------------------------------------------------------------------------------#
  #----------------------------------------------------------------------------------#