<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def clean_data(self, data, rename_col=None, drop_col=None, resample=True, freq='h', resampler='mean', interpolate=True, limit=1, method='linear', remove_na=True, remove_na_how='any', remove_outliers=True, sd_val=3, remove_out_of_bounds=True, low_bound=0, high_bound=float('inf'), save_file=True):
 """ Cleans dataframe according to user specifications and stores result in self.cleaned_data. Parameters data : pd.DataFrame() Dataframe to be cleaned. rename_col : list(str) List of new column names. drop_col : list(str) Columns to be dropped. resample : bool Indicates whether to resample data or not. freq : str resampler : str Resampling type i.e. mean, max. interpolate : bool Indicates whether to interpolate data or not. limit : int Interpolation limit. method : str Interpolation method. remove_na : bool Indicates whether to remove NAs or not. remove_na_how : str remove_outliers : bool Indicates whether to remove outliers or not. sd_val : int Standard Deviation Value (specifices how many SDs away is a point considered an outlier) remove_out_of_bounds : bool Indicates whether to remove out of bounds datapoints or not. low_bound : int Low bound of the data. high_bound : int High bound of the data. save_file : bool Specifies whether to save file or not. Defaults to True. Returns ------- pd.DataFrame() Dataframe containing cleaned data. """


        # Check to ensure data is a pandas dataframe
        if not isinstance(data, pd.DataFrame):
            raise TypeError('data has to be a pandas dataframe.')
        
        # Create instance and clean the data
        clean_data_obj = Clean_Data(data)
        clean_data_obj.clean_data(resample=resample, freq=freq, resampler=resampler,
                                interpolate=interpolate, limit=limit, method=method,
                                remove_na=remove_na, remove_na_how=remove_na_how,
                                remove_outliers=remove_outliers, sd_val=sd_val,
                                remove_out_of_bounds=remove_out_of_bounds, low_bound=low_bound, high_bound=high_bound)

        # Correlation plot
        # fig = self.plot_data_obj.correlation_plot(clean_data_obj.cleaned_data)
        # fig.savefig(self.results_folder_name + '/correlation_plot-' + str(Wrapper.global_count) + '.png')

        if rename_col:  # Rename columns of dataframe
            clean_data_obj.rename_columns(rename_col)
        if drop_col:    # Drop columns of dataframe
            clean_data_obj.drop_columns(drop_col)

        # Store cleaned data in wrapper class
        self.cleaned_data = clean_data_obj.cleaned_data

        # Logging
        self.result['Clean'] = {
            'Rename Col': rename_col,
            'Drop Col': drop_col,
            'Resample': resample,
            'Frequency': freq,
            'Resampler': resampler,
            'Interpolate': interpolate,
            'Limit': limit,
            'Method': method,
            'Remove NA': remove_na,
            'Remove NA How': remove_na_how,
            'Remove Outliers': remove_outliers,
            'SD Val': sd_val,
            'Remove Out of Bounds': remove_out_of_bounds,
            'Low Bound': low_bound,
            'High Bound': str(high_bound) if high_bound == float('inf') else high_bound,
            'Save File': save_file
        }

        if save_file:
            f = self.results_folder_name + '/cleaned_data-' + str(self.get_global_count()) + '.csv'
            self.cleaned_data.to_csv(f)
            self.result['Clean']['Saved File'] = f
        else:
            self.result['Clean']['Saved File'] = ''

        return self.cleaned_data