From d1a18a0c8e59715076bc4a516fcd799a343304a4 Mon Sep 17 00:00:00 2001 From: Tarun Sreepada Date: Tue, 29 Oct 2024 16:14:12 +0900 Subject: [PATCH] fixed score calculator and added total score calculation --- geoAnalytics.zip | Bin 0 -> 36065 bytes .../__pycache__/repository.cpython-312.pyc | Bin 21286 -> 22024 bytes .../scoreCalculator.cpython-312.pyc | Bin 1076 -> 1292 bytes geoAnalytics/repository.py | 14 ++- geoAnalytics/scoreCalculator.py | 20 ++-- geoAnalytics/testCase.ipynb | 108 ++++++++++++------ 6 files changed, 96 insertions(+), 46 deletions(-) create mode 100644 geoAnalytics.zip diff --git a/geoAnalytics.zip b/geoAnalytics.zip new file mode 100644 index 0000000000000000000000000000000000000000..829dae38887137bb2bb2c655ce4a9d0cd9459e17 GIT binary patch literal 36065 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

fV>FFwbR5v^ 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 Br)vNJ literal 0 HcmV?d00001 diff --git a/geoAnalytics/__pycache__/repository.cpython-312.pyc b/geoAnalytics/__pycache__/repository.cpython-312.pyc index 0e2c147cd0d980cb71cfb3e01599fc4c96d27c2f..be47f05b5750949502b8d41f7ba3bdd338b4a598 100644 GIT binary patch delta 964 zcmYjQUr19?7(d^+n{B$?xqrIp)N2cDk)uCE5++zmxJ1+lWaMPKXa3{r^4|G>qLdF3 zLdAs?%7=Q8NCU$N-y$dwdU09_1Hq>#q8F9O9;ENCC4O*z-{13{-*@i0^YbvZ2>eI0 zIh&xIx+iozyYPxHg1k5A&X6bx0wY1nV3GtmR;X5k9X#qyC>i&#oJk0pm^ zcvi%C)D~9EEU0r?3Cl%oWmc@RF&mQ`79r!F6KgXGdE%Z zD?lt9roPgY?OHTe6OM-?VP*LzcM^2Dd12V;L znScTE2xb7tbheHR!%J=ud{q90r44c!qK~Gi|BUR^XDJF&`rOJO;q)}2FxbYkLJwetzfhGHF%X9mawxlPpujnvwhtCE1 z92)7veIW0loys}V*2kqdrN2iGX+;+id^*{x*`EZRWjjVNct$8CG-tM)Y(WG~D%J`r>X%Mz8t~G;ee@9RJ zAyBmEvuLVz7H9eN4Jcg|PMiY1f6Yb3jp+PRM3Mp2w~a;kTWvMY!GSu^R0?<1*`^_r iPTvAMyh-og^%&Ls<`2NDTg{g&EqZY85DjJRg8u?emGjI1 delta 273 zcmeBJ!?b8`1$*D+CQU>e6oyU8-U#D450UPfjqtxnG`-C&7UHh!VjbcQshzufV5zWAW)T1 ziV%<#PLWR$28xNKhyZz_K%OX&CkCX&fV6muI8am~MFL1lrbq%wsY)hIg^saM}S~*}(9`#dEWap9mA9-(d95X(oDY?CQlER1v+(W w@Z8DaA+n5hlS@M?*qK-(7(a9IO#T^il#zY%{!lA^Z&pUhPYfWkNCapY0KXSXMF0Q* diff --git a/geoAnalytics/__pycache__/scoreCalculator.cpython-312.pyc b/geoAnalytics/__pycache__/scoreCalculator.cpython-312.pyc index 7cad2667bb90b2b2ee85cf2dc06674855da425ac..e135a51e61877d557f0033dc8358a337a0dbfd50 100644 GIT binary patch literal 1292 zcmaJ=KTH#06o22{6%g(MQUt;P#YE#Rba2sVG)58}NEcd$rpe{JJ4?&a;{74CxxsD^z^aovIk?zPO(zm3HbMszCf~ceVyUNJ()Ydh{oe2WyVviMGz@rViiy0$ z1NXV4vt-U1!uNIz_s%tJYBZ6suF%t{7H+tB&R2Y*TH zNX1PV8QWc~E$=NiM-r|0L`xdq)obRS*_5sy7>CZ0SNEDX@3rESgrsY^y^3B@{bw#__Sa&afC;Wq~I-rDPU3PY{C=`vJ~}?g#lESl95)k8%~2Q=T#Q NiyLRF>CVyt8=0eKD#Y8Y!6ve;le1P%5XBZObe z1oSgQ76(EW#;W3GV5nuTVGd@{Wb%6nQm)Bb1Twn_WaKU8#H8XPP{0*&f}~iA3_xLg zixn6mrKz_BVIGf9E6UG}2L{Y7*5c&+qSRuL`xStoh self.max_val: + if value == self.avg_val: + return 0 + elif value == self.min_val or value == self.max_val: + return 0.5 + elif value > self.max_val or value < self.min_val: return 1 + elif value < self.avg_val: + # Linear interpolation between min_val and avg_val + return 0.5 * (1 - (value - self.min_val) / (self.avg_val - self.min_val)) else: - # Use the precomputed max distance - distance_from_avg = abs(value - self.avg_val) - score = distance_from_avg / self.max_distance - return score \ No newline at end of file + # Linear interpolation between avg_val and max_val + return 0.5 * (1 - (self.max_val - value) / (self.max_val - self.avg_val)) + diff --git a/geoAnalytics/testCase.ipynb b/geoAnalytics/testCase.ipynb index fe71946..797a551 100644 --- a/geoAnalytics/testCase.ipynb +++ b/geoAnalytics/testCase.ipynb @@ -77,18 +77,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "id": "139f3edf", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/tarunsreepada/Github/geoAnalytics/geoAnalytics/repository.py:303: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", - " df = pd.read_sql(sql, self.conn)\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -108,6 +100,14 @@ "\n", "[27000 rows x 5 columns]\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/tarunsreepada/Github/geoAnalytics/geoAnalytics/repository.py:303: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + " df = pd.read_sql(sql, self.conn)\n" + ] } ], "source": [ @@ -117,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "id": "d51ff67e", "metadata": {}, "outputs": [ @@ -125,7 +125,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/Users/tarunsreepada/Github/geoAnalytics/geoAnalytics/repository.py:331: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "/Users/tarunsreepada/Github/geoAnalytics/geoAnalytics/repository.py:333: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", " return [self.scores[j - 2].calculate_score(row[j]) for j in range(2, len(row))]\n" ] }, @@ -168,9 +168,9 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.086957\n", - " 0.626866\n", - " 0.386503\n", + " 0.068966\n", + " 0.313433\n", + " 0.193252\n", " \n", " \n", " 1\n", @@ -179,9 +179,9 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.086957\n", - " 0.626866\n", - " 0.386503\n", + " 0.068966\n", + " 0.313433\n", + " 0.193252\n", " \n", " \n", " 2\n", @@ -190,9 +190,9 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.086957\n", - " 0.626866\n", - " 0.386503\n", + " 0.068966\n", + " 0.313433\n", + " 0.193252\n", " \n", " \n", " 3\n", @@ -201,9 +201,9 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.086957\n", - " 0.626866\n", - " 0.386503\n", + " 0.068966\n", + " 0.313433\n", + " 0.193252\n", " \n", " \n", " 4\n", @@ -212,9 +212,9 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.086957\n", - " 0.626866\n", - " 0.386503\n", + " 0.068966\n", + " 0.313433\n", + " 0.193252\n", " \n", " \n", " ...\n", @@ -289,11 +289,11 @@ ], "text/plain": [ " x y b1 b2 b3 score_0 score_1 score_2\n", - "0 0.5 89.5 0.0 0.0 0.0 0.086957 0.626866 0.386503\n", - "1 1.5 89.5 0.0 0.0 0.0 0.086957 0.626866 0.386503\n", - "2 2.5 89.5 0.0 0.0 0.0 0.086957 0.626866 0.386503\n", - "3 3.5 89.5 0.0 0.0 0.0 0.086957 0.626866 0.386503\n", - "4 4.5 89.5 0.0 0.0 0.0 0.086957 0.626866 0.386503\n", + "0 0.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252\n", + "1 1.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252\n", + "2 2.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252\n", + "3 3.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252\n", + "4 4.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252\n", "... ... ... ... ... ... ... ... ...\n", "26995 295.5 0.5 65534.0 65534.0 65534.0 1.000000 1.000000 1.000000\n", "26996 296.5 0.5 65534.0 65534.0 65534.0 1.000000 1.000000 1.000000\n", @@ -304,7 +304,7 @@ "[27000 rows x 8 columns]" ] }, - "execution_count": 7, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -315,11 +315,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "d17f1842", "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " x y b1 b2 b3 score_0 score_1 score_2 \\\n", + "0 0.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252 \n", + "1 1.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252 \n", + "2 2.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252 \n", + "3 3.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252 \n", + "4 4.5 89.5 0.0 0.0 0.0 0.068966 0.313433 0.193252 \n", + "... ... ... ... ... ... ... ... ... \n", + "26995 295.5 0.5 65534.0 65534.0 65534.0 1.000000 1.000000 1.000000 \n", + "26996 296.5 0.5 65534.0 65534.0 65534.0 1.000000 1.000000 1.000000 \n", + "26997 297.5 0.5 65534.0 65534.0 65534.0 1.000000 1.000000 1.000000 \n", + "26998 298.5 0.5 65534.0 65534.0 65534.0 1.000000 1.000000 1.000000 \n", + "26999 299.5 0.5 65534.0 65534.0 65534.0 1.000000 1.000000 1.000000 \n", + "\n", + " total_score \n", + "0 0.168895 \n", + "1 0.168895 \n", + "2 0.168895 \n", + "3 0.168895 \n", + "4 0.168895 \n", + "... ... \n", + "26995 0.666667 \n", + "26996 0.666667 \n", + "26997 0.666667 \n", + "26998 0.666667 \n", + "26999 0.666667 \n", + "\n", + "[27000 rows x 9 columns]\n" + ] + } + ], + "source": [ + "print(obj.total_score(df))" + ] }, { "cell_type": "code", @@ -475,7 +511,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" },