diff --git a/06_CodeGeneration/00_code_generatation_w_bedrock.ipynb b/06_CodeGeneration/00_code_generatation_w_bedrock.ipynb index 96ccdbd3..38c3e545 100644 --- a/06_CodeGeneration/00_code_generatation_w_bedrock.ipynb +++ b/06_CodeGeneration/00_code_generatation_w_bedrock.ipynb @@ -93,12 +93,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "776fd083", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Create new client\n", + " Using region: us-east-1\n", + " Using profile: fine-tuning-bedrock\n", + "boto3 Bedrock client successfully created!\n", + "bedrock(https://bedrock.us-east-1.amazonaws.com)\n" + ] + } + ], "source": [ "import json\n", "import os\n", @@ -136,9 +148,81 @@ "Following on the use case explained above, let's prepare an input for the Amazon Bedrock service to generate python program for our use-case." ] }, + { + "cell_type": "markdown", + "id": "e7656be8", + "metadata": {}, + "source": [ + "#### Lab setup - create sample sales.csv data for this lab.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "89a0ad24", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sales.csv has been created!\n" + ] + } + ], + "source": [ + "# create sales.csv file\n", + "import csv\n", + "\n", + "data = [\n", + " [\"date\", \"product_id\", \"price\", \"units_sold\"],\n", + " [\"2023-01-01\", \"P001\", 50, 20],\n", + " [\"2023-01-02\", \"P002\", 60, 15],\n", + " [\"2023-01-03\", \"P001\", 50, 18],\n", + " [\"2023-01-04\", \"P003\", 70, 30],\n", + " [\"2023-01-05\", \"P001\", 50, 25],\n", + " [\"2023-01-06\", \"P002\", 60, 22],\n", + " [\"2023-01-07\", \"P003\", 70, 24],\n", + " [\"2023-01-08\", \"P001\", 50, 28],\n", + " [\"2023-01-09\", \"P002\", 60, 17],\n", + " [\"2023-01-10\", \"P003\", 70, 29],\n", + " [\"2023-02-11\", \"P001\", 50, 23],\n", + " [\"2023-02-12\", \"P002\", 60, 19],\n", + " [\"2023-02-13\", \"P001\", 50, 21],\n", + " [\"2023-02-14\", \"P003\", 70, 31],\n", + " [\"2023-03-15\", \"P001\", 50, 26],\n", + " [\"2023-03-16\", \"P002\", 60, 20],\n", + " [\"2023-03-17\", \"P003\", 70, 33],\n", + " [\"2023-04-18\", \"P001\", 50, 27],\n", + " [\"2023-04-19\", \"P002\", 60, 18],\n", + " [\"2023-04-20\", \"P003\", 70, 32],\n", + " [\"2023-04-21\", \"P001\", 50, 22],\n", + " [\"2023-04-22\", \"P002\", 60, 16],\n", + " [\"2023-04-23\", \"P003\", 70, 34],\n", + " [\"2023-05-24\", \"P001\", 50, 24],\n", + " [\"2023-05-25\", \"P002\", 60, 21]\n", + "]\n", + "\n", + "# Write data to sales.csv\n", + "with open('sales.csv', 'w', newline='') as csvfile:\n", + " writer = csv.writer(csvfile)\n", + " writer.writerows(data)\n", + "\n", + "print(\"sales.csv has been created!\")" + ] + }, + { + "cell_type": "markdown", + "id": "d68e8af6", + "metadata": {}, + "source": [ + "#### Analyzing sales with Amazon Bedrock generated Python program" + ] + }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 42, "id": "45ee2bae-6415-4dba-af98-a19028305c98", "metadata": { "tags": [] @@ -146,22 +230,23 @@ "outputs": [], "source": [ "# Create the prompt\n", - "# Analyzing sales with a Python Program\n", + "# Analyzing sales\n", "\n", "prompt_data = \"\"\"\n", - "Command: Human: You have a CSV, sales.csv, with columns:\n", + "Human: You have a CSV, sales.csv, with columns:\n", "- date (YYYY-MM-DD)\n", "- product_id\n", "- price\n", "- units_sold\n", "\n", - "Wrte a python program to load the data and determine \n", + "Create a python program to analyze the sales data from a CSV file. The program should be able to read the data, and determine below:\n", "\n", "- Total revenue for the year\n", "- The product with the highest revenue\n", "- The date with the highest revenue\n", "- Visualize monthly sales using a bar chart\n", "\n", + "Ensure the code is syntactically correct, bug-free, optimized, not span multiple lines unnessarily, and prefer to use standard libraries. Return only python code without any surrounding text, explanation or context.\n", "Assistant:\n", "\"\"\"" ] @@ -176,7 +261,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 43, "id": "8af670eb-ad02-40df-a19c-3ed835fac8d9", "metadata": { "tags": [] @@ -194,29 +279,6 @@ " }) " ] }, - { - "cell_type": "markdown", - "id": "c4ca6751", - "metadata": {}, - "source": [ - "The Amazon Bedrock API provides you with an API `invoke_model` which accepts the following:\n", - "- `modelId`: This is the model ARN for the various foundation models available under Amazon Bedrock\n", - "- `accept`: The type of input request\n", - "- `contentType`: The content type of the output\n", - "- `body`: A json string consisting of the prompt and the configurations\n", - "\n", - "Available text generation models under Amazon Bedrock have the following IDs:\n", - "- `amazon.titan-tg1-large`\n", - "- `amazon.titan-e1t-medium`\n", - "- `ai21.j2-grande-instruct`\n", - "- `ai21.j2-jumbo-instruct`\n", - "- `ai21.j2-mid`\n", - "- `ai21.j2-ultra`\n", - "- `anthropic.claude-instant-v1`\n", - "- `anthropic.claude-v1`\n", - "- `anthropic.claude-v2`" - ] - }, { "cell_type": "markdown", "id": "088cf6bf-dd73-4710-a0cc-6c11d220c431", @@ -225,19 +287,9 @@ "#### Invoke the Anthropic Claude v2 model" ] }, - { - "cell_type": "markdown", - "id": "379498f2", - "metadata": {}, - "source": [ - "First, we explore how the model generates an output based on the prompt created earlier.\n", - "\n", - "##### Complete Output Generation" - ] - }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 40, "id": "016a118a", "metadata": {}, "outputs": [ @@ -245,49 +297,51 @@ "name": "stdout", "output_type": "stream", "text": [ - " Here is a Python program to analyze the sales CSV file as described:\n", + " Here is the Python code to analyze sales data from a CSV file:\n", "\n", "```python\n", "import csv\n", "from collections import defaultdict\n", "import matplotlib.pyplot as plt\n", "\n", - "revenue_by_month = defaultdict(int)\n", - "\n", - "with open('sales.csv', 'r') as f:\n", - " reader = csv.DictReader(f)\n", - " total_revenue = 0\n", - " max_revenue_product = None\n", - " max_revenue = 0\n", - " max_revenue_date = None\n", + "revenue = 0\n", + "monthly_revenue = defaultdict(int)\n", + "product_revenue = defaultdict(int)\n", + "max_revenue = 0\n", + "max_revenue_date = ''\n", + "max_revenue_product = ''\n", "\n", + "with open('sales.csv') as f:\n", + " reader = csv.reader(f)\n", + " next(reader)\n", " for row in reader:\n", - " revenue = float(row['price']) * int(row['units_sold'])\n", - " total_revenue += revenue\n", + " date = row[0]\n", + " product = row[1]\n", + " price = float(row[2])\n", + " units = int(row[3])\n", "\n", - " date = row['date']\n", - " month = date.split('-')[1]\n", - " revenue_by_month[month] += revenue\n", + " revenue += price * units\n", + " product_revenue[product] += price * units\n", + " monthly_revenue[date[:7]] += price * units\n", "\n", " if revenue > max_revenue:\n", " max_revenue = revenue\n", - " max_revenue_product = row['product_id']\n", " max_revenue_date = date\n", + " max_revenue_product = product\n", "\n", - "print('Total revenue:', total_revenue)\n", - "print('Product with max revenue:', max_revenue_product)\n", - "print('Date with max revenue:', max_revenue_date)\n", + "months = list(monthly_revenue.keys())\n", + "values = list(monthly_revenue.values())\n", "\n", - "plt.bar(revenue_by_month.keys(), revenue_by_month.values())\n", + "plt.bar(months, values)\n", "plt.xlabel('Month')\n", "plt.ylabel('Revenue')\n", - "plt.title('Revenue by Month')\n", + "plt.title('Monthly Revenue')\n", "plt.show()\n", - "```\n", "\n", - "This loads the CSV data, calculates the total revenue, finds the product and date with max revenue,\n", - "and visualizes the revenue per month in a bar chart. The defaultdict is used to easily accumulate\n", - "values by month.\n" + "print('Total Revenue:', revenue)\n", + "print('Product with max revenue:', max_revenue_product)\n", + "print('Date with max revenue:', max_revenue_date)\n", + "```\n" ] } ], @@ -312,28 +366,28 @@ }, { "cell_type": "code", - "execution_count": 24, - "id": "395fad3b", + "execution_count": 41, + "id": "77d9b428", "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total revenue: 35490.0\n", - "Product with max revenue: P003\n", - "Date with max revenue: 2023-04-23\n" - ] - }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAHHCAYAAACiOWx7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/30lEQVR4nO3df3zN9f//8fuZ2Y+wzbDNNCwKiyjeWAm97WvYu1opv0Zkkd5bPyg/9q786gdWy4+Spd6ZincovEV+LKq9Mb+GRCi9J8K2vGc7ITPb6/uHz16XTvPjZY1zNrfr5XIuF+f1fJznebyeabt7vV7ndWyGYRgCAADAJbk5uwEAAICKgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAWde7cWc2bN3d2Gy5h0KBBql69urPbAK4pQhNwHUpJSZHNZjMf7u7uqlevngYNGqQjR444u73rXsl/l8cee+yC488//7xZc/z48avWx+nTpzV+/Hh99dVXV+09gIrE3dkNAHCeiRMnKjQ0VGfOnNGmTZuUkpKi9evXa/fu3fLy8nJ2e9c1Ly8vffrpp3r77bfl4eHhMPavf/1LXl5eOnPmzFXt4fTp05owYYKk80fZgOsdR5qA61j37t3Vv39/PfbYY3rvvff03HPP6ccff9SyZcuc3dp1r1u3brLb7Vq5cqXD9o0bNyozM1NRUVFO6gy4fhGaAJjuvvtuSdKPP/7osH3fvn166KGH5O/vLy8vL7Vp08YhWG3btk02m01z584tNefq1atls9m0fPlyc9uRI0c0ePBgBQYGytPTU7feeqvef/99h9d99dVXstlsWrhwoV555RXdeOON8vLyUpcuXXTgwAGH2oYNG2rQoEGl3rtz586ljpAUFBRo3Lhxaty4sTw9PRUSEqJRo0apoKDA0hpJUkZGhu688055e3srNDRUycnJ5tjJkydVrVo1Pf3006Ve9/PPP6tKlSqaNGnSZd+jXr166tixo+bPn++wfd68eWrRosVFr61atGiRWrduLW9vb9WuXVv9+/cvdcq15HqkI0eOKDo6WtWrV1edOnX03HPPqaioSJJ08OBB1alTR5I0YcIE83Tg+PHjHea61BxAZUNoAmA6ePCgJKlmzZrmtj179qh9+/bau3evxowZo6SkJFWrVk3R0dFasmSJJKlNmza66aabtHDhwlJzLliwQDVr1lRkZKQkKTs7W+3bt9cXX3yh+Ph4TZ8+XY0bN1ZsbKymTZtW6vWTJ0/WkiVL9NxzzykhIUGbNm1STExMmfavuLhY9913n15//XXde++9evPNNxUdHa2pU6eqd+/eluY4ceKEevToodatWysxMVE33nijnnjiCTP0Va9eXQ888IAWLFhQKjz861//kmEYlvvv16+fPvvsM508eVKSdO7cOS1atEj9+vW7YH1KSop69eplBrMhQ4Zo8eLF6tChg/Ly8hxqi4qKFBkZqVq1aun1119Xp06dlJSUpNmzZ0uS6tSpo1mzZkmSHnjgAX344Yf68MMP9eCDD1qeA6h0DADXnTlz5hiSjC+++ML45ZdfjMOHDxuffPKJUadOHcPT09M4fPiwWdulSxejRYsWxpkzZ8xtxcXFxp133mncfPPN5raEhASjatWqRm5urrmtoKDA8PPzMwYPHmxui42NNerWrWscP37coac+ffoYvr6+xunTpw3DMIwvv/zSkGQ0a9bMKCgoMOumT59uSDK+/fZbc1uDBg2MgQMHltrPTp06GZ06dTKff/jhh4abm5vxn//8x6EuOTnZkGRs2LDhkuvWqVMnQ5KRlJTksI+tWrUyAgICjLNnzxqGYRirV682JBkrV650eP1tt93m0M/FSDLi4uKM3Nxcw8PDw/jwww8NwzCMFStWGDabzTh48KAxbtw4Q5Lxyy+/GIZhGGfPnjUCAgKM5s2bG7/99ps51/Llyw1JxtixY81tAwcONCQZEydOdHjf22+/3WjdurX5/JdffjEkGePGjSvVo9U5gMqEI03AdSwiIkJ16tRRSEiIHnroIVWrVk3Lli3TjTfeKEnKzc3VunXr1KtXL/366686fvy4jh8/rv/973+KjIzUDz/8YJ766d27twoLC7V48WJz/jVr1igvL888imMYhj799FPde++9MgzDnO/48eOKjIxUfn6+tm/f7tDjo48+6nAhdMkpxP/+979XvL+LFi1Ss2bN1LRpU4f3/utf/ypJ+vLLLy87h7u7ux5//HHzuYeHhx5//HHl5OQoIyPDXNfg4GDNmzfPrNu9e7d27dql/v37W+63Zs2a6tatm/71r39JkubPn68777xTDRo0KFW7bds25eTk6O9//7vDRfxRUVFq2rSpVqxYUeo1w4YNc3h+9913X/G6lsccQEXBp+eA69jMmTN1yy23KD8/X++//77S0tLk6elpjh84cECGYejFF1/Uiy++eME5cnJyVK9ePbVs2VJNmzbVggULFBsbK+n8qbnatWuboeSXX35RXl6eZs+efdFTODk5OQ7P69ev7/C85NThiRMnrnh/f/jhB+3du9e8Vudy730hwcHBqlatmsO2W265RdL505vt27eXm5ubYmJiNGvWLJ0+fVo33HCD5s2bJy8vLz388MNX1HO/fv00YMAAHTp0SEuXLlViYuIF63766SdJUpMmTUqNNW3aVOvXr3fY5uXlVWodataseUXrWh5zABUJoQm4jrVt21Zt2rSRJEVHR6tDhw7q16+f9u/fr+rVq6u4uFiS9Nxzz5nXJP1R48aNzT/37t1br7zyio4fP64aNWpo2bJl6tu3r9zdz/+oKZmvf//+Gjhw4AXnu+222xyeV6lS5YJ1hmGYf7bZbBesKSoqcnh9cXGxWrRooTfeeOOC9SEhIRfcXhaPPPKIXnvtNS1dulR9+/bV/Pnz9be//U2+vr5XNM99990nT09PDRw4UAUFBerVq1e59Hexdb3WcwAVCaEJgCSZFw/fc889euuttzRmzBjddNNNkqSqVasqIiLisnP07t1bEyZM0KeffqrAwEDZ7Xb16dPHHK9Tp45q1KihoqIiS/NZVbNmzVIXOkvnj76U7IMkNWrUSN988426dOly0aB1OUePHtWpU6ccjjZ9//33ks5/iq9E8+bNdfvtt2vevHm68cYbdejQIb355ptX/H7e3t6Kjo7WRx99pO7du6t27doXrCs5Zbd//37zyF6J/fv3X/CU3uWUdY2AyoprmgCYOnfurLZt22ratGk6c+aMAgIC1LlzZ73zzjs6duxYqfpffvnF4XmzZs3UokULLViwQAsWLFDdunXVsWNHc7xKlSrq2bOnPv30U+3evfuy81nVqFEjbdq0SWfPnjW3LV++XIcPH3ao69Wrl44cOaJ333231By//fabTp06ddn3OnfunN555x3z+dmzZ/XOO++oTp06at26tUPtgAEDtGbNGk2bNk21atVS9+7dr3TXJJ0/0jdu3LiLniKVzn+CMSAgQMnJyQ63T1i5cqX27t1bpvs63XDDDZJ0wUAKXI840gTAwciRI/Xwww8rJSVFw4YN08yZM9WhQwe1aNFC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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAHHCAYAAACiOWx7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABBq0lEQVR4nO3deVhV5f7//9cGZHBgoyYghco3O04Nlp6UHMoTHzE5lR0rB5xJsyBT+pjS4NCk4ZSa6alOWqZllllHyyKtOCZOKJlmZoVzQCcEHBJR7t8ffVg/t6AtCdt70/NxXeu63Pd673u9131O8nLttRcOY4wRAAAAzsvH3Q0AAAB4A0ITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2EBoAgAAsIHQBAAAYAOhCQAAwAZCEwCv43A4lJSU9Jt1CxYskMPh0J49ey5+UwCqPUITAEtZyHA4HFq7dm25/cYYRUZGyuFw6O9///tF7WXdunWaMGGCCgoKLupxLsSgQYOs9XE4HAoICNBf/vIXjRs3TidOnHB3ewAuMkITgHICAwO1ePHicuOff/65Dhw4oICAgIvew7p16zRx4kSPCk2SFBAQoIULF2rhwoWaPn26mjRpoieffFIJCQnubg3ARUZoAlBO9+7dtXTpUp06dcplfPHixWrTpo3Cw8Pd1Jn7+fn5qV+/furXr58SExP10UcfqX379nrjjTeUm5vr7vYAXESEJgDl9OnTRz///LPS0tKssZMnT+rtt99W3759K3zPsWPH9NBDDykyMlIBAQFq1qyZpk6dKmOMS13Z/UjLly/XlVdeqYCAALVq1UqrVq2yaiZMmKDRo0dLkqKioqyPw86+N+l8c1Rk4MCBuuSSS1RSUlJuX9euXdWsWbPzvr8iDodDHTt2lDFGP/zwg8u+Dz/8UJ06dVKtWrVUp04dxcXFaceOHdb+qVOnyuFwaO/eveXmTUlJkb+/vw4fPmyNbdiwQd26dZPT6VTNmjV144036osvvnB534QJE+RwOPTdd99p0KBBCgkJkdPp1ODBg3X8+HGrbs+ePXI4HFqwYEGF5zRhwgSXsYMHD2rIkCEKCwuz1vuVV165kKUCvB6hCUA5TZo0UXR0tN544w1r7MMPP1RhYaF69+5drt4Yo9tuu00zZsxQt27dNH36dDVr1kyjR49WcnJyufq1a9fq/vvvV+/evZWamqoTJ06oZ8+e+vnnnyVJ//jHP9SnTx9J0owZM6yPwxo0aGB7jor0799fP//8sz766COX8ZycHK1Zs0b9+vW7sIX6P2Vhrm7dutbYwoULFRcXp9q1a+vZZ5/V448/rq+//lodO3a06u+++245HA699dZb5eZ866231LVrV2vONWvWqHPnzioqKtL48eP1zDPPqKCgQH/729+0cePGcu+/++67deTIEU2aNEl33323FixYoIkTJ1bq/HJzc9W+fXt98sknSkpK0syZM9W0aVMlJCToueeeq9ScgFcyAPB/5s+fbySZTZs2meeff97UqVPHHD9+3BhjzF133WW6dOlijDGmcePGJi4uznrf8uXLjSTz1FNPucx35513GofDYb777jtrTJLx9/d3Gfvyyy+NJDN79mxrbMqUKUaSyc7OLten3TnKzqdsjtOnT5vLLrvM9OrVy2W+6dOnG4fDYX744Yfzrs/AgQNNrVq1zE8//WR++ukn891335mpU6cah8NhrrzySlNaWmqMMebIkSMmJCTEDB061OX9OTk5xul0uoxHR0ebNm3auNRt3LjRSDKvvfaaMcaY0tJSc8UVV5jY2FjrGMYYc/z4cRMVFWX+53/+xxobP368kWSGDBniMucdd9xh6tevb73Ozs42ksz8+fPLnackM378eOt1QkKCadiwofnvf//rUte7d2/jdDqt/48A1R1XmgBU6O6779Yvv/yiFStW6MiRI1qxYsU5P5r74IMP5OvrqxEjRriMP/TQQzLG6MMPP3QZj4mJ0eWXX269vvrqqxUcHFzu463zqcwcPj4+io+P1/vvv68jR45Y44sWLdINN9ygqKio3zzusWPH1KBBAzVo0EBNmzbV//7v/6pDhw5677335HA4JElpaWkqKChQnz599N///tfafH191a5dO3366afWfL169VJmZqa+//57a2zJkiUKCAjQ7bffLknKysrS7t271bdvX/3888/WfMeOHdPNN9+s9PR0lZaWuvQ5fPhwl9edOnXSzz//rKKiot88xzMZY/TOO+/o1ltvlTHG5XxiY2NVWFioLVu2XNCcgLfyc3cDADxTgwYNFBMTo8WLF+v48eM6ffq07rzzzgpr9+7dq4iICNWpU8dlvEWLFtb+MzVq1KjcHHXr1nW5f+e3VHaOAQMG6Nlnn9W7776rAQMGaNeuXcrMzNS8efNsHTcwMFD//ve/JUkHDhxQamqq8vLyFBQUZNXs3r1bkvS3v/2twjmCg4OtP991111KTk7WkiVL9Mgjj8gYo6VLl+qWW26x6srmGzhw4Dn7KiwsdPl48Oz1Kdt3+PBhl+P/lp9++kkFBQV68cUX9eKLL1ZYk5eXZ3s+wJsRmgCcU9++fTV06FDl5OTolltuUUhISJXM6+vrW+G4Oeum8YsxR8uWLdWmTRu9/vrrGjBggF5//XX5+/vr7rvvtn3cmJgY63VsbKyaN2+ue++9V++//74kWVd9Fi5cWOE3Df38/v+/eiMiItSpUye99dZbeuSRR7R+/Xrt27dPzz77rFVTNt+UKVPUunXrCvuqXbt2uT4rUrY+ZVfFznb69GmX12XH7tev3zlD29VXX13hOFDdEJoAnNMdd9yhe++9V+vXr9eSJUvOWde4cWN98sknOnLkiMvVpm+++cbaf6HO9UO9KgwYMEDJycn68ccftXjxYsXFxblcpbkQDRs21KhRozRx4kStX79e7du3tz42DA0NdQlY59KrVy/df//92rVrl5YsWaKaNWvq1ltvtfaXzRccHGxrPjvKzvfs52CdfVWwQYMGqlOnjk6fPl1lxwa8Ffc0ATin2rVra+7cuZowYYLLD/Gzde/eXadPn9bzzz/vMj5jxgw5HA7dcsstF3zsWrVqSSr/Q70q9OnTRw6HQw8++KB++OGHSn9rrswDDzygmjVravLkyZJ+vfoUHBysZ555psLHG/z0008ur3v27ClfX1+98cYbWrp0qf7+979b5y9Jbdq00eWXX66pU6fq6NGjvzmfHcHBwbrkkkuUnp7uMv7CCy+4vPb19VXPnj31zjvvaPv27VVybMBbcaUJwHmd7z6aMrfeequ6dOmiRx99VHv27NE111yjjz/+WO+9955GjhzpcsO2XW3atJEkPfroo+rdu7dq1KihW2+91SVMVFaDBg3UrVs3LV26VCEhIYqLi/td89WvX1+DBw/WCy+8oJ07d6pFixaaO3eu+vfvr+uuu069e/dWgwYNtG/fPq1cuVIdOnRwCZihoaHq0qWLpk+friNHjqhXr14u8/v4+Ojll1/WLbfcolatWmnw4MG69NJLdfDgQX366acKDg627rO6EPfcc48mT56se+65R23btlV6erq+/fbbcnWTJ0/Wp59+qnbt2mno0KFq2bKl8vPztWXLFn3yySfKz8+/8EUDvBBXmgD8bj4+Pnr//fc1cuRIrVixQiNHjtTXX3+tKVOmaPr06ZWa869//auefPJJffnllxo0aJD69OlTpVc1BgwYIOnXbwlWxa+FSU5Olo+Pj3UvUt++fbV69WpdeumlmjJlih588EG9+eabat26tQYPHlzu/b169bI+3uzevXu5/TfddJMyMjLUtm1bPf/883rggQe0YMEChYeHa9SoUZXqedy4cUpISNDbb7+thx9+WKdPny73TUdJCgsL08aNGzV48GAtW7bMelZTfn6+y71XQHXnMBdy5yUAVBPvvfeeevToofT0dHXq1Mnd7QDwAoQmAH9Kf//737Vz50599913F/WmcwDVB/c0AfhTefPNN7Vt2zatXLlSM2fOJDABsI0rTQD+VBwOh2rXrq1evXpp3rx5Ls9MAoDz4W8LAH8q/DsRQGXx7TkAAAAbCE0AAAA28PFcFSktLdWhQ4dUp04dbiwFAMBLGGN05MgRRUREyMfn/NeSCE1V5NChQ4qMjHR3GwAAoBL279+vyy677Lw1hKYqUvZLSvfv36/g4GA3dwMAAOwoKipSZGSkyy8bPxdCUxUp+0guODiY0AQAgJexc2uNW28ET09P16233qqIiAg5HA4tX778nLXDhw+Xw+HQc8895zKen5+v+Ph4BQcHKyQkRAkJCeV+C/i2bdvUqVMnBQYGKjIyUqmpqeXmX7p0qZo3b67AwEBdddVV+uCDD6riFAEAQDXh1tB07NgxXXPNNZozZ8556959912tX79eERER5fbFx8drx44dSktL04oVK5Senq5hw4ZZ+4uKitS1a1c1btxYmZmZmjJliiZMmKAXX3zRqlm3bp369OmjhIQEbd26VT169FCPHj20ffv2qjtZAADg3YyHkGTefffdcuMHDhwwl156qdm+fbtp3LixmTFjhrXv66+/NpLMpk2brLEPP/zQOBwOc/DgQWOMMS+88IKpW7euKS4utmrGjBljmjVrZr2+++67TVxcnMtx27VrZ+69917b/RcWFhpJprCw0PZ7AACAe13Iz2+Pfk5TaWmp+vfvr9GjR6tVq1bl9mdkZCgkJERt27a1xmJiYuTj46MNGzZYNZ07d5a/v79VExsbq127dunw4cNWTUxMjMvcsbGxysjIOGdvxcXFKioqctkAAED1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s2ZN3XDDDdq1a5ckacGCBZo4caK+/PJLORwOORwOLViwwHr/f//7X91xxx2qWbOmrrjiCr3//vsX/+QBVDlCE4BqbciQIZo/f771+pVXXtHgwYNdah5++GG98847evXVV7VlyxY1bdpUsbGxys/Pd6l79NFHNW3aNG3evFl+fn4aMmSIJKlXr1566KGH1KpVK/3444/68ccf1atXL+t9EydO1N13361t27ape/fuio+PLzc3AM9HaAJQrfXr109r167V3r17tXfvXn3xxRfq16+ftf/YsWOaO3eupkyZoltuuUUtW7bUSy+9pKCgIP3rX/9ymevpp5/WjTfeqJYtW2rs2LFat26dTpw4oaCgINWuXVt+fn4KDw9XeHi4goKCrPcNGjRIffr0UdOmTfXMM8/o6NGj2rhx4x+2BgCqhp+7GwCAi6lBgwaKi4vTggULZIxRXFycLrnkEmv/999/r5KSEnXo0MEaq1Gjhq6//nrt3LnTZa6rr77a+nPDhg0lSXl5eb95f9SZ76tVq5aCg4OVl5f3u84LwB+P0ASg2hsyZIiSkpIkSXPmzKn0PDVq1LD+7HA4JEmlpaUX9L6y99p5HwDPwsdzAKq9bt266eTJkyopKVFsbKzLvssvv1z+/v764osvrLGSkhJt2rRJLVu2tH0Mf39/nT59usp6BuB5uNIEoNrz9fW1Pmrz9fV12VerVi3dd999Gj16tOrVq6dGjRopNTVVx48fV0JCgu1jNGnSRNnZ2crKytJll12mOnXqKCAgoErPA4B7EZoA/CkEBwefc9/kyZNVWlqq/v3768iRI2rbtq0++ugj1a1b1/b8PXv21LJly9SlSxcVFBRo/vz5VfrwTADu5zDGGHc3AQAA4Om4pwkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANvx/TQjX0+OsI4YAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total Revenue: 35490.0\n", + "Product with max revenue: P002\n", + "Date with max revenue: 2023-05-25\n" + ] } ], "source": [ @@ -342,38 +396,44 @@ "import csv\n", "from collections import defaultdict\n", "import matplotlib.pyplot as plt\n", - " \n", - "revenue_by_month = defaultdict(int)\n", "\n", - "with open('sales.csv', 'r') as f:\n", - " reader = csv.DictReader(f)\n", - " total_revenue = 0\n", - " max_revenue_product = None\n", - " max_revenue = 0\n", - " max_revenue_date = None\n", + "revenue = 0\n", + "monthly_revenue = defaultdict(int)\n", + "product_revenue = defaultdict(int)\n", + "max_revenue = 0\n", + "max_revenue_date = ''\n", + "max_revenue_product = ''\n", "\n", + "with open('sales.csv') as f:\n", + " reader = csv.reader(f)\n", + " next(reader)\n", " for row in reader:\n", - " revenue = float(row['price']) * int(row['units_sold'])\n", - " total_revenue += revenue\n", + " date = row[0]\n", + " product = row[1]\n", + " price = float(row[2])\n", + " units = int(row[3])\n", "\n", - " date = row['date']\n", - " month = date.split('-')[1]\n", - " revenue_by_month[month] += revenue\n", + " revenue += price * units\n", + " product_revenue[product] += price * units\n", + " monthly_revenue[date[:7]] += price * units\n", "\n", " if revenue > max_revenue:\n", " max_revenue = revenue\n", - " max_revenue_product = row['product_id']\n", " max_revenue_date = date\n", + " max_revenue_product = product\n", "\n", - "print('Total revenue:', total_revenue)\n", - "print('Product with max revenue:', max_revenue_product)\n", - "print('Date with max revenue:', max_revenue_date)\n", - "# Plot 'Revenue by Month'\n", - "plt.bar(revenue_by_month.keys(), revenue_by_month.values())\n", + "months = list(monthly_revenue.keys())\n", + "values = list(monthly_revenue.values())\n", + "\n", + "plt.bar(months, values)\n", "plt.xlabel('Month')\n", "plt.ylabel('Revenue')\n", - "plt.title('Revenue by Month')\n", - "plt.show()" + "plt.title('Monthly Revenue')\n", + "plt.show()\n", + "\n", + "print('Total Revenue:', revenue)\n", + "print('Product with max revenue:', max_revenue_product)\n", + "print('Date with max revenue:', max_revenue_date)" ] }, { diff --git a/06_CodeGeneration/sales.csv b/06_CodeGeneration/sales.csv deleted file mode 100644 index 6f89b0af..00000000 --- a/06_CodeGeneration/sales.csv +++ /dev/null @@ -1,26 +0,0 @@ -date,product_id,price,units_sold -2023-01-01,P001,50,20 -2023-01-02,P002,60,15 -2023-01-03,P001,50,18 -2023-01-04,P003,70,30 -2023-01-05,P001,50,25 -2023-01-06,P002,60,22 -2023-01-07,P003,70,24 -2023-01-08,P001,50,28 -2023-01-09,P002,60,17 -2023-01-10,P003,70,29 -2023-02-11,P001,50,23 -2023-02-12,P002,60,19 -2023-02-13,P001,50,21 -2023-02-14,P003,70,31 -2023-03-15,P001,50,26 -2023-03-16,P002,60,20 -2023-03-17,P003,70,33 -2023-04-18,P001,50,27 -2023-04-19,P002,60,18 -2023-04-20,P003,70,32 -2023-04-21,P001,50,22 -2023-04-22,P002,60,16 -2023-04-23,P003,70,34 -2023-05-24,P001,50,24 -2023-05-25,P002,60,21 \ No newline at end of file