diff --git a/lab7.ipynb b/lab7.ipynb
new file mode 100644
index 0000000..c02f7bc
--- /dev/null
+++ b/lab7.ipynb
@@ -0,0 +1,576 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "dfb724b8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import pymysql\n",
+ "from sqlalchemy import create_engine\n",
+ "import getpass # To get the password without showing the input\n",
+ "password = getpass.getpass()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "bcac7947",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Engine(mysql+pymysql://root:***@localhost/sakila)"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bd = \"sakila\"\n",
+ "connection_string = 'mysql+pymysql://root:' + password + '@localhost/'+bd\n",
+ "engine = create_engine(connection_string)\n",
+ "engine"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "id": "4fb3a6ba",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sqlalchemy import text\n",
+ "\n",
+ "def get_rental_info(engine,month,year):\n",
+ " with engine.connect() as connection:\n",
+ " query = text(\"\"\"SELECT * FROM rental\n",
+ " WHERE MONTH(rental_date) = :month AND YEAR(rental_date) = :year;\n",
+ " \"\"\")\n",
+ " result = connection.execute(query, {\n",
+ " \"month\": month,\n",
+ " \"year\": year\n",
+ " })\n",
+ " df = pd.DataFrame(result.all())\n",
+ " return df\n",
+ "df = get_rental_info(engine,5,2005)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "8f0b4a99",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " rental_id | \n",
+ " rental_date | \n",
+ " inventory_id | \n",
+ " customer_id | \n",
+ " return_date | \n",
+ " staff_id | \n",
+ " last_update | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 2005-05-24 22:53:30 | \n",
+ " 367 | \n",
+ " 130 | \n",
+ " 2005-05-26 22:04:30 | \n",
+ " 1 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 2005-05-24 22:54:33 | \n",
+ " 1525 | \n",
+ " 459 | \n",
+ " 2005-05-28 19:40:33 | \n",
+ " 1 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 2005-05-24 23:03:39 | \n",
+ " 1711 | \n",
+ " 408 | \n",
+ " 2005-06-01 22:12:39 | \n",
+ " 1 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " 2005-05-24 23:04:41 | \n",
+ " 2452 | \n",
+ " 333 | \n",
+ " 2005-06-03 01:43:41 | \n",
+ " 2 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " 2005-05-24 23:05:21 | \n",
+ " 2079 | \n",
+ " 222 | \n",
+ " 2005-06-02 04:33:21 | \n",
+ " 1 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 1151 | \n",
+ " 1153 | \n",
+ " 2005-05-31 21:36:44 | \n",
+ " 2725 | \n",
+ " 506 | \n",
+ " 2005-06-10 01:26:44 | \n",
+ " 2 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ " | 1152 | \n",
+ " 1154 | \n",
+ " 2005-05-31 21:42:09 | \n",
+ " 2732 | \n",
+ " 59 | \n",
+ " 2005-06-08 16:40:09 | \n",
+ " 1 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ " | 1153 | \n",
+ " 1155 | \n",
+ " 2005-05-31 22:17:11 | \n",
+ " 2048 | \n",
+ " 251 | \n",
+ " 2005-06-04 20:27:11 | \n",
+ " 2 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ " | 1154 | \n",
+ " 1156 | \n",
+ " 2005-05-31 22:37:34 | \n",
+ " 460 | \n",
+ " 106 | \n",
+ " 2005-06-01 23:02:34 | \n",
+ " 2 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ " | 1155 | \n",
+ " 1157 | \n",
+ " 2005-05-31 22:47:45 | \n",
+ " 1449 | \n",
+ " 61 | \n",
+ " 2005-06-02 18:01:45 | \n",
+ " 1 | \n",
+ " 2006-02-15 21:30:53 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
1156 rows × 7 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " rental_id rental_date inventory_id customer_id \\\n",
+ "0 1 2005-05-24 22:53:30 367 130 \n",
+ "1 2 2005-05-24 22:54:33 1525 459 \n",
+ "2 3 2005-05-24 23:03:39 1711 408 \n",
+ "3 4 2005-05-24 23:04:41 2452 333 \n",
+ "4 5 2005-05-24 23:05:21 2079 222 \n",
+ "... ... ... ... ... \n",
+ "1151 1153 2005-05-31 21:36:44 2725 506 \n",
+ "1152 1154 2005-05-31 21:42:09 2732 59 \n",
+ "1153 1155 2005-05-31 22:17:11 2048 251 \n",
+ "1154 1156 2005-05-31 22:37:34 460 106 \n",
+ "1155 1157 2005-05-31 22:47:45 1449 61 \n",
+ "\n",
+ " return_date staff_id last_update \n",
+ "0 2005-05-26 22:04:30 1 2006-02-15 21:30:53 \n",
+ "1 2005-05-28 19:40:33 1 2006-02-15 21:30:53 \n",
+ "2 2005-06-01 22:12:39 1 2006-02-15 21:30:53 \n",
+ "3 2005-06-03 01:43:41 2 2006-02-15 21:30:53 \n",
+ "4 2005-06-02 04:33:21 1 2006-02-15 21:30:53 \n",
+ "... ... ... ... \n",
+ "1151 2005-06-10 01:26:44 2 2006-02-15 21:30:53 \n",
+ "1152 2005-06-08 16:40:09 1 2006-02-15 21:30:53 \n",
+ "1153 2005-06-04 20:27:11 2 2006-02-15 21:30:53 \n",
+ "1154 2005-06-01 23:02:34 2 2006-02-15 21:30:53 \n",
+ "1155 2005-06-02 18:01:45 1 2006-02-15 21:30:53 \n",
+ "\n",
+ "[1156 rows x 7 columns]"
+ ]
+ },
+ "execution_count": 53,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "9872bf03",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "\n",
+ "def get_rental_info_customer_id(engine,month,year):\n",
+ " with engine.connect() as connection:\n",
+ " query = text(\"\"\"SELECT * FROM rental\n",
+ " WHERE MONTH(rental_date) = :month AND YEAR(rental_date) = :year;\n",
+ " \"\"\")\n",
+ " result = connection.execute(query, {\n",
+ " \"month\": month,\n",
+ " \"year\": year\n",
+ " })\n",
+ " df = pd.DataFrame(result.all())\n",
+ "\n",
+ " column_name = \"rentals_\" + f\"{int(month):02d}\" + \"_\" + str(year)\n",
+ "\n",
+ " df =df.groupby(\"customer_id\").size().reset_index(name=column_name)\n",
+ " return df\n",
+ "df = get_rental_info_customer_id(engine,5,2005)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "id": "3b719d6a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customer_id | \n",
+ " rentals_05_2005 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 5 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 6 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 515 | \n",
+ " 594 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 516 | \n",
+ " 595 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 517 | \n",
+ " 596 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 518 | \n",
+ " 597 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 519 | \n",
+ " 599 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
520 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customer_id rentals_05_2005\n",
+ "0 1 2\n",
+ "1 2 1\n",
+ "2 3 2\n",
+ "3 5 3\n",
+ "4 6 3\n",
+ ".. ... ...\n",
+ "515 594 4\n",
+ "516 595 1\n",
+ "517 596 6\n",
+ "518 597 2\n",
+ "519 599 1\n",
+ "\n",
+ "[520 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "ed15b1d0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customer_id | \n",
+ " rentals_05_2005 | \n",
+ " rentals_06_2005 | \n",
+ " difference | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 2.0 | \n",
+ " 7.0 | \n",
+ " -5.0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 1.0 | \n",
+ " 1.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 2.0 | \n",
+ " 4.0 | \n",
+ " -2.0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " 0.0 | \n",
+ " 6.0 | \n",
+ " -6.0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " 3.0 | \n",
+ " 5.0 | \n",
+ " -2.0 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 593 | \n",
+ " 595 | \n",
+ " 1.0 | \n",
+ " 2.0 | \n",
+ " -1.0 | \n",
+ "
\n",
+ " \n",
+ " | 594 | \n",
+ " 596 | \n",
+ " 6.0 | \n",
+ " 2.0 | \n",
+ " 4.0 | \n",
+ "
\n",
+ " \n",
+ " | 595 | \n",
+ " 597 | \n",
+ " 2.0 | \n",
+ " 3.0 | \n",
+ " -1.0 | \n",
+ "
\n",
+ " \n",
+ " | 596 | \n",
+ " 598 | \n",
+ " 0.0 | \n",
+ " 1.0 | \n",
+ " -1.0 | \n",
+ "
\n",
+ " \n",
+ " | 597 | \n",
+ " 599 | \n",
+ " 1.0 | \n",
+ " 4.0 | \n",
+ " -3.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
598 rows × 4 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customer_id rentals_05_2005 rentals_06_2005 difference\n",
+ "0 1 2.0 7.0 -5.0\n",
+ "1 2 1.0 1.0 0.0\n",
+ "2 3 2.0 4.0 -2.0\n",
+ "3 4 0.0 6.0 -6.0\n",
+ "4 5 3.0 5.0 -2.0\n",
+ ".. ... ... ... ...\n",
+ "593 595 1.0 2.0 -1.0\n",
+ "594 596 6.0 2.0 4.0\n",
+ "595 597 2.0 3.0 -1.0\n",
+ "596 598 0.0 1.0 -1.0\n",
+ "597 599 1.0 4.0 -3.0\n",
+ "\n",
+ "[598 rows x 4 columns]"
+ ]
+ },
+ "execution_count": 56,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def compare_rental_info(engine,month1,year1,month2,year2):\n",
+ " df1 = get_rental_info_customer_id(engine,month1,year1)\n",
+ " df2 = get_rental_info_customer_id(engine,month2,year2)\n",
+ "\n",
+ " merged_df = pd.merge(df1, df2, on='customer_id', how='outer').fillna(0)\n",
+ "\n",
+ " merged_df['difference'] = merged_df.iloc[:, 1] - merged_df.iloc[:, 2]\n",
+ "\n",
+ " return merged_df\n",
+ "comparison_df = compare_rental_info(engine,5,2005,6,2005)\n",
+ "comparison_df"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "base",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.13.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}