diff --git a/.idea/DjangoDocker.iml b/.idea/DjangoDocker.iml index ae11b5f353a246ca17493da8dfdd400b8e815b79..72ca99795fc233f9c72c8f5063f014ed2cfa2f9b 100644 --- a/.idea/DjangoDocker.iml +++ b/.idea/DjangoDocker.iml @@ -17,7 +17,7 @@ <sourceFolder url="file://$MODULE_DIR$/ActualProjectCode/DjangoProject" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/mainDockerImage/backend" isTestSource="false" /> </content> - <orderEntry type="jdk" jdkName="Python 3.13" jdkType="Python SDK" /> + <orderEntry type="jdk" jdkName="C:\Users\james\AppData\Local\Programs\Python\Python311\python.exe" jdkType="Python SDK" /> <orderEntry type="sourceFolder" forTests="false" /> </component> </module> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 1d3ce46ba0d13183e3244cba5b930b5e27be4c6b..52b60581075132ee8ea8b95067f7eb1ee09d1aef 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ <component name="Black"> <option name="sdkName" value="Python 3.13" /> </component> - <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13" project-jdk-type="Python SDK" /> + <component name="ProjectRootManager" version="2" project-jdk-name="C:\Users\james\AppData\Local\Programs\Python\Python311\python.exe" project-jdk-type="Python SDK" /> </project> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/core/forms.py b/ActualProjectCode/DjangoProject/core/forms.py index c95ed1130c12b19acae7f4bc5674712072139f99..ec889d2cc4b88db2e25c67cbbdf57c77772f6f45 100644 --- a/ActualProjectCode/DjangoProject/core/forms.py +++ b/ActualProjectCode/DjangoProject/core/forms.py @@ -3,6 +3,7 @@ from django.forms import ModelForm from django.contrib.auth.models import User from django.contrib.auth.forms import UserCreationForm from . import models +import re class CustomUserCreationForm(UserCreationForm): email = forms.EmailField(required=True) @@ -11,6 +12,7 @@ class CustomUserCreationForm(UserCreationForm): model = User fields = ['username', 'email', 'password1', 'password2'] + def save(self, commit=True): user = super().save(commit=False) user.email = self.cleaned_data['email'] @@ -18,6 +20,8 @@ class CustomUserCreationForm(UserCreationForm): user.save() return user + + class UserLoginForm(forms.Form): username = forms.CharField(max_length=100) password = forms.CharField(widget=forms.PasswordInput) @@ -40,6 +44,10 @@ class GenerateBillingsForm(forms.ModelForm): model = models.Billing fields = ['amount', 'username', 'companyName'] +class BillingFilterForm(forms.Form): + start_date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}), required=False) + end_date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}), required=False) + class UpdateUser(forms.ModelForm): class Meta: model = models.Profile diff --git a/ActualProjectCode/DjangoProject/core/models.py b/ActualProjectCode/DjangoProject/core/models.py index 98f15ba2e3547d14df207416abbffeee588fb4e7..2258c65fc755c1b9e4d25243c843dfc099eda197 100644 --- a/ActualProjectCode/DjangoProject/core/models.py +++ b/ActualProjectCode/DjangoProject/core/models.py @@ -29,6 +29,8 @@ class Billing(models.Model): username = models.CharField(max_length=100, default="company") companyName = models.CharField(max_length=100) approvalStatus = models.CharField(max_length=10, default="unapproved") + created_at = models.DateTimeField(auto_now_add=True) + def __str__(self): return f"{self.companyName} Billing - ID: {self.billingID}" diff --git a/ActualProjectCode/DjangoProject/core/views.py b/ActualProjectCode/DjangoProject/core/views.py index 57566fb78b33b2a0fabf2b03c9752095dcf4bbbd..0784fea86998157ae6ac39ce918a94cf4368e610 100644 --- a/ActualProjectCode/DjangoProject/core/views.py +++ b/ActualProjectCode/DjangoProject/core/views.py @@ -108,6 +108,7 @@ def genBillings(request): context = {'form': form} return render(request, 'modelForms/genBillings.html', context) + @login_required def manageUsers(request): profile = Profile.objects.all() @@ -154,10 +155,21 @@ def interactionView(request): context = {'interactions': interactions} return render(request, 'modelForms/interactionView.html', context) + @login_required def billingsView(request): + # Start with all billings billings = Billing.objects.all() - context = {} + + # Apply date filters if provided + start_date = request.GET.get('start_date') + end_date = request.GET.get('end_date') + + if start_date: + billings = billings.filter(created_at__date__gte=start_date) + if end_date: + billings = billings.filter(created_at__date__lte=end_date) + context = {'billings': billings} return render(request, 'modelForms/billingsView.html', context) diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/billingsView.html b/ActualProjectCode/DjangoProject/templates/modelForms/billingsView.html index 1d44a99bc86eb214829bd4172a3864941466985f..5fe03642e8825ffff965b6b1a36e9af24601c2b8 100644 --- a/ActualProjectCode/DjangoProject/templates/modelForms/billingsView.html +++ b/ActualProjectCode/DjangoProject/templates/modelForms/billingsView.html @@ -81,6 +81,64 @@ background: #ccc; margin: 15px 0; } + + .filter-section { + background: #f9f9f9; + padding: 15px; + margin-bottom: 20px; + border-radius: 5px; + text-align: left; + } + + .filter-section h3 { + margin-top: 0; + color: #333; + } + + .form-group { + margin-bottom: 15px; + } + + .form-group label { + display: inline-block; + width: 100px; + font-weight: bold; + } + + .form-group input { + padding: 8px; + border: 1px solid #ddd; + border-radius: 4px; + } + + button { + padding: 8px 16px; + background: #004085; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + margin-right: 10px; + } + + button:hover { + background: #002754; + } + + .btn-secondary { + background: #6c757d; + color: white; + padding: 8px 16px; + border: none; + border-radius: 4px; + text-decoration: none; + display: inline-block; + } + + .btn-secondary:hover { + background: #5a6268; + color: white; + } </style> </head> <body> @@ -88,6 +146,23 @@ <div class="container"> <p><a href="{% url 'profile' %}">Return to Profile</a></p> + <!-- Filter Form Section --> + <div class="filter-section"> + <h3>Filter Billings by Date</h3> + <form method="get"> + <div class="form-group"> + <label for="start_date">Start Date:</label> + <input type="date" name="start_date" id="start_date"> + </div> + <div class="form-group"> + <label for="end_date">End Date:</label> + <input type="date" name="end_date" id="end_date"> + </div> + <button type="submit">Apply Filter</button> + <a href="{% url 'billingsView' %}" class="btn-secondary">Clear Filters</a> + </form> + </div> + {% for record in billings %} {% if record.approvalStatus == 'approved' %} <div class="record"> @@ -95,10 +170,15 @@ <p><strong>Amount: </strong>£{{ record.amount }}</p> <p><strong>Generated By: </strong>{{ record.username }}</p> <p><strong>Company Billed: </strong>{{ record.companyName }}</p> + <p><strong>Date Created: </strong>{{ record.created_at|date:"F d, Y H:i" }}</p> <a href="" class="update-btn">Pay Here</a> <a href="{% url 'deleteBillings' record.billingID %}" class="delete-btn">Delete Billing</a> </div> {% endif %} + {% empty %} + <div class="record"> + <p>No approved billings found for the selected date range.</p> + </div> {% endfor %} </div> diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html b/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html index cd5806b2b1cdb0fec6318a1b0eda05e5f31f5ba9..a85e26d77a94de194a7ee055b92c6d72d227cd01 100644 --- a/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html +++ b/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html @@ -59,6 +59,7 @@ <div class="container"> <h2>Upload a new ML model</h2> + <p><a href="{% url 'profile' %}">Return to Profile</a></p> <form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html b/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html index 1e41304e7b090a4e4ded18f49892980ab92a742b..38b576a58d716eeb3bd0eebcc95b2aaadecaeec8 100644 --- a/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html +++ b/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html @@ -78,6 +78,7 @@ </head> <body> <div class="container"> + <p><a href="{% url 'profile' %}">Return to Profile</a></p> <form action="" method="POST" enctype="multipart/form-data"> {% for model in models %} <h2> {{ model.modelTitle }}</h2> diff --git a/ActualProjectCode/DjangoProject/templates/profile.html b/ActualProjectCode/DjangoProject/templates/profile.html index ad63c1433fca77eb34def9ccb492a1b248674ffb..afd466653073b541d68fbaaa26de6842433ccecf 100644 --- a/ActualProjectCode/DjangoProject/templates/profile.html +++ b/ActualProjectCode/DjangoProject/templates/profile.html @@ -168,8 +168,8 @@ <hr> <h1 class="sectionTitle">AI Engineer Section</h1> <!-- AI Section --> - <h2>Upload Dataset</h2> - <h2><a href="{% url 'userUpload' %}">Upload</a></h2> + <h2>Upload ML Model</h2> + <h2><a href="{% url 'mlUpload' %}">Upload</a></h2> <h2>Access ML Interactions</h2> <h2><a href="{% url 'interactionView' %}">All Interactions</a></h2> <h2>Manage Models</h2> @@ -233,6 +233,7 @@ <hr> <h1 class="sectionTitle">User Section</h1> <!-- User Section --> + <h2>Upload Files to ML</h2> <h2><a href="{% url 'userUpload' %}">Upload CSV</a></h2> <h2>View your uploads</h2> diff --git a/Working Models/Linear_trained.py b/Working Models/Linear_trained.py index 2e6f67ed5adf57637cdf775bd8fe4339c769bf11..cad2a47e770a9b7da79dcfcf3d7b69981b8e71b7 100644 --- a/Working Models/Linear_trained.py +++ b/Working Models/Linear_trained.py @@ -195,6 +195,7 @@ def main(): # Save predictions to CSV csv_output_path = os.path.join(input_dir, f"{input_name}_predictions.csv") + print(csv_output_path) predictions_df.to_csv(csv_output_path, index=False) # Restore original stderr before printing @@ -207,5 +208,7 @@ def main(): null_file.close() + + if __name__ == "__main__": main() \ No newline at end of file diff --git a/Working Models/Trained_Regression.py b/Working Models/Trained_Regression.py index a3818df915c9f57d39da7cf67c6d3bff2dc68838..de4f1b56c30698453775a15162e623ce26cda38f 100644 --- a/Working Models/Trained_Regression.py +++ b/Working Models/Trained_Regression.py @@ -46,7 +46,7 @@ predictions = model.predict(X_scaled) #Save output output_df = df.copy() output_df[f"Predicted_{target_col}"] = predictions -output_path = os.path.join(script_dir, "new_data_for_prediction_predictions.csv") +output_path = os.path.join(script_dir, "symbolic_regression_trained_data.csv") # error here with script_dir output_df.to_csv(output_path, index=False) # Optional evaluation @@ -59,5 +59,4 @@ if target_col in df.columns: rmse = np.sqrt(mean_squared_error(y_true[mask], y_pred[mask])) r2 = r2_score(y_true[mask], y_pred[mask]) - else: - end +print(output_path) \ No newline at end of file diff --git a/Working Models/train_symbolic_model.py b/Working Models/train_symbolic_model.py index 3aec09d78403f03b6c48ae16df0c2db8b035310d..9644f2c75353022cd117fba1fec226942b72f1b0 100644 --- a/Working Models/train_symbolic_model.py +++ b/Working Models/train_symbolic_model.py @@ -1,6 +1,4 @@ -import os -import json -import re +import os, json, re, sys, warnings import pandas as pd import numpy as np from gplearn.genetic import SymbolicRegressor @@ -8,8 +6,17 @@ from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score from sklearn.preprocessing import StandardScaler, LabelEncoder from sklearn.impute import SimpleImputer +from sklearn.exceptions import SkipTestWarning, ConvergenceWarning from joblib import dump + +warnings.filterwarnings("ignore", category=UserWarning) +warnings.filterwarnings("ignore", category=DeprecationWarning) +warnings.filterwarnings("ignore", category=FutureWarning) +warnings.filterwarnings("ignore", category=SkipTestWarning) +warnings.filterwarnings("ignore", category=ConvergenceWarning) +warnings.filterwarnings("ignore") + # Path construction script_dir = os.path.dirname(os.path.abspath(__file__)) file_path = f"{sys.argv[2]}" @@ -112,7 +119,7 @@ model = SymbolicRegressor( p_hoist_mutation=0.05, p_point_mutation=0.1, max_samples=0.9, - verbose=1, + verbose=0, parsimony_coefficient=0.01, random_state=42, function_set=('add', 'sub', 'mul', 'div', 'sqrt', 'log', 'sin', 'cos') @@ -136,3 +143,14 @@ with open(os.path.join(script_dir, "symbolic_model_meta.json"), "w") as f: "expression": str(model._program) }, f, indent=4) +input_dir = os.path.dirname(file_path) if os.path.dirname(file_path) else "." +output_path = os.path.join(input_dir, "Symbolic_Results.txt") +with open(output_path, "w") as f: + f.write(f"Train RMSE: {rmse}\n") + f.write(f"Test RMSE: {rmse}\n") + f.write(f"Train R² Score: {r2}\n") + f.write(f"Test R² Score: {r2}\n") + f.write(f"Expression {str(model._program)}\n") + +print(output_path) +