{"id":13710322,"url":"https://github.com/practical-data-science/ecommercetools","last_synced_at":"2025-07-13T11:02:49.315Z","repository":{"id":42451824,"uuid":"345148349","full_name":"practical-data-science/ecommercetools","owner":"practical-data-science","description":"EcommerceTools is a Python data science toolkit for ecommerce, marketing science, and technical SEO analysis and modelling and was created by Matt Clarke.","archived":false,"fork":false,"pushed_at":"2024-01-29T09:34:58.000Z","size":153,"stargazers_count":255,"open_issues_count":9,"forks_count":51,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-07-12T07:05:42.533Z","etag":null,"topics":["customer","customers","ecommerce","marketing","marketing-analytics","marketing-tools","retail","seo","seo-optimization","seotools"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/practical-data-science.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-03-06T17:03:05.000Z","updated_at":"2025-07-05T03:46:50.000Z","dependencies_parsed_at":"2024-06-19T17:35:29.900Z","dependency_job_id":"2de8c93b-f70b-4dee-ad09-ea6699441366","html_url":"https://github.com/practical-data-science/ecommercetools","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/practical-data-science/ecommercetools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/practical-data-science%2Fecommercetools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/practical-data-science%2Fecommercetools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/practical-data-science%2Fecommercetools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/practical-data-science%2Fecommercetools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/practical-data-science","download_url":"https://codeload.github.com/practical-data-science/ecommercetools/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/practical-data-science%2Fecommercetools/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265129770,"owners_count":23715682,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["customer","customers","ecommerce","marketing","marketing-analytics","marketing-tools","retail","seo","seo-optimization","seotools"],"created_at":"2024-08-02T23:00:54.489Z","updated_at":"2025-07-13T11:02:49.270Z","avatar_url":"https://github.com/practical-data-science.png","language":"Python","readme":"# EcommerceTools\n\n![EcommerceTools](https://github.com/practical-data-science/ecommercetools/blob/master/banner.png?raw=true)\n\nEcommerceTools is a data science toolkit for those working in technical ecommerce, marketing science, and technical seo and includes a wide range of features to aid analysis and model building. The package is written in Python and is designed to be used with Pandas and works within a Jupyter notebook environment or in standalone Python projects. \n\n#### Installation\n\nYou can install EcommerceTools and its dependencies via PyPi by entering `pip3 install ecommercetools` in your terminal, or `!pip3 install ecommercetools` within a Jupyter notebook cell. \n\n---\n\n### Modules\n\n- [Transactions](#Transactions)\n- [Products](#Products)\n- [Customers](#Customers)\n- [Advertising](#Advertising)\n- [Operations](#Operations)\n- [Marketing](#Marketing)\n- [NLP](#NLP)\n- [SEO](#SEO)\n- [Reports](#Reports)\n---\n\n### Transactions\n\n1. #### Load sample transaction items data\n\nIf you want to get started with the transactions, products, and customers features, you can use the `load_sample_data()` function to load a set of real world data. This imports the transaction items from widely-used Online Retail dataset and reformats it ready for use by EcommerceTools. \n\n```python\nfrom ecommercetools import utilities\n\ntransaction_items = utilities.load_sample_data()\ntransaction_items.head()\n```\n\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eorder_id\u003c/th\u003e\n      \u003cth\u003esku\u003c/th\u003e\n      \u003cth\u003edescription\u003c/th\u003e\n      \u003cth\u003equantity\u003c/th\u003e\n      \u003cth\u003eorder_date\u003c/th\u003e\n      \u003cth\u003eunit_price\u003c/th\u003e\n      \u003cth\u003ecustomer_id\u003c/th\u003e\n      \u003cth\u003ecountry\u003c/th\u003e\n      \u003cth\u003eline_price\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e85123A\u003c/td\u003e\n      \u003ctd\u003eWHITE HANGING HEART T-LIGHT HOLDER\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e2.55\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e15.30\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e71053\u003c/td\u003e\n      \u003ctd\u003eWHITE METAL LANTERN\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e3.39\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e20.34\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e84406B\u003c/td\u003e\n      \u003ctd\u003eCREAM CUPID HEARTS COAT HANGER\u003c/td\u003e\n      \u003ctd\u003e8\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e2.75\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e22.00\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e84029G\u003c/td\u003e\n      \u003ctd\u003eKNITTED UNION FLAG HOT WATER BOTTLE\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e3.39\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e20.34\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e84029E\u003c/td\u003e\n      \u003ctd\u003eRED WOOLLY HOTTIE WHITE HEART.\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e3.39\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e20.34\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n2. #### Create a transaction items dataframe\n\nThe `utilities` module includes a range of tools that allow you to format data, so it can be used within other EcommerceTools functions. The `load_transaction_items()` function is used to create a Pandas dataframe of formatted transactional item data. When loading your transaction items data, all you need to do is define the column mappings, and the function will reformat the dataframe accordingly. \n\n```python\nimport pandas as pd\nfrom ecommercetools import utilities\n\ntransaction_items = utilities.load_transaction_items('transaction_items_non_standard_names.csv',\n                                 date_column='InvoiceDate',\n                                 order_id_column='InvoiceNo',\n                                 customer_id_column='CustomerID',\n                                 sku_column='StockCode',\n                                 quantity_column='Quantity',\n                                 unit_price_column='UnitPrice'\n                                 )\ntransaction_items.to_csv('transaction_items.csv', index=False)\nprint(transaction_items.head())\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eorder_id\u003c/th\u003e\n      \u003cth\u003esku\u003c/th\u003e\n      \u003cth\u003edescription\u003c/th\u003e\n      \u003cth\u003equantity\u003c/th\u003e\n      \u003cth\u003eorder_date\u003c/th\u003e\n      \u003cth\u003eunit_price\u003c/th\u003e\n      \u003cth\u003ecustomer_id\u003c/th\u003e\n      \u003cth\u003ecountry\u003c/th\u003e\n      \u003cth\u003eline_price\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e85123A\u003c/td\u003e\n      \u003ctd\u003eWHITE HANGING HEART T-LIGHT HOLDER\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e2.55\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e15.30\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e71053\u003c/td\u003e\n      \u003ctd\u003eWHITE METAL LANTERN\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e3.39\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e20.34\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e84406B\u003c/td\u003e\n      \u003ctd\u003eCREAM CUPID HEARTS COAT HANGER\u003c/td\u003e\n      \u003ctd\u003e8\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e2.75\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e22.00\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e84029G\u003c/td\u003e\n      \u003ctd\u003eKNITTED UNION FLAG HOT WATER BOTTLE\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e3.39\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e20.34\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e84029E\u003c/td\u003e\n      \u003ctd\u003eRED WOOLLY HOTTIE WHITE HEART.\u003c/td\u003e\n      \u003ctd\u003e6\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e3.39\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003eUnited Kingdom\u003c/td\u003e\n      \u003ctd\u003e20.34\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n3. #### Create a transactions dataframe\n\nThe `get_transactions()` function takes the formatted Pandas dataframe of transaction items and returns a Pandas dataframe of aggregated transaction data, which includes features identifying the order number. \n\n```python\nimport pandas as pd\nfrom ecommercetools import customers\n\ntransaction_items = pd.read_csv('transaction_items.csv')\ntransactions = transactions.get_transactions(transaction_items)\ntransactions.to_csv('transactions.csv', index=False)\nprint(transactions.head())\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eorder_id\u003c/th\u003e\n      \u003cth\u003eorder_date\u003c/th\u003e\n      \u003cth\u003ecustomer_id\u003c/th\u003e\n      \u003cth\u003eskus\u003c/th\u003e\n      \u003cth\u003eitems\u003c/th\u003e\n      \u003cth\u003erevenue\u003c/th\u003e\n      \u003cth\u003ereplacement\u003c/th\u003e\n      \u003cth\u003eorder_number\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003e7\u003c/td\u003e\n      \u003ctd\u003e40\u003c/td\u003e\n      \u003ctd\u003e139.12\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e536366\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:28:00\u003c/td\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e12\u003c/td\u003e\n      \u003ctd\u003e22.20\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e536367\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:34:00\u003c/td\u003e\n      \u003ctd\u003e13047.0\u003c/td\u003e\n      \u003ctd\u003e12\u003c/td\u003e\n      \u003ctd\u003e83\u003c/td\u003e\n      \u003ctd\u003e278.73\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e536368\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:34:00\u003c/td\u003e\n      \u003ctd\u003e13047.0\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n      \u003ctd\u003e15\u003c/td\u003e\n      \u003ctd\u003e70.05\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e536369\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:35:00\u003c/td\u003e\n      \u003ctd\u003e13047.0\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003e17.85\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n---\n\n### Products\n\n#### 1. Get product data from transaction items\n\n```python\nproducts_df = products.get_products(transaction_items)\nproducts_df.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003esku\u003c/th\u003e\n      \u003cth\u003efirst_order_date\u003c/th\u003e\n      \u003cth\u003elast_order_date\u003c/th\u003e\n      \u003cth\u003ecustomers\u003c/th\u003e\n      \u003cth\u003eorders\u003c/th\u003e\n      \u003cth\u003eitems\u003c/th\u003e\n      \u003cth\u003erevenue\u003c/th\u003e\n      \u003cth\u003eavg_unit_price\u003c/th\u003e\n      \u003cth\u003eavg_quantity\u003c/th\u003e\n      \u003cth\u003eavg_revenue\u003c/th\u003e\n      \u003cth\u003eavg_orders\u003c/th\u003e\n      \u003cth\u003eproduct_tenure\u003c/th\u003e\n      \u003cth\u003eproduct_recency\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e10002\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:45:00\u003c/td\u003e\n      \u003ctd\u003e2011-04-28 15:05:00\u003c/td\u003e\n      \u003ctd\u003e40\u003c/td\u003e\n      \u003ctd\u003e73\u003c/td\u003e\n      \u003ctd\u003e1037\u003c/td\u003e\n      \u003ctd\u003e759.89\u003c/td\u003e\n      \u003ctd\u003e1.056849\u003c/td\u003e\n      \u003ctd\u003e14.205479\u003c/td\u003e\n      \u003ctd\u003e10.409452\u003c/td\u003e\n      \u003ctd\u003e1.82\u003c/td\u003e\n      \u003ctd\u003e3749\u003c/td\u003e\n      \u003ctd\u003e3600\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e10080\u003c/td\u003e\n      \u003ctd\u003e2011-02-27 13:47:00\u003c/td\u003e\n      \u003ctd\u003e2011-11-21 17:04:00\u003c/td\u003e\n      \u003ctd\u003e19\u003c/td\u003e\n      \u003ctd\u003e24\u003c/td\u003e\n      \u003ctd\u003e495\u003c/td\u003e\n      \u003ctd\u003e119.09\u003c/td\u003e\n      \u003ctd\u003e0.376667\u003c/td\u003e\n      \u003ctd\u003e20.625000\u003c/td\u003e\n      \u003ctd\u003e4.962083\u003c/td\u003e\n      \u003ctd\u003e1.26\u003c/td\u003e\n      \u003ctd\u003e3660\u003c/td\u003e\n      \u003ctd\u003e3393\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e10120\u003c/td\u003e\n      \u003ctd\u003e2010-12-03 11:19:00\u003c/td\u003e\n      \u003ctd\u003e2011-12-04 13:15:00\u003c/td\u003e\n      \u003ctd\u003e25\u003c/td\u003e\n      \u003ctd\u003e29\u003c/td\u003e\n      \u003ctd\u003e193\u003c/td\u003e\n      \u003ctd\u003e40.53\u003c/td\u003e\n      \u003ctd\u003e0.210000\u003c/td\u003e\n      \u003ctd\u003e6.433333\u003c/td\u003e\n      \u003ctd\u003e1.351000\u003c/td\u003e\n      \u003ctd\u003e1.16\u003c/td\u003e\n      \u003ctd\u003e3746\u003c/td\u003e\n      \u003ctd\u003e3380\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e10123C\u003c/td\u003e\n      \u003ctd\u003e2010-12-03 11:19:00\u003c/td\u003e\n      \u003ctd\u003e2011-07-15 15:05:00\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n      \u003ctd\u003e-13\u003c/td\u003e\n      \u003ctd\u003e3.25\u003c/td\u003e\n      \u003ctd\u003e0.487500\u003c/td\u003e\n      \u003ctd\u003e-3.250000\u003c/td\u003e\n      \u003ctd\u003e0.812500\u003c/td\u003e\n      \u003ctd\u003e1.33\u003c/td\u003e\n      \u003ctd\u003e3746\u003c/td\u003e\n      \u003ctd\u003e3522\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e10123G\u003c/td\u003e\n      \u003ctd\u003e2011-04-08 11:13:00\u003c/td\u003e\n      \u003ctd\u003e2011-04-08 11:13:00\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e-38\u003c/td\u003e\n      \u003ctd\u003e0.00\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003e-38.000000\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003einf\u003c/td\u003e\n      \u003ctd\u003e3620\u003c/td\u003e\n      \u003ctd\u003e3620\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n#### 2. Calculate product consumption and repurchase rate\n\n\n```python\nrepurchase_rates = products.get_repurchase_rates(transaction_items)\nrepurchase_rates.head(3).T\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003cth\u003e2\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003esku\u003c/th\u003e\n      \u003ctd\u003e10002\u003c/td\u003e\n      \u003ctd\u003e10080\u003c/td\u003e\n      \u003ctd\u003e10120\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003erevenue\u003c/th\u003e\n      \u003ctd\u003e759.89\u003c/td\u003e\n      \u003ctd\u003e119.09\u003c/td\u003e\n      \u003ctd\u003e40.53\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eitems\u003c/th\u003e\n      \u003ctd\u003e1037\u003c/td\u003e\n      \u003ctd\u003e495\u003c/td\u003e\n      \u003ctd\u003e193\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eorders\u003c/th\u003e\n      \u003ctd\u003e73\u003c/td\u003e\n      \u003ctd\u003e24\u003c/td\u003e\n      \u003ctd\u003e29\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003ecustomers\u003c/th\u003e\n      \u003ctd\u003e40\u003c/td\u003e\n      \u003ctd\u003e19\u003c/td\u003e\n      \u003ctd\u003e25\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eavg_unit_price\u003c/th\u003e\n      \u003ctd\u003e1.05685\u003c/td\u003e\n      \u003ctd\u003e0.376667\u003c/td\u003e\n      \u003ctd\u003e0.21\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eavg_line_price\u003c/th\u003e\n      \u003ctd\u003e10.4095\u003c/td\u003e\n      \u003ctd\u003e4.96208\u003c/td\u003e\n      \u003ctd\u003e1.351\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eavg_items_per_order\u003c/th\u003e\n      \u003ctd\u003e14.2055\u003c/td\u003e\n      \u003ctd\u003e20.625\u003c/td\u003e\n      \u003ctd\u003e6.65517\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eavg_items_per_customer\u003c/th\u003e\n      \u003ctd\u003e25.925\u003c/td\u003e\n      \u003ctd\u003e26.0526\u003c/td\u003e\n      \u003ctd\u003e7.72\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003epurchased_individually\u003c/th\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e9\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003epurchased_once\u003c/th\u003e\n      \u003ctd\u003e34\u003c/td\u003e\n      \u003ctd\u003e17\u003c/td\u003e\n      \u003ctd\u003e22\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003ebulk_purchases\u003c/th\u003e\n      \u003ctd\u003e73\u003c/td\u003e\n      \u003ctd\u003e24\u003c/td\u003e\n      \u003ctd\u003e20\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003ebulk_purchase_rate\u003c/th\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e0.689655\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003erepurchases\u003c/th\u003e\n      \u003ctd\u003e39\u003c/td\u003e\n      \u003ctd\u003e7\u003c/td\u003e\n      \u003ctd\u003e7\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003erepurchase_rate\u003c/th\u003e\n      \u003ctd\u003e0.534247\u003c/td\u003e\n      \u003ctd\u003e0.291667\u003c/td\u003e\n      \u003ctd\u003e0.241379\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003erepurchase_rate_label\u003c/th\u003e\n      \u003ctd\u003eModerate repurchase\u003c/td\u003e\n      \u003ctd\u003eLow repurchase\u003c/td\u003e\n      \u003ctd\u003eLow repurchase\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003ebulk_purchase_rate_label\u003c/th\u003e\n      \u003ctd\u003eVery high bulk\u003c/td\u003e\n      \u003ctd\u003eVery high bulk\u003c/td\u003e\n      \u003ctd\u003eHigh bulk\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003ebulk_and_repurchase_label\u003c/th\u003e\n      \u003ctd\u003eModerate repurchase_Very high bulk\u003c/td\u003e\n      \u003ctd\u003eLow repurchase_Very high bulk\u003c/td\u003e\n      \u003ctd\u003eLow repurchase_High bulk\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n---\n\n### Customers\n\n#### 1. Create a customers dataset\n\n```python\nfrom ecommercetools import customers\n\ncustomers_df = customers.get_customers(transaction_items)\ncustomers_df.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003ecustomer_id\u003c/th\u003e\n      \u003cth\u003erevenue\u003c/th\u003e\n      \u003cth\u003eorders\u003c/th\u003e\n      \u003cth\u003eskus\u003c/th\u003e\n      \u003cth\u003eitems\u003c/th\u003e\n      \u003cth\u003efirst_order_date\u003c/th\u003e\n      \u003cth\u003elast_order_date\u003c/th\u003e\n      \u003cth\u003eavg_items\u003c/th\u003e\n      \u003cth\u003eavg_order_value\u003c/th\u003e\n      \u003cth\u003etenure\u003c/th\u003e\n      \u003cth\u003erecency\u003c/th\u003e\n      \u003cth\u003ecohort\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e12346.0\u003c/td\u003e\n      \u003ctd\u003e0.00\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e2011-01-18 10:01:00\u003c/td\u003e\n      \u003ctd\u003e2011-01-18 10:17:00\u003c/td\u003e\n      \u003ctd\u003e0.00\u003c/td\u003e\n      \u003ctd\u003e0.00\u003c/td\u003e\n      \u003ctd\u003e3701\u003c/td\u003e\n      \u003ctd\u003e3700\u003c/td\u003e\n      \u003ctd\u003e20111\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e12347.0\u003c/td\u003e\n      \u003ctd\u003e4310.00\u003c/td\u003e\n      \u003ctd\u003e7\u003c/td\u003e\n      \u003ctd\u003e7\u003c/td\u003e\n      \u003ctd\u003e2458\u003c/td\u003e\n      \u003ctd\u003e2010-12-07 14:57:00\u003c/td\u003e\n      \u003ctd\u003e2011-12-07 15:52:00\u003c/td\u003e\n      \u003ctd\u003e351.14\u003c/td\u003e\n      \u003ctd\u003e615.71\u003c/td\u003e\n      \u003ctd\u003e3742\u003c/td\u003e\n      \u003ctd\u003e3377\u003c/td\u003e\n      \u003ctd\u003e20104\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e12348.0\u003c/td\u003e\n      \u003ctd\u003e1797.24\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n      \u003ctd\u003e2341\u003c/td\u003e\n      \u003ctd\u003e2010-12-16 19:09:00\u003c/td\u003e\n      \u003ctd\u003e2011-09-25 13:13:00\u003c/td\u003e\n      \u003ctd\u003e585.25\u003c/td\u003e\n      \u003ctd\u003e449.31\u003c/td\u003e\n      \u003ctd\u003e3733\u003c/td\u003e\n      \u003ctd\u003e3450\u003c/td\u003e\n      \u003ctd\u003e20104\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e12349.0\u003c/td\u003e\n      \u003ctd\u003e1757.55\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e631\u003c/td\u003e\n      \u003ctd\u003e2011-11-21 09:51:00\u003c/td\u003e\n      \u003ctd\u003e2011-11-21 09:51:00\u003c/td\u003e\n      \u003ctd\u003e631.00\u003c/td\u003e\n      \u003ctd\u003e1757.55\u003c/td\u003e\n      \u003ctd\u003e3394\u003c/td\u003e\n      \u003ctd\u003e3394\u003c/td\u003e\n      \u003ctd\u003e20114\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e12350.0\u003c/td\u003e\n      \u003ctd\u003e334.40\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e197\u003c/td\u003e\n      \u003ctd\u003e2011-02-02 16:01:00\u003c/td\u003e\n      \u003ctd\u003e2011-02-02 16:01:00\u003c/td\u003e\n      \u003ctd\u003e197.00\u003c/td\u003e\n      \u003ctd\u003e334.40\u003c/td\u003e\n      \u003ctd\u003e3685\u003c/td\u003e\n      \u003ctd\u003e3685\u003c/td\u003e\n      \u003ctd\u003e20111\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n#### 2. Create a customer cohort analysis dataset\n\n\n```python\nfrom ecommercetools import customers\n\ncohorts_df = customers.get_cohorts(transaction_items, period='M')\ncohorts_df.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003ecustomer_id\u003c/th\u003e\n      \u003cth\u003eorder_id\u003c/th\u003e\n      \u003cth\u003eorder_date\u003c/th\u003e\n      \u003cth\u003eacquisition_cohort\u003c/th\u003e\n      \u003cth\u003eorder_cohort\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003e536365\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:26:00\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e7\u003c/th\u003e\n      \u003ctd\u003e17850.0\u003c/td\u003e\n      \u003ctd\u003e536366\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:28:00\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e9\u003c/th\u003e\n      \u003ctd\u003e13047.0\u003c/td\u003e\n      \u003ctd\u003e536367\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:34:00\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e21\u003c/th\u003e\n      \u003ctd\u003e13047.0\u003c/td\u003e\n      \u003ctd\u003e536368\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:34:00\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e25\u003c/th\u003e\n      \u003ctd\u003e13047.0\u003c/td\u003e\n      \u003ctd\u003e536369\u003c/td\u003e\n      \u003ctd\u003e2010-12-01 08:35:00\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### 3. Create a customer cohort analysis matrix\n\n```python\nfrom ecommercetools import customers\n\ncohort_matrix_df = customers.get_cohort_matrix(transaction_items, period='M', percentage=True)\ncohort_matrix_df.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003eperiods\u003c/th\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003cth\u003e7\u003c/th\u003e\n      \u003cth\u003e8\u003c/th\u003e\n      \u003cth\u003e9\u003c/th\u003e\n      \u003cth\u003e10\u003c/th\u003e\n      \u003cth\u003e11\u003c/th\u003e\n      \u003cth\u003e12\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eacquisition_cohort\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2010-12\u003c/th\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e0.381857\u003c/td\u003e\n      \u003ctd\u003e0.334388\u003c/td\u003e\n      \u003ctd\u003e0.387131\u003c/td\u003e\n      \u003ctd\u003e0.359705\u003c/td\u003e\n      \u003ctd\u003e0.396624\u003c/td\u003e\n      \u003ctd\u003e0.379747\u003c/td\u003e\n      \u003ctd\u003e0.354430\u003c/td\u003e\n      \u003ctd\u003e0.354430\u003c/td\u003e\n      \u003ctd\u003e0.394515\u003c/td\u003e\n      \u003ctd\u003e0.373418\u003c/td\u003e\n      \u003ctd\u003e0.500000\u003c/td\u003e\n      \u003ctd\u003e0.274262\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2011-01\u003c/th\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e0.239905\u003c/td\u003e\n      \u003ctd\u003e0.282660\u003c/td\u003e\n      \u003ctd\u003e0.242280\u003c/td\u003e\n      \u003ctd\u003e0.327791\u003c/td\u003e\n      \u003ctd\u003e0.299287\u003c/td\u003e\n      \u003ctd\u003e0.261283\u003c/td\u003e\n      \u003ctd\u003e0.256532\u003c/td\u003e\n      \u003ctd\u003e0.311164\u003c/td\u003e\n      \u003ctd\u003e0.346793\u003c/td\u003e\n      \u003ctd\u003e0.368171\u003c/td\u003e\n      \u003ctd\u003e0.149644\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2011-02\u003c/th\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e0.247368\u003c/td\u003e\n      \u003ctd\u003e0.192105\u003c/td\u003e\n      \u003ctd\u003e0.278947\u003c/td\u003e\n      \u003ctd\u003e0.268421\u003c/td\u003e\n      \u003ctd\u003e0.247368\u003c/td\u003e\n      \u003ctd\u003e0.255263\u003c/td\u003e\n      \u003ctd\u003e0.281579\u003c/td\u003e\n      \u003ctd\u003e0.257895\u003c/td\u003e\n      \u003ctd\u003e0.313158\u003c/td\u003e\n      \u003ctd\u003e0.092105\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2011-03\u003c/th\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e0.190909\u003c/td\u003e\n      \u003ctd\u003e0.254545\u003c/td\u003e\n      \u003ctd\u003e0.218182\u003c/td\u003e\n      \u003ctd\u003e0.231818\u003c/td\u003e\n      \u003ctd\u003e0.177273\u003c/td\u003e\n      \u003ctd\u003e0.263636\u003c/td\u003e\n      \u003ctd\u003e0.238636\u003c/td\u003e\n      \u003ctd\u003e0.288636\u003c/td\u003e\n      \u003ctd\u003e0.088636\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2011-04\u003c/th\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003e0.227425\u003c/td\u003e\n      \u003ctd\u003e0.220736\u003c/td\u003e\n      \u003ctd\u003e0.210702\u003c/td\u003e\n      \u003ctd\u003e0.207358\u003c/td\u003e\n      \u003ctd\u003e0.237458\u003c/td\u003e\n      \u003ctd\u003e0.230769\u003c/td\u003e\n      \u003ctd\u003e0.260870\u003c/td\u003e\n      \u003ctd\u003e0.083612\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n```python\nfrom ecommercetools import customers\n\ncohort_matrix_df = customers.get_cohort_matrix(transaction_items, period='M', percentage=False)\ncohort_matrix_df.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003eperiods\u003c/th\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003cth\u003e7\u003c/th\u003e\n      \u003cth\u003e8\u003c/th\u003e\n      \u003cth\u003e9\u003c/th\u003e\n      \u003cth\u003e10\u003c/th\u003e\n      \u003cth\u003e11\u003c/th\u003e\n      \u003cth\u003e12\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eacquisition_cohort\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003e\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2010-12\u003c/th\u003e\n      \u003ctd\u003e948.0\u003c/td\u003e\n      \u003ctd\u003e362.0\u003c/td\u003e\n      \u003ctd\u003e317.0\u003c/td\u003e\n      \u003ctd\u003e367.0\u003c/td\u003e\n      \u003ctd\u003e341.0\u003c/td\u003e\n      \u003ctd\u003e376.0\u003c/td\u003e\n      \u003ctd\u003e360.0\u003c/td\u003e\n      \u003ctd\u003e336.0\u003c/td\u003e\n      \u003ctd\u003e336.0\u003c/td\u003e\n      \u003ctd\u003e374.0\u003c/td\u003e\n      \u003ctd\u003e354.0\u003c/td\u003e\n      \u003ctd\u003e474.0\u003c/td\u003e\n      \u003ctd\u003e260.0\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2011-01\u003c/th\u003e\n      \u003ctd\u003e421.0\u003c/td\u003e\n      \u003ctd\u003e101.0\u003c/td\u003e\n      \u003ctd\u003e119.0\u003c/td\u003e\n      \u003ctd\u003e102.0\u003c/td\u003e\n      \u003ctd\u003e138.0\u003c/td\u003e\n      \u003ctd\u003e126.0\u003c/td\u003e\n      \u003ctd\u003e110.0\u003c/td\u003e\n      \u003ctd\u003e108.0\u003c/td\u003e\n      \u003ctd\u003e131.0\u003c/td\u003e\n      \u003ctd\u003e146.0\u003c/td\u003e\n      \u003ctd\u003e155.0\u003c/td\u003e\n      \u003ctd\u003e63.0\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2011-02\u003c/th\u003e\n      \u003ctd\u003e380.0\u003c/td\u003e\n      \u003ctd\u003e94.0\u003c/td\u003e\n      \u003ctd\u003e73.0\u003c/td\u003e\n      \u003ctd\u003e106.0\u003c/td\u003e\n      \u003ctd\u003e102.0\u003c/td\u003e\n      \u003ctd\u003e94.0\u003c/td\u003e\n      \u003ctd\u003e97.0\u003c/td\u003e\n      \u003ctd\u003e107.0\u003c/td\u003e\n      \u003ctd\u003e98.0\u003c/td\u003e\n      \u003ctd\u003e119.0\u003c/td\u003e\n      \u003ctd\u003e35.0\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2011-03\u003c/th\u003e\n      \u003ctd\u003e440.0\u003c/td\u003e\n      \u003ctd\u003e84.0\u003c/td\u003e\n      \u003ctd\u003e112.0\u003c/td\u003e\n      \u003ctd\u003e96.0\u003c/td\u003e\n      \u003ctd\u003e102.0\u003c/td\u003e\n      \u003ctd\u003e78.0\u003c/td\u003e\n      \u003ctd\u003e116.0\u003c/td\u003e\n      \u003ctd\u003e105.0\u003c/td\u003e\n      \u003ctd\u003e127.0\u003c/td\u003e\n      \u003ctd\u003e39.0\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2011-04\u003c/th\u003e\n      \u003ctd\u003e299.0\u003c/td\u003e\n      \u003ctd\u003e68.0\u003c/td\u003e\n      \u003ctd\u003e66.0\u003c/td\u003e\n      \u003ctd\u003e63.0\u003c/td\u003e\n      \u003ctd\u003e62.0\u003c/td\u003e\n      \u003ctd\u003e71.0\u003c/td\u003e\n      \u003ctd\u003e69.0\u003c/td\u003e\n      \u003ctd\u003e78.0\u003c/td\u003e\n      \u003ctd\u003e25.0\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\n#### 4. Create a customer \"retention\" dataset\n\n\n```python\nfrom ecommercetools import customers\n\nretention_df = customers.get_retention(transactions_df)\nretention_df.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eacquisition_cohort\u003c/th\u003e\n      \u003cth\u003eorder_cohort\u003c/th\u003e\n      \u003cth\u003ecustomers\u003c/th\u003e\n      \u003cth\u003eperiods\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e948\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2011-01\u003c/td\u003e\n      \u003ctd\u003e362\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2011-02\u003c/td\u003e\n      \u003ctd\u003e317\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2011-03\u003c/td\u003e\n      \u003ctd\u003e367\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e2010-12\u003c/td\u003e\n      \u003ctd\u003e2011-04\u003c/td\u003e\n      \u003ctd\u003e341\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n#### 5. Create an RFM (H) dataset\n\nThis is an extension of the regular Recency, Frequency, Monetary value (RFM) model that includes an additional parameter \"H\" for heterogeneity. This shows the number of unique SKUs purchased by each customer. While typically unassociated with targeting, this value can be very useful in identifying which customers should probably be buying a broader mix of products than they currently are, as well as spotting those who may have stopped buying certain items. \n\n\n```python\nfrom ecommercetools import customers\n\nrfm_df = customers.get_rfm_segments(customers_df)\nrfm_df.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003ecustomer_id\u003c/th\u003e\n      \u003cth\u003eacquisition_date\u003c/th\u003e\n      \u003cth\u003erecency_date\u003c/th\u003e\n      \u003cth\u003erecency\u003c/th\u003e\n      \u003cth\u003efrequency\u003c/th\u003e\n      \u003cth\u003emonetary\u003c/th\u003e\n      \u003cth\u003eheterogeneity\u003c/th\u003e\n      \u003cth\u003etenure\u003c/th\u003e\n      \u003cth\u003er\u003c/th\u003e\n      \u003cth\u003ef\u003c/th\u003e\n      \u003cth\u003em\u003c/th\u003e\n      \u003cth\u003eh\u003c/th\u003e\n      \u003cth\u003erfm\u003c/th\u003e\n      \u003cth\u003erfm_score\u003c/th\u003e\n      \u003cth\u003erfm_segment_name\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e12346.0\u003c/td\u003e\n      \u003ctd\u003e2011-01-18 10:01:00\u003c/td\u003e\n      \u003ctd\u003e2011-01-18 10:17:00\u003c/td\u003e\n      \u003ctd\u003e3700\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e0.00\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e3701\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e111\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003eRisky\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e12350.0\u003c/td\u003e\n      \u003ctd\u003e2011-02-02 16:01:00\u003c/td\u003e\n      \u003ctd\u003e2011-02-02 16:01:00\u003c/td\u003e\n      \u003ctd\u003e3685\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e334.40\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e3685\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e111\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003eRisky\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e12365.0\u003c/td\u003e\n      \u003ctd\u003e2011-02-21 13:51:00\u003c/td\u003e\n      \u003ctd\u003e2011-02-21 14:04:00\u003c/td\u003e\n      \u003ctd\u003e3666\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003e320.69\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e3666\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e111\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003eRisky\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e12373.0\u003c/td\u003e\n      \u003ctd\u003e2011-02-01 13:10:00\u003c/td\u003e\n      \u003ctd\u003e2011-02-01 13:10:00\u003c/td\u003e\n      \u003ctd\u003e3686\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e364.60\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e3686\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e111\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003eRisky\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e12377.0\u003c/td\u003e\n      \u003ctd\u003e2010-12-20 09:37:00\u003c/td\u003e\n      \u003ctd\u003e2011-01-28 15:45:00\u003c/td\u003e\n      \u003ctd\u003e3690\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e1628.12\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n      \u003ctd\u003e3730\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e111\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n      \u003ctd\u003eRisky\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### 6. Create a purchase latency dataset\n\n\n```python\nfrom ecommercetools import customers \n\nlatency_df = customers.get_latency(transactions_df)\nlatency_df.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003ecustomer_id\u003c/th\u003e\n      \u003cth\u003efrequency\u003c/th\u003e\n      \u003cth\u003erecency_date\u003c/th\u003e\n      \u003cth\u003erecency\u003c/th\u003e\n      \u003cth\u003eavg_latency\u003c/th\u003e\n      \u003cth\u003emin_latency\u003c/th\u003e\n      \u003cth\u003emax_latency\u003c/th\u003e\n      \u003cth\u003estd_latency\u003c/th\u003e\n      \u003cth\u003ecv\u003c/th\u003e\n      \u003cth\u003edays_to_next_order\u003c/th\u003e\n      \u003cth\u003elabel\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e12680.0\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n      \u003ctd\u003e2011-12-09 12:50:00\u003c/td\u003e\n      \u003ctd\u003e3388\u003c/td\u003e\n      \u003ctd\u003e28\u003c/td\u003e\n      \u003ctd\u003e16\u003c/td\u003e\n      \u003ctd\u003e73\u003c/td\u003e\n      \u003ctd\u003e30.859898\u003c/td\u003e\n      \u003ctd\u003e1.102139\u003c/td\u003e\n      \u003ctd\u003e-3329.0\u003c/td\u003e\n      \u003ctd\u003eOrder overdue\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e13113.0\u003c/td\u003e\n      \u003ctd\u003e24\u003c/td\u003e\n      \u003ctd\u003e2011-12-09 12:49:00\u003c/td\u003e\n      \u003ctd\u003e3388\u003c/td\u003e\n      \u003ctd\u003e15\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e52\u003c/td\u003e\n      \u003ctd\u003e12.060126\u003c/td\u003e\n      \u003ctd\u003e0.804008\u003c/td\u003e\n      \u003ctd\u003e-3361.0\u003c/td\u003e\n      \u003ctd\u003eOrder overdue\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e15804.0\u003c/td\u003e\n      \u003ctd\u003e13\u003c/td\u003e\n      \u003ctd\u003e2011-12-09 12:31:00\u003c/td\u003e\n      \u003ctd\u003e3388\u003c/td\u003e\n      \u003ctd\u003e15\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003e39\u003c/td\u003e\n      \u003ctd\u003e11.008261\u003c/td\u003e\n      \u003ctd\u003e0.733884\u003c/td\u003e\n      \u003ctd\u003e-3362.0\u003c/td\u003e\n      \u003ctd\u003eOrder overdue\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e13777.0\u003c/td\u003e\n      \u003ctd\u003e33\u003c/td\u003e\n      \u003ctd\u003e2011-12-09 12:25:00\u003c/td\u003e\n      \u003ctd\u003e3388\u003c/td\u003e\n      \u003ctd\u003e11\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e48\u003c/td\u003e\n      \u003ctd\u003e12.055274\u003c/td\u003e\n      \u003ctd\u003e1.095934\u003c/td\u003e\n      \u003ctd\u003e-3365.0\u003c/td\u003e\n      \u003ctd\u003eOrder overdue\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e17581.0\u003c/td\u003e\n      \u003ctd\u003e25\u003c/td\u003e\n      \u003ctd\u003e2011-12-09 12:21:00\u003c/td\u003e\n      \u003ctd\u003e3388\u003c/td\u003e\n      \u003ctd\u003e14\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003e67\u003c/td\u003e\n      \u003ctd\u003e21.974293\u003c/td\u003e\n      \u003ctd\u003e1.569592\u003c/td\u003e\n      \u003ctd\u003e-3352.0\u003c/td\u003e\n      \u003ctd\u003eOrder overdue\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\n#### 7. Customer ABC segmentation\n\n```python\nfrom ecommercetools import customers\n\nabc_df = customers.get_abc_segments(customers_df, months=12, abc_class_name='abc_class_12m', abc_rank_name='abc_rank_12m')\nabc_df.head()\n```\n\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003ecustomer_id\u003c/th\u003e\n      \u003cth\u003eabc_class_12m\u003c/th\u003e\n      \u003cth\u003eabc_rank_12m\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e12346.0\u003c/td\u003e\n      \u003ctd\u003eD\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e12347.0\u003c/td\u003e\n      \u003ctd\u003eD\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e12348.0\u003c/td\u003e\n      \u003ctd\u003eD\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e12349.0\u003c/td\u003e\n      \u003ctd\u003eD\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e12350.0\u003c/td\u003e\n      \u003ctd\u003eD\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n#### 8. Predict customer AOV, CLV, and orders\n\nEcommerceTools allows you to predict the AOV, Customer Lifetime Value (CLV) and expected number of orders via the Gamma-Gamma and BG/NBD models from the excellent Lifetimes package. By passing the dataframe of transactions from `get_transactions()` to the `get_customer_predictions()` function, EcommerceTools will fit the BG/NBD and Gamma-Gamma models and predict the AOV, order quantity, and CLV for each customer in the defined number of future days after the end of the observation period.\n\n```python\ncustomer_predictions = customers.get_customer_predictions(transactions_df, \n                                                          observation_period_end='2011-12-09', \n                                                          days=90)\ncustomer_predictions.head(10)\n```\n\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003ecustomer_id\u003c/th\u003e\n      \u003cth\u003epredicted_purchases\u003c/th\u003e\n      \u003cth\u003eaov\u003c/th\u003e\n      \u003cth\u003eclv\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e12346.0\u003c/td\u003e\n      \u003ctd\u003e0.188830\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e12347.0\u003c/td\u003e\n      \u003ctd\u003e1.408736\u003c/td\u003e\n      \u003ctd\u003e569.978836\u003c/td\u003e\n      \u003ctd\u003e836.846896\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e12348.0\u003c/td\u003e\n      \u003ctd\u003e0.805907\u003c/td\u003e\n      \u003ctd\u003e333.784235\u003c/td\u003e\n      \u003ctd\u003e308.247354\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e12349.0\u003c/td\u003e\n      \u003ctd\u003e0.855607\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e12350.0\u003c/td\u003e\n      \u003ctd\u003e0.196304\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003e12352.0\u003c/td\u003e\n      \u003ctd\u003e1.682277\u003c/td\u003e\n      \u003ctd\u003e376.175359\u003c/td\u003e\n      \u003ctd\u003e647.826169\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003e12353.0\u003c/td\u003e\n      \u003ctd\u003e0.272541\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e7\u003c/th\u003e\n      \u003ctd\u003e12354.0\u003c/td\u003e\n      \u003ctd\u003e0.247183\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e8\u003c/th\u003e\n      \u003ctd\u003e12355.0\u003c/td\u003e\n      \u003ctd\u003e0.262909\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e9\u003c/th\u003e\n      \u003ctd\u003e12356.0\u003c/td\u003e\n      \u003ctd\u003e0.645368\u003c/td\u003e\n      \u003ctd\u003e324.039419\u003c/td\u003e\n      \u003ctd\u003e256.855226\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n---\n\n### Advertising\n\n#### 1. Create paid search keywords\n\n\n```python\nfrom ecommercetools import advertising\n\nproduct_names = ['fly rods', 'fly reels']\nkeywords_prepend = ['buy', 'best', 'cheap', 'reduced']\nkeywords_append = ['for sale', 'price', 'promotion', 'promo', 'coupon', 'voucher', 'shop', 'suppliers']\ncampaign_name = 'fly_fishing'\n\nkeywords = advertising.generate_ad_keywords(product_names, keywords_prepend, keywords_append, campaign_name)\nkeywords.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eproduct\u003c/th\u003e\n      \u003cth\u003ekeywords\u003c/th\u003e\n      \u003cth\u003ematch_type\u003c/th\u003e\n      \u003cth\u003ecampaign_name\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003efly rods\u003c/td\u003e\n      \u003ctd\u003e[fly rods]\u003c/td\u003e\n      \u003ctd\u003eExact\u003c/td\u003e\n      \u003ctd\u003efly_fishing\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003efly rods\u003c/td\u003e\n      \u003ctd\u003e[buy fly rods]\u003c/td\u003e\n      \u003ctd\u003eExact\u003c/td\u003e\n      \u003ctd\u003efly_fishing\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003efly rods\u003c/td\u003e\n      \u003ctd\u003e[best fly rods]\u003c/td\u003e\n      \u003ctd\u003eExact\u003c/td\u003e\n      \u003ctd\u003efly_fishing\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003efly rods\u003c/td\u003e\n      \u003ctd\u003e[cheap fly rods]\u003c/td\u003e\n      \u003ctd\u003eExact\u003c/td\u003e\n      \u003ctd\u003efly_fishing\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003efly rods\u003c/td\u003e\n      \u003ctd\u003e[reduced fly rods]\u003c/td\u003e\n      \u003ctd\u003eExact\u003c/td\u003e\n      \u003ctd\u003efly_fishing\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### 2. Create paid search ad copy using Spintax\n\n```python\nfrom ecommercetools import advertising\n\ntext = \"Fly Reels from {Orvis|Loop|Sage|Airflo|Nautilus} for {trout|salmon|grayling|pike}\"\nspin = advertising.generate_spintax(text, single=False)\n\nspin\n```\n\n\n    ['Fly Reels from Orvis for trout',\n     'Fly Reels from Orvis for salmon',\n     'Fly Reels from Orvis for grayling',\n     'Fly Reels from Orvis for pike',\n     'Fly Reels from Loop for trout',\n     'Fly Reels from Loop for salmon',\n     'Fly Reels from Loop for grayling',\n     'Fly Reels from Loop for pike',\n     'Fly Reels from Sage for trout',\n     'Fly Reels from Sage for salmon',\n     'Fly Reels from Sage for grayling',\n     'Fly Reels from Sage for pike',\n     'Fly Reels from Airflo for trout',\n     'Fly Reels from Airflo for salmon',\n     'Fly Reels from Airflo for grayling',\n     'Fly Reels from Airflo for pike',\n     'Fly Reels from Nautilus for trout',\n     'Fly Reels from Nautilus for salmon',\n     'Fly Reels from Nautilus for grayling',\n     'Fly Reels from Nautilus for pike']\n\n---\n\n### Operations\n\n#### 1. Create an ABC inventory classification\n\n```python\ninventory_classification = operations.get_inventory_classification(transaction_items)\ninventory_classification.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003esku\u003c/th\u003e\n      \u003cth\u003eabc_class\u003c/th\u003e\n      \u003cth\u003eabc_rank\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e10002\u003c/td\u003e\n      \u003ctd\u003eA\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e10080\u003c/td\u003e\n      \u003ctd\u003eA\u003c/td\u003e\n      \u003ctd\u003e2\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e10120\u003c/td\u003e\n      \u003ctd\u003eA\u003c/td\u003e\n      \u003ctd\u003e3\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e10123C\u003c/td\u003e\n      \u003ctd\u003eA\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e10123G\u003c/td\u003e\n      \u003ctd\u003eA\u003c/td\u003e\n      \u003ctd\u003e4\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n---\n### Marketing\n\n#### 1. Get ecommerce trading calendar\n\n```python\nfrom ecommercetools import marketing\n\ntrading_calendar_df = marketing.get_trading_calendar('2021-01-01', days=365)\ntrading_calendar_df.head()\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003edate\u003c/th\u003e\n      \u003cth\u003eevent\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e2021-01-01\u003c/td\u003e\n      \u003ctd\u003eJanuary sale\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e2021-01-02\u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e2021-01-03\u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e2021-01-04\u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e2021-01-05\u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### 2. Get ecommerce trading events\n\n\n```python\nfrom ecommercetools import marketing\n\ntrading_events_df = marketing.get_trading_events('2021-01-01', days=365)\ntrading_events_df.head()\n```\n\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003edate\u003c/th\u003e\n      \u003cth\u003eevent\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e2021-01-01\u003c/td\u003e\n      \u003ctd\u003eJanuary sale\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e2021-01-29\u003c/td\u003e\n      \u003ctd\u003eJanuary Pay Day\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e2021-02-11\u003c/td\u003e\n      \u003ctd\u003eValentine's Day [last order date]\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e2021-02-14\u003c/td\u003e\n      \u003ctd\u003eValentine's Day\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e2021-02-26\u003c/td\u003e\n      \u003ctd\u003eFebruary Pay Day\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\n---\n\n### NLP\n\n#### 1. Generate text summaries\nThe `get_summaries()` function of the `nlp` module takes a Pandas dataframe containing text and returns a machine-generated summary of the content using a Huggingface Transformers pipeline via PyTorch. To use this feature, first load your Pandas dataframe and import the `nlp` module from `ecommercetools`.\n\n```python\nimport pandas as pd\nfrom ecommercetools import nlp \n\npd.set_option('max_colwidth', 1000)\ndf = pd.read_csv('text.csv')\ndf.head()\n```\n\nSpecify the name of the Pandas dataframe, the column containing the text you wish to summarise (i.e. `product_description`), and specify a column name in which to store the machine-generated summary. The `min_length` and `max_length` arguments control the number of words generated, while the `do_sample` argument controls whether the generated text is completely unique (`do_sample=False`) or extracted from the text (`do_sample=True`).\n\n```python\ndf = nlp.get_summaries(df, 'product_description', 'sampled_summary', min_length=50, max_length=100, do_sample=True)\ndf = nlp.get_summaries(df, 'product_description', 'unsampled_summary', min_length=50, max_length=100, do_sample=False)\ndf = nlp.get_summaries(df, 'product_description', 'unsampled_summary_20_to_30', min_length=20, max_length=30, do_sample=False)\n```\n\nSince the model used for text summarisation is very large (1.2 GB plus), this function will take some time to complete. Once loaded, summaries are generated within a second or two per piece of text, so it is advisable to try smaller volumes of data initially.\n\n\n### SEO\n\n#### 1. Discover XML sitemap locations\nThe `get_sitemaps()` function takes the location of a `robots.txt` file (always stored at the root of a domain), and returns the URLs of any XML sitemaps listed within. \n\n```python\nfrom ecommercetools import seo\n\nsitemaps = seo.get_sitemaps(\"http://www.flyandlure.org/robots.txt\")\nprint(sitemaps)\n\n```\n\n#### 2. Get an XML sitemap\nThe `get_dataframe()` function allows you to download the URLs in an XML sitemap to a Pandas dataframe. If the sitemap contains child sitemaps, each of these will be retrieved. You can save the Pandas dataframe to CSV in the usual way. \n\n```python\nfrom ecommercetools import seo\n\ndf = seo.get_sitemap(\"http://flyandlure.org/sitemap.xml\")\nprint(df.head())\n```\n\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eloc\u003c/th\u003e\n      \u003cth\u003echangefreq\u003c/th\u003e\n      \u003cth\u003epriority\u003c/th\u003e\n      \u003cth\u003edomain\u003c/th\u003e\n      \u003cth\u003esitemap_name\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/\u003c/td\u003e\n      \u003ctd\u003ehourly\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003eflyandlure.org\u003c/td\u003e\n      \u003ctd\u003ehttp://www.flyandlure.org/sitemap.xml\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/about\u003c/td\u003e\n      \u003ctd\u003emonthly\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003eflyandlure.org\u003c/td\u003e\n      \u003ctd\u003ehttp://www.flyandlure.org/sitemap.xml\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/terms\u003c/td\u003e\n      \u003ctd\u003emonthly\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003eflyandlure.org\u003c/td\u003e\n      \u003ctd\u003ehttp://www.flyandlure.org/sitemap.xml\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/privacy\u003c/td\u003e\n      \u003ctd\u003emonthly\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003eflyandlure.org\u003c/td\u003e\n      \u003ctd\u003ehttp://www.flyandlure.org/sitemap.xml\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/copyright\u003c/td\u003e\n      \u003ctd\u003emonthly\u003c/td\u003e\n      \u003ctd\u003e1.0\u003c/td\u003e\n      \u003ctd\u003eflyandlure.org\u003c/td\u003e\n      \u003ctd\u003ehttp://www.flyandlure.org/sitemap.xml\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### 3. Get Core Web Vitals from PageSpeed Insights\nThe `get_core_web_vitals()` function retrieves the Core Web Vitals metrics for a list of sites from the Google PageSpeed Insights API and returns results in a Pandas dataframe. The function requires a a Google PageSpeed Insights API key. \n\n```python\nfrom ecommercetools import seo\n\npagespeed_insights_key = \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\nurls = ['https://www.bbc.co.uk', 'https://www.bbc.co.uk/iplayer']\ndf = seo.get_core_web_vitals(pagespeed_insights_key, urls)\nprint(df.head())\n```\n\n#### 4. Get Google Knowledge Graph data\nThe `get_knowledge_graph()` function returns the Google Knowledge Graph data for a given search term. This requires the use of a Google Knowledge Graph API key. By default, the function returns output in a Pandas dataframe, but you can pass the `output=\"json\"` argument if you wish to receive the JSON data back. \n\n```python\nfrom ecommercetools import seo\n\nknowledge_graph_key = \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\nknowledge_graph = seo.get_knowledge_graph(knowledge_graph_key, \"tesla\", output=\"dataframe\")\nprint(knowledge_graph)\n```\n\n#### 5. Get Google Search Console API data\nThe `query_google_search_console()` function runs a search query on the Google Search Console API and returns data in a Pandas dataframe. This function requires a JSON client secrets key with access to the Google Search Console API. \n\n```python\nfrom ecommercetools import seo\n\nkey = \"google-search-console.json\"\nsite_url = \"http://flyandlure.org\"\npayload = {\n    'startDate': \"2019-01-01\",\n    'endDate': \"2019-12-31\",\n    'dimensions': [\"page\", \"device\", \"query\"],\n    'rowLimit': 100,\n    'startRow': 0\n}\n\ndf = seo.query_google_search_console(key, site_url, payload)\nprint(df.head())\n\n```\n\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003epage\u003c/th\u003e\n      \u003cth\u003edevice\u003c/th\u003e\n      \u003cth\u003equery\u003c/th\u003e\n      \u003cth\u003eclicks\u003c/th\u003e\n      \u003cth\u003eimpressions\u003c/th\u003e\n      \u003cth\u003ectr\u003c/th\u003e\n      \u003cth\u003eposition\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/articles/fly_fishing_gea...\u003c/td\u003e\n      \u003ctd\u003eMOBILE\u003c/td\u003e\n      \u003ctd\u003esimms freestone waders review\u003c/td\u003e\n      \u003ctd\u003e56\u003c/td\u003e\n      \u003ctd\u003e217\u003c/td\u003e\n      \u003ctd\u003e25.81\u003c/td\u003e\n      \u003ctd\u003e3.12\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/\u003c/td\u003e\n      \u003ctd\u003eMOBILE\u003c/td\u003e\n      \u003ctd\u003efly and lure\u003c/td\u003e\n      \u003ctd\u003e37\u003c/td\u003e\n      \u003ctd\u003e159\u003c/td\u003e\n      \u003ctd\u003e23.27\u003c/td\u003e\n      \u003ctd\u003e3.81\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/articles/fly_fishing_gea...\u003c/td\u003e\n      \u003ctd\u003eDESKTOP\u003c/td\u003e\n      \u003ctd\u003eorvis encounter waders review\u003c/td\u003e\n      \u003ctd\u003e35\u003c/td\u003e\n      \u003ctd\u003e134\u003c/td\u003e\n      \u003ctd\u003e26.12\u003c/td\u003e\n      \u003ctd\u003e4.04\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/articles/fly_fishing_gea...\u003c/td\u003e\n      \u003ctd\u003eDESKTOP\u003c/td\u003e\n      \u003ctd\u003esimms freestone waders review\u003c/td\u003e\n      \u003ctd\u003e35\u003c/td\u003e\n      \u003ctd\u003e200\u003c/td\u003e\n      \u003ctd\u003e17.50\u003c/td\u003e\n      \u003ctd\u003e3.50\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org/\u003c/td\u003e\n      \u003ctd\u003eDESKTOP\u003c/td\u003e\n      \u003ctd\u003efly and lure\u003c/td\u003e\n      \u003ctd\u003e32\u003c/td\u003e\n      \u003ctd\u003e170\u003c/td\u003e\n      \u003ctd\u003e18.82\u003c/td\u003e\n      \u003ctd\u003e3.09\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n##### Fetching all results from Google Search Console\n\nTo fetch all results, set `fetch_all` to `True`. This will automatically paginate through your Google Search Console data and return all results. Be aware that if you do this you may hit Google's quota limit if you run a query over an extended period, or have a busy site with lots of `page` or `query` dimensions. \n\n```python\nfrom ecommercetools import seo\n\nkey = \"google-search-console.json\"\nsite_url = \"http://flyandlure.org\"\npayload = {\n    'startDate': \"2019-01-01\",\n    'endDate': \"2019-12-31\",\n    'dimensions': [\"page\", \"device\", \"query\"],\n    'rowLimit': 25000,\n    'startRow': 0\n}\n\ndf = seo.query_google_search_console(key, site_url, payload, fetch_all=True)\nprint(df.head())\n\n```\n\n##### Comparing two time periods in Google Search Console\n\n```python\npayload_before = {\n    'startDate': \"2021-08-11\",\n    'endDate': \"2021-08-31\",\n    'dimensions': [\"page\",\"query\"],    \n}\n\npayload_after = {\n    'startDate': \"2021-07-21\",\n    'endDate': \"2021-08-10\",\n    'dimensions': [\"page\",\"query\"],    \n}\n\ndf = seo.query_google_search_console_compare(key, site_url, payload_before, payload_after, fetch_all=False)\ndf.sort_values(by='clicks_change', ascending=False).head()\n```\n\n\n#### 6. Get the number of \"indexed\" pages\nThe `get_indexed_pages()` function uses the \"site:\" prefix to search Google for the number of pages \"indexed\". This is very approximate and may not be a perfect representation, but it's usually a good guide of site \"size\" in the absence of other data. \n\n```python\nfrom ecommercetools import seo\n\nurls = ['https://www.bbc.co.uk', 'https://www.bbc.co.uk/iplayer', 'http://flyandlure.org']\ndf = seo.get_indexed_pages(urls)\nprint(df.head())\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eurl\u003c/th\u003e\n      \u003cth\u003eindexed_pages\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003ehttp://flyandlure.org\u003c/td\u003e\n      \u003ctd\u003e2090\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003ehttps://www.bbc.co.uk/iplayer\u003c/td\u003e\n      \u003ctd\u003e215000\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003ehttps://www.bbc.co.uk\u003c/td\u003e\n      \u003ctd\u003e12700000\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### 7. Get keyword suggestions from Google Autocomplete\nThe `google_autocomplete()` function returns a set of keyword suggestions from Google Autocomplete. The `include_expanded=True` argument allows you to expand the number of suggestions shown by appending prefixes and suffixes to the search terms. \n\n```python\nfrom ecommercetools import seo\n\nsuggestions = seo.google_autocomplete(\"data science\", include_expanded=False)\nprint(suggestions)\n\nsuggestions = seo.google_autocomplete(\"data science\", include_expanded=True)\nprint(suggestions)\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eterm\u003c/th\u003e\n      \u003cth\u003erelevance\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003edata science jobs\u003c/td\u003e\n      \u003ctd\u003e650\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003edata science jobs chester\u003c/td\u003e\n      \u003ctd\u003e601\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003edata science course\u003c/td\u003e\n      \u003ctd\u003e600\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003edata science masters\u003c/td\u003e\n      \u003ctd\u003e554\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003edata science salary\u003c/td\u003e\n      \u003ctd\u003e553\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003edata science internship\u003c/td\u003e\n      \u003ctd\u003e552\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003edata science jobs london\u003c/td\u003e\n      \u003ctd\u003e551\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e7\u003c/th\u003e\n      \u003ctd\u003edata science graduate scheme\u003c/td\u003e\n      \u003ctd\u003e550\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n#### 8. Retrieve robots.txt content\nThe `get_robots()` function returns the contents of a robots.txt file in a Pandas dataframe so it can be parsed and analysed. \n\n```python\nfrom ecommercetools import seo\n\nrobots = seo.get_robots(\"http://www.flyandlure.org/robots.txt\")\nprint(robots)\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003edirective\u003c/th\u003e\n      \u003cth\u003eparameter\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003eUser-agent\u003c/td\u003e\n      \u003ctd\u003e*\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e/signin\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e/signup\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e/users\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e/contact\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e/activate\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e/*/page\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e7\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e/articles/search\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e8\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e/search.php\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e9\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e*q=*\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e10\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e*category_slug=*\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e11\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e*country_slug=*\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e12\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e*county_slug=*\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e13\u003c/th\u003e\n      \u003ctd\u003eDisallow\u003c/td\u003e\n      \u003ctd\u003e*features=*\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n#### 9. Get Google SERPs\nThe `get_serps()` function returns a Pandas dataframe containing the Google search engine results for a given search term. Note that this function is not suitable for large-scale scraping and currently includes no features to prevent it from being blocked.\n\n```python\nfrom ecommercetools import seo\n\nserps = seo.get_serps(\"data science blog\")\nprint(serps)\n```\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003etitle\u003c/th\u003e\n      \u003cth\u003elink\u003c/th\u003e\n      \u003cth\u003etext\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e10 of the best data science blogs to follow - ...\u003c/td\u003e\n      \u003ctd\u003ehttps://www.tableau.com/learn/articles/data-sc...\u003c/td\u003e\n      \u003ctd\u003e10 of the best data science blogs to follow. T...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003eBest Data Science Blogs to Follow in 2020 | by...\u003c/td\u003e\n      \u003ctd\u003ehttps://towardsdatascience.com/best-data-scien...\u003c/td\u003e\n      \u003ctd\u003e14 Jul 2020 — 1. Towards Data Science · Joined...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003eTop 20 Data Science Blogs And Websites For Dat...\u003c/td\u003e\n      \u003ctd\u003ehttps://medium.com/@exastax/top-20-data-scienc...\u003c/td\u003e\n      \u003ctd\u003eTop 20 Data Science Blogs And Websites For Dat...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003eData Science Blog – Dataquest\u003c/td\u003e\n      \u003ctd\u003ehttps://www.dataquest.io/blog/\u003c/td\u003e\n      \u003ctd\u003eBrowse our data science blog to get helpful ti...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e51 Awesome Data Science Blogs You Need To Chec...\u003c/td\u003e\n      \u003ctd\u003ehttps://365datascience.com/trending/51-data-sc...\u003c/td\u003e\n      \u003ctd\u003eBlog name: DataKind · datakind data science bl...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003eBlogs on AI, Analytics, Data Science, Machine ...\u003c/td\u003e\n      \u003ctd\u003ehttps://www.kdnuggets.com/websites/blogs.html\u003c/td\u003e\n      \u003ctd\u003eIndividual/small group blogs · Ai4 blog, featu...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003eData Science Blog – Applied Data Science\u003c/td\u003e\n      \u003ctd\u003ehttps://data-science-blog.com/\u003c/td\u003e\n      \u003ctd\u003e... an Bedeutung – DevOps for Data Science. De...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e7\u003c/th\u003e\n      \u003ctd\u003eTop 10 Data Science and AI Blogs in 2020 - Liv...\u003c/td\u003e\n      \u003ctd\u003ehttps://livecodestream.dev/post/top-data-scien...\u003c/td\u003e\n      \u003ctd\u003eSome of the best data science and AI blogs for...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e8\u003c/th\u003e\n      \u003ctd\u003eData Science Blogs: 17 Must-Read Blogs for Dat...\u003c/td\u003e\n      \u003ctd\u003ehttps://www.thinkful.com/blog/data-science-blogs/\u003c/td\u003e\n      \u003ctd\u003eData scientists could be considered the magici...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e9\u003c/th\u003e\n      \u003ctd\u003erushter/data-science-blogs: A curated list of ...\u003c/td\u003e\n      \u003ctd\u003ehttps://github.com/rushter/data-science-blogs\u003c/td\u003e\n      \u003ctd\u003eA curated list of data science blogs. Contribu...\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n#### Create an ABCD classification of Google Search Console data\nThe `classify_pages()` function returns an ABCD classification of Google Search Console data. This calculates the cumulative sum of clicks and then categorises pages using the ABC algorithm (the first 80% are classed A, the next 10% are classed B, and the final 10% are classed C, with the zero click pages classed D). \n\n\n\n\n```python\nfrom ecommercetools import seo\n\nkey = \"client_secrets.json\"\nsite_url = \"example-domain.co.uk\"\nstart_date = '2022-10-01'\nend_date = '2022-10-31'\n\ndf_classes = seo.classify_pages(key, site_url, start_date, end_date, output='classes')\nprint(df_classes.head())\n\ndf_summary = seo.classify_pages(key, site_url, start_date, end_date, output='summary')\nprint(df_summary)\n\n```\n\n                                                    page  clicks  impressions    ctr  position  clicks_cumsum  clicks_running_pc  pc_share class  class_rank\n    0  https://practicaldatascience.co.uk/machine-lea...    3890        36577  10.64     12.64           3890           8.382898  8.382898     A           1\n    1  https://practicaldatascience.co.uk/data-scienc...    2414        16618  14.53     14.30           6304          13.585036  5.202138     A           2\n    2  https://practicaldatascience.co.uk/data-scienc...    2378        71496   3.33     16.39           8682          18.709594  5.124558     A           3\n    3  https://practicaldatascience.co.uk/data-scienc...    1942        14274  13.61     15.02          10624          22.894578  4.184984     A           4\n    4  https://practicaldatascience.co.uk/data-scienc...    1738        23979   7.25     11.80          12362          26.639945  3.745367     A           5\n      \n\n    class  pages  impressions  clicks   avg_ctr  avg_position  share_of_clicks  share_of_impressions\n    0     A     63       747643   36980  5.126349     22.706825             79.7                  43.7\n    1     B     46       639329    4726  3.228043     31.897826             10.2                  37.4\n    2     C    190       323385    4698  2.393632     38.259368             10.1                  18.9\n    3     D     36         1327       0  0.000000     25.804722              0.0                   0.1\n\n\n\n---\n\n### Reports\nThe Reports module creates weekly, monthly, quarterly, or yearly reports for customers and orders and calculates a range of common ecommerce metrics to show business performance.\n\n#### 1. Customers report\nThe `customers_report()` function takes a formatted dataframe of transaction items (see above) and a desired frequency (D for daily, W for weekly, M for monthly, Q for quarterly) and calculates aggregate metrics for each period. \n\nThe function returns the number of orders, the number of customers, the number of new customers, the number of returning customers, and the acquisition rate (or proportion of new customers). For monthly reporting, I would recommend a 13-month period so you can compare the last month with the same month the previous year. \n\n```python\nfrom ecommercetools import reports\n\ndf_customers_report = reports.customers_report(transaction_items, frequency='M')\nprint(df_customers_report.head(13))\n```\n\n#### 2. Transactions report\nThe `transactions_report()` function takes a formatted dataframe of transaction items (see above) and a desired frequency (D for daily, W for weekly, M for monthly, Q for quarterly) and calculates aggregate metrics for each period. \n\nThe metrics returned are: customers, orders, revenue, SKUs, units, average order value, average SKUs per order, average units per order, and average revenue per customer. \n\n```python\nfrom ecommercetools import reports\n\ndf_orders_report = reports.transactions_report(transaction_items, frequency='M')\nprint(df_orders_report.head(13))\n```\n\n","funding_links":[],"categories":["Personalisation / Segmentation","Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpractical-data-science%2Fecommercetools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpractical-data-science%2Fecommercetools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpractical-data-science%2Fecommercetools/lists"}