docs: def site_analysis(self, folder_name, site_install_mapping, end_date):
          """ Summarize site data into a single table.
  
          folder_name         : str
              Folder where all site data resides.
          site_event_mapping  : dic
              Dictionary of site name to date of installation.
          end_date            : str
              End date of data collected.
  
          """
  
          def count_number_of_days(site, end_date):
              """ Counts the number of days between two dates.
  
              Parameters
              ----------
              site        : str
                  Key to a dic containing site_name -> pelican installation date.
              end_date    : str
                  End date.
  
              Returns
              -------
              int
                  Number of days
  
              """
              
              start_date = site_install_mapping[site]
              start_date = start_date.split('-')
              start = date(int(start_date[0]), int(start_date[1]), int(start_date[2]))
              
              end_date = end_date.split('-')
              end = date(int(end_date[0]), int(end_date[1]), int(end_date[2]))
              
              delta = end - start
              return delta.days
  
  
          if not folder_name or not isinstance(folder_name, str):
              raise TypeError("folder_name should be type string")
          else:
              list_json_files = []
              df      = pd.DataFrame()
              temp_df = pd.DataFrame()
              json_files = [f for f in os.listdir(folder_name) if f.endswith('.json')]
              
              for json_file in json_files:
                  
                  with open(folder_name + json_file) as f:
                      js = json.load(f)
                      num_days = count_number_of_days(js['Site'], end_date)
                  
                      e_abs_sav = round(js['Energy Savings (absolute)'] / 1000, 2) # Energy Absolute Savings
                      e_perc_sav = round(js['Energy Savings (%)'], 2) # Energy Percent Savings
                      ann_e_abs_sav = (e_abs_sav / num_days) * 365 # Annualized Energy Absolute Savings
                      
                      d_abs_sav = round(js['User Comments']['Dollar Savings (absolute)'], 2) # Dollar Absolute Savings
                      d_perc_sav = round(js['User Comments']['Dollar Savings (%)'], 2) # Dollar Percent Savings
                      ann_d_abs_sav = (d_abs_sav / num_days) * 365 # Annualized Dollar Absolute Savings
  
                      temp_df = pd.DataFrame({
                          'Site': js['Site'],
                          '#Days since Pelican Installation': num_days,
  
                          'Energy Savings (%)': e_perc_sav,
                          'Energy Savings (kWh)': e_abs_sav,
                          'Annualized Energy Savings (kWh)': ann_e_abs_sav,
                          
                          'Dollar Savings (%)': d_perc_sav,
                          'Dollar Savings ($)': d_abs_sav,
                          'Annualized Dollar Savings ($)': ann_d_abs_sav,
                          
                          'Best Model': js['Model']['Optimal Model\'s Metrics']['name'],
                          'Adj R2': round(js['Model']['Optimal Model\'s Metrics']['adj_cross_val_score'], 2),
                          
                          'RMSE': round(js['Model']['Optimal Model\'s Metrics']['rmse'], 2),
                          'MAPE': js['Model']['Optimal Model\'s Metrics']['mape'],
                          'Uncertainity': js['Uncertainity'],
                      }, index=[0])
                  
                  df = df.append(temp_df)
  
              df.set_index('Site', inplace=True)
              return df