diff --git a/.devcontainer/.Dockerfile b/.devcontainer/.Dockerfile
index e69de29..1c3275e 100644
--- a/.devcontainer/.Dockerfile
+++ b/.devcontainer/.Dockerfile
@@ -0,0 +1,6 @@
+FROM python:3.12.5
+
+WORKDIR /app
+
+COPY requirements.txt .
+RUN pip install --no-cache-dir -r requirements.txt
\ No newline at end of file
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index e69de29..f35055b 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,25 @@
+{
+ "name": "My Dev Container",
+ "dockerFile": "Dockerfile",
+ // "features": {
+ // "ghcr.io/devcontainers/features/docker-in-docker:2": {}
+ // },
+ "customizations": {
+ "vscode": {
+ // "settings": {
+ // "python.pythonPath": "/usr/local/bin/python",
+ // "editor.formatOnSave": true
+ // },
+ "extensions": [
+ "ms-python.python",
+ "ms-python.vscode-pylance",
+ "ms-python.autopep8"
+ ]
+ }
+ },
+ //"postCreateCommand": "pip install -r requirements.txt", // Runs after the container is created, to install dependencies
+ "forwardPorts": [
+ 4040
+ ], // List of ports to forward from the container
+ "remoteUser": "vscode" // Default user to run commands as
+}
\ No newline at end of file
diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
index e69de29..3d3ad48 100644
--- a/.github/workflows/main.yaml
+++ b/.github/workflows/main.yaml
@@ -0,0 +1,34 @@
+name: RamilIndividualProject1_GithubActions
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+jobs:
+ build-and-test:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: '3.12.5'
+
+ - name: Create environment
+ run: make install
+
+ - name: Format the code
+ run: make format
+
+ - name: Run Lint
+ run: make lint
+
+ - name: Run tests
+ run: make test_code
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..34ab06b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+**cache**
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 65f19a3..73acc73 100644
--- a/Makefile
+++ b/Makefile
@@ -1,18 +1,17 @@
install:
- pip install --upgrade pip && pip install -r requirements.txt
+ pip3 install -r requirements.txt
format:
- black *.py
-
+ black src/*.py
+ black test/*.py
+test_code:
+ pytest -vv --nbval -cov=my_lib -cov=main test/test_*.py *.ipynb
lint:
- ruff check *.py
-
+ ruff check src/*.py
+ ruff check test/*.py
container-lint:
docker run --rm -i hadolint/hadolint < .devcontainer/Dockerfile
-test:
- python -m pytest -vv --nbval -cov=my_lib -cov=main test_*.py *.ipynb
-
all: install format lint container-lint test
generate_and_push:
diff --git a/data/correlation_matrix.png b/data/correlation_matrix.png
new file mode 100644
index 0000000..3f5cf83
Binary files /dev/null and b/data/correlation_matrix.png differ
diff --git a/data/histogram.png b/data/histogram.png
new file mode 100644
index 0000000..34bff53
Binary files /dev/null and b/data/histogram.png differ
diff --git a/data/line_graph.png b/data/line_graph.png
new file mode 100644
index 0000000..4201617
Binary files /dev/null and b/data/line_graph.png differ
diff --git a/main.ipynb b/main.ipynb
new file mode 100644
index 0000000..1cdc71b
--- /dev/null
+++ b/main.ipynb
@@ -0,0 +1,304 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "from src.lib import (\n",
+ " get_data,\n",
+ " get_max_val,\n",
+ " get_min_val,\n",
+ " get_summary,\n",
+ " get_std_val,\n",
+ " get_histogram,\n",
+ " get_line_graph,\n",
+ " get_correlation_matrix,\n",
+ ")\n",
+ "\n",
+ "\n",
+ "remote_path = \"https://raw.githubusercontent.com/Ramil-cyber/Ramil-Individual-Project-1/refs/heads/main/data/shanghai_ranking_2024.csv\"\n",
+ "\n",
+ "\n",
+ "data = get_data(remote_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# NBVAL_IGNORE_OUTPUT\n",
+ "\n",
+ "\n",
+ "assert get_max_val(data, col=\"N&S\") == 100.0\n",
+ "assert get_min_val(data, col=\"PUB\") == 9.3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Alumni | \n",
+ " Award | \n",
+ " Hici | \n",
+ " N&S | \n",
+ " PUB | \n",
+ " PCP | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " count | \n",
+ " 1000.000000 | \n",
+ " 1000.00000 | \n",
+ " 1000.000000 | \n",
+ " 989.000000 | \n",
+ " 1000.000000 | \n",
+ " 1000.000000 | \n",
+ "
\n",
+ " \n",
+ " mean | \n",
+ " 4.509600 | \n",
+ " 3.78120 | \n",
+ " 10.734400 | \n",
+ " 10.575126 | \n",
+ " 35.113000 | \n",
+ " 19.655300 | \n",
+ "
\n",
+ " \n",
+ " std | \n",
+ " 10.103201 | \n",
+ " 11.45538 | \n",
+ " 10.949265 | \n",
+ " 10.637247 | \n",
+ " 13.684495 | \n",
+ " 8.800436 | \n",
+ "
\n",
+ " \n",
+ " min | \n",
+ " 0.000000 | \n",
+ " 0.00000 | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ " 9.300000 | \n",
+ " 8.600000 | \n",
+ "
\n",
+ " \n",
+ " 25% | \n",
+ " 0.000000 | \n",
+ " 0.00000 | \n",
+ " 0.000000 | \n",
+ " 3.900000 | \n",
+ " 25.775000 | \n",
+ " 14.100000 | \n",
+ "
\n",
+ " \n",
+ " 50% | \n",
+ " 0.000000 | \n",
+ " 0.00000 | \n",
+ " 9.200000 | \n",
+ " 7.300000 | \n",
+ " 31.700000 | \n",
+ " 17.600000 | \n",
+ "
\n",
+ " \n",
+ " 75% | \n",
+ " 0.000000 | \n",
+ " 0.00000 | \n",
+ " 14.600000 | \n",
+ " 13.300000 | \n",
+ " 41.425000 | \n",
+ " 23.000000 | \n",
+ "
\n",
+ " \n",
+ " max | \n",
+ " 100.000000 | \n",
+ " 100.00000 | \n",
+ " 100.000000 | \n",
+ " 100.000000 | \n",
+ " 100.000000 | \n",
+ " 100.000000 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Alumni Award Hici N&S PUB \\\n",
+ "count 1000.000000 1000.00000 1000.000000 989.000000 1000.000000 \n",
+ "mean 4.509600 3.78120 10.734400 10.575126 35.113000 \n",
+ "std 10.103201 11.45538 10.949265 10.637247 13.684495 \n",
+ "min 0.000000 0.00000 0.000000 0.000000 9.300000 \n",
+ "25% 0.000000 0.00000 0.000000 3.900000 25.775000 \n",
+ "50% 0.000000 0.00000 9.200000 7.300000 31.700000 \n",
+ "75% 0.000000 0.00000 14.600000 13.300000 41.425000 \n",
+ "max 100.000000 100.00000 100.000000 100.000000 100.000000 \n",
+ "\n",
+ " PCP \n",
+ "count 1000.000000 \n",
+ "mean 19.655300 \n",
+ "std 8.800436 \n",
+ "min 8.600000 \n",
+ "25% 14.100000 \n",
+ "50% 17.600000 \n",
+ "75% 23.000000 \n",
+ "max 100.000000 "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# NBVAL_IGNORE_OUTPUT\n",
+ "\n",
+ "get_summary(data)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+lElEQVR4nO3dfVhUdf7/8dfIzQgIo0IykmiUmBloCpuFrmLeZaKmbVpqato3W29WUtfN3H5Rm5D4FW1l02pdtfh6s7Xatn03E00tl9wU0tRctSJEY5Yy4kYREM7vjy7nuyPeEjDj8fm4rnNdO5/zPp95nzlX8tpzM2MxDMMQAACASTVxdwMAAAANibADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADmMCqVatksVi0Z8+eC65PSEjQTTfd5DJ20003acKECVf1PllZWUpKStIPP/xQt0avQ+vXr9ftt98uPz8/WSwW7d2794J127dvl8VicS5eXl4KDQ3Vgw8+qEOHDtWq//e//62nnnpK0dHRatasmZo2barIyEjNmDFDR48eddYlJSW5zOvr66uIiAjNmDGD44jrhre7GwDgHhs3blRQUNBVbZOVlaXnnntOEyZMUPPmzRumMRP59ttv9cgjj+jee+/Vyy+/LKvVqg4dOlxym+TkZPXp00eVlZXas2ePnn/+eW3dulX79+/XjTfeKEn65JNPlJCQIMMwNG3aNN19993y9fXV4cOHlZGRoTvvvFNFRUUu827atEk2m02lpaX6+9//rpdeekmffPKJsrKyZLFYGuwzADwBYQe4TnXt2tXdLVy1qqoqWSwWeXtfG/90HTlyRFVVVRo7dqx69+59RdtERkbqrrvukiT16tVLzZs316RJk7Rq1SrNmzdPJSUlGjZsmJo2baqsrCy1adPGuW18fLwmT56st956q9a8MTExCgkJkST1799fJ0+e1BtvvKGsrCz16NGjHvYW8FxcxgKuU+dfxqqpqdELL7ygW2+9VX5+fmrevLk6d+6sl156SdKPl0N+/etfS5IiIiKcl0W2b9/u3D41NVUdO3aU1WpVq1atNG7cOB0/ftzlfQ3DUHJystq1a6emTZsqNjZWmZmZio+PV3x8vLPu3GWdN954Q7NmzdKNN94oq9WqL774Qt9++62mTJmiTp06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hB0AAGBqhB0AAGBqhB0AAGBqhB0AAGBqhB0AAGBqhB0AAGBqdQo7ubm59d0HAABAg6hT2Gnfvr369OmjjIwMnTlzpr57AgAAqDd1Cjv79u1T165dNWvWLNntdk2ePFmffPJJffcGAADwk9Up7ERFRSktLU0nTpzQypUr5XA41LNnT91+++1KS0vTt99+W999AgAA1MlPukHZ29tbw4cP15///GctWLBAX375pWbPnq02bdpo3LhxKigoqK8+AQAA6uQnhZ09e/ZoypQpat26tdLS0jR79mx9+eWX+uCDD3TixAkNGzbsktsnJSXJYrG4LHa73bneMAwlJSUpLCxMfn5+io+P18GDB13mqKio0PTp0xUSEqKAgAANHTpUx48f/ym7BQAATKROYSctLU3R0dGKi4vTN998o9dff115eXl64YUXFBERoR49euiVV15RTk7OZee6/fbbVVBQ4Fz279/vXJeamqq0tDSlp6dr9+7dstvt6t+/v0pLS501iYmJ2rhxo9atW6edO3eqrKxMCQkJqq6ursuuAQAAk/Guy0bLli3TxIkT9eijj7qciflPbdu21YoVKy7fgLf3BecwDENLlizRvHnzNGLECEnS6tWrFRoaqjVr1mjy5MkqLi7WihUr9MYbb6hfv36SpIyMDIWHh2vLli0aOHBgXXYPAACYSJ3O7Bw9elRz5869aNCRJF9fX40fP/6K5goLC1NERIQeeughffXVV5J+/C4fh8OhAQMGOGutVqt69+6trKwsSVJ2draqqqpcasLCwhQVFeWsuZCKigqVlJS4LAAAwJzqFHZWrlypN998s9b4m2++qdWrV1/xPN27d9frr7+u999/X6+99pocDofi4uJ08uRJORwOSVJoaKjLNqGhoc51DodDvr6+atGixUVrLiQlJUU2m825hIeHX3HPAADg2lKnsPPiiy8qJCSk1nirVq2UnJx8xfMMGjRIDzzwgKKjo9WvXz/97//+ryS5BCaLxeKyjWEYtcbOd7mauXPnqri42Lnk5+dfcc8AAODaUqewk5eXp4iIiFrj7dq107Fjx+rcTEBAgKKjo3X06FHnJbLzz9AUFhY6z/bY7XZVVlaqqKjoojUXYrVaFRQU5LIAAABzqlPYadWqlT777LNa4/v27VNwcHCdm6moqNChQ4fUunVrRUREyG63KzMz07m+srJSO3bs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8MMPtXPnTjVr1kz33nuvKisrdfbsWd1///3q3bu3PvvsM3388cd6/PHHZbFY6mOXATQSb3c3AADnTJw4UQsXLtT27dvVp08fST9ewhoxYoRuvPFGzZ4921k7ffp0bdq0SW+++aa6d+9ep/dbt26dmjRpoj/+8Y/OALNy5Uo1b95c27dvV2xsrIqLi5WQkKBbbrlFknTbbbf9xL0E0Ng4swPAY3Ts2FFxcXH605/+JEn68ssv9dFHH2nixImqrq7W/Pnz1blzZwUHB6tZs2bavHmzjh07Vuf3y87O1hdffKHAwEA1a9ZMzZo1U8uWLXXmzBl9+eWXatmypSZMmKCBAwdqyJAheumll1RQUFBfuwugkRB2AHiUSZMm6S9/+YtKSkq0cuVKtWvXTn379tWiRYu0ePFizZkzRx988IH27t2rgQMHqrKy8qJzWSwWl0tiklRVVeX83zU1NYqJidHevXtdliNHjmj06NGSfjzT8/HHHysuLk7r169Xhw4dtGvXrobZeQANgrADwKOMHDlSXl5eWrNmjVavXq1HH31UFotFH330kYYNG6axY8eqS5cuuvnmm3X06NFLznXDDTe4nIk5evSoTp8+7XzdrVs3HT16VK1atVL79u1dFpvN5qzr2rWr5s6dq6ysLEVFRWnNmjX1v+MAGgxhB4BHadasmUaNGqWnn35a33zzjSZMmCBJat++vTIzM5WVlaVDhw5p8uTJcjgcl5zrnnvuUXp6unJycrRnzx498cQT8vHxca4fM2aMQkJCNGzYMH300UfKzc3Vjh07NGPGDB0/fly5ubmaO3euPv74Y+Xl5Wnz5s06cuQI9+0A1xjCDgCPM2nSJBUVFalfv35q27atJOmZZ55Rt27dNHDgQMXHx8tut+v++++/5DyLFi1SeHi4evXqpdGjR2v27Nny9/d3rvf399eHH36otm3basSIEbrttts0ceJElZeXKygoSP7+/vrXv/6lBx54QB06dNDjjz+uadOmafLkyQ25+wDqmcU4/4I2AACAiXBmBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmNr/B9QP6dXD6isjAAAAAElFTkSuQmCC",
+ "text/plain": [
+ "