From 09f25822f80408e9189719dfba7dee38b8e47c7a Mon Sep 17 00:00:00 2001 From: dahouathi2 Date: Mon, 6 May 2024 14:43:40 +0000 Subject: [PATCH 1/2] [Changed scripts to work on our GPU] [Added class to data loader to process our sold_units time series : class only for one column] [Plot.ipynb]: Plot the true labels and predictions [2 notebooks one for creating the data the other to explore it] --- OneProductData_GET.ipynb | 4416 +++++++++++++++++++++++++++++++ Plot.ipynb | 510 ++++ data_provider/data_factory.py | 4 +- data_provider/data_loader.py | 74 + dataset/data.csv | 222 ++ explore_model.ipynb | 429 +++ scripts/TimeLLM_ean.sh | 40 + scripts/TimeLLM_ean_gpu.sh | 42 + scripts/TimeLLM_ean_gpu_plot.sh | 42 + 9 files changed, 5778 insertions(+), 1 deletion(-) create mode 100644 OneProductData_GET.ipynb create mode 100644 Plot.ipynb create mode 100644 dataset/data.csv create mode 100644 explore_model.ipynb create mode 100755 scripts/TimeLLM_ean.sh create mode 100755 scripts/TimeLLM_ean_gpu.sh create mode 100755 scripts/TimeLLM_ean_gpu_plot.sh diff --git a/OneProductData_GET.ipynb b/OneProductData_GET.ipynb new file mode 100644 index 0000000..b9b698d --- /dev/null +++ b/OneProductData_GET.ipynb @@ -0,0 +1,4416 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "id": "dZMs3_CuRY8m" + }, + "outputs": [], + "source": [ + "# @title Setup\n", + "from google.colab import auth\n", + "from google.cloud import bigquery\n", + "from google.colab import data_table\n", + "\n", + "project = 'itg-bpma-gbl-ww-dv' # Project ID inserted based on the query results selected to explore\n", + "location = 'EU' # Location inserted based on the query results selected to explore\n", + "client = bigquery.Client(project=project, location=location)\n", + "data_table.enable_dataframe_formatter()\n", + "auth.authenticate_user()" + ] + }, + { + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import numpy as np" + ], + "metadata": { + "id": "6T1MvOQlyue3" + }, + "execution_count": 126, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#Define Client Chanel_type and Product\n", + "client_name = 'BOOTS'\n", + "Channel_type = 'Online'\n", + "Product_ean = '800897813727'" + ], + "metadata": { + "id": "a0HFSD6Fubem" + }, + "execution_count": 36, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Define parameters for the filter\n", + "params = {\n", + " 'client_name': client_name,\n", + " 'ean_code': Product_ean\n", + "}\n", + "\n", + "query = \"\"\"\n", + "SELECT *\n", + "FROM bpma_ds_c2_exposed_eu_dv.sellout_and_promo_event_pivoted_V1\n", + "Where\n", + "client = @client_name AND\n", + "ean = @ean_code AND global_channel_type='Online'\n", + "\"\"\"\n", + "\n", + "# Execute the query and read the result into a Pandas DataFrame\n", + "job_config = bigquery.QueryJobConfig(\n", + " query_parameters=[\n", + " bigquery.ScalarQueryParameter('client_name', 'STRING', params['client_name']),\n", + " bigquery.ScalarQueryParameter('ean_code', 'STRING', params['ean_code'])\n", + " ]\n", + ")\n", + "\n", + "result_df = client.query(query, job_config=job_config).to_dataframe()" + ], + "metadata": { + "id": "2R1FpBRtRpNm" + }, + "execution_count": 37, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "result_df.head()" + ], + "metadata": { + "id": "yqT25TGbSjwX", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 429 + }, + "outputId": "c9aba034-0122-4a0b-ff7b-4862f5957022" + }, + "execution_count": 38, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Warning: Total number of columns (132) exceeds max_columns (20). Falling back to pandas display.\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " ean country_id global_channel_type client sold_units \\\n", + "0 800897813727 GB Online BOOTS 112.000000000 \n", + "1 800897813727 GB Online BOOTS 99.000000000 \n", + "2 800897813727 GB Online BOOTS 82.000000000 \n", + "3 800897813727 GB Online BOOTS 146.000000000 \n", + "4 800897813727 GB Online BOOTS 135.000000000 \n", + "\n", + " sold_value_loc start_date end_date mid_date is_promo ... \\\n", + "0 887.30 2021-11-14 2021-11-20 2021-11-17 False ... \n", + "1 789.45 2021-05-30 2021-06-05 2021-06-02 False ... \n", + "2 528.68 2020-01-19 2020-01-25 2020-01-22 False ... \n", + "3 979.24 2024-03-10 2024-03-16 2024-03-13 True ... \n", + "4 997.10 2022-02-06 2022-02-12 2022-02-09 False ... \n", + "\n", + " DEFENSIVE ON Before SHOPPER INVESTMENT ON Before RETURNS During \\\n", + "0 NaN NaN NaN \n", + "1 NaN NaN NaN \n", + "2 NaN NaN NaN \n", + "3 NaN NaN NaN \n", + "4 NaN NaN NaN \n", + "\n", + " STD COST OF SALES AND VARIANCES Before CONSO NET SALES Before \\\n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN \n", + "\n", + " PHYSICAL DISTRIBUTION During NG NET SALES Incremental \\\n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN \n", + "\n", + " ACTIVE SUPPORT OFF Incremental INVOICED SALES Before hierarchy_is_ean \n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN \n", + "\n", + "[5 rows x 132 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
eancountry_idglobal_channel_typeclientsold_unitssold_value_locstart_dateend_datemid_dateis_promo...DEFENSIVE ON BeforeSHOPPER INVESTMENT ON BeforeRETURNS DuringSTD COST OF SALES AND VARIANCES BeforeCONSO NET SALES BeforePHYSICAL DISTRIBUTION DuringNG NET SALES IncrementalACTIVE SUPPORT OFF IncrementalINVOICED SALES Beforehierarchy_is_ean
0800897813727GBOnlineBOOTS112.000000000887.302021-11-142021-11-202021-11-17False...NaNNaNNaNNaNNaNNaNNaNNaNNaN<NA>
1800897813727GBOnlineBOOTS99.000000000789.452021-05-302021-06-052021-06-02False...NaNNaNNaNNaNNaNNaNNaNNaNNaN<NA>
2800897813727GBOnlineBOOTS82.000000000528.682020-01-192020-01-252020-01-22False...NaNNaNNaNNaNNaNNaNNaNNaNNaN<NA>
3800897813727GBOnlineBOOTS146.000000000979.242024-03-102024-03-162024-03-13True...NaNNaNNaNNaNNaNNaNNaNNaNNaN<NA>
4800897813727GBOnlineBOOTS135.000000000997.102022-02-062022-02-122022-02-09False...NaNNaNNaNNaNNaNNaNNaNNaNNaN<NA>
\n", + "

