From 7b104b024357760a96f01982538fce910bc31ce5 Mon Sep 17 00:00:00 2001 From: Aachintya Date: Mon, 21 Oct 2024 20:22:30 +0000 Subject: [PATCH] Added next 5 points prediction and added CSS --- .gitignore | 33 ++++++++- analyzer/extract_graph_data.py | 21 +++++- analyzer/views.py | 9 ++- db.sqlite3 | Bin 204800 -> 204800 bytes graph_analyzer/settings.py | 2 +- graph_analyzer/urls.py | 6 ++ ...e-120-nodes-Fig-6-depicts-the-value-of.png | Bin 0 -> 22920 bytes requirements.txt | 34 ++++----- templates/analyzer/index.html | 70 +++++++++++++++--- 9 files changed, 142 insertions(+), 33 deletions(-) create mode 100644 images/Average-network-throughput-vs-simulation-time-120-nodes-Fig-6-depicts-the-value-of.png diff --git a/.gitignore b/.gitignore index 2eea525..0de1ee1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,32 @@ -.env \ No newline at end of file +# Python +*.pyc +__pycache__/ +*.pyo +*.pyd + +# Virtual environment +venv/ + +# Database +db.sqlite3 + +# Local settings +local_settings.py + +# Media and static files +/media/ +/static/ + +# Log files +*.log + +# Environment variables +.env + +# IDE files +.vscode/ +.idea/ + +# OS files +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/analyzer/extract_graph_data.py b/analyzer/extract_graph_data.py index 5e3f484..4c3b123 100644 --- a/analyzer/extract_graph_data.py +++ b/analyzer/extract_graph_data.py @@ -1,5 +1,6 @@ import cv2 import numpy as np +from scipy import stats def extract_graph_data(image_path): # Read the image @@ -26,4 +27,22 @@ def analyze_data(data_points): maxima = np.argmax(data_points, axis=0) minima = np.argmin(data_points, axis=0) - return minima, maxima \ No newline at end of file + return minima, maxima + +def predict_next_points(data_points, num_predictions=5): + # Convert data points to a time series (assuming equal time intervals) + x = np.arange(len(data_points)) + y = data_points[:, 1] # Assuming y-coordinates represent the data values + + # Perform linear regression + slope, intercept, _, _, _ = stats.linregress(x, y) + + # Predict next points + last_x = len(data_points) + predicted_points = [] + for i in range(num_predictions): + next_x = last_x + i + 1 + next_y = slope * next_x + intercept + predicted_points.append((next_x, next_y)) + + return predicted_points \ No newline at end of file diff --git a/analyzer/views.py b/analyzer/views.py index e17d438..10bcfb1 100644 --- a/analyzer/views.py +++ b/analyzer/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render from .forms import GraphUploadForm -from .extract_graph_data import extract_graph_data, analyze_data +from .extract_graph_data import extract_graph_data, analyze_data, predict_next_points import os from graph_analyzer.settings import BASE_DIR @@ -19,13 +19,14 @@ def upload_image(request): # Process image and get graph data data_points = extract_graph_data(image_path) minima, maxima = analyze_data(data_points) + predicted_points = predict_next_points(data_points) context = { 'minima': minima, - 'maxima': maxima + 'maxima': maxima, + 'predicted_points': predicted_points } return render(request, 'analyzer/index.html', context) else: form = GraphUploadForm() - return render(request, 'analyzer/index.html', {'form': form}) - + return render(request, 'analyzer/index.html', {'form': form}) \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index 32688ab429875d8049f5b9c5d24dc663deb58f35..d5b93676fe7c775c6d5e59ef8bc384fdf080e5c0 100644 GIT binary patch delta 784 zcmZoTz|(MmXM(h#F#`jG5fH;b^+X+GR$~S|`mVFooq4eHID{PNTyY)&vRFtV^P z-E1XskzIH<{~~^7{v!TH{xE(Celz|Hd`~wv9_M4>?`M#k=qNRrS^pf1D6=WYbc0kz zk;yOh#TXTv47M3CG8(9|@-lEUsWNbT|OhXJTz@6X)1(!xCXf@D8U38rDEB|gQw@_GRpCR z6IHx{aZ;+WQIZiTgk+|#$z_y5mtf3iRAp{dh?)K`mvIqe^z?;!j58Rcrd#DR9@}0% qnP~T6BEc|8+s*}I#-C|*8HszS!IFU(Y@=JX& zM%gBVZ3c{t2C8f>3<6B546MBT=6v&bfAgkur*ZA((%_8Yn8=>VHkl=j`4U^)cC`e? z=Pb-kCd$+E<}jJ?Dmw?cI)=C^gg83+xK97*%qTnk%p9g`EI@ZkO>`979+$?*$O3h8o%u&+R)NE8x zV;2uMWo&euet!a!)bx83nFOXUo5)nis5)I@64MMumFXKNF&$&%+RT{nUw%=602nF2 z7*Ot}0v3VgEDlTo8a&M94BWT46}g^p`SOLaePrWc_26B^T+W%zv4$}X=xQ+F*f6ot zSeU(qF@pg}Btry&tjLLtUsyQSFhAPZ$jrnA)NvakwY_{Y(+mzK#;F?{Co*ndG?yvP aXkq|2t2R(pbF*N=d;ZP;>luM=F#rI=T7z-` diff --git a/graph_analyzer/settings.py b/graph_analyzer/settings.py index 3d8267d..4cc52b5 100644 --- a/graph_analyzer/settings.py +++ b/graph_analyzer/settings.py @@ -158,7 +158,7 @@ ACCOUNT_AUTHENTICATION_METHOD='username_email' ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS=10 ACCOUNT_EMAIL_REQUIRED=True -ACCOUNT_EMAIL_VERIFICATION='None' +ACCOUNT_EMAIL_VERIFICATION='optional' ACCOUNT_FORMS = { 'signup': 'stellarledger.forms.CustomSignupForm', diff --git a/graph_analyzer/urls.py b/graph_analyzer/urls.py index 0998df7..a06c1e7 100644 --- a/graph_analyzer/urls.py +++ b/graph_analyzer/urls.py @@ -16,8 +16,14 @@ """ from django.contrib import admin from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static urlpatterns = [ path("admin/", admin.site.urls), path("", include("analyzer.urls")), ] + +if settings.DEBUG: + urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/images/Average-network-throughput-vs-simulation-time-120-nodes-Fig-6-depicts-the-value-of.png b/images/Average-network-throughput-vs-simulation-time-120-nodes-Fig-6-depicts-the-value-of.png new file mode 100644 index 0000000000000000000000000000000000000000..f80db1ef5bb4a9a4237a86acf1cbd9ba06422e7a GIT binary patch literal 22920 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�cD-i#zro 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 KP^(vg#{35$Bb - Document + Graph Analyzer + + -
- {% csrf_token %} - {{ form.as_p }} - -
-

Graph Analysis Results

-

Minima: {{ minima }}

-

Maxima: {{ maxima }}

+
+
+

Graph Analyzer

+
+
+
+
+
+ {% csrf_token %} +
+ + Select File + {{ form.image }} + No file chosen +
+ +
+
+ + {% if minima is not None and maxima is not None %} +
+

Graph Analysis Results

+
+

Minima: {{ minima }}

+

Maxima: {{ maxima }}

+
+
+ {% endif %} + + {% if predicted_points %} +
+

Predicted Next 5 Points

+
    + {% for point in predicted_points %} +
  • + Point {{ forloop.counter }}: + X: {{ point.0 }}, + Y: {{ point.1|floatformat:2 }} +
  • + {% endfor %} +
+
+ {% endif %} +
+ +
+
+

© 2024 Graph Analyzer. All rights reserved.

+
+
+ + \ No newline at end of file