{ "info": { "author": "Oleh Omelchenko", "author_email": "ptrvtch@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# gaapi4py\n\nGoogle Analytics Reporting API v4 for Python 3\n\n## Prerequisites\n\nTo use this library, you need to have a project in Google Cloud Platform and a service account key that has access to Google Analytics account you want to get data from.\n\n## Quick Start\n\n```python\nfrom gaapi4py import GAClient\n# if GOOGLE_APPLICATION_CREDENTIALS is set:\nc = GAClient() \n# or you may specify keyfile path:\nc = GAClient(json_keyfile=\"path/to/keyfile.json\")\n\n\nrequest_body = {\n 'view_id': '123456789',\n 'start_date': '2019-01-01',\n 'end_date': '2019-01-31',\n 'dimensions': {\n 'ga:sourceMedium',\n 'ga:date'\n },\n 'metrics': {\n 'ga:sessions'\n },\n 'filter': 'ga:sourceMedium==google / organic' # optional filter clause\n}\n\nresponse = c.get_all_data(request_body)\n\nresponse['info'] # sampling and \"golden\" metadata\n\nresponse['data'] # Pandas dataframe that contains data from GA\n```\n\nIf you want to make many requests to a speficic view or with specific dateranges, you can set date ranges for all future requests:\n\n```python\n# Pass arguments to class init\nc = GAClient(view_id=\"123456789\", start_date=\"2019-09-01\", end_date=\"2019-09-07\") \n# or use methods to overwrite viewID or dateranges\nc.set_view_id('123456789')\nc.set_dateranges('2019-01-01', '2019-01-31')\n\nrequest_body_1 = {\n 'dimensions': {\n 'ga:sourceMedium',\n 'ga:date'\n },\n 'metrics': {\n 'ga:sessions'\n }\n}\n\nrequest_body_2 = {\n 'dimensions': {\n 'ga:deviceCategory',\n 'ga:date'\n },\n 'metrics': {\n 'ga:sessions'\n }\n}\n\nresponse_1 = c.get_all_data(request_body_1)\nresponse_2 = c.get_all_data(request_body_2)\n```\n\n## Avoid sampling by taking data day-by-day\n\n>Important! Google Analytics reporting API has a limit of maximum 100 requests per 100 seconds. If you want to iterate over large period of days, you might consider adding `time.sleep(1)` at the end of the loop to avoid reaching this limit.\n\n```python\nfrom datetime import date, timedelta\nfrom time import sleep\n\nimport pandas as pd\nfrom gaapi4py import GAClient\n\nc = GAClient(view_id='123456789')\n\nstart_date = date(2019,7,1)\nend_date = date(2019,7,14)\n\ndf_list = []\niter_date = start_date\nwhile iter_date <= end_date:\n c.set_dateranges(iter_date, iter_date)\n response = c.get_all_data({\n 'dimensions': {\n 'ga:sourceMedium',\n 'ga:deviceCategory'\n },\n 'metrics': {\n 'ga:sessions'\n }\n })\n df = response['data']\n df['date'] = iter_date\n df_list.append(response['data'])\n iter_date = iter_date + timedelta(days=1)\n time.sleep(1)\n\nall_data = pd.concat(df_list, ignore_index=True)\n\n```\n\n## Avoid \"maximum 7 dimensions\" restriction\n\nIf you store sessionId and/or hitId as custom dimensions ([Example implementation on Simo Ahava's blog](https://www.simoahava.com/analytics/improve-data-collection-with-four-custom-dimensions/)), you can circumvent restriction on maximum number of dimensions and metrics in one report. Example below:\n\n> If sampling starts to appear, try to break the set of dimensions into smaller parts and run queries on them.\n\n```python\none_day = date(2019,7,1)\nc.set_dateranges(one_day, one_day)\n\nSESSION_ID_CD_INDEX = '2'\nHIT_ID_CD_INDEX = '5'\n\nsession_id = 'dimension' + SESSION_ID_CD_INDEX\nhit_id = 'dimension' + HIT_ID_CD_INDEX\n\n\n#Get session scope data\nresponse_1 = c.get_all_data({\n 'dimensions': {\n 'ga:' + session_id,\n 'ga:sourceMedium',\n 'ga:campaign',\n 'ga:keyword',\n 'ga:adContent',\n 'ga:userType',\n 'ga:deviceCategory'\n },\n 'metrics': {\n 'ga:sessions'\n }\n})\n\nresponse2 = c.get_all_data({\n 'dimensions': {\n 'ga:' + session_id,\n 'ga:landingPagePath',\n 'ga:secondPagePath',\n 'ga:exitPagePath',\n 'ga:pageDepth',\n 'ga:daysSinceLastSession',\n 'ga:sessionCount'\n },\n 'metrics': {\n 'ga:hits',\n 'ga:totalEvents',\n 'ga:bounces',\n 'ga:sessionDuration'\n }\n})\n\nall_data = response_1['data'].merge(response2['data'], on=session_id, how='left')\n\nall_data.rename(index=str, columns={\n session_id: 'session_id'\n}, inplace=True)\n\nall_data.head()\n\n# Get hit scope data\nhits_response_1 = c.get_all_data({\n 'dimensions': {\n 'ga:' + session_id,\n 'ga:' + hit_id,\n 'ga:pagePath',\n 'ga:previousPagePath',\n 'ga:dateHourMinute'\n },\n 'metrics': {\n 'ga:hits',\n 'ga:totalEvents',\n 'ga:pageviews'\n }\n})\n\nhits_response_2 = c.get_all_data({\n 'dimensions': {\n 'ga:' + session_id,\n 'ga:' + hit_id,\n 'ga:eventCategory',\n 'ga:eventAction',\n 'ga:eventLabel'\n },\n 'metrics': {\n 'ga:totalEvents'\n }\n})\n\nall_hits_data = hits_response_1['data'].merge(hits_response_2['data'],\n on=[session_id, hit_id],\n how='left')\nall_hits_data.rename(index=str, columns={\n session_id: 'session_id',\n hit_id: 'hit_id'\n}, inplace=True)\n\nall_hits_data.head()\n\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/gaapi4py/gaapi4py", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "gaapi4py", "package_url": "https://pypi.org/project/gaapi4py/", "platform": "", "project_url": "https://pypi.org/project/gaapi4py/", "project_urls": { "Homepage": "http://github.com/gaapi4py/gaapi4py" }, "release_url": "https://pypi.org/project/gaapi4py/1.2.0/", "requires_dist": [ "pandas", "oauth2client", "google-api-python-client" ], "requires_python": "", "summary": "Google Analytics Reporting API v4 for Python 3", "version": "1.2.0" }, "last_serial": 5809844, "releases": { "1.0.1": [ { "comment_text": "", "digests": { "md5": "52edf7935eb732ed9aca5430bbf47389", "sha256": "665475fc26e3fb8b86f5386eb8475d0408a8a05691c2bcc25b50f4f3e21d5b5e" }, "downloads": -1, "filename": "gaapi4py-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "52edf7935eb732ed9aca5430bbf47389", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5849, "upload_time": "2019-08-03T11:51:43", "url": "https://files.pythonhosted.org/packages/5d/ef/a0999af4d9cda06d53d8bdce79c1b456933f0f8aa3c3c4657d2a8216a6cb/gaapi4py-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef95e47ee3f064c42c37887068b8b3b1", "sha256": "fd5d420c587cac7480f5f0f4769a8ffa555c3de4dcff87d6e3abdca9c3f59dbb" }, "downloads": -1, "filename": "gaapi4py-1.0.1.tar.gz", "has_sig": false, "md5_digest": "ef95e47ee3f064c42c37887068b8b3b1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5077, "upload_time": "2019-08-03T11:51:45", "url": "https://files.pythonhosted.org/packages/e9/29/3f4325aa6333ba6e146e0d5145c04398f1e861f7f322cd0844b861abd83e/gaapi4py-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "4b8ec5042e5a5d118f25c5c78d2314db", "sha256": "062ddf1cf5c50adbd2fc6028237f449481b87838e086729ccbbee3d6a5c6e7e0" }, "downloads": -1, "filename": "gaapi4py-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4b8ec5042e5a5d118f25c5c78d2314db", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6100, "upload_time": "2019-08-15T10:11:31", "url": "https://files.pythonhosted.org/packages/d6/a1/4e9fc9545f6b141af0a9eaebca42a10a54c4a6b28277c2045333320fa34f/gaapi4py-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "60ee8362d27980a2b39b8db23ea5b6cc", "sha256": "eb7226b7152ebef5e933347c95be263864bf18be611915856055d41f2421c56b" }, "downloads": -1, "filename": "gaapi4py-1.1.0.tar.gz", "has_sig": false, "md5_digest": "60ee8362d27980a2b39b8db23ea5b6cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5152, "upload_time": "2019-08-15T10:11:32", "url": "https://files.pythonhosted.org/packages/32/ca/50cb572d28795347ba54d16f1e26dab853d7ac2fd644fe15eca1b7df798f/gaapi4py-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "fa0186a133a9cbef6bd0b14899d3166f", "sha256": "ac5beacc396267462fbc1f264ff04a82db635cdf93552f9570afbfe3d8b0a578" }, "downloads": -1, "filename": "gaapi4py-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "fa0186a133a9cbef6bd0b14899d3166f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6291, "upload_time": "2019-09-10T16:04:36", "url": "https://files.pythonhosted.org/packages/aa/9b/7e550f4b38562df683ad3471b0bb0aa269da7be74603215e73c6d95e0b08/gaapi4py-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c146c83c3d963db1343788073f19d139", "sha256": "8b6b28584fed1f14a8de5fe24d2444a9d70bea19b4ab781dfbe1b31afbaf047c" }, "downloads": -1, "filename": "gaapi4py-1.2.0.tar.gz", "has_sig": false, "md5_digest": "c146c83c3d963db1343788073f19d139", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5385, "upload_time": "2019-09-10T16:04:37", "url": "https://files.pythonhosted.org/packages/c9/78/eb5bd058aa3f2b03f5dd068efaf504e29217e7772a7b7f0beae35b7dac57/gaapi4py-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fa0186a133a9cbef6bd0b14899d3166f", "sha256": "ac5beacc396267462fbc1f264ff04a82db635cdf93552f9570afbfe3d8b0a578" }, "downloads": -1, "filename": "gaapi4py-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "fa0186a133a9cbef6bd0b14899d3166f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6291, "upload_time": "2019-09-10T16:04:36", "url": "https://files.pythonhosted.org/packages/aa/9b/7e550f4b38562df683ad3471b0bb0aa269da7be74603215e73c6d95e0b08/gaapi4py-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c146c83c3d963db1343788073f19d139", "sha256": "8b6b28584fed1f14a8de5fe24d2444a9d70bea19b4ab781dfbe1b31afbaf047c" }, "downloads": -1, "filename": "gaapi4py-1.2.0.tar.gz", "has_sig": false, "md5_digest": "c146c83c3d963db1343788073f19d139", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5385, "upload_time": "2019-09-10T16:04:37", "url": "https://files.pythonhosted.org/packages/c9/78/eb5bd058aa3f2b03f5dd068efaf504e29217e7772a7b7f0beae35b7dac57/gaapi4py-1.2.0.tar.gz" } ] }