Training data contains {{num_rows_train}} rows
diff --git a/application/code_generator.py b/application/code_generator.py index 7eab41f..fff4aeb 100644 --- a/application/code_generator.py +++ b/application/code_generator.py @@ -1,72 +1,78 @@ from model import code_blocks class CodeGenerator: - def __init__(self, template_mapping, parse_template): - self.blocks = code_blocks.AllBlocks() - self.function_mapping = template_mapping - self.parse_template = parse_template - self.data = {} + def __init__(self, template_mapping, parse_template): + self.blocks = code_blocks.AllBlocks() + self.function_mapping = template_mapping + self.parse_template = parse_template + self.data = {} - def get_data(self): - return self.data['dataframe'] + #call to resetAll() function in clas AllBblocks of code_blocks.py + def resetone(self): + self.blocks.reset_all() + self.data = {} - def load_data(self, csv_file): - dataframe = self._parse_and_execute('read_csv', [csv_file]) - self._save('dataframe', dataframe) - self._save('X', dataframe) - return self.data['dataframe'].shape + def get_data(self): + return self.data['dataframe'] - def describe_data(self): - output = self._parse_and_execute('describe_data', ['dataframe']) - return output + def load_data(self, csv_file): + dataframe = self._parse_and_execute('read_csv', [csv_file]) + self._save('dataframe', dataframe) + self._save('X', dataframe) + return self.data['dataframe'].shape - def clean_data(self): - self._parse_and_execute('clean_data', ['dataframe']) - return self.data['dataframe'].shape + def describe_data(self): + output = self._parse_and_execute('describe_data', ['dataframe']) + return output - def get_labels(self): - keys = self._parse_and_execute('get_keys', ['X']) - return keys.values.tolist() + def clean_data(self): + self._parse_and_execute('clean_data', ['dataframe']) + return self.data['dataframe'].shape - def drop_x(self, input_labels): - x_values = self._parse_and_execute('drop_x', ['X', input_labels]) - self._save('X', x_values) + def get_labels(self): + keys = self._parse_and_execute('get_keys', ['X']) + return keys.values.tolist() - def select_y(self, output_label): - x_values, y_values = self._parse_and_execute('select_y', ['X', output_label]) - self._save('X', x_values) - self._save('Y', y_values) + def drop_x(self, input_labels): + x_values = self._parse_and_execute('drop_x', ['X', input_labels]) + self._save('X', x_values) - def split_data(self, train_ratio = 0.8, seed = 200): - (train, test) = self._parse_and_execute('split',['X',train_ratio,seed]) - self.data['train'] = train - self.data['test'] = test - return self.data['train'].shape + def select_y(self, output_label): + x_values, y_values = self._parse_and_execute( + 'select_y', ['X', output_label]) + self._save('X', x_values) + self._save('Y', y_values) - def download_code(self): - return self.blocks.to_text() + def split_data(self, train_ratio=1, seed=200): + (train, test) = self._parse_and_execute( + 'split', ['X', train_ratio, seed]) + self.data['train'] = train + self.data['test'] = test + return self.data['train'].shape - def _create_new_block(self, comment, statements): - block = code_blocks.CodeBlock(comment, statements) - self.blocks.add_next_block(block) + def download_code(self): + return self.blocks.to_text() - def _parse_and_execute(self, template, args): - replaced_args = [] - string_args = [] - for arg in args: - if isinstance(arg, str) and arg in self.data: - replaced_args.append(self.data[arg]) - string_args.append(arg) - else: - replaced_args.append(arg) - if isinstance(arg, str): - string_args.append('\"'+arg+'\"') - else: - string_args.append(str(arg)) + def _create_new_block(self, comment, statements): + block = code_blocks.CodeBlock(comment, statements) + self.blocks.add_next_block(block) - (comments, code) = self.parse_template(template, string_args) - self._create_new_block(comments[0], code) - output = self.function_mapping[template](replaced_args) - return output + def _parse_and_execute(self, template, args): + replaced_args = [] + string_args = [] + for arg in args: + if isinstance(arg, str) and arg in self.data: + replaced_args.append(self.data[arg]) + string_args.append(arg) + else: + replaced_args.append(arg) + if isinstance(arg, str): + string_args.append('\"'+arg+'\"') + else: + string_args.append(str(arg)) + (comments, code) = self.parse_template(template, string_args) + self._create_new_block(comments[0], code) + output = self.function_mapping[template](replaced_args) + return output - def _save(self, key, value): - self.data[key] = value + def _save(self, key, value): + self.data[key] = value diff --git a/flask_app/flask_main.py b/flask_app/flask_main.py index 0ab9c87..17a7917 100644 --- a/flask_app/flask_main.py +++ b/flask_app/flask_main.py @@ -1,16 +1,13 @@ import os - from flask import g from flask import Flask from flask import render_template from flask import request, redirect, flash from werkzeug.utils import secure_filename - from application import code_generator from pandas_code.mapping import template_mapping from pandas_code.parse_template import parse_template - ALLOWED_EXTENSIONS = {'csv'} app = Flask(__name__, template_folder='templates') @@ -20,85 +17,91 @@ @app.route('/') def welcome(): - return render_template('home.html') + return render_template('home.html') def allowed_file(filename): - return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/download', methods=['GET']) def download_code(): - code = generator.download_code() - return render_template('info/code.html', text=code) + code = generator.download_code() + return render_template('info/code.html', text=code) @app.route('/describe', methods=['GET']) def describe_data(): - description = generator.describe_data() - return render_template('info/description.html',table=description.to_html()) + description = generator.describe_data() + return render_template('info/description.html',table=description.to_html()) + +#added start over option in base.html to clear the previous block of code +@app.route('/start_over', methods=['GET']) +def start_over(): + generator.resetone() + return render_template('home.html') @app.route('/clean', methods=['GET']) def clean_data(): - original_data_size = generator.get_data().shape - cleaned_data_size = generator.clean_data() - num_rows_removed = original_data_size[0]-cleaned_data_size[0] - return render_template('info/cleaning_summary.html', removed_rows=num_rows_removed) + original_data_size = generator.get_data().shape + cleaned_data_size = generator.clean_data() + num_rows_removed = original_data_size[0]-cleaned_data_size[0] + return render_template('info/cleaning_summary.html', removed_rows=num_rows_removed) @app.route('/split', methods=['GET']) def split_data(): - train_data_size = generator.split_data() - return render_template('info/splitting_summary.html', num_rows_train=train_data_size[0]) + train_data_size = generator.split_data() + return render_template('info/splitting_summary.html', num_rows_train=train_data_size[0]) @app.route('/input_labels', methods=['GET', 'POST']) def get_input_labels(): - if request.method == 'POST': - request_dict = request.form.to_dict(flat=False) - generator.drop_x(request_dict['drop_labels']) - return render_template('actions/actions.html') + if request.method == 'POST': + request_dict = request.form.to_dict() + generator.drop_x(request_dict['drop_labels']) + return render_template('actions/actions.html') - keys = generator.get_labels() - return render_template('actions/select_input_values.html', labels=keys) + keys = generator.get_labels() + return render_template('actions/select_input_values.html', labels=keys) @app.route('/labels', methods=['GET', 'POST']) def get_data_labels(): - if request.method == 'POST': - request_dict = request.form.to_dict() - generator.select_y(request_dict['label']) - return redirect('/input_labels') - - keys = generator.get_labels() - return render_template('actions/select_output_value.html', labels=keys) + if request.method == 'POST': + request_dict = request.form.to_dict() + generator.select_y(request_dict['label']) + return redirect('/input_labels') + keys = generator.get_labels() + return render_template('actions/select_output_value.html', labels=keys) # return render_template('labels.html', labels=keys) @app.route('/data', methods=['GET', 'POST']) def upload_file(): - if request.method == 'POST': - # check if the post request has the file part - if 'file' not in request.files: - flash('No file part') - return redirect(request.url) - - file = request.files['file'] - # If the user does not select a file, the browser submits an - # empty file without a filename. - if file.filename == '': - flash('No selected file') - return redirect(request.url) - if file and allowed_file(file.filename): - filename = secure_filename(file.filename) - file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) - # return redirect(url_for('download_file', name=filename)) - print(g) - with app.app_context(): - generator.load_data(app.config['UPLOAD_FOLDER']+'/'+filename) - return render_template('actions/actions.html') - - return render_template('actions/upload_data.html') + if request.method == 'POST': + # check if the post request has the file part + if 'file' not in request.files: + flash('No file part') + return redirect(request.url) + file = request.files['file'] + # If the user does not select a file, the browser submits an + # empty file without a filename. + if file.filename == '': + flash('No selected file') + return redirect(request.url) + if file and allowed_file(file.filename): + filename = secure_filename(file.filename) + file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) + # return redirect(url_for('download_file', name=filename)) + print(g) + #call to resetone() in class CodeGenerator in code_generator.py + generator.resetone() + with app.app_context(): + generator.load_data(app.config['UPLOAD_FOLDER']+'/'+filename) + return render_template('actions/actions.html') + return render_template('actions/upload_data.html') @app.route('/actions') def next_actions(): - return render_template('actions/actions.html') + return render_template('actions/actions.html') # main driver function if __name__ == '__main__': - # run() method of Flask class runs the application - # on the local development server. - app.run() + # run() method of Flask class runs the application + # on the local development server. + app.run() + \ No newline at end of file diff --git a/flask_app/templates/actions/select_input_values.html b/flask_app/templates/actions/select_input_values.html index 8f940b6..2df7e69 100644 --- a/flask_app/templates/actions/select_input_values.html +++ b/flask_app/templates/actions/select_input_values.html @@ -11,7 +11,7 @@
Training data contains {{num_rows_train}} rows