From 2e08dce2440981651dc8a6e775da0258d0b8c1e0 Mon Sep 17 00:00:00 2001 From: RishiTambe <115225018+RishiTambe@users.noreply.github.com> Date: Sun, 9 Oct 2022 17:44:50 +0530 Subject: [PATCH 1/6] Add files via upload From 4cdd98e3855c65f6fb57e6ae24a556e530f64ac8 Mon Sep 17 00:00:00 2001 From: Rishikesh Tambe Date: Sun, 9 Oct 2022 20:29:24 +0530 Subject: [PATCH 2/6] Added an Option to Start Over --- application/code_generator.py | 133 ++++++++------- data/IRIS.csv | 151 +++++++++++++++++ data/iris_new.csv | 151 +++++++++++++++++ flask_app/flask_main.py | 152 ++++++++++-------- .../actions/select_input_values.html | 2 +- flask_app/templates/actions/split_data.html | 6 +- flask_app/templates/base.html | 2 + flask_app/templates/info/code.html | 50 +++--- .../templates/info/splitting_summary.html | 18 ++- main.py | 30 ++-- model/code_blocks.py | 7 +- pandas_code/code_templates/drop_x.py | 2 +- pandas_code/parse_template.py | 62 +++---- 13 files changed, 568 insertions(+), 198 deletions(-) create mode 100644 data/IRIS.csv create mode 100644 data/iris_new.csv diff --git a/application/code_generator.py b/application/code_generator.py index 7eab41f..e1e9de4 100644 --- a/application/code_generator.py +++ b/application/code_generator.py @@ -1,72 +1,91 @@ from model import code_blocks +#from pandas_code.parse_template import parse_template + +# from flask_main import splitted, trainratio 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'] + def resetone(self): + #print("I am in Resetone") + self.blocks.resetAll() + 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_ratio = trainingdata + (train, test) = self._parse_and_execute( + 'split', ['X', train_ratio, seed]) + self.data['train'] = train + self.data['test'] = test + print(f"\n\n\n\n Train Ratio : {train}\n\n\n\n") + 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): + print("I am in download_code") + 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): + print("I am in Create new Block") + 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: + print("I am in if Block",arg) + + replaced_args.append(self.data[arg]) + string_args.append(arg) + else: + #print("I am in else block",replaced_args) + replaced_args.append(arg) + if isinstance(arg, str): + #print("I am in else block",arg,string_args) + string_args.append('\"'+arg+'\"') + else: + string_args.append(str(arg)) - def _save(self, key, value): - self.data[key] = value + (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 diff --git a/data/IRIS.csv b/data/IRIS.csv new file mode 100644 index 0000000..21ae196 --- /dev/null +++ b/data/IRIS.csv @@ -0,0 +1,151 @@ +sepal_length,sepal_width,petal_length,petal_width,species +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3,1.4,0.1,Iris-setosa +4.3,3,1.1,0.1,Iris-setosa +5.8,4,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5,3,1.6,0.2,Iris-setosa +5,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5,3.3,1.4,0.2,Iris-setosa +7,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5,2,3.5,1,Iris-versicolor +5.9,3,4.2,1.5,Iris-versicolor +6,2.2,4,1,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3,5,1.7,Iris-versicolor +6,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6,2.7,5.1,1.6,Iris-versicolor +5.4,3,4.5,1.5,Iris-versicolor +6,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3,4.1,1.3,Iris-versicolor +5.5,2.5,4,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3,4.6,1.4,Iris-versicolor +5.8,2.6,4,1.2,Iris-versicolor +5,2.3,3.3,1,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3,5.8,2.2,Iris-virginica +7.6,3,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3,5.5,2.1,Iris-virginica +5.7,2.5,5,2,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6,2.2,5,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2,Iris-virginica +7.7,2.8,6.7,2,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6,3,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3,5.2,2.3,Iris-virginica +6.3,2.5,5,1.9,Iris-virginica +6.5,3,5.2,2,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3,5.1,1.8,Iris-virginica diff --git a/data/iris_new.csv b/data/iris_new.csv new file mode 100644 index 0000000..32a0a31 --- /dev/null +++ b/data/iris_new.csv @@ -0,0 +1,151 @@ +X1,X2,X3,X4,X5,X6,variety +5.1,3.5,1.4,0.2,0.2,3.5,0 +4.9,3,1.4,0.2,0.2,3,0 +4.7,3.2,1.3,0.2,0.2,3.2,0 +4.6,3.1,1.5,0.2,0.2,3.1,0 +5,3.6,1.4,0.2,0.2,3.6,0 +5.4,3.9,1.7,0.4,0.4,3.9,0 +4.6,3.4,1.4,0.3,0.3,3.4,0 +5,3.4,1.5,0.2,0.2,3.4,0 +4.4,2.9,1.4,0.2,0.2,2.9,0 +4.9,3.1,1.5,0.1,0.1,3.1,0 +5.4,3.7,1.5,0.2,0.2,3.7,0 +4.8,3.4,1.6,0.2,0.2,3.4,0 +4.8,3,1.4,0.1,0.1,3,0 +4.3,3,1.1,0.1,0.1,3,0 +5.8,4,1.2,0.2,0.2,4,0 +5.7,4.4,1.5,0.4,0.4,4.4,0 +5.4,3.9,1.3,0.4,0.4,3.9,0 +5.1,3.5,1.4,0.3,0.3,3.5,0 +5.7,3.8,1.7,0.3,0.3,3.8,0 +5.1,3.8,1.5,0.3,0.3,3.8,0 +5.4,3.4,1.7,0.2,0.2,3.4,0 +5.1,3.7,1.5,0.4,0.4,3.7,0 +4.6,3.6,1,0.2,0.2,3.6,0 +5.1,3.3,1.7,0.5,0.5,3.3,0 +4.8,3.4,1.9,0.2,0.2,3.4,0 +5,3,1.6,0.2,0.2,3,0 +5,3.4,1.6,0.4,0.4,3.4,0 +5.2,3.5,1.5,0.2,0.2,3.5,0 +5.2,3.4,1.4,0.2,0.2,3.4,0 +4.7,3.2,1.6,0.2,0.2,3.2,0 +4.8,3.1,1.6,0.2,0.2,3.1,0 +5.4,3.4,1.5,0.4,0.4,3.4,0 +5.2,4.1,1.5,0.1,0.1,4.1,0 +5.5,4.2,1.4,0.2,0.2,4.2,0 +4.9,3.1,1.5,0.2,0.2,3.1,0 +5,3.2,1.2,0.2,0.2,3.2,0 +5.5,3.5,1.3,0.2,0.2,3.5,0 +4.9,3.6,1.4,0.1,0.1,3.6,0 +4.4,3,1.3,0.2,0.2,3,0 +5.1,3.4,1.5,0.2,0.2,3.4,0 +5,3.5,1.3,0.3,0.3,3.5,0 +4.5,2.3,1.3,0.3,0.3,2.3,0 +4.4,3.2,1.3,0.2,0.2,3.2,0 +5,3.5,1.6,0.6,0.6,3.5,0 +5.1,3.8,1.9,0.4,0.4,3.8,0 +4.8,3,1.4,0.3,0.3,3,0 +5.1,3.8,1.6,0.2,0.2,3.8,0 +4.6,3.2,1.4,0.2,0.2,3.2,0 +5.3,3.7,1.5,0.2,0.2,3.7,0 +5,3.3,1.4,0.2,0.2,3.3,0 +7,3.2,4.7,1.4,1.4,3.2,1 +6.4,3.2,4.5,1.5,1.5,3.2,1 +6.9,3.1,4.9,1.5,1.5,3.1,1 +5.5,2.3,4,1.3,1.3,2.3,1 +6.5,2.8,4.6,1.5,1.5,2.8,1 +5.7,2.8,4.5,1.3,1.3,2.8,1 +6.3,3.3,4.7,1.6,1.6,3.3,1 +4.9,2.4,3.3,1,1,2.4,1 +6.6,2.9,4.6,1.3,1.3,2.9,1 +5.2,2.7,3.9,1.4,1.4,2.7,1 +5,2,3.5,1,1,2,1 +5.9,3,4.2,1.5,1.5,3,1 +6,2.2,4,1,1,2.2,1 +6.1,2.9,4.7,1.4,1.4,2.9,1 +5.6,2.9,3.6,1.3,1.3,2.9,1 +6.7,3.1,4.4,1.4,1.4,3.1,1 +5.6,3,4.5,1.5,1.5,3,1 +5.8,2.7,4.1,1,1,2.7,1 +6.2,2.2,4.5,1.5,1.5,2.2,1 +5.6,2.5,3.9,1.1,1.1,2.5,1 +5.9,3.2,4.8,1.8,1.8,3.2,1 +6.1,2.8,4,1.3,1.3,2.8,1 +6.3,2.5,4.9,1.5,1.5,2.5,1 +6.1,2.8,4.7,1.2,1.2,2.8,1 +6.4,2.9,4.3,1.3,1.3,2.9,1 +6.6,3,4.4,1.4,1.4,3,1 +6.8,2.8,4.8,1.4,1.4,2.8,1 +6.7,3,5,1.7,1.7,3,1 +6,2.9,4.5,1.5,1.5,2.9,1 +5.7,2.6,3.5,1,1,2.6,1 +5.5,2.4,3.8,1.1,1.1,2.4,1 +5.5,2.4,3.7,1,1,2.4,1 +5.8,2.7,3.9,1.2,1.2,2.7,1 +6,2.7,5.1,1.6,1.6,2.7,1 +5.4,3,4.5,1.5,1.5,3,1 +6,3.4,4.5,1.6,1.6,3.4,1 +6.7,3.1,4.7,1.5,1.5,3.1,1 +6.3,2.3,4.4,1.3,1.3,2.3,1 +5.6,3,4.1,1.3,1.3,3,1 +5.5,2.5,4,1.3,1.3,2.5,1 +5.5,2.6,4.4,1.2,1.2,2.6,1 +6.1,3,4.6,1.4,1.4,3,1 +5.8,2.6,4,1.2,1.2,2.6,1 +5,2.3,3.3,1,1,2.3,1 +5.6,2.7,4.2,1.3,1.3,2.7,1 +5.7,3,4.2,1.2,1.2,3,1 +5.7,2.9,4.2,1.3,1.3,2.9,1 +6.2,2.9,4.3,1.3,1.3,2.9,1 +5.1,2.5,3,1.1,1.1,2.5,1 +5.7,2.8,4.1,1.3,1.3,2.8,1 +6.3,3.3,6,2.5,2.5,3.3,2 +5.8,2.7,5.1,1.9,1.9,2.7,2 +7.1,3,5.9,2.1,2.1,3,2 +6.3,2.9,5.6,1.8,1.8,2.9,2 +6.5,3,5.8,2.2,2.2,3,2 +7.6,3,6.6,2.1,2.1,3,2 +4.9,2.5,4.5,1.7,1.7,2.5,2 +7.3,2.9,6.3,1.8,1.8,2.9,2 +6.7,2.5,5.8,1.8,1.8,2.5,2 +7.2,3.6,6.1,2.5,2.5,3.6,2 +6.5,3.2,5.1,2,2,3.2,2 +6.4,2.7,5.3,1.9,1.9,2.7,2 +6.8,3,5.5,2.1,2.1,3,2 +5.7,2.5,5,2,2,2.5,2 +5.8,2.8,5.1,2.4,2.4,2.8,2 +6.4,3.2,5.3,2.3,2.3,3.2,2 +6.5,3,5.5,1.8,1.8,3,2 +7.7,3.8,6.7,2.2,2.2,3.8,2 +7.7,2.6,6.9,2.3,2.3,2.6,2 +6,2.2,5,1.5,1.5,2.2,2 +6.9,3.2,5.7,2.3,2.3,3.2,2 +5.6,2.8,4.9,2,2,2.8,2 +7.7,2.8,6.7,2,2,2.8,2 +6.3,2.7,4.9,1.8,1.8,2.7,2 +6.7,3.3,5.7,2.1,2.1,3.3,2 +7.2,3.2,6,1.8,1.8,3.2,2 +6.2,2.8,4.8,1.8,1.8,2.8,2 +6.1,3,4.9,1.8,1.8,3,2 +6.4,2.8,5.6,2.1,2.1,2.8,2 +7.2,3,5.8,1.6,1.6,3,2 +7.4,2.8,6.1,1.9,1.9,2.8,2 +7.9,3.8,6.4,2,2,3.8,2 +6.4,2.8,5.6,2.2,2.2,2.8,2 +6.3,2.8,5.1,1.5,1.5,2.8,2 +6.1,2.6,5.6,1.4,1.4,2.6,2 +7.7,3,6.1,2.3,2.3,3,2 +6.3,3.4,5.6,2.4,2.4,3.4,2 +6.4,3.1,5.5,1.8,1.8,3.1,2 +,,,,,, +6.9,3.1,5.4,2.1,2.1,3.1,2 +6.7,3.1,5.6,2.4,2.4,3.1,2 +6.9,3.1,5.1,2.3,2.3,3.1,2 +5.8,2.7,5.1,1.9,1.9,2.7,2 +6.8,3.2,5.9,2.3,2.3,3.2,2 +6.7,3.3,5.7,2.5,2.5,3.3,2 +6.7,3,5.2,2.3,2.3,3,2 +6.3,2.5,5,1.9,1.9,2.5,2 +6.5,3,5.2,2,2,3,2 +6.2,3.4,5.4,2.3,2.3,3.4,2 +5.9,3,5.1,1.8,1.8,3,2 diff --git a/flask_app/flask_main.py b/flask_app/flask_main.py index 0ab9c87..fbd52d5 100644 --- a/flask_app/flask_main.py +++ b/flask_app/flask_main.py @@ -1,5 +1,4 @@ import os - from flask import g from flask import Flask from flask import render_template @@ -10,95 +9,120 @@ from pandas_code.mapping import template_mapping from pandas_code.parse_template import parse_template - ALLOWED_EXTENSIONS = {'csv'} app = Flask(__name__, template_folder='templates') -UPLOAD_FOLDER='data/' +UPLOAD_FOLDER = 'data/' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER generator = code_generator.CodeGenerator(template_mapping, parse_template) - +#print(generator) +uploaded = False @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']) +@ 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 +@ app.route('/start_over', methods=['GET']) +def start_over(): + generator.resetone() + return render_template('home.html') -@app.route('/clean', methods=['GET']) +@ 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']) +@ app.route('/split', methods=['GET', 'POST']) def split_data(): - 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']) + global splitted + if request.method == 'POST': + td = request.form["td"] + splitted = False + submitted = True + print(td) + train_data_size = generator.split_data( + train_ratio=(int(td)/100), seed=200) + else: + return render_template('info/splitting_summary.html') + + return render_template('info/splitting_summary.html',num_rows_train=train_data_size[0], traindata=int(td), submit=submitted) + +@ 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']) +@ 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']) + # global uploaded + # uploaded = False + +@ 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') - -@app.route('/actions') + 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)) + uploaded = True + generator.resetone() + 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') + +@ app.route('/actions') def next_actions(): - return render_template('actions/actions.html') + return render_template('actions/actions.html') + +@ app.route('/clear_data') +def clear_data(): + return render_template('actions/upload_data.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 @@