5 rows × 132 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "result_df" + } + }, + "metadata": {}, + "execution_count": 38 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result_df.drop_duplicates(inplace=True)" + ], + "metadata": { + "id": "G6TcHHMA5IQ6" + }, + "execution_count": 39, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Supprimer les lignes où 'id_event' est null et 'is_promo' est True\n", + "result_df = result_df.drop(result_df[(result_df['event_id'].isnull()) & (result_df['is_promo'])].index)" + ], + "metadata": { + "id": "CV20yOoV5RDy" + }, + "execution_count": 40, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "result_df['start_date'].unique().shape[0]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "YAq2dbM4Ng5v", + "outputId": "352ba739-188a-4f17-b5c8-b7d442753362" + }, + "execution_count": 41, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "222" + ] + }, + "metadata": {}, + "execution_count": 41 + } + ] + }, + { + "cell_type": "code", + "source": [ + "events_columns_to_delete = [ 'OPERATIONAL_SUB_AXE_LABEL', 'event_id', 'event_start_date', 'event_end_date','country_id','promo_cluster_event',\n", + " 'promo_cluster_event_ean', 'event_status', 'event_description', 'ean_event_id', 'hierarchy_is_ean']\n", + "\n", + "\n", + "columns_relevant_to_product = ['hierarchy_code', 'client', 'ean'\n", + " ]" + ], + "metadata": { + "id": "fpmgni75Sqqx" + }, + "execution_count": 42, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "df = result_df.drop(events_columns_to_delete+columns_relevant_to_product, axis=1)" + ], + "metadata": { + "id": "mbEYVocnu1NO" + }, + "execution_count": 43, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#let's eliminate tactics and subtatics for further analysis\n", + "#data = df.drop(['sub_tactic', 'tactic', 'depth_of_discount_range', 'price_range'], axis=1)" + ], + "metadata": { + "id": "3Bt-PWM-UBVa" + }, + "execution_count": 44, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Function to convert percentage range strings to numeric average\n", + "def convert_to_average(range_str):\n", + " if range_str != None :\n", + "\n", + " low, high = map(lambda x: float(x.replace('%', '')), range_str.split('-'))\n", + " return (low + high) / 2\n", + " return None\n", + "\n", + "# Applying the conversion to the 'depth_of_discount_range' column\n", + "df['avg_discount'] = df['depth_of_discount_range'].apply(convert_to_average)" + ], + "metadata": { + "id": "XcCjMFSu-ALr" + }, + "execution_count": 45, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "pnls = ['DEFENSIVE OFF Incremental', 'DEFENSIVE ON EXCL ROLLBACK During', 'NG NET SALES During', 'PREPACK DISPLAYS During', 'ACTIVE SUPPORT OFF CUST AGREM Incremental',\n", + " 'SELL OUT VALUE Before', 'INTERNATIONAL CUSTOMER INVESTMENT Before', 'GROSS SALES Incremental', 'SERVICES Before', 'DEFENSIVE ON Incremental',\n", + " 'SERVICES During', 'ACTIVE SUPPORT OFF CUST AGREM Before', 'ACTIVE SUPPORT OFF EXCL CUST AGREM Before', 'FINANCE OFF Before', 'SHOPPER INVESTMENT OFF Before',\n", + " 'ACTIVE SUPPORT OFF EXCL CUST AGREM Incremental', 'ACTIVE SUPPORT OFF CUST AGREM During', 'TOTAL COST During', 'FINANCE OFF During',\n", + " 'GROSS SALES Before', 'ACTIVE SUPPORT OFF During', 'TOTAL COST Before', 'INVOICED SALES During', 'INVOICED SALES Incremental', 'CLEARANCES AND RETURNS Before',\n", + " 'RETURNS Incremental', 'SHOPPER INVESTMENT OFF During', 'CLEARANCES AND RETURNS Incremental', 'PNL CHECK Before', 'SERVICES Incremental', 'ROLLBACK Incremental',\n", + " 'ACTIVE SUPPORT ON Incremental', 'ROLLBACK During', 'STD COST OF SALES AND VARIANCES During', 'EFFICIENCY ON Incremental', 'COST OF SALES Before',\n", + " 'GROSS SALES During', 'THEORETICAL SELLOUT VALUE Before', 'INTERNATIONAL CUSTOMER INVESTMENT During', 'ACTIVE SUPPORT OFF Before', 'GROWTH INCENTIVE Incremental',\n", + " 'CLEARANCES AND RETURNS During', 'EFFICIENCY OFF During', 'DEFENSIVE OFF During', 'SELL OUT VALUE Incremental', 'EFFICIENCY OFF Incremental',\n", + " 'PNL CHECK Incremental', 'EFFICIENCY ON Before', 'ROYAL TA MS Before', 'PHYSICAL DISTRIBUTION Before', 'OBSOLETE SLOW MOVING RETURNS Before',\n", + " 'EFFICIENCY ON During', 'SHOPPER INVESTMENT ON During', 'DEFENSIVE ON During', 'UNITS Incremental', 'FINANCE OFF Incremental', 'INTERNATIONAL CUSTOMER INVESTMENT Incremental',\n", + " 'SPECIAL OPS COST During', 'SHOPPER INVESTMENT ON Incremental', 'CLEARANCES During', 'GROSS MARGIN Incremental', 'CLEARANCES Incremental',\n", + " 'CONSO NET SALES Incremental', 'NG NET SALES Before', 'RETURNS Before', 'UNITS During', 'OBSOLETE SLOW MOVING RETURNS During', 'TOTAL COST Incremental',\n", + " 'CONSO NET SALES During', 'GROSS MARGIN During', 'DEFENSIVE ON EXCL ROLLBACK Before', 'COST OF SALES During', 'ACTIVE SUPPORT OFF EXCL CUST AGREM During',\n", + " 'ACTIVE SUPPORT ON During', 'ROLLBACK Before', 'CLEARANCES Before', 'EFFICIENCY OFF Before', 'UNITS Before', 'SELL OUT VALUE During', 'PNL CHECK During',\n", + " 'COST OF SALES Incremental', 'GROWTH INCENTIVE During', 'PREPACK DISPLAYS Before', 'ROYAL TA MS During', 'SPECIAL OPS COST Before',\n", + " 'DEFENSIVE OFF Before', 'ACTIVE SUPPORT ON Before', 'GROWTH INCENTIVE Before', 'DEFENSIVE ON EXCL ROLLBACK Incremental', 'GROSS MARGIN Before',\n", + " 'SHOPPER INVESTMENT OFF Incremental', 'DEFENSIVE ON Before', 'SHOPPER INVESTMENT ON Before', 'RETURNS During', 'STD COST OF SALES AND VARIANCES Before',\n", + " 'CONSO NET SALES Before', 'PHYSICAL DISTRIBUTION During', 'NG NET SALES Incremental', 'ACTIVE SUPPORT OFF Incremental', 'INVOICED SALES Before']" + ], + "metadata": { + "id": "M2vRo8-B_fyI" + }, + "execution_count": 46, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data=df.copy()" + ], + "metadata": { + "id": "F4XOVSxEOfdp" + }, + "execution_count": 47, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data = df.drop(pnls, axis=1)" + ], + "metadata": { + "id": "Byz_vob8_h3C" + }, + "execution_count": 48, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data.drop('depth_of_discount_range',axis=1, inplace=True)" + ], + "metadata": { + "id": "T08JxrKi_rce" + }, + "execution_count": 49, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data.drop_duplicates(inplace=True)" + ], + "metadata": { + "id": "Xpmfxuh0AKlD" + }, + "execution_count": 50, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data.tail(5)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473 + }, + "id": "EJTujROs0EL7", + "outputId": "c680bdcc-dc42-49b8-f635-4e38ae3bc13c" + }, + "execution_count": 51, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " global_channel_type sold_units sold_value_loc start_date \\\n", + "441 Online 307.000000000 1940.00 2023-05-28 \n", + "443 Online 131.000000000 1036.46 2023-04-30 \n", + "444 Online 152.000000000 915.77 2023-09-10 \n", + "454 Online 250.000000000 1282.60 2023-10-22 \n", + "456 Online 145.000000000 1010.09 2024-02-04 \n", + "\n", + " end_date mid_date is_promo week year Final_ISP sub_axis \\\n", + "441 2023-06-03 2023-05-31 True 22 2023 8.0 Face Makeup \n", + "443 2023-05-06 2023-05-03 True 18 2023 8.0 Face Makeup \n", + "444 2023-09-16 2023-09-13 True 37 2023 8.0 Face Makeup \n", + "454 2023-10-28 2023-10-25 True 43 2023 8.0 Face Makeup \n", + "456 2024-02-10 2024-02-07 True 6 2024 8.0 Face Makeup \n", + "\n", + " Filled_Final_ISP estimated_price seasonality_index price_range \\\n", + "441 8.0 6.319218 1.016535 6.3 \n", + "443 8.0 7.911908 1.037166 7.7 \n", + "444 8.0 6.024803 0.967239 6.0 \n", + "454 8.0 5.130400 0.988779 5.5 \n", + "456 8.0 6.966138 0.994004 6.5 \n", + "\n", + " tactic sub_tactic \\\n", + "441 Promotion OCA , Shopper Discount Online , Save , Site Fee \n", + "443 Promotion OCA , Shopper Discount Online , Save , Site Fee \n", + "444 MultiBuy , Promotion OCA 3 for 2 , Online , Site Fee \n", + "454 Promotion OCA , Shopper Discount Online , Save , Site Fee \n", + "456 Promotion OCA , Shopper Discount Save , Site Fee \n", + "\n", + " avg_discount \n", + "441 22.5 \n", + "443 2.5 \n", + "444 27.5 \n", + "454 32.5 \n", + "456 17.5 " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
global_channel_typesold_unitssold_value_locstart_dateend_datemid_dateis_promoweekyearFinal_ISPsub_axisFilled_Final_ISPestimated_priceseasonality_indexprice_rangetacticsub_tacticavg_discount
441Online307.0000000001940.002023-05-282023-06-032023-05-31True2220238.0Face Makeup8.06.3192181.0165356.3Promotion OCA , Shopper DiscountOnline , Save , Site Fee22.5
443Online131.0000000001036.462023-04-302023-05-062023-05-03True1820238.0Face Makeup8.07.9119081.0371667.7Promotion OCA , Shopper DiscountOnline , Save , Site Fee2.5
444Online152.000000000915.772023-09-102023-09-162023-09-13True3720238.0Face Makeup8.06.0248030.9672396.0MultiBuy , Promotion OCA3 for 2 , Online , Site Fee27.5
454Online250.0000000001282.602023-10-222023-10-282023-10-25True4320238.0Face Makeup8.05.1304000.9887795.5Promotion OCA , Shopper DiscountOnline , Save , Site Fee32.5
456Online145.0000000001010.092024-02-042024-02-102024-02-07True620248.0Face Makeup8.06.9661380.9940046.5Promotion OCA , Shopper DiscountSave , Site Fee17.5
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "summary": "{\n \"name\": \"data\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"global_channel_type\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"Online\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sold_units\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"131.000000000\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sold_value_loc\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 415.68663417290674,\n \"min\": 915.77,\n \"max\": 1940.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 1036.46\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"start_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"2023-04-30\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"end_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"2023-05-06\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"mid_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"2023-05-03\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"is_promo\",\n \"properties\": {\n \"dtype\": \"boolean\",\n \"num_unique_values\": 1,\n \"samples\": [\n true\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"week\",\n \"properties\": {\n \"dtype\": \"Int64\",\n \"num_unique_values\": 5,\n \"samples\": [\n 18\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"year\",\n \"properties\": {\n \"dtype\": \"Int64\",\n \"num_unique_values\": 2,\n \"samples\": [\n 2024\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Final_ISP\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0,\n \"min\": 8.0,\n \"max\": 8.0,\n \"num_unique_values\": 1,\n \"samples\": [\n 8.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sub_axis\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"Face Makeup\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Filled_Final_ISP\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0,\n \"min\": 8.0,\n \"max\": 8.0,\n \"num_unique_values\": 1,\n \"samples\": [\n 8.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estimated_price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.0417191860170165,\n \"min\": 5.1304,\n \"max\": 7.911908396946565,\n \"num_unique_values\": 5,\n \"samples\": [\n 7.911908396946565\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"seasonality_index\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.026865803155916034,\n \"min\": 0.967239167,\n \"max\": 1.037166105,\n \"num_unique_values\": 5,\n \"samples\": [\n 1.037166105\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_range\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.8185352771872451,\n \"min\": 5.5,\n \"max\": 7.7,\n \"num_unique_values\": 5,\n \"samples\": [\n 7.7\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tactic\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"MultiBuy , Promotion OCA\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sub_tactic\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"Online , Save , Site Fee\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_discount\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 11.510864433221338,\n \"min\": 2.5,\n \"max\": 32.5,\n \"num_unique_values\": 5,\n \"samples\": [\n 2.5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + }, + "application/vnd.google.colaboratory.module+javascript": "\n import \"https://ssl.gstatic.com/colaboratory/data_table/881c4a0d49046431/data_table.js\";\n\n const table = window.createDataTable({\n data: [[{\n 'v': 441,\n 'f': \"441\",\n },\n\"Online\",\n{\n 'v': \"307.000000000\",\n 'f': \"\\\"307.000000000\\\"\",\n },\n{\n 'v': 1940.0,\n 'f': \"1940.0\",\n },\n\"2023-05-28\",\n\"2023-06-03\",\n\"2023-05-31\",\ntrue,\n{\n 'v': 22,\n 'f': \"22\",\n },\n{\n 'v': 2023,\n 'f': \"2023\",\n },\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 6.319218241042345,\n 'f': \"6.319218241042345\",\n },\n{\n 'v': 1.016535221,\n 'f': \"1.016535221\",\n },\n{\n 'v': 6.3,\n 'f': \"6.3\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee\",\n{\n 'v': 22.5,\n 'f': \"22.5\",\n }],\n [{\n 'v': 443,\n 'f': \"443\",\n },\n\"Online\",\n{\n 'v': \"131.000000000\",\n 'f': \"\\\"131.000000000\\\"\",\n },\n{\n 'v': 1036.46,\n 'f': \"1036.46\",\n },\n\"2023-04-30\",\n\"2023-05-06\",\n\"2023-05-03\",\ntrue,\n{\n 'v': 18,\n 'f': \"18\",\n },\n{\n 'v': 2023,\n 'f': \"2023\",\n },\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 7.911908396946565,\n 'f': \"7.911908396946565\",\n },\n{\n 'v': 1.037166105,\n 'f': \"1.037166105\",\n },\n{\n 'v': 7.7,\n 'f': \"7.7\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee\",\n{\n 'v': 2.5,\n 'f': \"2.5\",\n }],\n [{\n 'v': 444,\n 'f': \"444\",\n },\n\"Online\",\n{\n 'v': \"152.000000000\",\n 'f': \"\\\"152.000000000\\\"\",\n },\n{\n 'v': 915.77,\n 'f': \"915.77\",\n },\n\"2023-09-10\",\n\"2023-09-16\",\n\"2023-09-13\",\ntrue,\n{\n 'v': 37,\n 'f': \"37\",\n },\n{\n 'v': 2023,\n 'f': \"2023\",\n },\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 6.024802631578948,\n 'f': \"6.024802631578948\",\n },\n{\n 'v': 0.967239167,\n 'f': \"0.967239167\",\n },\n{\n 'v': 6.0,\n 'f': \"6.0\",\n },\n\"MultiBuy , Promotion OCA\",\n\"3 for 2 , Online , Site Fee\",\n{\n 'v': 27.5,\n 'f': \"27.5\",\n }],\n [{\n 'v': 454,\n 'f': \"454\",\n },\n\"Online\",\n{\n 'v': \"250.000000000\",\n 'f': \"\\\"250.000000000\\\"\",\n },\n{\n 'v': 1282.6,\n 'f': \"1282.6\",\n },\n\"2023-10-22\",\n\"2023-10-28\",\n\"2023-10-25\",\ntrue,\n{\n 'v': 43,\n 'f': \"43\",\n },\n{\n 'v': 2023,\n 'f': \"2023\",\n },\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 5.1304,\n 'f': \"5.1304\",\n },\n{\n 'v': 0.988779444,\n 'f': \"0.988779444\",\n },\n{\n 'v': 5.5,\n 'f': \"5.5\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee\",\n{\n 'v': 32.5,\n 'f': \"32.5\",\n }],\n [{\n 'v': 456,\n 'f': \"456\",\n },\n\"Online\",\n{\n 'v': \"145.000000000\",\n 'f': \"\\\"145.000000000\\\"\",\n },\n{\n 'v': 1010.09,\n 'f': \"1010.09\",\n },\n\"2024-02-04\",\n\"2024-02-10\",\n\"2024-02-07\",\ntrue,\n{\n 'v': 6,\n 'f': \"6\",\n },\n{\n 'v': 2024,\n 'f': \"2024\",\n },\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 6.966137931034483,\n 'f': \"6.966137931034483\",\n },\n{\n 'v': 0.994003919,\n 'f': \"0.994003919\",\n },\n{\n 'v': 6.5,\n 'f': \"6.5\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Save , Site Fee\",\n{\n 'v': 17.5,\n 'f': \"17.5\",\n }]],\n columns: [[\"number\", \"index\"], [\"string\", \"global_channel_type\"], [\"number\", \"sold_units\"], [\"number\", \"sold_value_loc\"], [\"string\", \"start_date\"], [\"string\", \"end_date\"], [\"string\", \"mid_date\"], [\"string\", \"is_promo\"], [\"number\", \"week\"], [\"number\", \"year\"], [\"number\", \"Final_ISP\"], [\"string\", \"sub_axis\"], [\"number\", \"Filled_Final_ISP\"], [\"number\", \"estimated_price\"], [\"number\", \"seasonality_index\"], [\"number\", \"price_range\"], [\"string\", \"tactic\"], [\"string\", \"sub_tactic\"], [\"number\", \"avg_discount\"]],\n columnOptions: [{\"width\": \"1px\", \"className\": \"index_column\"}],\n rowsPerPage: 25,\n helpUrl: \"https://colab.research.google.com/notebooks/data_table.ipynb\",\n suppressOutputScrolling: true,\n minimumWidth: undefined,\n });\n\n function appendQuickchartButton(parentElement) {\n let quickchartButtonContainerElement = document.createElement('div');\n quickchartButtonContainerElement.innerHTML = `\n
\n \n \n\n\n \n
`;\n parentElement.appendChild(quickchartButtonContainerElement);\n }\n\n appendQuickchartButton(table);\n " + }, + "metadata": {}, + "execution_count": 51 + } + ] + }, + { + "cell_type": "code", + "source": [ + "#data.columns" + ], + "metadata": { + "id": "9P0A0Jllu-Qi" + }, + "execution_count": 52, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data.groupby('start_date').size().reset_index(name='counts')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 660 + }, + "id": "ZPucU8I1wwmT", + "outputId": "ac2cd5bc-81ce-4f5f-a334-88e8606a3cb9" + }, + "execution_count": 53, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " start_date counts\n", + "0 2019-12-29 1\n", + "1 2020-01-05 1\n", + "2 2020-01-12 1\n", + "3 2020-01-19 1\n", + "4 2020-01-26 1\n", + ".. ... ...\n", + "216 2024-02-18 1\n", + "217 2024-02-25 1\n", + "218 2024-03-03 1\n", + "219 2024-03-10 2\n", + "220 2024-03-17 1\n", + "\n", + "[221 rows x 2 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
start_datecounts
02019-12-291
12020-01-051
22020-01-121
32020-01-191
42020-01-261
.........
2162024-02-181
2172024-02-251
2182024-03-031
2192024-03-102
2202024-03-171
\n", + "

221 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "summary": "{\n \"name\": \"data\",\n \"rows\": 221,\n \"fields\": [\n {\n \"column\": \"start_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 221,\n \"samples\": [\n \"2022-07-10\",\n \"2022-10-30\",\n \"2021-10-10\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"counts\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 2,\n \"num_unique_values\": 2,\n \"samples\": [\n 2,\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + }, + "application/vnd.google.colaboratory.module+javascript": "\n import \"https://ssl.gstatic.com/colaboratory/data_table/881c4a0d49046431/data_table.js\";\n\n const table = window.createDataTable({\n data: [[{\n 'v': 0,\n 'f': \"0\",\n },\n\"2019-12-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 1,\n 'f': \"1\",\n },\n\"2020-01-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 2,\n 'f': \"2\",\n },\n\"2020-01-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 3,\n 'f': \"3\",\n },\n\"2020-01-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 4,\n 'f': \"4\",\n },\n\"2020-01-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 5,\n 'f': \"5\",\n },\n\"2020-02-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 6,\n 'f': \"6\",\n },\n\"2020-02-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 7,\n 'f': \"7\",\n },\n\"2020-02-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 8,\n 'f': \"8\",\n },\n\"2020-02-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 9,\n 'f': \"9\",\n },\n\"2020-03-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 10,\n 'f': \"10\",\n },\n\"2020-03-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 11,\n 'f': \"11\",\n },\n\"2020-03-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 12,\n 'f': \"12\",\n },\n\"2020-03-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 13,\n 'f': \"13\",\n },\n\"2020-03-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 14,\n 'f': \"14\",\n },\n\"2020-04-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 15,\n 'f': \"15\",\n },\n\"2020-04-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 16,\n 'f': \"16\",\n },\n\"2020-04-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 17,\n 'f': \"17\",\n },\n\"2020-04-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 18,\n 'f': \"18\",\n },\n\"2020-05-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 19,\n 'f': \"19\",\n },\n\"2020-05-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 20,\n 'f': \"20\",\n },\n\"2020-05-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 21,\n 'f': \"21\",\n },\n\"2020-05-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 22,\n 'f': \"22\",\n },\n\"2020-05-31\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 23,\n 'f': \"23\",\n },\n\"2020-06-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 24,\n 'f': \"24\",\n },\n\"2020-06-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 25,\n 'f': \"25\",\n },\n\"2020-06-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 26,\n 'f': \"26\",\n },\n\"2020-06-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 27,\n 'f': \"27\",\n },\n\"2020-07-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 28,\n 'f': \"28\",\n },\n\"2020-07-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 29,\n 'f': \"29\",\n },\n\"2020-07-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 30,\n 'f': \"30\",\n },\n\"2020-07-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 31,\n 'f': \"31\",\n },\n\"2020-08-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 32,\n 'f': \"32\",\n },\n\"2020-08-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 33,\n 'f': \"33\",\n },\n\"2020-08-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 34,\n 'f': \"34\",\n },\n\"2020-08-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 35,\n 'f': \"35\",\n },\n\"2020-08-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 36,\n 'f': \"36\",\n },\n\"2020-09-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 37,\n 'f': \"37\",\n },\n\"2020-09-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 38,\n 'f': \"38\",\n },\n\"2020-09-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 39,\n 'f': \"39\",\n },\n\"2020-09-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 40,\n 'f': \"40\",\n },\n\"2020-10-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 41,\n 'f': \"41\",\n },\n\"2020-10-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 42,\n 'f': \"42\",\n },\n\"2020-10-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 43,\n 'f': \"43\",\n },\n\"2020-10-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 44,\n 'f': \"44\",\n },\n\"2020-11-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 45,\n 'f': \"45\",\n },\n\"2020-11-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 46,\n 'f': \"46\",\n },\n\"2020-11-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 47,\n 'f': \"47\",\n },\n\"2020-11-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 48,\n 'f': \"48\",\n },\n\"2020-11-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 49,\n 'f': \"49\",\n },\n\"2020-12-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 50,\n 'f': \"50\",\n },\n\"2020-12-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 51,\n 'f': \"51\",\n },\n\"2020-12-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 52,\n 'f': \"52\",\n },\n\"2020-12-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 53,\n 'f': \"53\",\n },\n\"2021-01-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 54,\n 'f': \"54\",\n },\n\"2021-01-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 55,\n 'f': \"55\",\n },\n\"2021-01-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 56,\n 'f': \"56\",\n },\n\"2021-01-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 57,\n 'f': \"57\",\n },\n\"2021-01-31\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 58,\n 'f': \"58\",\n },\n\"2021-02-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 59,\n 'f': \"59\",\n },\n\"2021-02-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 60,\n 'f': \"60\",\n },\n\"2021-02-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 61,\n 'f': \"61\",\n },\n\"2021-02-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 62,\n 'f': \"62\",\n },\n\"2021-03-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 63,\n 'f': \"63\",\n },\n\"2021-03-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 64,\n 'f': \"64\",\n },\n\"2021-03-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 65,\n 'f': \"65\",\n },\n\"2021-03-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 66,\n 'f': \"66\",\n },\n\"2021-04-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 67,\n 'f': \"67\",\n },\n\"2021-04-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 68,\n 'f': \"68\",\n },\n\"2021-04-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 69,\n 'f': \"69\",\n },\n\"2021-04-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 70,\n 'f': \"70\",\n },\n\"2021-05-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 71,\n 'f': \"71\",\n },\n\"2021-05-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 72,\n 'f': \"72\",\n },\n\"2021-05-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 73,\n 'f': \"73\",\n },\n\"2021-05-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 74,\n 'f': \"74\",\n },\n\"2021-05-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 75,\n 'f': \"75\",\n },\n\"2021-06-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 76,\n 'f': \"76\",\n },\n\"2021-06-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 77,\n 'f': \"77\",\n },\n\"2021-06-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 78,\n 'f': \"78\",\n },\n\"2021-06-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 79,\n 'f': \"79\",\n },\n\"2021-07-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 80,\n 'f': \"80\",\n },\n\"2021-07-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 81,\n 'f': \"81\",\n },\n\"2021-07-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 82,\n 'f': \"82\",\n },\n\"2021-07-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 83,\n 'f': \"83\",\n },\n\"2021-08-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 84,\n 'f': \"84\",\n },\n\"2021-08-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 85,\n 'f': \"85\",\n },\n\"2021-08-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 86,\n 'f': \"86\",\n },\n\"2021-08-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 87,\n 'f': \"87\",\n },\n\"2021-08-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 88,\n 'f': \"88\",\n },\n\"2021-09-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 89,\n 'f': \"89\",\n },\n\"2021-09-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 90,\n 'f': \"90\",\n },\n\"2021-09-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 91,\n 'f': \"91\",\n },\n\"2021-09-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 92,\n 'f': \"92\",\n },\n\"2021-10-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 93,\n 'f': \"93\",\n },\n\"2021-10-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 94,\n 'f': \"94\",\n },\n\"2021-10-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 95,\n 'f': \"95\",\n },\n\"2021-10-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 96,\n 'f': \"96\",\n },\n\"2021-10-31\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 97,\n 'f': \"97\",\n },\n\"2021-11-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 98,\n 'f': \"98\",\n },\n\"2021-11-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 99,\n 'f': \"99\",\n },\n\"2021-11-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 100,\n 'f': \"100\",\n },\n\"2021-11-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 101,\n 'f': \"101\",\n },\n\"2021-12-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 102,\n 'f': \"102\",\n },\n\"2021-12-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 103,\n 'f': \"103\",\n },\n\"2021-12-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 104,\n 'f': \"104\",\n },\n\"2021-12-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 105,\n 'f': \"105\",\n },\n\"2022-01-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 106,\n 'f': \"106\",\n },\n\"2022-01-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 107,\n 'f': \"107\",\n },\n\"2022-01-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 108,\n 'f': \"108\",\n },\n\"2022-01-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 109,\n 'f': \"109\",\n },\n\"2022-01-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 110,\n 'f': \"110\",\n },\n\"2022-02-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 111,\n 'f': \"111\",\n },\n\"2022-02-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 112,\n 'f': \"112\",\n },\n\"2022-02-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 113,\n 'f': \"113\",\n },\n\"2022-02-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 114,\n 'f': \"114\",\n },\n\"2022-03-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 115,\n 'f': \"115\",\n },\n\"2022-03-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 116,\n 'f': \"116\",\n },\n\"2022-03-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 117,\n 'f': \"117\",\n },\n\"2022-03-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 118,\n 'f': \"118\",\n },\n\"2022-04-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 119,\n 'f': \"119\",\n },\n\"2022-04-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 120,\n 'f': \"120\",\n },\n\"2022-04-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 121,\n 'f': \"121\",\n },\n\"2022-04-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 122,\n 'f': \"122\",\n },\n\"2022-05-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 123,\n 'f': \"123\",\n },\n\"2022-05-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 124,\n 'f': \"124\",\n },\n\"2022-05-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 125,\n 'f': \"125\",\n },\n\"2022-05-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 126,\n 'f': \"126\",\n },\n\"2022-05-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 127,\n 'f': \"127\",\n },\n\"2022-06-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 128,\n 'f': \"128\",\n },\n\"2022-06-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 129,\n 'f': \"129\",\n },\n\"2022-06-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 130,\n 'f': \"130\",\n },\n\"2022-06-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 131,\n 'f': \"131\",\n },\n\"2022-07-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 132,\n 'f': \"132\",\n },\n\"2022-07-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 133,\n 'f': \"133\",\n },\n\"2022-07-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 134,\n 'f': \"134\",\n },\n\"2022-07-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 135,\n 'f': \"135\",\n },\n\"2022-07-31\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 136,\n 'f': \"136\",\n },\n\"2022-08-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 137,\n 'f': \"137\",\n },\n\"2022-08-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 138,\n 'f': \"138\",\n },\n\"2022-08-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 139,\n 'f': \"139\",\n },\n\"2022-08-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 140,\n 'f': \"140\",\n },\n\"2022-09-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 141,\n 'f': \"141\",\n },\n\"2022-09-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 142,\n 'f': \"142\",\n },\n\"2022-09-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 143,\n 'f': \"143\",\n },\n\"2022-09-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 144,\n 'f': \"144\",\n },\n\"2022-10-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 145,\n 'f': \"145\",\n },\n\"2022-10-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 146,\n 'f': \"146\",\n },\n\"2022-10-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 147,\n 'f': \"147\",\n },\n\"2022-10-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 148,\n 'f': \"148\",\n },\n\"2022-10-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 149,\n 'f': \"149\",\n },\n\"2022-11-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 150,\n 'f': \"150\",\n },\n\"2022-11-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 151,\n 'f': \"151\",\n },\n\"2022-11-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 152,\n 'f': \"152\",\n },\n\"2022-11-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 153,\n 'f': \"153\",\n },\n\"2022-12-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 154,\n 'f': \"154\",\n },\n\"2022-12-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 155,\n 'f': \"155\",\n },\n\"2022-12-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 156,\n 'f': \"156\",\n },\n\"2022-12-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 157,\n 'f': \"157\",\n },\n\"2023-01-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 158,\n 'f': \"158\",\n },\n\"2023-01-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 159,\n 'f': \"159\",\n },\n\"2023-01-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 160,\n 'f': \"160\",\n },\n\"2023-01-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 161,\n 'f': \"161\",\n },\n\"2023-01-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 162,\n 'f': \"162\",\n },\n\"2023-02-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 163,\n 'f': \"163\",\n },\n\"2023-02-12\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 164,\n 'f': \"164\",\n },\n\"2023-02-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 165,\n 'f': \"165\",\n },\n\"2023-02-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 166,\n 'f': \"166\",\n },\n\"2023-03-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 167,\n 'f': \"167\",\n },\n\"2023-03-12\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 168,\n 'f': \"168\",\n },\n\"2023-03-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 169,\n 'f': \"169\",\n },\n\"2023-03-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 170,\n 'f': \"170\",\n },\n\"2023-04-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 171,\n 'f': \"171\",\n },\n\"2023-04-09\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 172,\n 'f': \"172\",\n },\n\"2023-04-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 173,\n 'f': \"173\",\n },\n\"2023-04-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 174,\n 'f': \"174\",\n },\n\"2023-04-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 175,\n 'f': \"175\",\n },\n\"2023-05-07\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 176,\n 'f': \"176\",\n },\n\"2023-05-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 177,\n 'f': \"177\",\n },\n\"2023-05-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 178,\n 'f': \"178\",\n },\n\"2023-05-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 179,\n 'f': \"179\",\n },\n\"2023-06-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 180,\n 'f': \"180\",\n },\n\"2023-06-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 181,\n 'f': \"181\",\n },\n\"2023-06-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 182,\n 'f': \"182\",\n },\n\"2023-06-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 183,\n 'f': \"183\",\n },\n\"2023-07-02\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 184,\n 'f': \"184\",\n },\n\"2023-07-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 185,\n 'f': \"185\",\n },\n\"2023-07-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 186,\n 'f': \"186\",\n },\n\"2023-07-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 187,\n 'f': \"187\",\n },\n\"2023-07-30\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 188,\n 'f': \"188\",\n },\n\"2023-08-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 189,\n 'f': \"189\",\n },\n\"2023-08-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 190,\n 'f': \"190\",\n },\n\"2023-08-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 191,\n 'f': \"191\",\n },\n\"2023-08-27\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 192,\n 'f': \"192\",\n },\n\"2023-09-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 193,\n 'f': \"193\",\n },\n\"2023-09-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 194,\n 'f': \"194\",\n },\n\"2023-09-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 195,\n 'f': \"195\",\n },\n\"2023-09-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 196,\n 'f': \"196\",\n },\n\"2023-10-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 197,\n 'f': \"197\",\n },\n\"2023-10-08\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 198,\n 'f': \"198\",\n },\n\"2023-10-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 199,\n 'f': \"199\",\n },\n\"2023-10-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 200,\n 'f': \"200\",\n },\n\"2023-10-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 201,\n 'f': \"201\",\n },\n\"2023-11-05\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 202,\n 'f': \"202\",\n },\n\"2023-11-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 203,\n 'f': \"203\",\n },\n\"2023-11-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 204,\n 'f': \"204\",\n },\n\"2023-11-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 205,\n 'f': \"205\",\n },\n\"2023-12-03\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 206,\n 'f': \"206\",\n },\n\"2023-12-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 207,\n 'f': \"207\",\n },\n\"2023-12-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 208,\n 'f': \"208\",\n },\n\"2023-12-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 209,\n 'f': \"209\",\n },\n\"2023-12-31\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 210,\n 'f': \"210\",\n },\n\"2024-01-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 211,\n 'f': \"211\",\n },\n\"2024-01-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 212,\n 'f': \"212\",\n },\n\"2024-01-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 213,\n 'f': \"213\",\n },\n\"2024-01-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 214,\n 'f': \"214\",\n },\n\"2024-02-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 215,\n 'f': \"215\",\n },\n\"2024-02-11\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 216,\n 'f': \"216\",\n },\n\"2024-02-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 217,\n 'f': \"217\",\n },\n\"2024-02-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 218,\n 'f': \"218\",\n },\n\"2024-03-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 219,\n 'f': \"219\",\n },\n\"2024-03-10\",\n{\n 'v': 2,\n 'f': \"2\",\n }],\n [{\n 'v': 220,\n 'f': \"220\",\n },\n\"2024-03-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }]],\n columns: [[\"number\", \"index\"], [\"string\", \"start_date\"], [\"number\", \"counts\"]],\n columnOptions: [{\"width\": \"1px\", \"className\": \"index_column\"}],\n rowsPerPage: 25,\n helpUrl: \"https://colab.research.google.com/notebooks/data_table.ipynb\",\n suppressOutputScrolling: true,\n minimumWidth: undefined,\n });\n\n function appendQuickchartButton(parentElement) {\n let quickchartButtonContainerElement = document.createElement('div');\n quickchartButtonContainerElement.innerHTML = `\n
\n \n \n\n\n \n
`;\n parentElement.appendChild(quickchartButtonContainerElement);\n }\n\n appendQuickchartButton(table);\n " + }, + "metadata": {}, + "execution_count": 53 + } + ] + }, + { + "cell_type": "code", + "source": [ + "date_data = data[data['start_date']==pd.Timestamp('2023-07-30')]\n", + "date_data.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Gxd9pnKhwH6L", + "outputId": "17571e80-d773-4362-b39e-3ce5f1c7b9b0" + }, + "execution_count": 54, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(2, 18)" + ] + }, + "metadata": {}, + "execution_count": 54 + } + ] + }, + { + "cell_type": "code", + "source": [ + "for col in data.columns.to_list():\n", + " count = date_data[col].unique().shape[0]\n", + " if count>1:\n", + " print(col, count )" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UaAPLullyBXU", + "outputId": "f20b6190-b8da-44f6-856e-315d2853b2e6" + }, + "execution_count": 55, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "price_range 2\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "date_data[['sold_units', 'avg_discount', 'price_range', 'tactic', 'sub_tactic']]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 162 + }, + "id": "_caAx6o1OrXC", + "outputId": "236b1853-c10b-4b05-817a-f788b530a038" + }, + "execution_count": 56, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sold_units avg_discount price_range \\\n", + "318 177.000000000 7.5 7.4 \n", + "319 177.000000000 7.5 7.5 \n", + "\n", + " tactic sub_tactic \n", + "318 Promotion OCA , Shopper Discount Online , Save , Site Fee \n", + "319 Promotion OCA , Shopper Discount Online , Save , Site Fee " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sold_unitsavg_discountprice_rangetacticsub_tactic
318177.0000000007.57.4Promotion OCA , Shopper DiscountOnline , Save , Site Fee
319177.0000000007.57.5Promotion OCA , Shopper DiscountOnline , Save , Site Fee
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "summary": "{\n \"name\": \"date_data[['sold_units', 'avg_discount', 'price_range', 'tactic', 'sub_tactic']]\",\n \"rows\": 2,\n \"fields\": [\n {\n \"column\": \"sold_units\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"177.000000000\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_discount\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0,\n \"min\": 7.5,\n \"max\": 7.5,\n \"num_unique_values\": 1,\n \"samples\": [\n 7.5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_range\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0707106781186545,\n \"min\": 7.4,\n \"max\": 7.5,\n \"num_unique_values\": 2,\n \"samples\": [\n 7.5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tactic\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"Promotion OCA , Shopper Discount\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sub_tactic\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"Online , Save , Site Fee\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + }, + "application/vnd.google.colaboratory.module+javascript": "\n import \"https://ssl.gstatic.com/colaboratory/data_table/881c4a0d49046431/data_table.js\";\n\n const table = window.createDataTable({\n data: [[{\n 'v': 318,\n 'f': \"318\",\n },\n{\n 'v': \"177.000000000\",\n 'f': \"\\\"177.000000000\\\"\",\n },\n{\n 'v': 7.5,\n 'f': \"7.5\",\n },\n{\n 'v': 7.4,\n 'f': \"7.4\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee\"],\n [{\n 'v': 319,\n 'f': \"319\",\n },\n{\n 'v': \"177.000000000\",\n 'f': \"\\\"177.000000000\\\"\",\n },\n{\n 'v': 7.5,\n 'f': \"7.5\",\n },\n{\n 'v': 7.5,\n 'f': \"7.5\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee\"]],\n columns: [[\"number\", \"index\"], [\"number\", \"sold_units\"], [\"number\", \"avg_discount\"], [\"number\", \"price_range\"], [\"string\", \"tactic\"], [\"string\", \"sub_tactic\"]],\n columnOptions: [{\"width\": \"1px\", \"className\": \"index_column\"}],\n rowsPerPage: 25,\n helpUrl: \"https://colab.research.google.com/notebooks/data_table.ipynb\",\n suppressOutputScrolling: true,\n minimumWidth: undefined,\n });\n\n function appendQuickchartButton(parentElement) {\n let quickchartButtonContainerElement = document.createElement('div');\n quickchartButtonContainerElement.innerHTML = `\n
\n \n \n\n\n \n
`;\n parentElement.appendChild(quickchartButtonContainerElement);\n }\n\n appendQuickchartButton(table);\n " + }, + "metadata": {}, + "execution_count": 56 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result = data.groupby('start_date').agg({\n", + " 'avg_discount': lambda x: x.mean() if len(x) > 1 else x.iloc[0],\n", + " 'price_range': lambda x: x.mean() if len(x) > 1 else x.iloc[0],\n", + " 'tactic': lambda x: ', '.join(x) if len(x) > 1 else x.iloc[0],\n", + " 'sub_tactic': lambda x: ', '.join(x) if len(x) > 1 else x.iloc[0]\n", + "}).reset_index()" + ], + "metadata": { + "id": "HBfxTPoWAUMW" + }, + "execution_count": 57, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "result.tail()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 225 + }, + "id": "HLrbmuMnAbv8", + "outputId": "ac8a2db3-1705-4e4b-9d4b-e6895982de92" + }, + "execution_count": 58, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " start_date avg_discount price_range \\\n", + "216 2024-02-18 17.5 6.7 \n", + "217 2024-02-25 17.5 6.7 \n", + "218 2024-03-03 17.5 6.7 \n", + "219 2024-03-10 15.0 6.9 \n", + "220 2024-03-17 12.5 7.1 \n", + "\n", + " tactic \\\n", + "216 Promotion OCA , Shopper Discount \n", + "217 Promotion OCA , Shopper Discount \n", + "218 Promotion OCA , Shopper Discount \n", + "219 Promotion OCA , Shopper Discount, Promotion OC... \n", + "220 Promotion OCA , Shopper Discount \n", + "\n", + " sub_tactic \n", + "216 Online , Save , Site Fee \n", + "217 Online , Save , Site Fee \n", + "218 Online , Save , Site Fee \n", + "219 Online , Save , Site Fee, Online , Save , Site... \n", + "220 Online , Save , Site Fee " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
start_dateavg_discountprice_rangetacticsub_tactic
2162024-02-1817.56.7Promotion OCA , Shopper DiscountOnline , Save , Site Fee
2172024-02-2517.56.7Promotion OCA , Shopper DiscountOnline , Save , Site Fee
2182024-03-0317.56.7Promotion OCA , Shopper DiscountOnline , Save , Site Fee
2192024-03-1015.06.9Promotion OCA , Shopper Discount, Promotion OC...Online , Save , Site Fee, Online , Save , Site...
2202024-03-1712.57.1Promotion OCA , Shopper DiscountOnline , Save , Site Fee
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "summary": "{\n \"name\": \"result\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"start_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"2024-02-25\",\n \"2024-03-17\",\n \"2024-03-03\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_discount\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2.23606797749979,\n \"min\": 12.5,\n \"max\": 17.5,\n \"num_unique_values\": 3,\n \"samples\": [\n 17.5,\n 15.0,\n 12.5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_range\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.17888543819998298,\n \"min\": 6.7,\n \"max\": 7.1,\n \"num_unique_values\": 3,\n \"samples\": [\n 6.7,\n 6.9,\n 7.1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tactic\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Promotion OCA , Shopper Discount, Promotion OCA , Shopper Discount\",\n \"Promotion OCA , Shopper Discount\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sub_tactic\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Online , Save , Site Fee, Online , Save , Site Fee\",\n \"Online , Save , Site Fee\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + }, + "application/vnd.google.colaboratory.module+javascript": "\n import \"https://ssl.gstatic.com/colaboratory/data_table/881c4a0d49046431/data_table.js\";\n\n const table = window.createDataTable({\n data: [[{\n 'v': 216,\n 'f': \"216\",\n },\n\"2024-02-18\",\n{\n 'v': 17.5,\n 'f': \"17.5\",\n },\n{\n 'v': 6.7,\n 'f': \"6.7\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee\"],\n [{\n 'v': 217,\n 'f': \"217\",\n },\n\"2024-02-25\",\n{\n 'v': 17.5,\n 'f': \"17.5\",\n },\n{\n 'v': 6.7,\n 'f': \"6.7\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee\"],\n [{\n 'v': 218,\n 'f': \"218\",\n },\n\"2024-03-03\",\n{\n 'v': 17.5,\n 'f': \"17.5\",\n },\n{\n 'v': 6.7,\n 'f': \"6.7\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee\"],\n [{\n 'v': 219,\n 'f': \"219\",\n },\n\"2024-03-10\",\n{\n 'v': 15.0,\n 'f': \"15.0\",\n },\n{\n 'v': 6.9,\n 'f': \"6.9\",\n },\n\"Promotion OCA , Shopper Discount, Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee, Online , Save , Site Fee\"],\n [{\n 'v': 220,\n 'f': \"220\",\n },\n\"2024-03-17\",\n{\n 'v': 12.5,\n 'f': \"12.5\",\n },\n{\n 'v': 7.1,\n 'f': \"7.1\",\n },\n\"Promotion OCA , Shopper Discount\",\n\"Online , Save , Site Fee\"]],\n columns: [[\"number\", \"index\"], [\"string\", \"start_date\"], [\"number\", \"avg_discount\"], [\"number\", \"price_range\"], [\"string\", \"tactic\"], [\"string\", \"sub_tactic\"]],\n columnOptions: [{\"width\": \"1px\", \"className\": \"index_column\"}],\n rowsPerPage: 25,\n helpUrl: \"https://colab.research.google.com/notebooks/data_table.ipynb\",\n suppressOutputScrolling: true,\n minimumWidth: undefined,\n });\n\n function appendQuickchartButton(parentElement) {\n let quickchartButtonContainerElement = document.createElement('div');\n quickchartButtonContainerElement.innerHTML = `\n
\n \n \n\n\n \n
`;\n parentElement.appendChild(quickchartButtonContainerElement);\n }\n\n appendQuickchartButton(table);\n " + }, + "metadata": {}, + "execution_count": 58 + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Fusionner les résultats agrégés avec le DataFrame original en utilisant 'start_date'\n", + "merged_data = pd.merge(data, result, on='start_date', suffixes=('', '_agg'))\n", + "\n", + "# Sélectionner les colonnes et remplacer les valeurs originales par les agrégées si nécessaire\n", + "for column in ['avg_discount', 'price_range', 'tactic', 'sub_tactic']:\n", + " merged_data[column] = merged_data[column + '_agg']\n", + " merged_data.drop(column + '_agg', axis=1, inplace=True)" + ], + "metadata": { + "id": "32-BibHqBSe9" + }, + "execution_count": 59, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "merged_data.drop_duplicates(inplace=True)" + ], + "metadata": { + "id": "kei1Xq4NBXRF" + }, + "execution_count": 60, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "merged_data.groupby('start_date').size().reset_index(name='counts')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 660 + }, + "id": "qVWX-630Bhsh", + "outputId": "f0bd6898-36c9-4f83-cfb7-e4ca27ff873b" + }, + "execution_count": 61, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " start_date counts\n", + "0 2019-12-29 1\n", + "1 2020-01-05 1\n", + "2 2020-01-12 1\n", + "3 2020-01-19 1\n", + "4 2020-01-26 1\n", + ".. ... ...\n", + "216 2024-02-18 1\n", + "217 2024-02-25 1\n", + "218 2024-03-03 1\n", + "219 2024-03-10 1\n", + "220 2024-03-17 1\n", + "\n", + "[221 rows x 2 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
start_datecounts
02019-12-291
12020-01-051
22020-01-121
32020-01-191
42020-01-261
.........
2162024-02-181
2172024-02-251
2182024-03-031
2192024-03-101
2202024-03-171
\n", + "

221 rows × 2 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "summary": "{\n \"name\": \"merged_data\",\n \"rows\": 221,\n \"fields\": [\n {\n \"column\": \"start_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 221,\n \"samples\": [\n \"2022-07-10\",\n \"2022-10-30\",\n \"2021-10-10\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"counts\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 1,\n \"num_unique_values\": 1,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + }, + "application/vnd.google.colaboratory.module+javascript": "\n import \"https://ssl.gstatic.com/colaboratory/data_table/881c4a0d49046431/data_table.js\";\n\n const table = window.createDataTable({\n data: [[{\n 'v': 0,\n 'f': \"0\",\n },\n\"2019-12-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 1,\n 'f': \"1\",\n },\n\"2020-01-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 2,\n 'f': \"2\",\n },\n\"2020-01-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 3,\n 'f': \"3\",\n },\n\"2020-01-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 4,\n 'f': \"4\",\n },\n\"2020-01-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 5,\n 'f': \"5\",\n },\n\"2020-02-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 6,\n 'f': \"6\",\n },\n\"2020-02-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 7,\n 'f': \"7\",\n },\n\"2020-02-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 8,\n 'f': \"8\",\n },\n\"2020-02-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 9,\n 'f': \"9\",\n },\n\"2020-03-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 10,\n 'f': \"10\",\n },\n\"2020-03-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 11,\n 'f': \"11\",\n },\n\"2020-03-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 12,\n 'f': \"12\",\n },\n\"2020-03-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 13,\n 'f': \"13\",\n },\n\"2020-03-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 14,\n 'f': \"14\",\n },\n\"2020-04-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 15,\n 'f': \"15\",\n },\n\"2020-04-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 16,\n 'f': \"16\",\n },\n\"2020-04-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 17,\n 'f': \"17\",\n },\n\"2020-04-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 18,\n 'f': \"18\",\n },\n\"2020-05-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 19,\n 'f': \"19\",\n },\n\"2020-05-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 20,\n 'f': \"20\",\n },\n\"2020-05-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 21,\n 'f': \"21\",\n },\n\"2020-05-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 22,\n 'f': \"22\",\n },\n\"2020-05-31\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 23,\n 'f': \"23\",\n },\n\"2020-06-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 24,\n 'f': \"24\",\n },\n\"2020-06-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 25,\n 'f': \"25\",\n },\n\"2020-06-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 26,\n 'f': \"26\",\n },\n\"2020-06-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 27,\n 'f': \"27\",\n },\n\"2020-07-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 28,\n 'f': \"28\",\n },\n\"2020-07-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 29,\n 'f': \"29\",\n },\n\"2020-07-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 30,\n 'f': \"30\",\n },\n\"2020-07-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 31,\n 'f': \"31\",\n },\n\"2020-08-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 32,\n 'f': \"32\",\n },\n\"2020-08-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 33,\n 'f': \"33\",\n },\n\"2020-08-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 34,\n 'f': \"34\",\n },\n\"2020-08-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 35,\n 'f': \"35\",\n },\n\"2020-08-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 36,\n 'f': \"36\",\n },\n\"2020-09-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 37,\n 'f': \"37\",\n },\n\"2020-09-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 38,\n 'f': \"38\",\n },\n\"2020-09-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 39,\n 'f': \"39\",\n },\n\"2020-09-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 40,\n 'f': \"40\",\n },\n\"2020-10-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 41,\n 'f': \"41\",\n },\n\"2020-10-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 42,\n 'f': \"42\",\n },\n\"2020-10-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 43,\n 'f': \"43\",\n },\n\"2020-10-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 44,\n 'f': \"44\",\n },\n\"2020-11-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 45,\n 'f': \"45\",\n },\n\"2020-11-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 46,\n 'f': \"46\",\n },\n\"2020-11-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 47,\n 'f': \"47\",\n },\n\"2020-11-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 48,\n 'f': \"48\",\n },\n\"2020-11-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 49,\n 'f': \"49\",\n },\n\"2020-12-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 50,\n 'f': \"50\",\n },\n\"2020-12-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 51,\n 'f': \"51\",\n },\n\"2020-12-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 52,\n 'f': \"52\",\n },\n\"2020-12-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 53,\n 'f': \"53\",\n },\n\"2021-01-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 54,\n 'f': \"54\",\n },\n\"2021-01-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 55,\n 'f': \"55\",\n },\n\"2021-01-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 56,\n 'f': \"56\",\n },\n\"2021-01-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 57,\n 'f': \"57\",\n },\n\"2021-01-31\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 58,\n 'f': \"58\",\n },\n\"2021-02-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 59,\n 'f': \"59\",\n },\n\"2021-02-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 60,\n 'f': \"60\",\n },\n\"2021-02-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 61,\n 'f': \"61\",\n },\n\"2021-02-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 62,\n 'f': \"62\",\n },\n\"2021-03-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 63,\n 'f': \"63\",\n },\n\"2021-03-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 64,\n 'f': \"64\",\n },\n\"2021-03-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 65,\n 'f': \"65\",\n },\n\"2021-03-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 66,\n 'f': \"66\",\n },\n\"2021-04-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 67,\n 'f': \"67\",\n },\n\"2021-04-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 68,\n 'f': \"68\",\n },\n\"2021-04-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 69,\n 'f': \"69\",\n },\n\"2021-04-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 70,\n 'f': \"70\",\n },\n\"2021-05-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 71,\n 'f': \"71\",\n },\n\"2021-05-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 72,\n 'f': \"72\",\n },\n\"2021-05-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 73,\n 'f': \"73\",\n },\n\"2021-05-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 74,\n 'f': \"74\",\n },\n\"2021-05-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 75,\n 'f': \"75\",\n },\n\"2021-06-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 76,\n 'f': \"76\",\n },\n\"2021-06-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 77,\n 'f': \"77\",\n },\n\"2021-06-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 78,\n 'f': \"78\",\n },\n\"2021-06-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 79,\n 'f': \"79\",\n },\n\"2021-07-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 80,\n 'f': \"80\",\n },\n\"2021-07-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 81,\n 'f': \"81\",\n },\n\"2021-07-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 82,\n 'f': \"82\",\n },\n\"2021-07-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 83,\n 'f': \"83\",\n },\n\"2021-08-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 84,\n 'f': \"84\",\n },\n\"2021-08-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 85,\n 'f': \"85\",\n },\n\"2021-08-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 86,\n 'f': \"86\",\n },\n\"2021-08-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 87,\n 'f': \"87\",\n },\n\"2021-08-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 88,\n 'f': \"88\",\n },\n\"2021-09-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 89,\n 'f': \"89\",\n },\n\"2021-09-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 90,\n 'f': \"90\",\n },\n\"2021-09-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 91,\n 'f': \"91\",\n },\n\"2021-09-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 92,\n 'f': \"92\",\n },\n\"2021-10-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 93,\n 'f': \"93\",\n },\n\"2021-10-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 94,\n 'f': \"94\",\n },\n\"2021-10-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 95,\n 'f': \"95\",\n },\n\"2021-10-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 96,\n 'f': \"96\",\n },\n\"2021-10-31\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 97,\n 'f': \"97\",\n },\n\"2021-11-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 98,\n 'f': \"98\",\n },\n\"2021-11-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 99,\n 'f': \"99\",\n },\n\"2021-11-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 100,\n 'f': \"100\",\n },\n\"2021-11-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 101,\n 'f': \"101\",\n },\n\"2021-12-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 102,\n 'f': \"102\",\n },\n\"2021-12-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 103,\n 'f': \"103\",\n },\n\"2021-12-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 104,\n 'f': \"104\",\n },\n\"2021-12-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 105,\n 'f': \"105\",\n },\n\"2022-01-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 106,\n 'f': \"106\",\n },\n\"2022-01-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 107,\n 'f': \"107\",\n },\n\"2022-01-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 108,\n 'f': \"108\",\n },\n\"2022-01-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 109,\n 'f': \"109\",\n },\n\"2022-01-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 110,\n 'f': \"110\",\n },\n\"2022-02-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 111,\n 'f': \"111\",\n },\n\"2022-02-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 112,\n 'f': \"112\",\n },\n\"2022-02-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 113,\n 'f': \"113\",\n },\n\"2022-02-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 114,\n 'f': \"114\",\n },\n\"2022-03-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 115,\n 'f': \"115\",\n },\n\"2022-03-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 116,\n 'f': \"116\",\n },\n\"2022-03-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 117,\n 'f': \"117\",\n },\n\"2022-03-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 118,\n 'f': \"118\",\n },\n\"2022-04-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 119,\n 'f': \"119\",\n },\n\"2022-04-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 120,\n 'f': \"120\",\n },\n\"2022-04-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 121,\n 'f': \"121\",\n },\n\"2022-04-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 122,\n 'f': \"122\",\n },\n\"2022-05-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 123,\n 'f': \"123\",\n },\n\"2022-05-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 124,\n 'f': \"124\",\n },\n\"2022-05-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 125,\n 'f': \"125\",\n },\n\"2022-05-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 126,\n 'f': \"126\",\n },\n\"2022-05-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 127,\n 'f': \"127\",\n },\n\"2022-06-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 128,\n 'f': \"128\",\n },\n\"2022-06-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 129,\n 'f': \"129\",\n },\n\"2022-06-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 130,\n 'f': \"130\",\n },\n\"2022-06-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 131,\n 'f': \"131\",\n },\n\"2022-07-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 132,\n 'f': \"132\",\n },\n\"2022-07-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 133,\n 'f': \"133\",\n },\n\"2022-07-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 134,\n 'f': \"134\",\n },\n\"2022-07-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 135,\n 'f': \"135\",\n },\n\"2022-07-31\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 136,\n 'f': \"136\",\n },\n\"2022-08-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 137,\n 'f': \"137\",\n },\n\"2022-08-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 138,\n 'f': \"138\",\n },\n\"2022-08-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 139,\n 'f': \"139\",\n },\n\"2022-08-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 140,\n 'f': \"140\",\n },\n\"2022-09-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 141,\n 'f': \"141\",\n },\n\"2022-09-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 142,\n 'f': \"142\",\n },\n\"2022-09-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 143,\n 'f': \"143\",\n },\n\"2022-09-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 144,\n 'f': \"144\",\n },\n\"2022-10-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 145,\n 'f': \"145\",\n },\n\"2022-10-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 146,\n 'f': \"146\",\n },\n\"2022-10-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 147,\n 'f': \"147\",\n },\n\"2022-10-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 148,\n 'f': \"148\",\n },\n\"2022-10-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 149,\n 'f': \"149\",\n },\n\"2022-11-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 150,\n 'f': \"150\",\n },\n\"2022-11-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 151,\n 'f': \"151\",\n },\n\"2022-11-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 152,\n 'f': \"152\",\n },\n\"2022-11-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 153,\n 'f': \"153\",\n },\n\"2022-12-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 154,\n 'f': \"154\",\n },\n\"2022-12-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 155,\n 'f': \"155\",\n },\n\"2022-12-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 156,\n 'f': \"156\",\n },\n\"2022-12-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 157,\n 'f': \"157\",\n },\n\"2023-01-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 158,\n 'f': \"158\",\n },\n\"2023-01-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 159,\n 'f': \"159\",\n },\n\"2023-01-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 160,\n 'f': \"160\",\n },\n\"2023-01-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 161,\n 'f': \"161\",\n },\n\"2023-01-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 162,\n 'f': \"162\",\n },\n\"2023-02-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 163,\n 'f': \"163\",\n },\n\"2023-02-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 164,\n 'f': \"164\",\n },\n\"2023-02-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 165,\n 'f': \"165\",\n },\n\"2023-02-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 166,\n 'f': \"166\",\n },\n\"2023-03-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 167,\n 'f': \"167\",\n },\n\"2023-03-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 168,\n 'f': \"168\",\n },\n\"2023-03-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 169,\n 'f': \"169\",\n },\n\"2023-03-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 170,\n 'f': \"170\",\n },\n\"2023-04-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 171,\n 'f': \"171\",\n },\n\"2023-04-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 172,\n 'f': \"172\",\n },\n\"2023-04-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 173,\n 'f': \"173\",\n },\n\"2023-04-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 174,\n 'f': \"174\",\n },\n\"2023-04-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 175,\n 'f': \"175\",\n },\n\"2023-05-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 176,\n 'f': \"176\",\n },\n\"2023-05-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 177,\n 'f': \"177\",\n },\n\"2023-05-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 178,\n 'f': \"178\",\n },\n\"2023-05-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 179,\n 'f': \"179\",\n },\n\"2023-06-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 180,\n 'f': \"180\",\n },\n\"2023-06-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 181,\n 'f': \"181\",\n },\n\"2023-06-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 182,\n 'f': \"182\",\n },\n\"2023-06-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 183,\n 'f': \"183\",\n },\n\"2023-07-02\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 184,\n 'f': \"184\",\n },\n\"2023-07-09\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 185,\n 'f': \"185\",\n },\n\"2023-07-16\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 186,\n 'f': \"186\",\n },\n\"2023-07-23\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 187,\n 'f': \"187\",\n },\n\"2023-07-30\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 188,\n 'f': \"188\",\n },\n\"2023-08-06\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 189,\n 'f': \"189\",\n },\n\"2023-08-13\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 190,\n 'f': \"190\",\n },\n\"2023-08-20\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 191,\n 'f': \"191\",\n },\n\"2023-08-27\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 192,\n 'f': \"192\",\n },\n\"2023-09-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 193,\n 'f': \"193\",\n },\n\"2023-09-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 194,\n 'f': \"194\",\n },\n\"2023-09-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 195,\n 'f': \"195\",\n },\n\"2023-09-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 196,\n 'f': \"196\",\n },\n\"2023-10-01\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 197,\n 'f': \"197\",\n },\n\"2023-10-08\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 198,\n 'f': \"198\",\n },\n\"2023-10-15\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 199,\n 'f': \"199\",\n },\n\"2023-10-22\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 200,\n 'f': \"200\",\n },\n\"2023-10-29\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 201,\n 'f': \"201\",\n },\n\"2023-11-05\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 202,\n 'f': \"202\",\n },\n\"2023-11-12\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 203,\n 'f': \"203\",\n },\n\"2023-11-19\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 204,\n 'f': \"204\",\n },\n\"2023-11-26\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 205,\n 'f': \"205\",\n },\n\"2023-12-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 206,\n 'f': \"206\",\n },\n\"2023-12-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 207,\n 'f': \"207\",\n },\n\"2023-12-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 208,\n 'f': \"208\",\n },\n\"2023-12-24\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 209,\n 'f': \"209\",\n },\n\"2023-12-31\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 210,\n 'f': \"210\",\n },\n\"2024-01-07\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 211,\n 'f': \"211\",\n },\n\"2024-01-14\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 212,\n 'f': \"212\",\n },\n\"2024-01-21\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 213,\n 'f': \"213\",\n },\n\"2024-01-28\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 214,\n 'f': \"214\",\n },\n\"2024-02-04\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 215,\n 'f': \"215\",\n },\n\"2024-02-11\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 216,\n 'f': \"216\",\n },\n\"2024-02-18\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 217,\n 'f': \"217\",\n },\n\"2024-02-25\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 218,\n 'f': \"218\",\n },\n\"2024-03-03\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 219,\n 'f': \"219\",\n },\n\"2024-03-10\",\n{\n 'v': 1,\n 'f': \"1\",\n }],\n [{\n 'v': 220,\n 'f': \"220\",\n },\n\"2024-03-17\",\n{\n 'v': 1,\n 'f': \"1\",\n }]],\n columns: [[\"number\", \"index\"], [\"string\", \"start_date\"], [\"number\", \"counts\"]],\n columnOptions: [{\"width\": \"1px\", \"className\": \"index_column\"}],\n rowsPerPage: 25,\n helpUrl: \"https://colab.research.google.com/notebooks/data_table.ipynb\",\n suppressOutputScrolling: true,\n minimumWidth: undefined,\n });\n\n function appendQuickchartButton(parentElement) {\n let quickchartButtonContainerElement = document.createElement('div');\n quickchartButtonContainerElement.innerHTML = `\n
\n \n \n\n\n \n
`;\n parentElement.appendChild(quickchartButtonContainerElement);\n }\n\n appendQuickchartButton(table);\n " + }, + "metadata": {}, + "execution_count": 61 + } + ] + }, + { + "cell_type": "code", + "source": [ + "def remove_duplicates_from_string(input_string):\n", + " if input_string==None : return None\n", + " unique_items = set(input_string.split(', '))\n", + " cleaned_string = ', '.join(sorted(unique_items))\n", + " return cleaned_string\n", + "\n", + "merged_data['tactic'] = merged_data['tactic'].apply(remove_duplicates_from_string)\n", + "merged_data['sub_tactic'] = merged_data['sub_tactic'].apply(remove_duplicates_from_string)" + ], + "metadata": { + "id": "ZHDFe4JrCWeX" + }, + "execution_count": 62, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "merged_data.head()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 325 + }, + "id": "0fDgnVsRCerz", + "outputId": "7fd054fc-5b8d-48ca-bcbf-ac033d303b66" + }, + "execution_count": 63, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " global_channel_type sold_units sold_value_loc start_date end_date \\\n", + "0 Online 112.000000000 887.30 2021-11-14 2021-11-20 \n", + "1 Online 99.000000000 789.45 2021-05-30 2021-06-05 \n", + "2 Online 82.000000000 528.68 2020-01-19 2020-01-25 \n", + "3 Online 135.000000000 997.10 2022-02-06 2022-02-12 \n", + "4 Online 192.000000000 1517.45 2021-08-01 2021-08-07 \n", + "\n", + " mid_date is_promo week year Final_ISP sub_axis Filled_Final_ISP \\\n", + "0 2021-11-17 False 46 2021 NaN Face Makeup 8.0 \n", + "1 2021-06-02 False 22 2021 NaN Face Makeup 8.0 \n", + "2 2020-01-22 False 3 2020 NaN Face Makeup 8.0 \n", + "3 2022-02-09 False 6 2022 8.0 Face Makeup 8.0 \n", + "4 2021-08-04 False 31 2021 NaN Face Makeup 8.0 \n", + "\n", + " estimated_price seasonality_index price_range tactic sub_tactic \\\n", + "0 7.922321 1.038199 NaN None None \n", + "1 7.974242 1.074688 NaN None None \n", + "2 6.447317 1.000000 NaN None None \n", + "3 7.385926 1.043246 NaN None None \n", + "4 7.903385 1.031296 NaN None None \n", + "\n", + " avg_discount \n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 NaN \n", + "4 NaN " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
global_channel_typesold_unitssold_value_locstart_dateend_datemid_dateis_promoweekyearFinal_ISPsub_axisFilled_Final_ISPestimated_priceseasonality_indexprice_rangetacticsub_tacticavg_discount
0Online112.000000000887.302021-11-142021-11-202021-11-17False462021NaNFace Makeup8.07.9223211.038199NaNNoneNoneNaN
1Online99.000000000789.452021-05-302021-06-052021-06-02False222021NaNFace Makeup8.07.9742421.074688NaNNoneNoneNaN
2Online82.000000000528.682020-01-192020-01-252020-01-22False32020NaNFace Makeup8.06.4473171.000000NaNNoneNoneNaN
3Online135.000000000997.102022-02-062022-02-122022-02-09False620228.0Face Makeup8.07.3859261.043246NaNNoneNoneNaN
4Online192.0000000001517.452021-08-012021-08-072021-08-04False312021NaNFace Makeup8.07.9033851.031296NaNNoneNoneNaN
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "merged_data", + "summary": "{\n \"name\": \"merged_data\",\n \"rows\": 221,\n \"fields\": [\n {\n \"column\": \"global_channel_type\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"Online\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sold_units\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 147,\n \"samples\": [\n \"251.000000000\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sold_value_loc\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 501.65566930576045,\n \"min\": 0.0,\n \"max\": 4470.21,\n \"num_unique_values\": 221,\n \"samples\": [\n 722.17\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"start_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 221,\n \"samples\": [\n \"2020-02-02\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"end_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 221,\n \"samples\": [\n \"2020-02-08\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"mid_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 221,\n \"samples\": [\n \"2020-02-05\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"is_promo\",\n \"properties\": {\n \"dtype\": \"boolean\",\n \"num_unique_values\": 2,\n \"samples\": [\n true\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"week\",\n \"properties\": {\n \"dtype\": \"Int64\",\n \"num_unique_values\": 52,\n \"samples\": [\n 33\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"year\",\n \"properties\": {\n \"dtype\": \"Int64\",\n \"num_unique_values\": 6,\n \"samples\": [\n 2021\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Final_ISP\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0,\n \"min\": 8.0,\n \"max\": 8.0,\n \"num_unique_values\": 1,\n \"samples\": [\n 8.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sub_axis\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"Face Makeup\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Filled_Final_ISP\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0,\n \"min\": 8.0,\n \"max\": 8.0,\n \"num_unique_values\": 1,\n \"samples\": [\n 8.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estimated_price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.9155264926288056,\n \"min\": 4.465405405405406,\n \"max\": 8.084378698224851,\n \"num_unique_values\": 220,\n \"samples\": [\n 6.914418604651162\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"seasonality_index\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.06769705540964618,\n \"min\": 0.892769634,\n \"max\": 1.272625573,\n \"num_unique_values\": 158,\n \"samples\": [\n 0.946793396\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_range\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.6314174498948742,\n \"min\": 5.5,\n \"max\": 7.7,\n \"num_unique_values\": 18,\n \"samples\": [\n 6.9\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tactic\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"Promotion OCA , Shopper Discount\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sub_tactic\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 4,\n \"samples\": [\n \"Save , Site Fee\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_discount\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 8.676616169611394,\n \"min\": 2.5,\n \"max\": 32.5,\n \"num_unique_values\": 10,\n \"samples\": [\n 12.5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + }, + "application/vnd.google.colaboratory.module+javascript": "\n import \"https://ssl.gstatic.com/colaboratory/data_table/881c4a0d49046431/data_table.js\";\n\n const table = window.createDataTable({\n data: [[{\n 'v': 0,\n 'f': \"0\",\n },\n\"Online\",\n{\n 'v': \"112.000000000\",\n 'f': \"\\\"112.000000000\\\"\",\n },\n{\n 'v': 887.3,\n 'f': \"887.3\",\n },\n\"2021-11-14\",\n\"2021-11-20\",\n\"2021-11-17\",\nfalse,\n{\n 'v': 46,\n 'f': \"46\",\n },\n{\n 'v': 2021,\n 'f': \"2021\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 7.922321428571428,\n 'f': \"7.922321428571428\",\n },\n{\n 'v': 1.038199109,\n 'f': \"1.038199109\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n }],\n [{\n 'v': 1,\n 'f': \"1\",\n },\n\"Online\",\n{\n 'v': \"99.000000000\",\n 'f': \"\\\"99.000000000\\\"\",\n },\n{\n 'v': 789.45,\n 'f': \"789.45\",\n },\n\"2021-05-30\",\n\"2021-06-05\",\n\"2021-06-02\",\nfalse,\n{\n 'v': 22,\n 'f': \"22\",\n },\n{\n 'v': 2021,\n 'f': \"2021\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 7.974242424242425,\n 'f': \"7.974242424242425\",\n },\n{\n 'v': 1.07468764,\n 'f': \"1.07468764\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n }],\n [{\n 'v': 2,\n 'f': \"2\",\n },\n\"Online\",\n{\n 'v': \"82.000000000\",\n 'f': \"\\\"82.000000000\\\"\",\n },\n{\n 'v': 528.68,\n 'f': \"528.68\",\n },\n\"2020-01-19\",\n\"2020-01-25\",\n\"2020-01-22\",\nfalse,\n{\n 'v': 3,\n 'f': \"3\",\n },\n{\n 'v': 2020,\n 'f': \"2020\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 6.447317073170731,\n 'f': \"6.447317073170731\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n }],\n [{\n 'v': 3,\n 'f': \"3\",\n },\n\"Online\",\n{\n 'v': \"135.000000000\",\n 'f': \"\\\"135.000000000\\\"\",\n },\n{\n 'v': 997.1,\n 'f': \"997.1\",\n },\n\"2022-02-06\",\n\"2022-02-12\",\n\"2022-02-09\",\nfalse,\n{\n 'v': 6,\n 'f': \"6\",\n },\n{\n 'v': 2022,\n 'f': \"2022\",\n },\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 7.3859259259259264,\n 'f': \"7.3859259259259264\",\n },\n{\n 'v': 1.043245865,\n 'f': \"1.043245865\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n }],\n [{\n 'v': 4,\n 'f': \"4\",\n },\n\"Online\",\n{\n 'v': \"192.000000000\",\n 'f': \"\\\"192.000000000\\\"\",\n },\n{\n 'v': 1517.45,\n 'f': \"1517.45\",\n },\n\"2021-08-01\",\n\"2021-08-07\",\n\"2021-08-04\",\nfalse,\n{\n 'v': 31,\n 'f': \"31\",\n },\n{\n 'v': 2021,\n 'f': \"2021\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n },\n\"Face Makeup\",\n{\n 'v': 8.0,\n 'f': \"8.0\",\n },\n{\n 'v': 7.903385416666667,\n 'f': \"7.903385416666667\",\n },\n{\n 'v': 1.031295565,\n 'f': \"1.031295565\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': null,\n 'f': \"null\",\n },\n{\n 'v': NaN,\n 'f': \"NaN\",\n }]],\n columns: [[\"number\", \"index\"], [\"string\", \"global_channel_type\"], [\"number\", \"sold_units\"], [\"number\", \"sold_value_loc\"], [\"string\", \"start_date\"], [\"string\", \"end_date\"], [\"string\", \"mid_date\"], [\"string\", \"is_promo\"], [\"number\", \"week\"], [\"number\", \"year\"], [\"number\", \"Final_ISP\"], [\"string\", \"sub_axis\"], [\"number\", \"Filled_Final_ISP\"], [\"number\", \"estimated_price\"], [\"number\", \"seasonality_index\"], [\"number\", \"price_range\"], [\"number\", \"tactic\"], [\"number\", \"sub_tactic\"], [\"number\", \"avg_discount\"]],\n columnOptions: [{\"width\": \"1px\", \"className\": \"index_column\"}],\n rowsPerPage: 25,\n helpUrl: \"https://colab.research.google.com/notebooks/data_table.ipynb\",\n suppressOutputScrolling: true,\n minimumWidth: undefined,\n });\n\n function appendQuickchartButton(parentElement) {\n let quickchartButtonContainerElement = document.createElement('div');\n quickchartButtonContainerElement.innerHTML = `\n
\n \n \n\n\n \n
`;\n parentElement.appendChild(quickchartButtonContainerElement);\n }\n\n appendQuickchartButton(table);\n " + }, + "metadata": {}, + "execution_count": 63 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data = merged_data.copy()" + ], + "metadata": { + "id": "RK9KF-YhvGrh" + }, + "execution_count": 118, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "unecessary_columns = ['global_channel_type', 'start_date', 'mid_date', 'Final_ISP', 'sub_axis', 'Filled_Final_ISP']\n", + "data.drop(unecessary_columns, axis=1, inplace=True)" + ], + "metadata": { + "id": "3n9Z5WQyDEJx" + }, + "execution_count": 119, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data = data.sort_values(by='end_date')" + ], + "metadata": { + "id": "qKX48KRdCJE2" + }, + "execution_count": 120, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Replace nulls in 'price_range' and 'avrg_discount' with zero\n", + "data.loc[(data['is_promo'] == False) & (data['price_range'].isnull()), 'price_range'] = 0\n", + "data.loc[(data['is_promo'] == False) & (data['avg_discount'].isnull()), 'avg_discount'] = 0\n", + "data.loc[(data['is_promo'] == False) & (data['estimated_price'].isnull()), 'estimated_price'] = 0\n", + "# Replace nulls in 'tactic' and 'subtactic' with empty strings\n", + "data.loc[(data['is_promo'] == False) & (data['tactic'].isnull()), 'tactic'] = ''\n", + "data.loc[(data['is_promo'] == False) & (data['sub_tactic'].isnull()), 'sub_tactic'] = ''" + ], + "metadata": { + "id": "XubDCBCmCNFy" + }, + "execution_count": 121, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data['sold_units'] = pd.to_numeric(data['sold_units'], errors='coerce')" + ], + "metadata": { + "id": "MWZ4L5flGvTz" + }, + "execution_count": 122, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data.head()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 225 + }, + "id": "OqDSnSPVCvfP", + "outputId": "f3aa8dff-689d-4dc6-dcb4-f2efe183a24d" + }, + "execution_count": 123, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sold_units sold_value_loc end_date is_promo week year \\\n", + "19 89.0 617.95 2020-01-04 False 52 2019 \n", + "87 89.0 562.91 2020-01-11 False 1 2020 \n", + "100 67.0 417.47 2020-01-18 False 2 2020 \n", + "2 82.0 528.68 2020-01-25 False 3 2020 \n", + "104 96.0 593.42 2020-02-01 False 4 2020 \n", + "\n", + " estimated_price seasonality_index price_range tactic sub_tactic \\\n", + "19 6.943258 1.0 0.0 \n", + "87 6.324831 1.0 0.0 \n", + "100 6.230896 1.0 0.0 \n", + "2 6.447317 1.0 0.0 \n", + "104 6.181458 1.0 0.0 \n", + "\n", + " avg_discount \n", + "19 0.0 \n", + "87 0.0 \n", + "100 0.0 \n", + "2 0.0 \n", + "104 0.0 " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sold_unitssold_value_locend_dateis_promoweekyearestimated_priceseasonality_indexprice_rangetacticsub_tacticavg_discount
1989.0617.952020-01-04False5220196.9432581.00.00.0
8789.0562.912020-01-11False120206.3248311.00.00.0
10067.0417.472020-01-18False220206.2308961.00.00.0
282.0528.682020-01-25False320206.4473171.00.00.0
10496.0593.422020-02-01False420206.1814581.00.00.0
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "data", + "summary": "{\n \"name\": \"data\",\n \"rows\": 221,\n \"fields\": [\n {\n \"column\": \"sold_units\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 98.7960807407075,\n \"min\": 0.0,\n \"max\": 972.0,\n \"num_unique_values\": 147,\n \"samples\": [\n 160.0,\n 159.0,\n 193.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sold_value_loc\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 501.6556693057604,\n \"min\": 0.0,\n \"max\": 4470.21,\n \"num_unique_values\": 221,\n \"samples\": [\n 1689.76,\n 1765.38,\n 850.71\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"end_date\",\n \"properties\": {\n \"dtype\": \"dbdate\",\n \"num_unique_values\": 221,\n \"samples\": [\n \"2022-07-16\",\n \"2022-11-05\",\n \"2021-10-16\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"is_promo\",\n \"properties\": {\n \"dtype\": \"boolean\",\n \"num_unique_values\": 2,\n \"samples\": [\n true,\n false\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"week\",\n \"properties\": {\n \"dtype\": \"Int64\",\n \"num_unique_values\": 52,\n \"samples\": [\n 19,\n 41\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"year\",\n \"properties\": {\n \"dtype\": \"Int64\",\n \"num_unique_values\": 6,\n \"samples\": [\n 2019,\n 2020\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estimated_price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.0235363813341536,\n \"min\": 0.0,\n \"max\": 8.084378698224851,\n \"num_unique_values\": 221,\n \"samples\": [\n 7.543571428571428,\n 6.396304347826088\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"seasonality_index\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.06769705540964618,\n \"min\": 0.892769634,\n \"max\": 1.272625573,\n \"num_unique_values\": 158,\n \"samples\": [\n 1.077264954,\n 1.084750849\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_range\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 3.125953215377761,\n \"min\": 0.0,\n \"max\": 7.7,\n \"num_unique_values\": 19,\n \"samples\": [\n 0.0,\n 7.7\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tactic\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 4,\n \"samples\": [\n \"Promotion OCA , Shopper Discount\",\n \"MultiBuy , Promotion OCA\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sub_tactic\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Online , Save , Site Fee\",\n \"Save , Site Fee\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_discount\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 8.293809673339087,\n \"min\": 0.0,\n \"max\": 32.5,\n \"num_unique_values\": 11,\n \"samples\": [\n 22.5,\n 0.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + }, + "application/vnd.google.colaboratory.module+javascript": "\n import \"https://ssl.gstatic.com/colaboratory/data_table/881c4a0d49046431/data_table.js\";\n\n const table = window.createDataTable({\n data: [[{\n 'v': 19,\n 'f': \"19\",\n },\n{\n 'v': 89.0,\n 'f': \"89.0\",\n },\n{\n 'v': 617.95,\n 'f': \"617.95\",\n },\n\"2020-01-04\",\nfalse,\n{\n 'v': 52,\n 'f': \"52\",\n },\n{\n 'v': 2019,\n 'f': \"2019\",\n },\n{\n 'v': 6.943258426966293,\n 'f': \"6.943258426966293\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.0,\n 'f': \"0.0\",\n },\n\"\",\n\"\",\n{\n 'v': 0.0,\n 'f': \"0.0\",\n }],\n [{\n 'v': 87,\n 'f': \"87\",\n },\n{\n 'v': 89.0,\n 'f': \"89.0\",\n },\n{\n 'v': 562.91,\n 'f': \"562.91\",\n },\n\"2020-01-11\",\nfalse,\n{\n 'v': 1,\n 'f': \"1\",\n },\n{\n 'v': 2020,\n 'f': \"2020\",\n },\n{\n 'v': 6.324831460674157,\n 'f': \"6.324831460674157\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.0,\n 'f': \"0.0\",\n },\n\"\",\n\"\",\n{\n 'v': 0.0,\n 'f': \"0.0\",\n }],\n [{\n 'v': 100,\n 'f': \"100\",\n },\n{\n 'v': 67.0,\n 'f': \"67.0\",\n },\n{\n 'v': 417.47,\n 'f': \"417.47\",\n },\n\"2020-01-18\",\nfalse,\n{\n 'v': 2,\n 'f': \"2\",\n },\n{\n 'v': 2020,\n 'f': \"2020\",\n },\n{\n 'v': 6.23089552238806,\n 'f': \"6.23089552238806\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.0,\n 'f': \"0.0\",\n },\n\"\",\n\"\",\n{\n 'v': 0.0,\n 'f': \"0.0\",\n }],\n [{\n 'v': 2,\n 'f': \"2\",\n },\n{\n 'v': 82.0,\n 'f': \"82.0\",\n },\n{\n 'v': 528.68,\n 'f': \"528.68\",\n },\n\"2020-01-25\",\nfalse,\n{\n 'v': 3,\n 'f': \"3\",\n },\n{\n 'v': 2020,\n 'f': \"2020\",\n },\n{\n 'v': 6.447317073170731,\n 'f': \"6.447317073170731\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.0,\n 'f': \"0.0\",\n },\n\"\",\n\"\",\n{\n 'v': 0.0,\n 'f': \"0.0\",\n }],\n [{\n 'v': 104,\n 'f': \"104\",\n },\n{\n 'v': 96.0,\n 'f': \"96.0\",\n },\n{\n 'v': 593.42,\n 'f': \"593.42\",\n },\n\"2020-02-01\",\nfalse,\n{\n 'v': 4,\n 'f': \"4\",\n },\n{\n 'v': 2020,\n 'f': \"2020\",\n },\n{\n 'v': 6.181458333333333,\n 'f': \"6.181458333333333\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.0,\n 'f': \"0.0\",\n },\n\"\",\n\"\",\n{\n 'v': 0.0,\n 'f': \"0.0\",\n }]],\n columns: [[\"number\", \"index\"], [\"number\", \"sold_units\"], [\"number\", \"sold_value_loc\"], [\"string\", \"end_date\"], [\"string\", \"is_promo\"], [\"number\", \"week\"], [\"number\", \"year\"], [\"number\", \"estimated_price\"], [\"number\", \"seasonality_index\"], [\"number\", \"price_range\"], [\"string\", \"tactic\"], [\"string\", \"sub_tactic\"], [\"number\", \"avg_discount\"]],\n columnOptions: [{\"width\": \"1px\", \"className\": \"index_column\"}],\n rowsPerPage: 25,\n helpUrl: \"https://colab.research.google.com/notebooks/data_table.ipynb\",\n suppressOutputScrolling: true,\n minimumWidth: undefined,\n });\n\n function appendQuickchartButton(parentElement) {\n let quickchartButtonContainerElement = document.createElement('div');\n quickchartButtonContainerElement.innerHTML = `\n
\n \n \n\n\n \n
`;\n parentElement.appendChild(quickchartButtonContainerElement);\n }\n\n appendQuickchartButton(table);\n " + }, + "metadata": {}, + "execution_count": 123 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data.isnull().sum()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "neukZBdFDAxB", + "outputId": "daef8786-e6df-4701-bfd4-44e03503b971" + }, + "execution_count": 124, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "sold_units 0\n", + "sold_value_loc 0\n", + "end_date 0\n", + "is_promo 0\n", + "week 0\n", + "year 0\n", + "estimated_price 0\n", + "seasonality_index 0\n", + "price_range 0\n", + "tactic 0\n", + "sub_tactic 0\n", + "avg_discount 0\n", + "dtype: int64" + ] + }, + "metadata": {}, + "execution_count": 124 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "TUws5RCiQ9N9" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "numeric_data = data.select_dtypes(include=[np.number])" + ], + "metadata": { + "id": "NpegJLjLDwqu" + }, + "execution_count": 127, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "numeric_data.corr()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 305 + }, + "id": "XwiqvxD3ElZp", + "outputId": "b621af6b-e1ff-4253-8933-a3db5ce70436" + }, + "execution_count": 129, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sold_units sold_value_loc week year \\\n", + "sold_units 1.000000 0.944361 0.211422 0.004811 \n", + "sold_value_loc 0.944361 1.000000 0.258911 0.111751 \n", + "week 0.211422 0.258911 1.000000 -0.151650 \n", + "year 0.004811 0.111751 -0.151650 1.000000 \n", + "estimated_price -0.422645 -0.183349 0.035787 0.252688 \n", + "seasonality_index -0.118065 -0.019144 0.034865 0.142106 \n", + "price_range 0.026121 0.080321 -0.133266 0.800410 \n", + "avg_discount 0.140345 0.131906 0.013437 0.674841 \n", + "\n", + " estimated_price seasonality_index price_range \\\n", + "sold_units -0.422645 -0.118065 0.026121 \n", + "sold_value_loc -0.183349 -0.019144 0.080321 \n", + "week 0.035787 0.034865 -0.133266 \n", + "year 0.252688 0.142106 0.800410 \n", + "estimated_price 1.000000 0.367248 0.066157 \n", + "seasonality_index 0.367248 1.000000 0.042650 \n", + "price_range 0.066157 0.042650 1.000000 \n", + "avg_discount -0.170212 -0.249159 0.763723 \n", + "\n", + " avg_discount \n", + "sold_units 0.140345 \n", + "sold_value_loc 0.131906 \n", + "week 0.013437 \n", + "year 0.674841 \n", + "estimated_price -0.170212 \n", + "seasonality_index -0.249159 \n", + "price_range 0.763723 \n", + "avg_discount 1.000000 " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sold_unitssold_value_locweekyearestimated_priceseasonality_indexprice_rangeavg_discount
sold_units1.0000000.9443610.2114220.004811-0.422645-0.1180650.0261210.140345
sold_value_loc0.9443611.0000000.2589110.111751-0.183349-0.0191440.0803210.131906
week0.2114220.2589111.000000-0.1516500.0357870.034865-0.1332660.013437
year0.0048110.111751-0.1516501.0000000.2526880.1421060.8004100.674841
estimated_price-0.422645-0.1833490.0357870.2526881.0000000.3672480.066157-0.170212
seasonality_index-0.118065-0.0191440.0348650.1421060.3672481.0000000.042650-0.249159
price_range0.0261210.080321-0.1332660.8004100.0661570.0426501.0000000.763723
avg_discount0.1403450.1319060.0134370.674841-0.170212-0.2491590.7637231.000000
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "summary": "{\n \"name\": \"numeric_data\",\n \"rows\": 8,\n \"fields\": [\n {\n \"column\": \"sold_units\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.5000866913730267,\n \"min\": -0.4226451087816284,\n \"max\": 1.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 0.9443610806535778,\n -0.11806497729761947,\n 1.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sold_value_loc\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.439742289151167,\n \"min\": -0.18334899267452595,\n \"max\": 1.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 1.0,\n -0.01914421524945657,\n 0.9443610806535778\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"week\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.36911336377112164,\n \"min\": -0.1516499673566177,\n \"max\": 1.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 0.25891119246584204,\n 0.03486484688604691,\n 0.21142201657479795\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"year\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.41593248807938693,\n \"min\": -0.1516499673566177,\n \"max\": 1.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 0.11175126448087695,\n 0.1421057200934621,\n 0.004810674814255355\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estimated_price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.43651383636594143,\n \"min\": -0.4226451087816284,\n \"max\": 1.0,\n \"num_unique_values\": 8,\n \"samples\": [\n -0.18334899267452595,\n 0.3672484754756403,\n -0.4226451087816284\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"seasonality_index\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.38809713045591526,\n \"min\": -0.2491587821505684,\n \"max\": 1.0,\n \"num_unique_values\": 8,\n \"samples\": [\n -0.01914421524945657,\n 1.0,\n -0.11806497729761947\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_range\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.44397198807437466,\n \"min\": -0.13326572359457264,\n \"max\": 1.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 0.08032131932811594,\n 0.042649844747114904,\n 0.02612078162297054\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_discount\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.4633653626469171,\n \"min\": -0.2491587821505684,\n \"max\": 1.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 0.13190609678166698,\n -0.2491587821505684,\n 0.14034535368095938\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + }, + "application/vnd.google.colaboratory.module+javascript": "\n import \"https://ssl.gstatic.com/colaboratory/data_table/881c4a0d49046431/data_table.js\";\n\n const table = window.createDataTable({\n data: [[\"sold_units\",\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.9443610806535778,\n 'f': \"0.9443610806535778\",\n },\n{\n 'v': 0.21142201657479795,\n 'f': \"0.21142201657479795\",\n },\n{\n 'v': 0.004810674814255355,\n 'f': \"0.004810674814255355\",\n },\n{\n 'v': -0.4226451087816284,\n 'f': \"-0.4226451087816284\",\n },\n{\n 'v': -0.11806497729761947,\n 'f': \"-0.11806497729761947\",\n },\n{\n 'v': 0.02612078162297054,\n 'f': \"0.02612078162297054\",\n },\n{\n 'v': 0.14034535368095938,\n 'f': \"0.14034535368095938\",\n }],\n [\"sold_value_loc\",\n{\n 'v': 0.9443610806535778,\n 'f': \"0.9443610806535778\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.25891119246584204,\n 'f': \"0.25891119246584204\",\n },\n{\n 'v': 0.11175126448087695,\n 'f': \"0.11175126448087695\",\n },\n{\n 'v': -0.18334899267452595,\n 'f': \"-0.18334899267452595\",\n },\n{\n 'v': -0.01914421524945657,\n 'f': \"-0.01914421524945657\",\n },\n{\n 'v': 0.08032131932811594,\n 'f': \"0.08032131932811594\",\n },\n{\n 'v': 0.13190609678166698,\n 'f': \"0.13190609678166698\",\n }],\n [\"week\",\n{\n 'v': 0.21142201657479795,\n 'f': \"0.21142201657479795\",\n },\n{\n 'v': 0.25891119246584204,\n 'f': \"0.25891119246584204\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': -0.1516499673566177,\n 'f': \"-0.1516499673566177\",\n },\n{\n 'v': 0.035787198071794646,\n 'f': \"0.035787198071794646\",\n },\n{\n 'v': 0.03486484688604691,\n 'f': \"0.03486484688604691\",\n },\n{\n 'v': -0.13326572359457264,\n 'f': \"-0.13326572359457264\",\n },\n{\n 'v': 0.013436941552207978,\n 'f': \"0.013436941552207978\",\n }],\n [\"year\",\n{\n 'v': 0.004810674814255355,\n 'f': \"0.004810674814255355\",\n },\n{\n 'v': 0.11175126448087695,\n 'f': \"0.11175126448087695\",\n },\n{\n 'v': -0.1516499673566177,\n 'f': \"-0.1516499673566177\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.2526878486011723,\n 'f': \"0.2526878486011723\",\n },\n{\n 'v': 0.1421057200934621,\n 'f': \"0.1421057200934621\",\n },\n{\n 'v': 0.8004103899375995,\n 'f': \"0.8004103899375995\",\n },\n{\n 'v': 0.6748408281183387,\n 'f': \"0.6748408281183387\",\n }],\n [\"estimated_price\",\n{\n 'v': -0.4226451087816284,\n 'f': \"-0.4226451087816284\",\n },\n{\n 'v': -0.18334899267452595,\n 'f': \"-0.18334899267452595\",\n },\n{\n 'v': 0.035787198071794646,\n 'f': \"0.035787198071794646\",\n },\n{\n 'v': 0.2526878486011723,\n 'f': \"0.2526878486011723\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.3672484754756403,\n 'f': \"0.3672484754756403\",\n },\n{\n 'v': 0.06615669489785923,\n 'f': \"0.06615669489785923\",\n },\n{\n 'v': -0.17021175305775815,\n 'f': \"-0.17021175305775815\",\n }],\n [\"seasonality_index\",\n{\n 'v': -0.11806497729761947,\n 'f': \"-0.11806497729761947\",\n },\n{\n 'v': -0.01914421524945657,\n 'f': \"-0.01914421524945657\",\n },\n{\n 'v': 0.03486484688604691,\n 'f': \"0.03486484688604691\",\n },\n{\n 'v': 0.1421057200934621,\n 'f': \"0.1421057200934621\",\n },\n{\n 'v': 0.3672484754756403,\n 'f': \"0.3672484754756403\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.042649844747114904,\n 'f': \"0.042649844747114904\",\n },\n{\n 'v': -0.2491587821505684,\n 'f': \"-0.2491587821505684\",\n }],\n [\"price_range\",\n{\n 'v': 0.02612078162297054,\n 'f': \"0.02612078162297054\",\n },\n{\n 'v': 0.08032131932811594,\n 'f': \"0.08032131932811594\",\n },\n{\n 'v': -0.13326572359457264,\n 'f': \"-0.13326572359457264\",\n },\n{\n 'v': 0.8004103899375995,\n 'f': \"0.8004103899375995\",\n },\n{\n 'v': 0.06615669489785923,\n 'f': \"0.06615669489785923\",\n },\n{\n 'v': 0.042649844747114904,\n 'f': \"0.042649844747114904\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.7637234952573063,\n 'f': \"0.7637234952573063\",\n }],\n [\"avg_discount\",\n{\n 'v': 0.14034535368095938,\n 'f': \"0.14034535368095938\",\n },\n{\n 'v': 0.13190609678166698,\n 'f': \"0.13190609678166698\",\n },\n{\n 'v': 0.013436941552207978,\n 'f': \"0.013436941552207978\",\n },\n{\n 'v': 0.6748408281183387,\n 'f': \"0.6748408281183387\",\n },\n{\n 'v': -0.17021175305775815,\n 'f': \"-0.17021175305775815\",\n },\n{\n 'v': -0.2491587821505684,\n 'f': \"-0.2491587821505684\",\n },\n{\n 'v': 0.7637234952573063,\n 'f': \"0.7637234952573063\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n }]],\n columns: [[\"string\", \"index\"], [\"number\", \"sold_units\"], [\"number\", \"sold_value_loc\"], [\"number\", \"week\"], [\"number\", \"year\"], [\"number\", \"estimated_price\"], [\"number\", \"seasonality_index\"], [\"number\", \"price_range\"], [\"number\", \"avg_discount\"]],\n columnOptions: [{\"width\": \"1px\", \"className\": \"index_column\"}],\n rowsPerPage: 25,\n helpUrl: \"https://colab.research.google.com/notebooks/data_table.ipynb\",\n suppressOutputScrolling: true,\n minimumWidth: undefined,\n });\n\n function appendQuickchartButton(parentElement) {\n let quickchartButtonContainerElement = document.createElement('div');\n quickchartButtonContainerElement.innerHTML = `\n
\n \n \n\n\n \n
`;\n parentElement.appendChild(quickchartButtonContainerElement);\n }\n\n appendQuickchartButton(table);\n " + }, + "metadata": {}, + "execution_count": 129 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_m = data.copy()\n", + "data_m['is_promo'] = data_m['is_promo'].astype(int)" + ], + "metadata": { + "id": "Sid6m_40GmhE" + }, + "execution_count": 134, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "data_m['is_promo']" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4heJlR2KWS__", + "outputId": "7a1a489b-14ae-4d97-fa58-f0a4d3b80268" + }, + "execution_count": 135, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "19 0\n", + "87 0\n", + "100 0\n", + "2 0\n", + "104 0\n", + " ..\n", + "194 1\n", + "214 1\n", + "219 1\n", + "157 1\n", + "221 1\n", + "Name: is_promo, Length: 221, dtype: int64" + ] + }, + "metadata": {}, + "execution_count": 135 + } + ] + }, + { + "cell_type": "code", + "source": [ + "numeric_data = data_m.select_dtypes(include=[np.number])\n", + "numeric_data.corr()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 327 + }, + "id": "mBzD6fd_GoBp", + "outputId": "027b6fc2-aa0f-4f59-cab0-41c74aa7280e" + }, + "execution_count": 136, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " sold_units sold_value_loc is_promo week year \\\n", + "sold_units 1.000000 0.944361 0.045855 0.211422 0.004811 \n", + "sold_value_loc 0.944361 1.000000 0.091183 0.258911 0.111751 \n", + "is_promo 0.045855 0.091183 1.000000 -0.115425 0.807171 \n", + "week 0.211422 0.258911 -0.115425 1.000000 -0.151650 \n", + "year 0.004811 0.111751 0.807171 -0.151650 1.000000 \n", + "estimated_price -0.422645 -0.183349 0.028254 0.035787 0.252688 \n", + "seasonality_index -0.118065 -0.019144 -0.005762 0.034865 0.142106 \n", + "price_range 0.026121 0.080321 0.994141 -0.133266 0.800410 \n", + "avg_discount 0.140345 0.131906 0.828608 0.013437 0.674841 \n", + "\n", + " estimated_price seasonality_index price_range \\\n", + "sold_units -0.422645 -0.118065 0.026121 \n", + "sold_value_loc -0.183349 -0.019144 0.080321 \n", + "is_promo 0.028254 -0.005762 0.994141 \n", + "week 0.035787 0.034865 -0.133266 \n", + "year 0.252688 0.142106 0.800410 \n", + "estimated_price 1.000000 0.367248 0.066157 \n", + "seasonality_index 0.367248 1.000000 0.042650 \n", + "price_range 0.066157 0.042650 1.000000 \n", + "avg_discount -0.170212 -0.249159 0.763723 \n", + "\n", + " avg_discount \n", + "sold_units 0.140345 \n", + "sold_value_loc 0.131906 \n", + "is_promo 0.828608 \n", + "week 0.013437 \n", + "year 0.674841 \n", + "estimated_price -0.170212 \n", + "seasonality_index -0.249159 \n", + "price_range 0.763723 \n", + "avg_discount 1.000000 " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sold_unitssold_value_locis_promoweekyearestimated_priceseasonality_indexprice_rangeavg_discount
sold_units1.0000000.9443610.0458550.2114220.004811-0.422645-0.1180650.0261210.140345
sold_value_loc0.9443611.0000000.0911830.2589110.111751-0.183349-0.0191440.0803210.131906
is_promo0.0458550.0911831.000000-0.1154250.8071710.028254-0.0057620.9941410.828608
week0.2114220.258911-0.1154251.000000-0.1516500.0357870.034865-0.1332660.013437
year0.0048110.1117510.807171-0.1516501.0000000.2526880.1421060.8004100.674841
estimated_price-0.422645-0.1833490.0282540.0357870.2526881.0000000.3672480.066157-0.170212
seasonality_index-0.118065-0.019144-0.0057620.0348650.1421060.3672481.0000000.042650-0.249159
price_range0.0261210.0803210.994141-0.1332660.8004100.0661570.0426501.0000000.763723
avg_discount0.1403450.1319060.8286080.0134370.674841-0.170212-0.2491590.7637231.000000
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "summary": "{\n \"name\": \"numeric_data\",\n \"rows\": 9,\n \"fields\": [\n {\n \"column\": \"sold_units\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.471512592479754,\n \"min\": -0.4226451087816284,\n \"max\": 1.0,\n \"num_unique_values\": 9,\n \"samples\": [\n 0.02612078162297054,\n 0.9443610806535778,\n -0.4226451087816284\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"sold_value_loc\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.41667730396317654,\n \"min\": -0.18334899267452595,\n \"max\": 1.0,\n \"num_unique_values\": 9,\n \"samples\": [\n 0.08032131932811594,\n 1.0,\n -0.18334899267452595\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"is_promo\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.4810372736083687,\n \"min\": -0.11542498611109206,\n \"max\": 1.0,\n \"num_unique_values\": 9,\n \"samples\": [\n 0.9941409090742627,\n 0.09118259745972261,\n 0.02825446618602065\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"week\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.3571593044647669,\n \"min\": -0.1516499673566177,\n \"max\": 1.0,\n \"num_unique_values\": 9,\n \"samples\": [\n -0.13326572359457264,\n 0.25891119246584204,\n 0.035787198071794646\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"year\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.4173198850534921,\n \"min\": -0.1516499673566177,\n \"max\": 1.0,\n \"num_unique_values\": 9,\n \"samples\": [\n 0.8004103899375995,\n 0.11175126448087695,\n 0.2526878486011723\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estimated_price\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.40942079207200854,\n \"min\": -0.4226451087816284,\n \"max\": 1.0,\n \"num_unique_values\": 9,\n \"samples\": [\n 0.06615669489785923,\n -0.18334899267452595,\n 1.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"seasonality_index\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.3667286130380635,\n \"min\": -0.2491587821505684,\n \"max\": 1.0,\n \"num_unique_values\": 9,\n \"samples\": [\n 0.042649844747114904,\n -0.01914421524945657,\n 0.3672484754756403\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_range\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.47049834642053207,\n \"min\": -0.13326572359457264,\n \"max\": 1.0,\n \"num_unique_values\": 9,\n \"samples\": [\n 1.0,\n 0.08032131932811594,\n 0.06615669489785923\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_discount\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.4693919639220586,\n \"min\": -0.2491587821505684,\n \"max\": 1.0,\n \"num_unique_values\": 9,\n \"samples\": [\n 0.7637234952573063,\n 0.13190609678166698,\n -0.17021175305775815\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + }, + "application/vnd.google.colaboratory.module+javascript": "\n import \"https://ssl.gstatic.com/colaboratory/data_table/881c4a0d49046431/data_table.js\";\n\n const table = window.createDataTable({\n data: [[\"sold_units\",\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.9443610806535778,\n 'f': \"0.9443610806535778\",\n },\n{\n 'v': 0.045855372006394196,\n 'f': \"0.045855372006394196\",\n },\n{\n 'v': 0.21142201657479795,\n 'f': \"0.21142201657479795\",\n },\n{\n 'v': 0.004810674814255355,\n 'f': \"0.004810674814255355\",\n },\n{\n 'v': -0.4226451087816284,\n 'f': \"-0.4226451087816284\",\n },\n{\n 'v': -0.11806497729761947,\n 'f': \"-0.11806497729761947\",\n },\n{\n 'v': 0.02612078162297054,\n 'f': \"0.02612078162297054\",\n },\n{\n 'v': 0.14034535368095938,\n 'f': \"0.14034535368095938\",\n }],\n [\"sold_value_loc\",\n{\n 'v': 0.9443610806535778,\n 'f': \"0.9443610806535778\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.09118259745972261,\n 'f': \"0.09118259745972261\",\n },\n{\n 'v': 0.25891119246584204,\n 'f': \"0.25891119246584204\",\n },\n{\n 'v': 0.11175126448087695,\n 'f': \"0.11175126448087695\",\n },\n{\n 'v': -0.18334899267452595,\n 'f': \"-0.18334899267452595\",\n },\n{\n 'v': -0.01914421524945657,\n 'f': \"-0.01914421524945657\",\n },\n{\n 'v': 0.08032131932811594,\n 'f': \"0.08032131932811594\",\n },\n{\n 'v': 0.13190609678166698,\n 'f': \"0.13190609678166698\",\n }],\n [\"is_promo\",\n{\n 'v': 0.045855372006394196,\n 'f': \"0.045855372006394196\",\n },\n{\n 'v': 0.09118259745972261,\n 'f': \"0.09118259745972261\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': -0.11542498611109206,\n 'f': \"-0.11542498611109206\",\n },\n{\n 'v': 0.8071711853371548,\n 'f': \"0.8071711853371548\",\n },\n{\n 'v': 0.02825446618602065,\n 'f': \"0.02825446618602065\",\n },\n{\n 'v': -0.0057617809332895144,\n 'f': \"-0.0057617809332895144\",\n },\n{\n 'v': 0.9941409090742627,\n 'f': \"0.9941409090742627\",\n },\n{\n 'v': 0.8286082837650001,\n 'f': \"0.8286082837650001\",\n }],\n [\"week\",\n{\n 'v': 0.21142201657479795,\n 'f': \"0.21142201657479795\",\n },\n{\n 'v': 0.25891119246584204,\n 'f': \"0.25891119246584204\",\n },\n{\n 'v': -0.11542498611109206,\n 'f': \"-0.11542498611109206\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': -0.1516499673566177,\n 'f': \"-0.1516499673566177\",\n },\n{\n 'v': 0.035787198071794646,\n 'f': \"0.035787198071794646\",\n },\n{\n 'v': 0.03486484688604691,\n 'f': \"0.03486484688604691\",\n },\n{\n 'v': -0.13326572359457264,\n 'f': \"-0.13326572359457264\",\n },\n{\n 'v': 0.013436941552207978,\n 'f': \"0.013436941552207978\",\n }],\n [\"year\",\n{\n 'v': 0.004810674814255355,\n 'f': \"0.004810674814255355\",\n },\n{\n 'v': 0.11175126448087695,\n 'f': \"0.11175126448087695\",\n },\n{\n 'v': 0.8071711853371548,\n 'f': \"0.8071711853371548\",\n },\n{\n 'v': -0.1516499673566177,\n 'f': \"-0.1516499673566177\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.2526878486011723,\n 'f': \"0.2526878486011723\",\n },\n{\n 'v': 0.1421057200934621,\n 'f': \"0.1421057200934621\",\n },\n{\n 'v': 0.8004103899375995,\n 'f': \"0.8004103899375995\",\n },\n{\n 'v': 0.6748408281183387,\n 'f': \"0.6748408281183387\",\n }],\n [\"estimated_price\",\n{\n 'v': -0.4226451087816284,\n 'f': \"-0.4226451087816284\",\n },\n{\n 'v': -0.18334899267452595,\n 'f': \"-0.18334899267452595\",\n },\n{\n 'v': 0.02825446618602065,\n 'f': \"0.02825446618602065\",\n },\n{\n 'v': 0.035787198071794646,\n 'f': \"0.035787198071794646\",\n },\n{\n 'v': 0.2526878486011723,\n 'f': \"0.2526878486011723\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.3672484754756403,\n 'f': \"0.3672484754756403\",\n },\n{\n 'v': 0.06615669489785923,\n 'f': \"0.06615669489785923\",\n },\n{\n 'v': -0.17021175305775815,\n 'f': \"-0.17021175305775815\",\n }],\n [\"seasonality_index\",\n{\n 'v': -0.11806497729761947,\n 'f': \"-0.11806497729761947\",\n },\n{\n 'v': -0.01914421524945657,\n 'f': \"-0.01914421524945657\",\n },\n{\n 'v': -0.0057617809332895144,\n 'f': \"-0.0057617809332895144\",\n },\n{\n 'v': 0.03486484688604691,\n 'f': \"0.03486484688604691\",\n },\n{\n 'v': 0.1421057200934621,\n 'f': \"0.1421057200934621\",\n },\n{\n 'v': 0.3672484754756403,\n 'f': \"0.3672484754756403\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.042649844747114904,\n 'f': \"0.042649844747114904\",\n },\n{\n 'v': -0.2491587821505684,\n 'f': \"-0.2491587821505684\",\n }],\n [\"price_range\",\n{\n 'v': 0.02612078162297054,\n 'f': \"0.02612078162297054\",\n },\n{\n 'v': 0.08032131932811594,\n 'f': \"0.08032131932811594\",\n },\n{\n 'v': 0.9941409090742627,\n 'f': \"0.9941409090742627\",\n },\n{\n 'v': -0.13326572359457264,\n 'f': \"-0.13326572359457264\",\n },\n{\n 'v': 0.8004103899375995,\n 'f': \"0.8004103899375995\",\n },\n{\n 'v': 0.06615669489785923,\n 'f': \"0.06615669489785923\",\n },\n{\n 'v': 0.042649844747114904,\n 'f': \"0.042649844747114904\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n },\n{\n 'v': 0.7637234952573063,\n 'f': \"0.7637234952573063\",\n }],\n [\"avg_discount\",\n{\n 'v': 0.14034535368095938,\n 'f': \"0.14034535368095938\",\n },\n{\n 'v': 0.13190609678166698,\n 'f': \"0.13190609678166698\",\n },\n{\n 'v': 0.8286082837650001,\n 'f': \"0.8286082837650001\",\n },\n{\n 'v': 0.013436941552207978,\n 'f': \"0.013436941552207978\",\n },\n{\n 'v': 0.6748408281183387,\n 'f': \"0.6748408281183387\",\n },\n{\n 'v': -0.17021175305775815,\n 'f': \"-0.17021175305775815\",\n },\n{\n 'v': -0.2491587821505684,\n 'f': \"-0.2491587821505684\",\n },\n{\n 'v': 0.7637234952573063,\n 'f': \"0.7637234952573063\",\n },\n{\n 'v': 1.0,\n 'f': \"1.0\",\n }]],\n columns: [[\"string\", \"index\"], [\"number\", \"sold_units\"], [\"number\", \"sold_value_loc\"], [\"number\", \"is_promo\"], [\"number\", \"week\"], [\"number\", \"year\"], [\"number\", \"estimated_price\"], [\"number\", \"seasonality_index\"], [\"number\", \"price_range\"], [\"number\", \"avg_discount\"]],\n columnOptions: [{\"width\": \"1px\", \"className\": \"index_column\"}],\n rowsPerPage: 25,\n helpUrl: \"https://colab.research.google.com/notebooks/data_table.ipynb\",\n suppressOutputScrolling: true,\n minimumWidth: undefined,\n });\n\n function appendQuickchartButton(parentElement) {\n let quickchartButtonContainerElement = document.createElement('div');\n quickchartButtonContainerElement.innerHTML = `\n
\n \n \n\n\n \n
`;\n parentElement.appendChild(quickchartButtonContainerElement);\n }\n\n appendQuickchartButton(table);\n " + }, + "metadata": {}, + "execution_count": 136 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_m.info()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4iRzxP-aWPc0", + "outputId": "869ba581-da9b-4b9c-d45b-596843678a95" + }, + "execution_count": 137, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Index: 221 entries, 19 to 221\n", + "Data columns (total 12 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 sold_units 221 non-null float64\n", + " 1 sold_value_loc 221 non-null float64\n", + " 2 end_date 221 non-null dbdate \n", + " 3 is_promo 221 non-null int64 \n", + " 4 week 221 non-null Int64 \n", + " 5 year 221 non-null Int64 \n", + " 6 estimated_price 221 non-null float64\n", + " 7 seasonality_index 221 non-null float64\n", + " 8 price_range 221 non-null float64\n", + " 9 tactic 221 non-null object \n", + " 10 sub_tactic 221 non-null object \n", + " 11 avg_discount 221 non-null float64\n", + "dtypes: Int64(2), dbdate(1), float64(6), int64(1), object(2)\n", + "memory usage: 22.9+ KB\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "sold_unit, end_date, /estimated_price, seasonality_index, avg_discount, sub_tactic" + ], + "metadata": { + "id": "5Y5rsrJnWxDc" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Plot.ipynb b/Plot.ipynb new file mode 100644 index 0000000..7f50f1c --- /dev/null +++ b/Plot.ipynb @@ -0,0 +1,510 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "import argparse\n", + "\n", + "import torch\n", + "\n", + "from accelerate import Accelerator, DeepSpeedPlugin\n", + "\n", + "from accelerate import DistributedDataParallelKwargs\n", + "\n", + "from torch import nn, optim\n", + "\n", + "from torch.optim import lr_scheduler\n", + "\n", + "from tqdm import tqdm\n", + "\n", + "\n", + "\n", + "from models import Autoformer, DLinear, TimeLLM\n", + "\n", + "\n", + "\n", + "from data_provider.data_factory import data_provider\n", + "\n", + "import time\n", + "\n", + "import random\n", + "\n", + "import numpy as np\n", + "\n", + "import os\n", + "\n", + "\n", + "\n", + "os.environ['CURL_CA_BUNDLE'] = ''\n", + "\n", + "os.environ[\"PYTORCH_CUDA_ALLOC_CONF\"] = \"max_split_size_mb:64\"\n", + "\n", + "\n", + "\n", + "from utils.tools import del_files, EarlyStopping, adjust_learning_rate, vali, load_content\n", + "\n", + "\n", + "fix_seed = 2021\n", + "\n", + "random.seed(fix_seed)\n", + "\n", + "torch.manual_seed(fix_seed)\n", + "\n", + "np.random.seed(fix_seed)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "ddp_kwargs = DistributedDataParallelKwargs(find_unused_parameters=True)\n", + "\n", + "deepspeed_plugin = DeepSpeedPlugin(hf_ds_config='./ds_config_zero2.json')\n", + "\n", + "accelerator = Accelerator(kwargs_handlers=[ddp_kwargs], deepspeed_plugin=deepspeed_plugin)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "from torch.utils.data import Dataset\n", + "from sklearn.preprocessing import StandardScaler\n", + "from models import TimeLLM\n", + "from data_provider.data_factory import data_provider\n", + "import time" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "import torch" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "class Args:\n", + " def __init__(self):\n", + " self.task_name = 'long_term_forecast'\n", + " self.is_training = 1\n", + " self.model_id = 'EAN_512_96'\n", + " self.model_comment = 'TimeLLM-EAN'\n", + " self.model = 'TimeLLM'\n", + " self.seed = 2021\n", + " self.data = 'ean'\n", + " self.root_path = './dataset'\n", + " self.data_path = 'data.csv'\n", + " self.features = 'S'\n", + " self.target = 'sold_units'\n", + " self.loader = 'modal'\n", + " self.freq = 'h'\n", + " self.checkpoints = './checkpoints/'\n", + " self.seq_len = 13\n", + " self.label_len = 1\n", + " self.pred_len = 1\n", + " self.seasonal_patterns = 'Monthly'\n", + " self.enc_in = 9\n", + " self.dec_in = 9\n", + " self.c_out = 9\n", + " self.d_model = 32\n", + " self.n_heads = 8 # Typically set by your model configuration\n", + " self.e_layers = 2 # Typically set by your model configuration\n", + " self.d_layers = 1 # Typically set by your model configuration\n", + " self.d_ff = 128\n", + " self.moving_avg = 25 # Assume default if not specified in the script\n", + " self.factor = 3\n", + " self.dropout = 0.1 # Assume default if not specified\n", + " self.embed = 'timeF' # Assume default if not specified\n", + " self.activation = 'gelu' # Assume default if not specified\n", + " self.output_attention = False # Assume default if not specified\n", + " self.patch_len = 16 # Assume default if not specified\n", + " self.stride = 8 # Assume default if not specified\n", + " self.prompt_domain = 0 # Assume default if not specified\n", + " self.llm_model = 'GPT2'\n", + " self.llm_dim = 768\n", + " self.num_workers = 10 # Default setting\n", + " self.itr = 1\n", + " self.train_epochs = 2\n", + " self.align_epochs = 10 # Assume default if not specified\n", + " self.batch_size = 7\n", + " self.eval_batch_size = 8 # Assume default if not specified\n", + " self.patience = 10 # Assume default if not specified\n", + " self.learning_rate = 0.001\n", + " self.des = 'Exp'\n", + " self.loss = 'MSE' # Assume default if not specified\n", + " self.lradj = 'type1' # Assume default if not specified\n", + " self.pct_start = 0.2 # Assume default if not specified\n", + " self.use_amp = False # Assume default based on your environment capabilities\n", + " self.llm_layers = 32\n", + " self.percent = 100 # Assume default if not specified\n", + "\n", + "# Instantiate the Args\n", + "args = Args()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "path = 'checkpoints/long_term_forecast_EAN_512_96_TimeLLM_ean_ftS_sl13_ll1_pl1_dm32_nh8_el2_dl1_df128_fc3_ebtimeF_Exp_0-TimeLLM-EAN/checkpoint'\n", + "\n", + "# Load the checkpoint\n", + "checkpoint = torch.load(path)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "model = TimeLLM.Model(args).float()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.load_state_dict(torch.load(path), strict=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Model(\n", + " (llm_model): GPT2Model(\n", + " (wte): Embedding(50257, 768)\n", + " (wpe): Embedding(1024, 768)\n", + " (drop): Dropout(p=0.1, inplace=False)\n", + " (h): ModuleList(\n", + " (0-31): 32 x GPT2Block(\n", + " (ln_1): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n", + " (attn): GPT2Attention(\n", + " (c_attn): Conv1D()\n", + " (c_proj): Conv1D()\n", + " (attn_dropout): Dropout(p=0.1, inplace=False)\n", + " (resid_dropout): Dropout(p=0.1, inplace=False)\n", + " )\n", + " (ln_2): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n", + " (mlp): GPT2MLP(\n", + " (c_fc): Conv1D()\n", + " (c_proj): Conv1D()\n", + " (act): NewGELUActivation()\n", + " (dropout): Dropout(p=0.1, inplace=False)\n", + " )\n", + " )\n", + " )\n", + " (ln_f): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n", + " )\n", + " (dropout): Dropout(p=0.1, inplace=False)\n", + " (patch_embedding): PatchEmbedding(\n", + " (padding_patch_layer): ReplicationPad1d()\n", + " (value_embedding): TokenEmbedding(\n", + " (tokenConv): Conv1d(16, 32, kernel_size=(3,), stride=(1,), padding=(1,), bias=False, padding_mode=circular)\n", + " )\n", + " (dropout): Dropout(p=0.1, inplace=False)\n", + " )\n", + " (mapping_layer): Linear(in_features=50257, out_features=1000, bias=True)\n", + " (reprogramming_layer): ReprogrammingLayer(\n", + " (query_projection): Linear(in_features=32, out_features=1024, bias=True)\n", + " (key_projection): Linear(in_features=768, out_features=1024, bias=True)\n", + " (value_projection): Linear(in_features=768, out_features=1024, bias=True)\n", + " (out_projection): Linear(in_features=1024, out_features=768, bias=True)\n", + " (dropout): Dropout(p=0.1, inplace=False)\n", + " )\n", + " (output_projection): FlattenHead(\n", + " (flatten): Flatten(start_dim=-2, end_dim=-1)\n", + " (linear): Linear(in_features=128, out_features=1, bias=True)\n", + " (dropout): Dropout(p=0.1, inplace=False)\n", + " )\n", + " (normalize_layers): Normalize()\n", + ")" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Set the model to evaluation mode\n", + "\n", + "model.eval()" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "train_data, train_loader = data_provider(args, 'train')\n", + "\n", + "vali_data, vali_loader = data_provider(args, 'val')\n", + "\n", + "test_data, test_loader = data_provider(args, 'test')\n", + "\n", + "\n", + "\n", + "time_now = time.time()\n", + "\n", + "\n", + "\n", + "train_steps = len(train_loader)\n", + "\n", + "early_stopping = EarlyStopping(accelerator=accelerator, patience=args.patience)\n", + "\n", + "\n", + "\n", + "trained_parameters = []\n", + "\n", + "for p in model.parameters():\n", + "\n", + " if p.requires_grad is True:\n", + "\n", + " trained_parameters.append(p)\n", + "\n", + "\n", + "\n", + "model_optim = optim.Adam(trained_parameters, lr=args.learning_rate)\n", + "\n", + "\n", + "\n", + "if args.lradj == 'COS':\n", + "\n", + " scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(model_optim, T_max=20, eta_min=1e-8)\n", + "\n", + "else:\n", + "\n", + " scheduler = lr_scheduler.OneCycleLR(optimizer=model_optim,\n", + "\n", + " steps_per_epoch=train_steps,\n", + "\n", + " pct_start=args.pct_start,\n", + "\n", + " epochs=args.train_epochs,\n", + "\n", + " max_lr=args.learning_rate)\n", + "\n", + "\n", + "\n", + "train_loader, vali_loader, test_loader, model, model_optim, scheduler = accelerator.prepare(\n", + "\n", + " train_loader, vali_loader, test_loader, model, model_optim, scheduler)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'list' object has no attribute 'shape'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/home/user/Time-LLM/explore_model.ipynb Cell 11\u001b[0m line \u001b[0;36m2\n\u001b[1;32m 1\u001b[0m \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m test_loader:\n\u001b[0;32m----> 2\u001b[0m \u001b[39mprint\u001b[39m(i\u001b[39m.\u001b[39;49mshape)\n", + "\u001b[0;31mAttributeError\u001b[0m: 'list' object has no attribute 'shape'" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [], + "source": [ + "from torch.cuda.amp import autocast, GradScaler\n", + "\n", + "# Setup scaler for managing precision\n", + "scaler = GradScaler()\n", + "predictions = list()\n", + "true_labels = list()\n", + "with torch.no_grad(): # No need to compute gradients during inference\n", + " for batch_x, batch_y, batch_x_mark, batch_y_mark in test_loader:\n", + " batch_x = batch_x.float().to(accelerator.device)\n", + " batch_y = batch_y.float().to(accelerator.device)\n", + " batch_x_mark = batch_x_mark.float().to(accelerator.device)\n", + " batch_y_mark = batch_y_mark.float().to(accelerator.device)\n", + "\n", + " # Prepare decoder input as zeros initially, similar to training phase setup\n", + " dec_inp = torch.zeros_like(batch_y[:, -args.pred_len:, :]).to(accelerator.device)\n", + " dec_inp = torch.cat([batch_y[:, :args.label_len, :], dec_inp], dim=1)\n", + "\n", + " # Using autocast for automatic mixed precision\n", + " with autocast():\n", + " if args.output_attention:\n", + " output, _ = model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n", + " else:\n", + " output = model(batch_x, batch_x_mark, dec_inp, batch_y_mark)\n", + "\n", + " output = output[:, -args.pred_len:, :] # Adjust based on the output dimensions if needed\n", + "\n", + " predictions.append(output.cpu().numpy())\n", + " true_labels.append(batch_y[:, -args.pred_len:, :].cpu().numpy())\n", + "# Convert list of arrays to a single numpy array\n", + "predictions = np.concatenate(predictions, axis=0)\n", + "true_labels = np.concatenate(true_labels, axis=0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[143.],\n", + " [238.],\n", + " [190.],\n", + " [145.],\n", + " [126.],\n", + " [198.],\n", + " [149.]], dtype=float32)" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "true_labels[:,0]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([190.], dtype=float32)" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "true_labels[0,2,0]" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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zuHDh/n7778f67lFRMSx2ezqciIiIiLilBo3bsxff/0VvduAiIi4Hq1pFxEREXECt27dinX96NGj/PTTT1SrVs2agkREJEVopF1ERETECeTKlYu2bdtSsGBBTp06xZQpUwgNDeXAgQMUKVLE6vJERCSZaE27iIiIiBOoW7cu33//PRcuXMDT05OKFSsyatQoBXYRERenkXYRERERERERB6U17SIiIiIiIiIOSqFdRERERERExEFpTTsQFRXF+fPn8fHxwWazWV2OiIiIiIiIuDi73c6NGzfInTs3bm4PHk9XaAfOnz9Pvnz5rC5DREREREREUpkzZ86QN2/eB96v0A74+PgA5pvl6+trcTUiIiIiIiLi6oKCgsiXL190Hn0QhXaInhLv6+ur0C4iIiIiIiIp5lFLtNWITkRERERERMRBKbSLiIiIiIiIOCiFdhEREREREREHpTXtIiIiIiKSatntdiIiIoiMjLS6FHEx7u7upEmT5rG3FVdoFxERERGRVCksLIyAgABu3rxpdSniory9vcmVKxceHh6Jfg6FdhERERERSXWioqI4ceIE7u7u5M6dGw8Pj8ceERW5w263ExYWxuXLlzlx4gRFihTBzS1xq9MV2kVEREREJNUJCwsjKiqKfPny4e3tbXU54oK8vLxImzYtp06dIiwsjHTp0iXqedSITkREREREUq3Ejn6KxEdS/HzpJ1RERERERETEQSm0i4iIiIiIiDgohXYRERERERFJMjabjeXLl1tdhstQaBcREREREXFCO3fuxN3dnfr16yf4a/39/ZkwYULSFxUPbdu2xWazYbPZSJs2LTly5KBWrVrMmDGDqKioBD3XrFmzyJgxY/IU6iAU2kVERERERJzQ9OnT6dGjB1u3buX8+fNWl5MgdevWJSAggJMnT7JmzRqqV69Or169aNCgAREREVaX51AU2kVERERERAC7HUJCrLnY7QmrNTg4mIULF9KlSxfq16/PrFmz7nvMqlWreO6550iXLh1Zs2alSZMmAFSrVo1Tp07Rp0+f6BFvgKFDh1KmTJlYzzFhwgT8/f2jr+/Zs4datWqRNWtW/Pz8qFq1Kvv3709Y8YCnpyc5c+YkT548PPvsswwaNIgVK1awZs2aWO9l/PjxlCxZkvTp05MvXz66du1KcHAwAJs3b6Zdu3YEBgZGv4+hQ4cCMGfOHMqVK4ePjw85c+bkjTfe4NKlSwmu0xEotIuIiIiIiAA3b0KGDNZcbt5MWK2LFi3iySefpFixYrz55pvMmDED+13J/8cff6RJkybUq1ePAwcO8Msvv/D8888DsHTpUvLmzcvw4cMJCAggICAg3q9748YN2rRpw/bt29m1axdFihShXr163LhxI2FvIA41atSgdOnSLF26NPo2Nzc3Jk2axF9//cXs2bPZuHEj7733HgAvvPACEyZMwNfXN/p99O/fH4Dw8HBGjBjB77//zvLlyzl58iRt27Z97BqtkMbqAkRERERERCRhpk+fzptvvgmYqeaBgYFs2bKFatWqATBy5EhatmzJsGHDor+mdOnSAGTOnBl3d/foUeiEqFGjRqzr06ZNI2PGjGzZsoUGDRo8xjsynnzySf7444/o6717944+9vf35+OPP6Zz58589dVXeHh44Ofnh81mu+99vP3229HHBQsWZNKkSTz33HMEBweTIUOGx64zJSm0i7iwv/+GbNkgSxarKxERERFxfN7e8P8zry157fg6cuQIv/32G8uWLQMgTZo0tGjRgunTp0eH9oMHD9KhQ4ckr/PixYt8+OGHbN68mUuXLhEZGcnNmzc5ffp0kjy/3W6Pnq4PsGHDBkaPHs3ff/9NUFAQERER3L59m5s3b+L9kG/avn37GDp0KL///jvXrl2LbnB3+vRpihcvniS1phSFdhEXtXUr1KgBvr6wbBlUrWp1RSIiIiKOzWaD9OmtruLRpk+fTkREBLlz546+zW634+npyRdffIGfnx9eXl4Jfl43N7dYU+zBTDO/W5s2bfjvv/+YOHEiTzzxBJ6enlSsWJGwsLDEvZl7HD58mAIFCgBw8uRJGjRoQJcuXRg5ciSZM2dm+/bttG/fnrCwsAeG9pCQEOrUqUOdOnWYN28e2bJl4/Tp09SpUyfJ6kxJWtMu4oIiIqB7d4iMhGvXoFYtmDPH6qpERERE5HFFRETw3XffMW7cOA4ePBh9+f3338mdOzfff/89AKVKleKXX3554PN4eHgQGRkZ67Zs2bJx4cKFWMH94MGDsR7z66+/0rNnT+rVq8fTTz+Np6cnV65cSZL3tnHjRv7880+aNWsGmNHyqKgoxo0bR4UKFShatOh9XfLjeh9///03//33H2PGjKFy5co8+eSTTtuEDhTaRVzS11/Dn39C5szQtCmE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8S++gB49zFmCn36COnVS8MVFROLmFNPjEyowMBCbzUbGjBlj3T5mzBiyZMnCM888w6effkpERMRDnyc0NJSgoKBYFxERERFJPp6eZkr82LEpHNjBbALfvr1ZfN+yZex960REHFyaRz/EMdy+fZsBAwbw+uuvxzoL0bNnT5599lkyZ87Mjh07GDhwIAEBAYwfP/6BzzV69GiGDRuWEmWLiIiIiNVsNvjyS/jf/2DnTrOP+65dZp86EREH5xTT48PDw2nWrBlnz55l8+bND506MGPGDDp16kRwcDCenp5xPiY0NJTQ0NDo60FBQeTLl0/T40VERERcWUAAPPec6Zb3yiuwfHkKLKwXEYmby0yPDw8Pp3nz5pw6dYr169c/MlSXL1+eiIgITp48+cDHeHp64uvrG+siIiIiIi4uVy5YtszM1V+1CoYMsboiEZFHcujQfiewHz16lA0bNpAlS5ZHfs3Bgwdxc3Mje/bsKVChiIiIiDiV556DadPM8ccfm+7yIiIOzNI17cHBwRw7diz6+okTJzh48CCZM2cmV65cvPrqq+zfv5/Vq1cTGRnJhQsXAMicOTMeHh7s3LmT3bt3U716dXx8fNi5cyd9+vThzTffJFOmTFa9LRERERFxZK1bw++/w/jx0KYNFC0KpUpZXZWISJwsXdO+efNmqlevft/tbdq0YejQoRQoUCDOr9u0aRPVqlVj//79dO3alb///pvQ0FAKFCjAW2+9Rd++fR+4nj0u2vJNREREJJWJiIB69WD9erOf+549kDWr1VWJSCoS3xzqMI3orKTQLiIiIpIKXb1qpsv/+y9Urw7r1kHatFZXJSKphMs0ohMRERERSRaZM8PKlZAhA2zaBP37W12RiMh9FNpFREREJPV6+mmYM8ccT5oEM2ZYW4+IyD0U2kVEREQkdWvcGIYNM8ddusCuXZaWIyJyN4V2EREREZEPP4QmTSAsDJo2hfPnra5IRARQaBcRERERATc3mD0bSpSAgAAT4G/ftroqERGFdhERERERAHx8YMUK06Dut9+gc2fQRksiYjGFdhERERGROwoWhEWLwN3djLxPnGh1RSKSyim0i4iIiIjc7aWX4LPPzHH//rBhg7X1iEiqptAuIiIiInKvXr2gTRuIjITmzeH4casrEpFUSqFdREREROReNhtMnQrPPw/XrkGjRnDjhtVViUgqpNAuIiIiIhKXdOlg2TLIlQv++suMvEdFWV2ViKQyCu0iIiIiIg+SOzcsXQoeHibAf/yx1RWJSCqj0C4iIiIi8jAVKpip8gBDhsDy5ZaWIyKpi0K7iIiIiMijtGsHPXua47fegkOHrK1HRFINhXYRERERkfj47DOoUQOCg01juqtXra5IRFIBhXYRERERkfhImxYWLgR/f/j3X2jZEiIirK5KRFycQruIiIiISHxlzQorVoC3N6xfDwMGWF2RiLg4hXYRERERkYQoVQq++84cjx8fcywikgwU2kVEREREEqpZMxg82Bx37Ai//WZtPSLishTaRUREREQSY+hQaNgQQkOhSRMICLC6IhFxQQrtIiIiIiKJ4eYGc+bAU0/B+fNm9D001OqqRMTFKLSLiIiIiCSWr69pTJcxI+zcCd26gd1udVUi4kIU2kVEREREHkeRIrBggRl5nz4dvvzS6opExIUotIuIiIiIPK46dWDsWHPcuzds3mxlNSLiQhTaRURERESSQt++8OabEBkJr74KJ09aXZGIuACFdhERERGRpGCzwbRpULYs/PcfNGoEISFWVyUiTk6hXUREREQkqXh5wfLlkCMH/PEHtGunxnQi8lgU2kVEREREklLevLBkCaRNC4sXw+jRVlckIk5MoV1EREREJKlVqhTTRf7DD2HVKmvrERGnpdAuIiIiIpIcOnSArl3N9PhWreDwYasrEhEnpNAuIiIiIpJcJkyAKlXgxg3TmO76dasrEhEno9AuIiIiIpJc0qaFH36A/Pnh6FF4/XWzJZyISDwptIuIiIiIJKds2WDFCtNZfu1aGDTI6opExIkotIuIiIiIJLcyZWDmTHM8dizMn29pOSLiPBTaRURERERSQosWMHCgOW7fHvbts7YeEXEKCu0iIiIiIillxAioXx9u34bGjeHiRasrEhEHp9AuIiIiIpJS3N1h3jwoVgzOnoVXX4WwMKurEhEHptAuIiIiIpKS/PxMYzpfX9i+HXr2tLoiEXFgCu0iIiIiIimtWDH4/nuw2eDrr2HqVKsrEhEHpdAuIiIiImKFevVg9Ghz3KMHbNtmbT0i4pAU2kVERERErPLee9CyJUREQLNmcPq01RWJiINRaBcRERERsYrNBtOnwzPPwOXLpqP8zZtWVyUiDkShXURERETESt7esHw5ZMsGBw6YPdztdqurEhEHodAuIiIiImK1/Pnhhx8gTRpYsAA+/dTqikTEQSi0i4iIiIg4gipVYNIkc/z++/DTT9bWIyIOQaFdRERERMRRdO4MHTua6fFvvAFHjlhdkYhYTKFdRERERMRR2GwweTJUqgSBgdCokflTRFIthXYREREREUfi4QFLlkDevGakvVUriIy0uioRsYhCu4iIiIiIo8mRw3SUT5cOfvwRPvrI6opExCIK7SIiIiIijqhsWfj2W3M8ahQsXGhtPSJiCYV2ERERERFH1aoVvPuuOW7XDg4etLQcEUl5Cu0iIiIiIo5s9GioWxdu3YLGjeHyZasrEpEUZGlo37p1K6+88gq5c+fGZrOxfPnyWPfb7XY++ugjcuXKhZeXFzVr1uTo0aOxHnP16lVatWqFr68vGTNmpH379gQHB6fguxARERERSUbu7jB/PhQuDKdOwWuvQXi41VWJSAqxNLSHhIRQunRpvvzyyzjvHzt2LJMmTWLq1Kns3r2b9OnTU6dOHW7fvh39mFatWvHXX3+xfv16Vq9ezdatW+nYsWNKvQURERERkeSXKROsWAE+PrBlC/TpY3VFIpJCbHa73W51EQA2m41ly5bRuHFjwIyy586dm379+tG/f38AAgMDyZEjB7NmzaJly5YcPnyY4sWLs2fPHsqVKwfA2rVrqVevHmfPniV37tzxeu2goCD8/PwIDAzE19c3Wd6fiIiIiMhjW7XK7N1ut8M338A771hdkYgkUnxzqMOuaT9x4gQXLlygZs2a0bf5+flRvnx5du7cCcDOnTvJmDFjdGAHqFmzJm5ubuzevfuBzx0aGkpQUFCsi4iIiIiIw3vlFRgxwhx37Qo7dlhbj4gkO4cN7RcuXAAgR44csW7PkSNH9H0XLlwge/bsse5PkyYNmTNnjn5MXEaPHo2fn1/0JV++fElcvYiIiIhIMhk0CF591axrb9oUzp61uiIRSUYOG9qT08CBAwkMDIy+nDlzxuqSRERERETix2aDmTOhVCm4eBGaNDGd5UXEJTlsaM+ZMycAFy9ejHX7xYsXo+/LmTMnly5dinV/REQEV69ejX5MXDw9PfH19Y11ERERERFxGhkywPLlkCUL7N0LHTuade4i4nIcNrQXKFCAnDlz8ssvv0TfFhQUxO7du6lYsSIAFStW5Pr16+zbty/6MRs3biQqKory5cuneM0iIiIiIimmQAFYvNhsCTd3Lnz+udUViUgysDS0BwcHc/DgQQ4ePAiY5nMHDx7k9OnT2Gw2evfuzccff8zKlSv5888/ad26Nblz547uMP/UU09Rt25dOnTowG+//cavv/5K9+7dadmyZbw7x4uIiIiIOK3q1WPC+rvvws8/W1uPiCQ5S7d827x5M9WrV7/v9jZt2jBr1izsdjtDhgxh2rRpXL9+nRdffJGvvvqKokWLRj/26tWrdO/enVWrVuHm5kazZs2YNGkSGTJkiHcd2vJNRERERJyW3W62fpsxAzJmhD17oHBhq6sSkUeIbw51mH3araTQLiIiIiJOLTQUqlWDXbugeHHzp4+P1VWJyEM4/T7tIiIiIiIST56esHQp5M4N//sfvPUWREVZXZWIJAGFdhERERERV5ArFyxbZgL8ihUwbJjVFYlIElBoFxERERFxFc8/D9OmmePhw83ou4g4NYV2ERERERFX0ro19OkTc/znn9bWIyKPRaFdRERERMTVjB0LNWtCSAg0agT//Wd1RSKSSArtIiIiIiKuJk0aWLgQChaEEyegeXOIiLC6KhFJBIV2ERERERFXlDmzaUiXPj1s3Aj9+1tdkYgkgkK7iIiIiIirKlEC5swxxxMnwqxZlpYjIgmn0C4iIiIi4sqaNIGhQ81xp06we7el5YhIwii0i4iIiIi4usGDoXFjCAszIf78easrEpF4UmgXEREREXF1bm7w3Xfw9NMQEABNm8Lt21ZXJSLxoNAuIiIiIpIa+PiYxnSZMpkp8l26gN1udVUi8ggK7SIiIiIiqUWhQrBokRl5nzULJk+2uiIReQSFdhERERGR1KRmTfjsM3Pcty/88ou19YjIQym0i4iIiIikNr17Q+vWEBkJzZvDv/9aXZGIPIBCu4iIiIhIamOzwddfw3PPwdWrprN8cLDVVYlIHBTaRURERERSo3TpYNkyyJkT/vwT2raFqCirqxKReyi0i4iIiIikVnnywNKl4OEBS5bAyJFWVyQi91BoFxERERFJzSpWhClTzPFHH5lt4UTEYSi0i4iIiIikdm+/DT16mOM334S//rK2HhGJptAuIiIiIiIwbhxUr24a0jVqZBrUiYjlFNpFRERERATSpoVFi8DfH44fh5YtISLC6qpEUj2FdhERERERMbJmheXLwdsb1q+H99+3uiKRVE+hXUREREREYpQuDbNm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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "# Assuming predictions and true_labels are numpy arrays of the same shape\n", + "plt.figure(figsize=(12, 6))\n", + "plt.plot(true_labels[:, 0], label='Actual Data', color='blue') # Adjust indexing based on your data shape\n", + "plt.plot(predictions[:, 0], label='Predicted Data', color='red') # Adjust indexing based on your data shape\n", + "plt.title('Time Series Forecasting')\n", + "plt.xlabel('Time Steps')\n", + "plt.ylabel('Values')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "GPU", + "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.8.19" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/data_provider/data_factory.py b/data_provider/data_factory.py index c046f05..7143a26 100644 --- a/data_provider/data_factory.py +++ b/data_provider/data_factory.py @@ -1,4 +1,4 @@ -from data_provider.data_loader import Dataset_ETT_hour, Dataset_ETT_minute, Dataset_Custom, Dataset_M4 +from data_provider.data_loader import Dataset_ean, Dataset_ETT_hour, Dataset_ETT_minute, Dataset_Custom, Dataset_M4 from torch.utils.data import DataLoader data_dict = { @@ -10,6 +10,7 @@ 'Traffic': Dataset_Custom, 'Weather': Dataset_Custom, 'm4': Dataset_M4, + 'ean': Dataset_ean, } @@ -42,6 +43,7 @@ def data_provider(args, flag): freq=freq, seasonal_patterns=args.seasonal_patterns ) + else: data_set = Data( root_path=args.root_path, diff --git a/data_provider/data_loader.py b/data_provider/data_loader.py index a9a1569..b958404 100644 --- a/data_provider/data_loader.py +++ b/data_provider/data_loader.py @@ -10,6 +10,80 @@ warnings.filterwarnings('ignore') +class Dataset_ean(Dataset): + def __init__(self, root_path, flag='train', size=None, + features='S', data_path='data.csv', + target='sold_units', scale=False, timeenc=0, freq='W', percent=100, + seasonal_patterns=None): + if size is None: + self.seq_len = 13 # Use 0.25 year of data for sequence + self.label_len = 4 # Labels from last month + self.pred_len = 4 # Predict 1 month ahead + else: + self.seq_len, self.label_len, self.pred_len = size + + assert flag in ['train', 'test', 'val'] + self.set_type = {'train': 0, 'val': 1, 'test': 2}[flag] + + self.features = features + self.target = target + self.scale = scale + self.timeenc = timeenc + self.freq = freq + + self.root_path = root_path + self.data_path = data_path + self.__read_data__() + self.enc_in = self.data_x.shape[-1] + def __read_data__(self): + self.scaler = StandardScaler() + df_raw = pd.read_csv(os.path.join(self.root_path, self.data_path)) + df_raw.drop("Unnamed: 0", axis=1, inplace=True)# don't forget to remove this once regulated the data + num_weeks = len(df_raw) + num_train = int(num_weeks * 0.7) + num_val = int(num_weeks * 0.2) + num_test = num_weeks - num_train - num_val + + border1s = [0, num_train, num_train + num_val] + border2s = [num_train, num_train + num_val, num_weeks] + + border1 = border1s[self.set_type] + border2 = border2s[self.set_type] + + if self.scale: + train_data = df_raw.iloc[:num_train] + self.scaler.fit(train_data[[self.target]].values) + data = self.scaler.transform(df_raw[[self.target]].values) + else: + data = df_raw[[self.target]].values + + df_stamp = pd.to_datetime(df_raw.iloc[:, 0][border1:border2]) # 'end_date' is first column + + time_features = np.vstack((df_stamp.dt.year, df_stamp.dt.month, df_stamp.dt.day, df_stamp.dt.weekday)).T + + + self.data_x = data[border1:border2] + self.data_y = data[border1:border2] + self.time_features = time_features + + + + def __getitem__(self, index): + seq_x = self.data_x[index:index+self.seq_len] + seq_y = self.data_y[index+self.seq_len:index+self.seq_len+self.pred_len] + seq_x_mark = self.time_features[index:index+self.seq_len] + seq_y_mark = self.time_features[index+self.seq_len:index+self.seq_len+self.pred_len] + return seq_x, seq_y, seq_x_mark, seq_y_mark + + def __len__(self): + return (len(self.data_x) - self.seq_len - self.pred_len + 1) * self.enc_in + + def inverse_transform(self, data): + return self.scaler.inverse_transform(data) + + + + class Dataset_ETT_hour(Dataset): def __init__(self, root_path, flag='train', size=None, features='S', data_path='ETTh1.csv', diff --git a/dataset/data.csv b/dataset/data.csv new file mode 100644 index 0000000..a9c8f66 --- /dev/null +++ b/dataset/data.csv @@ -0,0 +1,222 @@ +,end_date,sold_units +19,2020-01-04,89.0 +87,2020-01-11,89.0 +100,2020-01-18,67.0 +2,2020-01-25,82.0 +104,2020-02-01,96.0 +132,2020-02-08,113.0 +95,2020-02-15,94.0 +18,2020-02-22,69.0 +67,2020-02-29,128.0 +138,2020-03-07,192.0 +79,2020-03-14,113.0 +38,2020-03-21,104.0 +96,2020-03-28,111.0 +131,2020-04-04,74.0 +11,2020-04-11,21.0 +119,2020-04-18,4.0 +108,2020-04-25,0.0 +133,2020-05-02,43.0 +53,2020-05-09,321.0 +117,2020-05-16,237.0 +144,2020-05-23,217.0 +48,2020-05-30,234.0 +101,2020-06-06,356.0 +137,2020-06-13,317.0 +85,2020-06-20,415.0 +156,2020-06-27,972.0 +31,2020-07-04,313.0 +115,2020-07-11,317.0 +33,2020-07-18,306.0 +116,2020-07-25,216.0 +97,2020-08-01,215.0 +149,2020-08-08,211.0 +21,2020-08-15,167.0 +112,2020-08-22,148.0 +37,2020-08-29,191.0 +35,2020-09-05,169.0 +110,2020-09-12,244.0 +56,2020-09-19,146.0 +126,2020-09-26,176.0 +29,2020-10-03,381.0 +118,2020-10-10,127.0 +123,2020-10-17,88.0 +98,2020-10-24,89.0 +127,2020-10-31,200.0 +154,2020-11-07,156.0 +151,2020-11-14,254.0 +45,2020-11-21,260.0 +143,2020-11-28,243.0 +125,2020-12-05,254.0 +140,2020-12-12,191.0 +102,2020-12-19,191.0 +105,2020-12-26,87.0 +41,2021-01-02,334.0 +83,2021-01-09,171.0 +77,2021-01-16,182.0 +46,2021-01-23,163.0 +129,2021-01-30,135.0 +94,2021-02-06,177.0 +71,2021-02-13,159.0 +139,2021-02-20,370.0 +9,2021-02-27,277.0 +20,2021-03-06,332.0 +136,2021-03-13,185.0 +15,2021-03-20,157.0 +36,2021-03-27,196.0 +121,2021-04-03,226.0 +14,2021-04-10,159.0 +43,2021-04-17,381.0 +44,2021-04-24,147.0 +153,2021-05-01,117.0 +141,2021-05-08,130.0 +122,2021-05-15,108.0 +23,2021-05-22,86.0 +32,2021-05-29,64.0 +1,2021-06-05,99.0 +60,2021-06-12,149.0 +73,2021-06-19,158.0 +130,2021-06-26,130.0 +106,2021-07-03,175.0 +72,2021-07-10,128.0 +148,2021-07-17,101.0 +59,2021-07-24,92.0 +91,2021-07-31,129.0 +4,2021-08-07,192.0 +47,2021-08-14,190.0 +27,2021-08-21,221.0 +13,2021-08-28,123.0 +24,2021-09-04,132.0 +128,2021-09-11,98.0 +113,2021-09-18,87.0 +150,2021-09-25,97.0 +25,2021-10-02,112.0 +42,2021-10-09,101.0 +30,2021-10-16,112.0 +86,2021-10-23,85.0 +8,2021-10-30,91.0 +12,2021-11-06,83.0 +78,2021-11-13,128.0 +0,2021-11-20,112.0 +50,2021-11-27,164.0 +84,2021-12-04,331.0 +28,2021-12-11,162.0 +7,2021-12-18,113.0 +92,2021-12-25,74.0 +114,2022-01-01,92.0 +40,2022-01-08,107.0 +76,2022-01-15,100.0 +63,2022-01-22,77.0 +34,2022-01-29,94.0 +80,2022-02-05,83.0 +3,2022-02-12,135.0 +88,2022-02-19,106.0 +107,2022-02-26,108.0 +147,2022-03-05,126.0 +145,2022-03-12,139.0 +146,2022-03-19,104.0 +5,2022-03-26,112.0 +90,2022-04-02,115.0 +6,2022-04-09,121.0 +109,2022-04-16,102.0 +152,2022-04-23,180.0 +135,2022-04-30,286.0 +54,2022-05-07,187.0 +61,2022-05-14,171.0 +89,2022-05-21,141.0 +134,2022-05-28,157.0 +66,2022-06-04,113.0 +10,2022-06-11,138.0 +81,2022-06-18,149.0 +75,2022-06-25,154.0 +55,2022-07-02,208.0 +111,2022-07-09,259.0 +93,2022-07-16,224.0 +26,2022-07-23,198.0 +52,2022-07-30,230.0 +58,2022-08-06,102.0 +120,2022-08-13,152.0 +22,2022-08-20,184.0 +70,2022-08-27,189.0 +49,2022-09-03,153.0 +69,2022-09-10,130.0 +103,2022-09-17,135.0 +155,2022-09-24,176.0 +39,2022-10-01,180.0 +68,2022-10-08,246.0 +16,2022-10-15,348.0 +57,2022-10-22,392.0 +99,2022-10-29,435.0 +51,2022-11-05,276.0 +124,2022-11-12,188.0 +17,2022-11-19,169.0 +82,2022-11-26,360.0 +74,2022-12-03,420.0 +65,2022-12-10,219.0 +64,2022-12-17,207.0 +62,2022-12-24,150.0 +142,2022-12-31,131.0 +179,2023-01-07,184.0 +211,2023-01-14,139.0 +160,2023-01-21,126.0 +159,2023-01-28,146.0 +196,2023-02-04,168.0 +212,2023-02-11,140.0 +169,2023-02-18,136.0 +180,2023-02-25,96.0 +168,2023-03-04,124.0 +220,2023-03-11,153.0 +224,2023-03-18,160.0 +206,2023-03-25,145.0 +185,2023-04-01,184.0 +190,2023-04-08,164.0 +188,2023-04-15,143.0 +186,2023-04-22,166.0 +213,2023-04-29,144.0 +230,2023-05-06,131.0 +227,2023-05-13,161.0 +222,2023-05-20,219.0 +187,2023-05-27,239.0 +229,2023-06-03,307.0 +162,2023-06-10,291.0 +171,2023-06-17,251.0 +191,2023-06-24,187.0 +183,2023-07-01,237.0 +199,2023-07-08,204.0 +209,2023-07-15,192.0 +172,2023-07-22,180.0 +167,2023-07-29,152.0 +192,2023-08-05,177.0 +203,2023-08-12,135.0 +181,2023-08-19,170.0 +184,2023-08-26,116.0 +197,2023-09-02,162.0 +202,2023-09-09,193.0 +231,2023-09-16,152.0 +182,2023-09-23,164.0 +174,2023-09-30,196.0 +223,2023-10-07,200.0 +175,2023-10-14,196.0 +201,2023-10-21,143.0 +232,2023-10-28,250.0 +207,2023-11-04,278.0 +177,2023-11-11,508.0 +210,2023-11-18,148.0 +195,2023-11-25,244.0 +173,2023-12-02,488.0 +204,2023-12-09,209.0 +208,2023-12-16,201.0 +163,2023-12-23,164.0 +164,2023-12-30,154.0 +165,2024-01-06,200.0 +215,2024-01-13,181.0 +161,2024-01-20,143.0 +218,2024-01-27,238.0 +226,2024-02-03,190.0 +233,2024-02-10,145.0 +216,2024-02-17,126.0 +194,2024-02-24,198.0 +214,2024-03-02,149.0 +219,2024-03-09,148.0 +157,2024-03-16,146.0 +221,2024-03-23,100.0 diff --git a/explore_model.ipynb b/explore_model.ipynb new file mode 100644 index 0000000..7c8fb82 --- /dev/null +++ b/explore_model.ipynb @@ -0,0 +1,429 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "from torch.utils.data import Dataset\n", + "from sklearn.preprocessing import StandardScaler" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('./dataset/data.csv')\n", + "data.drop(\"Unnamed: 0\", axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
end_datesold_units
2112024-01-20143.0
2122024-01-27238.0
2132024-02-03190.0
2142024-02-10145.0
2152024-02-17126.0
2162024-02-24198.0
2172024-03-02149.0
2182024-03-09148.0
2192024-03-16146.0
2202024-03-23100.0
\n", + "
" + ], + "text/plain": [ + " end_date sold_units\n", + "211 2024-01-20 143.0\n", + "212 2024-01-27 238.0\n", + "213 2024-02-03 190.0\n", + "214 2024-02-10 145.0\n", + "215 2024-02-17 126.0\n", + "216 2024-02-24 198.0\n", + "217 2024-03-02 149.0\n", + "218 2024-03-09 148.0\n", + "219 2024-03-16 146.0\n", + "220 2024-03-23 100.0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.tail(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from torch.utils.data import Dataset\n", + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "class Dataset_ean(Dataset):\n", + " def __init__(self, root_path, flag='train', size=None,\n", + " features='S', data_path='data.csv',\n", + " target='sold_units', scale=True, timeenc=0, freq='W'):\n", + " if size is None:\n", + " self.seq_len = 13 # Use 0.25 year of data for sequence\n", + " self.label_len = 4 # Labels from last month\n", + " self.pred_len = 4 # Predict 1 month ahead\n", + " else:\n", + " self.seq_len, self.label_len, self.pred_len = size\n", + "\n", + " assert flag in ['train', 'test', 'val']\n", + " self.set_type = {'train': 0, 'val': 1, 'test': 2}[flag]\n", + "\n", + " self.features = features\n", + " self.target = target\n", + " self.scale = scale\n", + " self.timeenc = timeenc\n", + " self.freq = freq\n", + "\n", + " self.root_path = root_path\n", + " self.data_path = data_path\n", + " self.__read_data__()\n", + " self.enc_in = self.data_x.shape[-1]\n", + " def __read_data__(self):\n", + " self.scaler = StandardScaler()\n", + " df_raw = pd.read_csv(os.path.join(self.root_path, self.data_path))\n", + " df_raw.drop(\"Unnamed: 0\", axis=1, inplace=True)# don't forget to remove this once regulated the data\n", + " num_weeks = len(df_raw)\n", + " num_train = int(num_weeks * 0.7)\n", + " num_val = int(num_weeks * 0.2)\n", + " num_test = num_weeks - num_train - num_val\n", + "\n", + " border1s = [0, num_train, num_train + num_val]\n", + " border2s = [num_train, num_train + num_val, num_weeks]\n", + "\n", + " border1 = border1s[self.set_type]\n", + " border2 = border2s[self.set_type]\n", + "\n", + " if self.scale:\n", + " train_data = df_raw.iloc[:num_train]\n", + " self.scaler.fit(train_data[[self.target]].values)\n", + " data = self.scaler.transform(df_raw[[self.target]].values)\n", + " else:\n", + " data = df_raw[[self.target]].values\n", + "\n", + " df_stamp = pd.to_datetime(df_raw.iloc[:, 0][border1:border2]) # 'end_date' is first column\n", + " if self.timeenc == 0:\n", + " time_features = np.vstack((df_stamp.dt.year, df_stamp.dt.month, df_stamp.dt.day, df_stamp.dt.weekday)).T\n", + " elif self.timeenc == 1:\n", + " time_features = self.custom_time_features(df_stamp, freq=self.freq)\n", + "\n", + " self.data_x = data[border1:border2]\n", + " self.data_y = data[border1:border2]\n", + " self.time_features = time_features\n", + "\n", + " def custom_time_features(self, dates, freq):\n", + " # Define custom time feature extraction based on your model's needs\n", + " return np.array([dates.index.weekday, dates.index.day])\n", + "\n", + " def __getitem__(self, index):\n", + " seq_x = self.data_x[index:index+self.seq_len]\n", + " seq_y = self.data_y[index+self.seq_len:index+self.seq_len+self.pred_len]\n", + " seq_x_mark = self.time_features[index:index+self.seq_len]\n", + " seq_y_mark = self.time_features[index+self.seq_len:index+self.seq_len+self.pred_len]\n", + " return seq_x, seq_y, seq_x_mark, seq_y_mark\n", + "\n", + " def __len__(self):\n", + " return (len(self.data_x) - self.seq_len - self.pred_len + 1) * self.enc_in\n", + "\n", + " def inverse_transform(self, data):\n", + " return self.scaler.inverse_transform(data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "root_path = './dataset'" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "data = Dataset_ean(root_path=root_path, scale=False, flag = 'test')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(23, 13, 4)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(data.data_x), data.seq_len, data.pred_len" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "7" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "seq_x, seq_y, seq_x_mark, seq_y_mark = data[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [], + "source": [ + "from data_provider.data_factory import data_provider" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "from torch.utils.data import DataLoader" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "data_loader = DataLoader(data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7\n" + ] + } + ], + "source": [ + "print(len(data_loader))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "path = 'checkpoints/long_term_forecast_EAN_512_96_TimeLLM_ean_ftS_sl13_ll1_pl1_dm32_nh8_el2_dl1_df128_fc3_ebtimeF_Exp_0-TimeLLM-EAN/checkpoint'\n", + "\n", + "# Load the checkpoint\n", + "checkpoint = torch.load(path)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'model' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/home/user/Time-LLM/explore_model.ipynb Cell 20\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> 1\u001b[0m model\u001b[39m.\u001b[39mload_state_dict(checkpoint[\u001b[39m'\u001b[39m\u001b[39mmodel_state_dict\u001b[39m\u001b[39m'\u001b[39m])\n\u001b[1;32m 2\u001b[0m model\u001b[39m.\u001b[39meval()\n", + "\u001b[0;31mNameError\u001b[0m: name 'model' is not defined" + ] + } + ], + "source": [ + "model.load_state_dict(checkpoint['model_state_dict'])\n", + "model.eval()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "GPU", + "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.8.19" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/scripts/TimeLLM_ean.sh b/scripts/TimeLLM_ean.sh new file mode 100755 index 0000000..ed8f9dd --- /dev/null +++ b/scripts/TimeLLM_ean.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Set script variables +model_name="TimeLLM" +train_epochs=2 +learning_rate=0.01 +llama_layers=32 + +num_process=8 +batch_size=10 +d_model=16 +d_ff=32 + +comment="TimeLLM-EAN" + +# Launch the training script without GPU acceleration +accelerate launch --num_processes "$num_process" run_main.py \ + --task_name long_term_forecast \ + --is_training 1 \ + --root_path ./dataset/ \ + --data_path data.csv \ + --model_id EAN_id \ + --model "$model_name" \ + --data ean \ + --target sold_units\ + --features S \ + --seq_len 13 \ + --label_len 1 \ + --pred_len 1 \ + --e_layers 2 \ + --d_layers 1 \ + --factor 3 \ + --enc_in 321 \ + --dec_in 321 \ + --c_out 321 \ + --batch_size $batch_size \ + --learning_rate $learning_rate \ + --llm_layers $llama_layers \ + --train_epochs $train_epochs \ + --model_comment $comment diff --git a/scripts/TimeLLM_ean_gpu.sh b/scripts/TimeLLM_ean_gpu.sh new file mode 100755 index 0000000..7fac507 --- /dev/null +++ b/scripts/TimeLLM_ean_gpu.sh @@ -0,0 +1,42 @@ +model_name=TimeLLM +train_epochs=2 +learning_rate=0.001 +llama_layers=32 + +master_port=00098 +num_process=1 +batch_size=7 +d_model=32 +d_ff=128 + +comment='TimeLLM-EAN' + +accelerate launch --mixed_precision bf16 --num_processes $num_process --main_process_port $master_port run_main.py \ + --task_name long_term_forecast \ + --is_training 1 \ + --root_path ./dataset \ + --data_path data.csv \ + --model_id EAN_512_96 \ + --model $model_name \ + --data ean \ + --features S \ + --target sold_units \ + --seq_len 13 \ + --label_len 1 \ + --pred_len 1 \ + --factor 3 \ + --enc_in 9 \ + --dec_in 9 \ + --c_out 9 \ + --des 'Exp' \ + --itr 1 \ + --d_model $d_model \ + --d_ff $d_ff \ + --batch_size $batch_size \ + --learning_rate $learning_rate \ + --llm_layers $llama_layers \ + --train_epochs $train_epochs \ + --model_comment $comment \ + --llm_model GPT2 \ + --llm_dim 768 + diff --git a/scripts/TimeLLM_ean_gpu_plot.sh b/scripts/TimeLLM_ean_gpu_plot.sh new file mode 100755 index 0000000..a9c280f --- /dev/null +++ b/scripts/TimeLLM_ean_gpu_plot.sh @@ -0,0 +1,42 @@ +model_name=TimeLLM +train_epochs=2 +learning_rate=0.001 +llama_layers=32 + +master_port=00098 +num_process=1 +batch_size=7 +d_model=32 +d_ff=128 + +comment='TimeLLM-EAN' + +accelerate launch --mixed_precision bf16 --num_processes $num_process --main_process_port $master_port run_plot.py \ + --task_name long_term_forecast \ + --is_training 1 \ + --root_path ./dataset \ + --data_path data.csv \ + --model_id EAN_512_96 \ + --model $model_name \ + --data ean \ + --features S \ + --target sold_units \ + --seq_len 13 \ + --label_len 1 \ + --pred_len 1 \ + --factor 3 \ + --enc_in 9 \ + --dec_in 9 \ + --c_out 9 \ + --des 'Exp' \ + --itr 1 \ + --d_model $d_model \ + --d_ff $d_ff \ + --batch_size $batch_size \ + --learning_rate $learning_rate \ + --llm_layers $llama_layers \ + --train_epochs $train_epochs \ + --model_comment $comment \ + --llm_model GPT2 \ + --llm_dim 768 + From 83882fdd57db21974d6c83c9de89af3dd8900fc1 Mon Sep 17 00:00:00 2001 From: dahouathi2 Date: Mon, 6 May 2024 14:55:25 +0000 Subject: [PATCH 2/2] [ADDED PROMPT] --- dataset/prompt_bank/ean.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 dataset/prompt_bank/ean.txt diff --git a/dataset/prompt_bank/ean.txt b/dataset/prompt_bank/ean.txt new file mode 100644 index 0000000..2af9f9c --- /dev/null +++ b/dataset/prompt_bank/ean.txt @@ -0,0 +1 @@ +EAN is a dataset contains only sold_units of one ean product of loreal cosmetic products. \ No newline at end of file