Select your input values

{% for label in labels %} - {{label}}" + {{label}}" {% endfor %}
diff --git a/flask_app/templates/actions/split_data.html b/flask_app/templates/actions/split_data.html index c9d8d15..21c997b 100644 --- a/flask_app/templates/actions/split_data.html +++ b/flask_app/templates/actions/split_data.html @@ -2,9 +2,9 @@

Split Data

If this is the only dataset you have with these values, you need to split it into - a training and testing datasets. + a training and testing datasets.

- +
- + \ No newline at end of file diff --git a/flask_app/templates/base.html b/flask_app/templates/base.html index 6dcad26..5f9a6d0 100644 --- a/flask_app/templates/base.html +++ b/flask_app/templates/base.html @@ -7,6 +7,8 @@
  • Show Code
  • Upload Data
  • Next Actions +
  • Start Over +
    diff --git a/flask_app/templates/info/code.html b/flask_app/templates/info/code.html index 53fd993..ce531a4 100644 --- a/flask_app/templates/info/code.html +++ b/flask_app/templates/info/code.html @@ -2,31 +2,31 @@ {% block content %}
    - {% for para in text.split('\n') %} -

    {{para}}

    - {% endfor %} + {% for para in text.split('\n') %} +

    {{para}}

    + {% endfor %}
    -
    - -{% endblock %} +
    + + {% endblock %} \ No newline at end of file diff --git a/flask_app/templates/info/splitting_summary.html b/flask_app/templates/info/splitting_summary.html index ba60f00..0abe2fd 100644 --- a/flask_app/templates/info/splitting_summary.html +++ b/flask_app/templates/info/splitting_summary.html @@ -2,6 +2,20 @@ {% block content %}
    -

    Training data contains {{num_rows_train}} rows

    + {% if submit != True %} +

    Enter Train Data Ratio (Normally 80% or 70%)

    +

    Remaining Data from your Dataset will be considered as Test Data

    +
    + Training Data : % +


    + + {% endif %} + {% if submit %} +

    Your Selection : Train Data Ratio {{traindata}}% & Test Data Ratio {{100-traindata}}%

    +

    Training Data Contains {{num_rows_train}} Rows

    +

    Test Data Contains {{(num_rows_train*(100-traindata))//(traindata)}} Rows

    + + {% endif %} +
    -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/main.py b/main.py index a2d6514..76f098e 100644 --- a/main.py +++ b/main.py @@ -4,18 +4,20 @@ from pandas_code.parse_template import parse_template def run_generator(args): - print(args) - input_file = args[1] - generator = code_generator.CodeGenerator(template_mapping, parse_template) - generator.load_data(input_file) - data_summary = generator.describe_data() - print(data_summary.to_csv()) - clean_data = generator.clean_data() - print(clean_data) - print(generator.get_labels()) - print(generator.split_data()) - code = generator.download_code() - print(code) -#process the arguments + print(args) + input_file = args[1] + generator = code_generator.CodeGenerator(template_mapping, parse_template) + generator.load_data(input_file) + data_summary = generator.describe_data() + print(data_summary.to_csv()) + clean_data = generator.clean_data() + print(clean_data) + print(generator.get_labels()) + print(generator.split_data()) + code = generator.download_code() + print(code) + + +# process the arguments if __name__ == '__main__': - run_generator(sys.argv) + run_generator(sys.argv) diff --git a/model/code_blocks.py b/model/code_blocks.py index 049cc38..ce462cb 100644 --- a/model/code_blocks.py +++ b/model/code_blocks.py @@ -6,6 +6,7 @@ def __init__(self, comment, statements): self.statements = statements def to_text(self): + #print("I am in to text") text_value = "#"+self.comment+"\n" for statement in self.statements: text_value += statement+"\n" @@ -17,7 +18,10 @@ def from_text(self, text): class AllBlocks: def __init__(self): self.blocks = deque() - + + def resetAll(self): + self.blocks = deque() + def from_file(self, file_name): pass @@ -31,4 +35,5 @@ def to_file(self, file_name): pass def add_next_block(self, next_block): + #print("I am in add next block") self.blocks.append(next_block) diff --git a/pandas_code/code_templates/drop_x.py b/pandas_code/code_templates/drop_x.py index 904b428..08edb1c 100644 --- a/pandas_code/code_templates/drop_x.py +++ b/pandas_code/code_templates/drop_x.py @@ -1,4 +1,4 @@ -# drop dataset features passed to args param +# split the data set into training and test data def get_code(args): x_values = args[0].drop(args[1], axis=1) return x_values diff --git a/pandas_code/parse_template.py b/pandas_code/parse_template.py index 10f27f7..a0b3d2c 100644 --- a/pandas_code/parse_template.py +++ b/pandas_code/parse_template.py @@ -1,39 +1,41 @@ import re def parse_template(template_name, args): - template = 'pandas_code/code_templates/'+template_name+".py" - generated_comments = [] - generated_code = [] - with open(template, encoding='ascii') as source_code: - lines = source_code.readlines() - for line in lines: - trimmed_line = line.strip() - if trimmed_line.startswith("def get_code"): - continue - if trimmed_line.startswith("return"): - continue - if trimmed_line.startswith("#"): - generated_comments.append(trimmed_line) - else: - trimmed_line = replace_args_with_values(trimmed_line, args) - generated_code.append(trimmed_line) + template = 'pandas_code/code_templates/'+template_name+".py" + generated_comments = [] + generated_code = [] + with open(template, encoding='ascii') as source_code: + lines = source_code.readlines() + for line in lines: + trimmed_line = line.strip() + if trimmed_line.startswith("def get_code"): + continue + if trimmed_line.startswith("return"): + continue + if trimmed_line.startswith("#"): + generated_comments.append(trimmed_line) + else: + trimmed_line = replace_args_with_values(trimmed_line, args) + generated_code.append(trimmed_line) + + return (generated_comments, generated_code) - return (generated_comments, generated_code) def replace_args_with_values(line, args): - match = re.search(r"args\[[0-9]\]", line) - while match: - args_span = match.span() - args_string = line[args_span[0]:args_span[1]] - args_index = get_args_index(args_string) + match = re.search(r"args\[[0-9]\]", line) + while match: + args_span = match.span() + args_string = line[args_span[0]:args_span[1]] + args_index = get_args_index(args_string) + + line = line[0:args_span[0]]+args[args_index]+line[args_span[1]:] + match = re.search(r"args\[[0-9]\]", line) - line = line[0:args_span[0]]+args[args_index]+line[args_span[1]:] - match = re.search(r"args\[[0-9]\]", line) + return line - return line def get_args_index(args_string): - index_match = re.search('[0-9]+', args_string) - index_span = index_match.span() - index_string = args_string[index_span[0]:index_span[1]] - index_value = int(index_string) - return index_value + index_match = re.search('[0-9]+', args_string) + index_span = index_match.span() + index_string = args_string[index_span[0]:index_span[1]] + index_value = int(index_string) + return index_value From 1d3b7af9a26868b23eb842e68a7091365dadd98a Mon Sep 17 00:00:00 2001 From: Rishikesh Tambe Date: Wed, 12 Oct 2022 21:50:42 +0530 Subject: [PATCH 3/6] #Added Start Over option to clear the previous block of code --- application/code_generator.py | 105 ++++++------ data/IRIS.csv | 151 ------------------ data/iris_new.csv | 151 ------------------ flask_app/flask_main.py | 32 +--- flask_app/templates/actions/split_data.html | 2 +- flask_app/templates/base.html | 1 - flask_app/templates/info/code.html | 52 +++--- .../templates/info/splitting_summary.html | 16 +- model/code_blocks.py | 3 +- pandas_code/parse_template.py | 60 +++---- 10 files changed, 113 insertions(+), 460 deletions(-) delete mode 100644 data/IRIS.csv delete mode 100644 data/iris_new.csv diff --git a/application/code_generator.py b/application/code_generator.py index e1e9de4..48938d5 100644 --- a/application/code_generator.py +++ b/application/code_generator.py @@ -1,91 +1,80 @@ from model import code_blocks -#from pandas_code.parse_template import parse_template - -# from flask_main import splitted, trainratio 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 = {} + self.blocks = code_blocks.AllBlocks() + self.function_mapping = template_mapping + self.parse_template = parse_template + self.data = {} + #call to resetAll() function in clas AllBblocks of code_blocks.py def resetone(self): - #print("I am in Resetone") self.blocks.resetAll() self.data = {} - def get_data(self): - return self.data['dataframe'] + return self.data['dataframe'] 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 + dataframe = self._parse_and_execute('read_csv', [csv_file]) + self._save('dataframe', dataframe) + self._save('X', dataframe) + return self.data['dataframe'].shape def describe_data(self): - output = self._parse_and_execute('describe_data', ['dataframe']) - return output + output = self._parse_and_execute('describe_data', ['dataframe']) + return output def clean_data(self): - self._parse_and_execute('clean_data', ['dataframe']) - return self.data['dataframe'].shape + self._parse_and_execute('clean_data', ['dataframe']) + return self.data['dataframe'].shape def get_labels(self): - keys = self._parse_and_execute('get_keys', ['X']) - return keys.values.tolist() + keys = self._parse_and_execute('get_keys', ['X']) + return keys.values.tolist() def drop_x(self, input_labels): - x_values = self._parse_and_execute('drop_x', ['X', input_labels]) - self._save('X', x_values) + x_values = self._parse_and_execute('drop_x', ['X', input_labels]) + self._save('X', x_values) 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) + x_values, y_values = self._parse_and_execute( + 'select_y', ['X', output_label]) + self._save('X', x_values) + self._save('Y', y_values) def split_data(self, train_ratio=1, seed=200): - # train_ratio = trainingdata - (train, test) = self._parse_and_execute( - 'split', ['X', train_ratio, seed]) - self.data['train'] = train - self.data['test'] = test - print(f"\n\n\n\n Train Ratio : {train}\n\n\n\n") - return self.data['train'].shape + (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 download_code(self): - print("I am in download_code") - return self.blocks.to_text() + return self.blocks.to_text() def _create_new_block(self, comment, statements): - print("I am in Create new Block") - block = code_blocks.CodeBlock(comment, statements) - self.blocks.add_next_block(block) + block = code_blocks.CodeBlock(comment, statements) + self.blocks.add_next_block(block) def _parse_and_execute(self, template, args): - replaced_args = [] - string_args = [] - for arg in args: - if isinstance(arg, str) and arg in self.data: - print("I am in if Block",arg) + 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: - #print("I am in else block",replaced_args) - replaced_args.append(arg) - if isinstance(arg, str): - #print("I am in else block",arg,string_args) - string_args.append('\"'+arg+'\"') - else: - string_args.append(str(arg)) + 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 + (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 + self.data[key] = value diff --git a/data/IRIS.csv b/data/IRIS.csv deleted file mode 100644 index 21ae196..0000000 --- a/data/IRIS.csv +++ /dev/null @@ -1,151 +0,0 @@ -sepal_length,sepal_width,petal_length,petal_width,species -5.1,3.5,1.4,0.2,Iris-setosa -4.9,3,1.4,0.2,Iris-setosa -4.7,3.2,1.3,0.2,Iris-setosa -4.6,3.1,1.5,0.2,Iris-setosa -5,3.6,1.4,0.2,Iris-setosa -5.4,3.9,1.7,0.4,Iris-setosa -4.6,3.4,1.4,0.3,Iris-setosa -5,3.4,1.5,0.2,Iris-setosa -4.4,2.9,1.4,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -5.4,3.7,1.5,0.2,Iris-setosa -4.8,3.4,1.6,0.2,Iris-setosa -4.8,3,1.4,0.1,Iris-setosa -4.3,3,1.1,0.1,Iris-setosa -5.8,4,1.2,0.2,Iris-setosa -5.7,4.4,1.5,0.4,Iris-setosa -5.4,3.9,1.3,0.4,Iris-setosa -5.1,3.5,1.4,0.3,Iris-setosa -5.7,3.8,1.7,0.3,Iris-setosa -5.1,3.8,1.5,0.3,Iris-setosa -5.4,3.4,1.7,0.2,Iris-setosa -5.1,3.7,1.5,0.4,Iris-setosa -4.6,3.6,1,0.2,Iris-setosa -5.1,3.3,1.7,0.5,Iris-setosa -4.8,3.4,1.9,0.2,Iris-setosa -5,3,1.6,0.2,Iris-setosa -5,3.4,1.6,0.4,Iris-setosa -5.2,3.5,1.5,0.2,Iris-setosa -5.2,3.4,1.4,0.2,Iris-setosa -4.7,3.2,1.6,0.2,Iris-setosa -4.8,3.1,1.6,0.2,Iris-setosa -5.4,3.4,1.5,0.4,Iris-setosa -5.2,4.1,1.5,0.1,Iris-setosa -5.5,4.2,1.4,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -5,3.2,1.2,0.2,Iris-setosa -5.5,3.5,1.3,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -4.4,3,1.3,0.2,Iris-setosa -5.1,3.4,1.5,0.2,Iris-setosa -5,3.5,1.3,0.3,Iris-setosa -4.5,2.3,1.3,0.3,Iris-setosa -4.4,3.2,1.3,0.2,Iris-setosa -5,3.5,1.6,0.6,Iris-setosa -5.1,3.8,1.9,0.4,Iris-setosa -4.8,3,1.4,0.3,Iris-setosa -5.1,3.8,1.6,0.2,Iris-setosa -4.6,3.2,1.4,0.2,Iris-setosa -5.3,3.7,1.5,0.2,Iris-setosa -5,3.3,1.4,0.2,Iris-setosa -7,3.2,4.7,1.4,Iris-versicolor -6.4,3.2,4.5,1.5,Iris-versicolor -6.9,3.1,4.9,1.5,Iris-versicolor -5.5,2.3,4,1.3,Iris-versicolor -6.5,2.8,4.6,1.5,Iris-versicolor -5.7,2.8,4.5,1.3,Iris-versicolor -6.3,3.3,4.7,1.6,Iris-versicolor -4.9,2.4,3.3,1,Iris-versicolor -6.6,2.9,4.6,1.3,Iris-versicolor -5.2,2.7,3.9,1.4,Iris-versicolor -5,2,3.5,1,Iris-versicolor -5.9,3,4.2,1.5,Iris-versicolor -6,2.2,4,1,Iris-versicolor -6.1,2.9,4.7,1.4,Iris-versicolor -5.6,2.9,3.6,1.3,Iris-versicolor -6.7,3.1,4.4,1.4,Iris-versicolor -5.6,3,4.5,1.5,Iris-versicolor -5.8,2.7,4.1,1,Iris-versicolor -6.2,2.2,4.5,1.5,Iris-versicolor -5.6,2.5,3.9,1.1,Iris-versicolor -5.9,3.2,4.8,1.8,Iris-versicolor -6.1,2.8,4,1.3,Iris-versicolor -6.3,2.5,4.9,1.5,Iris-versicolor -6.1,2.8,4.7,1.2,Iris-versicolor -6.4,2.9,4.3,1.3,Iris-versicolor -6.6,3,4.4,1.4,Iris-versicolor -6.8,2.8,4.8,1.4,Iris-versicolor -6.7,3,5,1.7,Iris-versicolor -6,2.9,4.5,1.5,Iris-versicolor -5.7,2.6,3.5,1,Iris-versicolor -5.5,2.4,3.8,1.1,Iris-versicolor -5.5,2.4,3.7,1,Iris-versicolor -5.8,2.7,3.9,1.2,Iris-versicolor -6,2.7,5.1,1.6,Iris-versicolor -5.4,3,4.5,1.5,Iris-versicolor -6,3.4,4.5,1.6,Iris-versicolor -6.7,3.1,4.7,1.5,Iris-versicolor -6.3,2.3,4.4,1.3,Iris-versicolor -5.6,3,4.1,1.3,Iris-versicolor -5.5,2.5,4,1.3,Iris-versicolor -5.5,2.6,4.4,1.2,Iris-versicolor -6.1,3,4.6,1.4,Iris-versicolor -5.8,2.6,4,1.2,Iris-versicolor -5,2.3,3.3,1,Iris-versicolor -5.6,2.7,4.2,1.3,Iris-versicolor -5.7,3,4.2,1.2,Iris-versicolor -5.7,2.9,4.2,1.3,Iris-versicolor -6.2,2.9,4.3,1.3,Iris-versicolor -5.1,2.5,3,1.1,Iris-versicolor -5.7,2.8,4.1,1.3,Iris-versicolor -6.3,3.3,6,2.5,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -7.1,3,5.9,2.1,Iris-virginica -6.3,2.9,5.6,1.8,Iris-virginica -6.5,3,5.8,2.2,Iris-virginica -7.6,3,6.6,2.1,Iris-virginica -4.9,2.5,4.5,1.7,Iris-virginica -7.3,2.9,6.3,1.8,Iris-virginica -6.7,2.5,5.8,1.8,Iris-virginica -7.2,3.6,6.1,2.5,Iris-virginica -6.5,3.2,5.1,2,Iris-virginica -6.4,2.7,5.3,1.9,Iris-virginica -6.8,3,5.5,2.1,Iris-virginica -5.7,2.5,5,2,Iris-virginica -5.8,2.8,5.1,2.4,Iris-virginica -6.4,3.2,5.3,2.3,Iris-virginica -6.5,3,5.5,1.8,Iris-virginica -7.7,3.8,6.7,2.2,Iris-virginica -7.7,2.6,6.9,2.3,Iris-virginica -6,2.2,5,1.5,Iris-virginica -6.9,3.2,5.7,2.3,Iris-virginica -5.6,2.8,4.9,2,Iris-virginica -7.7,2.8,6.7,2,Iris-virginica -6.3,2.7,4.9,1.8,Iris-virginica -6.7,3.3,5.7,2.1,Iris-virginica -7.2,3.2,6,1.8,Iris-virginica -6.2,2.8,4.8,1.8,Iris-virginica -6.1,3,4.9,1.8,Iris-virginica -6.4,2.8,5.6,2.1,Iris-virginica -7.2,3,5.8,1.6,Iris-virginica -7.4,2.8,6.1,1.9,Iris-virginica -7.9,3.8,6.4,2,Iris-virginica -6.4,2.8,5.6,2.2,Iris-virginica -6.3,2.8,5.1,1.5,Iris-virginica -6.1,2.6,5.6,1.4,Iris-virginica -7.7,3,6.1,2.3,Iris-virginica -6.3,3.4,5.6,2.4,Iris-virginica -6.4,3.1,5.5,1.8,Iris-virginica -6,3,4.8,1.8,Iris-virginica -6.9,3.1,5.4,2.1,Iris-virginica -6.7,3.1,5.6,2.4,Iris-virginica -6.9,3.1,5.1,2.3,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -6.8,3.2,5.9,2.3,Iris-virginica -6.7,3.3,5.7,2.5,Iris-virginica -6.7,3,5.2,2.3,Iris-virginica -6.3,2.5,5,1.9,Iris-virginica -6.5,3,5.2,2,Iris-virginica -6.2,3.4,5.4,2.3,Iris-virginica -5.9,3,5.1,1.8,Iris-virginica diff --git a/data/iris_new.csv b/data/iris_new.csv deleted file mode 100644 index 32a0a31..0000000 --- a/data/iris_new.csv +++ /dev/null @@ -1,151 +0,0 @@ -X1,X2,X3,X4,X5,X6,variety -5.1,3.5,1.4,0.2,0.2,3.5,0 -4.9,3,1.4,0.2,0.2,3,0 -4.7,3.2,1.3,0.2,0.2,3.2,0 -4.6,3.1,1.5,0.2,0.2,3.1,0 -5,3.6,1.4,0.2,0.2,3.6,0 -5.4,3.9,1.7,0.4,0.4,3.9,0 -4.6,3.4,1.4,0.3,0.3,3.4,0 -5,3.4,1.5,0.2,0.2,3.4,0 -4.4,2.9,1.4,0.2,0.2,2.9,0 -4.9,3.1,1.5,0.1,0.1,3.1,0 -5.4,3.7,1.5,0.2,0.2,3.7,0 -4.8,3.4,1.6,0.2,0.2,3.4,0 -4.8,3,1.4,0.1,0.1,3,0 -4.3,3,1.1,0.1,0.1,3,0 -5.8,4,1.2,0.2,0.2,4,0 -5.7,4.4,1.5,0.4,0.4,4.4,0 -5.4,3.9,1.3,0.4,0.4,3.9,0 -5.1,3.5,1.4,0.3,0.3,3.5,0 -5.7,3.8,1.7,0.3,0.3,3.8,0 -5.1,3.8,1.5,0.3,0.3,3.8,0 -5.4,3.4,1.7,0.2,0.2,3.4,0 -5.1,3.7,1.5,0.4,0.4,3.7,0 -4.6,3.6,1,0.2,0.2,3.6,0 -5.1,3.3,1.7,0.5,0.5,3.3,0 -4.8,3.4,1.9,0.2,0.2,3.4,0 -5,3,1.6,0.2,0.2,3,0 -5,3.4,1.6,0.4,0.4,3.4,0 -5.2,3.5,1.5,0.2,0.2,3.5,0 -5.2,3.4,1.4,0.2,0.2,3.4,0 -4.7,3.2,1.6,0.2,0.2,3.2,0 -4.8,3.1,1.6,0.2,0.2,3.1,0 -5.4,3.4,1.5,0.4,0.4,3.4,0 -5.2,4.1,1.5,0.1,0.1,4.1,0 -5.5,4.2,1.4,0.2,0.2,4.2,0 -4.9,3.1,1.5,0.2,0.2,3.1,0 -5,3.2,1.2,0.2,0.2,3.2,0 -5.5,3.5,1.3,0.2,0.2,3.5,0 -4.9,3.6,1.4,0.1,0.1,3.6,0 -4.4,3,1.3,0.2,0.2,3,0 -5.1,3.4,1.5,0.2,0.2,3.4,0 -5,3.5,1.3,0.3,0.3,3.5,0 -4.5,2.3,1.3,0.3,0.3,2.3,0 -4.4,3.2,1.3,0.2,0.2,3.2,0 -5,3.5,1.6,0.6,0.6,3.5,0 -5.1,3.8,1.9,0.4,0.4,3.8,0 -4.8,3,1.4,0.3,0.3,3,0 -5.1,3.8,1.6,0.2,0.2,3.8,0 -4.6,3.2,1.4,0.2,0.2,3.2,0 -5.3,3.7,1.5,0.2,0.2,3.7,0 -5,3.3,1.4,0.2,0.2,3.3,0 -7,3.2,4.7,1.4,1.4,3.2,1 -6.4,3.2,4.5,1.5,1.5,3.2,1 -6.9,3.1,4.9,1.5,1.5,3.1,1 -5.5,2.3,4,1.3,1.3,2.3,1 -6.5,2.8,4.6,1.5,1.5,2.8,1 -5.7,2.8,4.5,1.3,1.3,2.8,1 -6.3,3.3,4.7,1.6,1.6,3.3,1 -4.9,2.4,3.3,1,1,2.4,1 -6.6,2.9,4.6,1.3,1.3,2.9,1 -5.2,2.7,3.9,1.4,1.4,2.7,1 -5,2,3.5,1,1,2,1 -5.9,3,4.2,1.5,1.5,3,1 -6,2.2,4,1,1,2.2,1 -6.1,2.9,4.7,1.4,1.4,2.9,1 -5.6,2.9,3.6,1.3,1.3,2.9,1 -6.7,3.1,4.4,1.4,1.4,3.1,1 -5.6,3,4.5,1.5,1.5,3,1 -5.8,2.7,4.1,1,1,2.7,1 -6.2,2.2,4.5,1.5,1.5,2.2,1 -5.6,2.5,3.9,1.1,1.1,2.5,1 -5.9,3.2,4.8,1.8,1.8,3.2,1 -6.1,2.8,4,1.3,1.3,2.8,1 -6.3,2.5,4.9,1.5,1.5,2.5,1 -6.1,2.8,4.7,1.2,1.2,2.8,1 -6.4,2.9,4.3,1.3,1.3,2.9,1 -6.6,3,4.4,1.4,1.4,3,1 -6.8,2.8,4.8,1.4,1.4,2.8,1 -6.7,3,5,1.7,1.7,3,1 -6,2.9,4.5,1.5,1.5,2.9,1 -5.7,2.6,3.5,1,1,2.6,1 -5.5,2.4,3.8,1.1,1.1,2.4,1 -5.5,2.4,3.7,1,1,2.4,1 -5.8,2.7,3.9,1.2,1.2,2.7,1 -6,2.7,5.1,1.6,1.6,2.7,1 -5.4,3,4.5,1.5,1.5,3,1 -6,3.4,4.5,1.6,1.6,3.4,1 -6.7,3.1,4.7,1.5,1.5,3.1,1 -6.3,2.3,4.4,1.3,1.3,2.3,1 -5.6,3,4.1,1.3,1.3,3,1 -5.5,2.5,4,1.3,1.3,2.5,1 -5.5,2.6,4.4,1.2,1.2,2.6,1 -6.1,3,4.6,1.4,1.4,3,1 -5.8,2.6,4,1.2,1.2,2.6,1 -5,2.3,3.3,1,1,2.3,1 -5.6,2.7,4.2,1.3,1.3,2.7,1 -5.7,3,4.2,1.2,1.2,3,1 -5.7,2.9,4.2,1.3,1.3,2.9,1 -6.2,2.9,4.3,1.3,1.3,2.9,1 -5.1,2.5,3,1.1,1.1,2.5,1 -5.7,2.8,4.1,1.3,1.3,2.8,1 -6.3,3.3,6,2.5,2.5,3.3,2 -5.8,2.7,5.1,1.9,1.9,2.7,2 -7.1,3,5.9,2.1,2.1,3,2 -6.3,2.9,5.6,1.8,1.8,2.9,2 -6.5,3,5.8,2.2,2.2,3,2 -7.6,3,6.6,2.1,2.1,3,2 -4.9,2.5,4.5,1.7,1.7,2.5,2 -7.3,2.9,6.3,1.8,1.8,2.9,2 -6.7,2.5,5.8,1.8,1.8,2.5,2 -7.2,3.6,6.1,2.5,2.5,3.6,2 -6.5,3.2,5.1,2,2,3.2,2 -6.4,2.7,5.3,1.9,1.9,2.7,2 -6.8,3,5.5,2.1,2.1,3,2 -5.7,2.5,5,2,2,2.5,2 -5.8,2.8,5.1,2.4,2.4,2.8,2 -6.4,3.2,5.3,2.3,2.3,3.2,2 -6.5,3,5.5,1.8,1.8,3,2 -7.7,3.8,6.7,2.2,2.2,3.8,2 -7.7,2.6,6.9,2.3,2.3,2.6,2 -6,2.2,5,1.5,1.5,2.2,2 -6.9,3.2,5.7,2.3,2.3,3.2,2 -5.6,2.8,4.9,2,2,2.8,2 -7.7,2.8,6.7,2,2,2.8,2 -6.3,2.7,4.9,1.8,1.8,2.7,2 -6.7,3.3,5.7,2.1,2.1,3.3,2 -7.2,3.2,6,1.8,1.8,3.2,2 -6.2,2.8,4.8,1.8,1.8,2.8,2 -6.1,3,4.9,1.8,1.8,3,2 -6.4,2.8,5.6,2.1,2.1,2.8,2 -7.2,3,5.8,1.6,1.6,3,2 -7.4,2.8,6.1,1.9,1.9,2.8,2 -7.9,3.8,6.4,2,2,3.8,2 -6.4,2.8,5.6,2.2,2.2,2.8,2 -6.3,2.8,5.1,1.5,1.5,2.8,2 -6.1,2.6,5.6,1.4,1.4,2.6,2 -7.7,3,6.1,2.3,2.3,3,2 -6.3,3.4,5.6,2.4,2.4,3.4,2 -6.4,3.1,5.5,1.8,1.8,3.1,2 -,,,,,, -6.9,3.1,5.4,2.1,2.1,3.1,2 -6.7,3.1,5.6,2.4,2.4,3.1,2 -6.9,3.1,5.1,2.3,2.3,3.1,2 -5.8,2.7,5.1,1.9,1.9,2.7,2 -6.8,3.2,5.9,2.3,2.3,3.2,2 -6.7,3.3,5.7,2.5,2.5,3.3,2 -6.7,3,5.2,2.3,2.3,3,2 -6.3,2.5,5,1.9,1.9,2.5,2 -6.5,3,5.2,2,2,3,2 -6.2,3.4,5.4,2.3,2.3,3.4,2 -5.9,3,5.1,1.8,1.8,3,2 diff --git a/flask_app/flask_main.py b/flask_app/flask_main.py index fbd52d5..e9eed6a 100644 --- a/flask_app/flask_main.py +++ b/flask_app/flask_main.py @@ -15,8 +15,7 @@ UPLOAD_FOLDER = 'data/' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER generator = code_generator.CodeGenerator(template_mapping, parse_template) -#print(generator) -uploaded = False + @app.route('/') def welcome(): return render_template('home.html') @@ -34,7 +33,7 @@ def describe_data(): description = generator.describe_data() return render_template('info/description.html', table=description.to_html()) -#Added Start Over Option +#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() @@ -47,20 +46,10 @@ def 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', 'POST']) +@app.route('/split', methods=['GET']) def split_data(): - global splitted - if request.method == 'POST': - td = request.form["td"] - splitted = False - submitted = True - print(td) - train_data_size = generator.split_data( - train_ratio=(int(td)/100), seed=200) - else: - return render_template('info/splitting_summary.html') - - return render_template('info/splitting_summary.html',num_rows_train=train_data_size[0], traindata=int(td), submit=submitted) + 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(): @@ -83,9 +72,6 @@ def get_data_labels(): return render_template('actions/select_output_value.html', labels=keys) # return render_template('labels.html', labels=keys) - # global uploaded - # uploaded = False - @ app.route('/data', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': @@ -104,9 +90,9 @@ def upload_file(): filename = secure_filename(file.filename) file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) # return redirect(url_for('download_file', name=filename)) - uploaded = True - generator.resetone() 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') @@ -117,10 +103,6 @@ def upload_file(): def next_actions(): return render_template('actions/actions.html') -@ app.route('/clear_data') -def clear_data(): - return render_template('actions/upload_data.html') - # main driver function if __name__ == '__main__': # run() method of Flask class runs the application diff --git a/flask_app/templates/actions/split_data.html b/flask_app/templates/actions/split_data.html index 21c997b..478c302 100644 --- a/flask_app/templates/actions/split_data.html +++ b/flask_app/templates/actions/split_data.html @@ -5,6 +5,6 @@

    Split Data

    a training and testing datasets.

    - +
    \ No newline at end of file diff --git a/flask_app/templates/base.html b/flask_app/templates/base.html index 5f9a6d0..4a9bb29 100644 --- a/flask_app/templates/base.html +++ b/flask_app/templates/base.html @@ -8,7 +8,6 @@
  • Upload Data
  • Next Actions
  • Start Over -
    diff --git a/flask_app/templates/info/code.html b/flask_app/templates/info/code.html index ce531a4..ad1927b 100644 --- a/flask_app/templates/info/code.html +++ b/flask_app/templates/info/code.html @@ -2,31 +2,31 @@ {% block content %}
    - {% for para in text.split('\n') %} -

    {{para}}

    - {% endfor %} + {% for para in text.split('\n') %} +

    {{para}}

    + {% endfor %}
    - -
    - - {% endblock %} \ No newline at end of file + +
    + +{% endblock %} diff --git a/flask_app/templates/info/splitting_summary.html b/flask_app/templates/info/splitting_summary.html index 0abe2fd..481381f 100644 --- a/flask_app/templates/info/splitting_summary.html +++ b/flask_app/templates/info/splitting_summary.html @@ -2,20 +2,6 @@ {% block content %}
    - {% if submit != True %} -

    Enter Train Data Ratio (Normally 80% or 70%)

    -

    Remaining Data from your Dataset will be considered as Test Data

    -
    - Training Data : % -


    - - {% endif %} - {% if submit %} -

    Your Selection : Train Data Ratio {{traindata}}% & Test Data Ratio {{100-traindata}}%

    -

    Training Data Contains {{num_rows_train}} Rows

    -

    Test Data Contains {{(num_rows_train*(100-traindata))//(traindata)}} Rows

    - - {% endif %} -
    +

    Training data contains {{num_rows_train}} rows

    {% endblock %} \ No newline at end of file diff --git a/model/code_blocks.py b/model/code_blocks.py index ce462cb..0f45688 100644 --- a/model/code_blocks.py +++ b/model/code_blocks.py @@ -6,7 +6,6 @@ def __init__(self, comment, statements): self.statements = statements def to_text(self): - #print("I am in to text") text_value = "#"+self.comment+"\n" for statement in self.statements: text_value += statement+"\n" @@ -19,6 +18,7 @@ class AllBlocks: def __init__(self): self.blocks = deque() + #clear previously insetred blocks of code def resetAll(self): self.blocks = deque() @@ -35,5 +35,4 @@ def to_file(self, file_name): pass def add_next_block(self, next_block): - #print("I am in add next block") self.blocks.append(next_block) diff --git a/pandas_code/parse_template.py b/pandas_code/parse_template.py index a0b3d2c..93f46b8 100644 --- a/pandas_code/parse_template.py +++ b/pandas_code/parse_template.py @@ -1,41 +1,41 @@ import re def parse_template(template_name, args): - template = 'pandas_code/code_templates/'+template_name+".py" - generated_comments = [] - generated_code = [] - with open(template, encoding='ascii') as source_code: - lines = source_code.readlines() - for line in lines: - trimmed_line = line.strip() - if trimmed_line.startswith("def get_code"): - continue - if trimmed_line.startswith("return"): - continue - if trimmed_line.startswith("#"): - generated_comments.append(trimmed_line) - else: - trimmed_line = replace_args_with_values(trimmed_line, args) - generated_code.append(trimmed_line) + template = 'pandas_code/code_templates/'+template_name+".py" + generated_comments = [] + generated_code = [] + with open(template, encoding='ascii') as source_code: + lines = source_code.readlines() + for line in lines: + trimmed_line = line.strip() + if trimmed_line.startswith("def get_code"): + continue + if trimmed_line.startswith("return"): + continue + if trimmed_line.startswith("#"): + generated_comments.append(trimmed_line) + else: + trimmed_line = replace_args_with_values(trimmed_line, args) + generated_code.append(trimmed_line) - return (generated_comments, generated_code) + return (generated_comments, generated_code) def replace_args_with_values(line, args): - match = re.search(r"args\[[0-9]\]", line) - while match: - args_span = match.span() - args_string = line[args_span[0]:args_span[1]] - args_index = get_args_index(args_string) + match = re.search(r"args\[[0-9]\]", line) + while match: + args_span = match.span() + args_string = line[args_span[0]:args_span[1]] + args_index = get_args_index(args_string) - line = line[0:args_span[0]]+args[args_index]+line[args_span[1]:] - match = re.search(r"args\[[0-9]\]", line) + line = line[0:args_span[0]]+args[args_index]+line[args_span[1]:] + match = re.search(r"args\[[0-9]\]", line) - return line + return line def get_args_index(args_string): - index_match = re.search('[0-9]+', args_string) - index_span = index_match.span() - index_string = args_string[index_span[0]:index_span[1]] - index_value = int(index_string) - return index_value + index_match = re.search('[0-9]+', args_string) + index_span = index_match.span() + index_string = args_string[index_span[0]:index_span[1]] + index_value = int(index_string) + return index_value From 0374c162c80b33e06240d00e64a0c58835271514 Mon Sep 17 00:00:00 2001 From: Rishikesh Tambe Date: Thu, 13 Oct 2022 07:46:52 +0530 Subject: [PATCH 4/6] Added Start Over option in base.html file of flask_app. --- flask_app/flask_main.py | 118 ++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 58 deletions(-) diff --git a/flask_app/flask_main.py b/flask_app/flask_main.py index e9eed6a..71f166d 100644 --- a/flask_app/flask_main.py +++ b/flask_app/flask_main.py @@ -1,4 +1,5 @@ import os + from flask import g from flask import Flask from flask import render_template @@ -9,29 +10,30 @@ from pandas_code.mapping import template_mapping from pandas_code.parse_template import parse_template + ALLOWED_EXTENSIONS = {'csv'} app = Flask(__name__, template_folder='templates') -UPLOAD_FOLDER = 'data/' +UPLOAD_FOLDER='data/' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER generator = code_generator.CodeGenerator(template_mapping, parse_template) @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']) +@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']) @@ -39,72 +41,72 @@ def start_over(): generator.resetone() return render_template('home.html') -@ app.route('/clean', methods=['GET']) +@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]) -@ app.route('/input_labels', methods=['GET', 'POST']) +@app.route('/input_labels', methods=['GET', 'POST']) def get_input_labels(): - if request.method == 'POST': - request_dict = request.form.to_dict() - 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']) +@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') + 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) + 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']) +@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) - #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') + 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() \ No newline at end of file + # run() method of Flask class runs the application + # on the local development server. + app.run() \ No newline at end of file From 3d5576735323ef1e8c30f281470d69c68254c2e7 Mon Sep 17 00:00:00 2001 From: Rishikesh Tambe Date: Thu, 13 Oct 2022 10:28:14 +0530 Subject: [PATCH 5/6] Added Start Over Option To Clear Previous Code Displayed in Show Code Option --- flask_app/flask_main.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flask_app/flask_main.py b/flask_app/flask_main.py index 71f166d..4084fa2 100644 --- a/flask_app/flask_main.py +++ b/flask_app/flask_main.py @@ -36,10 +36,10 @@ def 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']) +@app.route('/start_over', methods=['GET']) def start_over(): - generator.resetone() - return render_template('home.html') + generator.resetone() + return render_template('home.html') @app.route('/clean', methods=['GET']) def clean_data(): @@ -79,8 +79,8 @@ 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) + flash('No file part') + return redirect(request.url) file = request.files['file'] # If the user does not select a file, the browser submits an @@ -96,7 +96,7 @@ def upload_file(): #call to resetone() in class CodeGenerator in code_generator.py generator.resetone() with app.app_context(): - generator.load_data(app.config['UPLOAD_FOLDER']+'/'+filename) + generator.load_data(app.config['UPLOAD_FOLDER']+'/'+filename) return render_template('actions/actions.html') return render_template('actions/upload_data.html') From 4302f6b5c73c0807a8f6b2e43cb27a7aa149c90f Mon Sep 17 00:00:00 2001 From: Rishikesh Tambe Date: Tue, 1 Nov 2022 09:54:24 +0530 Subject: [PATCH 6/6] Added Start Over Option --- application/code_generator.py | 98 +++++++++++++++--------------- flask_app/flask_main.py | 111 ++++++++++++++++------------------ model/code_blocks.py | 62 +++++++++---------- pandas_code/parse_template.py | 60 +++++++++--------- 4 files changed, 162 insertions(+), 169 deletions(-) diff --git a/application/code_generator.py b/application/code_generator.py index 48938d5..fff4aeb 100644 --- a/application/code_generator.py +++ b/application/code_generator.py @@ -1,80 +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 = {} + self.blocks = code_blocks.AllBlocks() + self.function_mapping = template_mapping + self.parse_template = parse_template + self.data = {} - #call to resetAll() function in clas AllBblocks of code_blocks.py + #call to resetAll() function in clas AllBblocks of code_blocks.py def resetone(self): - self.blocks.resetAll() + self.blocks.reset_all() self.data = {} def get_data(self): - return self.data['dataframe'] + return self.data['dataframe'] 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 + dataframe = self._parse_and_execute('read_csv', [csv_file]) + self._save('dataframe', dataframe) + self._save('X', dataframe) + return self.data['dataframe'].shape def describe_data(self): - output = self._parse_and_execute('describe_data', ['dataframe']) - return output + output = self._parse_and_execute('describe_data', ['dataframe']) + return output def clean_data(self): - self._parse_and_execute('clean_data', ['dataframe']) - return self.data['dataframe'].shape + self._parse_and_execute('clean_data', ['dataframe']) + return self.data['dataframe'].shape def get_labels(self): - keys = self._parse_and_execute('get_keys', ['X']) - return keys.values.tolist() + keys = self._parse_and_execute('get_keys', ['X']) + return keys.values.tolist() def drop_x(self, input_labels): - x_values = self._parse_and_execute('drop_x', ['X', input_labels]) - self._save('X', x_values) + x_values = self._parse_and_execute('drop_x', ['X', input_labels]) + self._save('X', x_values) 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) + x_values, y_values = self._parse_and_execute( + 'select_y', ['X', output_label]) + self._save('X', x_values) + self._save('Y', y_values) 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 + (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 download_code(self): - return self.blocks.to_text() + return self.blocks.to_text() def _create_new_block(self, comment, statements): - block = code_blocks.CodeBlock(comment, statements) - self.blocks.add_next_block(block) + block = code_blocks.CodeBlock(comment, statements) + self.blocks.add_next_block(block) 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)) + 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 - (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 + self.data[key] = value diff --git a/flask_app/flask_main.py b/flask_app/flask_main.py index 4084fa2..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,93 +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') + 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() - 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) - #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') + 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() \ No newline at end of file + # run() method of Flask class runs the application + # on the local development server. + app.run() + \ No newline at end of file diff --git a/model/code_blocks.py b/model/code_blocks.py index 0f45688..35cdf02 100644 --- a/model/code_blocks.py +++ b/model/code_blocks.py @@ -1,38 +1,38 @@ from collections import deque class CodeBlock: - def __init__(self, comment, statements): - self.comment = comment - self.statements = statements + def __init__(self, comment, statements): + self.comment = comment + self.statements = statements - def to_text(self): - text_value = "#"+self.comment+"\n" - for statement in self.statements: - text_value += statement+"\n" - return text_value + def to_text(self): + text_value = "#"+self.comment+"\n" + for statement in self.statements: + text_value += statement+"\n" + return text_value - def from_text(self, text): - pass + def from_text(self, text): + pass class AllBlocks: - def __init__(self): - self.blocks = deque() - - #clear previously insetred blocks of code - def resetAll(self): - self.blocks = deque() - - def from_file(self, file_name): - pass - - def to_text(self): - code = "" - for block in self.blocks: - code+=block.to_text() - return code - - def to_file(self, file_name): - pass - - def add_next_block(self, next_block): - self.blocks.append(next_block) + def __init__(self): + self.blocks = deque() + + #clear previously insetred blocks of code + def reset_all(self): + self.blocks = deque() + + def from_file(self, file_name): + pass + + def to_text(self): + code = "" + for block in self.blocks: + code+=block.to_text() + return code + + def to_file(self, file_name): + pass + + def add_next_block(self, next_block): + self.blocks.append(next_block) diff --git a/pandas_code/parse_template.py b/pandas_code/parse_template.py index 93f46b8..a0b3d2c 100644 --- a/pandas_code/parse_template.py +++ b/pandas_code/parse_template.py @@ -1,41 +1,41 @@ import re def parse_template(template_name, args): - template = 'pandas_code/code_templates/'+template_name+".py" - generated_comments = [] - generated_code = [] - with open(template, encoding='ascii') as source_code: - lines = source_code.readlines() - for line in lines: - trimmed_line = line.strip() - if trimmed_line.startswith("def get_code"): - continue - if trimmed_line.startswith("return"): - continue - if trimmed_line.startswith("#"): - generated_comments.append(trimmed_line) - else: - trimmed_line = replace_args_with_values(trimmed_line, args) - generated_code.append(trimmed_line) + template = 'pandas_code/code_templates/'+template_name+".py" + generated_comments = [] + generated_code = [] + with open(template, encoding='ascii') as source_code: + lines = source_code.readlines() + for line in lines: + trimmed_line = line.strip() + if trimmed_line.startswith("def get_code"): + continue + if trimmed_line.startswith("return"): + continue + if trimmed_line.startswith("#"): + generated_comments.append(trimmed_line) + else: + trimmed_line = replace_args_with_values(trimmed_line, args) + generated_code.append(trimmed_line) - return (generated_comments, generated_code) + return (generated_comments, generated_code) def replace_args_with_values(line, args): - match = re.search(r"args\[[0-9]\]", line) - while match: - args_span = match.span() - args_string = line[args_span[0]:args_span[1]] - args_index = get_args_index(args_string) + match = re.search(r"args\[[0-9]\]", line) + while match: + args_span = match.span() + args_string = line[args_span[0]:args_span[1]] + args_index = get_args_index(args_string) - line = line[0:args_span[0]]+args[args_index]+line[args_span[1]:] - match = re.search(r"args\[[0-9]\]", line) + line = line[0:args_span[0]]+args[args_index]+line[args_span[1]:] + match = re.search(r"args\[[0-9]\]", line) - return line + return line def get_args_index(args_string): - index_match = re.search('[0-9]+', args_string) - index_span = index_match.span() - index_string = args_string[index_span[0]:index_span[1]] - index_value = int(index_string) - return index_value + index_match = re.search('[0-9]+', args_string) + index_span = index_match.span() + index_string = args_string[index_span[0]:index_span[1]] + index_value = int(index_string) + return index_value