[
  {
    "path": ".codecov.yml",
    "content": "codecov:\n  notify:\n    require_ci_to_pass: yes\n\ncomment:\n  layout: \"diff, files\"\n\ncoverage:\n  precision: 2\n  round: down\n  range: 90..100\n  status:\n    project:\n      default:\n        target: 100%\n    patch:\n      default:\n        target: 100%\n    changes: no\n\nignore:\n  - \"composeml/update_checker.py\"\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/blank_issue.md",
    "content": "---\nname: Blank Issue\nabout: Create a blank issue\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug Report\nabout: Create a bug report to help us improve Compose\ntitle: ''\nlabels: 'bug'\nassignees: ''\n\n---\n\n[A clear and concise description of what the bug is.]\n\n#### Code Sample, a copy-pastable example to reproduce your bug.\n\n```python\n# Your code here\n\n```\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\ncontact_links:\n  - name: General Technical Question\n    about: \"If you have a question like *How should I create my label times?* you can ask on StackOverflow using the #compose-ml tag.\"\n    url: https://stackoverflow.com/questions/tagged/compose-ml\n  - name: Real-time chat\n    url: https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA\n    about: \"If you want to meet others in the community and chat about all things Alteryx OSS then check out our Slack.\"\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/documentation_improvement.md",
    "content": "---\nname: Documentation Improvement\nabout: Suggest an idea for improving the documentation\ntitle: ''\nlabels: 'documentation'\nassignees: ''\n\n---\n\n[a description of what documentation you believe needs to be fixed/improved]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature Request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: 'new feature'\nassignees: ''\n\n---\n\n- As a [user/developer], I wish I could use Compose to ...\n\n#### Code Example\n\n```python\n# Your code here, if applicable\n\n```\n"
  },
  {
    "path": ".github/auto_assign.yml",
    "content": "# Set to author to set pr creator as assignee\naddAssignees: author\n"
  },
  {
    "path": ".github/workflows/auto_approve_dependency_PRs.yml",
    "content": "name: Auto Approve Dependency PRs\non:\n  schedule:\n      - cron: '*/30 * * * *'\n  workflow_dispatch:\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Find dependency PRs\n        id: find_prs\n        run: |\n          gh auth status\n          gh pr list --repo \"${{ github.repository }}\" --assignee \"machineFL\" --base main --state open --search \"status:success review:required\" --limit 1 --json number > dep_PRs_waiting_approval.json\n          dep_pull_request=$(cat dep_PRs_waiting_approval.json | grep -Eo \"[0-9]*\")\n          echo ::set-output name=dep_pull_request::${dep_pull_request}\n        env:\n          GITHUB_TOKEN: ${{ secrets.AUTO_APPROVE_TOKEN }}\n      - name: Approve dependency PRs and enable auto-merge\n        if: ${{ steps.find_prs.outputs.dep_pull_request > 1 }}\n        run: |\n          gh pr review --repo \"${{ github.repository }}\" --comment --body \"auto approve\" ${{ steps.find_prs.outputs.dep_pull_request }}\n          gh pr review --repo \"${{ github.repository }}\" --approve ${{ steps.find_prs.outputs.dep_pull_request }}\n          gh pr merge --repo \"${{ github.repository }}\" --auto --squash --delete-branch ${{ steps.find_prs.outputs.dep_pull_request }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.AUTO_APPROVE_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/build_docs.yml",
    "content": "on:\n  pull_request:\n    types: [opened, synchronize]\n  push:\n    branches:\n      - main\n\nname: Build Docs\njobs:\n  doc_tests:\n    name: Doc Tests / Python 3.8\n    runs-on: ubuntu-latest\n    steps:\n      - name: Set up Python 3.8\n        uses: actions/setup-python@v4\n        with:\n          python-version: 3.8\n      - name: Checkout repository\n        uses: actions/checkout@v3\n        with:\n          ref: ${{ github.event.pull_request.head.ref }}\n          repository: ${{ github.event.pull_request.head.repo.full_name }}\n      - name: Build source distribution\n        run: make package\n      - name: Install package with doc requirements\n        run: |\n          python -m pip config --site set global.progress_bar off\n          python -m pip install unpacked_sdist/\n          python -m pip install unpacked_sdist/[dev]\n          python -m pip install unpacked_sdist/[docs]\n          python -m pip check\n          sudo apt install -q -y pandoc\n          sudo apt install -q -y graphviz\n      - name: Run doc tests\n        run: make -C docs/ -e \"SPHINXOPTS=-W\" clean html\n"
  },
  {
    "path": ".github/workflows/create_feedstock_pr.yaml",
    "content": "name: Create Feedstock PR\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'released PyPI version to use (ex - v1.11.1)'\n        required: true\njobs:\n  create_feedstock_pr:\n    name: Create Feedstock PR\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout inputted version\n        uses: actions/checkout@v3\n        with:\n          repository: ${{ github.event.pull_request.head.repo.full_name }}\n          ref: ${{ github.event.inputs.version }}\n          path: \"./compose\"\n      - name: Pull latest from upstream for user forked feedstock\n        run: |\n          gh auth status\n          gh repo sync alteryx/composeml-feedstock --branch main --source conda-forge/composeml-feedstock --force\n        env:\n          GITHUB_TOKEN: ${{ secrets.AUTO_APPROVE_TOKEN }}\n      - uses: actions/checkout@v3\n        with:\n          repository: alteryx/composeml-feedstock\n          ref: main\n          path: \"./composeml-feedstock\"\n          fetch-depth: '0'\n      - name: Run Create Feedstock meta YAML\n        id: create-feedstock-meta\n        uses: alteryx/create-feedstock-meta-yaml@v4\n        with:\n          project: \"composeml\"\n          pypi_version: ${{ github.event.inputs.version }}\n          project_metadata_filepath: \"compose/pyproject.toml\"\n          meta_yaml_filepath: \"composeml-feedstock/recipe/meta.yaml\"\n      - name: View updated meta yaml\n        run: cat composeml-feedstock/recipe/meta.yaml\n      - name: Push updated yaml\n        run: |\n          cd composeml-feedstock\n          git config --unset-all http.https://github.com/.extraheader\n          git config --global user.email \"machineOSS@alteryx.com\"\n          git config --global user.name \"machineAYX Bot\"\n          git remote set-url origin https://${{ secrets.AUTO_APPROVE_TOKEN }}@github.com/alteryx/composeml-feedstock\n          git checkout -b ${{ github.event.inputs.version }}\n          git add recipe/meta.yaml\n          git commit -m \"${{ github.event.inputs.version }}\"\n          git push origin ${{ github.event.inputs.version }}\n      - name: Adding URL to job output\n        run: |\n          echo \"Conda Feedstock Pull Request: https://github.com/alteryx/composeml-feedstock/pull/new/${{ github.event.inputs.version }}\" >> $GITHUB_STEP_SUMMARY\n"
  },
  {
    "path": ".github/workflows/install_test.yml",
    "content": "on:\n  pull_request:\n    types: [opened, synchronize]\n  push:\n    branches:\n      - main\n\nname: Install Test\njobs:\n  install_cm_complete:\n    name: ${{ matrix.os }} - ${{ matrix.python_version }} install compose\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ubuntu-latest, macos-latest]\n        python_version: [\"3.8\", \"3.9\", \"3.10\", \"3.11\"]\n    runs-on: ${{ matrix.os }}\n    steps:\n      - name: Set up python ${{ matrix.python_version }}\n        uses: actions/setup-python@v4\n        with:\n          python-version: ${{ matrix.python_version }}\n      - name: Checkout repository\n        uses: actions/checkout@v3\n      - name: Build compose package\n        run: make package\n      - name: Install compose complete from sdist\n        run: |\n          pip config --site set global.progress_bar off\n          python -m pip install \"unpacked_sdist/[complete]\"\n      - name: Test by importing packages\n        run: |\n          python -c \"import alteryx_open_src_update_checker\"\n        env:\n          ALTERYX_OPEN_SRC_UPDATE_CHECKER: False\n      - name: Check package conflicts\n        run: |\n          python -m pip check\n"
  },
  {
    "path": ".github/workflows/latest_dependency_checker.yml",
    "content": "# This workflow will install dependenies and if any critical dependencies have changed a pull request\n# will be created which will trigger a CI run with the new dependencies.\n\nname: Latest Dependency Checker\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 * * * *'\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n    - name: Set up Python 3.8\n      uses: actions/setup-python@v4\n      with:\n        python-version: '3.8.x'\n\n    - name: Install pip and virtualenv\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install virtualenv\n    - name: Update latest core dependencies\n      run: |\n        python -m virtualenv venv_core\n        source venv_core/bin/activate\n        python -m pip install --upgrade pip\n        python -m pip install .[test]\n        make checkdeps OUTPUT_FILEPATH=composeml/tests/requirement_files/latest_core_dependencies.txt\n\n    - name: Create Pull Request\n      uses: peter-evans/create-pull-request@v3\n      with:\n        token: ${{ secrets.REPO_SCOPED_TOKEN }}\n        commit-message: Update latest dependencies\n        title: Automated Latest Dependency Updates\n        author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\n        body: \"This is an auto-generated PR with **latest** dependency updates.\n               Please do not delete the `latest-dep-update` branch because it's needed by the auto-dependency bot.\"\n        branch: latest-dep-update\n        branch-suffix: short-commit-hash\n        base: main\n        assignees: machineFL\n        reviewers: machineAYX\n"
  },
  {
    "path": ".github/workflows/lint_check.yml",
    "content": "on:\n  pull_request:\n    types: [opened, synchronize]\n  push:\n    branches:\n      - main\n\nname: Lint Check\njobs:\n  lint_test:\n    name: ${{ matrix.python_version }} lint check\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        python_version: [\"3.11\"]\n    steps:\n      - name: Set up python ${{ matrix.python_version }}\n        uses: actions/setup-python@v4\n        with:\n          python-version: ${{ matrix.python_version }}\n      - name: Checkout repository\n        uses: actions/checkout@v3\n        with:\n          ref: ${{ github.event.pull_request.head.ref }}\n          repository: ${{ github.event.pull_request.head.repo.full_name }}\n      - name: Build compose package\n        run: make package\n      - name: Install compose with dev, and test requirements\n        run: |\n          pip config --site set global.progress_bar off\n          python -m pip install --upgrade pip\n          python -m pip install .[dev]\n      - name: Run lint test\n        run: make lint\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "on:\n  release:\n    types: [published]\n\nname: Release\njobs:\n  pypi:\n    name: Release to PyPI\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n    - name: Remove docs and tests before release\n      run: |\n        rm -rf docs/\n    - name: Upload to PyPI\n      uses: FeatureLabs/gh-action-pypi-upload@v2\n      env:\n        PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }}\n        PYPI_USERNAME: ${{ secrets.PYPI_USERNAME }}\n        TEST_PYPI_USERNAME: ${{ secrets.TEST_PYPI_USERNAME }}\n        TEST_PYPI_PASSWORD: ${{ secrets.TEST_PYPI_PASSWORD }}\n"
  },
  {
    "path": ".github/workflows/release_notes_updated.yml",
    "content": "name: Release Notes Updated\n\non:\n  pull_request:\n    types: [opened, synchronize]\n\njobs:\n  release_notes_updated:\n    name: release notes updated\n    runs-on: ubuntu-latest\n    steps:\n      - name: Check for development branch\n        id: branch\n        shell: python\n        run: |\n          from re import compile\n          main = '^main$'\n          release = '^release_v\\d+\\.\\d+\\.\\d+$'\n          dep_update = '^latest-dep-update-[a-f0-9]{7}$'\n          min_dep_update = '^min-dep-update-[a-f0-9]{7}$'\n          regex = main, release, dep_update, min_dep_update\n          patterns = list(map(compile, regex))\n          ref = \"${{ github.event.pull_request.head.ref }}\"\n          is_dev = not any(pattern.match(ref) for pattern in patterns)\n          print('::set-output name=is_dev::' + str(is_dev))\n\n      - name: Checkout repository\n        if: ${{ steps.branch.outputs.is_dev == 'True' }}\n        uses: actions/checkout@v3\n        with:\n          ref: ${{ github.event.pull_request.head.ref }}\n          repository: ${{ github.event.pull_request.head.repo.full_name }}\n\n      - name: Check if release notes were updated\n        if: ${{ steps.branch.outputs.is_dev == 'True' }}\n        run: cat docs/source/release_notes.rst | grep \":pr:\\`${{ github.event.number }}\\`\"\n"
  },
  {
    "path": ".github/workflows/unit_tests_with_latest_deps.yml",
    "content": "on:\n  pull_request:\n    types: [opened, synchronize]\n  push:\n    branches:\n      - main\n\nname: Unit Tests - Latest Dependencies\njobs:\n  unit_tests:\n    name: Unit Tests / Python ${{ matrix.python-version }}\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        python-version: [\"3.8\", \"3.9\", \"3.10\", \"3.11\"]\n    steps:\n      - name: Set up Python ${{ matrix.python-version }}\n        uses: actions/setup-python@v4\n        with:\n          python-version: ${{ matrix.python-version }}\n      - name: Checkout repository\n        uses: actions/checkout@v3\n        with:\n          ref: ${{ github.event.pull_request.head.ref }}\n          repository: ${{ github.event.pull_request.head.repo.full_name }}\n      - name: Build source distribution\n        run: make package\n      - name: Install package with test requirements\n        run: |\n          python -m pip config --site set global.progress_bar off\n          python -m pip install --upgrade pip\n          python -m pip install unpacked_sdist/[test]\n      - if: ${{ matrix.python-version == 3.8 }}\n        name: Run unit tests with code coverage\n        run: |\n          coverage erase\n          cd unpacked_sdist/\n          pytest composeml/ -n auto --cov=composeml --cov-config=../pyproject.toml --cov-report=xml:../coverage.xml\n      - if: ${{ matrix.python-version != 3.8 }}\n        name: Run unit tests with no code coverage\n        run: |\n          cd unpacked_sdist/\n          pytest composeml/ -n auto\n      - if: ${{ matrix.python-version == 3.8 }}\n        name: Upload coverage to Codecov\n        uses: codecov/codecov-action@v3\n        with:\n          token: ${{ secrets.CODECOV_TOKEN }}\n          fail_ci_if_error: true\n          files: ${{ github.workspace }}/coverage.xml\n          verbose: true\n"
  },
  {
    "path": ".gitignore",
    "content": "cb_model.json\n.DS_Store\n\n# IDE\n.vscode\ndocs/source/examples/demo/*/download\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\ndocs/source/generated\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# pyenv\n.python-version\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "exclude: |\n  (?x)\n  .html$|.csv$|.svg$|.md$|.txt$|.json$|.xml$|.pickle$|^.github/|\n  (LICENSE.*|README.*)\ndefault_stages: [commit]\nrepos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: 'v4.3.0'\n    hooks:\n      - id: check-yaml\n      - id: end-of-file-fixer\n      - id: trailing-whitespace\n  - repo: https://github.com/kynan/nbstripout\n    rev: 0.5.0\n    hooks:\n      - id: nbstripout\n        entry: nbstripout\n        language: python\n        types: [jupyter]\n  - repo: https://github.com/MarcoGorelli/absolufy-imports\n    rev: 'v0.3.1'\n    hooks:\n      - id: absolufy-imports\n        files: ^composeml/\n  - repo: https://github.com/asottile/add-trailing-comma\n    rev: v2.2.3\n    hooks:\n      - id: add-trailing-comma\n        name: Add trailing comma\n  - repo: https://github.com/python/black\n    rev: 22.12.0\n    hooks:\n      - id: black\n        args:\n          - --config=./pyproject.toml\n        additional_dependencies: [\".[jupyter]\"]\n        types_or: [python, jupyter]\n  - repo: https://github.com/charliermarsh/ruff-pre-commit\n    rev: 'v0.0.231'\n    hooks:\n      - id: ruff\n        args:\n          - --config=./pyproject.toml\n          - --fix\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "# .readthedocs.yml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Required\nversion: 2\n\n# Build documentation in the docs/ directory with Sphinx\nsphinx:\n  configuration: docs/source/conf.py\n  fail_on_warning: true\n\n# Optionally build your docs in additional formats such as PDF and ePub\nformats: []\n\n# Optionally set the version of Python and requirements required to build your docs\npython:\n  version: \"3.8\"\n  install:\n    - method: pip\n      path: .\n      extra_requirements:\n        - dev\n        - docs\n"
  },
  {
    "path": "LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2017, Feature Labs, Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: clean\nclean:\n\tfind . -name '*.pyo' -delete\n\tfind . -name '*.pyc' -delete\n\tfind . -name __pycache__ -delete\n\tfind . -name '*~' -delete\n\tfind . -name '.coverage.*' -delete\n\n.PHONY: lint\nlint:\n\tblack . --check --config=./pyproject.toml\n\truff . --config=./pyproject.toml\n\n.PHONY: lint-fix\nlint-fix:\n\tblack . --config=./pyproject.toml\n\truff . --fix --config=./pyproject.toml\n\n.PHONY: test\ntest:\n\tpython -m pytest composeml/ -n auto\n\n.PHONY: testcoverage\ntestcoverage:\n\tpython -m pytest composeml/ --cov=composeml -n auto\n\n.PHONY: installdeps\ninstalldeps: upgradepip\n\tpip install -e \".[dev]\"\n\n.PHONY: checkdeps\ncheckdeps:\n\t$(eval allow_list='matplotlib|pandas|seaborn|woodwork|featuretools|evalml|tqdm')\n\tpip freeze | grep -v \"alteryx/compose.git\" | grep -E $(allow_list) > $(OUTPUT_FILEPATH)\n\n.PHONY: upgradepip\nupgradepip:\n\tpython -m pip install --upgrade pip\n\n.PHONY: upgradebuild\nupgradebuild:\n\tpython -m pip install --upgrade build\n\n.PHONY: upgradesetuptools\nupgradesetuptools:\n\tpython -m pip install --upgrade setuptools\n\n.PHONY: package\npackage: upgradepip upgradebuild upgradesetuptools\n\tpython -m build\n\t$(eval PACKAGE=$(shell python -c 'import setuptools; setuptools.setup()' --version))\n\ttar -zxvf \"dist/composeml-${PACKAGE}.tar.gz\"\n\tmv \"composeml-${PACKAGE}\" unpacked_sdist\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\"><img width=50% src=\"https://raw.githubusercontent.com/alteryx/compose/main/docs/source/images/compose.png\" alt=\"Compose\" /></p>\n<p align=\"center\"><i>\"Build better training examples in a fraction of the time.\"</i></p>\n<p align=\"center\">\n    <a href=\"https://github.com/alteryx/compose/actions?query=workflow%3ATests\" target=\"_blank\">\n        <img src=\"https://github.com/alteryx/compose/workflows/Tests/badge.svg\" alt=\"Tests\" />\n    </a>\n    <a href=\"https://codecov.io/gh/alteryx/compose\">\n        <img src=\"https://codecov.io/gh/alteryx/compose/branch/main/graph/badge.svg?token=mDz4ueTUEO\"/>\n    </a>\n    <a href=\"https://compose.alteryx.com/en/stable/?badge=stable\" target=\"_blank\">\n        <img src=\"https://readthedocs.com/projects/feature-labs-inc-compose/badge/?version=stable&token=5c3ace685cdb6e10eb67828a4dc74d09b20bb842980c8ee9eb4e9ed168d05b00\"\n            alt=\"ReadTheDocs\" />\n    </a>\n    <a href=\"https://badge.fury.io/py/composeml\" target=\"_blank\">\n        <img src=\"https://badge.fury.io/py/composeml.svg?maxAge=2592000\" alt=\"PyPI Version\" />\n    </a>\n    <a href=\"https://stackoverflow.com/questions/tagged/compose-ml\" target=\"_blank\">\n        <img src=\"https://img.shields.io/badge/questions-on_stackoverflow-blue.svg?\" alt=\"StackOverflow\" />\n    </a>\n    <a href=\"https://pepy.tech/project/composeml\" target=\"_blank\">\n        <img src=\"https://pepy.tech/badge/composeml/month\" alt=\"PyPI Downloads\" />\n    </a>\n</p>\n<hr>\n\n[Compose](https://compose.alteryx.com) is a machine learning tool for automated prediction engineering. It allows you to structure prediction problems and generate labels for supervised learning. An end user defines an outcome of interest by writing a *labeling function*, then runs a search to automatically extract training examples from historical data. Its result is then provided to [Featuretools](https://docs.featuretools.com/) for automated feature engineering and subsequently to [EvalML](https://evalml.alteryx.com/) for automated machine learning. The workflow of an applied machine learning engineer then becomes:\n\n<br><p align=\"center\"><img width=90% src=\"https://raw.githubusercontent.com/alteryx/compose/main/docs/source/images/workflow.png\" alt=\"Compose\" /></p><br>\n\nBy automating the early stage of the machine learning pipeline, our end user can easily define a task and solve it. See the [documentation](https://compose.alteryx.com) for more information.\n\n## Installation\nInstall with pip\n\n```\npython -m pip install composeml\n```\n\nor from the Conda-forge channel on [conda](https://anaconda.org/conda-forge/composeml):\n\n```\nconda install -c conda-forge composeml\n```\n\n### Add-ons\n\n**Update checker** - Receive automatic notifications of new Compose releases\n\n```\npython -m pip install \"composeml[update_checker]\"\n```\n\n## Example\n> Will a customer spend more than 300 in the next hour of transactions?\n\nIn this example, we automatically generate new training examples from a historical dataset of transactions.\n\n```python\nimport composeml as cp\ndf = cp.demos.load_transactions()\ndf = df[df.columns[:7]]\ndf.head()\n```\n\n<table border=\"0\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th>transaction_id</th>\n      <th>session_id</th>\n      <th>transaction_time</th>\n      <th>product_id</th>\n      <th>amount</th>\n      <th>customer_id</th>\n      <th>device</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>298</td>\n      <td>1</td>\n      <td>2014-01-01 00:00:00</td>\n      <td>5</td>\n      <td>127.64</td>\n      <td>2</td>\n      <td>desktop</td>\n    </tr>\n    <tr>\n      <td>10</td>\n      <td>1</td>\n      <td>2014-01-01 00:09:45</td>\n      <td>5</td>\n      <td>57.39</td>\n      <td>2</td>\n      <td>desktop</td>\n    </tr>\n    <tr>\n      <td>495</td>\n      <td>1</td>\n      <td>2014-01-01 00:14:05</td>\n      <td>5</td>\n      <td>69.45</td>\n      <td>2</td>\n      <td>desktop</td>\n    </tr>\n    <tr>\n      <td>460</td>\n      <td>10</td>\n      <td>2014-01-01 02:33:50</td>\n      <td>5</td>\n      <td>123.19</td>\n      <td>2</td>\n      <td>tablet</td>\n    </tr>\n    <tr>\n      <td>302</td>\n      <td>10</td>\n      <td>2014-01-01 02:37:05</td>\n      <td>5</td>\n      <td>64.47</td>\n      <td>2</td>\n      <td>tablet</td>\n    </tr>\n  </tbody>\n</table>\n\nFirst, we represent the prediction problem with a labeling function and a label maker.\n\n```python\ndef total_spent(ds):\n    return ds['amount'].sum()\n\nlabel_maker = cp.LabelMaker(\n    target_dataframe_index=\"customer_id\",\n    time_index=\"transaction_time\",\n    labeling_function=total_spent,\n    window_size=\"1h\",\n)\n```\n\nThen, we run a search to automatically generate the training examples.\n\n```python\nlabel_times = label_maker.search(\n    df.sort_values('transaction_time'),\n    num_examples_per_instance=2,\n    minimum_data='2014-01-01',\n    drop_empty=False,\n    verbose=False,\n)\n\nlabel_times = label_times.threshold(300)\nlabel_times.head()\n```\n\n<table border=\"0\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th>customer_id</th>\n      <th>time</th>\n      <th>total_spent</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>1</td>\n      <td>2014-01-01 00:00:00</td>\n      <td>True</td>\n    </tr>\n    <tr>\n      <td>1</td>\n      <td>2014-01-01 01:00:00</td>\n      <td>True</td>\n    </tr>\n    <tr>\n      <td>2</td>\n      <td>2014-01-01 00:00:00</td>\n      <td>False</td>\n    </tr>\n    <tr>\n      <td>2</td>\n      <td>2014-01-01 01:00:00</td>\n      <td>False</td>\n    </tr>\n    <tr>\n      <td>3</td>\n      <td>2014-01-01 00:00:00</td>\n      <td>False</td>\n    </tr>\n  </tbody>\n</table>\n\nWe now have labels that are ready to use in [Featuretools](https://docs.featuretools.com/) to generate features.\n\n## Support\n\nThe Innovation Labs open source community is happy to provide support to users of Compose. Project support can be found in three places depending on the type of question:\n\n1. For usage questions, use [Stack Overflow](https://stackoverflow.com/questions/tagged/compose-ml) with the `composeml` tag.\n2. For bugs, issues, or feature requests start a Github [issue](https://github.com/alteryx/compose/issues/new).\n3. For discussion regarding development on the core library, use [Slack](https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA).\n4. For everything else, the core developers can be reached by email at open_source_support@alteryx.com\n\n## Citing Compose\nCompose is built upon a newly defined part of the machine learning process — prediction engineering. If you use Compose, please consider citing this paper:\nJames Max Kanter, Gillespie, Owen, Kalyan Veeramachaneni. [Label, Segment,Featurize: a cross domain framework for prediction engineering.](https://dai.lids.mit.edu/wp-content/uploads/2017/10/Pred_eng1.pdf) IEEE DSAA 2016.\n\nBibTeX entry:\n\n```bibtex\n@inproceedings{kanter2016label,\n  title={Label, segment, featurize: a cross domain framework for prediction engineering},\n  author={Kanter, James Max and Gillespie, Owen and Veeramachaneni, Kalyan},\n  booktitle={2016 IEEE International Conference on Data Science and Advanced Analytics (DSAA)},\n  pages={430--439},\n  year={2016},\n  organization={IEEE}\n}\n```\n\n## Acknowledgements \n\nThe open source development has been supported in part by DARPA's Data driven discovery of models program (D3M). \n\n## Alteryx\n\n**Compose** is an open source project maintained by [Alteryx](https://www.alteryx.com). We developed Compose to enable flexible definition of the machine learning task. To see the other open source projects we’re working on visit [Alteryx Open Source](https://www.alteryx.com/open-source). If building impactful data science pipelines is important to you or your business, please get in touch.\n\n<p align=\"center\">\n  <a href=\"https://www.alteryx.com/open-source\">\n    <img src=\"https://alteryx-oss-web-images.s3.amazonaws.com/OpenSource_Logo-01.png\" alt=\"Alteryx Open Source\" width=\"800\"/>\n  </a>\n</p>\n"
  },
  {
    "path": "composeml/__init__.py",
    "content": "# flake8:noqa\nfrom composeml.version import __version__\nfrom composeml import demos, update_checker\nfrom composeml.label_maker import LabelMaker\nfrom composeml.label_times import LabelTimes, read_label_times\n"
  },
  {
    "path": "composeml/conftest.py",
    "content": "import pandas as pd\nimport pytest\n\nfrom composeml import LabelTimes\nfrom composeml.tests.utils import read_csv\n\n\n@pytest.fixture(scope=\"session\")\ndef transactions():\n    df = read_csv(\n        data=[\n            \"time,amount,customer_id\",\n            \"2019-01-01 08:00:00,1,0\",\n            \"2019-01-01 08:30:00,1,0\",\n            \"2019-01-01 09:00:00,1,1\",\n            \"2019-01-01 09:30:00,1,1\",\n            \"2019-01-01 10:00:00,1,1\",\n            \"2019-01-01 10:30:00,1,2\",\n            \"2019-01-01 11:00:00,1,2\",\n            \"2019-01-01 11:30:00,1,2\",\n            \"2019-01-01 12:00:00,1,2\",\n            \"2019-01-01 12:30:00,1,3\",\n        ],\n    )\n    return df\n\n\n@pytest.fixture(scope=\"session\")\ndef total_spent_fn():\n    def total_spent(df):\n        value = df.amount.sum()\n        return value\n\n    return total_spent\n\n\n@pytest.fixture(scope=\"session\")\ndef unique_amounts_fn():\n    def unique_amounts(df):\n        return df.amount.nunique()\n\n    return unique_amounts\n\n\n@pytest.fixture\ndef total_spent():\n    data = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:00:00,9\",\n        \"0,2019-01-01 08:30:00,8\",\n        \"1,2019-01-01 09:00:00,7\",\n        \"1,2019-01-01 09:30:00,6\",\n        \"1,2019-01-01 10:00:00,5\",\n        \"2,2019-01-01 10:30:00,4\",\n        \"2,2019-01-01 11:00:00,3\",\n        \"2,2019-01-01 11:30:00,2\",\n        \"2,2019-01-01 12:00:00,1\",\n        \"3,2019-01-01 12:30:00,0\",\n    ]\n\n    data = read_csv(data, parse_dates=[\"time\"])\n\n    kwargs = {\n        \"data\": data,\n        \"target_columns\": [\"total_spent\"],\n        \"target_dataframe_index\": \"customer_id\",\n        \"search_settings\": {\n            \"num_examples_per_instance\": -1,\n        },\n    }\n\n    label_times = LabelTimes(**kwargs)\n    return label_times\n\n\n@pytest.fixture\ndef labels():\n    records = [\n        {\n            \"label_id\": 0,\n            \"customer_id\": 1,\n            \"time\": \"2014-01-01 00:45:00\",\n            \"my_labeling_function\": 226.92999999999998,\n        },\n        {\n            \"label_id\": 1,\n            \"customer_id\": 1,\n            \"time\": \"2014-01-01 00:48:00\",\n            \"my_labeling_function\": 47.95,\n        },\n        {\n            \"label_id\": 2,\n            \"customer_id\": 2,\n            \"time\": \"2014-01-01 00:01:00\",\n            \"my_labeling_function\": 283.46000000000004,\n        },\n        {\n            \"label_id\": 3,\n            \"customer_id\": 2,\n            \"time\": \"2014-01-01 00:04:00\",\n            \"my_labeling_function\": 31.54,\n        },\n    ]\n\n    dtype = {\"time\": \"datetime64[ns]\"}\n    values = pd.DataFrame(records).astype(dtype).set_index(\"label_id\")\n    values = values[[\"customer_id\", \"time\", \"my_labeling_function\"]]\n    values = LabelTimes(\n        values,\n        target_columns=[\"my_labeling_function\"],\n        target_dataframe_index=\"customer_id\",\n    )\n    return values\n\n\n@pytest.fixture(autouse=True)\ndef add_labels(doctest_namespace, labels):\n    doctest_namespace[\"labels\"] = labels\n"
  },
  {
    "path": "composeml/data_slice/__init__.py",
    "content": "# flake8:noqa\nfrom composeml.data_slice.generator import DataSliceGenerator\n"
  },
  {
    "path": "composeml/data_slice/extension.py",
    "content": "import pandas as pd\n\nfrom composeml.data_slice.offset import DataSliceOffset, DataSliceStep\n\n\nclass DataSliceContext:\n    \"\"\"Tracks contextual attributes about a data slice.\"\"\"\n\n    def __init__(\n        self,\n        slice_number=0,\n        slice_start=None,\n        slice_stop=None,\n        next_start=None,\n    ):\n        \"\"\"Creates the data slice context.\n\n        Args:\n            slice_number (int): The latest count of data slices.\n            slice_start (int or Timestamp): When the data slice starts.\n            slice_stop (int or Timestamp): When the data slice stops.\n            next_start (int or Timestamp): When the next data slice starts.\n        \"\"\"\n        self.next_start = next_start\n        self.slice_stop = slice_stop\n        self.slice_start = slice_start\n        self.slice_number = slice_number\n\n    def __repr__(self):\n        \"\"\"Represents the data slice context as a string.\"\"\"\n        return self._series.fillna(\"\").to_string()\n\n    @property\n    def _series(self):\n        \"\"\"Represents the data slice context as a pandas series.\"\"\"\n        keys = reversed(list(vars(self)))\n        attrs = {key: getattr(self, key) for key in keys}\n        context = pd.Series(attrs, name=\"context\")\n        return context\n\n    @property\n    def count(self):\n        \"\"\"Alias for the data slice number.\"\"\"\n        return self.slice_number\n\n    @property\n    def start(self):\n        \"\"\"Alias for the start point of a data slice.\"\"\"\n        return self.slice_start\n\n    @property\n    def stop(self):\n        \"\"\"Alias for the stopping point of a data slice.\"\"\"\n        return self.slice_stop\n\n\nclass DataSliceFrame(pd.DataFrame):\n    \"\"\"Subclasses pandas data frame for data slice.\"\"\"\n\n    _metadata = [\"context\"]\n\n    @property\n    def _constructor(self):\n        return DataSliceFrame\n\n    @property\n    def ctx(self):\n        \"\"\"Alias for the data slice context.\"\"\"\n        return self.context\n\n\n@pd.api.extensions.register_dataframe_accessor(\"slice\")\nclass DataSliceExtension:\n    def __init__(self, df):\n        self._df = df\n\n    def __call__(self, size=None, start=None, stop=None, step=None, drop_empty=True):\n        \"\"\"Returns a data slice generator based on the data frame.\n\n        Args:\n            size (int or str): The size of each data slice. A string represents a timedelta or frequency.\n                An integer represents the number of rows. The default value is the length of the data frame.\n            start (int or str): Where to start the first data slice.\n            stop (int or str): Where to stop generating data slices.\n            step (int or str): The step size between data slices. The default value is the data slice size.\n            drop_empty (bool): Whether to drop empty data slices. The default value is True.\n\n        Returns:\n            ds (generator): Returns a generator of data slices.\n        \"\"\"\n        self._check_index()\n        offsets = self._check_offsets(size, start, stop, step)\n        generator = self._apply(*offsets, drop_empty=drop_empty)\n        return generator\n\n    def __getitem__(self, offset):\n        \"\"\"Generates data slices from a slice object.\"\"\"\n        if not isinstance(offset, slice):\n            raise TypeError(\"must be a slice object\")\n        return self(size=offset.step, start=offset.start, stop=offset.stop)\n\n    def _apply(self, size, start, stop, step, drop_empty=True):\n        \"\"\"Generates data slices based on the data frame.\"\"\"\n        df = self._apply_start(self._df, start, step)\n        if df.empty and drop_empty:\n            return df\n\n        df, slice_number = DataSliceFrame(df), 1\n        while start.value and start.value <= stop.value:\n            if df.empty and drop_empty:\n                break\n            ds = self._apply_size(df, start, size)\n            df = self._apply_step(df, start, step)\n            if ds.empty and drop_empty:\n                continue\n            ds.context.next_start = start.value\n            ds.context.slice_number = slice_number\n            slice_number += 1\n            yield ds\n\n    def _apply_size(self, df, start, size):\n        \"\"\"Returns a data slice calculated by the offsets.\"\"\"\n        if size._is_offset_position:\n            index = self._get_index(df, size.value)\n            stop = index or self._last_index\n            ds = df.iloc[: size.value]\n        else:\n            stop = start.value + size.value\n            ds = df[:stop]\n\n            # Pandas includes both endpoints when slicing by time.\n            # This results in the right endpoint overlapping in consecutive data slices.\n            # Resolved by making the right endpoint exclusive.\n            # https://pandas.pydata.org/pandas-docs/version/0.19/gotchas.html#endpoints-are-inclusive\n\n            if not ds.empty:\n                overlap = ds.index == stop\n                if overlap.any():\n                    ds = ds[~overlap]\n\n        ds.context = DataSliceContext(slice_start=start.value, slice_stop=stop)\n        return ds\n\n    def _apply_start(self, df, start, step):\n        \"\"\"Removes data before the index calculated by the offset.\"\"\"\n        inplace = start.value == self._first_index\n        if start._is_offset_position and not inplace:\n            df = df.iloc[start.value :]\n            first_index = df.first_valid_index()\n            start.value = self._first_index = first_index\n\n        if start._is_offset_timestamp and not inplace:\n            df = df[df.index >= start.value]\n            if step._is_offset_position:\n                first_index = df.first_valid_index()\n                start.value = self._first_index = first_index\n\n        return df\n\n    def _apply_step(self, df, start, step):\n        \"\"\"Strides the first index by the offset.\"\"\"\n        if step._is_offset_position:\n            df = df.iloc[step.value :]\n            first_index = df.first_valid_index()\n            start.value = first_index\n        else:\n            start.value += step.value\n            df = df[start.value :]\n\n        return df\n\n    def _check_index(self):\n        \"\"\"Checks if index values are null or unsorted.\"\"\"\n        null = self._df.index.isnull().any()\n        assert not null, \"index contains null values\"\n        assert self._is_sorted, \"data frame must be sorted chronologically\"\n        self._first_index = self._df.first_valid_index()\n        self._last_index = self._df.last_valid_index()\n\n    def _check_offsets(self, size, start, stop, step):\n        \"\"\"Checks for valid data slice offsets.\"\"\"\n        size = self._check_size(size or len(self._df))\n        start = self._check_start(start or self._first_index)\n        stop = self._check_stop(stop or self._last_index)\n        step = self._check_step(step or size)\n        offsets = size, start, stop, step\n\n        if any(offset._is_offset_frequency for offset in offsets):\n            info = \"offset by frequency requires a time index\"\n            assert self._is_time_index, info\n\n        return offsets\n\n    def _check_size(self, size):\n        \"\"\"Checks for valid offset size.\"\"\"\n        if not isinstance(size, DataSliceStep):\n            size = DataSliceStep(size)\n\n        assert size._is_positive, \"offset must be positive\"\n        return size\n\n    def _check_start(self, start):\n        \"\"\"Checks for valid offset start.\"\"\"\n        if not isinstance(start, DataSliceOffset):\n            start = DataSliceOffset(start)\n\n        if start._is_offset_frequency:\n            start.value += self._first_index\n\n        return start\n\n    def _check_step(self, step):\n        \"\"\"Checks for valid offset step.\"\"\"\n        if not isinstance(step, DataSliceStep):\n            step = DataSliceStep(step)\n\n        assert step._is_positive, \"offset must be positive\"\n        return step\n\n    def _check_stop(self, stop):\n        \"\"\"Checks for valid offset stop.\"\"\"\n        if not isinstance(stop, DataSliceOffset):\n            stop = DataSliceOffset(stop)\n\n        if stop._is_offset_frequency:\n            base = \"first\" if stop._is_positive else \"last\"\n            value = getattr(self, f\"_{base}_index\")\n            stop.value += value\n\n        inplace = stop.value == self._last_index\n        if stop._is_offset_position and not inplace:\n            index = self._get_index(self._df, stop.value)\n            stop.value = index or self._last_index\n\n        return stop\n\n    def _get_index(self, df, i):\n        \"\"\"Helper function for getting index values.\"\"\"\n        if i < df.index.size and df.index.size > 0:\n            return df.index[i]\n\n    @property\n    def _is_sorted(self):\n        \"\"\"Whether index values are sorted.\"\"\"\n        return self._df.index.is_monotonic_increasing\n\n    @property\n    def _is_time_index(self):\n        \"\"\"Whether the data frame has a time index type.\"\"\"\n        return pd.api.types.is_datetime64_any_dtype(self._df.index)\n"
  },
  {
    "path": "composeml/data_slice/generator.py",
    "content": "from composeml.data_slice.extension import DataSliceContext, DataSliceFrame\n\n\nclass DataSliceGenerator:\n    \"\"\"Generates data slices for the lable maker.\"\"\"\n\n    def __init__(\n        self,\n        window_size,\n        gap=None,\n        min_data=None,\n        max_data=None,\n        drop_empty=True,\n    ):\n        self.window_size = window_size\n        self.gap = gap\n        self.min_data = min_data\n        self.max_data = max_data\n        self.drop_empty = drop_empty\n\n    def __call__(self, df):\n        \"\"\"Applies the data slice generator to the data frame.\"\"\"\n        is_column = self.window_size in df\n        method = \"column\" if is_column else \"time\"\n        attr = f\"_slice_by_{method}\"\n        return getattr(self, attr)(df)\n\n    def _slice_by_column(self, df):\n        \"\"\"Slices the data frame by an existing column.\"\"\"\n        slices = df.groupby(self.window_size, sort=False)\n        slice_number = 1\n\n        for group, ds in slices:\n            ds = DataSliceFrame(ds)\n            ds.context = DataSliceContext(\n                slice_number=slice_number,\n                slice_start=ds.first_valid_index(),\n                slice_stop=ds.last_valid_index(),\n            )\n            setattr(ds.context, self.window_size, group)\n            del ds.context.next_start\n            slice_number += 1\n            yield ds\n\n    def _slice_by_time(self, df):\n        \"\"\"Slices the data frame along the time index.\"\"\"\n        data_slices = df.slice(\n            size=self.window_size,\n            start=self.min_data,\n            stop=self.max_data,\n            step=self.gap,\n            drop_empty=self.drop_empty,\n        )\n\n        for ds in data_slices:\n            yield ds\n"
  },
  {
    "path": "composeml/data_slice/offset.py",
    "content": "import re\n\nimport pandas as pd\n\n\nclass DataSliceOffset:\n    \"\"\"Offsets for calculating data slice indices.\"\"\"\n\n    def __init__(self, value):\n        self.value = value\n        self._check()\n\n    def _check(self):\n        \"\"\"Checks if the value is a valid offset.\"\"\"\n        if isinstance(self.value, str):\n            self._parse_value()\n        assert self._is_valid_offset, self._invalid_offset_error\n\n    @property\n    def _is_offset_base(self):\n        \"\"\"Whether offset is a base type.\"\"\"\n        return issubclass(type(self.value), pd.tseries.offsets.BaseOffset)\n\n    @property\n    def _is_offset_position(self):\n        \"\"\"Whether offset is integer-location based.\"\"\"\n        return pd.api.types.is_integer(self.value)\n\n    @property\n    def _is_offset_timedelta(self):\n        \"\"\"Whether offset is a timedelta.\"\"\"\n        return isinstance(self.value, pd.Timedelta)\n\n    @property\n    def _is_offset_timestamp(self):\n        \"\"\"Whether offset is a timestamp.\"\"\"\n        return isinstance(self.value, pd.Timestamp)\n\n    @property\n    def _is_offset_frequency(self):\n        \"\"\"Whether offset is a base type or timedelta.\"\"\"\n        value = self._is_offset_base\n        value |= self._is_offset_timedelta\n        return value\n\n    def __int__(self):\n        \"\"\"Typecasts offset value to an integer.\"\"\"\n        if self._is_offset_position:\n            return self.value\n        elif self._is_offset_base:\n            return self.value.n\n        elif self._is_offset_timedelta:\n            return self.value.value\n        else:\n            raise TypeError(\"offset must be position or frequency based\")\n\n    def __float__(self):\n        \"\"\"Typecasts offset value to a float.\"\"\"\n        if self._is_offset_timestamp:\n            return self.value.timestamp()\n        else:\n            raise TypeError(\"offset must be a timestamp\")\n\n    @property\n    def _is_positive(self):\n        \"\"\"Whether the offset value is positive.\"\"\"\n        timestamp = self._is_offset_timestamp\n        numeric = float if timestamp else int\n        return numeric(self) > 0\n\n    @property\n    def _is_valid_offset(self):\n        \"\"\"Whether offset is a valid type.\"\"\"\n        value = self._is_offset_position\n        value |= self._is_offset_frequency\n        value |= self._is_offset_timestamp\n        return value\n\n    @property\n    def _invalid_offset_error(self):\n        \"\"\"Returns message for invalid offset.\"\"\"\n        info = \"offset must be position or time based\\n\\n\"\n        info += \"\\tFor information about offset aliases, visit the link below.\\n\"\n        info += (\n            \"\\thttps://pandas.pydata.org/docs/user_guide/timeseries.html#offset-aliases\"\n        )\n        return info\n\n    def _parse_offset_alias(self, alias):\n        \"\"\"Parses an alias to an offset.\"\"\"\n        value = self._parse_offset_alias_phrase(alias)\n        value = value or pd.tseries.frequencies.to_offset(alias)\n        return value\n\n    def _parse_offset_alias_phrase(self, value):\n        \"\"\"Parses an alias phrase to an offset.\"\"\"\n        pattern = re.compile(\"until start of next (?P<unit>[a-z]+)\")\n        match = pattern.search(value.lower())\n\n        if match:\n            match = match.groupdict()\n            unit = match[\"unit\"]\n\n            if unit == \"month\":\n                return pd.offsets.MonthBegin()\n\n            if unit == \"year\":\n                return pd.offsets.YearBegin()\n\n    def _parse_value(self):\n        \"\"\"Parses the value to an offset.\"\"\"\n        for parser in self._parsers:\n            try:\n                value = parser(self.value)\n                if value is not None:\n                    self.value = value\n                    break\n            except Exception:\n                continue\n\n    @property\n    def _parsers(self):\n        \"\"\"Returns the value parsers.\"\"\"\n        return pd.Timestamp, self._parse_offset_alias, pd.Timedelta\n\n\nclass DataSliceStep(DataSliceOffset):\n    @property\n    def _is_valid_offset(self):\n        \"\"\"Whether offset is a valid type.\"\"\"\n        value = self._is_offset_position\n        value |= self._is_offset_frequency\n        return value\n\n    @property\n    def _parsers(self):\n        \"\"\"Returns the value parsers.\"\"\"\n        return self._parse_offset_alias, pd.Timedelta\n"
  },
  {
    "path": "composeml/demos/__init__.py",
    "content": "import os\n\nimport pandas as pd\n\nDATA = os.path.join(os.path.dirname(__file__))\n\n\ndef load_transactions():\n    path = os.path.join(DATA, \"transactions.csv\")\n    df = pd.read_csv(path, parse_dates=[\"transaction_time\"])\n    return df\n"
  },
  {
    "path": "composeml/demos/transactions.csv",
    "content": "transaction_id,session_id,transaction_time,product_id,amount,customer_id,device,session_start,zip_code,join_date,date_of_birth,brand\n298,1,2014-01-01 00:00:00,5,127.64,2,desktop,2014-01-01 00:00:00,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n10,1,2014-01-01 00:09:45,5,57.39,2,desktop,2014-01-01 00:00:00,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n495,1,2014-01-01 00:14:05,5,69.45,2,desktop,2014-01-01 00:00:00,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n460,10,2014-01-01 02:33:50,5,123.19,2,tablet,2014-01-01 02:31:40,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n302,10,2014-01-01 02:37:05,5,64.47,2,tablet,2014-01-01 02:31:40,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n212,10,2014-01-01 02:41:25,5,52.28,2,tablet,2014-01-01 02:31:40,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n440,10,2014-01-01 02:44:40,5,50.45,2,tablet,2014-01-01 02:31:40,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n405,15,2014-01-01 03:42:05,5,47.39,2,desktop,2014-01-01 03:41:00,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n180,15,2014-01-01 03:48:35,5,146.81,2,desktop,2014-01-01 03:41:00,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n220,16,2014-01-01 03:55:05,5,135.48,2,desktop,2014-01-01 03:49:40,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n253,17,2014-01-01 04:00:30,5,41.95,2,tablet,2014-01-01 04:00:30,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n340,17,2014-01-01 04:08:05,5,100.99,2,tablet,2014-01-01 04:00:30,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n301,31,2014-01-01 07:49:05,5,66.86,2,mobile,2014-01-01 07:42:35,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n346,31,2014-01-01 07:51:15,5,18.81,2,mobile,2014-01-01 07:42:35,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n161,31,2014-01-01 07:55:35,5,75.96,2,mobile,2014-01-01 07:42:35,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n420,31,2014-01-01 07:59:55,5,66.1,2,mobile,2014-01-01 07:42:35,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n468,33,2014-01-01 08:11:50,5,46.99,2,mobile,2014-01-01 08:10:45,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n281,33,2014-01-01 08:15:05,5,86.81,2,mobile,2014-01-01 08:10:45,13244,2012-04-15 23:31:04,1986-08-18 00:00:00,A\n270,2,2014-01-01 00:18:25,5,123.53,5,mobile,2014-01-01 00:17:20,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n453,2,2014-01-01 00:19:30,5,9.32,5,mobile,2014-01-01 00:17:20,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n74,2,2014-01-01 00:23:50,5,90.69,5,mobile,2014-01-01 00:17:20,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n207,2,2014-01-01 00:24:55,5,48.27,5,mobile,2014-01-01 00:17:20,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n122,2,2014-01-01 00:27:05,5,13.81,5,mobile,2014-01-01 00:17:20,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n40,20,2014-01-01 04:46:00,5,53.22,5,desktop,2014-01-01 04:46:00,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n377,20,2014-01-01 05:01:10,5,83.33,5,desktop,2014-01-01 04:46:00,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n206,24,2014-01-01 05:48:50,5,61.3,5,tablet,2014-01-01 05:44:30,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n94,24,2014-01-01 05:55:20,5,100.42,5,tablet,2014-01-01 05:44:30,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n84,24,2014-01-01 05:57:30,5,75.75,5,tablet,2014-01-01 05:44:30,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n256,28,2014-01-01 06:51:40,5,101.39,5,mobile,2014-01-01 06:50:35,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n292,28,2014-01-01 06:53:50,5,138.17,5,mobile,2014-01-01 06:50:35,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n490,28,2014-01-01 07:07:55,5,149.02,5,mobile,2014-01-01 06:50:35,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n154,28,2014-01-01 07:09:00,5,44.11,5,mobile,2014-01-01 06:50:35,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n73,30,2014-01-01 07:29:35,5,42.94,5,desktop,2014-01-01 07:27:25,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n240,30,2014-01-01 07:40:25,5,59.71,5,desktop,2014-01-01 07:27:25,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n297,32,2014-01-01 08:04:15,5,20.65,5,mobile,2014-01-01 08:02:05,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n391,32,2014-01-01 08:07:30,5,57.88,5,mobile,2014-01-01 08:02:05,60091,2010-07-17 05:27:50,1984-07-28 00:00:00,A\n461,3,2014-01-01 00:39:00,5,102.76,4,mobile,2014-01-01 00:28:10,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n44,3,2014-01-01 00:43:20,5,147.73,4,mobile,2014-01-01 00:28:10,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n327,5,2014-01-01 01:12:35,5,20.06,4,mobile,2014-01-01 01:11:30,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n48,5,2014-01-01 01:14:45,5,131.29,4,mobile,2014-01-01 01:11:30,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n442,5,2014-01-01 01:16:55,5,97.18,4,mobile,2014-01-01 01:11:30,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n285,8,2014-01-01 01:55:55,5,51.69,4,tablet,2014-01-01 01:55:55,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n225,8,2014-01-01 02:06:45,5,124.13,4,tablet,2014-01-01 01:55:55,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n254,11,2014-01-01 02:52:15,5,118.51,4,mobile,2014-01-01 02:47:55,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n465,11,2014-01-01 02:56:35,5,66.95,4,mobile,2014-01-01 02:47:55,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n487,11,2014-01-01 03:03:05,5,27.02,4,mobile,2014-01-01 02:47:55,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n117,12,2014-01-01 03:04:10,5,101.84,4,desktop,2014-01-01 03:04:10,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n196,12,2014-01-01 03:05:15,5,29.37,4,desktop,2014-01-01 03:04:10,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n226,21,2014-01-01 05:07:40,5,77.78,4,desktop,2014-01-01 05:02:15,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n288,21,2014-01-01 05:09:50,5,55.74,4,desktop,2014-01-01 05:02:15,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n494,21,2014-01-01 05:10:55,5,109.3,4,desktop,2014-01-01 05:02:15,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n380,21,2014-01-01 05:14:10,5,57.09,4,desktop,2014-01-01 05:02:15,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n236,21,2014-01-01 05:17:25,5,69.62,4,desktop,2014-01-01 05:02:15,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n87,21,2014-01-01 05:18:30,5,7.93,4,desktop,2014-01-01 05:02:15,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n109,22,2014-01-01 05:30:25,5,82.69,4,desktop,2014-01-01 05:21:45,60091,2011-04-08 20:08:14,2006-08-15 00:00:00,A\n275,4,2014-01-01 00:45:30,5,108.11,1,mobile,2014-01-01 00:44:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n101,4,2014-01-01 00:46:35,5,112.53,1,mobile,2014-01-01 00:44:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n80,4,2014-01-01 00:47:40,5,6.29,1,mobile,2014-01-01 00:44:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n163,4,2014-01-01 00:52:00,5,31.37,1,mobile,2014-01-01 00:44:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n293,4,2014-01-01 00:53:05,5,82.88,1,mobile,2014-01-01 00:44:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n103,4,2014-01-01 00:57:25,5,20.79,1,mobile,2014-01-01 00:44:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n488,4,2014-01-01 01:03:55,5,129.0,1,mobile,2014-01-01 00:44:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n413,4,2014-01-01 01:05:00,5,119.98,1,mobile,2014-01-01 00:44:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n191,6,2014-01-01 01:31:00,5,139.23,1,tablet,2014-01-01 01:23:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n372,6,2014-01-01 01:37:30,5,114.84,1,tablet,2014-01-01 01:23:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n387,6,2014-01-01 01:38:35,5,49.71,1,tablet,2014-01-01 01:23:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n287,9,2014-01-01 02:28:25,5,50.94,1,desktop,2014-01-01 02:15:25,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n190,14,2014-01-01 03:29:05,5,110.52,1,tablet,2014-01-01 03:28:00,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n7,14,2014-01-01 03:39:55,5,107.42,1,tablet,2014-01-01 03:28:00,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n19,18,2014-01-01 04:14:35,5,133.49,1,desktop,2014-01-01 04:14:35,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n392,18,2014-01-01 04:17:50,5,72.67,1,desktop,2014-01-01 04:14:35,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n398,26,2014-01-01 06:18:05,5,27.95,1,tablet,2014-01-01 06:17:00,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n152,26,2014-01-01 06:26:45,5,42.81,1,tablet,2014-01-01 06:17:00,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n221,26,2014-01-01 06:31:05,5,7.08,1,tablet,2014-01-01 06:17:00,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n403,27,2014-01-01 06:35:25,5,28.26,1,mobile,2014-01-01 06:34:20,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n368,27,2014-01-01 06:36:30,5,139.43,1,mobile,2014-01-01 06:34:20,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n334,27,2014-01-01 06:38:40,5,54.26,1,mobile,2014-01-01 06:34:20,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n333,27,2014-01-01 06:44:05,5,103.2,1,mobile,2014-01-01 06:34:20,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n339,27,2014-01-01 06:45:10,5,26.56,1,mobile,2014-01-01 06:34:20,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n43,27,2014-01-01 06:47:20,5,55.26,1,mobile,2014-01-01 06:34:20,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n199,27,2014-01-01 06:48:25,5,5.91,1,mobile,2014-01-01 06:34:20,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n355,29,2014-01-01 07:11:10,5,110.68,1,mobile,2014-01-01 07:10:05,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n352,29,2014-01-01 07:13:20,5,92.43,1,mobile,2014-01-01 07:10:05,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n182,29,2014-01-01 07:16:35,5,125.73,1,mobile,2014-01-01 07:10:05,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n177,29,2014-01-01 07:19:50,5,55.11,1,mobile,2014-01-01 07:10:05,60091,2011-04-17 10:48:33,1994-07-18 00:00:00,A\n259,7,2014-01-01 01:45:05,5,32.85,3,tablet,2014-01-01 01:39:40,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n274,7,2014-01-01 01:46:10,5,14.45,3,tablet,2014-01-01 01:39:40,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n214,7,2014-01-01 01:51:35,5,101.58,3,tablet,2014-01-01 01:39:40,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n441,19,2014-01-01 04:30:50,5,9.34,3,desktop,2014-01-01 04:27:35,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n146,19,2014-01-01 04:38:25,5,126.74,3,desktop,2014-01-01 04:27:35,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n483,19,2014-01-01 04:43:50,5,60.17,3,desktop,2014-01-01 04:27:35,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n159,23,2014-01-01 05:32:35,5,43.69,3,desktop,2014-01-01 05:32:35,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n186,23,2014-01-01 05:40:10,5,128.26,3,desktop,2014-01-01 05:32:35,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n378,25,2014-01-01 06:15:55,5,131.83,3,desktop,2014-01-01 05:59:40,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n110,34,2014-01-01 08:24:50,5,145.74,3,desktop,2014-01-01 08:24:50,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n497,34,2014-01-01 08:29:10,5,148.86,3,desktop,2014-01-01 08:24:50,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n467,34,2014-01-01 08:32:25,5,145.19,3,desktop,2014-01-01 08:24:50,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n267,34,2014-01-01 08:38:55,5,58.47,3,desktop,2014-01-01 08:24:50,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n493,35,2014-01-01 08:48:40,5,132.94,3,mobile,2014-01-01 08:44:20,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n338,35,2014-01-01 08:51:55,5,93.71,3,mobile,2014-01-01 08:44:20,13244,2011-08-13 15:42:34,2003-11-21 00:00:00,A\n"
  },
  {
    "path": "composeml/label_maker.py",
    "content": "from sys import stdout\n\nfrom pandas import Series\nfrom pandas.api.types import is_categorical_dtype\nfrom tqdm import tqdm\n\nfrom composeml.data_slice import DataSliceGenerator\nfrom composeml.label_search import ExampleSearch, LabelSearch\nfrom composeml.label_times import LabelTimes\n\n\nclass LabelMaker:\n    \"\"\"Automatically makes labels for prediction problems.\"\"\"\n\n    def __init__(\n        self,\n        target_dataframe_index,\n        time_index,\n        labeling_function=None,\n        window_size=None,\n    ):\n        \"\"\"Creates an instance of label maker.\n\n        Args:\n            target_dataframe_index (str): The index of the target dataframe, from which labels will be created.\n            time_index (str): Name of time column in the data frame.\n            labeling_function (function or list(function) or dict(str=function)): Function, list of functions, or dictionary of functions that transform a data slice.\n                When set as a dictionary, the key is used as the name of the labeling function.\n            window_size (str or int): Size of the data slices. As a string, the value can be a timedelta or a column in the data frame to group by.\n                As an integer, the value can be the number of rows. Default value is all future data.\n        \"\"\"\n        self.labeling_function = labeling_function or {}\n        self.target_dataframe_index = target_dataframe_index\n        self.time_index = time_index\n        self.window_size = window_size\n\n    def _name_labeling_function(self, function):\n        \"\"\"Gets the names of the labeling functions.\"\"\"\n        has_name = hasattr(function, \"__name__\")\n        return function.__name__ if has_name else type(function).__name__\n\n    def _check_labeling_function(self, function, name=None):\n        \"\"\"Checks whether the labeling function is callable.\"\"\"\n        assert callable(function), \"labeling function must be callabe\"\n        return function\n\n    @property\n    def labeling_function(self):\n        \"\"\"Gets the labeling function(s).\"\"\"\n        return self._labeling_function\n\n    @labeling_function.setter\n    def labeling_function(self, value):\n        \"\"\"Sets and formats the intial labeling function(s).\n\n        Args:\n            value (function or list(function) or dict(str=function)): Function that transforms a data slice to a label.\n        \"\"\"\n        if isinstance(value, dict):\n            for name, function in value.items():\n                self._check_labeling_function(function)\n                assert isinstance(name, str), \"labeling function name must be string\"\n\n        if callable(value):\n            value = [value]\n\n        if isinstance(value, (tuple, list)):\n            value = {\n                self._name_labeling_function(function): self._check_labeling_function(\n                    function,\n                )\n                for function in value\n            }\n\n        assert isinstance(value, dict), \"value type for labeling function not supported\"\n        self._labeling_function = value\n\n    def _check_cutoff_time(self, value):\n        if isinstance(value, Series):\n            if value.index.is_unique:\n                return value.to_dict()\n            else:\n                raise ValueError(\"more than one cutoff time exists for a target group\")\n        else:\n            return value\n\n    def slice(\n        self,\n        df,\n        num_examples_per_instance,\n        minimum_data=None,\n        maximum_data=None,\n        gap=None,\n        drop_empty=True,\n    ):\n        \"\"\"Generates data slices of target dataframe.\n\n        Args:\n            df (DataFrame): Data frame to create slices on.\n            num_examples_per_instance (int): Number of examples per unique instance of target dataframe.\n            minimum_data (int or str or Series): The amount of data needed before starting the search. Defaults to the first value in the time index.\n                The value can be a datetime string to directly set the first cutoff time or a timedelta string to denote the amount of data needed before\n                the first cutoff time. The value can also be an integer to denote the number of rows needed before the first cutoff time.\n                If a Series, minimum_data should be datetime string, timedelta string, or integer values with a unique set of target groups as the corresponding index.\n            maximum_data (str): Maximum data before stopping the search. Default value is last time of index.\n            gap (str or int): Time between examples. Default value is window size.\n                If an integer, search will start on the first event after the minimum data.\n            drop_empty (bool): Whether to drop empty slices. Default value is True.\n\n        Returns:\n            ds (generator): Returns a generator of data slices.\n        \"\"\"\n        self._check_example_count(num_examples_per_instance, gap)\n        df = self.set_index(df)\n        target_groups = df.groupby(self.target_dataframe_index)\n        num_examples_per_instance = ExampleSearch._check_number(\n            num_examples_per_instance,\n        )\n\n        minimum_data = self._check_cutoff_time(minimum_data)\n        minimum_data_varies = isinstance(minimum_data, dict)\n\n        for group_key, df in target_groups:\n            if minimum_data_varies:\n                if group_key not in minimum_data:\n                    continue\n                min_data_for_group = minimum_data[group_key]\n            else:\n                min_data_for_group = minimum_data\n\n            generator = DataSliceGenerator(\n                window_size=self.window_size,\n                min_data=min_data_for_group,\n                max_data=maximum_data,\n                drop_empty=drop_empty,\n                gap=gap,\n            )\n\n            for ds in generator(df):\n                setattr(ds.context, self.target_dataframe_index, group_key)\n                yield ds\n\n                if ds.context.slice_number >= num_examples_per_instance:\n                    break\n\n    @property\n    def _bar_format(self):\n        \"\"\"Template to format the progress bar during a label search.\"\"\"\n        value = \"Elapsed: {elapsed} | \"\n        value += \"Remaining: {remaining} | \"\n        value += \"Progress: {l_bar}{bar}| \"\n        value += self.target_dataframe_index + \": {n}/{total} \"\n        return value\n\n    def _check_example_count(self, num_examples_per_instance, gap):\n        \"\"\"Checks whether example count corresponds to data slices.\"\"\"\n        if self.window_size is None and gap is None:\n            more_than_one = num_examples_per_instance > 1\n            assert (\n                not more_than_one\n            ), \"must specify gap if num_examples > 1 and window size = none\"\n\n    def search(\n        self,\n        df,\n        num_examples_per_instance,\n        minimum_data=None,\n        maximum_data=None,\n        gap=None,\n        drop_empty=True,\n        verbose=True,\n        *args,\n        **kwargs,\n    ):\n        \"\"\"Searches the data to calculates labels.\n\n        Args:\n            df (DataFrame): Data frame to search and extract labels.\n            num_examples_per_instance (int or dict): The expected number of examples to return from each dataframe group.\n                A dictionary can be used to further specify the expected number of examples to return from each label.\n            minimum_data (int or str or Series): The amount of data needed before starting the search. Defaults to the first value in the time index.\n                The value can be a datetime string to directly set the first cutoff time or a timedelta string to denote the amount of data needed before\n                the first cutoff time. The value can also be an integer to denote the number of rows needed before the first cutoff time.\n                If a Series, minimum_data should be datetime string, timedelta string, or integer values with a unique set of target groups as the corresponding index.\n            maximum_data (str): Maximum data before stopping the search. Defaults to the last value in the time index.\n            gap (str or int): Time between examples. Default value is window size.\n                If an integer, search will start on the first event after the minimum data.\n            drop_empty (bool): Whether to drop empty slices. Default value is True.\n            verbose (bool): Whether to render progress bar. Default value is True.\n            *args: Positional arguments for labeling function.\n            **kwargs: Keyword arguments for labeling function.\n\n        Returns:\n            lt (LabelTimes): Calculated labels with cutoff times.\n        \"\"\"\n        assert self.labeling_function, \"missing labeling function(s)\"\n        self._check_example_count(num_examples_per_instance, gap)\n        is_label_search = isinstance(num_examples_per_instance, dict)\n        search = (LabelSearch if is_label_search else ExampleSearch)(\n            num_examples_per_instance,\n        )\n\n        # check minimum data cutoff time\n        minimum_data = self._check_cutoff_time(minimum_data)\n        minimum_data_varies = isinstance(minimum_data, dict)\n\n        df = self.set_index(df)\n        total = search.expected_count if search.is_finite else 1\n        # If the target is categorical, make sure there are no unused categories\n        if is_categorical_dtype(df[self.target_dataframe_index]):\n            df[self.target_dataframe_index] = df[\n                self.target_dataframe_index\n            ].cat.remove_unused_categories()\n        target_groups = df.groupby(self.target_dataframe_index)\n        total *= target_groups.ngroups\n\n        progress_bar = tqdm(\n            total=total,\n            file=stdout,\n            disable=not verbose,\n            bar_format=self._bar_format,\n        )\n\n        records = []\n        for group_count, (group_key, df) in enumerate(target_groups, start=1):\n            if minimum_data_varies:\n                if group_key not in minimum_data:\n                    continue\n                min_data_for_group = minimum_data[group_key]\n            else:\n                min_data_for_group = minimum_data\n\n            generator = DataSliceGenerator(\n                window_size=self.window_size,\n                min_data=min_data_for_group,\n                max_data=maximum_data,\n                drop_empty=drop_empty,\n                gap=gap,\n            )\n\n            for ds in generator(df):\n                setattr(ds.context, self.target_dataframe_index, group_key)\n\n                items = self.labeling_function.items()\n                labels = {name: lf(ds, *args, **kwargs) for name, lf in items}\n                valid_labels = search.is_valid_labels(labels)\n                if not valid_labels:\n                    continue\n\n                records.append(\n                    {\n                        self.target_dataframe_index: group_key,\n                        \"time\": ds.context.slice_start,\n                        **labels,\n                    },\n                )\n\n                search.update_count(labels)\n                # if finite search, update progress bar for the example found\n                if search.is_finite:\n                    progress_bar.update(n=1)\n                if search.is_complete:\n                    break\n\n            # if finite search, update progress bar for missing examples\n            if search.is_finite:\n                progress_bar.update(\n                    n=group_count * search.expected_count - progress_bar.n,\n                )\n            else:\n                progress_bar.update(\n                    n=1,\n                )  # otherwise, update progress bar once for each group\n            search.reset_count()\n\n        total -= progress_bar.n\n        progress_bar.update(n=total)\n        progress_bar.close()\n\n        lt = LabelTimes(\n            data=records,\n            target_columns=list(self.labeling_function),\n            target_dataframe_index=self.target_dataframe_index,\n            search_settings={\n                \"num_examples_per_instance\": num_examples_per_instance,\n                \"minimum_data\": minimum_data,\n                \"maximum_data\": str(maximum_data),\n                \"window_size\": str(self.window_size),\n                \"gap\": str(gap),\n            },\n        )\n\n        return lt\n\n    def set_index(self, df):\n        \"\"\"Sets the time index in a data frame (if not already set).\n\n        Args:\n            df (DataFrame): Data frame to set time index in.\n\n        Returns:\n            df (DataFrame): Data frame with time index set.\n        \"\"\"\n        if df.index.name != self.time_index:\n            df = df.set_index(self.time_index)\n\n        if \"time\" not in str(df.index.dtype):\n            df.index = df.index.astype(\"datetime64[ns]\")\n\n        return df\n"
  },
  {
    "path": "composeml/label_search.py",
    "content": "from collections import Counter\n\nfrom pandas import isnull\n\n\nclass ExampleSearch:\n    \"\"\"A label search based on the number of examples.\n\n    Args:\n        expected_count (int): The expected number of examples to find.\n    \"\"\"\n\n    def __init__(self, expected_count):\n        self.expected_count = self._check_number(expected_count)\n        self.reset_count()\n\n    @staticmethod\n    def _check_number(n):\n        \"\"\"Checks and formats the expected number of examples.\"\"\"\n        if n == -1 or n == \"inf\":\n            return float(\"inf\")\n        else:\n            info = \"expected count must be numeric\"\n            assert isinstance(n, (int, float)), info\n            return n\n\n    @staticmethod\n    def _is_finite_number(n):\n        \"\"\"Checks if a number if finite.\"\"\"\n        return n > 0 and abs(n) != float(\"inf\")\n\n    @property\n    def is_complete(self):\n        \"\"\"Whether the search has found the expected number of examples.\"\"\"\n        return self.actual_count >= self.expected_count\n\n    @property\n    def is_finite(self):\n        \"\"\"Whether the expected number of examples is a finite number.\"\"\"\n        return self._is_finite_number(self.expected_count)\n\n    def is_valid_labels(self, labels):\n        \"\"\"Whether the label values are not null.\"\"\"\n        return not any(map(isnull, labels.values()))\n\n    def reset_count(self):\n        \"\"\"Reset the internal count of actual labels.\"\"\"\n        self.actual_count = 0\n\n    def update_count(self, labels):\n        \"\"\"Update the internal count of actual labels.\"\"\"\n        self.actual_count += 1\n\n\nclass LabelSearch(ExampleSearch):\n    \"\"\"A label search based on the number of examples for each label.\n\n    Args:\n        expected_label_counts (dict): The expected number of examples to be find for each label.\n            The dictionary should map a label to the number of examples to find for the label.\n    \"\"\"\n\n    def __init__(self, expected_label_counts):\n        items = expected_label_counts.items()\n        self.expected_label_counts = Counter(\n            {label: self._check_number(count) for label, count in items},\n        )\n        self.expected_count = sum(self.expected_label_counts.values())\n        self.actual_label_counts = Counter()\n\n    @property\n    def is_complete(self):\n        \"\"\"Whether the search has found the expected number of examples for each label.\"\"\"\n        return len(self.expected_label_counts - self.actual_label_counts) == 0\n\n    def is_complete_label(self, label):\n        \"\"\"Whether the search has found the expected number of examples for a label.\"\"\"\n        return (\n            self.actual_label_counts.get(label, 0) >= self.expected_label_counts[label]\n        )\n\n    def is_valid_labels(self, labels):\n        \"\"\"Whether label values meet the search criteria.\n\n        The search criteria is defined as label values that are not null, expected by the user, and have not reached the expected count.\n        When these conditions are met by any label value, the labels are set to return to the user.\n        This includes the other label values which share the same cutoff time.\n\n        Args:\n            labels (dict): The actual label values found during a search.\n\n        Returns:\n            value (bool): The value is True when valid, otherwise False.\n        \"\"\"\n        label_values = labels.values()\n        not_null = super().is_valid_labels(labels)\n        is_expected = not_null and any(\n            label in self.expected_label_counts for label in label_values\n        )\n        value = is_expected and any(\n            not self.is_complete_label(label) for label in label_values\n        )\n        return value\n\n    def reset_count(self):\n        \"\"\"Reset the internal count of actual labels.\"\"\"\n        self.actual_label_counts.clear()\n\n    def update_count(self, labels):\n        \"\"\"Update the internal count of the actual labels.\n\n        Args:\n            labels (dict): The actual label values found during a search.\n        \"\"\"\n        self.actual_label_counts.update(labels.values())\n"
  },
  {
    "path": "composeml/label_times/__init__.py",
    "content": "# flake8:noqa\nfrom composeml.label_times.deserialize import read_label_times\nfrom composeml.label_times.object import LabelTimes\n"
  },
  {
    "path": "composeml/label_times/description.py",
    "content": "import pandas as pd\n\n\ndef describe_label_times(label_times):\n    \"\"\"Prints out label info with transform settings that reproduce labels.\"\"\"\n    target_column = label_times.target_columns[0]\n    is_discrete = label_times.is_discrete[target_column]\n\n    if is_discrete:\n        distribution = label_times[target_column].value_counts()\n        distribution.sort_index(inplace=True)\n        distribution.index = distribution.index.astype(\"str\")\n        distribution[\"Total:\"] = distribution.sum()\n    else:\n        distribution = label_times[target_column].describe()\n\n    print(\"Label Distribution\\n\" + \"-\" * 18, end=\"\\n\")\n    print(distribution.to_string(), end=\"\\n\\n\\n\")\n\n    metadata = label_times.settings\n    target_column = metadata[\"label_times\"][\"target_columns\"][0]\n    target_type = metadata[\"label_times\"][\"target_types\"][target_column]\n    target_dataframe_index = metadata[\"label_times\"][\"target_dataframe_index\"]\n\n    settings = {\n        \"target_column\": target_column,\n        \"target_dataframe_index\": target_dataframe_index,\n        \"target_type\": target_type,\n    }\n\n    settings.update(metadata[\"label_times\"][\"search_settings\"])\n    settings = pd.Series(settings)\n\n    print(\"Settings\\n\" + \"-\" * 8, end=\"\\n\")\n    settings.sort_index(inplace=True)\n    print(settings.to_string(), end=\"\\n\\n\\n\")\n\n    print(\"Transforms\\n\" + \"-\" * 10, end=\"\\n\")\n    transforms = metadata[\"label_times\"][\"transforms\"]\n    for step, transform in enumerate(transforms):\n        transform = pd.Series(transform)\n        transform.sort_index(inplace=True)\n        name = transform.pop(\"transform\")\n        transform = transform.add_prefix(\"  - \")\n        transform = transform.add_suffix(\":\")\n        transform = transform.to_string()\n        header = \"{}. {}\\n\".format(step + 1, name)\n        print(header + transform, end=\"\\n\\n\")\n\n    if len(transforms) == 0:\n        print(\"No transforms applied\", end=\"\\n\\n\")\n"
  },
  {
    "path": "composeml/label_times/deserialize.py",
    "content": "import json\nimport os\n\nimport pandas as pd\n\nfrom composeml.label_times.object import LabelTimes\n\n\ndef read_config(path):\n    \"\"\"Reads config file from disk.\"\"\"\n    file = os.path.join(path, \"settings.json\")\n    assert os.path.exists(file), \"settings not found: '%s'\" % file\n\n    with open(file, \"r\") as file:\n        settings = json.load(file)\n        return settings\n\n\ndef read_data(path):\n    \"\"\"Reads data file from disk.\"\"\"\n    file = \"\"\n    for file in os.listdir(path):\n        if file.startswith(\"data\"):\n            break\n\n    assert file.startswith(\"data\"), \"data not found\"\n    extension = os.path.splitext(file)[1].lstrip(\".\")\n    info = \"file extension must be csv, parquet, or pickle\"\n    assert extension in [\"csv\", \"parquet\", \"pickle\"], info\n\n    read = getattr(pd, \"read_%s\" % extension)\n    data = read(os.path.join(path, file))\n    return data\n\n\ndef read_label_times(path, load_settings=True):\n    \"\"\"Reads label times from disk.\n\n    Args:\n        path (str): Directory where label times is stored.\n\n    Returns:\n        lt (LabelTimes): Deserialized label times.\n    \"\"\"\n    kwargs = {}\n    data = read_data(path)\n\n    if load_settings:\n        config = read_config(path)\n        data = data.astype(config[\"dtypes\"])\n        kwargs.update(config[\"label_times\"])\n\n    lt = LabelTimes(data=data, **kwargs)\n    return lt\n"
  },
  {
    "path": "composeml/label_times/object.py",
    "content": "import json\nimport os\n\nimport pandas as pd\n\nfrom composeml.label_times.description import describe_label_times\nfrom composeml.label_times.plots import LabelPlots\nfrom composeml.version import __version__\n\nSCHEMA_VERSION = \"0.1.0\"\n\n\nclass LabelTimes(pd.DataFrame):\n    \"\"\"The data frame that contains labels and cutoff times for the target dataframe.\"\"\"\n\n    def __init__(\n        self,\n        data=None,\n        target_dataframe_index=None,\n        target_types=None,\n        target_columns=None,\n        search_settings=None,\n        transforms=None,\n        *args,\n        **kwargs,\n    ):\n        super().__init__(data=data, *args, **kwargs)\n        self.target_dataframe_index = target_dataframe_index\n        self.target_columns = target_columns or []\n        self.target_types = target_types or {}\n        self.search_settings = search_settings or {}\n        self.transforms = transforms or []\n        self.plot = LabelPlots(self)\n\n        if not self.empty:\n            self._check_label_times()\n\n    def _assert_single_target(self):\n        \"\"\"Asserts that the label times object contains a single target.\"\"\"\n        info = \"must first select an individual target\"\n        assert self._is_single_target, info\n\n    def _check_target_columns(self):\n        \"\"\"Validates the target columns.\"\"\"\n        if not self.target_columns:\n            self.target_columns = self._infer_target_columns()\n        else:\n            for target in self.target_columns:\n                info = 'target \"%s\" not found in data frame'\n                assert target in self.columns, info % target\n\n    def _check_target_types(self):\n        \"\"\"Validates the target types.\"\"\"\n        if isinstance(self.target_types, dict):\n            self.target_types = pd.Series(self.target_types, dtype=\"object\")\n\n        if self.target_types.empty:\n            self.target_types = self._infer_target_types()\n        else:\n            target_names = self.target_types.index.tolist()\n            match = target_names == self.target_columns\n            assert match, \"target names in types must match target columns\"\n\n    def _check_label_times(self):\n        \"\"\"Validates the lables times object.\"\"\"\n        self._check_target_columns()\n        self._check_target_types()\n\n    def _infer_target_columns(self):\n        \"\"\"Infers the names of the targets in the data frame.\n\n        Returns:\n            value (list): A list of the target names.\n        \"\"\"\n        not_targets = [self.target_dataframe_index, \"time\"]\n        target_columns = self.columns.difference(not_targets)\n        assert not target_columns.empty, \"target columns not found\"\n        value = target_columns.tolist()\n        return value\n\n    @property\n    def _is_single_target(self):\n        return len(self.target_columns) == 1\n\n    def _get_target_type(self, dtype):\n        is_discrete = pd.api.types.is_bool_dtype(dtype)\n        is_discrete |= pd.api.types.is_categorical_dtype(dtype)\n        is_discrete |= pd.api.types.is_object_dtype(dtype)\n        value = \"discrete\" if is_discrete else \"continuous\"\n        return value\n\n    def _infer_target_types(self):\n        \"\"\"Infers the target type from the data type.\n\n        Returns:\n            types (Series): Inferred label type. Either \"continuous\" or \"discrete\".\n        \"\"\"\n        dtypes = self.dtypes[self.target_columns]\n        types = dtypes.apply(self._get_target_type)\n        return types\n\n    def select(self, target):\n        \"\"\"Selects one of the target variables.\n\n        Args:\n            target (str): The name of the target column.\n\n        Returns:\n            lt (LabelTimes): A label times object that contains a single target.\n\n        Examples:\n            Create a label times object that contains multiple target variables.\n\n            >>> entity = [0, 0, 1, 1]\n            >>> labels = [True, False, True, False]\n            >>> time = ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04']\n            >>> data = {'entity': entity, 'time': time, 'A': labels, 'B': labels}\n            >>> lt = LabelTimes(data=data, target_dataframe_index='entity', target_columns=['A', 'B'])\n            >>> lt\n               entity        time      A      B\n            0       0  2020-01-01   True   True\n            1       0  2020-01-02  False  False\n            2       1  2020-01-03   True   True\n            3       1  2020-01-04  False  False\n\n            Select a single target from the label times.\n\n            >>> lt.select('B')\n               entity        time      B\n            0       0  2020-01-01   True\n            1       0  2020-01-02  False\n            2       1  2020-01-03   True\n            3       1  2020-01-04  False\n        \"\"\"\n        assert not self._is_single_target, \"only one target exists\"\n        if not isinstance(target, str):\n            raise TypeError(\"target name must be string\")\n        assert target in self.target_columns, 'target \"%s\" not found' % target\n\n        lt = self.copy()\n        lt.target_columns = [target]\n        lt.target_types = lt.target_types[[target]]\n        lt = lt[[self.target_dataframe_index, \"time\", target]]\n        return lt\n\n    @property\n    def settings(self):\n        \"\"\"Returns metadata about the label times.\"\"\"\n        return {\n            \"compose_version\": __version__,\n            \"schema_version\": SCHEMA_VERSION,\n            \"label_times\": {\n                \"target_dataframe_index\": self.target_dataframe_index,\n                \"target_columns\": self.target_columns,\n                \"target_types\": self.target_types.to_dict(),\n                \"search_settings\": self.search_settings,\n                \"transforms\": self.transforms,\n            },\n        }\n\n    @property\n    def is_discrete(self):\n        \"\"\"Whether labels are discrete.\"\"\"\n        return self.target_types.eq(\"discrete\")\n\n    @property\n    def distribution(self):\n        \"\"\"Returns label distribution if labels are discrete.\"\"\"\n        self._assert_single_target()\n        target_column = self.target_columns[0]\n\n        if self.is_discrete[target_column]:\n            labels = self.assign(count=1)\n            labels = labels.groupby(target_column)\n            distribution = labels[\"count\"].count()\n            return distribution\n        else:\n            return self[target_column].describe()\n\n    @property\n    def count(self):\n        \"\"\"Returns label count per instance.\"\"\"\n        self._assert_single_target()\n        count = self.groupby(self.target_dataframe_index)\n        count = count[self.target_columns[0]].count()\n        count = count.to_frame(\"count\")\n        return count\n\n    @property\n    def count_by_time(self):\n        \"\"\"Returns label count across cutoff times.\"\"\"\n        self._assert_single_target()\n        target_column = self.target_columns[0]\n\n        if self.is_discrete[target_column]:\n            keys = [\"time\", target_column]\n            value = self.groupby(keys).time.count()\n            value = value.unstack(target_column).fillna(0)\n        else:\n            value = self.groupby(\"time\")\n            value = value[target_column].count()\n\n        value = (\n            value.cumsum()\n        )  # In Python 3.5, these values automatically convert to float.\n        value = value.astype(\"int\")\n        return value\n\n    def describe(self):\n        \"\"\"Prints out the settings used to make the label times.\"\"\"\n        if not self.empty:\n            self._assert_single_target()\n            describe_label_times(self)\n\n    def copy(self, deep=True):\n        \"\"\"Make a copy of this object's indices and data.\n\n        Args:\n            deep (bool): Make a deep copy, including a copy of the data and the indices.\n                With ``deep=False`` neither the indices nor the data are copied. Default is True.\n\n        Returns:\n            lt (LabelTimes): A copy of the label times object.\n        \"\"\"\n        lt = super().copy(deep=deep)\n        lt.target_dataframe_index = self.target_dataframe_index\n        lt.target_columns = self.target_columns\n        lt.target_types = self.target_types.copy()\n        lt.search_settings = self.search_settings.copy()\n        lt.transforms = self.transforms.copy()\n        return lt\n\n    def threshold(self, value, inplace=False):\n        \"\"\"Creates binary labels by testing if labels are above threshold.\n\n        Args:\n            value (float) : Value of threshold.\n            inplace (bool) : Modify labels in place.\n\n        Returns:\n            labels (LabelTimes) : Instance of labels.\n        \"\"\"\n        self._assert_single_target()\n        target_column = self.target_columns[0]\n        labels = self if inplace else self.copy()\n        labels[target_column] = labels[target_column].gt(value)\n        labels.target_types[target_column] = \"discrete\"\n\n        transform = {\"transform\": \"threshold\", \"value\": value}\n        labels.transforms.append(transform)\n\n        if not inplace:\n            return labels\n\n    def apply_lead(self, value, inplace=False):\n        \"\"\"Shifts the label times earlier for predicting in advance.\n\n        Args:\n            value (str) : Time to shift earlier.\n            inplace (bool) : Modify labels in place.\n\n        Returns:\n            labels (LabelTimes) : Instance of labels.\n        \"\"\"\n        labels = self if inplace else self.copy()\n        labels[\"time\"] = labels[\"time\"].sub(pd.Timedelta(value))\n\n        transform = {\"transform\": \"apply_lead\", \"value\": value}\n        labels.transforms.append(transform)\n\n        if not inplace:\n            return labels\n\n    def bin(self, bins, quantiles=False, labels=None, right=True, precision=3):\n        \"\"\"Bin labels into discrete intervals.\n\n        Args:\n            bins (int or array): The criteria to bin by.\n                As an integer, the value can be the number of equal-width or quantile-based bins.\n                If :code:`quantiles` is False, the value is defined as the number of equal-width bins.\n                The range is extended by .1% on each side to include the minimum and maximum values.\n                If :code:`quantiles` is True, the value is defined as the number of quantiles (e.g. 10 for deciles, 4 for quartiles, etc.)\n                As an array, the value can be custom or quantile-based edges.\n                If :code:`quantiles` is False, the value is defined as bin edges allowing for non-uniform width. No extension is done.\n                If :code:`quantiles` is True, the value is defined as bin edges usings an array of quantiles (e.g. [0, .25, .5, .75, 1.] for quartiles)\n\n            quantiles (bool): Determines whether to use a quantile-based discretization function.\n            labels (array): Specifies the labels for the returned bins. Must be the same length as the resulting bins.\n            right (bool) : Indicates whether bins includes the rightmost edge or not. Does not apply to quantile-based bins.\n            precision (int): The precision at which to store and display the bins labels. Default value is 3.\n\n        Returns:\n            LabelTimes : Instance of labels.\n\n        Examples:\n            These are the target values for the examples.\n\n            >>> data = [226.93, 47.95, 283.46, 31.54]\n            >>> lt = LabelTimes({'target': data})\n            >>> lt\n               target\n            0  226.93\n            1   47.95\n            2  283.46\n            3   31.54\n\n            Bin values using equal-widths.\n\n            >>> lt.bin(2)\n                        target\n            0  (157.5, 283.46]\n            1  (31.288, 157.5]\n            2  (157.5, 283.46]\n            3  (31.288, 157.5]\n\n            Bin values using custom-widths.\n\n            >>> lt.bin([0, 200, 400])\n                   target\n            0  (200, 400]\n            1    (0, 200]\n            2  (200, 400]\n            3    (0, 200]\n\n            Bin values using infinite edges.\n\n            >>> lt.bin(['-inf', 100, 'inf'])\n                      target\n            0   (100.0, inf]\n            1  (-inf, 100.0]\n            2   (100.0, inf]\n            3  (-inf, 100.0]\n\n            Bin values using quartiles.\n\n            >>> lt.bin(4, quantiles=True)\n                                     target\n            0             (137.44, 241.062]\n            1              (43.848, 137.44]\n            2             (241.062, 283.46]\n            3  (31.538999999999998, 43.848]\n\n            Bin values using custom quantiles with precision.\n\n            >>> lt.bin([0, .5, 1], quantiles=True, precision=1)\n                       target\n            0  (137.4, 283.5]\n            1   (31.4, 137.4]\n            2  (137.4, 283.5]\n            3   (31.4, 137.4]\n\n            Assign labels to bins.\n\n            >>> lt.bin(2, labels=['low', 'high'])\n              target\n            0   high\n            1    low\n            2   high\n            3    low\n        \"\"\"  # noqa\n        self._assert_single_target()\n        target_column = self.target_columns[0]\n        values = self[target_column].values\n\n        if quantiles:\n            values = pd.qcut(values, q=bins, labels=labels, precision=precision)\n\n        else:\n            if isinstance(bins, list):\n                for i, edge in enumerate(bins):\n                    if edge in [\"-inf\", \"inf\"]:\n                        bins[i] = float(edge)\n\n            values = pd.cut(\n                values,\n                bins=bins,\n                labels=labels,\n                right=right,\n                precision=precision,\n            )\n\n        transform = {\n            \"transform\": \"bin\",\n            \"bins\": bins,\n            \"quantiles\": quantiles,\n            \"labels\": labels,\n            \"right\": right,\n            \"precision\": precision,\n        }\n\n        lt = self.copy()\n        lt[target_column] = values\n        lt.transforms.append(transform)\n        lt.target_types[target_column] = \"discrete\"\n        return lt\n\n    def _sample(self, key, value, settings, random_state=None, replace=False):\n        \"\"\"Returns a random sample of labels.\n\n        Args:\n            key (str) : Determines the sampling method. Can either be 'n' or 'frac'.\n            value (int or float) : Quantity to sample.\n            settings (dict) : Transform settings used for sampling.\n            random_state (int) : Seed for the random number generator.\n            replace (bool) : Sample with or without replacement. Default value is False.\n\n        Returns:\n            LabelTimes : Random sample of labels.\n        \"\"\"\n        sample = super().sample(\n            random_state=random_state, replace=replace, **{key: value}\n        )\n        return sample\n\n    def _sample_per_label(self, key, value, settings, random_state=None, replace=False):\n        \"\"\"Returns a random sample per label.\n\n        Args:\n            key (str) : Determines the sampling method. Can either be 'n' or 'frac'.\n            value (dict) : Quantity to sample per label.\n            settings (dict) : Transform settings used for sampling.\n            random_state (int) : Seed for the random number generator.\n            replace (bool) : Sample with or without replacement. Default value is False.\n\n        Returns:\n            LabelTimes : Random sample per label.\n        \"\"\"\n        sample_per_label = []\n        target_column = self.target_columns[0]\n\n        for (\n            label,\n            value,\n        ) in value.items():\n            label = self[self[target_column] == label]\n            sample = label._sample(\n                key,\n                value,\n                settings,\n                random_state=random_state,\n                replace=replace,\n            )\n            sample_per_label.append(sample)\n\n        sample = pd.concat(sample_per_label, axis=0, sort=False)\n        return sample\n\n    def sample(\n        self,\n        n=None,\n        frac=None,\n        random_state=None,\n        replace=False,\n        per_instance=False,\n    ):\n        \"\"\"Return a random sample of labels.\n\n        Args:\n            n (int or dict) : Sample number of labels. A dictionary returns\n                the number of samples to each label. Cannot be used with frac.\n            frac (float or dict) : Sample fraction of labels. A dictionary returns\n                the sample fraction to each label. Cannot be used with n.\n            random_state (int) : Seed for the random number generator.\n            replace (bool) : Sample with or without replacement. Default value is False.\n            per_instance (bool): Whether to apply sampling to each group. Default is False.\n\n        Returns:\n            LabelTimes : Random sample of labels.\n\n        Examples:\n            Create a label times object.\n\n            >>> entity = [0, 0, 1, 1]\n            >>> labels = [True, False, True, False]\n            >>> data = {'entity': entity, 'labels': labels}\n            >>> lt = LabelTimes(data=data, target_dataframe_index='entity', target_columns=['labels'])\n            >>> lt\n               entity  labels\n            0       0    True\n            1       0   False\n            2       1    True\n            3       1   False\n\n            Sample a number of the examples.\n\n            >>> lt.sample(n=3, random_state=0)\n               entity  labels\n            1       0   False\n            2       1    True\n            3       1   False\n\n            Sample a fraction of the examples.\n\n            >>> lt.sample(frac=.25, random_state=0)\n               entity  labels\n            2       1    True\n\n            Sample a number of the examples for specific labels.\n\n            >>> n = {True: 1, False: 1}\n            >>> lt.sample(n=n, random_state=0)\n               entity  labels\n            2       1    True\n            3       1   False\n\n            Sample a fraction of the examples for specific labels.\n\n            >>> frac = {True: .5, False: .5}\n            >>> lt.sample(frac=frac, random_state=0)\n               entity  labels\n            2       1    True\n            3       1   False\n\n            Sample a number of the examples from each entity group.\n\n            >>> lt.sample(n={True: 1}, per_instance=True, random_state=0)\n               entity  labels\n            0       0    True\n            2       1    True\n\n            Sample a fraction of the examples from each entity group.\n\n            >>> lt.sample(frac=.5, per_instance=True, random_state=0)\n               entity  labels\n            1       0   False\n            3       1   False\n        \"\"\"  # noqa\n        self._assert_single_target()\n\n        settings = {\n            \"transform\": \"sample\",\n            \"n\": n,\n            \"frac\": frac,\n            \"random_state\": random_state,\n            \"replace\": replace,\n            \"per_instance\": per_instance,\n        }\n\n        key, value = (\"n\", n) if n else (\"frac\", frac)\n        assert value, \"must set value for 'n' or 'frac'\"\n\n        per_label = isinstance(value, dict)\n        method = \"_sample_per_label\" if per_label else \"_sample\"\n\n        def transform(lt):\n            sample = getattr(lt, method)(\n                key=key,\n                value=value,\n                settings=settings,\n                random_state=random_state,\n                replace=replace,\n            )\n            return sample\n\n        if per_instance:\n            groupby = self.groupby(self.target_dataframe_index, group_keys=False)\n            sample = groupby.apply(transform)\n        else:\n            sample = transform(self)\n\n        sample = sample.copy()\n        sample.sort_index(inplace=True)\n        sample.transforms.append(settings)\n        return sample\n\n    def equals(self, other, **kwargs):\n        \"\"\"Determines if two label time objects are the same.\n\n        Args:\n            other (LabelTimes) : Other label time object for comparison.\n            **kwargs: Keyword arguments to pass to underlying pandas.DataFrame.equals method\n\n        Returns:\n            bool : Whether label time objects are the same.\n        \"\"\"\n        is_equal = super().equals(other, **kwargs)\n        is_equal &= self.settings == other.settings\n        return is_equal\n\n    def _save_settings(self, path):\n        \"\"\"Write the settings in json format to disk.\n\n        Args:\n            path (str) : Directory on disk to write to.\n        \"\"\"\n        settings = self.settings\n        dtypes = self.dtypes.astype(\"str\")\n        settings[\"dtypes\"] = dtypes.to_dict()\n\n        file = os.path.join(path, \"settings.json\")\n        with open(file, \"w\") as file:\n            json.dump(settings, file)\n\n    def to_csv(self, path, save_settings=True, **kwargs):\n        \"\"\"Write label times in csv format to disk.\n\n        Args:\n            path (str) : Location on disk to write to (will be created as a directory).\n            save_settings (bool) : Whether to save the settings used to make the label times.\n            **kwargs: Keyword arguments to pass to underlying pandas.DataFrame.to_csv method\n        \"\"\"\n        os.makedirs(path, exist_ok=True)\n        file = os.path.join(path, \"data.csv\")\n        super().to_csv(file, index=False, **kwargs)\n\n        if save_settings:\n            self._save_settings(path)\n\n    def to_parquet(self, path, save_settings=True, **kwargs):\n        \"\"\"Write label times in parquet format to disk.\n\n        Args:\n            path (str) : Location on disk to write to (will be created as a directory).\n            save_settings (bool) : Whether to save the settings used to make the label times.\n            **kwargs: Keyword arguments to pass to underlying pandas.DataFrame.to_parquet method\n        \"\"\"\n        os.makedirs(path, exist_ok=True)\n        file = os.path.join(path, \"data.parquet\")\n        super().to_parquet(file, compression=None, engine=\"auto\", **kwargs)\n\n        if save_settings:\n            self._save_settings(path)\n\n    def to_pickle(self, path, save_settings=True, **kwargs):\n        \"\"\"Write label times in pickle format to disk.\n\n        Args:\n            path (str) : Location on disk to write to (will be created as a directory).\n            save_settings (bool) : Whether to save the settings used to make the label times.\n            **kwargs: Keyword arguments to pass to underlying pandas.DataFrame.to_pickle method\n        \"\"\"\n        os.makedirs(path, exist_ok=True)\n        file = os.path.join(path, \"data.pickle\")\n        super().to_pickle(file, **kwargs)\n\n        if save_settings:\n            self._save_settings(path)\n\n    # ----------------------------------------\n    # Subclassing Pandas Data Frame\n    # ----------------------------------------\n\n    _metadata = [\n        \"search_settings\",\n        \"target_columns\",\n        \"target_dataframe_index\",\n        \"target_types\",\n        \"transforms\",\n    ]\n\n    def __finalize__(self, other, method=None, **kwargs):\n        \"\"\"Propagate metadata from other label times data frames.\n\n        Args:\n            other (LabelTimes) : The label times from which to get the attributes from.\n            method (str) : A passed method name for optionally taking different types of propagation actions based on this value.\n        \"\"\"\n        if method == \"concat\":\n            other = other.objs[0]\n\n            for key in self._metadata:\n                value = getattr(other, key, None)\n                setattr(self, key, value)\n\n            return self\n\n        return super().__finalize__(other=other, method=method, **kwargs)\n\n    @property\n    def _constructor(self):\n        return LabelTimes\n"
  },
  {
    "path": "composeml/label_times/plots.py",
    "content": "import matplotlib as mpl  # isort:skip\nimport pandas as pd\nimport seaborn as sns\n\n# Raises an import error on OSX if not included.\n# https://matplotlib.org/3.1.0/faq/osx_framework.html#working-with-matplotlib-on-osx\nmpl.use(\"agg\")  # noqa\npd.plotting.register_matplotlib_converters()\nsns.set_context(\"notebook\")\nsns.set_style(\"darkgrid\")\nCOLOR = sns.color_palette(\"Set1\", n_colors=100, desat=0.75)\n\n\nclass LabelPlots:\n    \"\"\"Creates plots for Label Times.\"\"\"\n\n    def __init__(self, label_times):\n        \"\"\"Initializes Label Plots.\n\n        Args:\n            label_times (LabelTimes) : instance of Label Times\n        \"\"\"\n        self._label_times = label_times\n\n    def count_by_time(self, ax=None, **kwargs):\n        \"\"\"Plots the label distribution across cutoff times.\"\"\"\n        count_by_time = self._label_times.count_by_time\n        count_by_time.sort_index(inplace=True)\n        target_column = self._label_times.target_columns[0]\n\n        ax = ax or mpl.pyplot.axes(label=id(self))\n        vmin = count_by_time.index.min()\n        vmax = count_by_time.index.max()\n        ax.set_xlim(vmin, vmax)\n\n        locator = mpl.dates.AutoDateLocator()\n        formatter = mpl.dates.AutoDateFormatter(locator)\n        ax.xaxis.set_major_locator(locator)\n        ax.xaxis.set_major_formatter(formatter)\n        for label in ax.get_xticklabels():\n            label.set_rotation(30)\n\n        if len(count_by_time.shape) > 1:\n            ax.stackplot(\n                count_by_time.index,\n                count_by_time.values.T,\n                labels=count_by_time.columns,\n                colors=COLOR,\n                alpha=0.9,\n                **kwargs,\n            )\n\n            ax.legend(\n                loc=\"upper left\",\n                title=target_column,\n                facecolor=\"w\",\n                framealpha=0.9,\n            )\n\n            ax.set_title(\"Label Count vs. Cutoff Times\")\n            ax.set_ylabel(\"Count\")\n            ax.set_xlabel(\"Time\")\n\n        else:\n            ax.fill_between(\n                count_by_time.index,\n                count_by_time.values.T,\n                color=COLOR[1],\n            )\n\n            ax.set_title(\"Label vs. Cutoff Times\")\n            ax.set_ylabel(target_column)\n            ax.set_xlabel(\"Time\")\n\n        return ax\n\n    @property\n    def dist(self):\n        \"\"\"Alias for distribution.\"\"\"\n        return self.distribution\n\n    def distribution(self, **kwargs):\n        \"\"\"Plots the label distribution.\"\"\"\n        self._label_times._assert_single_target()\n        target_column = self._label_times.target_columns[0]\n        dist = self._label_times[target_column]\n        is_discrete = self._label_times.is_discrete[target_column]\n\n        if is_discrete:\n            ax = sns.countplot(x=dist, palette=COLOR, **kwargs)\n        else:\n            ax = sns.histplot(x=dist, kde=True, color=COLOR[1], **kwargs)\n\n        ax.set_title(\"Label Distribution\")\n        ax.set_ylabel(\"Count\")\n        return ax\n"
  },
  {
    "path": "composeml/tests/__init__.py",
    "content": ""
  },
  {
    "path": "composeml/tests/requirement_files/latest_core_dependencies.txt",
    "content": "featuretools==1.27.0\nmatplotlib==3.7.2\npandas==2.0.3\nseaborn==0.12.2\ntqdm==4.66.1\nwoodwork==0.25.1\n"
  },
  {
    "path": "composeml/tests/requirement_files/minimum_core_requirements.txt",
    "content": "matplotlib==3.3.3\npandas==2.0.0\nseaborn==0.12.2\ntqdm==4.32.0\n"
  },
  {
    "path": "composeml/tests/requirement_files/minimum_test_requirements.txt",
    "content": "featuretools==1.27.0\nmatplotlib==3.3.3\npandas==2.0.0\npip==21.3.1\npyarrow==7.0.0\npytest-cov==3.0.0\npytest-xdist==2.5.0\npytest==7.1.2\nseaborn==0.12.2\ntqdm==4.32.0\nwheel==0.33.1\nwoodwork==0.25.1\n"
  },
  {
    "path": "composeml/tests/test_data_slice/__init__.py",
    "content": ""
  },
  {
    "path": "composeml/tests/test_data_slice/test_extension.py",
    "content": "import pandas as pd\nfrom pytest import fixture, mark, raises\n\nfrom composeml import LabelMaker\n\n\n@fixture\ndef data_slice(transactions):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        window_size=\"1h\",\n    )\n    ds = next(lm.slice(transactions, num_examples_per_instance=1))\n    return ds\n\n\ndef test_context(data_slice):\n    print(data_slice.context)\n    context = str(data_slice.context)\n    actual = context.splitlines()\n\n    expected = [\n        \"customer_id                       0\",\n        \"slice_number                      1\",\n        \"slice_start     2019-01-01 08:00:00\",\n        \"slice_stop      2019-01-01 09:00:00\",\n        \"next_start      2019-01-01 09:00:00\",\n    ]\n\n    assert actual == expected\n\n\ndef test_context_aliases(data_slice):\n    assert data_slice.context == data_slice.ctx\n    assert data_slice.context.slice_number == data_slice.ctx.count\n    assert data_slice.context.slice_start == data_slice.ctx.start\n    assert data_slice.context.slice_stop == data_slice.ctx.stop\n\n\n@mark.parametrize(\n    \"time_based,offsets\",\n    argvalues=[\n        [False, (2, 4, 2)],\n        [False, (2, -6, 2)],\n        [True, (pd.Timedelta(\"1h\"), pd.Timedelta(\"2h\"), pd.Timedelta(\"1h\"))],\n        [True, (pd.Timedelta(\"1h\"), pd.Timedelta(\"-2h30min\"), pd.Timedelta(\"1h\"))],\n        [True, (\"2019-01-01 09:00:00\", \"2019-01-01 10:00:00\", pd.Timedelta(\"1h\"))],\n    ],\n)\ndef test_subscriptable_slices(transactions, time_based, offsets):\n    if time_based:\n        dtypes = {\"time\": \"datetime64[ns]\"}\n        transactions = transactions.astype(dtypes)\n        transactions.set_index(\"time\", inplace=True)\n\n    start, stop, size = offsets\n    slices = transactions.slice[start:stop:size]\n    actual = tuple(map(len, slices))\n    assert actual == (2, 2)\n\n\ndef test_subscriptable_error(transactions):\n    with raises(TypeError, match=\"must be a slice object\"):\n        transactions.slice[0]\n\n\ndef test_time_index_error(transactions):\n    match = \"offset by frequency requires a time index\"\n    with raises(AssertionError, match=match):\n        transactions.slice[::\"1h\"]\n\n\ndef test_minimum_data_per_group(transactions):\n    lm = LabelMaker(\n        \"customer_id\",\n        labeling_function=len,\n        time_index=\"time\",\n        window_size=\"1h\",\n    )\n    minimum_data = {1: \"2019-01-01 09:00:00\", 3: \"2019-01-01 12:00:00\"}\n    lengths = [len(ds) for ds in lm.slice(transactions, 1, minimum_data=minimum_data)]\n    assert lengths == [2, 1]\n\n\ndef test_drop_empty(transactions):\n    df = transactions.astype({\"time\": \"datetime64[ns]\"})\n    df.set_index(\"time\", inplace=True)\n    df.sort_index(inplace=True)\n\n    ds = df.slice(\n        size=\"1h\",\n        drop_empty=True,\n        stop=\"2019-01-01 15:00:00\",\n        start=\"2019-01-01 08:00:00\",\n    )\n\n    assert len(list(ds)) == 5\n"
  },
  {
    "path": "composeml/tests/test_data_slice/test_offset.py",
    "content": "from pytest import raises\n\nfrom composeml.data_slice.offset import DataSliceOffset\n\n\ndef test_numeric_typecast():\n    assert int(DataSliceOffset(\"1 nanosecond\")) == 1\n    assert float(DataSliceOffset(\"1970-01-01\")) == 0.0\n\n\ndef test_numeric_typecast_errors():\n    match = \"offset must be position or frequency based\"\n    with raises(TypeError, match=match):\n        int(DataSliceOffset(\"1970-01-01\"))\n\n    match = \"offset must be a timestamp\"\n    with raises(TypeError, match=match):\n        float(DataSliceOffset(\"1 nanosecond\"))\n\n\ndef test_invalid_value():\n    match = \"offset must be position or time based\"\n    with raises(AssertionError, match=match):\n        DataSliceOffset(None)\n\n\ndef test_alias_phrase():\n    phrase = \"until start of next month\"\n    actual = DataSliceOffset(phrase).value\n    expected = DataSliceOffset(\"MS\").value\n    assert actual == expected\n\n    phrase = \"until start of next year\"\n    actual = DataSliceOffset(phrase).value\n    expected = DataSliceOffset(\"YS\").value\n    assert actual == expected\n"
  },
  {
    "path": "composeml/tests/test_datasets.py",
    "content": "import pytest\n\nfrom composeml import demos\n\n\n@pytest.fixture\ndef transactions():\n    return demos.load_transactions()\n\n\ndef test_transactions(transactions):\n    assert len(transactions) == 100\n"
  },
  {
    "path": "composeml/tests/test_featuretools.py",
    "content": "import featuretools as ft\nimport pytest\n\nfrom composeml import LabelMaker\n\n\ndef total_spent(df):\n    total = df.amount.sum()\n    return total\n\n\n@pytest.fixture\ndef labels():\n    df = ft.demo.load_mock_customer(return_single_table=True, random_seed=0)\n    df = df[[\"transaction_time\", \"customer_id\", \"amount\"]]\n    df.sort_values(\"transaction_time\", inplace=True)\n\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"transaction_time\",\n        labeling_function=total_spent,\n        window_size=\"1h\",\n    )\n\n    lt = lm.search(\n        df,\n        minimum_data=\"10min\",\n        num_examples_per_instance=2,\n        gap=\"30min\",\n        drop_empty=True,\n        verbose=False,\n    )\n\n    lt = lt.threshold(1250)\n    return lt\n\n\ndef test_dfs(labels):\n    target_column = labels.target_columns[0]\n    es = ft.demo.load_mock_customer(return_entityset=True, random_seed=0)\n    feature_matrix, _ = ft.dfs(\n        entityset=es,\n        target_dataframe_name=\"customers\",\n        cutoff_time=labels,\n        cutoff_time_in_index=True,\n    )\n    assert target_column in feature_matrix\n\n    columns = [\"customer_id\", \"time\", target_column]\n    given_labels = feature_matrix.reset_index()[columns]\n    given_labels = given_labels.sort_values([\"customer_id\", \"time\"])\n    given_labels = given_labels.reset_index(drop=True)\n    given_labels = given_labels.rename_axis(\"label_id\")\n\n    assert given_labels.equals(labels)\n"
  },
  {
    "path": "composeml/tests/test_label_maker.py",
    "content": "import pandas as pd\nimport pytest\n\nfrom composeml import LabelMaker\nfrom composeml.tests.utils import to_csv\n\n\ndef test_search_default(transactions, total_spent_fn):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n    )\n\n    given_labels = lm.search(transactions, num_examples_per_instance=1)\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:00:00,2\",\n        \"1,2019-01-01 09:00:00,3\",\n        \"2,2019-01-01 10:30:00,4\",\n        \"3,2019-01-01 12:30:00,1\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_examples_per_label(transactions, total_spent_fn):\n    def total_spent(ds):\n        return total_spent_fn(ds) > 2\n\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent,\n    )\n\n    n_examples = {True: -1, False: 1}\n    given_labels = lm.search(transactions, num_examples_per_instance=n_examples, gap=1)\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:00:00,False\",\n        \"1,2019-01-01 09:00:00,True\",\n        \"1,2019-01-01 09:30:00,False\",\n        \"2,2019-01-01 10:30:00,True\",\n        \"2,2019-01-01 11:00:00,True\",\n        \"2,2019-01-01 11:30:00,False\",\n        \"3,2019-01-01 12:30:00,False\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_with_undefined_labels(transactions, total_spent_fn):\n    def total_spent(ds):\n        return total_spent_fn(ds) % 3\n\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent,\n    )\n\n    n_examples = {1: 1, 2: 1}\n    given_labels = lm.search(transactions, num_examples_per_instance=n_examples, gap=1)\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:00:00,2\",\n        \"0,2019-01-01 08:30:00,1\",\n        \"1,2019-01-01 09:30:00,2\",\n        \"1,2019-01-01 10:00:00,1\",\n        \"2,2019-01-01 10:30:00,1\",\n        \"2,2019-01-01 11:30:00,2\",\n        \"3,2019-01-01 12:30:00,1\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_with_multiple_targets(transactions, total_spent_fn, unique_amounts_fn):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        window_size=2,\n        labeling_function={\n            \"total_spent\": total_spent_fn,\n            \"unique_amounts\": unique_amounts_fn,\n        },\n    )\n\n    expected = [\n        \"customer_id,time,total_spent,unique_amounts\",\n        \"0,2019-01-01 08:00:00,2,1\",\n        \"1,2019-01-01 09:00:00,2,1\",\n        \"1,2019-01-01 10:00:00,1,1\",\n        \"2,2019-01-01 10:30:00,2,1\",\n        \"2,2019-01-01 11:30:00,2,1\",\n        \"3,2019-01-01 12:30:00,1,1\",\n    ]\n\n    lt = lm.search(transactions, num_examples_per_instance=-1)\n    actual = lt.pipe(to_csv, index=False)\n    info = \"unexpected calculated values\"\n    assert actual == expected, info\n\n    expected = [\n        \"customer_id,time,unique_amounts\",\n        \"0,2019-01-01 08:00:00,1\",\n        \"1,2019-01-01 09:00:00,1\",\n        \"1,2019-01-01 10:00:00,1\",\n        \"2,2019-01-01 10:30:00,1\",\n        \"2,2019-01-01 11:30:00,1\",\n        \"3,2019-01-01 12:30:00,1\",\n    ]\n\n    actual = lt.select(\"unique_amounts\")\n    actual = actual.pipe(to_csv, index=False)\n    info = \"selected values differ from calculated values\"\n    assert actual == expected, info\n\n\ndef test_search_offset_mix_0(transactions, total_spent_fn):\n    \"\"\"\n    Test offset mix with window_size (absolute), minimum_data (absolute), and gap (absolute).\n    \"\"\"\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n        window_size=\"2h\",\n    )\n\n    given_labels = lm.search(\n        transactions,\n        num_examples_per_instance=2,\n        minimum_data=\"30min\",\n        gap=\"2h\",\n        drop_empty=True,\n    )\n\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:30:00,1\",\n        \"1,2019-01-01 09:30:00,2\",\n        \"2,2019-01-01 11:00:00,3\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_offset_mix_1(transactions, total_spent_fn):\n    \"\"\"\n    Test offset mix with window_size (relative), minimum_data (absolute), and gap (absolute).\n    \"\"\"\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n        window_size=4,\n    )\n\n    given_labels = lm.search(\n        transactions,\n        num_examples_per_instance=2,\n        minimum_data=\"2019-01-01 10:00:00\",\n        gap=\"4h\",\n    )\n\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"1,2019-01-01 10:00:00,1\",\n        \"2,2019-01-01 10:00:00,4\",\n        \"3,2019-01-01 10:00:00,1\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_offset_mix_2(transactions, total_spent_fn):\n    \"\"\"\n    Test offset mix with window_size (absolute), minimum_data (relative), and gap (absolute).\n    \"\"\"\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n        window_size=\"30min\",\n    )\n\n    given_labels = lm.search(\n        transactions,\n        num_examples_per_instance=2,\n        minimum_data=2,\n    )\n\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"1,2019-01-01 10:00:00,1\",\n        \"2,2019-01-01 11:30:00,1\",\n        \"2,2019-01-01 12:00:00,1\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_offset_mix_3(transactions, total_spent_fn):\n    \"\"\"\n    Test offset mix with window_size (absolute), minimum_data (absolute), and gap (relative).\n    \"\"\"\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n        window_size=\"8h\",\n    )\n\n    given_labels = lm.search(\n        transactions,\n        num_examples_per_instance=-1,\n        minimum_data=\"2019-01-01 08:00:00\",\n        gap=1,\n    )\n\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:00:00,2\",\n        \"0,2019-01-01 08:30:00,1\",\n        \"1,2019-01-01 09:00:00,3\",\n        \"1,2019-01-01 09:30:00,2\",\n        \"1,2019-01-01 10:00:00,1\",\n        \"2,2019-01-01 10:30:00,4\",\n        \"2,2019-01-01 11:00:00,3\",\n        \"2,2019-01-01 11:30:00,2\",\n        \"2,2019-01-01 12:00:00,1\",\n        \"3,2019-01-01 12:30:00,1\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_offset_mix_4(transactions, total_spent_fn):\n    \"\"\"\n    Test offset mix with window_size (relative), minimum_data (relative), and gap (absolute).\n    \"\"\"\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n        window_size=1,\n    )\n\n    given_labels = lm.search(\n        transactions,\n        num_examples_per_instance=2,\n        gap=\"30min\",\n    )\n\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:00:00,1\",\n        \"0,2019-01-01 08:30:00,1\",\n        \"1,2019-01-01 09:00:00,1\",\n        \"1,2019-01-01 09:30:00,1\",\n        \"2,2019-01-01 10:30:00,1\",\n        \"2,2019-01-01 11:00:00,1\",\n        \"3,2019-01-01 12:30:00,1\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_offset_mix_5(transactions, total_spent_fn):\n    \"\"\"\n    Test offset mix with window_size (relative), minimum_data (absolute), and gap (relative).\n    \"\"\"\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n        window_size=2,\n    )\n\n    labels = lm.search(\n        transactions,\n        num_examples_per_instance=2,\n        minimum_data=\"1h\",\n        gap=2,\n    )\n\n    labels = to_csv(labels, index=False)\n\n    expected_labels = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:00:00,2\",\n        \"1,2019-01-01 09:00:00,2\",\n        \"1,2019-01-01 10:00:00,1\",\n        \"2,2019-01-01 10:30:00,2\",\n        \"2,2019-01-01 11:30:00,2\",\n        \"3,2019-01-01 12:30:00,1\",\n    ]\n    assert labels == expected_labels\n\n\ndef test_search_offset_mix_6(transactions, total_spent_fn):\n    \"\"\"\n    Test offset mix with window_size (absolute), minimum_data (relative), and gap (relative).\n    \"\"\"\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n        window_size=\"1h\",\n    )\n\n    given_labels = lm.search(\n        transactions,\n        num_examples_per_instance=1,\n        minimum_data=3,\n        gap=1,\n    )\n\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"2,2019-01-01 12:00:00,1\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_offset_mix_7(transactions, total_spent_fn):\n    \"\"\"\n    Test offset mix with window_size (relative), minimum_data (relative), and gap (relative).\n    \"\"\"\n\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n        window_size=10,\n    )\n\n    given_labels = lm.search(\n        transactions,\n        num_examples_per_instance=float(\"inf\"),\n    )\n\n    given_labels = to_csv(given_labels, index=False)\n\n    labels = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:00:00,2\",\n        \"1,2019-01-01 09:00:00,3\",\n        \"2,2019-01-01 10:30:00,4\",\n        \"3,2019-01-01 12:30:00,1\",\n    ]\n\n    assert given_labels == labels\n\n\ndef test_search_offset_negative_0(transactions, total_spent_fn):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=lambda: None,\n        window_size=2,\n    )\n\n    match = \"offset must be positive\"\n    with pytest.raises(AssertionError, match=match):\n        lm.search(\n            transactions,\n            num_examples_per_instance=2,\n            minimum_data=-1,\n            gap=-1,\n        )\n\n\ndef test_search_offset_negative_1(transactions, total_spent_fn):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=lambda: None,\n        window_size=2,\n    )\n\n    match = \"offset must be positive\"\n    with pytest.raises(AssertionError, match=match):\n        lm.search(\n            transactions,\n            num_examples_per_instance=2,\n            minimum_data=\"-1h\",\n            gap=\"-1h\",\n        )\n\n\ndef test_search_invalid_n_examples(transactions, total_spent_fn):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n    )\n\n    with pytest.raises(AssertionError, match=\"must specify gap\"):\n        next(lm.slice(transactions, num_examples_per_instance=2))\n\n    with pytest.raises(AssertionError, match=\"must specify gap\"):\n        lm.search(transactions, num_examples_per_instance=2)\n\n\ndef test_column_based_windows(transactions, total_spent_fn):\n    session_id = [1, 2, 3, 3, 4, 5, 5, 5, 6, 7]\n    df = transactions.assign(session_id=session_id)\n\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        window_size=\"session_id\",\n        labeling_function=total_spent_fn,\n    )\n\n    actual = lm.search(df, -1).pipe(to_csv, index=False)\n\n    expected = [\n        \"customer_id,time,total_spent\",\n        \"0,2019-01-01 08:00:00,1\",\n        \"0,2019-01-01 08:30:00,1\",\n        \"1,2019-01-01 09:00:00,2\",\n        \"1,2019-01-01 10:00:00,1\",\n        \"2,2019-01-01 10:30:00,3\",\n        \"2,2019-01-01 12:00:00,1\",\n        \"3,2019-01-01 12:30:00,1\",\n    ]\n\n    assert actual == expected\n\n\ndef test_search_with_invalid_index(transactions, total_spent_fn):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=lambda df: None,\n        window_size=2,\n    )\n\n    df = transactions.sample(n=10, random_state=0)\n    match = \"data frame must be sorted chronologically\"\n    with pytest.raises(AssertionError, match=match):\n        lm.search(df, num_examples_per_instance=2)\n\n    df = transactions.assign(time=pd.NaT)\n    match = \"index contains null values\"\n    with pytest.raises(AssertionError, match=match):\n        lm.search(df, num_examples_per_instance=2)\n\n\ndef test_search_on_empty_labels(transactions):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=lambda ds: None,\n        window_size=2,\n    )\n\n    given_labels = lm.search(\n        transactions,\n        minimum_data=1,\n        num_examples_per_instance=2,\n        gap=1,\n    )\n\n    assert given_labels.empty\n\n\ndef test_data_slice_overlap(transactions, total_spent_fn):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n        window_size=\"1h\",\n    )\n\n    for ds in lm.slice(transactions, num_examples_per_instance=2):\n        overlap = ds.index == ds.context.slice_stop\n        assert not overlap.any()\n\n\ndef test_label_type(transactions, total_spent_fn):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n    )\n    lt = lm.search(transactions, num_examples_per_instance=1)\n    assert lt.target_types[\"total_spent\"] == \"continuous\"\n    assert lt.bin(2).target_types[\"total_spent\"] == \"discrete\"\n\n\ndef test_search_with_maximum_data(transactions):\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=len,\n        window_size=\"1h\",\n    )\n\n    lt = lm.search(\n        df=transactions.sort_values(\"time\"),\n        num_examples_per_instance=-1,\n        minimum_data=\"2019-01-01 08:00:00\",\n        maximum_data=\"2019-01-01 09:00:00\",\n        drop_empty=False,\n    )\n\n    expected = [\n        \"customer_id,time,len\",\n        \"0,2019-01-01 08:00:00,2\",\n        \"0,2019-01-01 09:00:00,0\",\n        \"1,2019-01-01 08:00:00,0\",\n        \"1,2019-01-01 09:00:00,2\",\n        \"2,2019-01-01 08:00:00,0\",\n        \"2,2019-01-01 09:00:00,0\",\n        \"3,2019-01-01 08:00:00,0\",\n        \"3,2019-01-01 09:00:00,0\",\n    ]\n\n    actual = lt.pipe(to_csv, index=False)\n    assert actual == expected\n\n    lt = lm.search(\n        df=transactions.sort_values(\"time\"),\n        num_examples_per_instance=-1,\n        maximum_data=\"30min\",\n        drop_empty=False,\n        gap=\"30min\",\n    )\n\n    expected = [\n        \"customer_id,time,len\",\n        \"0,2019-01-01 08:00:00,2\",\n        \"0,2019-01-01 08:30:00,1\",\n        \"1,2019-01-01 09:00:00,2\",\n        \"1,2019-01-01 09:30:00,2\",\n        \"2,2019-01-01 10:30:00,2\",\n        \"2,2019-01-01 11:00:00,2\",\n        \"3,2019-01-01 12:30:00,1\",\n        \"3,2019-01-01 13:00:00,0\",\n    ]\n\n    actual = lt.pipe(to_csv, index=False)\n    assert actual == expected\n\n\n@pytest.mark.parametrize(\n    \"minimum_data\",\n    [\n        {1: \"2019-01-01 09:30:00\", 2: \"2019-01-01 11:30:00\"},\n        {1: pd.Timedelta(\"30min\"), 2: pd.Timedelta(\"1h\")},\n        {1: 1, 2: 2},\n    ],\n)\ndef test_minimum_data_per_group(transactions, minimum_data):\n    lm = LabelMaker(\n        \"customer_id\",\n        labeling_function=len,\n        time_index=\"time\",\n        window_size=\"1h\",\n    )\n    for supported_type in [minimum_data, pd.Series(minimum_data)]:\n        lt = lm.search(transactions, 1, minimum_data=supported_type)\n        actual = to_csv(lt, index=False)\n\n        expected = [\n            \"customer_id,time,len\",\n            \"1,2019-01-01 09:30:00,2\",\n            \"2,2019-01-01 11:30:00,2\",\n        ]\n\n        assert actual == expected\n\n\ndef test_minimum_data_per_group_error(transactions):\n    lm = LabelMaker(\n        \"customer_id\",\n        labeling_function=len,\n        time_index=\"time\",\n        window_size=\"1h\",\n    )\n    data = [\"2019-01-01 09:00:00\", \"2019-01-01 12:00:00\"]\n    minimum_data = pd.Series(data=data, index=[1, 1])\n    match = \"more than one cutoff time exists for a target group\"\n\n    with pytest.raises(ValueError, match=match):\n        lm.search(transactions, 1, minimum_data=minimum_data)\n\n\ndef test_label_maker_categorical_target_with_missing_data(transactions, total_spent_fn):\n    transactions = transactions.copy()\n    transactions[\"customer_id\"] = transactions[\"customer_id\"].astype(\"category\")\n    lm = LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        window_size=3,\n        labeling_function=total_spent_fn,\n    )\n    # use on only the first 8 rows so the df will not contain data for customer 3\n    lm.search(transactions.head(8), -1)\n"
  },
  {
    "path": "composeml/tests/test_label_plots.py",
    "content": "from pytest import raises\n\n\ndef test_count_by_time_categorical(total_spent):\n    total_spent = total_spent.bin(2, labels=range(2))\n    title = total_spent.plot.count_by_time().get_title()\n    assert title == \"Label Count vs. Cutoff Times\"\n\n\ndef test_count_by_time_continuous(total_spent):\n    title = total_spent.plot.count_by_time().get_title()\n    assert title == \"Label vs. Cutoff Times\"\n\n\ndef test_distribution_categorical(total_spent):\n    ax = total_spent.bin(2, labels=range(2))\n    title = ax.plot.dist().get_title()\n    assert title == \"Label Distribution\"\n\n\ndef test_distribution_continuous(total_spent):\n    title = total_spent.plot.dist().get_title()\n    assert title == \"Label Distribution\"\n\n\ndef test_single_target(total_spent):\n    lt = total_spent.copy()\n    lt.target_columns.append(\"target_2\")\n    match = \"must first select an individual target\"\n\n    with raises(AssertionError, match=match):\n        lt.plot.dist()\n\n    with raises(AssertionError, match=match):\n        lt.plot.count_by_time()\n"
  },
  {
    "path": "composeml/tests/test_label_serialization.py",
    "content": "import os\nimport shutil\n\nimport pandas as pd\nimport pytest\n\nimport composeml as cp\n\n\n@pytest.fixture\ndef path():\n    pwd = os.path.dirname(__file__)\n    path = os.path.join(pwd, \".cache\")\n    yield path\n    shutil.rmtree(path)\n\n\n@pytest.fixture\ndef total_spent(transactions, total_spent_fn):\n    lm = cp.LabelMaker(\n        target_dataframe_index=\"customer_id\",\n        time_index=\"time\",\n        labeling_function=total_spent_fn,\n    )\n    lt = lm.search(transactions, num_examples_per_instance=1, verbose=False)\n    return lt\n\n\ndef test_csv(path, total_spent):\n    total_spent.to_csv(path)\n    total_spent_copy = cp.read_label_times(path)\n    pd.testing.assert_frame_equal(total_spent, total_spent_copy)\n    assert total_spent.equals(total_spent_copy)\n\n\ndef test_parquet(path, total_spent):\n    total_spent.to_parquet(path)\n    total_spent_copy = cp.read_label_times(path)\n    pd.testing.assert_frame_equal(total_spent, total_spent_copy)\n    assert total_spent.equals(total_spent_copy)\n\n\ndef test_pickle(path, total_spent):\n    total_spent.to_pickle(path)\n    total_spent_copy = cp.read_label_times(path)\n    pd.testing.assert_frame_equal(total_spent, total_spent_copy)\n    assert total_spent.equals(total_spent_copy)\n"
  },
  {
    "path": "composeml/tests/test_label_times.py",
    "content": "from pytest import raises\n\nfrom composeml.label_times import LabelTimes\nfrom composeml.tests.utils import to_csv\n\n\ndef test_count_by_time_categorical(total_spent):\n    given_answer = total_spent.bin(2, labels=range(2))\n    given_answer = to_csv(given_answer.count_by_time)\n\n    answer = [\n        \"time,0,1\",\n        \"2019-01-01 08:00:00,0,1\",\n        \"2019-01-01 08:30:00,0,2\",\n        \"2019-01-01 09:00:00,0,3\",\n        \"2019-01-01 09:30:00,0,4\",\n        \"2019-01-01 10:00:00,0,5\",\n        \"2019-01-01 10:30:00,1,5\",\n        \"2019-01-01 11:00:00,2,5\",\n        \"2019-01-01 11:30:00,3,5\",\n        \"2019-01-01 12:00:00,4,5\",\n        \"2019-01-01 12:30:00,5,5\",\n    ]\n\n    assert given_answer == answer\n\n\ndef test_count_by_time_continuous(total_spent):\n    given_answer = total_spent.count_by_time\n    given_answer = to_csv(given_answer, header=True, index=True)\n\n    answer = [\n        \"time,total_spent\",\n        \"2019-01-01 08:00:00,1\",\n        \"2019-01-01 08:30:00,2\",\n        \"2019-01-01 09:00:00,3\",\n        \"2019-01-01 09:30:00,4\",\n        \"2019-01-01 10:00:00,5\",\n        \"2019-01-01 10:30:00,6\",\n        \"2019-01-01 11:00:00,7\",\n        \"2019-01-01 11:30:00,8\",\n        \"2019-01-01 12:00:00,9\",\n        \"2019-01-01 12:30:00,10\",\n    ]\n\n    assert given_answer == answer\n\n\ndef test_sorted_distribution(capsys, total_spent):\n    bins = [0, 5, 10, 20]\n    total_spent.bin(bins).describe()\n    captured = capsys.readouterr()\n\n    out = \"\\n\".join(\n        [\n            \"Label Distribution\",\n            \"------------------\",\n            \"total_spent\",\n            \"(0, 5]      5\",\n            \"(5, 10]     4\",\n            \"(10, 20]    0\",\n            \"Total:      9\",\n            \"\",\n            \"\",\n            \"Settings\",\n            \"--------\",\n            \"num_examples_per_instance             -1\",\n            \"target_column                total_spent\",\n            \"target_dataframe_index       customer_id\",\n            \"target_type                     discrete\",\n            \"\",\n            \"\",\n            \"Transforms\",\n            \"----------\",\n            \"1. bin\",\n            \"  - bins:         [0, 5, 10, 20]\",\n            \"  - labels:                 None\",\n            \"  - precision:                 3\",\n            \"  - quantiles:             False\",\n            \"  - right:                  True\",\n            \"\",\n            \"\",\n        ],\n    )\n    assert captured.out == out\n\n\ndef test_describe_no_transforms(capsys):\n    data = {\"target\": range(3)}\n    LabelTimes(data).describe()\n    captured = capsys.readouterr()\n    out = \"\\n\".join(\n        [\n            \"Label Distribution\",\n            \"------------------\",\n            \"count    3.0\",\n            \"mean     1.0\",\n            \"std      1.0\",\n            \"min      0.0\",\n            \"25%      0.5\",\n            \"50%      1.0\",\n            \"75%      1.5\",\n            \"max      2.0\",\n            \"\",\n            \"\",\n            \"Settings\",\n            \"--------\",\n            \"target_column                 target\",\n            \"target_dataframe_index          None\",\n            \"target_type               continuous\",\n            \"\",\n            \"\",\n            \"Transforms\",\n            \"----------\",\n            \"No transforms applied\",\n            \"\",\n            \"\",\n        ],\n    )\n\n    assert captured.out == out\n\n\ndef test_distribution_categorical(total_spent):\n    labels = range(2)\n    given_answer = total_spent.bin(2, labels=labels).distribution\n    given_answer = to_csv(given_answer)\n\n    answer = [\n        \"total_spent,count\",\n        \"0,5\",\n        \"1,5\",\n    ]\n\n    assert given_answer == answer\n\n\ndef test_distribution_continous(total_spent):\n    distribution = total_spent.distribution\n    actual = to_csv(distribution.round(4))\n\n    expected = [\n        \",total_spent\",\n        \"count,10.0\",\n        \"mean,4.5\",\n        \"std,3.0277\",\n        \"min,0.0\",\n        \"25%,2.25\",\n        \"50%,4.5\",\n        \"75%,6.75\",\n        \"max,9.0\",\n    ]\n\n    assert actual == expected\n\n\ndef test_target_type(total_spent):\n    types = total_spent.target_types\n    assert types[\"total_spent\"] == \"continuous\"\n    total_spent = total_spent.threshold(5)\n    types = total_spent.target_types\n    assert types[\"total_spent\"] == \"discrete\"\n\n\ndef test_count(total_spent):\n    given_answer = total_spent.count\n    given_answer = to_csv(given_answer, index=True)\n\n    answer = [\n        \"customer_id,count\",\n        \"0,2\",\n        \"1,3\",\n        \"2,4\",\n        \"3,1\",\n    ]\n\n    assert given_answer == answer\n\n\ndef test_label_select_errors(total_spent):\n    match = \"only one target exists\"\n    with raises(AssertionError, match=match):\n        total_spent.select(\"a\")\n\n    lt = total_spent.copy()\n    lt.target_columns.append(\"b\")\n\n    match = \"target name must be string\"\n    with raises(TypeError, match=match):\n        total_spent.select(123)\n\n    match = 'target \"a\" not found'\n    with raises(AssertionError, match=match):\n        lt.select(\"a\")\n"
  },
  {
    "path": "composeml/tests/test_label_transforms/__init__.py",
    "content": ""
  },
  {
    "path": "composeml/tests/test_label_transforms/test_bin.py",
    "content": "import pandas as pd\nfrom pytest import raises\n\n\ndef test_bins(labels):\n    given_labels = labels.bin(2)\n    transform = given_labels.transforms[0]\n\n    assert transform[\"transform\"] == \"bin\"\n    assert transform[\"bins\"] == 2\n    assert transform[\"quantiles\"] is False\n    assert transform[\"labels\"] is None\n    assert transform[\"right\"] is True\n\n    answer = [\n        pd.Interval(157.5, 283.46, closed=\"right\"),\n        pd.Interval(31.288, 157.5, closed=\"right\"),\n        pd.Interval(157.5, 283.46, closed=\"right\"),\n        pd.Interval(31.288, 157.5, closed=\"right\"),\n    ]\n\n    answer = pd.Categorical(answer, ordered=True)\n    labels = labels.assign(my_labeling_function=answer)\n    pd.testing.assert_frame_equal(given_labels, labels)\n\n\ndef test_quantile_bins(labels):\n    given_labels = labels.bin(2, quantiles=True)\n    transform = given_labels.transforms[0]\n\n    assert transform[\"transform\"] == \"bin\"\n    assert transform[\"bins\"] == 2\n    assert transform[\"quantiles\"] is True\n    assert transform[\"labels\"] is None\n    assert transform[\"right\"] is True\n\n    answer = [\n        pd.Interval(137.44, 283.46, closed=\"right\"),\n        pd.Interval(31.538999999999998, 137.44, closed=\"right\"),\n        pd.Interval(137.44, 283.46, closed=\"right\"),\n        pd.Interval(31.538999999999998, 137.44, closed=\"right\"),\n    ]\n\n    answer = pd.Categorical(answer, ordered=True)\n    labels = labels.assign(my_labeling_function=answer)\n    pd.testing.assert_frame_equal(given_labels, labels)\n\n\ndef test_single_target(total_spent):\n    lt = total_spent.copy()\n    lt.target_columns.append(\"target_2\")\n    match = \"must first select an individual target\"\n    with raises(AssertionError, match=match):\n        lt.bin(2)\n"
  },
  {
    "path": "composeml/tests/test_label_transforms/test_lead.py",
    "content": "import pandas as pd\n\n\ndef test_lead(labels):\n    labels = labels.apply_lead(\"10min\")\n    transform = labels.transforms[0]\n\n    assert transform[\"transform\"] == \"apply_lead\"\n    assert transform[\"value\"] == \"10min\"\n\n    answer = [\n        \"2014-01-01 00:35:00\",\n        \"2014-01-01 00:38:00\",\n        \"2013-12-31 23:51:00\",\n        \"2013-12-31 23:54:00\",\n    ]\n\n    time = pd.Series(answer, name=\"time\", dtype=\"datetime64[ns]\")\n    time = time.rename_axis(\"label_id\")\n\n    pd.testing.assert_series_equal(labels[\"time\"], time)\n"
  },
  {
    "path": "composeml/tests/test_label_transforms/test_sample.py",
    "content": "import pytest\n\nfrom composeml import LabelTimes\nfrom composeml.tests.utils import read_csv, to_csv\n\n\n@pytest.fixture\ndef labels(labels):\n    return labels.threshold(100)\n\n\ndef test_sample_n_int(labels):\n    given_answer = labels.sample(n=2, random_state=0)\n    given_answer = given_answer.sort_index()\n    given_answer = to_csv(given_answer, index=True)\n\n    answer = [\n        \"label_id,customer_id,time,my_labeling_function\",\n        \"2,2,2014-01-01 00:01:00,True\",\n        \"3,2,2014-01-01 00:04:00,False\",\n    ]\n\n    assert given_answer == answer\n\n\ndef test_sample_n_per_label(labels):\n    n = {True: 1, False: 2}\n    given_answer = labels.sample(n=n, random_state=0)\n    given_answer = given_answer.sort_index()\n    given_answer = to_csv(given_answer, index=True)\n\n    answer = [\n        \"label_id,customer_id,time,my_labeling_function\",\n        \"1,1,2014-01-01 00:48:00,False\",\n        \"2,2,2014-01-01 00:01:00,True\",\n        \"3,2,2014-01-01 00:04:00,False\",\n    ]\n\n    assert given_answer == answer\n\n\ndef test_sample_frac_int(labels):\n    given_answer = labels.sample(frac=0.25, random_state=0)\n    given_answer = given_answer.sort_index()\n    given_answer = to_csv(given_answer, index=True)\n\n    answer = [\n        \"label_id,customer_id,time,my_labeling_function\",\n        \"2,2,2014-01-01 00:01:00,True\",\n    ]\n\n    assert given_answer == answer\n\n\ndef test_sample_frac_per_label(labels):\n    frac = {True: 1.0, False: 0.5}\n    given_answer = labels.sample(frac=frac, random_state=0)\n    given_answer = given_answer.sort_index()\n    given_answer = to_csv(given_answer, index=True)\n\n    answer = [\n        \"label_id,customer_id,time,my_labeling_function\",\n        \"0,1,2014-01-01 00:45:00,True\",\n        \"2,2,2014-01-01 00:01:00,True\",\n        \"3,2,2014-01-01 00:04:00,False\",\n    ]\n\n    assert given_answer == answer\n\n\ndef test_sample_in_transforms(labels):\n    n = {True: 2, False: 2}\n\n    transform = {\n        \"transform\": \"sample\",\n        \"n\": n,\n        \"frac\": None,\n        \"random_state\": None,\n        \"replace\": False,\n        \"per_instance\": False,\n    }\n\n    sample = labels.sample(n=n)\n    assert transform != labels.transforms[-1]\n    assert transform == sample.transforms[-1]\n\n\ndef test_sample_with_replacement(labels):\n    assert labels.shape[0] < 20\n    n = {True: 10, False: 10}\n    sample = labels.sample(n=n, replace=True)\n    assert sample.shape[0] == 20\n\n\ndef test_single_target(total_spent):\n    lt = total_spent.copy()\n    lt.target_columns.append(\"target_2\")\n    match = \"must first select an individual target\"\n    with pytest.raises(AssertionError, match=match):\n        lt.sample(2)\n\n\ndef test_sample_n_per_instance():\n    data = read_csv(\n        [\n            \"target_dataframe_index,labels\",\n            \"0,a\",\n            \"0,b\",\n            \"1,a\",\n            \"1,b\",\n        ],\n    )\n\n    lt = LabelTimes(data=data, target_dataframe_index=\"target_dataframe_index\")\n    sample = lt.sample(n={\"a\": 1}, per_instance=True, random_state=0)\n    actual = to_csv(sample, index=False)\n\n    expected = [\n        \"target_dataframe_index,labels\",\n        \"0,a\",\n        \"1,a\",\n    ]\n\n    assert expected == actual\n\n\ndef test_sample_frac_per_instance():\n    data = read_csv(\n        [\n            \"target_dataframe_index,labels\",\n            \"0,a\",\n            \"0,a\",\n            \"0,a\",\n            \"0,a\",\n            \"1,a\",\n            \"1,a\",\n        ],\n    )\n\n    lt = LabelTimes(data=data, target_dataframe_index=\"target_dataframe_index\")\n    sample = lt.sample(frac={\"a\": 0.5}, per_instance=True, random_state=0)\n    actual = to_csv(sample, index=False)\n\n    expected = [\n        \"target_dataframe_index,labels\",\n        \"0,a\",\n        \"0,a\",\n        \"1,a\",\n    ]\n\n    assert expected == actual\n"
  },
  {
    "path": "composeml/tests/test_label_transforms/test_threshold.py",
    "content": "from pytest import raises\n\n\ndef test_threshold(labels):\n    labels = labels.threshold(200)\n    transform = labels.transforms[0]\n\n    assert transform[\"transform\"] == \"threshold\"\n    assert transform[\"value\"] == 200\n\n    answer = [True, False, True, False]\n    target_column = labels.target_columns[0]\n    given_answer = labels[target_column].values.tolist()\n    assert given_answer == answer\n\n\ndef test_single_target(total_spent):\n    lt = total_spent.copy()\n    lt.target_columns.append(\"target_2\")\n    match = \"must first select an individual target\"\n    with raises(AssertionError, match=match):\n        lt.threshold(200)\n"
  },
  {
    "path": "composeml/tests/test_version.py",
    "content": "from composeml import __version__\n\n\ndef test_version():\n    assert __version__ == \"0.10.1\"\n"
  },
  {
    "path": "composeml/tests/utils.py",
    "content": "from io import StringIO\n\nimport pandas as pd\n\n\ndef read_csv(data, **kwargs):\n    \"\"\"Helper function for creating a dataframe from in-memory CSV string (or list of strings).\n\n    Args:\n        data (str or list) : CSV string(s)\n\n    Returns:\n        DataFrame : Instance of a dataframe.\n    \"\"\"\n    if isinstance(data, list):\n        data = \"\\n\".join(data)\n\n    # This creates a file-like object for reading in CSV string.\n    with StringIO(data) as data:\n        df = pd.read_csv(data, **kwargs)\n\n    return df\n\n\ndef to_csv(label_times, **kwargs):\n    df = pd.DataFrame(label_times)\n    csv = df.to_csv(**kwargs)\n    return csv.splitlines()\n"
  },
  {
    "path": "composeml/update_checker.py",
    "content": "from pkg_resources import iter_entry_points\n\nfor entry_point in iter_entry_points(\"alteryx_open_src_initialize\"):\n    try:\n        method = entry_point.load()\n        if callable(method):\n            method(\"composeml\")\n    except Exception:\n        pass\n"
  },
  {
    "path": "composeml/version.py",
    "content": "__version__ = \"0.10.1\"\n"
  },
  {
    "path": "contributing.md",
    "content": "# Contributing to Compose\n\n:+1::tada: First off, thank you for taking the time to contribute! :tada::+1:\n\nWhether you are a novice or experienced software developer, all contributions and suggestions are welcome!\n\nThere are many ways to contribute to Compose, with the most common ones being contribution of code or documentation to the project.\n\n**To contribute, you can:**\n1. Help users on our [Slack channel](https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA). Answer questions under the compose tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/composeml)\n\n2. Submit a pull request for one of [Good First Issues](https://github.com/alteryx/compose/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+First+Issue%22)\n\n3. Make changes to the codebase, see [Contributing to the codebase](#Contributing-to-the-Codebase).\n\n4. Improve our documentation, which can be found under the [docs](docs/) directory or at https://compose.alteryx.com/en/stable/\n\n5. [Report issues](#Report-issues) you're facing, and give a \"thumbs up\" on issues that others reported and that are relevant to you. Issues should be used for bugs, and feature requests only.\n\n6. Spread the word: reference Compose from your blog and articles, link to it from your website, or simply star it in [Compose GitHub page](https://github.com/alteryx/compose) to say \"I use it\".\n\n## Contributing to the Codebase\n\nBefore starting major work, you should touch base with the maintainers of Compose by filing an issue on GitHub or posting a message in the [#development channel on Slack](https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA). This will increase the likelihood your pull request will eventually get merged in.\n\n#### 1. Fork and clone repo\n* The code is hosted on GitHub, so you will need to use Git to fork the project and make changes to the codebase. To start, go to the [Compose GitHub page](https://github.com/alteryx/compose) and click the `Fork` button.\n* After you have created the fork, you will want to clone the fork to your machine and connect your version of the project to the upstream Compose repo.\n  ```bash\n  git clone https://github.com/your-user-name/compose.git\n  cd compose\n  git remote add upstream https://github.com/alteryx/compose\n  ```\n* Once you have obtained a copy of the code, you should create a development environment that is separate from your existing Python environment so that you can make and test changes without compromising your own work environment. You can run the following steps to create a separate virtual environment, and install Compose in editable mode. \n  ```bash\n  python -m venv venv\n  source venv/bin/activate\n  make installdeps\n  git checkout -b issue####-branch_name\n  ```\n\n#### 2. Implement your Pull Request\n\n* Implement your pull request. If needed, add new tests or update the documentation.\n* Before submitting to GitHub, verify the tests run and the code lints properly\n  ```bash\n  # runs linting\n  make lint\n\n  # will fix some common linting issues automatically\n  make lint-fix\n\n  # runs test\n  make test\n  ```\n* If you made changes to the documentation, build the documentation locally.\n  ```bash\n  # go to docs and build\n  cd docs\n  make html\n\n  # view docs locally\n  open build/html/index.html\n  ```\n\n#### 3. Submit your Pull Request\n\n* Once your changes are ready to be submitted, make sure to push your changes to GitHub before creating a pull request.\n* If you need to update your code with the latest changes from the main Compose repo, you can do that by running the commands below, which will merge the latest changes from the Compose `main` branch into your current local branch. You may need to resolve merge conflicts if there are conflicts between your changes and the upstream changes. After the merge, you will need to push the updates to your forked repo after running these commands.\n  ```bash\n  git fetch upstream\n  git merge upstream/main\n  ```\n* Create a pull request to merge the changes from your forked repo branch into the Compose `main` branch. Creating the pull request will automatically run our continuous integration.\n* If this is your first contribution, you will need to sign the Contributor License Agreement as directed.\n* Update the \"Future Release\" section of the release notes (`docs/source/release_notes.rst`) to include your pull request and add your github username to the list of contributors.  Add a description of your PR to the subsection that most closely matches your contribution:\n    * Enhancements: new features or additions to Compose.\n    * Fixes: things like bugfixes or adding more descriptive error messages.\n    * Changes: modifications to an existing part of Compose.\n    * Documentation Changes\n    * Testing Changes\n\n   Documentation or testing changes rarely warrant an individual release notes entry; the PR number can be added to their respective \"Miscellaneous changes\" entries.\n* We will review your changes, and you will most likely be asked to make additional changes before it is finally ready to merge. However, once it's reviewed by a maintainer of Compose, passes continuous integration, we will merge it, and you will have successfully contributed to Compose!\n\n## Report issues\nWhen reporting issues please include as much detail as possible about your operating system, Compose version and python version. Whenever possible, please also include a brief, self-contained code example that demonstrates the problem.\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nSOURCEDIR     = source\nBUILDDIR      = build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\n\npushd %~dp0\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset SOURCEDIR=source\nset BUILDDIR=build\n\nif \"%1\" == \"\" goto help\n\n%SPHINXBUILD% >NUL 2>NUL\nif errorlevel 9009 (\n\techo.\n\techo.The 'sphinx-build' command was not found. Make sure you have Sphinx\n\techo.installed, then set the SPHINXBUILD environment variable to point\n\techo.to the full path of the 'sphinx-build' executable. Alternatively you\n\techo.may add the Sphinx directory to PATH.\n\techo.\n\techo.If you don't have Sphinx installed, grab it from\n\techo.http://sphinx-doc.org/\n\texit /b 1\n)\n\n%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%\ngoto end\n\n:help\n%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%\n\n:end\npopd\n"
  },
  {
    "path": "docs/source/_static/style.css",
    "content": ".footer {\n    background-color: #0D2345;\n    padding-bottom: 40px;\n    padding-top: 40px;\n    width: 100%;\n}\n\n.footer-cell-1 {\n    grid-row: 1;\n    grid-column: 1 / 3;\n}\n\n.footer-cell-2 {\n    grid-row: 1;\n    grid-column: 4;\n    margin-bottom: 15px;\n    text-align: right;\n}\n\n.footer-cell-3 {\n    grid-row: 2;\n    grid-column: 1 / 5;\n}\n\n.footer-cell-4 {\n    grid-row: 3;\n    grid-column: 1 / 3;\n}\n\n.footer-container {\n    display: grid;\n    margin-left: 10%;\n    margin-right: 10%;\n}\n\n.footer-image-alteryx {\n    padding-top: 22px;\n    width: 270px;\n}\n\n.footer-image-copyright {\n    width: 180px;\n}\n\n.footer-image-github {\n    width: 50px;\n}\n\n.footer-image-twitter {\n    width: 60px;\n}\n\n.footer-line {\n    border-top: 2px solid white;\n    margin-left: 7px;\n    margin-right: 15px;\n}\n"
  },
  {
    "path": "docs/source/_templates/class.rst",
    "content": "{{ fullname | escape | underline}}\n\n.. currentmodule:: {{ module }}\n\n.. autoclass:: {{ objname }}\n\n   {% block methods %}\n   {% if methods %}\n   .. rubric:: Methods\n\n   .. autosummary::\n      :nosignatures:\n      :toctree: methods\n\n   {% for item in methods %}\n   {%- if item not in inherited_members %}\n      ~{{ name }}.{{ item }}\n   {%- endif %}\n   {%- endfor %}\n   {% endif %}\n   {% endblock %}\n"
  },
  {
    "path": "docs/source/_templates/layout.html",
    "content": "{% extends \"!layout.html\" %}\n\n{%- block extrahead %}\n\n<script>\n  !function () {\n    var analytics = window.analytics = window.analytics || []; if (!analytics.initialize) if (analytics.invoked) window.console && console.error && console.error(\"Segment snippet included twice.\"); else {\n      analytics.invoked = !0; analytics.methods = [\"trackSubmit\", \"trackClick\", \"trackLink\", \"trackForm\", \"pageview\", \"identify\", \"reset\", \"group\", \"track\", \"ready\", \"alias\", \"debug\", \"page\", \"once\", \"off\", \"on\"]; analytics.factory = function (t) { return function () { var e = Array.prototype.slice.call(arguments); e.unshift(t); analytics.push(e); return analytics } }; for (var t = 0; t < analytics.methods.length; t++) { var e = analytics.methods[t]; analytics[e] = analytics.factory(e) } analytics.load = function (t, e) { var n = document.createElement(\"script\"); n.type = \"text/javascript\"; n.async = !0; n.src = \"https://cdn.segment.com/analytics.js/v1/\" + t + \"/analytics.min.js\"; var a = document.getElementsByTagName(\"script\")[0]; a.parentNode.insertBefore(n, a); analytics._loadOptions = e }; analytics.SNIPPET_VERSION = \"4.1.0\";\n      analytics.load(\"ze8imyBlahLiQl1WxZCnHzhNWgviYKOn\");\n      analytics.page();\n    }\n  }();\n</script>\n\n{% set image = 'https://alteryx-oss-web-images.s3.amazonaws.com/compose_open_graph.png' %}\n{% set description = 'A machine learning tool for automated prediction engineering' %}\n{% if meta is defined %}\n    {% if meta.description is defined %}\n        {% set description = meta.description %}\n    {% endif %}\n{% endif %}\n\n<meta property=\"og:title\" content=\"{{ title|striptags|e }}{{ titlesuffix }}\">\n<meta content=\"{{description}}\" />\n<meta property=\"og:description\" content=\"{{description}}\">\n<meta property=\"og:image\" content=\"{{image}}\">\n<meta property=\"twitter:image\" content=\"{{image}}\">\n<meta name=\"twitter:card\" content=\"summary_large_image\">\n\n{% endblock %}\n\n{%- block footer %}\n\n<footer class=\"footer\">\n  <div class=\"footer-container\">\n    <div class=\"footer-cell-1\">\n      <img class=\"footer-image-alteryx\" src=\"{{ pathto('_static/images/alteryx_open_source.svg', 1) }}\" alt=\"Alteryx Open Source\">\n    </div>\n    <div class=\"footer-cell-2\">\n      <a href=\"https://github.com/alteryx/compose\" target=\"_blank\">\n        <img class=\"footer-image-github\" src=\"{{ pathto('_static/images/github.svg', 1) }}\" alt=\"GitHub\">\n      </a>\n      <a href=\"https://twitter.com/AlteryxOSS\" target=\"_blank\">\n        <img class=\"footer-image-twitter\" src=\"{{ pathto('_static/images/twitter.svg', 1) }}\" alt=\"Twitter\">\n      </a>\n    </div>\n    <div class=\"footer-cell-3\">\n      <hr class=\"footer-line\">\n    </div>\n    <div class=\"footer-cell-4\">\n      <img class=\"footer-image-copyright\" src=\"{{ pathto('_static/images/copyright.svg', 1) }}\" alt=\"Copyright\">\n    </div>\n  </div>\n</footer>\n\n{% endblock %}\n"
  },
  {
    "path": "docs/source/api_reference.rst",
    "content": ".. currentmodule:: composeml\n\n=============\nAPI Reference\n=============\n\nLabel Maker\n===========\n\n.. autosummary::\n    :toctree: generated\n    :template: class.rst\n    :nosignatures:\n\n    LabelMaker\n\nLabel Times\n============\n\n.. autosummary::\n    :toctree: generated\n    :template: class.rst\n    :nosignatures:\n\n    LabelTimes\n\nTransform Methods\n-----------------\n\n.. autosummary::\n    :nosignatures:\n\n    LabelTimes.apply_lead\n    LabelTimes.bin\n    LabelTimes.sample\n    LabelTimes.threshold\n\n.. currentmodule:: composeml.label_times.plots\n\nLabel Plots\n===========\n\n.. autosummary::\n    :toctree: generated\n    :template: class.rst\n    :nosignatures:\n\n    LabelPlots\n\nPlotting Methods\n----------------\n\n.. autosummary::\n    :nosignatures:\n\n    LabelPlots.count_by_time\n    LabelPlots.distribution\n"
  },
  {
    "path": "docs/source/conf.py",
    "content": "# -*- coding: utf-8 -*-\n#\n# Configuration file for the Sphinx documentation builder.\n#\n# This file does only contain a selection of the most common options. For a\n# full list see the documentation:\n# http://www.sphinx-doc.org/en/master/config\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\n# import os\n# import sys\n# sys.path.insert(0, os.path.abspath('.'))\n\nfrom composeml import __version__ as version\n\n# -- Project information -----------------------------------------------------\n\nproject = \"Compose\"\ncopyright = \"2020, Alteryx, Inc.\"\nauthor = \"Alteryx, Inc.\"\n\n# The full version, including alpha/beta/rc tags\nrelease = version\n\n\n# -- General configuration ---------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    \"nbsphinx\",\n    \"sphinx.ext.autodoc\",\n    \"sphinx.ext.autosummary\",\n    \"sphinx.ext.intersphinx\",\n    \"sphinx.ext.napoleon\",\n    \"sphinx.ext.viewcode\",\n    \"sphinx.ext.extlinks\",\n    \"sphinx_inline_tabs\",\n    \"sphinx_copybutton\",\n    \"myst_parser\",\n]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n#\n# source_suffix = ['.rst', '.md']\nsource_suffix = \".rst\"\n\n# The master toctree document.\nmaster_doc = \"index\"\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = None\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = [\"**.ipynb_checkpoints\"]\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = None\n\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\n\nhtml_theme = \"pydata_sphinx_theme\"\nhtml_logo = \"images/compose_nav2.png\"\nhtml_favicon = \"images/favicon.ico\"\nhtml_theme_options = {\n    \"icon_links\": [\n        {\n            \"name\": \"GitHub\",\n            \"url\": \"https://github.com/alteryx/compose\",\n            \"icon\": \"fab fa-github-square\",\n            \"type\": \"fontawesome\",\n        },\n        {\n            \"name\": \"Twitter\",\n            \"url\": \"https://twitter.com/AlteryxOSS\",\n            \"icon\": \"fab fa-twitter-square\",\n            \"type\": \"fontawesome\",\n        },\n        {\n            \"name\": \"Slack\",\n            \"url\": \"https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA\",\n            \"icon\": \"fab fa-slack\",\n            \"type\": \"fontawesome\",\n        },\n    ],\n    \"collapse_navigation\": False,\n    \"navigation_depth\": 2,\n}\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = [\"_static\"]\n\n# Custom sidebar templates, must be a dictionary that maps document names\n# to template names.\n#\n# The default sidebars (for documents that don't match any pattern) are\n# defined by theme itself.  Builtin themes are using these templates by\n# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',\n# 'searchbox.html']``.\n#\n# html_sidebars = {}\n\n\n# -- Options for HTMLHelp output ---------------------------------------------\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = \"Composedoc\"\n\n\n# -- Options for LaTeX output ------------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    #\n    # 'papersize': 'letterpaper',\n    # The font size ('10pt', '11pt' or '12pt').\n    #\n    # 'pointsize': '10pt',\n    # Additional stuff for the LaTeX preamble.\n    #\n    # 'preamble': '',\n    # Latex figure (float) alignment\n    #\n    # 'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (master_doc, \"Compose.tex\", \"Compose Documentation\", \"Alteryx, Inc.\", \"manual\"),\n]\n\n\n# -- Options for manual page output ------------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [(master_doc, \"composeml\", \"Compose Documentation\", [author], 1)]\n\n\n# -- Options for Texinfo output ----------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (\n        master_doc,\n        \"Compose\",\n        \"Compose Documentation\",\n        author,\n        \"Compose\",\n        \"One line description of project.\",\n        \"Miscellaneous\",\n    ),\n]\n\n\n# -- Options for Epub output -------------------------------------------------\n\n# Bibliographic Dublin Core info.\nepub_title = project\n\n# The unique identifier of the text. This can be a ISBN number\n# or the project homepage.\n#\n# epub_identifier = ''\n\n# A unique identification for the text.\n#\n# epub_uid = ''\n\n# A list of files that should not be packed into the epub file.\nepub_exclude_files = [\"search.html\"]\n\n# -- Options for Markdown files ----------------------------------------------\n\nmyst_admonition_enable = True\nmyst_deflist_enable = True\nmyst_heading_anchors = 3\n\n# -- Options for Sphinx Copy Button ------------------------------------------\n\ncopybutton_prompt_text = \"myinputprompt\"\ncopybutton_prompt_text = r\">>> |\\.\\.\\. |\\$ |In \\[\\d*\\]: | {2,5}\\.\\.\\.: | {5,8}: \"\ncopybutton_prompt_is_regexp = True\n\n\n# -- Extension configuration -------------------------------------------------\n\nextlinks = {\n    \"issue\": (\"https://github.com/alteryx/compose/issues/%s\", \"#\"),\n    \"pr\": (\"https://github.com/alteryx/compose/pull/%s\", \"#\"),\n    \"user\": (\"https://github.com/%s\", \"@\"),\n}\n\nautosummary_generate = [\"api_reference.rst\"]\ntemplates_path = [\"_templates\"]\n\n\ndef setup(app):\n    app.add_css_file(\"style.css\")\n\n\nhtml_show_sphinx = False\n"
  },
  {
    "path": "docs/source/examples/demo/__init__.py",
    "content": "import os\nimport warnings\n\nwarnings.filterwarnings(\"ignore\")\nPWD = os.path.dirname(__file__)\n"
  },
  {
    "path": "docs/source/examples/demo/chicago_bike/__init__.py",
    "content": "from demo import PWD\nfrom pandas import read_csv\nfrom os.path import join\n\nPWD = join(PWD, \"chicago_bike\")\n\n\ndef _read(file):\n    return read_csv(\n        join(PWD, file),\n        parse_dates=[\"starttime\", \"stoptime\"],\n        index_col=\"trip_id\",\n    )\n\n\ndef load_sample():\n    return _read(\"sample.csv\")\n"
  },
  {
    "path": "docs/source/examples/demo/chicago_bike/sample.csv",
    "content": "trip_id,gender,starttime,stoptime,tripduration,temperature,events,from_station_id,dpcapacity_start,to_station_id,dpcapacity_end\n2331610,Female,2014-06-29 13:35:00,2014-06-29 13:56:00,20.75,82.9,cloudy,178,15.0,76,39.0\n2347603,Female,2014-06-30 12:07:00,2014-06-30 12:37:00,30.15,82.0,cloudy,211,19.0,177,15.0\n2345120,Male,2014-06-30 08:36:00,2014-06-30 08:43:00,6.516666666666668,75.0,cloudy,340,15.0,67,15.0\n2347527,Male,2014-06-30 12:00:00,2014-06-30 12:08:00,7.25,82.0,cloudy,56,19.0,56,19.0\n2344421,Male,2014-06-30 08:04:00,2014-06-30 08:11:00,7.316666666666666,75.0,cloudy,77,23.0,37,19.0\n2336431,Male,2014-06-29 16:31:00,2014-06-29 16:53:00,21.816666666666666,84.9,cloudy,349,15.0,13,19.0\n2351574,Male,2014-06-30 16:55:00,2014-06-30 17:07:00,11.783333333333333,84.0,cloudy,190,15.0,93,15.0\n2351672,Male,2014-06-30 16:58:00,2014-06-30 17:13:00,15.533333333333333,84.0,cloudy,37,19.0,289,19.0\n2351751,Male,2014-06-30 17:00:00,2014-06-30 17:07:00,7.566666666666666,84.0,cloudy,169,15.0,134,19.0\n2331505,Female,2014-06-29 13:29:00,2014-06-29 13:36:00,7.716666666666668,82.9,cloudy,181,31.0,106,27.0\n2336748,Male,2014-06-29 16:44:00,2014-06-29 17:05:00,21.08333333333333,84.9,cloudy,268,15.0,232,23.0\n2350914,Male,2014-06-30 16:27:00,2014-06-30 16:36:00,8.3,84.0,cloudy,49,27.0,191,23.0\n2341339,Female,2014-06-29 20:48:00,2014-06-29 21:15:00,26.88333333333333,81.0,cloudy,99,19.0,62,27.0\n2352857,Female,2014-06-30 17:36:00,2014-06-30 17:40:00,4.4,84.0,cloudy,304,15.0,303,15.0\n2340830,Female,2014-06-29 20:11:00,2014-06-29 20:19:00,7.5166666666666675,81.0,cloudy,123,15.0,116,15.0\n2343445,Male,2014-06-30 07:00:00,2014-06-30 07:03:00,3.083333333333333,73.0,cloudy,74,23.0,48,27.0\n2338352,Male,2014-06-29 17:59:00,2014-06-29 18:11:00,11.7,84.9,cloudy,84,19.0,134,19.0\n2338548,Male,2014-06-29 18:07:00,2014-06-29 18:41:00,33.9,84.2,cloudy,349,15.0,73,19.0\n2338565,Male,2014-06-29 18:08:00,2014-06-29 18:25:00,17.183333333333334,84.2,cloudy,176,19.0,152,15.0\n2340701,Male,2014-06-29 19:58:00,2014-06-29 20:28:00,30.36666666666667,82.0,cloudy,234,19.0,293,19.0\n2338809,Male,2014-06-29 18:22:00,2014-06-29 18:43:00,21.233333333333334,84.2,cloudy,254,15.0,249,15.0\n2349824,Male,2014-06-30 15:15:00,2014-06-30 15:29:00,13.45,84.9,cloudy,283,23.0,186,15.0\n2352795,Male,2014-06-30 17:34:00,2014-06-30 17:51:00,17.233333333333334,84.0,cloudy,168,19.0,168,19.0\n2350998,Male,2014-06-30 16:26:00,2014-06-30 16:35:00,9.2,84.0,cloudy,52,31.0,91,31.0\n2349370,Male,2014-06-30 14:37:00,2014-06-30 14:48:00,11.433333333333335,87.1,cloudy,290,15.0,213,15.0\n2354718,Male,2014-06-30 19:49:00,2014-06-30 20:07:00,18.733333333333334,73.0,tstorms,55,15.0,55,15.0\n2351674,Male,2014-06-30 16:58:00,2014-06-30 17:06:00,8.1,84.0,cloudy,264,19.0,66,19.0\n2338317,Male,2014-06-29 17:57:00,2014-06-29 18:34:00,37.3,84.9,cloudy,263,11.0,75,23.0\n2342680,Male,2014-06-29 23:22:00,2014-06-29 23:28:00,5.416666666666668,78.1,cloudy,350,15.0,214,15.0\n2341145,Male,2014-06-29 20:33:00,2014-06-29 21:02:00,28.766666666666666,81.0,cloudy,341,19.0,150,11.0\n2352020,Male,2014-06-30 17:06:00,2014-06-30 17:15:00,9.116666666666667,84.0,cloudy,264,19.0,212,31.0\n2334784,Male,2014-06-29 15:27:00,2014-06-29 15:54:00,26.91666666666667,82.9,cloudy,324,15.0,295,15.0\n2344311,Male,2014-06-30 07:57:00,2014-06-30 08:11:00,14.133333333333333,73.0,cloudy,75,23.0,35,39.0\n2343074,Male,2014-06-30 05:35:00,2014-06-30 05:41:00,5.9833333333333325,73.0,cloudy,332,15.0,327,19.0\n2341720,Female,2014-06-29 21:15:00,2014-06-29 21:19:00,3.5166666666666666,79.0,cloudy,248,15.0,322,15.0\n2353889,Male,2014-06-30 18:18:00,2014-06-30 18:21:00,2.9166666666666665,82.0,tstorms,309,11.0,158,15.0\n2342764,Male,2014-06-29 23:50:00,2014-06-30 00:13:00,23.48333333333333,78.1,cloudy,244,19.0,303,15.0\n2352400,Female,2014-06-30 17:20:00,2014-06-30 17:42:00,21.95,84.0,cloudy,81,39.0,340,15.0\n2331873,Male,2014-06-29 13:46:00,2014-06-29 14:10:00,24.91666666666667,82.9,cloudy,156,15.0,94,19.0\n2351727,Male,2014-06-30 16:59:00,2014-06-30 17:16:00,16.633333333333333,84.0,cloudy,134,19.0,69,19.0\n2345935,Male,2014-06-30 09:22:00,2014-06-30 09:30:00,7.6,78.1,cloudy,255,31.0,90,35.0\n2353412,Male,2014-06-30 17:56:00,2014-06-30 18:23:00,26.88333333333333,84.0,cloudy,51,31.0,223,15.0\n2349890,Male,2014-06-30 15:22:00,2014-06-30 15:30:00,8.0,84.9,cloudy,181,31.0,106,27.0\n2336202,Male,2014-06-29 16:22:00,2014-06-29 16:29:00,6.833333333333332,84.9,cloudy,268,15.0,143,15.0\n2332401,Male,2014-06-29 14:04:00,2014-06-29 14:32:00,28.3,84.0,cloudy,312,15.0,94,19.0\n2348888,Male,2014-06-30 13:56:00,2014-06-30 13:59:00,3.15,84.9,cloudy,60,19.0,93,15.0\n2347827,Male,2014-06-30 12:20:00,2014-06-30 12:31:00,11.85,82.0,cloudy,287,27.0,291,19.0\n2335752,Male,2014-06-29 16:05:00,2014-06-29 16:12:00,7.05,84.9,cloudy,144,15.0,87,19.0\n2346051,Male,2014-06-30 09:33:00,2014-06-30 09:49:00,16.85,78.1,cloudy,120,15.0,51,31.0\n2348804,Male,2014-06-30 13:49:00,2014-06-30 13:57:00,8.366666666666667,84.9,cloudy,51,31.0,26,31.0\n2337626,Male,2014-06-29 17:22:00,2014-06-29 17:30:00,8.1,84.9,cloudy,16,11.0,309,11.0\n2336628,Male,2014-06-29 16:39:00,2014-06-29 16:55:00,16.25,84.9,cloudy,154,15.0,69,19.0\n2349449,Male,2014-06-30 14:44:00,2014-06-30 14:49:00,5.466666666666668,87.1,cloudy,185,11.0,290,15.0\n2352026,Male,2014-06-30 17:08:00,2014-06-30 17:18:00,9.366666666666667,84.0,cloudy,195,31.0,91,31.0\n2339115,Male,2014-06-29 18:36:00,2014-06-29 18:41:00,4.35,84.2,cloudy,114,27.0,232,23.0\n2345532,Male,2014-06-30 08:56:00,2014-06-30 09:00:00,3.9166666666666665,75.0,cloudy,174,23.0,98,15.0\n2332243,Male,2014-06-29 13:58:00,2014-06-29 14:24:00,26.33333333333333,82.9,cloudy,333,15.0,93,15.0\n2346818,Male,2014-06-30 10:52:00,2014-06-30 10:59:00,6.833333333333332,78.1,cloudy,48,27.0,291,19.0\n2353493,Male,2014-06-30 17:59:00,2014-06-30 18:17:00,17.933333333333334,84.0,cloudy,66,19.0,69,19.0\n2337808,Female,2014-06-29 17:31:00,2014-06-29 17:47:00,16.416666666666668,84.9,cloudy,35,39.0,255,31.0\n2354440,Male,2014-06-30 18:52:00,2014-06-30 18:56:00,4.166666666666667,82.0,tstorms,75,23.0,198,19.0\n2344857,Male,2014-06-30 08:25:00,2014-06-30 08:35:00,10.116666666666667,75.0,cloudy,77,23.0,37,19.0\n2338197,Male,2014-06-29 17:51:00,2014-06-29 18:09:00,18.766666666666666,84.9,cloudy,177,15.0,99,19.0\n2349939,Male,2014-06-30 15:24:00,2014-06-30 15:30:00,5.4,84.9,cloudy,72,15.0,338,15.0\n2347092,Male,2014-06-30 11:22:00,2014-06-30 11:32:00,9.733333333333333,79.0,cloudy,110,23.0,194,11.0\n2347136,Female,2014-06-30 11:26:00,2014-06-30 11:31:00,4.966666666666667,79.0,cloudy,74,23.0,181,31.0\n2342887,Male,2014-06-30 00:38:00,2014-06-30 00:43:00,5.616666666666666,78.1,cloudy,226,15.0,300,15.0\n2344767,Female,2014-06-30 08:20:00,2014-06-30 08:41:00,21.116666666666667,75.0,cloudy,220,19.0,173,15.0\n2351335,Male,2014-06-30 16:47:00,2014-06-30 16:53:00,6.1,84.0,cloudy,51,31.0,192,39.0\n2348169,Male,2014-06-30 12:54:00,2014-06-30 13:02:00,8.4,82.0,cloudy,66,19.0,110,23.0\n2354487,Male,2014-06-30 18:56:00,2014-06-30 19:05:00,8.833333333333334,82.0,tstorms,118,19.0,34,15.0\n2345814,Male,2014-06-30 09:13:00,2014-06-30 09:30:00,16.916666666666668,78.1,cloudy,24,15.0,90,35.0\n2344619,Male,2014-06-30 08:14:00,2014-06-30 08:38:00,23.66666666666667,75.0,cloudy,131,15.0,110,23.0\n2336070,Female,2014-06-29 16:16:00,2014-06-29 16:36:00,19.983333333333334,84.9,cloudy,97,35.0,137,15.0\n2353002,Male,2014-06-30 17:40:00,2014-06-30 17:46:00,5.133333333333334,84.0,cloudy,210,19.0,183,15.0\n2334944,Male,2014-06-29 15:33:00,2014-06-29 16:09:00,35.65,82.9,cloudy,249,15.0,234,19.0\n2352711,Male,2014-06-30 17:31:00,2014-06-30 17:41:00,9.916666666666666,84.0,cloudy,212,31.0,192,39.0\n2346848,Male,2014-06-30 10:55:00,2014-06-30 11:02:00,7.116666666666666,78.1,cloudy,240,23.0,117,23.0\n2334688,Male,2014-06-29 15:23:00,2014-06-29 15:46:00,23.466666666666665,82.9,cloudy,324,15.0,85,23.0\n2346252,Female,2014-06-30 09:50:00,2014-06-30 09:58:00,8.016666666666667,78.1,cloudy,144,15.0,60,19.0\n2343617,Male,2014-06-30 07:16:00,2014-06-30 07:22:00,5.85,73.0,cloudy,292,11.0,229,19.0\n2344957,Male,2014-06-30 08:29:00,2014-06-30 08:40:00,11.433333333333335,75.0,cloudy,232,23.0,251,15.0\n2339764,Male,2014-06-29 19:12:00,2014-06-29 19:28:00,16.116666666666667,82.0,cloudy,164,23.0,30,15.0\n2339479,Female,2014-06-29 18:54:00,2014-06-29 19:13:00,18.666666666666668,84.2,cloudy,225,15.0,157,15.0\n2344240,Female,2014-06-30 07:52:00,2014-06-30 08:01:00,9.35,73.0,cloudy,310,11.0,87,19.0\n2351425,Female,2014-06-30 16:50:00,2014-06-30 16:52:00,2.083333333333333,84.0,cloudy,314,15.0,244,19.0\n2351605,Male,2014-06-30 16:53:00,2014-06-30 17:05:00,11.95,84.0,cloudy,120,15.0,279,15.0\n2334617,Male,2014-06-29 15:21:00,2014-06-29 15:59:00,38.05,82.9,cloudy,346,15.0,215,15.0\n2338547,Male,2014-06-29 18:07:00,2014-06-29 18:21:00,14.466666666666667,84.2,cloudy,176,19.0,71,15.0\n2340148,Male,2014-06-29 19:33:00,2014-06-29 19:41:00,7.466666666666668,82.0,cloudy,94,19.0,127,15.0\n2354544,Male,2014-06-30 19:02:00,2014-06-30 19:09:00,6.716666666666668,73.0,tstorms,344,15.0,234,19.0\n2354549,Male,2014-06-30 19:03:00,2014-06-30 19:09:00,6.65,73.0,tstorms,114,27.0,347,15.0\n2343237,Male,2014-06-30 06:35:00,2014-06-30 06:52:00,17.6,73.0,cloudy,168,19.0,76,39.0\n2353805,Male,2014-06-30 18:14:00,2014-06-30 18:19:00,5.633333333333334,82.0,tstorms,91,31.0,80,19.0\n2345494,Female,2014-06-30 08:55:00,2014-06-30 09:05:00,9.933333333333334,75.0,cloudy,192,39.0,43,43.0\n2345516,Male,2014-06-30 08:55:00,2014-06-30 09:00:00,5.166666666666667,75.0,cloudy,77,23.0,80,19.0\n2349455,Female,2014-06-30 14:44:00,2014-06-30 15:04:00,19.85,87.1,cloudy,71,15.0,291,19.0\n2352905,Male,2014-06-30 17:38:00,2014-06-30 18:01:00,23.4,84.0,cloudy,90,35.0,274,15.0\n2349049,Male,2014-06-30 14:10:00,2014-06-30 14:24:00,13.366666666666667,87.1,cloudy,44,27.0,198,19.0\n2333292,Male,2014-06-29 14:34:00,2014-06-29 14:49:00,15.1,84.0,cloudy,115,23.0,165,19.0\n2342336,Male,2014-06-29 22:28:00,2014-06-29 22:38:00,9.45,78.1,cloudy,154,15.0,246,11.0\n2345149,Male,2014-06-30 08:38:00,2014-06-30 08:47:00,9.3,75.0,cloudy,59,19.0,170,15.0\n2338660,Female,2014-06-29 18:12:00,2014-06-29 18:43:00,31.0,84.2,cloudy,177,15.0,332,15.0\n2341225,Male,2014-06-29 20:39:00,2014-06-29 21:14:00,35.016666666666666,81.0,cloudy,85,23.0,14,15.0\n2343302,Female,2014-06-30 06:41:00,2014-06-30 06:48:00,6.8,73.0,cloudy,276,11.0,69,19.0\n2344562,Male,2014-06-30 08:12:00,2014-06-30 08:18:00,6.65,75.0,cloudy,43,43.0,174,23.0\n2343592,Female,2014-06-30 07:09:00,2014-06-30 07:36:00,26.65,73.0,cloudy,297,15.0,93,15.0\n2344473,Male,2014-06-30 08:06:00,2014-06-30 08:13:00,6.45,75.0,cloudy,287,27.0,91,31.0\n2350673,Male,2014-06-30 16:12:00,2014-06-30 16:25:00,12.133333333333333,84.0,cloudy,51,31.0,301,19.0\n2353814,Male,2014-06-30 18:14:00,2014-06-30 18:29:00,15.216666666666667,82.0,tstorms,168,19.0,43,43.0\n2332398,Female,2014-06-29 14:04:00,2014-06-29 14:10:00,5.766666666666668,84.0,cloudy,209,11.0,120,15.0\n2334744,Male,2014-06-29 15:26:00,2014-06-29 15:34:00,8.25,82.9,cloudy,198,19.0,66,19.0\n2348254,Male,2014-06-30 13:03:00,2014-06-30 13:14:00,11.716666666666667,84.9,cloudy,318,15.0,311,15.0\n2343661,Male,2014-06-30 07:20:00,2014-06-30 07:30:00,10.516666666666667,73.0,cloudy,15,15.0,280,11.0\n2353389,Male,2014-06-30 17:55:00,2014-06-30 18:02:00,6.8,84.0,cloudy,210,19.0,305,15.0\n2348103,Female,2014-06-30 12:50:00,2014-06-30 12:56:00,5.9,82.0,cloudy,113,15.0,331,19.0\n2353703,Male,2014-06-30 18:09:00,2014-06-30 18:32:00,23.48333333333333,82.0,tstorms,52,31.0,16,11.0\n2343517,Male,2014-06-30 07:08:00,2014-06-30 07:18:00,10.016666666666667,73.0,cloudy,50,27.0,195,31.0\n2351496,Female,2014-06-30 16:52:00,2014-06-30 16:59:00,6.55,84.0,cloudy,244,19.0,308,11.0\n2332643,Female,2014-06-29 14:11:00,2014-06-29 14:20:00,9.166666666666666,84.0,cloudy,291,19.0,212,31.0\n2352918,Female,2014-06-30 17:38:00,2014-06-30 17:49:00,11.366666666666667,84.0,cloudy,174,23.0,90,35.0\n2345454,Male,2014-06-30 08:52:00,2014-06-30 08:58:00,6.0,75.0,cloudy,36,31.0,100,23.0\n2352036,Female,2014-06-30 17:08:00,2014-06-30 17:13:00,4.733333333333333,84.0,cloudy,130,15.0,16,11.0\n2340128,Male,2014-06-29 19:32:00,2014-06-29 19:49:00,17.583333333333332,82.0,cloudy,76,39.0,341,19.0\n2352250,Male,2014-06-30 17:15:00,2014-06-30 17:20:00,5.15,84.0,cloudy,118,19.0,288,11.0\n2344345,Male,2014-06-30 08:00:00,2014-06-30 08:07:00,7.216666666666668,75.0,cloudy,37,19.0,194,11.0\n2338757,Male,2014-06-29 18:18:00,2014-06-29 18:34:00,15.5,84.2,cloudy,174,23.0,22,15.0\n2343113,Male,2014-06-30 06:02:00,2014-06-30 06:06:00,4.033333333333333,73.0,cloudy,153,19.0,115,23.0\n2337013,Female,2014-06-29 16:54:00,2014-06-29 17:20:00,25.7,84.9,cloudy,118,19.0,326,11.0\n2339012,Female,2014-06-29 18:31:00,2014-06-29 19:10:00,38.38333333333333,84.2,cloudy,34,15.0,114,27.0\n2343454,Male,2014-06-30 07:02:00,2014-06-30 07:06:00,4.633333333333334,73.0,cloudy,69,19.0,160,15.0\n2332706,Female,2014-06-29 14:14:00,2014-06-29 14:17:00,3.4166666666666665,84.0,cloudy,302,19.0,152,15.0\n2353305,Male,2014-06-30 17:51:00,2014-06-30 17:56:00,5.0,84.0,cloudy,195,31.0,81,39.0\n2344660,Male,2014-06-30 08:16:00,2014-06-30 08:24:00,8.55,75.0,cloudy,191,23.0,181,31.0\n2352761,Male,2014-06-30 17:33:00,2014-06-30 17:40:00,7.2,84.0,cloudy,71,15.0,75,23.0\n2353277,Male,2014-06-30 17:50:00,2014-06-30 18:08:00,17.616666666666667,84.0,cloudy,198,19.0,183,15.0\n2340101,Male,2014-06-29 19:30:00,2014-06-29 19:48:00,18.366666666666667,82.0,cloudy,286,23.0,130,15.0\n2351677,Female,2014-06-30 16:57:00,2014-06-30 17:07:00,9.466666666666667,84.0,cloudy,261,15.0,21,15.0\n2346809,Male,2014-06-30 10:52:00,2014-06-30 11:08:00,16.4,78.1,cloudy,303,15.0,238,15.0\n2351366,Male,2014-06-30 16:48:00,2014-06-30 17:12:00,23.83333333333333,84.0,cloudy,126,15.0,158,15.0\n2337456,Female,2014-06-29 17:14:00,2014-06-29 17:17:00,3.2666666666666666,84.9,cloudy,219,11.0,310,11.0\n2345074,Male,2014-06-30 08:34:00,2014-06-30 08:38:00,3.966666666666667,75.0,cloudy,272,11.0,147,15.0\n2347405,Male,2014-06-30 11:47:00,2014-06-30 11:54:00,6.4,79.0,cloudy,19,15.0,342,15.0\n2339183,Male,2014-06-29 18:41:00,2014-06-29 19:00:00,19.233333333333334,84.2,cloudy,177,15.0,26,31.0\n2352683,Female,2014-06-30 17:28:00,2014-06-30 17:47:00,19.683333333333334,84.0,cloudy,91,31.0,255,31.0\n2347624,Male,2014-06-30 12:09:00,2014-06-30 12:20:00,11.8,82.0,cloudy,112,15.0,53,19.0\n2338311,Female,2014-06-29 17:57:00,2014-06-29 18:11:00,14.2,84.9,cloudy,56,19.0,57,15.0\n2351400,Male,2014-06-30 16:50:00,2014-06-30 17:04:00,14.583333333333336,84.0,cloudy,106,27.0,91,31.0\n2351143,Male,2014-06-30 16:38:00,2014-06-30 16:45:00,7.216666666666668,84.0,cloudy,264,19.0,164,23.0\n2339778,Female,2014-06-29 19:13:00,2014-06-29 19:21:00,8.016666666666667,82.0,cloudy,344,15.0,297,15.0\n2334632,Male,2014-06-29 15:22:00,2014-06-29 15:37:00,15.033333333333333,82.9,cloudy,334,19.0,289,19.0\n2350917,Male,2014-06-30 16:27:00,2014-06-30 16:29:00,2.066666666666667,84.0,cloudy,152,15.0,302,19.0\n2341760,Female,2014-06-29 21:20:00,2014-06-29 21:26:00,6.216666666666668,79.0,cloudy,300,15.0,329,15.0\n2332198,Male,2014-06-29 13:56:00,2014-06-29 14:12:00,15.716666666666667,82.9,cloudy,315,11.0,290,15.0\n2344977,Male,2014-06-30 08:30:00,2014-06-30 08:34:00,3.95,75.0,cloudy,28,15.0,118,19.0\n2352320,Female,2014-06-30 17:17:00,2014-06-30 17:45:00,27.73333333333333,84.0,cloudy,249,15.0,324,15.0\n2338104,Male,2014-06-29 17:44:00,2014-06-29 18:04:00,19.9,84.9,cloudy,165,19.0,141,23.0\n2341930,Female,2014-06-29 21:36:00,2014-06-29 21:47:00,11.2,79.0,cloudy,268,15.0,113,15.0\n2348512,Female,2014-06-30 13:25:00,2014-06-30 13:36:00,10.166666666666666,84.9,cloudy,20,15.0,92,19.0\n2352406,Male,2014-06-30 17:20:00,2014-06-30 17:25:00,4.733333333333333,84.0,cloudy,284,23.0,321,19.0\n2338071,Male,2014-06-29 17:43:00,2014-06-29 18:08:00,25.08333333333333,84.9,cloudy,16,11.0,340,15.0\n2352448,Male,2014-06-30 17:21:00,2014-06-30 17:48:00,27.0,84.0,cloudy,164,23.0,15,15.0\n2343943,Male,2014-06-30 07:39:00,2014-06-30 07:50:00,11.316666666666665,73.0,cloudy,301,19.0,49,27.0\n2352087,Male,2014-06-30 17:07:00,2014-06-30 17:23:00,16.05,84.0,cloudy,91,31.0,138,15.0\n2339857,Male,2014-06-29 19:17:00,2014-06-29 19:36:00,19.533333333333328,82.0,cloudy,117,23.0,324,15.0\n2332104,Female,2014-06-29 13:54:00,2014-06-29 14:17:00,23.5,82.9,cloudy,277,15.0,199,15.0\n2350106,Male,2014-06-30 15:35:00,2014-06-30 15:51:00,16.366666666666667,84.9,cloudy,33,27.0,84,19.0\n2344762,Male,2014-06-30 08:20:00,2014-06-30 08:29:00,8.566666666666666,75.0,cloudy,43,43.0,174,23.0\n2351014,Female,2014-06-30 16:31:00,2014-06-30 16:43:00,12.25,84.0,cloudy,110,23.0,192,39.0\n2338425,Female,2014-06-29 18:02:00,2014-06-29 18:14:00,11.483333333333333,84.2,cloudy,255,31.0,90,35.0\n2343236,Female,2014-06-30 06:35:00,2014-06-30 06:40:00,5.016666666666667,73.0,cloudy,190,15.0,67,15.0\n2339713,Female,2014-06-29 19:09:00,2014-06-29 19:21:00,11.316666666666665,82.0,cloudy,302,19.0,230,19.0\n2331669,Female,2014-06-29 13:38:00,2014-06-29 13:52:00,13.916666666666664,82.9,cloudy,13,19.0,20,15.0\n2353506,Male,2014-06-30 18:00:00,2014-06-30 18:09:00,9.416666666666666,82.0,tstorms,177,15.0,156,15.0\n2352319,Female,2014-06-30 17:17:00,2014-06-30 17:26:00,9.35,84.0,cloudy,43,43.0,5,19.0\n2352719,Male,2014-06-30 17:31:00,2014-06-30 17:37:00,5.866666666666666,84.0,cloudy,138,15.0,289,19.0\n2336553,Female,2014-06-29 16:36:00,2014-06-29 16:48:00,12.416666666666664,84.9,cloudy,332,15.0,250,19.0\n2353056,Female,2014-06-30 17:42:00,2014-06-30 17:51:00,8.766666666666667,84.0,cloudy,176,19.0,94,19.0\n2335260,Male,2014-06-29 15:47:00,2014-06-29 16:13:00,26.1,82.9,cloudy,264,19.0,268,15.0\n2351678,Female,2014-06-30 16:58:00,2014-06-30 17:01:00,3.333333333333333,84.0,cloudy,213,15.0,159,9.0\n2340477,Male,2014-06-29 19:51:00,2014-06-29 20:05:00,13.916666666666664,82.0,cloudy,327,19.0,299,15.0\n2341171,Male,2014-06-29 20:35:00,2014-06-29 20:46:00,10.983333333333333,81.0,cloudy,93,15.0,153,19.0\n2350877,Female,2014-06-30 16:25:00,2014-06-30 16:40:00,14.716666666666667,84.0,cloudy,137,15.0,280,11.0\n2351710,Male,2014-06-30 16:59:00,2014-06-30 17:03:00,4.633333333333334,84.0,cloudy,37,19.0,192,39.0\n2334946,Male,2014-06-29 15:33:00,2014-06-29 15:47:00,13.3,82.9,cloudy,343,15.0,177,15.0\n2346480,Male,2014-06-30 10:17:00,2014-06-30 10:42:00,24.88333333333333,78.1,cloudy,272,11.0,284,23.0\n2335266,Female,2014-06-29 15:47:00,2014-06-29 15:57:00,9.633333333333333,82.9,cloudy,343,15.0,93,15.0\n2351856,Male,2014-06-30 17:04:00,2014-06-30 17:13:00,9.333333333333334,84.0,cloudy,195,31.0,91,31.0\n2339206,Female,2014-06-29 18:42:00,2014-06-29 19:05:00,23.65,84.2,cloudy,176,19.0,329,15.0\n2343736,Male,2014-06-30 07:25:00,2014-06-30 07:37:00,11.983333333333333,73.0,cloudy,291,19.0,52,31.0\n2342166,Female,2014-06-29 22:03:00,2014-06-29 22:10:00,6.6,78.1,cloudy,326,11.0,242,15.0\n2347637,Male,2014-06-30 12:09:00,2014-06-30 12:22:00,12.55,82.0,cloudy,24,15.0,91,31.0\n2351226,Male,2014-06-30 16:42:00,2014-06-30 17:00:00,17.266666666666666,84.0,cloudy,51,31.0,61,15.0\n2346964,Male,2014-06-30 11:09:00,2014-06-30 11:13:00,4.066666666666666,79.0,cloudy,196,19.0,47,19.0\n2346583,Male,2014-06-30 10:31:00,2014-06-30 10:46:00,14.5,78.1,cloudy,207,15.0,108,19.0\n2346569,Male,2014-06-30 10:30:00,2014-06-30 10:56:00,25.73333333333333,78.1,cloudy,313,19.0,313,19.0\n2340978,Male,2014-06-29 20:22:00,2014-06-29 20:41:00,19.016666666666666,81.0,cloudy,268,15.0,268,15.0\n2336751,Male,2014-06-29 16:44:00,2014-06-29 16:53:00,8.683333333333334,84.9,cloudy,301,19.0,94,19.0\n2338598,Male,2014-06-29 18:08:00,2014-06-29 18:17:00,8.316666666666666,84.2,cloudy,330,19.0,114,27.0\n2333013,Male,2014-06-29 14:24:00,2014-06-29 14:33:00,8.733333333333333,84.0,cloudy,250,19.0,156,15.0\n2345612,Male,2014-06-30 08:59:00,2014-06-30 09:28:00,29.11666666666667,75.0,cloudy,119,19.0,20,15.0\n2341697,Female,2014-06-29 21:13:00,2014-06-29 21:23:00,10.133333333333333,79.0,cloudy,144,15.0,115,23.0\n2346246,Male,2014-06-30 09:50:00,2014-06-30 10:04:00,14.4,78.1,cloudy,168,19.0,287,27.0\n2352797,Male,2014-06-30 17:34:00,2014-06-30 17:43:00,8.516666666666667,84.0,cloudy,286,23.0,90,35.0\n2351388,Male,2014-06-30 16:49:00,2014-06-30 17:09:00,19.866666666666667,84.0,cloudy,66,19.0,273,15.0\n2342788,Male,2014-06-29 23:53:00,2014-06-30 00:06:00,12.8,78.1,cloudy,67,15.0,117,23.0\n2331967,Male,2014-06-29 13:49:00,2014-06-29 13:53:00,4.633333333333334,82.9,cloudy,195,31.0,51,31.0\n2343373,Male,2014-06-30 06:49:00,2014-06-30 07:00:00,10.533333333333333,73.0,cloudy,174,23.0,26,31.0\n2345782,Male,2014-06-30 09:11:00,2014-06-30 09:23:00,11.333333333333336,78.1,cloudy,199,15.0,283,23.0\n2351848,Male,2014-06-30 17:03:00,2014-06-30 17:26:00,23.266666666666666,84.0,cloudy,286,23.0,25,23.0\n2351827,Male,2014-06-30 17:03:00,2014-06-30 17:06:00,3.6666666666666665,84.0,cloudy,134,19.0,192,39.0\n2353711,Male,2014-06-30 18:09:00,2014-06-30 18:19:00,9.3,82.0,tstorms,69,19.0,123,15.0\n2351929,Male,2014-06-30 17:06:00,2014-06-30 17:12:00,5.783333333333332,84.0,cloudy,158,15.0,16,11.0\n2351752,Male,2014-06-30 16:57:00,2014-06-30 17:18:00,21.133333333333333,84.0,cloudy,75,23.0,305,15.0\n2343398,Male,2014-06-30 06:53:00,2014-06-30 06:57:00,3.566666666666667,73.0,cloudy,192,39.0,283,23.0\n2343962,Male,2014-06-30 07:38:00,2014-06-30 07:40:00,2.3,73.0,cloudy,93,15.0,60,19.0\n2344075,Male,2014-06-30 07:47:00,2014-06-30 07:54:00,6.85,73.0,cloudy,66,19.0,47,19.0\n2332299,Male,2014-06-29 14:00:00,2014-06-29 14:17:00,16.333333333333332,84.0,cloudy,177,15.0,249,15.0\n2343187,Male,2014-06-30 06:28:00,2014-06-30 06:38:00,10.033333333333333,73.0,cloudy,190,15.0,20,15.0\n2344731,Male,2014-06-30 08:20:00,2014-06-30 08:32:00,12.45,75.0,cloudy,75,23.0,51,31.0\n2350115,Male,2014-06-30 15:35:00,2014-06-30 15:56:00,21.48333333333333,84.9,cloudy,36,31.0,350,15.0\n2350788,Male,2014-06-30 16:20:00,2014-06-30 16:32:00,11.95,84.0,cloudy,149,11.0,149,11.0\n2344797,Male,2014-06-30 08:22:00,2014-06-30 08:25:00,3.3,75.0,cloudy,316,19.0,344,15.0\n2342324,Male,2014-06-29 22:26:00,2014-06-29 22:38:00,11.233333333333333,78.1,cloudy,120,15.0,280,11.0\n2333178,Female,2014-06-29 14:30:00,2014-06-29 14:53:00,23.08333333333333,84.0,cloudy,150,11.0,247,15.0\n2346655,Male,2014-06-30 10:37:00,2014-06-30 11:23:00,46.48333333333333,78.1,cloudy,157,15.0,164,23.0\n2343777,Male,2014-06-30 07:29:00,2014-06-30 07:45:00,15.7,73.0,cloudy,192,39.0,120,15.0\n2354481,Female,2014-06-30 18:55:00,2014-06-30 19:19:00,23.9,82.0,tstorms,232,23.0,156,15.0\n2351837,Male,2014-06-30 17:03:00,2014-06-30 17:19:00,15.733333333333333,84.0,cloudy,28,15.0,350,15.0\n2350694,Male,2014-06-30 16:14:00,2014-06-30 16:18:00,4.5,84.0,cloudy,181,31.0,111,19.0\n2333345,Male,2014-06-29 14:36:00,2014-06-29 14:57:00,20.933333333333334,84.0,cloudy,177,15.0,312,15.0\n2352571,Male,2014-06-30 17:26:00,2014-06-30 17:38:00,12.366666666666667,84.0,cloudy,93,15.0,258,19.0\n2351868,Male,2014-06-30 17:04:00,2014-06-30 17:08:00,4.116666666666666,84.0,cloudy,195,31.0,43,43.0\n2347621,Male,2014-06-30 12:09:00,2014-06-30 12:33:00,24.86666666666667,82.0,cloudy,77,23.0,301,19.0\n2353457,Male,2014-06-30 17:58:00,2014-06-30 18:08:00,9.9,84.0,cloudy,152,15.0,227,15.0\n2348064,Male,2014-06-30 12:47:00,2014-06-30 12:54:00,6.966666666666668,82.0,cloudy,198,19.0,84,19.0\n2350322,Female,2014-06-30 15:50:00,2014-06-30 16:03:00,12.55,84.9,cloudy,100,23.0,186,15.0\n2343897,Male,2014-06-30 07:37:00,2014-06-30 07:54:00,17.2,73.0,cloudy,220,19.0,53,19.0\n2339298,Male,2014-06-29 18:46:00,2014-06-29 19:01:00,14.45,84.2,cloudy,260,19.0,130,15.0\n2344057,Female,2014-06-30 07:46:00,2014-06-30 07:52:00,5.7,73.0,cloudy,239,15.0,344,15.0\n2344853,Male,2014-06-30 08:25:00,2014-06-30 08:39:00,14.433333333333335,75.0,cloudy,48,27.0,134,19.0\n2352075,Male,2014-06-30 17:10:00,2014-06-30 17:18:00,8.416666666666666,84.0,cloudy,43,43.0,174,23.0\n2350492,Male,2014-06-30 16:01:00,2014-06-30 16:27:00,26.45,84.0,cloudy,100,23.0,127,15.0\n2354454,Female,2014-06-30 18:53:00,2014-06-30 19:09:00,16.133333333333333,82.0,tstorms,17,15.0,305,15.0\n2337105,Male,2014-06-29 16:59:00,2014-06-29 17:23:00,24.216666666666665,84.9,cloudy,177,15.0,177,15.0\n2340733,Male,2014-06-29 20:04:00,2014-06-29 20:20:00,15.333333333333336,81.0,cloudy,35,39.0,45,15.0\n2334807,Male,2014-06-29 15:28:00,2014-06-29 15:36:00,7.65,82.9,cloudy,205,15.0,14,15.0\n2351822,Male,2014-06-30 17:03:00,2014-06-30 17:15:00,12.516666666666667,84.0,cloudy,261,15.0,77,23.0\n2343839,Male,2014-06-30 07:34:00,2014-06-30 07:40:00,5.916666666666668,73.0,cloudy,165,19.0,117,23.0\n2344144,Male,2014-06-30 07:50:00,2014-06-30 07:55:00,5.1,73.0,cloudy,130,15.0,213,15.0\n2340841,Male,2014-06-29 20:12:00,2014-06-29 20:21:00,9.45,81.0,cloudy,174,23.0,22,15.0\n2345813,Male,2014-06-30 09:13:00,2014-06-30 09:22:00,9.2,78.1,cloudy,66,19.0,48,27.0\n2340464,Male,2014-06-29 19:50:00,2014-06-29 19:59:00,8.116666666666667,82.0,cloudy,110,23.0,26,31.0\n2347532,Male,2014-06-30 12:01:00,2014-06-30 12:14:00,13.3,82.0,cloudy,51,31.0,255,31.0\n2345015,Male,2014-06-30 08:31:00,2014-06-30 08:58:00,26.66666666666667,75.0,cloudy,94,19.0,174,23.0\n2338571,Female,2014-06-29 18:08:00,2014-06-29 18:28:00,20.45,84.2,cloudy,258,19.0,289,19.0\n2352362,Male,2014-06-30 17:19:00,2014-06-30 17:30:00,11.433333333333335,84.0,cloudy,100,23.0,175,19.0\n2353464,Male,2014-06-30 17:58:00,2014-06-30 18:02:00,3.616666666666666,84.0,cloudy,69,19.0,315,11.0\n2353853,Female,2014-06-30 18:16:00,2014-06-30 18:23:00,6.666666666666668,82.0,tstorms,113,15.0,144,15.0\n2352361,Male,2014-06-30 17:18:00,2014-06-30 17:34:00,15.35,84.0,cloudy,287,27.0,28,15.0\n2337845,Female,2014-06-29 17:32:00,2014-06-29 17:37:00,4.65,84.9,cloudy,17,15.0,183,15.0\n2345287,Male,2014-06-30 08:43:00,2014-06-30 08:47:00,3.583333333333333,75.0,cloudy,343,15.0,67,15.0\n2346267,Male,2014-06-30 09:53:00,2014-06-30 10:13:00,20.33333333333333,78.1,cloudy,141,23.0,37,19.0\n2335819,Male,2014-06-29 16:08:00,2014-06-29 16:21:00,12.866666666666667,84.9,cloudy,289,19.0,152,15.0\n2354722,Male,2014-06-30 19:53:00,2014-06-30 20:04:00,11.2,73.0,tstorms,135,11.0,278,15.0\n2339292,Female,2014-06-29 18:46:00,2014-06-29 18:57:00,11.2,84.2,cloudy,274,15.0,57,15.0\n2346354,Male,2014-06-30 10:05:00,2014-06-30 10:15:00,10.15,78.1,cloudy,146,11.0,50,27.0\n2347951,Female,2014-06-30 12:37:00,2014-06-30 13:05:00,27.53333333333333,82.0,cloudy,196,19.0,349,15.0\n2339736,Male,2014-06-29 19:11:00,2014-06-29 19:24:00,13.733333333333333,82.0,cloudy,198,19.0,261,15.0\n2335941,Male,2014-06-29 16:12:00,2014-06-29 16:29:00,16.583333333333332,84.9,cloudy,97,35.0,35,39.0\n2349387,Female,2014-06-30 14:38:00,2014-06-30 14:52:00,13.566666666666665,87.1,cloudy,37,19.0,59,19.0\n2352072,Female,2014-06-30 17:10:00,2014-06-30 17:17:00,7.333333333333332,84.0,cloudy,98,15.0,321,19.0\n2353726,Female,2014-06-30 18:06:00,2014-06-30 18:13:00,7.25,82.0,tstorms,58,19.0,210,19.0\n2332642,Female,2014-06-29 14:11:00,2014-06-29 14:20:00,8.85,84.0,cloudy,315,11.0,128,15.0\n2354460,Male,2014-06-30 18:54:00,2014-06-30 18:59:00,5.416666666666668,82.0,tstorms,51,31.0,52,31.0\n2332204,Male,2014-06-29 13:57:00,2014-06-29 14:12:00,15.833333333333336,82.9,cloudy,291,19.0,13,19.0\n2340677,Female,2014-06-29 20:02:00,2014-06-29 20:06:00,4.466666666666667,81.0,cloudy,181,31.0,110,23.0\n2340045,Male,2014-06-29 19:27:00,2014-06-29 19:46:00,18.566666666666666,82.0,cloudy,233,15.0,61,15.0\n2336433,Female,2014-06-29 16:31:00,2014-06-29 16:40:00,9.416666666666666,84.9,cloudy,260,19.0,259,15.0\n2332489,Female,2014-06-29 14:07:00,2014-06-29 14:26:00,19.016666666666666,84.0,cloudy,76,39.0,273,15.0\n2351029,Male,2014-06-30 16:32:00,2014-06-30 16:42:00,10.15,84.0,cloudy,110,23.0,91,31.0\n2352926,Male,2014-06-30 17:38:00,2014-06-30 17:54:00,15.616666666666667,84.0,cloudy,199,15.0,60,19.0\n2351736,Female,2014-06-30 17:00:00,2014-06-30 17:19:00,19.2,84.0,cloudy,100,23.0,340,15.0\n2343715,Male,2014-06-30 07:24:00,2014-06-30 07:34:00,10.266666666666667,73.0,cloudy,91,31.0,195,31.0\n2352847,Male,2014-06-30 17:36:00,2014-06-30 17:45:00,9.033333333333333,84.0,cloudy,286,23.0,91,31.0\n2351793,Female,2014-06-30 17:01:00,2014-06-30 17:17:00,15.916666666666664,84.0,cloudy,69,19.0,228,11.0\n2347166,Male,2014-06-30 11:29:00,2014-06-30 11:36:00,7.3,79.0,cloudy,236,15.0,48,27.0\n2350257,Male,2014-06-30 15:46:00,2014-06-30 15:52:00,6.283333333333332,84.9,cloudy,250,19.0,115,23.0\n2351478,Male,2014-06-30 16:52:00,2014-06-30 17:04:00,11.55,84.0,cloudy,48,27.0,192,39.0\n2345866,Male,2014-06-30 09:16:00,2014-06-30 09:22:00,6.516666666666668,78.1,cloudy,77,23.0,37,19.0\n2335695,Male,2014-06-29 15:51:00,2014-06-29 16:03:00,11.95,82.9,cloudy,254,15.0,256,15.0\n2338304,Male,2014-06-29 17:56:00,2014-06-29 18:11:00,14.683333333333335,84.9,cloudy,51,31.0,268,15.0\n2346323,Female,2014-06-30 09:59:00,2014-06-30 10:52:00,52.51666666666666,78.1,cloudy,294,15.0,35,39.0\n2350321,Female,2014-06-30 15:50:00,2014-06-30 16:08:00,17.85,84.9,cloudy,173,15.0,91,31.0\n2354762,Male,2014-06-30 20:08:00,2014-06-30 20:28:00,20.316666666666666,70.0,rain or snow,148,11.0,171,11.0\n2342510,Male,2014-06-29 22:54:00,2014-06-29 23:07:00,12.75,78.1,cloudy,93,15.0,228,11.0\n2347885,Male,2014-06-30 12:32:00,2014-06-30 12:46:00,13.916666666666664,82.0,cloudy,100,23.0,35,39.0\n2337576,Male,2014-06-29 17:20:00,2014-06-29 17:46:00,26.18333333333333,84.9,cloudy,334,19.0,118,19.0\n2349426,Male,2014-06-30 14:42:00,2014-06-30 14:56:00,14.7,87.1,cloudy,176,19.0,127,15.0\n2353938,Male,2014-06-30 18:21:00,2014-06-30 18:33:00,11.95,82.0,tstorms,316,19.0,242,15.0\n2342152,Male,2014-06-29 22:02:00,2014-06-29 22:18:00,16.533333333333335,78.1,cloudy,59,19.0,15,15.0\n2344840,Male,2014-06-30 08:24:00,2014-06-30 08:32:00,8.516666666666667,75.0,cloudy,192,39.0,32,19.0\n2345628,Female,2014-06-30 09:02:00,2014-06-30 09:16:00,14.4,78.1,cloudy,329,15.0,301,19.0\n2351063,Female,2014-06-30 16:33:00,2014-06-30 16:43:00,10.05,84.0,cloudy,317,15.0,21,15.0\n2338694,Male,2014-06-29 18:14:00,2014-06-29 18:26:00,12.116666666666667,84.2,cloudy,46,19.0,286,23.0\n2354535,Male,2014-06-30 19:01:00,2014-06-30 19:08:00,6.2333333333333325,73.0,tstorms,81,39.0,181,31.0\n2345366,Female,2014-06-30 08:47:00,2014-06-30 09:15:00,27.63333333333333,75.0,cloudy,157,15.0,100,23.0\n2354086,Male,2014-06-30 18:30:00,2014-06-30 18:46:00,16.7,82.0,tstorms,177,15.0,251,15.0\n2349564,Female,2014-06-30 14:55:00,2014-06-30 15:02:00,7.566666666666666,87.1,cloudy,175,19.0,283,23.0\n2348380,Male,2014-06-30 13:13:00,2014-06-30 13:33:00,19.7,84.9,cloudy,160,15.0,160,15.0\n2345755,Male,2014-06-30 09:10:00,2014-06-30 09:13:00,2.8,78.1,cloudy,289,19.0,118,19.0\n2344779,Female,2014-06-30 08:21:00,2014-06-30 08:35:00,14.133333333333333,75.0,cloudy,46,19.0,37,19.0\n2333051,Female,2014-06-29 14:25:00,2014-06-29 14:40:00,14.883333333333333,84.0,cloudy,177,15.0,232,23.0\n2345070,Male,2014-06-30 08:33:00,2014-06-30 08:54:00,20.733333333333334,75.0,cloudy,334,19.0,106,27.0\n2349711,Female,2014-06-30 15:06:00,2014-06-30 15:09:00,2.533333333333333,84.9,cloudy,254,15.0,240,23.0\n2336947,Male,2014-06-29 16:52:00,2014-06-29 17:09:00,16.883333333333333,84.9,cloudy,303,15.0,332,15.0\n2351463,Male,2014-06-30 16:52:00,2014-06-30 17:02:00,9.783333333333333,84.0,cloudy,134,19.0,54,19.0\n2341668,Male,2014-06-29 21:11:00,2014-06-29 21:30:00,18.5,79.0,cloudy,260,19.0,123,15.0\n2354526,Male,2014-06-30 19:00:00,2014-06-30 19:12:00,11.683333333333335,73.0,tstorms,301,19.0,324,15.0\n2343491,Female,2014-06-30 07:04:00,2014-06-30 07:19:00,14.716666666666667,73.0,cloudy,236,15.0,98,15.0\n2353858,Male,2014-06-30 18:16:00,2014-06-30 18:30:00,13.883333333333333,82.0,tstorms,287,27.0,27,19.0\n2353221,Male,2014-06-30 17:48:00,2014-06-30 17:51:00,3.2666666666666666,84.0,cloudy,67,15.0,343,15.0\n2349165,Female,2014-06-30 14:19:00,2014-06-30 14:42:00,22.68333333333333,87.1,cloudy,311,15.0,13,19.0\n2347569,Male,2014-06-30 12:02:00,2014-06-30 12:06:00,3.683333333333333,82.0,cloudy,291,19.0,176,19.0\n2333650,Male,2014-06-29 14:46:00,2014-06-29 15:04:00,17.283333333333335,84.0,cloudy,141,23.0,153,19.0\n2333882,Male,2014-06-29 14:55:00,2014-06-29 15:18:00,23.11666666666667,84.0,cloudy,282,15.0,331,19.0\n2341182,Female,2014-06-29 20:35:00,2014-06-29 20:48:00,13.016666666666667,81.0,cloudy,334,19.0,141,23.0\n2353666,Male,2014-06-30 18:07:00,2014-06-30 18:14:00,6.55,82.0,tstorms,52,31.0,174,23.0\n2339126,Female,2014-06-29 18:37:00,2014-06-29 18:54:00,17.266666666666666,84.2,cloudy,48,27.0,156,15.0\n2349638,Male,2014-06-30 15:00:00,2014-06-30 15:15:00,14.516666666666667,84.9,cloudy,196,19.0,174,23.0\n2334781,Female,2014-06-29 15:27:00,2014-06-29 15:49:00,21.9,82.9,cloudy,219,11.0,342,15.0\n2336401,Female,2014-06-29 16:29:00,2014-06-29 16:46:00,16.283333333333335,84.9,cloudy,177,15.0,85,23.0\n2349074,Male,2014-06-30 14:12:00,2014-06-30 14:28:00,15.783333333333333,87.1,cloudy,299,15.0,114,27.0\n2337090,Male,2014-06-29 16:58:00,2014-06-29 17:04:00,5.9,84.9,cloudy,217,15.0,77,23.0\n2340769,Male,2014-06-29 20:04:00,2014-06-29 20:24:00,20.55,81.0,cloudy,35,39.0,337,19.0\n2343116,Female,2014-06-30 06:03:00,2014-06-30 06:06:00,3.216666666666667,73.0,cloudy,135,11.0,206,15.0\n2346424,Male,2014-06-30 10:12:00,2014-06-30 10:35:00,23.41666666666667,78.1,cloudy,214,15.0,36,31.0\n2353320,Male,2014-06-30 17:52:00,2014-06-30 18:00:00,7.983333333333332,84.0,cloudy,90,35.0,99,19.0\n2352468,Male,2014-06-30 17:22:00,2014-06-30 17:27:00,4.55,84.0,cloudy,93,15.0,58,19.0\n2332112,Female,2014-06-29 13:54:00,2014-06-29 14:07:00,13.333333333333336,82.9,cloudy,90,35.0,110,23.0\n2347875,Male,2014-06-30 12:32:00,2014-06-30 12:40:00,8.383333333333333,82.0,cloudy,197,19.0,26,31.0\n2351028,Male,2014-06-30 16:24:00,2014-06-30 16:36:00,12.316666666666665,84.0,cloudy,110,23.0,289,19.0\n2339279,Male,2014-06-29 18:45:00,2014-06-29 18:52:00,6.883333333333334,84.2,cloudy,220,19.0,117,23.0\n2336476,Female,2014-06-29 16:32:00,2014-06-29 16:50:00,17.1,84.9,cloudy,177,15.0,152,15.0\n2350756,Male,2014-06-30 16:17:00,2014-06-30 16:20:00,2.8,84.0,cloudy,24,15.0,199,15.0\n2337889,Male,2014-06-29 17:34:00,2014-06-29 17:42:00,7.333333333333332,84.9,cloudy,329,15.0,300,15.0\n2345638,Male,2014-06-30 09:02:00,2014-06-30 09:18:00,15.833333333333336,78.1,cloudy,192,39.0,98,15.0\n2353860,Male,2014-06-30 18:16:00,2014-06-30 18:38:00,21.08333333333333,82.0,tstorms,287,27.0,199,15.0\n2352133,Male,2014-06-30 17:12:00,2014-06-30 17:17:00,5.45,84.0,cloudy,195,31.0,51,31.0\n2353128,Male,2014-06-30 17:44:00,2014-06-30 18:07:00,22.91666666666667,84.0,cloudy,48,27.0,274,15.0\n2347685,Male,2014-06-30 12:13:00,2014-06-30 12:21:00,7.533333333333332,82.0,cloudy,46,19.0,47,19.0\n2341456,Male,2014-06-29 20:56:00,2014-06-29 21:15:00,18.2,81.0,cloudy,141,23.0,30,15.0\n2334006,Female,2014-06-29 14:59:00,2014-06-29 15:07:00,7.866666666666666,84.0,cloudy,177,15.0,334,19.0\n2349601,Male,2014-06-30 14:57:00,2014-06-30 15:11:00,14.016666666666667,87.1,cloudy,342,15.0,77,23.0\n2343298,Female,2014-06-30 06:41:00,2014-06-30 07:06:00,25.316666666666666,73.0,cloudy,72,15.0,110,23.0\n2352534,Female,2014-06-30 17:25:00,2014-06-30 17:36:00,11.666666666666664,84.0,cloudy,55,15.0,205,15.0\n2347822,Female,2014-06-30 12:26:00,2014-06-30 12:38:00,12.2,82.0,cloudy,191,23.0,26,31.0\n2343588,Male,2014-06-30 07:14:00,2014-06-30 07:24:00,10.333333333333334,73.0,cloudy,58,19.0,331,19.0\n2334433,Female,2014-06-29 15:14:00,2014-06-29 15:42:00,28.066666666666666,82.9,cloudy,106,27.0,128,15.0\n2339205,Male,2014-06-29 18:42:00,2014-06-29 18:50:00,7.783333333333332,84.2,cloudy,93,15.0,289,19.0\n2346063,Male,2014-06-30 09:33:00,2014-06-30 09:48:00,14.483333333333333,78.1,cloudy,150,11.0,341,19.0\n2334023,Male,2014-06-29 15:00:00,2014-06-29 15:18:00,18.183333333333334,82.9,cloudy,249,15.0,177,15.0\n2349292,Male,2014-06-30 14:30:00,2014-06-30 14:44:00,13.866666666666667,87.1,cloudy,93,15.0,85,23.0\n2341119,Male,2014-06-29 20:31:00,2014-06-29 20:39:00,8.366666666666667,81.0,cloudy,93,15.0,127,15.0\n2347413,Male,2014-06-30 11:48:00,2014-06-30 12:05:00,16.983333333333334,79.0,cloudy,37,19.0,211,19.0\n2353248,Male,2014-06-30 17:49:00,2014-06-30 17:56:00,7.083333333333332,84.0,cloudy,80,19.0,75,23.0\n2344173,Male,2014-06-30 07:51:00,2014-06-30 07:57:00,5.833333333333332,73.0,cloudy,143,15.0,118,19.0\n2352089,Male,2014-06-30 17:10:00,2014-06-30 17:14:00,3.3833333333333333,84.0,cloudy,198,19.0,91,31.0\n2350641,Female,2014-06-30 16:10:00,2014-06-30 16:23:00,12.9,84.0,cloudy,211,19.0,192,39.0\n2355038,Male,2014-06-30 21:22:00,2014-06-30 21:29:00,7.45,70.0,tstorms,100,23.0,26,31.0\n2338614,Male,2014-06-29 18:10:00,2014-06-29 18:18:00,7.616666666666666,84.2,cloudy,74,23.0,199,15.0\n2354266,Male,2014-06-30 18:40:00,2014-06-30 18:45:00,5.4833333333333325,82.0,tstorms,199,15.0,264,19.0\n2348317,Male,2014-06-30 13:07:00,2014-06-30 13:12:00,4.85,84.9,cloudy,56,19.0,164,23.0\n2332629,Male,2014-06-29 14:11:00,2014-06-29 14:20:00,9.216666666666667,84.0,cloudy,57,15.0,14,15.0\n2352933,Male,2014-06-30 17:39:00,2014-06-30 17:53:00,14.033333333333333,84.0,cloudy,16,11.0,268,15.0\n2354221,Male,2014-06-30 18:37:00,2014-06-30 18:49:00,11.883333333333333,82.0,tstorms,321,19.0,338,15.0\n2337933,Female,2014-06-29 17:36:00,2014-06-29 17:48:00,11.45,84.9,cloudy,94,19.0,13,19.0\n2341060,Female,2014-06-29 20:27:00,2014-06-29 20:40:00,12.766666666666667,81.0,cloudy,31,23.0,60,19.0\n2343582,Male,2014-06-30 07:13:00,2014-06-30 07:23:00,10.366666666666667,73.0,cloudy,289,19.0,110,23.0\n2352722,Female,2014-06-30 17:31:00,2014-06-30 17:53:00,21.95,84.0,cloudy,106,27.0,156,15.0\n2339405,Male,2014-06-29 18:51:00,2014-06-29 19:00:00,8.616666666666667,84.2,cloudy,177,15.0,157,15.0\n2337470,Female,2014-06-29 17:15:00,2014-06-29 17:32:00,17.366666666666667,84.9,cloudy,115,23.0,289,19.0\n2334390,Male,2014-06-29 15:13:00,2014-06-29 15:23:00,9.666666666666666,82.9,cloudy,321,19.0,120,15.0\n2348900,Female,2014-06-30 13:57:00,2014-06-30 14:02:00,4.55,84.9,cloudy,289,19.0,94,19.0\n2351440,Female,2014-06-30 16:48:00,2014-06-30 17:10:00,21.88333333333333,84.0,cloudy,99,19.0,255,31.0\n2347054,Female,2014-06-30 11:19:00,2014-06-30 11:33:00,14.783333333333333,79.0,cloudy,115,23.0,313,19.0\n2334795,Male,2014-06-29 15:28:00,2014-06-29 15:31:00,2.816666666666667,82.9,cloudy,289,19.0,291,19.0\n2341391,Male,2014-06-29 20:52:00,2014-06-29 21:01:00,9.583333333333334,81.0,cloudy,291,19.0,224,19.0\n2339673,Male,2014-06-29 19:06:00,2014-06-29 19:12:00,6.266666666666668,82.0,cloudy,69,19.0,276,11.0\n2345830,Female,2014-06-30 09:14:00,2014-06-30 09:25:00,10.933333333333335,78.1,cloudy,340,15.0,300,15.0\n2351542,Male,2014-06-30 16:54:00,2014-06-30 16:59:00,4.833333333333333,84.0,cloudy,174,23.0,37,19.0\n2334427,Male,2014-06-29 15:14:00,2014-06-29 16:03:00,48.93333333333333,82.9,cloudy,332,15.0,326,11.0\n2349672,Male,2014-06-30 15:04:00,2014-06-30 15:08:00,4.316666666666666,84.9,cloudy,74,23.0,110,23.0\n2351105,Female,2014-06-30 16:36:00,2014-06-30 16:48:00,12.15,84.0,cloudy,110,23.0,50,27.0\n2351575,Male,2014-06-30 16:55:00,2014-06-30 17:01:00,5.7,84.0,cloudy,49,27.0,174,23.0\n2343462,Male,2014-06-30 06:57:00,2014-06-30 07:21:00,23.68333333333333,73.0,cloudy,219,11.0,286,23.0\n2340353,Male,2014-06-29 19:44:00,2014-06-29 19:54:00,10.533333333333333,82.0,cloudy,13,19.0,165,19.0\n2331882,Male,2014-06-29 13:46:00,2014-06-29 13:52:00,5.783333333333332,82.9,cloudy,285,15.0,277,15.0\n2343406,Male,2014-06-30 06:54:00,2014-06-30 07:06:00,11.133333333333333,73.0,cloudy,15,15.0,73,19.0\n2335509,Male,2014-06-29 15:56:00,2014-06-29 16:14:00,18.666666666666668,82.9,cloudy,91,31.0,176,19.0\n2354778,Male,2014-06-30 20:18:00,2014-06-30 20:27:00,9.133333333333333,70.0,rain or snow,195,31.0,91,31.0\n2352931,Male,2014-06-30 17:37:00,2014-06-30 17:44:00,7.2666666666666675,84.0,cloudy,283,23.0,91,31.0\n2353847,Female,2014-06-30 18:16:00,2014-06-30 18:32:00,16.15,82.0,tstorms,35,39.0,177,15.0\n2348722,Male,2014-06-30 13:37:00,2014-06-30 13:43:00,6.066666666666666,84.9,cloudy,283,23.0,77,23.0\n2354393,Male,2014-06-30 18:49:00,2014-06-30 18:58:00,8.8,82.0,tstorms,49,27.0,5,19.0\n2332155,Male,2014-06-29 13:55:00,2014-06-29 14:00:00,4.966666666666667,82.9,cloudy,59,19.0,273,15.0\n2344370,Female,2014-06-30 08:01:00,2014-06-30 08:14:00,12.916666666666664,75.0,cloudy,66,19.0,199,15.0\n2335580,Female,2014-06-29 15:58:00,2014-06-29 16:04:00,6.266666666666668,82.9,cloudy,298,15.0,242,15.0\n2354106,Male,2014-06-30 18:30:00,2014-06-30 18:35:00,4.016666666666667,82.0,tstorms,109,19.0,22,15.0\n2344294,Female,2014-06-30 07:56:00,2014-06-30 08:11:00,15.633333333333333,73.0,cloudy,75,23.0,317,15.0\n2345623,Male,2014-06-30 09:02:00,2014-06-30 09:08:00,6.4833333333333325,78.1,cloudy,73,19.0,283,23.0\n2333230,Male,2014-06-29 14:31:00,2014-06-29 14:59:00,28.15,84.0,cloudy,85,23.0,213,15.0\n2346075,Female,2014-06-30 09:34:00,2014-06-30 09:59:00,24.816666666666666,78.1,cloudy,290,15.0,56,19.0\n2337128,Female,2014-06-29 16:59:00,2014-06-29 17:26:00,26.73333333333333,84.9,cloudy,177,15.0,268,15.0\n2337637,Female,2014-06-29 17:22:00,2014-06-29 17:38:00,15.3,84.9,cloudy,229,19.0,223,15.0\n2343221,Male,2014-06-30 06:33:00,2014-06-30 06:37:00,3.616666666666666,73.0,cloudy,134,19.0,75,23.0\n2348411,Male,2014-06-30 13:16:00,2014-06-30 13:22:00,5.233333333333333,84.9,cloudy,309,11.0,213,15.0\n2343277,Male,2014-06-30 06:38:00,2014-06-30 06:41:00,2.833333333333333,73.0,cloudy,31,23.0,337,19.0\n2335794,Male,2014-06-29 16:07:00,2014-06-29 16:18:00,11.1,84.9,cloudy,219,11.0,330,19.0\n2336145,Female,2014-06-29 16:19:00,2014-06-29 16:38:00,18.683333333333334,84.9,cloudy,340,15.0,20,15.0\n2333394,Male,2014-06-29 14:37:00,2014-06-29 15:04:00,26.78333333333333,84.0,cloudy,140,19.0,56,19.0\n2347022,Female,2014-06-30 11:15:00,2014-06-30 11:30:00,15.683333333333335,79.0,cloudy,140,19.0,33,27.0\n2350330,Female,2014-06-30 15:51:00,2014-06-30 16:17:00,26.11666666666667,84.9,cloudy,268,15.0,226,15.0\n2339473,Male,2014-06-29 18:54:00,2014-06-29 19:21:00,27.03333333333333,84.2,cloudy,35,39.0,195,31.0\n2340554,Female,2014-06-29 19:55:00,2014-06-29 20:12:00,16.15,82.0,cloudy,337,19.0,143,15.0\n2351544,Male,2014-06-30 16:55:00,2014-06-30 17:06:00,11.2,84.0,cloudy,286,23.0,44,27.0\n2351746,Male,2014-06-30 17:00:00,2014-06-30 17:17:00,17.666666666666668,84.0,cloudy,98,15.0,94,19.0\n2341651,Male,2014-06-29 21:09:00,2014-06-29 21:27:00,17.533333333333335,79.0,cloudy,199,15.0,93,15.0\n2345890,Male,2014-06-30 09:14:00,2014-06-30 09:30:00,15.833333333333336,78.1,cloudy,256,15.0,327,19.0\n2351745,Male,2014-06-30 17:00:00,2014-06-30 17:19:00,19.8,84.0,cloudy,85,23.0,299,15.0\n2344318,Male,2014-06-30 07:58:00,2014-06-30 08:16:00,18.233333333333334,73.0,cloudy,340,15.0,48,27.0\n2337591,Male,2014-06-29 17:20:00,2014-06-29 17:31:00,11.25,84.9,cloudy,94,19.0,332,15.0\n2341117,Male,2014-06-29 20:31:00,2014-06-29 20:35:00,4.133333333333334,81.0,cloudy,307,15.0,190,15.0\n2343700,Male,2014-06-30 07:23:00,2014-06-30 07:32:00,8.583333333333334,73.0,cloudy,174,23.0,195,31.0\n2353307,Male,2014-06-30 17:51:00,2014-06-30 18:00:00,8.983333333333333,84.0,cloudy,74,23.0,27,19.0\n2340137,Female,2014-06-29 19:32:00,2014-06-29 19:44:00,12.383333333333333,82.0,cloudy,338,15.0,321,19.0\n2341801,Male,2014-06-29 21:24:00,2014-06-29 21:40:00,15.516666666666667,79.0,cloudy,93,15.0,250,19.0\n2336141,Male,2014-06-29 16:19:00,2014-06-29 16:26:00,6.9,84.9,cloudy,329,15.0,349,15.0\n2339683,Male,2014-06-29 19:07:00,2014-06-29 19:30:00,22.6,82.0,cloudy,249,15.0,324,15.0\n2335772,Male,2014-06-29 16:06:00,2014-06-29 16:13:00,6.566666666666666,84.9,cloudy,339,11.0,135,11.0\n2337208,Male,2014-06-29 17:03:00,2014-06-29 17:12:00,9.483333333333333,84.9,cloudy,328,15.0,247,15.0\n2346072,Male,2014-06-30 09:34:00,2014-06-30 09:44:00,9.666666666666666,78.1,cloudy,22,15.0,191,23.0\n2340748,Male,2014-06-29 20:05:00,2014-06-29 20:22:00,17.266666666666666,81.0,cloudy,211,19.0,144,15.0\n2344670,Male,2014-06-30 08:17:00,2014-06-30 08:26:00,9.783333333333333,75.0,cloudy,5,19.0,51,31.0\n2354199,Female,2014-06-30 18:36:00,2014-06-30 18:40:00,3.6,82.0,tstorms,302,19.0,152,15.0\n2345243,Male,2014-06-30 08:41:00,2014-06-30 08:59:00,18.233333333333334,75.0,cloudy,146,11.0,264,19.0\n2348093,Female,2014-06-30 12:48:00,2014-06-30 13:05:00,16.2,82.0,cloudy,249,15.0,256,15.0\n2350453,Male,2014-06-30 15:58:00,2014-06-30 16:05:00,6.95,84.9,cloudy,287,27.0,43,43.0\n2347131,Male,2014-06-30 11:25:00,2014-06-30 11:45:00,20.166666666666668,79.0,cloudy,85,23.0,195,31.0\n2339054,Female,2014-06-29 18:34:00,2014-06-29 18:54:00,20.666666666666668,84.2,cloudy,114,27.0,177,15.0\n2348224,Female,2014-06-30 12:59:00,2014-06-30 13:07:00,7.133333333333334,82.0,cloudy,197,19.0,100,23.0\n2344320,Male,2014-06-30 07:58:00,2014-06-30 08:05:00,6.883333333333334,73.0,cloudy,66,19.0,48,27.0\n2346079,Male,2014-06-30 09:34:00,2014-06-30 09:52:00,18.4,78.1,cloudy,255,31.0,150,11.0\n2352592,Male,2014-06-30 17:27:00,2014-06-30 17:38:00,11.066666666666665,84.0,cloudy,53,19.0,174,23.0\n2331703,Male,2014-06-29 13:39:00,2014-06-29 13:44:00,4.6,82.9,cloudy,13,19.0,153,19.0\n2351149,Female,2014-06-30 16:38:00,2014-06-30 16:50:00,11.65,84.0,cloudy,48,27.0,26,31.0\n2350441,Male,2014-06-30 15:58:00,2014-06-30 16:10:00,12.05,84.9,cloudy,198,19.0,214,15.0\n2345659,Male,2014-06-30 09:04:00,2014-06-30 09:15:00,11.25,78.1,cloudy,174,23.0,195,31.0\n2348503,Male,2014-06-30 13:24:00,2014-06-30 13:28:00,3.983333333333333,84.9,cloudy,75,23.0,134,19.0\n2337918,Female,2014-06-29 17:36:00,2014-06-29 17:46:00,10.266666666666667,84.9,cloudy,268,15.0,20,15.0\n2343792,Male,2014-06-30 07:30:00,2014-06-30 07:54:00,24.36666666666667,73.0,cloudy,259,15.0,51,31.0\n2350608,Male,2014-06-30 16:07:00,2014-06-30 16:15:00,7.233333333333332,84.0,cloudy,90,35.0,26,31.0\n2344182,Female,2014-06-30 07:51:00,2014-06-30 07:56:00,4.95,73.0,cloudy,80,19.0,73,19.0\n2345072,Female,2014-06-30 08:29:00,2014-06-30 09:04:00,35.63333333333333,75.0,cloudy,299,15.0,90,35.0\n2339656,Female,2014-06-29 18:49:00,2014-06-29 19:04:00,14.433333333333335,84.2,cloudy,304,15.0,253,15.0\n2348591,Female,2014-06-30 13:29:00,2014-06-30 13:36:00,7.75,84.9,cloudy,230,19.0,153,19.0\n2338202,Female,2014-06-29 17:51:00,2014-06-29 18:06:00,15.083333333333336,84.9,cloudy,60,19.0,162,14.0\n2355057,Male,2014-06-30 21:38:00,2014-06-30 21:43:00,4.266666666666667,70.0,tstorms,284,23.0,286,23.0\n2352242,Female,2014-06-30 17:15:00,2014-06-30 17:26:00,11.116666666666667,84.0,cloudy,177,15.0,303,15.0\n2352338,Female,2014-06-30 17:17:00,2014-06-30 17:26:00,9.066666666666666,84.0,cloudy,90,35.0,174,23.0\n2345132,Male,2014-06-30 08:37:00,2014-06-30 08:47:00,9.783333333333333,75.0,cloudy,233,15.0,81,39.0\n2335712,Male,2014-06-29 16:04:00,2014-06-29 16:07:00,3.283333333333333,84.9,cloudy,227,15.0,318,15.0\n2352303,Female,2014-06-30 17:17:00,2014-06-30 17:24:00,7.5166666666666675,84.0,cloudy,114,27.0,229,19.0\n2337824,Male,2014-06-29 17:31:00,2014-06-29 17:45:00,13.516666666666667,84.9,cloudy,226,15.0,227,15.0\n2336943,Male,2014-06-29 16:52:00,2014-06-29 16:58:00,5.966666666666668,84.9,cloudy,156,15.0,153,19.0\n2353572,Female,2014-06-30 18:03:00,2014-06-30 18:07:00,3.983333333333333,82.0,tstorms,242,15.0,239,15.0\n2354058,Male,2014-06-30 18:28:00,2014-06-30 18:31:00,3.4166666666666665,82.0,tstorms,87,19.0,302,19.0\n2350567,Male,2014-06-30 16:05:00,2014-06-30 16:18:00,13.2,84.0,cloudy,49,27.0,301,19.0\n2334159,Male,2014-06-29 15:05:00,2014-06-29 15:26:00,21.466666666666665,82.9,cloudy,140,19.0,198,19.0\n2351286,Male,2014-06-30 16:45:00,2014-06-30 17:04:00,19.366666666666667,84.0,cloudy,284,23.0,177,15.0\n2336252,Male,2014-06-29 16:24:00,2014-06-29 16:30:00,6.116666666666666,84.9,cloudy,35,39.0,76,39.0\n2343982,Male,2014-06-30 07:41:00,2014-06-30 08:05:00,23.566666666666666,73.0,cloudy,123,15.0,27,19.0\n2332865,Male,2014-06-29 14:19:00,2014-06-29 14:24:00,5.0,84.0,cloudy,57,15.0,59,19.0\n2335921,Male,2014-06-29 16:11:00,2014-06-29 16:19:00,8.083333333333334,84.9,cloudy,284,23.0,76,39.0\n2353230,Male,2014-06-30 17:48:00,2014-06-30 17:53:00,5.433333333333334,84.0,cloudy,98,15.0,100,23.0\n2353413,Male,2014-06-30 17:56:00,2014-06-30 18:06:00,10.1,84.0,cloudy,108,19.0,317,15.0\n2335562,Male,2014-06-29 15:58:00,2014-06-29 16:11:00,13.35,82.9,cloudy,249,15.0,293,19.0\n2345660,Male,2014-06-30 09:04:00,2014-06-30 09:13:00,8.7,78.1,cloudy,191,23.0,37,19.0\n2346723,Male,2014-06-30 10:45:00,2014-06-30 10:54:00,9.483333333333333,78.1,cloudy,31,23.0,25,23.0\n2341270,Male,2014-06-29 20:43:00,2014-06-29 20:55:00,11.95,81.0,cloudy,152,15.0,141,23.0\n2345136,Male,2014-06-30 08:37:00,2014-06-30 08:51:00,14.366666666666667,75.0,cloudy,191,23.0,176,19.0\n2331541,Female,2014-06-29 13:32:00,2014-06-29 13:46:00,13.85,82.9,cloudy,153,19.0,324,15.0\n2354229,Female,2014-06-30 18:37:00,2014-06-30 18:46:00,8.633333333333333,82.0,tstorms,50,27.0,134,19.0\n2343734,Female,2014-06-30 07:25:00,2014-06-30 07:31:00,6.7,73.0,cloudy,303,15.0,117,23.0\n2343464,Male,2014-06-30 07:02:00,2014-06-30 07:07:00,4.8,73.0,cloudy,195,31.0,194,11.0\n2336906,Female,2014-06-29 16:50:00,2014-06-29 16:56:00,5.75,84.9,cloudy,84,19.0,112,15.0\n2338105,Female,2014-06-29 17:44:00,2014-06-29 18:11:00,26.43333333333333,84.9,cloudy,25,23.0,255,31.0\n2354326,Female,2014-06-30 18:43:00,2014-06-30 18:46:00,2.433333333333333,82.0,tstorms,232,23.0,304,15.0\n2350146,Male,2014-06-30 15:37:00,2014-06-30 15:43:00,6.35,84.9,cloudy,49,27.0,321,19.0\n2338869,Female,2014-06-29 18:25:00,2014-06-29 18:31:00,5.533333333333332,84.2,cloudy,301,19.0,268,15.0\n2343245,Male,2014-06-30 06:35:00,2014-06-30 06:42:00,7.183333333333334,73.0,cloudy,195,31.0,37,19.0\n2344296,Male,2014-06-30 07:54:00,2014-06-30 08:02:00,8.516666666666667,73.0,cloudy,119,19.0,342,15.0\n2347680,Female,2014-06-30 12:15:00,2014-06-30 12:28:00,12.916666666666664,82.0,cloudy,87,19.0,310,11.0\n2345884,Male,2014-06-30 09:18:00,2014-06-30 09:27:00,9.816666666666666,78.1,cloudy,301,19.0,211,19.0\n2341320,Male,2014-06-29 20:46:00,2014-06-29 21:07:00,20.983333333333334,81.0,cloudy,218,11.0,132,15.0\n2332699,Female,2014-06-29 14:14:00,2014-06-29 14:19:00,5.283333333333333,84.0,cloudy,99,19.0,173,15.0\n2348777,Male,2014-06-30 13:47:00,2014-06-30 13:54:00,7.083333333333332,84.9,cloudy,174,23.0,197,19.0\n2350562,Male,2014-06-30 16:01:00,2014-06-30 16:06:00,4.65,84.0,cloudy,75,23.0,175,19.0\n2352363,Male,2014-06-30 17:18:00,2014-06-30 17:25:00,6.2,84.0,cloudy,110,23.0,212,31.0\n2336789,Male,2014-06-29 16:46:00,2014-06-29 16:50:00,3.866666666666666,84.9,cloudy,250,19.0,230,19.0\n2348410,Male,2014-06-30 13:16:00,2014-06-30 13:39:00,23.016666666666666,84.9,cloudy,85,23.0,245,15.0\n2339589,Female,2014-06-29 19:00:00,2014-06-29 19:28:00,28.716666666666665,82.0,cloudy,334,19.0,173,15.0\n2343864,Male,2014-06-30 07:35:00,2014-06-30 07:45:00,10.1,73.0,cloudy,174,23.0,24,15.0\n2344873,Male,2014-06-30 08:26:00,2014-06-30 08:41:00,15.616666666666667,75.0,cloudy,77,23.0,261,15.0\n2347602,Male,2014-06-30 12:07:00,2014-06-30 12:26:00,18.9,82.0,cloudy,124,15.0,112,15.0\n2344185,Female,2014-06-30 07:51:00,2014-06-30 08:08:00,16.283333333333335,73.0,cloudy,291,19.0,77,23.0\n2345672,Male,2014-06-30 09:05:00,2014-06-30 09:20:00,15.066666666666665,78.1,cloudy,144,15.0,212,31.0\n2353535,Male,2014-06-30 18:01:00,2014-06-30 18:11:00,9.616666666666667,82.0,tstorms,329,15.0,153,19.0\n2340017,Female,2014-06-29 19:25:00,2014-06-29 19:31:00,5.183333333333334,82.0,cloudy,206,15.0,207,15.0\n2333096,Male,2014-06-29 14:27:00,2014-06-29 14:31:00,4.466666666666667,84.0,cloudy,93,15.0,327,19.0\n2349643,Male,2014-06-30 14:57:00,2014-06-30 15:15:00,17.233333333333334,87.1,cloudy,99,19.0,27,19.0\n2343514,Female,2014-06-30 07:07:00,2014-06-30 07:17:00,9.466666666666667,73.0,cloudy,56,19.0,211,19.0\n2334123,Male,2014-06-29 15:03:00,2014-06-29 15:28:00,24.28333333333333,82.9,cloudy,338,15.0,341,19.0\n2348619,Male,2014-06-30 13:34:00,2014-06-30 13:44:00,9.8,84.9,cloudy,25,23.0,264,19.0\n2349720,Female,2014-06-30 15:08:00,2014-06-30 15:23:00,15.766666666666667,84.9,cloudy,255,31.0,35,39.0\n2347626,Male,2014-06-30 12:03:00,2014-06-30 12:13:00,9.883333333333333,82.0,cloudy,283,23.0,192,39.0\n2339494,Male,2014-06-29 18:55:00,2014-06-29 19:20:00,24.8,84.2,cloudy,198,19.0,140,19.0\n2336470,Female,2014-06-29 16:32:00,2014-06-29 16:54:00,22.566666666666666,84.9,cloudy,37,19.0,193,15.0\n2352653,Male,2014-06-30 17:29:00,2014-06-30 17:34:00,5.816666666666666,84.0,cloudy,140,19.0,301,19.0\n2331699,Male,2014-06-29 13:39:00,2014-06-29 13:47:00,7.566666666666666,82.9,cloudy,258,19.0,308,11.0\n2350710,Male,2014-06-30 16:15:00,2014-06-30 16:28:00,13.533333333333333,84.0,cloudy,285,15.0,22,15.0\n2341199,Male,2014-06-29 20:37:00,2014-06-29 20:48:00,11.216666666666667,81.0,cloudy,94,19.0,60,19.0\n2338543,Male,2014-06-29 18:07:00,2014-06-29 18:14:00,6.7333333333333325,84.2,cloudy,115,23.0,157,15.0\n2350787,Male,2014-06-30 16:20:00,2014-06-30 16:36:00,16.9,84.0,cloudy,205,15.0,283,23.0\n2332559,Male,2014-06-29 14:09:00,2014-06-29 14:24:00,15.366666666666667,84.0,cloudy,28,15.0,130,15.0\n2332822,Male,2014-06-29 14:18:00,2014-06-29 14:23:00,4.733333333333333,84.0,cloudy,100,23.0,287,27.0\n2335654,Male,2014-06-29 16:01:00,2014-06-29 16:07:00,5.666666666666668,84.9,cloudy,339,11.0,279,15.0\n2348062,Male,2014-06-30 12:46:00,2014-06-30 12:58:00,11.933333333333335,82.0,cloudy,92,19.0,108,19.0\n2351085,Female,2014-06-30 16:35:00,2014-06-30 17:05:00,29.93333333333333,84.0,cloudy,93,15.0,238,15.0\n2341229,Male,2014-06-29 20:40:00,2014-06-29 20:43:00,2.8,81.0,cloudy,240,23.0,254,15.0\n2354392,Male,2014-06-30 18:49:00,2014-06-30 18:52:00,2.833333333333333,82.0,tstorms,337,19.0,25,23.0\n2353330,Male,2014-06-30 17:53:00,2014-06-30 18:08:00,15.3,84.0,cloudy,177,15.0,245,15.0\n2344016,Male,2014-06-30 07:44:00,2014-06-30 07:52:00,8.216666666666667,73.0,cloudy,174,23.0,31,23.0\n2353746,Male,2014-06-30 18:11:00,2014-06-30 18:18:00,6.866666666666666,82.0,tstorms,216,15.0,130,15.0\n2345276,Male,2014-06-30 08:43:00,2014-06-30 09:07:00,24.48333333333333,75.0,cloudy,17,15.0,199,15.0\n2342491,Male,2014-06-29 22:51:00,2014-06-29 23:07:00,16.2,78.1,cloudy,130,15.0,337,19.0\n2338291,Male,2014-06-29 17:54:00,2014-06-29 18:22:00,27.65,84.9,cloudy,47,19.0,22,15.0\n2351060,Male,2014-06-30 16:33:00,2014-06-30 16:42:00,9.066666666666666,84.0,cloudy,264,19.0,91,31.0\n2355065,Male,2014-06-30 21:43:00,2014-06-30 21:50:00,6.4,70.0,tstorms,291,19.0,337,19.0\n2340374,Male,2014-06-29 19:43:00,2014-06-29 19:52:00,9.5,82.0,cloudy,62,27.0,335,15.0\n2337689,Male,2014-06-29 17:25:00,2014-06-29 17:44:00,18.65,84.9,cloudy,26,31.0,268,15.0\n2352751,Male,2014-06-30 17:32:00,2014-06-30 17:43:00,10.616666666666667,84.0,cloudy,284,23.0,35,39.0\n2349941,Male,2014-06-30 15:24:00,2014-06-30 15:31:00,7.116666666666666,84.9,cloudy,115,23.0,250,19.0\n2336484,Male,2014-06-29 16:33:00,2014-06-29 16:37:00,4.616666666666666,84.9,cloudy,106,27.0,31,23.0\n2342695,Male,2014-06-29 23:25:00,2014-06-29 23:29:00,4.083333333333333,78.1,cloudy,36,31.0,174,23.0\n2347574,Male,2014-06-30 12:04:00,2014-06-30 12:11:00,7.25,82.0,cloudy,77,23.0,346,15.0\n2337517,Male,2014-06-29 17:17:00,2014-06-29 17:29:00,12.183333333333335,84.9,cloudy,53,19.0,143,15.0\n2351242,Male,2014-06-30 16:43:00,2014-06-30 16:55:00,11.966666666666667,84.0,cloudy,195,31.0,191,23.0\n2343312,Female,2014-06-30 06:43:00,2014-06-30 06:58:00,14.85,73.0,cloudy,176,19.0,77,23.0\n2344454,Female,2014-06-30 08:05:00,2014-06-30 08:29:00,24.4,75.0,cloudy,203,15.0,75,23.0\n2345222,Male,2014-06-30 08:40:00,2014-06-30 08:49:00,8.116666666666667,75.0,cloudy,217,15.0,74,23.0\n2340043,Female,2014-06-29 19:27:00,2014-06-29 19:59:00,31.68333333333333,82.0,cloudy,198,19.0,99,19.0\n2341056,Male,2014-06-29 20:27:00,2014-06-29 20:34:00,6.85,81.0,cloudy,199,15.0,46,19.0\n2351667,Female,2014-06-30 16:57:00,2014-06-30 17:04:00,6.333333333333332,84.0,cloudy,59,19.0,338,15.0\n2343686,Male,2014-06-30 07:22:00,2014-06-30 07:28:00,6.45,73.0,cloudy,91,31.0,80,19.0\n2346315,Male,2014-06-30 09:58:00,2014-06-30 10:04:00,5.9,78.1,cloudy,321,19.0,98,15.0\n2348656,Male,2014-06-30 13:37:00,2014-06-30 13:46:00,8.516666666666667,84.9,cloudy,173,15.0,35,39.0\n2346784,Male,2014-06-30 10:49:00,2014-06-30 11:05:00,16.9,78.1,cloudy,341,19.0,197,19.0\n2351203,Female,2014-06-30 16:41:00,2014-06-30 16:52:00,10.666666666666666,84.0,cloudy,254,15.0,227,15.0\n2350994,Male,2014-06-30 16:30:00,2014-06-30 16:44:00,14.233333333333333,84.0,cloudy,337,19.0,91,31.0\n2348598,Male,2014-06-30 13:34:00,2014-06-30 13:45:00,11.833333333333336,84.9,cloudy,60,19.0,127,15.0\n2348252,Male,2014-06-30 13:02:00,2014-06-30 13:05:00,3.183333333333333,84.9,cloudy,115,23.0,300,15.0\n2332470,Female,2014-06-29 14:06:00,2014-06-29 14:11:00,5.133333333333334,84.0,cloudy,144,15.0,94,19.0\n2353092,Male,2014-06-30 17:43:00,2014-06-30 17:53:00,9.366666666666667,84.0,cloudy,81,39.0,176,19.0\n2352618,Male,2014-06-30 17:28:00,2014-06-30 17:35:00,7.566666666666666,84.0,cloudy,109,19.0,192,39.0\n2348148,Male,2014-06-30 12:54:00,2014-06-30 12:57:00,3.55,82.0,cloudy,210,19.0,61,15.0\n2333562,Male,2014-06-29 14:43:00,2014-06-29 14:55:00,11.8,84.0,cloudy,48,27.0,144,15.0\n2353850,Male,2014-06-30 18:16:00,2014-06-30 18:27:00,10.8,82.0,tstorms,173,15.0,91,31.0\n2345117,Female,2014-06-30 08:36:00,2014-06-30 08:38:00,2.1166666666666667,75.0,cloudy,202,15.0,202,15.0\n2352731,Male,2014-06-30 17:32:00,2014-06-30 17:43:00,10.883333333333333,84.0,cloudy,174,23.0,80,19.0\n2347535,Male,2014-06-30 12:01:00,2014-06-30 12:21:00,19.4,82.0,cloudy,144,15.0,71,15.0\n2338237,Female,2014-06-29 17:53:00,2014-06-29 18:07:00,14.116666666666667,84.9,cloudy,301,19.0,86,15.0\n2344115,Male,2014-06-30 07:48:00,2014-06-30 08:01:00,12.983333333333333,73.0,cloudy,280,11.0,15,15.0\n2354766,Male,2014-06-30 20:09:00,2014-06-30 20:17:00,7.5166666666666675,70.0,rain or snow,165,19.0,306,15.0\n2346243,Female,2014-06-30 09:50:00,2014-06-30 09:58:00,8.283333333333333,78.1,cloudy,344,15.0,293,19.0\n2353371,Female,2014-06-30 17:55:00,2014-06-30 18:03:00,8.033333333333333,84.0,cloudy,177,15.0,220,19.0\n2353936,Male,2014-06-30 18:21:00,2014-06-30 18:35:00,14.25,82.0,tstorms,195,31.0,255,31.0\n2353072,Male,2014-06-30 17:42:00,2014-06-30 17:52:00,9.2,84.0,cloudy,98,15.0,80,19.0\n2336242,Female,2014-06-29 16:23:00,2014-06-29 16:37:00,13.2,84.9,cloudy,219,11.0,113,15.0\n2347677,Male,2014-06-30 12:14:00,2014-06-30 12:19:00,5.0,82.0,cloudy,45,15.0,197,19.0\n2347776,Male,2014-06-30 12:24:00,2014-06-30 12:36:00,11.616666666666667,82.0,cloudy,231,15.0,117,23.0\n2352582,Male,2014-06-30 17:27:00,2014-06-30 17:33:00,6.1,84.0,cloudy,192,39.0,80,19.0\n2348532,Male,2014-06-30 13:27:00,2014-06-30 13:30:00,3.45,84.9,cloudy,88,15.0,346,15.0\n2347836,Male,2014-06-30 12:29:00,2014-06-30 12:33:00,4.466666666666667,82.0,cloudy,75,23.0,283,23.0\n2349010,Male,2014-06-30 14:03:00,2014-06-30 14:13:00,10.25,87.1,cloudy,99,19.0,51,31.0\n2351323,Male,2014-06-30 16:46:00,2014-06-30 16:52:00,5.7333333333333325,84.0,cloudy,69,19.0,160,15.0\n2353447,Male,2014-06-30 17:58:00,2014-06-30 18:22:00,24.6,84.0,cloudy,174,23.0,290,15.0\n2338844,Male,2014-06-29 18:24:00,2014-06-29 19:04:00,40.41666666666666,84.2,cloudy,183,15.0,305,15.0\n2336079,Male,2014-06-29 16:17:00,2014-06-29 16:23:00,6.166666666666668,84.9,cloudy,152,15.0,131,15.0\n2346297,Male,2014-06-30 09:57:00,2014-06-30 10:04:00,7.283333333333332,78.1,cloudy,47,19.0,37,19.0\n2338816,Male,2014-06-29 18:22:00,2014-06-29 18:36:00,14.166666666666664,84.2,cloudy,15,15.0,59,19.0\n2348073,Female,2014-06-30 12:47:00,2014-06-30 13:01:00,14.133333333333333,82.0,cloudy,87,19.0,303,15.0\n2351796,Male,2014-06-30 17:02:00,2014-06-30 17:14:00,12.566666666666665,84.0,cloudy,191,23.0,301,19.0\n2336555,Female,2014-06-29 16:36:00,2014-06-29 16:59:00,23.3,84.9,cloudy,183,15.0,226,15.0\n2351824,Male,2014-06-30 17:03:00,2014-06-30 17:27:00,24.53333333333333,84.0,cloudy,48,27.0,228,11.0\n2346472,Female,2014-06-30 10:10:00,2014-06-30 10:16:00,5.683333333333334,78.1,cloudy,49,27.0,191,23.0\n2346445,Male,2014-06-30 10:14:00,2014-06-30 10:19:00,5.4,78.1,cloudy,303,15.0,117,23.0\n2346676,Female,2014-06-30 10:40:00,2014-06-30 10:55:00,14.8,78.1,cloudy,176,19.0,51,31.0\n2334203,Female,2014-06-29 15:06:00,2014-06-29 15:34:00,27.466666666666665,82.9,cloudy,76,39.0,110,23.0\n2344721,Male,2014-06-30 08:19:00,2014-06-30 08:31:00,11.366666666666667,75.0,cloudy,50,27.0,264,19.0\n2343569,Male,2014-06-30 07:12:00,2014-06-30 07:17:00,4.4,73.0,cloudy,31,23.0,48,27.0\n2344188,Male,2014-06-30 07:52:00,2014-06-30 08:01:00,9.55,73.0,cloudy,50,27.0,77,23.0\n2336138,Female,2014-06-29 16:19:00,2014-06-29 16:28:00,8.85,84.9,cloudy,57,15.0,55,15.0\n2345214,Male,2014-06-30 08:37:00,2014-06-30 08:47:00,9.816666666666666,75.0,cloudy,91,31.0,55,15.0\n2345841,Male,2014-06-30 09:15:00,2014-06-30 09:21:00,6.416666666666668,78.1,cloudy,175,19.0,192,39.0\n2352539,Male,2014-06-30 17:25:00,2014-06-30 17:54:00,29.6,84.0,cloudy,91,31.0,260,19.0\n2345630,Female,2014-06-30 09:02:00,2014-06-30 09:06:00,4.433333333333334,78.1,cloudy,326,11.0,234,19.0\n2332861,Male,2014-06-29 14:19:00,2014-06-29 14:27:00,8.316666666666666,84.0,cloudy,211,19.0,301,19.0\n2347689,Male,2014-06-30 12:16:00,2014-06-30 12:43:00,27.6,82.0,cloudy,81,39.0,286,23.0\n2352802,Male,2014-06-30 17:34:00,2014-06-30 17:39:00,4.766666666666667,84.0,cloudy,54,19.0,29,15.0\n2333112,Male,2014-06-29 14:27:00,2014-06-29 14:44:00,16.933333333333334,84.0,cloudy,71,15.0,268,15.0\n2338759,Male,2014-06-29 18:18:00,2014-06-29 18:30:00,11.533333333333333,84.2,cloudy,240,23.0,245,15.0\n2331534,Male,2014-06-29 13:32:00,2014-06-29 13:49:00,16.6,82.9,cloudy,261,15.0,75,23.0\n2354707,Male,2014-06-30 19:35:00,2014-06-30 19:48:00,13.266666666666667,73.0,tstorms,19,15.0,55,15.0\n2341579,Male,2014-06-29 21:04:00,2014-06-29 21:24:00,19.35,79.0,cloudy,220,19.0,312,15.0\n2347842,Male,2014-06-30 12:29:00,2014-06-30 12:46:00,16.4,82.0,cloudy,116,15.0,92,19.0\n2354875,Male,2014-06-30 20:45:00,2014-06-30 20:47:00,2.066666666666667,70.0,rain or snow,113,15.0,327,19.0\n2342153,Female,2014-06-29 21:58:00,2014-06-29 22:04:00,5.783333333333332,79.0,cloudy,229,19.0,165,19.0\n2349660,Male,2014-06-30 15:03:00,2014-06-30 15:09:00,6.016666666666668,84.9,cloudy,283,23.0,91,31.0\n2354363,Male,2014-06-30 18:46:00,2014-06-30 18:54:00,8.066666666666666,82.0,tstorms,191,23.0,84,19.0\n2339165,Male,2014-06-29 18:39:00,2014-06-29 18:54:00,15.066666666666665,84.2,cloudy,90,35.0,48,27.0\n2343029,Male,2014-06-30 03:02:00,2014-06-30 03:21:00,18.233333333333334,75.0,tstorms,69,19.0,144,15.0\n2341309,Male,2014-06-29 20:46:00,2014-06-29 20:55:00,8.683333333333334,81.0,cloudy,315,11.0,123,15.0\n2342025,Male,2014-06-29 21:47:00,2014-06-29 22:07:00,20.533333333333328,79.0,cloudy,312,15.0,313,19.0\n2345865,Male,2014-06-30 09:15:00,2014-06-30 09:20:00,4.383333333333334,78.1,cloudy,91,31.0,233,15.0\n2353040,Female,2014-06-30 17:42:00,2014-06-30 18:04:00,21.95,84.0,cloudy,174,23.0,141,23.0\n2338439,Female,2014-06-29 18:03:00,2014-06-29 18:24:00,20.883333333333333,84.2,cloudy,319,15.0,28,15.0\n2351729,Male,2014-06-30 16:59:00,2014-06-30 17:09:00,9.5,84.0,cloudy,199,15.0,91,31.0\n2340839,Female,2014-06-29 20:12:00,2014-06-29 20:20:00,8.25,81.0,cloudy,76,39.0,194,11.0\n2337044,Male,2014-06-29 16:56:00,2014-06-29 17:11:00,14.883333333333333,84.9,cloudy,328,15.0,204,15.0\n2353974,Male,2014-06-30 18:23:00,2014-06-30 18:30:00,6.75,82.0,tstorms,240,23.0,256,15.0\n2346686,Male,2014-06-30 10:41:00,2014-06-30 10:53:00,11.966666666666667,78.1,cloudy,341,19.0,168,19.0\n2348872,Male,2014-06-30 13:55:00,2014-06-30 14:05:00,10.366666666666667,84.9,cloudy,307,15.0,69,19.0\n2353059,Male,2014-06-30 17:42:00,2014-06-30 17:58:00,15.566666666666665,84.0,cloudy,91,31.0,16,11.0\n2350856,Female,2014-06-30 16:24:00,2014-06-30 16:31:00,6.716666666666668,84.0,cloudy,143,15.0,289,19.0\n2353471,Male,2014-06-30 17:59:00,2014-06-30 18:21:00,22.45,84.0,cloudy,85,23.0,190,15.0\n2347630,Female,2014-06-30 12:05:00,2014-06-30 12:28:00,22.86666666666667,82.0,cloudy,321,19.0,196,19.0\n2351128,Male,2014-06-30 16:37:00,2014-06-30 16:53:00,16.216666666666665,84.0,cloudy,261,15.0,91,31.0\n2351256,Male,2014-06-30 16:43:00,2014-06-30 17:18:00,34.23333333333333,84.0,cloudy,211,19.0,153,19.0\n2342536,Female,2014-06-29 22:58:00,2014-06-29 23:11:00,12.7,78.1,cloudy,333,15.0,259,15.0\n2340438,Female,2014-06-29 19:49:00,2014-06-29 19:56:00,7.616666666666666,82.0,cloudy,135,11.0,207,15.0\n2353014,Male,2014-06-30 17:41:00,2014-06-30 17:44:00,2.8666666666666667,84.0,cloudy,240,23.0,306,15.0\n2350702,Male,2014-06-30 16:14:00,2014-06-30 16:19:00,4.716666666666667,84.0,cloudy,192,39.0,37,19.0\n2341584,Male,2014-06-29 21:05:00,2014-06-29 21:17:00,12.683333333333335,79.0,cloudy,228,11.0,260,19.0\n2337732,Female,2014-06-29 17:27:00,2014-06-29 17:41:00,13.616666666666667,84.9,cloudy,117,23.0,228,11.0\n2346250,Male,2014-06-30 09:50:00,2014-06-30 09:56:00,6.2,78.1,cloudy,66,19.0,53,19.0\n2351927,Male,2014-06-30 17:06:00,2014-06-30 17:16:00,9.733333333333333,84.0,cloudy,66,19.0,86,15.0\n2331805,Male,2014-06-29 13:43:00,2014-06-29 14:05:00,22.25,82.9,cloudy,220,19.0,323,15.0\n2331461,Female,2014-06-29 13:30:00,2014-06-29 13:36:00,6.4833333333333325,82.9,cloudy,186,15.0,56,19.0\n2349847,Male,2014-06-30 15:17:00,2014-06-30 15:28:00,11.416666666666664,84.9,cloudy,243,15.0,230,19.0\n2333666,Female,2014-06-29 14:47:00,2014-06-29 15:15:00,28.316666666666666,84.0,cloudy,291,19.0,85,23.0\n2353724,Male,2014-06-30 18:06:00,2014-06-30 18:27:00,20.466666666666665,82.0,tstorms,43,43.0,217,15.0\n2350471,Male,2014-06-30 16:00:00,2014-06-30 16:08:00,7.566666666666666,84.0,cloudy,86,15.0,333,15.0\n2333022,Male,2014-06-29 14:25:00,2014-06-29 14:49:00,23.966666666666665,84.0,cloudy,59,19.0,35,39.0\n2339250,Male,2014-06-29 18:44:00,2014-06-29 18:50:00,6.3,84.2,cloudy,114,27.0,226,15.0\n2345917,Male,2014-06-30 09:21:00,2014-06-30 09:27:00,6.516666666666668,78.1,cloudy,238,15.0,344,15.0\n2345045,Female,2014-06-30 08:32:00,2014-06-30 08:39:00,6.266666666666668,75.0,cloudy,22,15.0,282,15.0\n2353382,Male,2014-06-30 17:55:00,2014-06-30 18:18:00,22.58333333333333,84.0,cloudy,100,23.0,222,19.0\n2341096,Female,2014-06-29 20:29:00,2014-06-29 20:35:00,5.383333333333334,81.0,cloudy,299,15.0,114,27.0\n2336597,Male,2014-06-29 16:38:00,2014-06-29 16:56:00,18.483333333333334,84.9,cloudy,232,23.0,324,15.0\n2332128,Male,2014-06-29 13:54:00,2014-06-29 14:17:00,22.3,82.9,cloudy,177,15.0,254,15.0\n2354546,Male,2014-06-30 19:02:00,2014-06-30 19:19:00,16.166666666666668,73.0,tstorms,43,43.0,199,15.0\n2334757,Male,2014-06-29 15:26:00,2014-06-29 15:43:00,16.783333333333335,82.9,cloudy,307,15.0,291,19.0\n2353627,Male,2014-06-30 18:06:00,2014-06-30 18:13:00,7.133333333333334,82.0,tstorms,59,19.0,178,15.0\n2354828,Male,2014-06-30 20:31:00,2014-06-30 20:39:00,8.883333333333333,70.0,rain or snow,342,15.0,19,15.0\n2344487,Male,2014-06-30 08:04:00,2014-06-30 08:12:00,7.85,75.0,cloudy,191,23.0,43,43.0\n2353525,Male,2014-06-30 18:00:00,2014-06-30 18:18:00,17.85,82.0,tstorms,176,19.0,157,15.0\n2350890,Male,2014-06-30 16:26:00,2014-06-30 16:30:00,3.733333333333333,84.0,cloudy,54,19.0,186,15.0\n2355018,Male,2014-06-30 21:16:00,2014-06-30 21:24:00,7.733333333333332,70.0,tstorms,67,15.0,117,23.0\n2350656,Male,2014-06-30 16:11:00,2014-06-30 16:15:00,3.7666666666666666,84.0,cloudy,307,15.0,188,15.0\n2349658,Male,2014-06-30 15:01:00,2014-06-30 15:05:00,4.283333333333333,84.9,cloudy,222,19.0,309,11.0\n2349820,Male,2014-06-30 15:15:00,2014-06-30 15:24:00,9.2,84.9,cloudy,241,15.0,137,15.0\n2348693,Male,2014-06-30 13:41:00,2014-06-30 13:49:00,8.916666666666666,84.9,cloudy,206,15.0,15,15.0\n2345135,Male,2014-06-30 08:37:00,2014-06-30 08:48:00,10.616666666666667,75.0,cloudy,92,19.0,164,23.0\n2351182,Male,2014-06-30 16:40:00,2014-06-30 16:46:00,6.35,84.0,cloudy,43,43.0,287,27.0\n2345859,Male,2014-06-30 09:15:00,2014-06-30 09:33:00,17.4,78.1,cloudy,66,19.0,342,15.0\n2341445,Male,2014-06-29 20:55:00,2014-06-29 21:35:00,39.56666666666667,81.0,cloudy,85,23.0,156,15.0\n2341649,Male,2014-06-29 21:09:00,2014-06-29 21:27:00,17.4,79.0,cloudy,94,19.0,199,15.0\n2352924,Male,2014-06-30 17:38:00,2014-06-30 17:45:00,6.75,84.0,cloudy,44,27.0,110,23.0\n2338158,Male,2014-06-29 17:47:00,2014-06-29 17:53:00,6.016666666666668,84.9,cloudy,158,15.0,123,15.0\n2351902,Male,2014-06-30 17:05:00,2014-06-30 17:17:00,12.083333333333336,84.0,cloudy,91,31.0,99,19.0\n2343174,Male,2014-06-30 06:26:00,2014-06-30 06:31:00,5.4833333333333325,73.0,cloudy,192,39.0,80,19.0\n2350866,Male,2014-06-30 16:25:00,2014-06-30 16:35:00,10.7,84.0,cloudy,165,19.0,327,19.0\n2339462,Male,2014-06-29 18:54:00,2014-06-29 19:04:00,10.366666666666667,84.2,cloudy,283,23.0,110,23.0\n2351950,Female,2014-06-30 17:07:00,2014-06-30 17:30:00,23.53333333333333,84.0,cloudy,100,23.0,158,15.0\n2345357,Male,2014-06-30 08:47:00,2014-06-30 09:06:00,19.683333333333334,75.0,cloudy,317,15.0,36,31.0\n2345207,Female,2014-06-30 08:40:00,2014-06-30 09:07:00,27.03333333333333,75.0,cloudy,330,19.0,60,19.0\n2333087,Male,2014-06-29 14:26:00,2014-06-29 14:32:00,5.7,84.0,cloudy,307,15.0,166,15.0\n2343808,Male,2014-06-30 07:31:00,2014-06-30 07:37:00,6.016666666666668,73.0,cloudy,337,19.0,48,27.0\n2339985,Male,2014-06-29 19:23:00,2014-06-29 19:40:00,17.0,82.0,cloudy,226,15.0,344,15.0\n2353177,Male,2014-06-30 17:46:00,2014-06-30 18:01:00,14.883333333333333,84.0,cloudy,168,19.0,22,15.0\n2351721,Female,2014-06-30 16:59:00,2014-06-30 17:07:00,7.8,84.0,cloudy,223,15.0,94,19.0\n2344269,Male,2014-06-30 07:55:00,2014-06-30 08:00:00,5.25,73.0,cloudy,264,19.0,81,39.0\n2339532,Female,2014-06-29 18:57:00,2014-06-29 19:12:00,15.583333333333336,84.2,cloudy,176,19.0,99,19.0\n2352203,Male,2014-06-30 17:13:00,2014-06-30 17:23:00,10.1,84.0,cloudy,283,23.0,195,31.0\n2348944,Male,2014-06-30 14:00:00,2014-06-30 14:03:00,3.3666666666666667,87.1,cloudy,49,27.0,283,23.0\n2338670,Female,2014-06-29 18:13:00,2014-06-29 18:23:00,10.366666666666667,84.2,cloudy,302,19.0,223,15.0\n2353495,Female,2014-06-30 17:59:00,2014-06-30 18:35:00,35.666666666666664,84.0,cloudy,162,14.0,173,15.0\n2350786,Male,2014-06-30 16:19:00,2014-06-30 16:24:00,4.283333333333333,84.0,cloudy,115,23.0,153,19.0\n2333855,Male,2014-06-29 14:54:00,2014-06-29 15:00:00,6.4833333333333325,84.0,cloudy,110,23.0,66,19.0\n2335381,Male,2014-06-29 15:51:00,2014-06-29 16:08:00,17.166666666666668,82.9,cloudy,37,19.0,35,39.0\n2336340,Female,2014-06-29 16:28:00,2014-06-29 16:49:00,20.883333333333333,84.9,cloudy,177,15.0,176,19.0\n2345059,Male,2014-06-30 08:31:00,2014-06-30 08:39:00,8.15,75.0,cloudy,255,31.0,37,19.0\n2336765,Male,2014-06-29 16:44:00,2014-06-29 16:47:00,2.466666666666667,84.9,cloudy,168,19.0,59,19.0\n2333088,Male,2014-06-29 14:26:00,2014-06-29 14:34:00,7.4,84.0,cloudy,339,11.0,339,11.0\n2336021,Male,2014-06-29 16:14:00,2014-06-29 16:43:00,28.78333333333333,84.9,cloudy,321,19.0,90,35.0\n2347625,Male,2014-06-30 12:09:00,2014-06-30 12:17:00,8.6,82.0,cloudy,42,15.0,321,19.0\n2342837,Male,2014-06-30 00:14:00,2014-06-30 00:38:00,24.516666666666666,78.1,cloudy,303,15.0,256,15.0\n2333869,Female,2014-06-29 14:50:00,2014-06-29 15:16:00,25.73333333333333,84.0,cloudy,324,15.0,74,23.0\n2345138,Male,2014-06-30 08:37:00,2014-06-30 08:46:00,9.183333333333334,75.0,cloudy,198,19.0,81,39.0\n2355126,Male,2014-06-30 23:08:00,2014-06-30 23:13:00,5.066666666666666,68.0,tstorms,174,23.0,44,27.0\n2343057,Male,2014-06-30 05:21:00,2014-06-30 05:43:00,21.9,73.0,cloudy,220,19.0,77,23.0\n2337813,Male,2014-06-29 17:31:00,2014-06-29 17:36:00,5.283333333333333,84.9,cloudy,81,39.0,50,27.0\n2342100,Male,2014-06-29 21:57:00,2014-06-29 22:01:00,3.816666666666667,79.0,cloudy,118,19.0,138,15.0\n2347316,Male,2014-06-30 11:41:00,2014-06-30 11:47:00,5.85,79.0,cloudy,68,23.0,174,23.0\n2351744,Female,2014-06-30 16:59:00,2014-06-30 17:25:00,25.38333333333333,84.0,cloudy,337,19.0,222,19.0\n2345283,Male,2014-06-30 08:43:00,2014-06-30 08:53:00,10.116666666666667,75.0,cloudy,233,15.0,37,19.0\n2353742,Male,2014-06-30 18:11:00,2014-06-30 18:17:00,5.6,82.0,tstorms,123,15.0,290,15.0\n2339655,Male,2014-06-29 19:05:00,2014-06-29 19:14:00,9.433333333333334,82.0,cloudy,176,19.0,141,23.0\n2350568,Male,2014-06-30 16:05:00,2014-06-30 16:09:00,3.8,84.0,cloudy,48,27.0,31,23.0\n2354648,Male,2014-06-30 19:14:00,2014-06-30 19:17:00,3.25,73.0,tstorms,198,19.0,77,23.0\n2351472,Male,2014-06-30 16:52:00,2014-06-30 16:57:00,4.933333333333334,84.0,cloudy,98,15.0,212,31.0\n2354779,Male,2014-06-30 20:19:00,2014-06-30 20:25:00,6.316666666666666,70.0,rain or snow,337,19.0,289,19.0\n2353322,Male,2014-06-30 17:52:00,2014-06-30 17:57:00,5.233333333333333,84.0,cloudy,136,15.0,55,15.0\n2343923,Male,2014-06-30 07:38:00,2014-06-30 07:51:00,12.733333333333333,73.0,cloudy,192,39.0,110,23.0\n2345743,Male,2014-06-30 09:09:00,2014-06-30 09:17:00,7.983333333333332,78.1,cloudy,91,31.0,212,31.0\n2337593,Male,2014-06-29 17:20:00,2014-06-29 17:39:00,19.166666666666668,84.9,cloudy,50,27.0,301,19.0\n2335374,Male,2014-06-29 15:51:00,2014-06-29 15:54:00,3.066666666666667,82.9,cloudy,48,27.0,74,23.0\n2346184,Male,2014-06-30 09:44:00,2014-06-30 09:47:00,2.933333333333333,78.1,cloudy,44,27.0,52,31.0\n2338838,Male,2014-06-29 18:23:00,2014-06-29 18:44:00,20.433333333333334,84.2,cloudy,309,11.0,75,23.0\n2349846,Male,2014-06-30 15:16:00,2014-06-30 15:22:00,5.9,84.9,cloudy,243,15.0,297,15.0\n2345139,Male,2014-06-30 08:37:00,2014-06-30 08:48:00,10.733333333333333,75.0,cloudy,59,19.0,36,31.0\n2341110,Female,2014-06-29 20:30:00,2014-06-29 20:37:00,6.366666666666666,81.0,cloudy,198,19.0,217,15.0\n2347744,Male,2014-06-30 12:22:00,2014-06-30 12:30:00,8.233333333333333,82.0,cloudy,211,19.0,85,23.0\n2338669,Male,2014-06-29 18:13:00,2014-06-29 18:20:00,6.966666666666668,84.2,cloudy,194,11.0,56,19.0\n2334189,Male,2014-06-29 15:06:00,2014-06-29 15:14:00,8.016666666666667,82.9,cloudy,152,15.0,324,15.0\n2338408,Male,2014-06-29 18:01:00,2014-06-29 18:10:00,8.75,84.2,cloudy,111,19.0,164,23.0\n2336303,Male,2014-06-29 16:27:00,2014-06-29 16:42:00,14.983333333333333,84.9,cloudy,264,19.0,85,23.0\n2343126,Male,2014-06-30 06:08:00,2014-06-30 06:15:00,7.05,73.0,cloudy,318,15.0,229,19.0\n2351374,Male,2014-06-30 16:46:00,2014-06-30 16:52:00,6.666666666666668,84.0,cloudy,287,27.0,284,23.0\n2349412,Male,2014-06-30 14:40:00,2014-06-30 15:05:00,24.7,87.1,cloudy,44,27.0,106,27.0\n2344827,Male,2014-06-30 08:23:00,2014-06-30 08:27:00,4.033333333333333,75.0,cloudy,340,15.0,13,19.0\n2346498,Male,2014-06-30 10:20:00,2014-06-30 10:36:00,16.433333333333334,78.1,cloudy,341,19.0,255,31.0\n2344479,Female,2014-06-30 08:07:00,2014-06-30 08:20:00,13.2,75.0,cloudy,198,19.0,317,15.0\n2344102,Male,2014-06-30 07:47:00,2014-06-30 07:58:00,10.55,73.0,cloudy,74,23.0,49,27.0\n2351252,Female,2014-06-30 16:43:00,2014-06-30 17:04:00,20.533333333333328,84.0,cloudy,111,19.0,152,15.0\n2353871,Female,2014-06-30 18:17:00,2014-06-30 18:23:00,6.2,82.0,tstorms,60,19.0,327,19.0\n2349938,Female,2014-06-30 15:24:00,2014-06-30 15:36:00,11.35,84.9,cloudy,85,23.0,110,23.0\n2351813,Male,2014-06-30 17:02:00,2014-06-30 17:05:00,2.75,84.0,cloudy,52,31.0,44,27.0\n2333286,Female,2014-06-29 14:33:00,2014-06-29 14:54:00,20.766666666666666,84.0,cloudy,94,19.0,232,23.0\n2339891,Female,2014-06-29 19:18:00,2014-06-29 19:23:00,5.083333333333333,82.0,cloudy,289,19.0,27,19.0\n2352836,Male,2014-06-30 17:32:00,2014-06-30 17:46:00,13.2,84.0,cloudy,58,19.0,226,15.0\n2354683,Male,2014-06-30 19:17:00,2014-06-30 19:31:00,13.666666666666664,73.0,tstorms,144,15.0,229,19.0\n2344889,Male,2014-06-30 08:26:00,2014-06-30 08:33:00,7.116666666666666,75.0,cloudy,192,39.0,81,39.0\n2348415,Male,2014-06-30 13:17:00,2014-06-30 13:37:00,20.233333333333334,84.9,cloudy,46,19.0,302,19.0\n2339587,Male,2014-06-29 18:59:00,2014-06-29 19:12:00,12.833333333333336,84.2,cloudy,268,15.0,313,19.0\n2350243,Male,2014-06-30 15:45:00,2014-06-30 15:59:00,14.466666666666667,84.9,cloudy,85,23.0,177,15.0\n2338773,Male,2014-06-29 18:19:00,2014-06-29 18:30:00,10.566666666666666,84.2,cloudy,152,15.0,143,15.0\n2354339,Male,2014-06-30 18:44:00,2014-06-30 18:49:00,5.266666666666667,82.0,tstorms,140,19.0,301,19.0\n2353153,Female,2014-06-30 17:45:00,2014-06-30 18:04:00,19.1,84.0,cloudy,85,23.0,349,15.0\n2340778,Female,2014-06-29 20:08:00,2014-06-29 20:24:00,15.833333333333336,81.0,cloudy,76,39.0,35,39.0\n2343422,Male,2014-06-30 06:56:00,2014-06-30 06:59:00,3.1166666666666667,73.0,cloudy,327,19.0,225,15.0\n2350980,Male,2014-06-30 16:30:00,2014-06-30 16:38:00,8.683333333333334,84.0,cloudy,181,31.0,176,19.0\n2335337,Female,2014-06-29 15:50:00,2014-06-29 15:56:00,5.766666666666668,82.9,cloudy,288,11.0,289,19.0\n2354482,Female,2014-06-30 18:55:00,2014-06-30 19:01:00,5.233333333333333,82.0,tstorms,118,19.0,94,19.0\n2346486,Female,2014-06-30 10:18:00,2014-06-30 10:35:00,16.75,78.1,cloudy,308,11.0,69,19.0\n2347448,Male,2014-06-30 11:52:00,2014-06-30 11:55:00,3.0,79.0,cloudy,115,23.0,226,15.0\n2339301,Male,2014-06-29 18:46:00,2014-06-29 19:11:00,24.86666666666667,84.2,cloudy,340,15.0,333,15.0\n2352786,Male,2014-06-30 17:34:00,2014-06-30 17:52:00,17.816666666666666,84.0,cloudy,25,23.0,334,19.0\n2345606,Female,2014-06-30 09:00:00,2014-06-30 09:16:00,15.25,78.1,cloudy,117,23.0,223,15.0\n2342850,Male,2014-06-30 00:22:00,2014-06-30 00:27:00,4.716666666666667,78.1,cloudy,131,15.0,347,15.0\n2338718,Male,2014-06-29 18:13:00,2014-06-29 18:26:00,13.05,84.2,cloudy,80,19.0,22,15.0\n2331687,Female,2014-06-29 13:39:00,2014-06-29 13:57:00,18.2,82.9,cloudy,255,31.0,100,23.0\n2351174,Male,2014-06-30 16:39:00,2014-06-30 17:05:00,25.566666666666666,84.0,cloudy,287,27.0,309,11.0\n2338195,Male,2014-06-29 17:50:00,2014-06-29 18:10:00,19.35,84.9,cloudy,199,15.0,177,15.0\n2342084,Male,2014-06-29 21:55:00,2014-06-29 22:01:00,6.416666666666668,79.0,cloudy,211,19.0,85,23.0\n2339036,Female,2014-06-29 18:32:00,2014-06-29 18:40:00,7.633333333333334,84.2,cloudy,94,19.0,289,19.0\n2336872,Male,2014-06-29 16:49:00,2014-06-29 16:55:00,6.4833333333333325,84.9,cloudy,211,19.0,53,19.0\n2334140,Female,2014-06-29 15:04:00,2014-06-29 15:20:00,16.35,82.9,cloudy,231,15.0,157,15.0\n2341669,Male,2014-06-29 21:11:00,2014-06-29 21:27:00,15.233333333333333,79.0,cloudy,174,23.0,35,39.0\n2347821,Male,2014-06-30 12:28:00,2014-06-30 12:33:00,5.25,82.0,cloudy,71,15.0,119,19.0\n2344522,Male,2014-06-30 08:10:00,2014-06-30 08:15:00,5.3,75.0,cloudy,91,31.0,68,23.0\n2354437,Male,2014-06-30 18:52:00,2014-06-30 19:05:00,12.716666666666667,82.0,tstorms,143,15.0,303,15.0\n2344125,Male,2014-06-30 07:49:00,2014-06-30 08:27:00,38.266666666666666,73.0,cloudy,306,15.0,81,39.0\n2350919,Male,2014-06-30 16:27:00,2014-06-30 16:36:00,8.466666666666667,84.0,cloudy,195,31.0,91,31.0\n2342909,Male,2014-06-30 00:54:00,2014-06-30 01:07:00,12.25,78.1,cloudy,115,23.0,304,15.0\n2345432,Male,2014-06-30 08:51:00,2014-06-30 08:56:00,4.516666666666667,75.0,cloudy,15,15.0,205,15.0\n2334840,Female,2014-06-29 15:29:00,2014-06-29 15:48:00,18.35,82.9,cloudy,181,31.0,233,15.0\n2350475,Male,2014-06-30 16:00:00,2014-06-30 16:10:00,9.716666666666667,84.0,cloudy,195,31.0,50,27.0\n2355045,Male,2014-06-30 21:26:00,2014-06-30 21:48:00,21.86666666666667,70.0,tstorms,210,19.0,246,11.0\n2344003,Male,2014-06-30 07:43:00,2014-06-30 07:49:00,6.333333333333332,73.0,cloudy,106,27.0,212,31.0\n2335553,Male,2014-06-29 15:57:00,2014-06-29 16:12:00,14.816666666666665,82.9,cloudy,184,19.0,72,15.0\n2346487,Female,2014-06-30 10:19:00,2014-06-30 10:32:00,13.866666666666667,78.1,cloudy,174,23.0,110,23.0\n2349434,Male,2014-06-30 14:42:00,2014-06-30 14:51:00,9.066666666666666,87.1,cloudy,196,19.0,283,23.0\n2343913,Male,2014-06-30 07:37:00,2014-06-30 07:48:00,10.233333333333333,73.0,cloudy,74,23.0,68,23.0\n2343484,Female,2014-06-30 07:04:00,2014-06-30 07:38:00,33.61666666666667,73.0,cloudy,141,23.0,68,23.0\n2338409,Male,2014-06-29 18:01:00,2014-06-29 18:04:00,2.9,84.2,cloudy,87,19.0,67,15.0\n2351092,Male,2014-06-30 16:35:00,2014-06-30 16:40:00,4.683333333333334,84.0,cloudy,181,31.0,140,19.0\n2351500,Male,2014-06-30 16:53:00,2014-06-30 17:06:00,12.883333333333333,84.0,cloudy,24,15.0,75,23.0\n2343212,Male,2014-06-30 06:32:00,2014-06-30 06:49:00,17.8,73.0,cloudy,273,15.0,66,19.0\n2346869,Male,2014-06-30 10:59:00,2014-06-30 11:24:00,25.15,78.1,cloudy,201,15.0,52,31.0\n2343072,Male,2014-06-30 05:35:00,2014-06-30 05:43:00,7.9,73.0,cloudy,255,31.0,341,19.0\n2353365,Male,2014-06-30 17:55:00,2014-06-30 18:01:00,6.25,84.0,cloudy,194,11.0,91,31.0\n2353269,Male,2014-06-30 17:50:00,2014-06-30 18:02:00,12.416666666666664,84.0,cloudy,91,31.0,57,15.0\n2349537,Male,2014-06-30 14:51:00,2014-06-30 15:08:00,16.416666666666668,87.1,cloudy,31,23.0,57,15.0\n2345231,Male,2014-06-30 08:41:00,2014-06-30 08:53:00,12.433333333333335,75.0,cloudy,273,15.0,37,19.0\n2334527,Male,2014-06-29 15:18:00,2014-06-29 15:29:00,11.033333333333333,82.9,cloudy,331,19.0,332,15.0\n2345398,Male,2014-06-30 08:49:00,2014-06-30 09:00:00,11.1,75.0,cloudy,66,19.0,264,19.0\n2332394,Female,2014-06-29 14:04:00,2014-06-29 14:18:00,14.333333333333336,84.0,cloudy,59,19.0,90,35.0\n2343297,Male,2014-06-30 06:40:00,2014-06-30 07:04:00,23.38333333333333,73.0,cloudy,190,15.0,91,31.0\n2354170,Female,2014-06-30 18:35:00,2014-06-30 18:43:00,8.65,82.0,tstorms,251,15.0,256,15.0\n2352806,Male,2014-06-30 17:34:00,2014-06-30 17:51:00,16.533333333333335,84.0,cloudy,268,15.0,85,23.0\n2350515,Male,2014-06-30 16:02:00,2014-06-30 16:05:00,2.75,84.0,cloudy,75,23.0,169,15.0\n2348687,Male,2014-06-30 13:40:00,2014-06-30 14:05:00,25.36666666666667,84.9,cloudy,164,23.0,211,19.0\n2335444,Female,2014-06-29 15:54:00,2014-06-29 16:00:00,6.166666666666668,82.9,cloudy,188,15.0,67,15.0\n2333255,Male,2014-06-29 14:32:00,2014-06-29 14:46:00,14.25,84.0,cloudy,260,19.0,61,15.0\n2345836,Male,2014-06-30 09:15:00,2014-06-30 09:28:00,12.916666666666664,78.1,cloudy,84,19.0,37,19.0\n2339377,Male,2014-06-29 18:50:00,2014-06-29 19:00:00,10.216666666666667,84.2,cloudy,56,19.0,26,31.0\n2343500,Male,2014-06-30 07:06:00,2014-06-30 07:31:00,25.36666666666667,73.0,cloudy,25,23.0,97,35.0\n2347315,Male,2014-06-30 11:41:00,2014-06-30 11:53:00,11.566666666666665,79.0,cloudy,67,15.0,240,23.0\n2338411,Female,2014-06-29 18:01:00,2014-06-29 18:28:00,26.966666666666665,84.2,cloudy,249,15.0,177,15.0\n2349085,Male,2014-06-30 14:13:00,2014-06-30 14:18:00,4.883333333333334,87.1,cloudy,77,23.0,49,27.0\n2348534,Male,2014-06-30 13:27:00,2014-06-30 13:29:00,2.6,84.9,cloudy,37,19.0,50,27.0\n2341035,Male,2014-06-29 20:25:00,2014-06-29 20:40:00,14.55,81.0,cloudy,58,19.0,141,23.0\n2341327,Female,2014-06-29 20:42:00,2014-06-29 20:52:00,9.716666666666667,81.0,cloudy,156,15.0,343,15.0\n2339224,Male,2014-06-29 18:43:00,2014-06-29 18:55:00,11.9,84.2,cloudy,324,15.0,301,19.0\n2350499,Male,2014-06-30 16:01:00,2014-06-30 16:14:00,12.8,84.0,cloudy,198,19.0,284,23.0\n2353698,Male,2014-06-30 18:08:00,2014-06-30 18:17:00,8.983333333333333,82.0,tstorms,229,19.0,127,15.0\n2351762,Female,2014-06-30 17:01:00,2014-06-30 17:17:00,16.5,84.0,cloudy,20,15.0,153,19.0\n2352373,Male,2014-06-30 17:19:00,2014-06-30 17:39:00,19.566666666666666,84.0,cloudy,196,19.0,210,19.0\n2353888,Male,2014-06-30 18:18:00,2014-06-30 18:25:00,6.5,82.0,tstorms,199,15.0,74,23.0\n2344985,Male,2014-06-30 08:30:00,2014-06-30 08:36:00,6.016666666666668,75.0,cloudy,192,39.0,37,19.0\n2340287,Male,2014-06-29 19:40:00,2014-06-29 19:42:00,2.283333333333333,82.0,cloudy,261,15.0,342,15.0\n2345720,Male,2014-06-30 09:08:00,2014-06-30 09:13:00,5.05,78.1,cloudy,77,23.0,98,15.0\n2347633,Male,2014-06-30 12:09:00,2014-06-30 12:25:00,16.283333333333335,82.0,cloudy,35,39.0,91,31.0\n2344564,Male,2014-06-30 08:12:00,2014-06-30 08:26:00,14.716666666666667,75.0,cloudy,120,15.0,36,31.0\n2331671,Female,2014-06-29 13:38:00,2014-06-29 13:52:00,14.366666666666667,82.9,cloudy,324,15.0,27,19.0\n2351598,Male,2014-06-30 16:56:00,2014-06-30 17:22:00,25.73333333333333,84.0,cloudy,44,27.0,129,15.0\n2349878,Male,2014-06-30 15:21:00,2014-06-30 15:30:00,9.116666666666667,84.9,cloudy,286,23.0,74,23.0\n2353819,Male,2014-06-30 18:15:00,2014-06-30 18:30:00,15.533333333333333,82.0,tstorms,181,31.0,144,15.0\n2341212,Male,2014-06-29 20:38:00,2014-06-29 20:42:00,4.25,81.0,cloudy,58,19.0,16,11.0\n2348351,Male,2014-06-30 13:07:00,2014-06-30 13:10:00,3.033333333333333,84.9,cloudy,128,15.0,214,15.0\n2349751,Male,2014-06-30 15:10:00,2014-06-30 15:21:00,11.45,84.9,cloudy,110,23.0,287,27.0\n2349555,Female,2014-06-30 14:54:00,2014-06-30 15:05:00,11.533333333333333,87.1,cloudy,333,15.0,285,15.0\n2343978,Male,2014-06-30 07:41:00,2014-06-30 07:44:00,2.75,73.0,cloudy,306,15.0,240,23.0\n2340762,Male,2014-06-29 20:07:00,2014-06-29 20:17:00,10.566666666666666,81.0,cloudy,76,39.0,33,27.0\n2340252,Male,2014-06-29 19:38:00,2014-06-29 19:56:00,17.883333333333333,82.0,cloudy,228,11.0,324,15.0\n2346858,Male,2014-06-30 10:57:00,2014-06-30 11:02:00,4.983333333333333,78.1,cloudy,301,19.0,140,19.0\n2341057,Female,2014-06-29 20:27:00,2014-06-29 20:35:00,7.583333333333332,81.0,cloudy,333,15.0,58,19.0\n2343714,Male,2014-06-30 07:24:00,2014-06-30 07:32:00,8.516666666666667,73.0,cloudy,174,23.0,43,43.0\n2345114,Male,2014-06-30 08:36:00,2014-06-30 08:43:00,6.883333333333334,75.0,cloudy,84,19.0,91,31.0\n2352369,Female,2014-06-30 17:19:00,2014-06-30 17:31:00,11.933333333333335,84.0,cloudy,48,27.0,66,19.0\n2339210,Male,2014-06-29 18:42:00,2014-06-29 18:52:00,9.683333333333334,84.2,cloudy,289,19.0,85,23.0\n2353279,Female,2014-06-30 17:50:00,2014-06-30 18:13:00,23.266666666666666,84.0,cloudy,116,15.0,332,15.0\n2334976,Male,2014-06-29 15:35:00,2014-06-29 15:48:00,13.05,82.9,cloudy,177,15.0,329,15.0\n2350311,Female,2014-06-30 15:49:00,2014-06-30 16:07:00,18.266666666666666,84.9,cloudy,337,19.0,144,15.0\n2353340,Male,2014-06-30 17:53:00,2014-06-30 18:04:00,10.716666666666667,84.0,cloudy,26,31.0,174,23.0\n2343441,Male,2014-06-30 07:00:00,2014-06-30 07:11:00,11.483333333333333,73.0,cloudy,231,15.0,244,19.0\n2353263,Male,2014-06-30 17:50:00,2014-06-30 17:59:00,8.933333333333334,84.0,cloudy,74,23.0,27,19.0\n2353089,Male,2014-06-30 17:43:00,2014-06-30 17:46:00,2.716666666666667,84.0,cloudy,240,23.0,254,15.0\n2350120,Male,2014-06-30 15:35:00,2014-06-30 15:48:00,12.65,84.9,cloudy,26,31.0,192,39.0\n2334194,Male,2014-06-29 15:06:00,2014-06-29 15:26:00,19.816666666666666,82.9,cloudy,123,15.0,13,19.0\n2354567,Male,2014-06-30 19:05:00,2014-06-30 19:55:00,50.23333333333333,73.0,tstorms,177,15.0,67,15.0\n2352764,Male,2014-06-30 17:33:00,2014-06-30 17:36:00,3.083333333333333,84.0,cloudy,24,15.0,99,19.0\n2350953,Male,2014-06-30 16:29:00,2014-06-30 16:52:00,22.766666666666666,84.0,cloudy,225,15.0,73,19.0\n2343435,Female,2014-06-30 06:58:00,2014-06-30 07:06:00,7.716666666666668,73.0,cloudy,255,31.0,37,19.0\n2343289,Male,2014-06-30 06:39:00,2014-06-30 06:46:00,7.1,73.0,cloudy,192,39.0,71,15.0\n2336898,Female,2014-06-29 16:50:00,2014-06-29 17:09:00,19.316666666666666,84.9,cloudy,61,15.0,152,15.0\n2343669,Male,2014-06-30 07:20:00,2014-06-30 07:25:00,4.566666666666666,73.0,cloudy,190,15.0,67,15.0\n2346331,Male,2014-06-30 10:01:00,2014-06-30 10:10:00,8.8,78.1,cloudy,169,15.0,169,15.0\n2350292,Male,2014-06-30 15:48:00,2014-06-30 15:57:00,8.85,84.9,cloudy,92,19.0,91,31.0\n2351212,Male,2014-06-30 16:41:00,2014-06-30 16:51:00,9.783333333333333,84.0,cloudy,52,31.0,174,23.0\n2334735,Male,2014-06-29 15:26:00,2014-06-29 15:35:00,9.083333333333334,82.9,cloudy,42,15.0,147,15.0\n2344026,Male,2014-06-30 07:44:00,2014-06-30 08:01:00,17.05,73.0,cloudy,192,39.0,331,19.0\n2347290,Male,2014-06-30 11:39:00,2014-06-30 11:49:00,9.933333333333334,79.0,cloudy,51,31.0,217,15.0\n2353202,Male,2014-06-30 17:47:00,2014-06-30 17:57:00,9.633333333333333,84.0,cloudy,195,31.0,173,15.0\n2352276,Female,2014-06-30 17:15:00,2014-06-30 17:21:00,5.066666666666666,84.0,cloudy,234,19.0,293,19.0\n2334290,Male,2014-06-29 15:09:00,2014-06-29 15:25:00,16.133333333333333,82.9,cloudy,324,15.0,188,15.0\n2354155,Female,2014-06-30 18:33:00,2014-06-30 18:42:00,8.55,82.0,tstorms,306,15.0,244,19.0\n2354555,Female,2014-06-30 19:03:00,2014-06-30 19:18:00,14.933333333333335,73.0,tstorms,280,11.0,15,15.0\n2352297,Male,2014-06-30 17:16:00,2014-06-30 17:35:00,18.616666666666667,84.0,cloudy,5,19.0,237,15.0\n2333663,Male,2014-06-29 14:47:00,2014-06-29 15:11:00,24.7,84.0,cloudy,306,15.0,325,15.0\n2338387,Female,2014-06-29 18:00:00,2014-06-29 18:12:00,11.45,84.2,cloudy,54,19.0,301,19.0\n2334706,Female,2014-06-29 15:24:00,2014-06-29 15:50:00,25.36666666666667,82.9,cloudy,260,19.0,58,19.0\n2352490,Male,2014-06-30 17:23:00,2014-06-30 17:38:00,15.1,84.0,cloudy,331,19.0,192,39.0\n2345567,Female,2014-06-30 08:58:00,2014-06-30 09:07:00,8.566666666666666,75.0,cloudy,192,39.0,217,15.0\n2343979,Male,2014-06-30 07:41:00,2014-06-30 07:52:00,10.366666666666667,73.0,cloudy,26,31.0,31,23.0\n2347648,Male,2014-06-30 12:11:00,2014-06-30 12:17:00,5.65,82.0,cloudy,72,15.0,120,15.0\n2343022,Male,2014-06-30 02:49:00,2014-06-30 02:56:00,6.4833333333333325,75.9,tstorms,325,15.0,344,15.0\n2344761,Male,2014-06-30 08:20:00,2014-06-30 08:43:00,22.28333333333333,75.0,cloudy,150,11.0,247,15.0\n2354841,Female,2014-06-30 20:34:00,2014-06-30 20:43:00,9.0,70.0,rain or snow,113,15.0,115,23.0\n2343301,Male,2014-06-30 06:41:00,2014-06-30 06:46:00,4.933333333333334,73.0,cloudy,319,15.0,13,19.0\n2347512,Female,2014-06-30 11:58:00,2014-06-30 12:03:00,4.916666666666667,79.0,cloudy,300,15.0,156,15.0\n2338442,Female,2014-06-29 18:03:00,2014-06-29 18:10:00,7.316666666666666,84.2,cloudy,184,19.0,279,15.0\n2331523,Female,2014-06-29 13:32:00,2014-06-29 13:36:00,3.9166666666666665,82.9,cloudy,177,15.0,313,19.0\n2341092,Female,2014-06-29 20:29:00,2014-06-29 20:36:00,6.516666666666668,81.0,cloudy,117,23.0,229,19.0\n2346782,Male,2014-06-30 10:48:00,2014-06-30 10:51:00,2.083333333333333,78.1,cloudy,94,19.0,141,23.0\n2343070,Male,2014-06-30 05:33:00,2014-06-30 05:49:00,15.75,73.0,cloudy,276,11.0,92,19.0\n2352743,Male,2014-06-30 17:32:00,2014-06-30 17:38:00,6.116666666666666,84.0,cloudy,75,23.0,66,19.0\n2345457,Male,2014-06-30 08:52:00,2014-06-30 09:09:00,16.383333333333333,75.0,cloudy,191,23.0,97,35.0\n2342802,Male,2014-06-29 23:58:00,2014-06-30 00:04:00,6.0,78.1,cloudy,174,23.0,50,27.0\n2345879,Female,2014-06-30 09:17:00,2014-06-30 09:26:00,8.55,78.1,cloudy,27,19.0,60,19.0\n2354004,Female,2014-06-30 18:25:00,2014-06-30 18:31:00,5.583333333333332,82.0,tstorms,84,19.0,233,15.0\n2345267,Female,2014-06-30 08:42:00,2014-06-30 08:49:00,6.616666666666666,75.0,cloudy,21,15.0,75,23.0\n2341906,Male,2014-06-29 21:33:00,2014-06-29 21:41:00,8.016666666666667,79.0,cloudy,337,19.0,301,19.0\n2353195,Male,2014-06-30 17:47:00,2014-06-30 17:57:00,10.3,84.0,cloudy,284,23.0,174,23.0\n2351576,Female,2014-06-30 16:52:00,2014-06-30 17:11:00,19.1,84.0,cloudy,47,19.0,192,39.0\n2343316,Female,2014-06-30 06:44:00,2014-06-30 06:56:00,12.933333333333335,73.0,cloudy,67,15.0,58,19.0\n2345673,Male,2014-06-30 09:03:00,2014-06-30 09:15:00,11.433333333333335,78.1,cloudy,91,31.0,52,31.0\n2350060,Female,2014-06-30 15:31:00,2014-06-30 15:40:00,9.0,84.9,cloudy,241,15.0,137,15.0\n2332386,Male,2014-06-29 14:03:00,2014-06-29 14:19:00,15.433333333333335,84.0,cloudy,56,19.0,106,27.0\n2354685,Male,2014-06-30 19:17:00,2014-06-30 19:21:00,3.95,73.0,tstorms,77,23.0,66,19.0\n2353543,Male,2014-06-30 18:02:00,2014-06-30 18:05:00,3.2666666666666666,82.0,tstorms,302,19.0,190,15.0\n2334165,Female,2014-06-29 15:05:00,2014-06-29 15:43:00,38.11666666666667,82.9,cloudy,294,15.0,177,15.0\n2335183,Male,2014-06-29 15:44:00,2014-06-29 16:08:00,23.86666666666667,82.9,cloudy,334,19.0,93,15.0\n2352396,Female,2014-06-30 17:20:00,2014-06-30 17:46:00,26.266666666666666,84.0,cloudy,208,15.0,219,11.0\n2333734,Male,2014-06-29 14:49:00,2014-06-29 14:58:00,9.233333333333333,84.0,cloudy,5,19.0,76,39.0\n2352908,Male,2014-06-30 17:38:00,2014-06-30 17:40:00,2.3833333333333333,84.0,cloudy,268,15.0,268,15.0\n2334646,Male,2014-06-29 15:23:00,2014-06-29 15:34:00,10.966666666666667,82.9,cloudy,58,19.0,143,15.0\n2347029,Male,2014-06-30 11:16:00,2014-06-30 11:20:00,3.733333333333333,79.0,cloudy,192,39.0,91,31.0\n2341046,Male,2014-06-29 20:26:00,2014-06-29 20:39:00,13.583333333333336,81.0,cloudy,116,15.0,216,15.0\n2351755,Male,2014-06-30 17:00:00,2014-06-30 17:06:00,6.016666666666668,84.0,cloudy,276,11.0,116,15.0\n2339161,Female,2014-06-29 18:39:00,2014-06-29 18:45:00,5.883333333333334,84.2,cloudy,24,15.0,47,19.0\n2332742,Male,2014-06-29 14:15:00,2014-06-29 14:25:00,9.166666666666666,84.0,cloudy,111,19.0,110,23.0\n2342671,Male,2014-06-29 23:20:00,2014-06-29 23:30:00,10.45,78.1,cloudy,76,39.0,110,23.0\n2339391,Male,2014-06-29 18:50:00,2014-06-29 18:57:00,6.666666666666668,84.2,cloudy,66,19.0,44,27.0\n2337832,Male,2014-06-29 17:32:00,2014-06-29 17:42:00,10.433333333333334,84.9,cloudy,138,15.0,110,23.0\n2352083,Female,2014-06-30 17:10:00,2014-06-30 17:17:00,7.183333333333334,84.0,cloudy,26,31.0,43,43.0\n2336923,Female,2014-06-29 16:51:00,2014-06-29 16:59:00,8.133333333333333,84.9,cloudy,324,15.0,144,15.0\n2353328,Male,2014-06-30 17:53:00,2014-06-30 18:00:00,7.7,84.0,cloudy,75,23.0,56,19.0\n2344939,Female,2014-06-30 08:28:00,2014-06-30 08:33:00,4.766666666666667,75.0,cloudy,290,15.0,123,15.0\n2337622,Male,2014-06-29 17:22:00,2014-06-29 17:24:00,2.4166666666666665,84.9,cloudy,48,27.0,74,23.0\n2353293,Male,2014-06-30 17:51:00,2014-06-30 18:01:00,10.216666666666667,84.0,cloudy,98,15.0,195,31.0\n2353640,Male,2014-06-30 18:06:00,2014-06-30 18:17:00,10.583333333333334,82.0,tstorms,69,19.0,222,19.0\n2354232,Male,2014-06-30 18:38:00,2014-06-30 18:44:00,6.666666666666668,82.0,tstorms,198,19.0,66,19.0\n2343124,Male,2014-06-30 06:07:00,2014-06-30 06:10:00,3.066666666666667,73.0,cloudy,173,15.0,173,15.0\n2344561,Female,2014-06-30 08:12:00,2014-06-30 08:27:00,15.666666666666664,75.0,cloudy,183,15.0,91,31.0\n2353009,Male,2014-06-30 17:41:00,2014-06-30 17:52:00,11.966666666666667,84.0,cloudy,195,31.0,174,23.0\n2340717,Male,2014-06-29 20:04:00,2014-06-29 20:16:00,12.133333333333333,81.0,cloudy,177,15.0,313,19.0\n2335547,Male,2014-06-29 15:57:00,2014-06-29 16:18:00,20.883333333333333,82.9,cloudy,143,15.0,17,15.0\n2340288,Male,2014-06-29 19:40:00,2014-06-29 20:01:00,20.816666666666666,82.0,cloudy,220,19.0,309,11.0\n2352939,Female,2014-06-30 17:36:00,2014-06-30 17:50:00,14.416666666666664,84.0,cloudy,308,11.0,239,15.0\n2337929,Male,2014-06-29 17:36:00,2014-06-29 18:02:00,25.55,84.9,cloudy,62,27.0,284,23.0\n2346751,Female,2014-06-30 10:46:00,2014-06-30 11:12:00,25.41666666666667,78.1,cloudy,28,15.0,113,15.0\n2345641,Male,2014-06-30 09:03:00,2014-06-30 09:15:00,11.933333333333335,78.1,cloudy,198,19.0,86,15.0\n2353343,Male,2014-06-30 17:53:00,2014-06-30 18:01:00,8.116666666666667,84.0,cloudy,51,31.0,198,19.0\n2347695,Male,2014-06-30 12:16:00,2014-06-30 12:32:00,16.316666666666666,82.0,cloudy,232,23.0,347,15.0\n2354109,Female,2014-06-30 18:31:00,2014-06-30 18:33:00,2.533333333333333,82.0,tstorms,60,19.0,93,15.0\n2353112,Male,2014-06-30 17:44:00,2014-06-30 17:47:00,3.15,84.0,cloudy,240,23.0,254,15.0\n2353636,Female,2014-06-30 18:06:00,2014-06-30 18:14:00,8.233333333333333,82.0,tstorms,283,23.0,59,19.0\n2346531,Female,2014-06-30 10:25:00,2014-06-30 10:37:00,12.616666666666667,78.1,cloudy,111,19.0,26,31.0\n2350667,Female,2014-06-30 16:12:00,2014-06-30 16:29:00,16.833333333333332,84.0,cloudy,331,19.0,163,15.0\n2352263,Male,2014-06-30 17:13:00,2014-06-30 17:23:00,10.216666666666667,84.0,cloudy,36,31.0,134,19.0\n2343139,Male,2014-06-30 06:15:00,2014-06-30 06:26:00,10.483333333333333,73.0,cloudy,91,31.0,5,19.0\n2346334,Female,2014-06-30 10:02:00,2014-06-30 10:09:00,7.4,78.1,cloudy,278,15.0,184,19.0\n2352069,Male,2014-06-30 17:10:00,2014-06-30 17:18:00,8.55,84.0,cloudy,111,19.0,91,31.0\n2331932,Female,2014-06-29 13:48:00,2014-06-29 13:58:00,10.4,82.9,cloudy,20,15.0,94,19.0\n2331609,Female,2014-06-29 13:35:00,2014-06-29 13:55:00,19.766666666666666,82.9,cloudy,35,39.0,177,15.0\n2343604,Male,2014-06-30 07:15:00,2014-06-30 07:22:00,6.9833333333333325,73.0,cloudy,321,19.0,49,27.0\n2333195,Female,2014-06-29 14:30:00,2014-06-29 14:41:00,11.316666666666665,84.0,cloudy,165,19.0,154,15.0\n2337860,Male,2014-06-29 17:33:00,2014-06-29 17:40:00,7.25,84.9,cloudy,247,15.0,322,15.0\n2343204,Male,2014-06-30 06:31:00,2014-06-30 06:43:00,12.5,73.0,cloudy,185,11.0,327,19.0\n2343372,Male,2014-06-30 06:49:00,2014-06-30 06:54:00,5.533333333333332,73.0,cloudy,50,27.0,197,19.0\n2353786,Male,2014-06-30 18:13:00,2014-06-30 18:16:00,2.783333333333333,82.0,tstorms,311,15.0,243,15.0\n2348832,Male,2014-06-30 13:51:00,2014-06-30 13:58:00,6.966666666666668,84.9,cloudy,215,15.0,217,15.0\n2347916,Male,2014-06-30 12:35:00,2014-06-30 12:45:00,10.116666666666667,82.0,cloudy,99,19.0,100,23.0\n2351389,Male,2014-06-30 16:49:00,2014-06-30 16:53:00,3.816666666666667,84.0,cloudy,100,23.0,47,19.0\n2347162,Female,2014-06-30 11:28:00,2014-06-30 11:38:00,9.95,79.0,cloudy,5,19.0,81,39.0\n2351953,Male,2014-06-30 17:07:00,2014-06-30 17:22:00,15.866666666666667,84.0,cloudy,80,19.0,5,19.0\n2343136,Male,2014-06-30 06:14:00,2014-06-30 06:26:00,12.016666666666667,73.0,cloudy,137,15.0,50,27.0\n2345949,Female,2014-06-30 09:23:00,2014-06-30 09:32:00,8.833333333333334,78.1,cloudy,195,31.0,100,23.0\n2336436,Male,2014-06-29 16:31:00,2014-06-29 16:43:00,11.983333333333333,84.9,cloudy,129,15.0,342,15.0\n2353707,Male,2014-06-30 18:09:00,2014-06-30 18:20:00,11.616666666666667,82.0,tstorms,306,15.0,316,19.0\n2340111,Male,2014-06-29 19:31:00,2014-06-29 19:42:00,11.2,82.0,cloudy,338,15.0,341,19.0\n2340435,Female,2014-06-29 19:44:00,2014-06-29 19:50:00,5.716666666666668,82.0,cloudy,300,15.0,332,15.0\n2352062,Male,2014-06-30 17:09:00,2014-06-30 17:19:00,9.75,84.0,cloudy,287,27.0,110,23.0\n2336716,Female,2014-06-29 16:43:00,2014-06-29 17:04:00,21.78333333333333,84.9,cloudy,131,15.0,157,15.0\n2344547,Male,2014-06-30 08:11:00,2014-06-30 08:26:00,15.133333333333333,75.0,cloudy,171,11.0,36,31.0\n2347859,Male,2014-06-30 12:30:00,2014-06-30 12:55:00,24.016666666666666,82.0,cloudy,334,19.0,173,15.0\n2345740,Male,2014-06-30 09:09:00,2014-06-30 09:18:00,8.566666666666666,78.1,cloudy,91,31.0,43,43.0\n2331961,Male,2014-06-29 13:48:00,2014-06-29 13:56:00,7.566666666666666,82.9,cloudy,196,19.0,43,43.0\n2349634,Female,2014-06-30 15:00:00,2014-06-30 15:12:00,12.483333333333333,84.9,cloudy,287,27.0,287,27.0\n2347818,Male,2014-06-30 12:27:00,2014-06-30 12:33:00,5.95,82.0,cloudy,36,31.0,134,19.0\n2344695,Female,2014-06-30 08:18:00,2014-06-30 08:30:00,12.616666666666667,75.0,cloudy,192,39.0,110,23.0\n2351968,Female,2014-06-30 17:07:00,2014-06-30 17:22:00,15.55,84.0,cloudy,48,27.0,332,15.0\n2349769,Female,2014-06-30 15:11:00,2014-06-30 15:29:00,17.7,84.9,cloudy,69,19.0,143,15.0\n2339858,Male,2014-06-29 19:17:00,2014-06-29 19:22:00,4.883333333333334,82.0,cloudy,223,15.0,225,15.0\n2347741,Female,2014-06-30 12:16:00,2014-06-30 13:14:00,58.56666666666667,82.0,cloudy,52,31.0,52,31.0\n2345428,Female,2014-06-30 08:51:00,2014-06-30 09:00:00,8.55,75.0,cloudy,346,15.0,233,15.0\n2353422,Male,2014-06-30 17:57:00,2014-06-30 18:05:00,8.15,84.0,cloudy,68,23.0,282,15.0\n"
  },
  {
    "path": "docs/source/examples/demo/next_purchase/__init__.py",
    "content": "import os\nimport pandas as pd\nimport requests\nimport tarfile\nfrom demo import PWD, utils\nfrom tqdm import tqdm\n\nURL = r\"https://s3.amazonaws.com/instacart-datasets/instacart_online_grocery_shopping_2017_05_01.tar.gz\"\nPWD = os.path.join(PWD, \"next_purchase\")\n\n\ndef _add_time(df, start=\"2015-01-01\"):\n    def timedelta(value, string):\n        return pd.Timedelta(string.format(value))\n\n    def process_orders(user):\n        orders = user.groupby(\"order_id\")\n        days = orders.days_since_prior_order.first()\n        days = days.cumsum().apply(timedelta, string=\"{}d\")\n        days = days.add(pd.Timestamp(start))\n        hour_of_day = orders.order_hour_of_day.first()\n        hour_of_day = hour_of_day.apply(timedelta, string=\"{}h\")\n        order_time = days.add(hour_of_day)\n        return order_time\n\n    df.days_since_prior_order.fillna(0, inplace=True)\n    order_time = df.groupby(\"user_id\").apply(process_orders).rename(\"order_time\")\n\n    columns = [\n        \"order_number\",\n        \"order_dow\",\n        \"order_hour_of_day\",\n        \"days_since_prior_order\",\n        \"eval_set\",\n    ]\n\n    df.drop(columns, axis=1, inplace=True)\n    df = df.merge(order_time.reset_index(), on=[\"user_id\", \"order_id\"])\n    return df\n\n\ndef _data(nrows=1000000):\n    output = os.path.join(PWD, \"download\")\n    path = os.path.join(output, \"instacart_2017_05_01\")\n    if not os.path.exists(path):\n        utils.download(URL, output)\n\n    file = os.path.join(path, \"order_products__prior.csv\")\n    order_products = pd.read_csv(file, nrows=nrows)\n    file = os.path.join(path, \"products.csv\")\n    products = pd.read_csv(file)\n    file = os.path.join(path, \"departments.csv\")\n    departments = pd.read_csv(file)\n    file = os.path.join(path, \"orders.csv\")\n    orders = pd.read_csv(file, nrows=nrows)\n\n    df = order_products.merge(products).merge(departments).merge(orders)\n    df = df.pipe(_add_time)\n    return df\n\n\ndef _read(file):\n    path = os.path.join(PWD, file)\n    df = pd.read_csv(path, parse_dates=[\"order_time\"], index_col=\"id\")\n    return df\n\n\ndef load_sample():\n    return _read(\"sample.csv\")\n"
  },
  {
    "path": "docs/source/examples/demo/next_purchase/sample.csv",
    "content": "id,order_id,product_id,add_to_cart_order,reordered,product_name,aisle_id,department_id,department,user_id,order_time\n24,623,33120,1,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-01-04 12:00:00\n25,623,40706,3,1,Organic Grape Tomatoes,123,4,produce,37804,2015-01-04 12:00:00\n26,623,38777,5,1,Organic Green Seedless Grapes,123,4,produce,37804,2015-01-04 12:00:00\n27,623,34126,9,1,Organic Italian Parsley Bunch,16,4,produce,37804,2015-01-04 12:00:00\n28,623,19678,4,1,Organic Russet Potato,83,4,produce,37804,2015-01-04 12:00:00\n29,623,10749,11,1,Organic Red Bell Pepper,83,4,produce,37804,2015-01-04 12:00:00\n30,623,27521,2,1,Organic Lacinato (Dinosaur) Kale,83,4,produce,37804,2015-01-04 12:00:00\n31,623,4562,6,1,English Seedless Cucumber,83,4,produce,37804,2015-01-04 12:00:00\n32,623,47788,7,1,Honeydew Melon,24,4,produce,37804,2015-01-04 12:00:00\n33,623,14575,8,1,Organic Cello Lettuce,83,4,produce,37804,2015-01-04 12:00:00\n34,623,32052,10,1,Organic Brown Rice Cake Salt-Free,78,19,snacks,37804,2015-01-04 12:00:00\n35,726,33120,3,1,Organic Egg Whites,86,16,dairy eggs,57362,2015-01-08 17:00:00\n36,726,32655,5,1,Organic Large Grade AA Brown Eggs,86,16,dairy eggs,57362,2015-01-08 17:00:00\n37,726,17794,4,1,Carrots,83,4,produce,57362,2015-01-08 17:00:00\n38,726,31915,2,1,Organic Red Delicious Apple,24,4,produce,57362,2015-01-08 17:00:00\n39,726,25181,6,1,Fragrance Free Automatic Dishwasher Tablets,74,17,household,57362,2015-01-08 17:00:00\n40,726,46737,7,1,2x Ultra Liquid Laundry Detergent,75,17,household,57362,2015-01-08 17:00:00\n41,726,24489,1,1,Organic Whole Strawberries,116,1,frozen,57362,2015-01-08 17:00:00\n183,10084,33120,10,1,Organic Egg Whites,86,16,dairy eggs,6851,2015-01-12 22:00:00\n184,10084,432,11,1,Vanilla Almond Breeze Almond Milk,91,16,dairy eggs,6851,2015-01-12 22:00:00\n185,10084,21903,8,1,Organic Baby Spinach,123,4,produce,6851,2015-01-12 22:00:00\n186,10084,13176,7,1,Bag of Organic Bananas,24,4,produce,6851,2015-01-12 22:00:00\n187,10084,47766,6,1,Organic Avocado,24,4,produce,6851,2015-01-12 22:00:00\n188,10084,21137,14,0,Organic Strawberries,24,4,produce,6851,2015-01-12 22:00:00\n189,10084,35547,9,1,Organic Baby Kale,83,4,produce,6851,2015-01-12 22:00:00\n190,10084,39275,13,1,Organic Blueberries,123,4,produce,6851,2015-01-12 22:00:00\n191,10084,5876,5,1,Organic Lemon,24,4,produce,6851,2015-01-12 22:00:00\n192,10084,19057,12,1,Organic Large Extra Fancy Fuji Apple,24,4,produce,6851,2015-01-12 22:00:00\n193,10084,36702,4,1,Active Electrolyte Enhanced Drink Tabs 10 Servings Tri-Berry,47,11,personal care,6851,2015-01-12 22:00:00\n194,10084,4352,1,1,Beverage Tab Wild Berry,47,11,personal care,6851,2015-01-12 22:00:00\n195,10084,40589,3,1,Lemonlime Electrolyte Tabs,90,7,beverages,6851,2015-01-12 22:00:00\n196,10084,20574,2,1,Roasted Turkey,96,20,deli,6851,2015-01-12 22:00:00\n318,13368,33120,4,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-01-07 18:00:00\n319,13368,39275,1,1,Organic Blueberries,123,4,produce,37804,2015-01-07 18:00:00\n320,13368,40706,8,1,Organic Grape Tomatoes,123,4,produce,37804,2015-01-07 18:00:00\n321,13368,6873,7,1,Organic Iceberg Lettuce,83,4,produce,37804,2015-01-07 18:00:00\n322,13368,10749,5,1,Organic Red Bell Pepper,83,4,produce,37804,2015-01-07 18:00:00\n323,13368,27521,6,1,Organic Lacinato (Dinosaur) Kale,83,4,produce,37804,2015-01-07 18:00:00\n324,13368,4562,9,1,English Seedless Cucumber,83,4,produce,37804,2015-01-07 18:00:00\n325,13368,10974,3,1,Gluten Free Rice & Shine Hot Cereal,130,14,breakfast,37804,2015-01-07 18:00:00\n326,13368,24489,2,1,Organic Whole Strawberries,116,1,frozen,37804,2015-01-07 18:00:00\n391,18214,33120,1,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-01-30 19:00:00\n392,18214,30391,2,1,Organic Cucumber,83,4,produce,37804,2015-01-30 19:00:00\n393,18214,6873,6,0,Organic Iceberg Lettuce,83,4,produce,37804,2015-01-30 19:00:00\n394,18214,7500,4,1,Organic Vanilla Extract,17,13,pantry,37804,2015-01-30 19:00:00\n395,18214,39562,5,0,\"Baking Soda Toothpowder, Dazzling Mint\",20,11,personal care,37804,2015-01-30 19:00:00\n396,18214,10974,3,1,Gluten Free Rice & Shine Hot Cereal,130,14,breakfast,37804,2015-01-30 19:00:00\n641,26249,33120,5,1,Organic Egg Whites,86,16,dairy eggs,8167,2015-01-08 11:00:00\n642,26249,20842,3,1,Total 0% Greek Yogurt,120,16,dairy eggs,8167,2015-01-08 11:00:00\n643,26249,21903,6,1,Organic Baby Spinach,123,4,produce,8167,2015-01-08 11:00:00\n644,26249,21137,7,1,Organic Strawberries,24,4,produce,8167,2015-01-08 11:00:00\n645,26249,49683,1,1,Cucumber Kirby,83,4,produce,8167,2015-01-08 11:00:00\n646,26249,8277,4,1,Apple Honeycrisp Organic,24,4,produce,8167,2015-01-08 11:00:00\n647,26249,45007,2,1,Organic Zucchini,83,4,produce,8167,2015-01-08 11:00:00\n648,26249,10343,8,1,Teriyaki Chicken Bowl,38,1,frozen,8167,2015-01-08 11:00:00\n649,26249,19174,9,1,Chicken Enchilada Bowl,38,1,frozen,8167,2015-01-08 11:00:00\n1078,41962,33120,5,1,Organic Egg Whites,86,16,dairy eggs,57362,2015-01-23 17:00:00\n1079,41962,12384,11,1,Organic Lactose Free 1% Lowfat Milk,91,16,dairy eggs,57362,2015-01-23 17:00:00\n1080,41962,23955,23,0,Vanilla Soy Milk,91,16,dairy eggs,57362,2015-01-23 17:00:00\n1081,41962,27086,9,1,Half & Half,53,16,dairy eggs,57362,2015-01-23 17:00:00\n1082,41962,46820,10,1,Vanilla Pure Almond Milk,91,16,dairy eggs,57362,2015-01-23 17:00:00\n1083,41962,21903,21,0,Organic Baby Spinach,123,4,produce,57362,2015-01-23 17:00:00\n1084,41962,13176,1,1,Bag of Organic Bananas,24,4,produce,57362,2015-01-23 17:00:00\n1085,41962,31915,2,1,Organic Red Delicious Apple,24,4,produce,57362,2015-01-23 17:00:00\n1086,41962,45007,20,0,Organic Zucchini,83,4,produce,57362,2015-01-23 17:00:00\n1087,41962,17284,14,1,Organic Sugar Snap Peas,83,4,produce,57362,2015-01-23 17:00:00\n1088,41962,41220,18,1,Organic Romaine Lettuce,83,4,produce,57362,2015-01-23 17:00:00\n1089,41962,3896,4,1,Organic Honey Sweet Whole Wheat Bread,112,3,bakery,57362,2015-01-23 17:00:00\n1090,41962,48415,7,1,Big California Sourdough Bread,112,3,bakery,57362,2015-01-23 17:00:00\n1091,41962,46011,22,0,Honest Sweet Orange Vanilla Detangling Conditioner,22,11,personal care,57362,2015-01-23 17:00:00\n1092,41962,25069,15,1,Organic Aged Earl Grey Tea,94,7,beverages,57362,2015-01-23 17:00:00\n1093,41962,45635,17,1,Blueberry B Fruit Smoothie,31,7,beverages,57362,2015-01-23 17:00:00\n1094,41962,7677,16,1,Strawberry Banana Flavored 4 Juice Smoothie Blend,98,7,beverages,57362,2015-01-23 17:00:00\n1095,41962,5764,12,1,Organic SprouTofu Teriyaki Tofu Cutlets,14,20,deli,57362,2015-01-23 17:00:00\n1096,41962,1103,3,1,Hickory Smoked Turkey Breast,96,20,deli,57362,2015-01-23 17:00:00\n1097,41962,30290,8,1,100% Recycled Bath Tissue Rolls,54,17,household,57362,2015-01-23 17:00:00\n1098,41962,47008,13,1,Sliced Water Chestnuts,66,6,international,57362,2015-01-23 17:00:00\n1099,41962,24489,6,1,Organic Whole Strawberries,116,1,frozen,57362,2015-01-23 17:00:00\n1100,41962,45013,19,0,Apple Sauce,99,15,canned goods,57362,2015-01-23 17:00:00\n1211,45253,33120,4,1,Organic Egg Whites,86,16,dairy eggs,8167,2015-01-16 21:00:00\n1212,45253,20842,1,1,Total 0% Greek Yogurt,120,16,dairy eggs,8167,2015-01-16 21:00:00\n1213,45253,8277,2,1,Apple Honeycrisp Organic,24,4,produce,8167,2015-01-16 21:00:00\n1214,45253,21077,3,1,Cara Cara Navel Orange,24,4,produce,8167,2015-01-16 21:00:00\n1215,45253,34565,5,1,Peanut Butter Whole Grain Clusters,57,14,breakfast,8167,2015-01-16 21:00:00\n1216,45253,28682,8,0,Chocolate Peanut Butter Cup Gelato,37,1,frozen,8167,2015-01-16 21:00:00\n1217,45253,10343,6,1,Teriyaki Chicken Bowl,38,1,frozen,8167,2015-01-16 21:00:00\n1218,45253,19174,7,1,Chicken Enchilada Bowl,38,1,frozen,8167,2015-01-16 21:00:00\n1361,50496,33120,2,1,Organic Egg Whites,86,16,dairy eggs,32620,2015-01-31 13:00:00\n1362,50496,24838,16,1,Unsweetened Almondmilk,91,16,dairy eggs,32620,2015-01-31 13:00:00\n1363,50496,13176,1,1,Bag of Organic Bananas,24,4,produce,32620,2015-01-31 13:00:00\n1364,50496,8518,23,1,Organic Red Onion,83,4,produce,32620,2015-01-31 13:00:00\n1365,50496,40706,15,1,Organic Grape Tomatoes,123,4,produce,32620,2015-01-31 13:00:00\n1366,50496,27104,3,1,Fresh Cauliflower,83,4,produce,32620,2015-01-31 13:00:00\n1367,50496,44359,21,0,Organic Small Bunch Celery,83,4,produce,32620,2015-01-31 13:00:00\n1368,50496,47734,24,0,Organic Green Cabbage,83,4,produce,32620,2015-01-31 13:00:00\n1369,50496,40723,20,1,Organic Cripps Pink Apples,24,4,produce,32620,2015-01-31 13:00:00\n1370,50496,41220,22,0,Organic Romaine Lettuce,83,4,produce,32620,2015-01-31 13:00:00\n1371,50496,10913,19,0,Gluten Free Rice Almond Bread,112,3,bakery,32620,2015-01-31 13:00:00\n1372,50496,2996,13,0,Honeysuckle Hand Soap,25,11,personal care,32620,2015-01-31 13:00:00\n1373,50496,34137,18,0,Chocolate Sea Salt,3,19,snacks,32620,2015-01-31 13:00:00\n1374,50496,9515,11,1,Natural Classic Pork Breakfast Sausage,52,1,frozen,32620,2015-01-31 13:00:00\n1375,50496,436,8,1,Petite Brussels Sprouts,116,1,frozen,32620,2015-01-31 13:00:00\n1376,50496,31263,9,1,Breaded Fish Sticks,34,1,frozen,32620,2015-01-31 13:00:00\n1377,50496,18677,14,0,\"Minis, Coconut Milk, Non-Dairy Frozen Dessert, no sugar added Vanilla Bar\",37,1,frozen,32620,2015-01-31 13:00:00\n1378,50496,7461,6,1,Pinto Beans No Salt Added,59,15,canned goods,32620,2015-01-31 13:00:00\n1379,50496,28849,5,1,No Salt Added Black Beans,59,15,canned goods,32620,2015-01-31 13:00:00\n1380,50496,22395,7,1,Tomato Sauce,81,15,canned goods,32620,2015-01-31 13:00:00\n1381,50496,20670,12,1,Organic Lentil Vegetable Soup,69,15,canned goods,32620,2015-01-31 13:00:00\n1382,50496,5024,10,1,Dark Red Kidney Beans No Salt Added,59,15,canned goods,32620,2015-01-31 13:00:00\n1383,50496,16131,4,1,\"Organic Chicken Noodle Soup, Reduced Sodium\",69,15,canned goods,32620,2015-01-31 13:00:00\n1384,50496,18542,17,0,Protein Bar Mint Chocolate,100,21,missing,32620,2015-01-31 13:00:00\n1637,60837,33120,5,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-02-01 16:00:00\n1638,60837,13176,2,1,Bag of Organic Bananas,24,4,produce,37804,2015-02-01 16:00:00\n1639,60837,40706,3,1,Organic Grape Tomatoes,123,4,produce,37804,2015-02-01 16:00:00\n1640,60837,38777,7,1,Organic Green Seedless Grapes,123,4,produce,37804,2015-02-01 16:00:00\n1641,60837,12496,4,1,Radish,83,4,produce,37804,2015-02-01 16:00:00\n1642,60837,27521,6,1,Organic Lacinato (Dinosaur) Kale,83,4,produce,37804,2015-02-01 16:00:00\n1643,60837,43768,1,1,Organic Bell Pepper,83,4,produce,37804,2015-02-01 16:00:00\n2453,90352,33120,2,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-02-03 19:00:00\n2454,90352,13176,1,1,Bag of Organic Bananas,24,4,produce,37804,2015-02-03 19:00:00\n2455,90352,42265,5,1,Organic Baby Carrots,123,4,produce,37804,2015-02-03 19:00:00\n2456,90352,40706,3,1,Organic Grape Tomatoes,123,4,produce,37804,2015-02-03 19:00:00\n2457,90352,19678,7,1,Organic Russet Potato,83,4,produce,37804,2015-02-03 19:00:00\n2458,90352,10749,10,1,Organic Red Bell Pepper,83,4,produce,37804,2015-02-03 19:00:00\n2459,90352,47759,6,1,Mandarin Oranges,24,4,produce,37804,2015-02-03 19:00:00\n2460,90352,11526,8,1,Napa Cabbage,83,4,produce,37804,2015-02-03 19:00:00\n2461,90352,8021,4,1,100% Recycled Paper Towels,54,17,household,37804,2015-02-03 19:00:00\n2462,90352,20995,9,1,Organic Broccoli Florets,116,1,frozen,37804,2015-02-03 19:00:00\n2471,92051,33120,3,1,Organic Egg Whites,86,16,dairy eggs,8167,2015-01-21 09:00:00\n2472,92051,19348,9,1,Fat Free Milk,84,16,dairy eggs,8167,2015-01-21 09:00:00\n2473,92051,20842,1,1,Total 0% Greek Yogurt,120,16,dairy eggs,8167,2015-01-21 09:00:00\n2474,92051,49683,6,1,Cucumber Kirby,83,4,produce,8167,2015-01-21 09:00:00\n2475,92051,8277,4,1,Apple Honeycrisp Organic,24,4,produce,8167,2015-01-21 09:00:00\n2476,92051,21077,2,1,Cara Cara Navel Orange,24,4,produce,8167,2015-01-21 09:00:00\n2477,92051,15803,5,1,Organic Sweet Potato Puree,17,13,pantry,8167,2015-01-21 09:00:00\n2478,92051,13877,7,1,Smoked Salmon,15,12,meat seafood,8167,2015-01-21 09:00:00\n2479,92051,10343,8,1,Teriyaki Chicken Bowl,38,1,frozen,8167,2015-01-21 09:00:00\n2523,96076,33120,5,1,Organic Egg Whites,86,16,dairy eggs,6851,2015-02-07 19:00:00\n2524,96076,47144,4,0,Unsweetened Original Almond Breeze Almond Milk,91,16,dairy eggs,6851,2015-02-07 19:00:00\n2525,96076,25533,2,1,Vegan Chao Creamy Original Cheese Slices,21,16,dairy eggs,6851,2015-02-07 19:00:00\n2526,96076,35090,3,1,\"Chao, Vegan, Coconut Herb, Slices\",21,16,dairy eggs,6851,2015-02-07 19:00:00\n2527,96076,13176,11,1,Bag of Organic Bananas,24,4,produce,6851,2015-02-07 19:00:00\n2528,96076,35547,1,1,Organic Baby Kale,83,4,produce,6851,2015-02-07 19:00:00\n2529,96076,1360,7,1,Crunchy Peanut Butter,88,13,pantry,6851,2015-02-07 19:00:00\n2530,96076,18027,6,0,Ezekiel 4:9 Bread Organic Sprouted Whole Grain,112,3,bakery,6851,2015-02-07 19:00:00\n2531,96076,24810,9,0,Organic Lightly Salted Brown Rice Cakes,78,19,snacks,6851,2015-02-07 19:00:00\n2532,96076,42719,8,1,Natural Premium Coconut Water,98,7,beverages,6851,2015-02-07 19:00:00\n2533,96076,20574,10,0,Roasted Turkey,96,20,deli,6851,2015-02-07 19:00:00\n2646,102955,33120,7,1,Organic Egg Whites,86,16,dairy eggs,57362,2015-02-01 16:00:00\n2647,102955,651,14,1,Organic Salted Butter,36,16,dairy eggs,57362,2015-02-01 16:00:00\n2648,102955,13176,1,1,Bag of Organic Bananas,24,4,produce,57362,2015-02-01 16:00:00\n2649,102955,31915,4,1,Organic Red Delicious Apple,24,4,produce,57362,2015-02-01 16:00:00\n2650,102955,6860,12,1,Organic Balsamic Vinaigrette,89,13,pantry,57362,2015-02-01 16:00:00\n2651,102955,3896,3,1,Organic Honey Sweet Whole Wheat Bread,112,3,bakery,57362,2015-02-01 16:00:00\n2652,102955,48415,15,1,Big California Sourdough Bread,112,3,bakery,57362,2015-02-01 16:00:00\n2653,102955,36302,11,0,\"Soap, Coconut Creme\",25,11,personal care,57362,2015-02-01 16:00:00\n2654,102955,13605,9,1,Frosted berry Strawberry Toaster Pastries,48,14,breakfast,57362,2015-02-01 16:00:00\n2655,102955,25767,13,1,Organic Multi Grain Squares Cereal,121,14,breakfast,57362,2015-02-01 16:00:00\n2656,102955,23288,6,1,Distilled Water,115,7,beverages,57362,2015-02-01 16:00:00\n2657,102955,18873,10,1,Organic Earl Grey Black Tea 16 Count,94,7,beverages,57362,2015-02-01 16:00:00\n2658,102955,1103,2,1,Hickory Smoked Turkey Breast,96,20,deli,57362,2015-02-01 16:00:00\n2659,102955,30290,8,1,100% Recycled Bath Tissue Rolls,54,17,household,57362,2015-02-01 16:00:00\n2660,102955,24489,5,1,Organic Whole Strawberries,116,1,frozen,57362,2015-02-01 16:00:00\n3291,13331,33754,1,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-03 09:00:00\n3292,13331,18523,4,1,Total 2% All Natural Greek Strained Yogurt with Honey,120,16,dairy eggs,31606,2015-01-03 09:00:00\n3293,13331,30169,5,1,Total 2% All Natural Plain Greek Yogurt,120,16,dairy eggs,31606,2015-01-03 09:00:00\n3294,13331,4957,2,1,Total 2% Lowfat Greek Strained Yogurt With Blueberry,120,16,dairy eggs,31606,2015-01-03 09:00:00\n3295,13331,33787,6,1,Total 2% Lowfat Greek Strained Yogurt with Peach,120,16,dairy eggs,31606,2015-01-03 09:00:00\n3296,13331,25340,7,1,Large Yellow Flesh Nectarine,24,4,produce,31606,2015-01-03 09:00:00\n3297,13331,30756,9,1,Mandarin Clementine  Bag,24,4,produce,31606,2015-01-03 09:00:00\n3298,13331,43442,8,1,Veggie Tray,123,4,produce,31606,2015-01-03 09:00:00\n3299,13331,48559,3,1,Synergy Organic Kombucha Gingerberry,31,7,beverages,31606,2015-01-03 09:00:00\n3555,16686,33754,4,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-08 10:00:00\n3556,16686,27845,10,1,Organic Whole Milk,84,16,dairy eggs,31606,2015-01-08 10:00:00\n3557,16686,39475,8,1,Total Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-08 10:00:00\n3558,16686,18523,6,1,Total 2% All Natural Greek Strained Yogurt with Honey,120,16,dairy eggs,31606,2015-01-08 10:00:00\n3559,16686,4957,1,1,Total 2% Lowfat Greek Strained Yogurt With Blueberry,120,16,dairy eggs,31606,2015-01-08 10:00:00\n3560,16686,33787,5,1,Total 2% Lowfat Greek Strained Yogurt with Peach,120,16,dairy eggs,31606,2015-01-08 10:00:00\n3561,16686,8061,7,1,Pineapple Yogurt 2%,120,16,dairy eggs,31606,2015-01-08 10:00:00\n3562,16686,28204,12,1,Organic Fuji Apple,24,4,produce,31606,2015-01-08 10:00:00\n3563,16686,37646,11,1,Organic Gala Apples,24,4,produce,31606,2015-01-08 10:00:00\n3564,16686,39877,2,1,Organic Granny Smith Apple,24,4,produce,31606,2015-01-08 10:00:00\n3565,16686,47759,3,1,Mandarin Oranges,24,4,produce,31606,2015-01-08 10:00:00\n3566,16686,31683,9,1,Original No Pulp 100% Florida Orange Juice,31,7,beverages,31606,2015-01-08 10:00:00\n4193,32918,33754,2,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-10 09:00:00\n4194,32918,30169,4,1,Total 2% All Natural Plain Greek Yogurt,120,16,dairy eggs,31606,2015-01-10 09:00:00\n4195,32918,4957,1,1,Total 2% Lowfat Greek Strained Yogurt With Blueberry,120,16,dairy eggs,31606,2015-01-10 09:00:00\n4196,32918,33787,5,1,Total 2% Lowfat Greek Strained Yogurt with Peach,120,16,dairy eggs,31606,2015-01-10 09:00:00\n4197,32918,8061,9,1,Pineapple Yogurt 2%,120,16,dairy eggs,31606,2015-01-10 09:00:00\n4198,32918,19057,6,1,Organic Large Extra Fancy Fuji Apple,24,4,produce,31606,2015-01-10 09:00:00\n4199,32918,25340,8,1,Large Yellow Flesh Nectarine,24,4,produce,31606,2015-01-10 09:00:00\n4200,32918,47759,7,1,Mandarin Oranges,24,4,produce,31606,2015-01-10 09:00:00\n4201,32918,48559,3,1,Synergy Organic Kombucha Gingerberry,31,7,beverages,31606,2015-01-10 09:00:00\n4202,32918,26620,11,0,Peach Pear Flavored Sparkling Water,115,7,beverages,31606,2015-01-10 09:00:00\n4203,32918,49520,10,0,Orange Sparkling Water,115,7,beverages,31606,2015-01-10 09:00:00\n4350,34537,33754,1,0,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,19114,2015-01-01 13:00:00\n4351,34537,39475,9,0,Total Greek Strained Yogurt,120,16,dairy eggs,19114,2015-01-01 13:00:00\n4352,34537,30233,15,0,Organic Large Brown Grade AA Cage Free Eggs,86,16,dairy eggs,19114,2015-01-01 13:00:00\n4353,34537,4269,14,0,Mild Cheddar Cheese,21,16,dairy eggs,19114,2015-01-01 13:00:00\n4354,34537,21903,6,0,Organic Baby Spinach,123,4,produce,19114,2015-01-01 13:00:00\n4355,34537,13176,4,0,Bag of Organic Bananas,24,4,produce,19114,2015-01-01 13:00:00\n4356,34537,47209,3,0,Organic Hass Avocado,24,4,produce,19114,2015-01-01 13:00:00\n4357,34537,42265,11,0,Organic Baby Carrots,123,4,produce,19114,2015-01-01 13:00:00\n4358,34537,22825,10,0,Organic D'Anjou Pears,24,4,produce,19114,2015-01-01 13:00:00\n4359,34537,39275,7,0,Organic Blueberries,123,4,produce,19114,2015-01-01 13:00:00\n4360,34537,37646,16,0,Organic Gala Apples,24,4,produce,19114,2015-01-01 13:00:00\n4361,34537,8174,19,0,Organic Navel Orange,24,4,produce,19114,2015-01-01 13:00:00\n4362,34537,47042,20,0,Organic Red On the Vine Tomato,83,4,produce,19114,2015-01-01 13:00:00\n4363,34537,39040,21,0,Organic Sliced Crimini Mushrooms,123,4,produce,19114,2015-01-01 13:00:00\n4364,34537,18362,18,0,Organic Bread with 21 Whole Grains,112,3,bakery,19114,2015-01-01 13:00:00\n4365,34537,2855,2,0,Organic Good Seed Bread,112,3,bakery,19114,2015-01-01 13:00:00\n4366,34537,40063,17,0,Gluten Free Chocolate Chip Cookies,61,19,snacks,19114,2015-01-01 13:00:00\n4367,34537,20734,25,0,Organic Medjool Dates,117,19,snacks,19114,2015-01-01 13:00:00\n4368,34537,49174,12,0,Raincoast Crisps Cranberry And Hazelnut Crackers,78,19,snacks,19114,2015-01-01 13:00:00\n4369,34537,25670,5,0,High Pulp Orange Juice,31,7,beverages,19114,2015-01-01 13:00:00\n4370,34537,12686,22,0,Organic Jalapeno Cilantro Hummus,67,20,deli,19114,2015-01-01 13:00:00\n4371,34537,8230,8,0,100% Recycled Bathroom Tissue,54,17,household,19114,2015-01-01 13:00:00\n4372,34537,8638,24,0,Vanilla Milk Chocolate Almond Ice Cream Bars,37,1,frozen,19114,2015-01-01 13:00:00\n4373,34537,8436,23,0,Organic Waffles Flax Plus,52,1,frozen,19114,2015-01-01 13:00:00\n4374,34537,29195,13,0,Wild Sardines in Extra Virgin Olive Oil,95,15,canned goods,19114,2015-01-01 13:00:00\n4734,41684,33754,2,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-14 08:00:00\n4735,41684,4957,3,1,Total 2% Lowfat Greek Strained Yogurt With Blueberry,120,16,dairy eggs,31606,2015-01-14 08:00:00\n4736,41684,33787,5,1,Total 2% Lowfat Greek Strained Yogurt with Peach,120,16,dairy eggs,31606,2015-01-14 08:00:00\n4737,41684,8061,4,1,Pineapple Yogurt 2%,120,16,dairy eggs,31606,2015-01-14 08:00:00\n4738,41684,6740,6,1,Organic Braeburn Apple,24,4,produce,31606,2015-01-14 08:00:00\n4739,41684,19057,7,1,Organic Large Extra Fancy Fuji Apple,24,4,produce,31606,2015-01-14 08:00:00\n4740,41684,44632,8,1,Sparkling Water Grapefruit,115,7,beverages,31606,2015-01-14 08:00:00\n4741,41684,48559,1,1,Synergy Organic Kombucha Gingerberry,31,7,beverages,31606,2015-01-14 08:00:00\n4784,41964,33754,3,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,19114,2015-01-14 15:00:00\n4785,41964,1463,8,1,Organic Milk,84,16,dairy eggs,19114,2015-01-14 15:00:00\n4786,41964,32655,10,1,Organic Large Grade AA Brown Eggs,86,16,dairy eggs,19114,2015-01-14 15:00:00\n4787,41964,4269,9,1,Mild Cheddar Cheese,21,16,dairy eggs,19114,2015-01-14 15:00:00\n4788,41964,13176,5,1,Bag of Organic Bananas,24,4,produce,19114,2015-01-14 15:00:00\n4789,41964,27966,4,1,Organic Raspberries,123,4,produce,19114,2015-01-14 15:00:00\n4790,41964,47209,2,1,Organic Hass Avocado,24,4,produce,19114,2015-01-14 15:00:00\n4791,41964,21137,11,1,Organic Strawberries,24,4,produce,19114,2015-01-14 15:00:00\n4792,41964,48745,16,0,Globe Eggplant,83,4,produce,19114,2015-01-14 15:00:00\n4793,41964,42265,7,1,Organic Baby Carrots,123,4,produce,19114,2015-01-14 15:00:00\n4794,41964,41950,6,0,Organic Tomato Cluster,83,4,produce,19114,2015-01-14 15:00:00\n4795,41964,39275,18,1,Organic Blueberries,123,4,produce,19114,2015-01-14 15:00:00\n4796,41964,26940,17,0,Organic Large Green Asparagus,83,4,produce,19114,2015-01-14 15:00:00\n4797,41964,43154,1,1,Sparkling Mineral Water,115,7,beverages,19114,2015-01-14 15:00:00\n4798,41964,21051,13,1,Baba Ghannouge Eggplant Dip,67,20,deli,19114,2015-01-14 15:00:00\n4799,41964,4193,15,0,\"Ravioli, Spinach & Cheese\",12,9,dry goods pasta,19114,2015-01-14 15:00:00\n4800,41964,43908,14,0,Butternut Squash Ravioli,38,1,frozen,19114,2015-01-14 15:00:00\n4801,41964,4921,12,1,Organic Roasted Garlic Mushroom Lentil Soup,69,15,canned goods,19114,2015-01-14 15:00:00\n"
  },
  {
    "path": "docs/source/examples/demo/turbofan_degredation/__init__.py",
    "content": "import os\nimport pandas as pd\nfrom demo import utils\n\nURL = r\"https://ti.arc.nasa.gov/c/6/\"\nPWD = os.path.dirname(__file__)\n\n\ndef _download_data():\n    output = os.path.join(PWD, \"download\")\n    utils.download(URL, output)\n\n\ndef _data():\n    path = os.path.join(PWD, \"download\", \"train_FD004.txt\")\n    if not os.path.exists(path):\n        _download_data()\n    cols = [\"engine_no\", \"time_in_cycles\"]\n    cols += [\"operational_setting_{}\".format(i + 1) for i in range(3)]\n    cols += [\"sensor_measurement_{}\".format(i + 1) for i in range(26)]\n    df = pd.read_csv(path, sep=\" \", header=None, names=cols)\n    df = df.drop(cols[-5:], axis=1).rename_axis(\"id\")\n    df[\"time\"] = pd.date_range(\"1/1/2000\", periods=df.shape[0], freq=\"600s\")\n    return df\n\n\ndef _read(file):\n    path = os.path.join(PWD, file)\n    df = pd.read_csv(path, parse_dates=[\"time\"], index_col=\"id\")\n    return df\n\n\ndef load_sample():\n    return _read(\"sample.csv\")\n"
  },
  {
    "path": "docs/source/examples/demo/turbofan_degredation/sample.csv",
    "content": "id,engine_no,time_in_cycles,operational_setting_1,operational_setting_2,operational_setting_3,sensor_measurement_1,sensor_measurement_2,sensor_measurement_3,sensor_measurement_4,sensor_measurement_5,sensor_measurement_6,sensor_measurement_7,sensor_measurement_8,sensor_measurement_9,sensor_measurement_10,sensor_measurement_11,sensor_measurement_12,sensor_measurement_13,sensor_measurement_14,sensor_measurement_15,sensor_measurement_16,sensor_measurement_17,sensor_measurement_18,sensor_measurement_19,sensor_measurement_20,sensor_measurement_21,time\n270,1,271,0.001,0.0018,100.0,518.67,643.01,1591.11,1395.6,14.62,21.58,558.87,2388.14,9083.32,1.3,47.28,526.98,2388.12,8157.56,8.3141,0.03,393,2388,100.0,39.26,23.528,2000-01-02 21:00:00\n401,2,81,0.0004,0.0,100.0,518.67,642.88,1581.74,1398.46,14.62,21.61,553.87,2388.07,9050.1,1.3,47.38,521.79,2387.98,8134.7,8.4092,0.03,392,2388,100.0,39.08,23.3215,2000-01-03 18:50:00\n810,3,191,41.9983,0.84,100.0,445.0,549.13,1352.21,1122.64,3.91,5.7,139.61,2212.1,8333.04,1.03,41.92,131.7,2388.18,8098.8,9.2919,0.02,330,2212,100.0,10.64,6.4525,2000-01-06 15:00:00\n66,1,67,35.0054,0.84,100.0,449.44,555.43,1351.45,1109.9,5.48,7.98,193.43,2222.81,8339.26,1.02,41.55,182.41,2387.89,8062.45,9.3215,0.02,333,2223,100.0,14.9,9.0315,2000-01-01 11:00:00\n328,2,8,0.0023,0.0019,100.0,518.67,642.23,1576.51,1391.71,14.62,21.61,554.29,2387.97,9045.29,1.3,47.31,521.72,2388.07,8135.66,8.3894,0.03,392,2388,100.0,38.95,23.4243,2000-01-03 06:40:00\n324,2,4,42.0077,0.84,100.0,445.0,548.77,1345.81,1116.64,3.91,5.71,138.82,2211.84,8313.96,1.02,41.71,130.67,2387.88,8079.41,9.32,0.02,330,2212,100.0,10.5,6.2818,2000-01-03 06:00:00\n630,3,11,20.0006,0.7001,100.0,491.19,607.29,1471.84,1246.09,9.35,13.63,335.76,2323.92,8720.29,1.08,44.13,316.17,2388.05,8066.31,9.1688,0.02,363,2324,100.0,24.63,14.8258,2000-01-05 09:00:00\n72,1,73,34.9996,0.8401,100.0,449.44,554.68,1354.64,1124.58,5.48,7.98,193.48,2222.83,8334.68,1.02,41.52,182.67,2387.85,8058.77,9.3464,0.02,331,2223,100.0,14.88,8.9067,2000-01-01 12:00:00\n127,1,128,10.0046,0.2511,100.0,489.05,604.17,1495.57,1298.72,10.52,15.47,393.9,2318.69,8768.8,1.26,45.24,371.27,2387.87,8128.9,8.6257,0.03,368,2319,100.0,28.71,17.1948,2000-01-01 21:10:00\n640,3,21,25.0041,0.62,60.0,462.54,536.51,1254.59,1039.83,7.05,9.01,175.77,1915.4,8011.57,0.94,36.53,164.78,2028.29,7872.85,10.8288,0.02,305,1915,84.93,14.27,8.5881,2000-01-05 10:40:00\n405,2,85,41.999,0.84,100.0,445.0,549.44,1351.79,1119.04,3.91,5.71,139.66,2211.91,8315.88,1.02,41.79,130.7,2388.01,8081.55,9.3426,0.02,329,2212,100.0,10.64,6.4411,2000-01-03 19:30:00\n842,3,223,24.9995,0.62,60.0,462.54,536.45,1262.18,1040.55,7.05,9.01,176.05,1915.5,8019.42,0.94,36.59,165.48,2028.44,7886.87,10.7664,0.02,308,1915,84.93,14.45,8.5002,2000-01-06 20:20:00\n295,1,296,35.0006,0.84,100.0,449.44,555.73,1361.84,1133.92,5.48,7.98,198.19,2223.41,8383.27,1.04,42.27,185.92,2388.51,8096.76,9.1701,0.02,335,2223,100.0,15.02,8.9899,2000-01-03 01:10:00\n67,1,68,0.0001,0.0,100.0,518.67,641.78,1581.16,1390.67,14.62,21.58,552.27,2387.91,9044.67,1.3,46.91,520.44,2387.95,8130.78,8.4128,0.03,392,2388,100.0,39.14,23.4225,2000-01-01 11:10:00\n490,2,170,20.0005,0.7,100.0,491.19,607.17,1482.24,1256.17,9.35,13.65,335.02,2323.94,8719.72,1.08,44.2,315.42,2387.99,8057.82,9.2014,0.02,364,2324,100.0,24.77,14.6756,2000-01-04 09:40:00\n178,1,179,42.0047,0.84,100.0,445.0,549.11,1347.88,1123.64,3.91,5.7,138.42,2211.96,8316.48,1.02,41.81,130.04,2388.03,8080.95,9.329,0.02,328,2212,100.0,10.44,6.4344,2000-01-02 05:40:00\n179,1,180,35.0016,0.84,100.0,449.44,555.76,1364.07,1111.2,5.48,7.97,193.45,2222.88,8339.09,1.02,41.49,182.27,2387.92,8067.05,9.2474,0.02,330,2223,100.0,14.88,8.8841,2000-01-02 05:50:00\n641,3,22,10.0041,0.25,100.0,489.05,604.54,1496.8,1293.02,10.52,15.48,395.82,2318.88,8785.15,1.26,45.29,373.15,2388.06,8137.32,8.6058,0.03,367,2319,100.0,28.77,17.1484,2000-01-05 10:50:00\n70,1,71,10.0061,0.25,100.0,489.05,603.79,1491.5,1300.18,10.52,15.46,393.13,2318.68,8762.49,1.26,44.93,370.13,2387.85,8123.16,8.6166,0.03,367,2319,100.0,28.65,17.2694,2000-01-01 11:40:00\n397,2,77,42.0005,0.8405,100.0,445.0,549.13,1347.13,1118.85,3.91,5.71,139.05,2211.92,8311.54,1.02,41.9,130.99,2387.93,8079.25,9.329,0.02,330,2212,100.0,10.59,6.3295,2000-01-03 18:10:00\n535,2,215,9.9983,0.2504,100.0,489.05,604.34,1501.55,1315.23,10.52,15.49,394.27,2318.89,8780.41,1.26,45.46,371.26,2388.18,8132.84,8.6418,0.03,369,2319,100.0,28.51,17.1078,2000-01-04 17:10:00\n473,2,153,35.0024,0.8406,100.0,449.44,555.37,1354.39,1123.45,5.48,8.0,194.92,2222.84,8348.73,1.02,41.6,182.85,2387.96,8066.59,9.306,0.02,335,2223,100.0,14.85,9.0613,2000-01-04 06:50:00\n781,3,162,10.0078,0.2517,100.0,489.05,604.62,1499.92,1306.21,10.52,15.48,397.21,2318.93,8791.36,1.26,45.23,374.66,2388.16,8142.85,8.5831,0.03,369,2319,100.0,28.68,17.2962,2000-01-06 10:10:00\n782,3,163,0.0027,0.0,100.0,518.67,642.25,1585.88,1397.26,14.62,21.6,557.69,2388.04,9064.9,1.3,47.38,525.98,2388.1,8151.62,8.3576,0.03,393,2388,100.0,39.1,23.4735,2000-01-06 10:20:00\n678,3,59,10.0003,0.25,100.0,489.05,604.1,1494.72,1303.13,10.52,15.47,396.78,2318.84,8783.11,1.26,45.27,372.68,2388.05,8131.59,8.5583,0.03,369,2319,100.0,28.67,17.1963,2000-01-05 17:00:00\n613,2,293,42.0043,0.8405,100.0,445.0,550.39,1362.33,1144.38,3.91,5.72,138.0,2211.96,8333.63,1.02,42.7,130.38,2388.07,8093.16,9.4054,0.02,333,2212,100.0,10.53,6.297999999999999,2000-01-05 06:10:00\n433,2,113,35.0059,0.84,100.0,449.44,555.54,1362.95,1129.59,5.48,8.0,194.94,2222.92,8338.17,1.02,41.76,183.1,2388.1,8071.38,9.2906,0.02,333,2223,100.0,14.95,8.9975,2000-01-04 00:10:00\n849,3,230,34.998000000000005,0.8414,100.0,449.44,556.05,1363.57,1131.29,5.48,7.99,196.44,2223.23,8371.37,1.03,41.86,185.7,2388.37,8088.03,9.1742,0.02,335,2223,100.0,15.11,9.0116,2000-01-06 21:30:00\n704,3,85,42.0046,0.8411,100.0,445.0,548.73,1350.43,1123.43,3.91,5.7,139.12,2212.04,8323.39,1.02,41.86,131.28,2388.1,8093.38,9.2563,0.02,329,2212,100.0,10.62,6.3161,2000-01-05 21:20:00\n247,1,248,25.0046,0.6215,60.0,462.54,536.42,1252.79,1039.07,7.05,9.0,175.95,1915.45,8012.72,0.94,36.47,164.92,2028.36,7877.42,10.8142,0.02,307,1915,84.93,14.36,8.6125,2000-01-02 17:10:00\n861,3,242,42.002,0.8403,100.0,445.0,549.04,1357.67,1128.75,3.91,5.7,140.28,2212.2,8348.13,1.03,42.15,132.15,2388.29,8113.41,9.2207,0.02,332,2212,100.0,10.6,6.377999999999999,2000-01-06 23:30:00\n63,1,64,9.9987,0.25,100.0,489.05,603.91,1492.47,1295.89,10.52,15.47,392.92,2318.69,8768.53,1.26,45.03,370.33,2387.88,8116.15,8.6115,0.03,370,2319,100.0,28.66,17.2008,2000-01-01 10:30:00\n47,1,48,41.9986,0.84,100.0,445.0,549.29,1342.44,1111.0,3.91,5.7,137.82,2211.91,8305.73,1.02,41.66,130.15,2387.97,8070.59,9.3477,0.02,329,2212,100.0,10.51,6.3725,2000-01-01 07:50:00\n588,2,268,0.0028,0.0016,100.0,518.67,643.22,1588.74,1414.35,14.62,21.61,552.95,2388.22,9068.49,1.3,47.87,520.08,2388.17,8136.71,8.4615,0.03,396,2388,100.0,38.72,23.1227,2000-01-05 02:00:00\n459,2,139,0.0001,0.002,100.0,518.67,642.64,1588.38,1396.23,14.62,21.61,553.18,2388.09,9049.0,1.3,47.41,521.87,2388.06,8129.5,8.4393,0.03,392,2388,100.0,39.05,23.3788,2000-01-04 04:30:00\n76,1,77,41.9999,0.8409,100.0,445.0,548.65,1341.13,1109.07,3.91,5.69,138.25,2211.9,8301.9,1.01,41.76,129.83,2387.96,8072.08,9.3752,0.02,330,2212,100.0,10.5,6.3132,2000-01-01 12:40:00\n673,3,54,42.0068,0.8409,100.0,445.0,549.05,1348.66,1120.94,3.91,5.71,139.86,2212.01,8323.26,1.02,42.02,131.13,2388.1,8088.63,9.3335,0.02,330,2212,100.0,10.73,6.4634,2000-01-05 16:10:00\n856,3,237,42.0004,0.84,100.0,445.0,549.43,1353.57,1129.55,3.91,5.7,139.86,2212.16,8346.72,1.03,42.18,132.28,2388.3,8100.15,9.2276,0.02,331,2212,100.0,10.78,6.4363,2000-01-06 22:40:00\n419,2,99,9.9991,0.2515,100.0,489.05,604.63,1496.01,1299.39,10.52,15.49,395.13,2318.87,8773.01,1.26,45.16,371.18,2388.14,8128.65,8.5838,0.03,368,2319,100.0,28.74,17.1616,2000-01-03 21:50:00\n379,2,59,20.0065,0.7,100.0,491.19,607.06,1473.38,1243.74,9.35,13.65,334.99,2323.87,8720.59,1.08,44.19,315.14,2388.02,8055.39,9.1574,0.02,364,2324,100.0,24.4,14.7717,2000-01-03 15:10:00\n138,1,139,35.0034,0.8402,100.0,449.44,555.09,1363.95,1121.71,5.48,7.97,193.99,2222.85,8336.49,1.02,41.57,182.47,2387.96,8058.34,9.3339,0.02,331,2223,100.0,14.73,8.9369,2000-01-01 23:00:00\n700,3,81,42.0069,0.84,100.0,445.0,549.51,1346.96,1119.83,3.91,5.7,138.82,2212.04,8316.42,1.02,41.87,131.23,2388.07,8088.8,9.3011,0.02,329,2212,100.0,10.7,6.4669,2000-01-05 20:40:00\n408,2,88,25.0075,0.62,60.0,462.54,536.56,1257.95,1043.97,7.05,9.03,175.85,1915.35,8011.68,0.94,36.34,164.92,2028.18,7867.64,10.8479,0.02,307,1915,84.93,14.43,8.5278,2000-01-03 20:00:00\n732,3,113,42.0026,0.84,100.0,445.0,549.34,1348.89,1113.6,3.91,5.7,138.68,2212.05,8320.05,1.02,41.74,131.26,2388.14,8089.67,9.2787,0.02,328,2212,100.0,10.59,6.3562,2000-01-06 02:00:00\n362,2,42,10.0078,0.25,100.0,489.05,604.1,1498.08,1303.6,10.52,15.49,395.08,2318.79,8779.51,1.26,45.4,371.74,2388.05,8124.64,8.6149,0.03,369,2319,100.0,28.79,17.2395,2000-01-03 12:20:00\n795,3,176,0.0021,0.0,100.0,518.67,642.37,1584.51,1401.25,14.62,21.6,558.45,2388.07,9071.01,1.3,47.25,525.58,2388.07,8149.96,8.3545,0.03,393,2388,100.0,39.3,23.4859,2000-01-06 12:30:00\n720,3,101,10.0042,0.2507,100.0,489.05,604.34,1500.22,1304.54,10.52,15.47,396.11,2318.9,8783.51,1.26,45.16,373.28,2388.0,8138.04,8.5761,0.03,369,2319,100.0,28.73,17.2946,2000-01-06 00:00:00\n550,2,230,9.9991,0.2517,100.0,489.05,604.95,1499.4,1314.46,10.52,15.49,394.68,2319.02,8783.81,1.26,45.35,371.56,2388.15,8133.63,8.6771,0.03,370,2319,100.0,28.66,17.1054,2000-01-04 19:40:00\n420,2,100,20.0045,0.7,100.0,491.19,607.09,1485.12,1244.66,9.35,13.65,334.19,2323.94,8721.67,1.08,44.35,315.3,2388.05,8056.34,9.197,0.02,366,2324,100.0,24.72,14.6641,2000-01-03 22:00:00\n330,2,10,20.0051,0.7007,100.0,491.19,607.17,1478.08,1247.67,9.35,13.65,335.12,2323.85,8713.06,1.08,44.19,315.57,2388.02,8060.98,9.1813,0.02,363,2324,100.0,24.7,14.7531,2000-01-03 07:00:00\n110,1,111,42.0072,0.84,100.0,445.0,548.9,1341.72,1113.93,3.91,5.69,138.03,2211.96,8304.43,1.01,41.8,129.94,2387.96,8073.52,9.3582,0.02,329,2212,100.0,10.65,6.3072,2000-01-01 18:20:00\n124,1,125,35.0039,0.84,100.0,449.44,555.0,1355.13,1119.97,5.48,7.98,193.46,2222.86,8348.55,1.02,41.47,182.6,2387.91,8057.91,9.26,0.02,332,2223,100.0,15.01,9.0094,2000-01-01 20:40:00\n164,1,165,9.9988,0.2506,100.0,489.05,603.78,1492.54,1293.43,10.52,15.46,393.5,2318.72,8774.84,1.26,44.99,370.52,2387.87,8122.79,8.6036,0.03,368,2319,100.0,28.58,17.1826,2000-01-02 03:20:00\n191,1,192,10.0018,0.25,100.0,489.05,604.41,1491.72,1301.44,10.52,15.47,395.29,2318.82,8777.13,1.26,45.33,371.74,2387.99,8129.48,8.5787,0.03,369,2319,100.0,28.69,17.0844,2000-01-02 07:50:00\n582,2,262,35.0038,0.84,100.0,449.44,556.13,1370.24,1141.82,5.48,8.0,193.99,2223.03,8350.91,1.02,42.36,183.01,2388.1,8070.38,9.3596,0.02,336,2223,100.0,14.72,8.9279,2000-01-05 01:00:00\n350,2,30,42.0027,0.84,100.0,445.0,549.56,1354.32,1120.99,3.91,5.71,138.64,2211.92,8319.01,1.02,41.9,130.99,2387.95,8082.51,9.3855,0.02,331,2212,100.0,10.6,6.2534,2000-01-03 10:20:00\n768,3,149,0.0005,0.0,100.0,518.67,642.03,1594.42,1403.31,14.62,21.6,557.73,2388.11,9071.01,1.3,47.27,524.96,2388.12,8142.95,8.3489,0.03,392,2388,100.0,39.27,23.5657,2000-01-06 08:00:00\n147,1,148,10.0016,0.25,100.0,489.05,604.01,1490.88,1296.98,10.52,15.46,392.97,2318.69,8774.49,1.26,44.95,370.73,2387.89,8124.34,8.6264,0.03,367,2319,100.0,28.71,17.0772,2000-01-02 00:30:00\n775,3,156,42.0048,0.8402,100.0,445.0,549.59,1349.13,1122.78,3.91,5.71,139.71,2212.01,8321.5,1.03,41.85,131.49,2388.13,8095.78,9.2484,0.02,331,2212,100.0,10.65,6.318,2000-01-06 09:10:00\n723,3,104,42.0062,0.84,100.0,445.0,549.46,1350.07,1123.94,3.91,5.7,138.53,2212.03,8332.35,1.02,41.97,130.99,2388.15,8089.65,9.3236,0.02,331,2212,100.0,10.84,6.385,2000-01-06 00:30:00\n604,2,284,34.9981,0.8413,100.0,449.44,556.4,1375.25,1149.03,5.48,8.0,193.81,2223.1,8358.14,1.02,42.48,182.35,2388.15,8076.38,9.3842,0.02,335,2223,100.0,14.71,8.8351,2000-01-05 04:40:00\n791,3,172,25.0018,0.62,60.0,462.54,536.54,1259.39,1045.17,7.05,9.01,176.83,1915.43,8017.88,0.94,36.54,165.66,2028.34,7879.28,10.7923,0.02,308,1915,84.93,14.25,8.6855,2000-01-06 11:50:00\n383,2,63,41.9987,0.84,100.0,445.0,549.48,1349.4,1116.5,3.91,5.71,138.72,2211.82,8319.91,1.02,41.89,130.65,2387.98,8079.58,9.3418,0.02,330,2212,100.0,10.71,6.3645,2000-01-03 15:50:00\n104,1,105,9.9993,0.25,100.0,489.05,604.1,1491.99,1294.57,10.52,15.47,393.35,2318.66,8770.75,1.26,45.13,371.33,2387.88,8128.88,8.6488,0.03,367,2319,100.0,28.58,17.1735,2000-01-01 17:20:00\n228,1,229,10.0033,0.25,100.0,489.05,604.28,1495.44,1304.71,10.52,15.46,395.3,2318.82,8780.88,1.26,45.25,372.33,2388.01,8136.93,8.5775,0.03,368,2319,100.0,28.72,17.3188,2000-01-02 14:00:00\n794,3,175,0.0012,0.0,100.0,518.67,642.43,1593.51,1399.83,14.62,21.6,558.06,2388.14,9067.54,1.3,47.4,525.87,2388.12,8144.85,8.3122,0.03,392,2388,100.0,39.25,23.5982,2000-01-06 12:20:00\n65,1,66,42.0043,0.84,100.0,445.0,549.25,1338.23,1115.55,3.91,5.69,137.76,2211.91,8309.32,1.01,41.64,129.91,2388.0,8070.94,9.3859,0.02,327,2212,100.0,10.65,6.303,2000-01-01 10:50:00\n837,3,218,10.0066,0.25,100.0,489.05,604.73,1496.41,1308.55,10.52,15.48,397.69,2319.01,8789.25,1.26,45.28,375.21,2388.25,8150.3,8.5539,0.03,370,2319,100.0,28.93,17.3016,2000-01-06 19:30:00\n730,3,111,42.0062,0.84,100.0,445.0,549.19,1341.85,1116.52,3.91,5.7,139.73,2211.96,8323.13,1.03,41.71,130.83,2388.04,8087.66,9.2957,0.02,330,2212,100.0,10.8,6.3702,2000-01-06 01:40:00\n668,3,49,42.0017,0.8405,100.0,445.0,549.3,1347.6,1119.97,3.91,5.7,139.63,2211.98,8324.54,1.02,41.82,130.64,2388.13,8083.22,9.2909,0.02,329,2212,100.0,10.82,6.385,2000-01-05 15:20:00\n643,3,24,24.9996,0.6217,60.0,462.54,536.2,1259.53,1045.12,7.05,9.01,176.69,1915.38,8012.36,0.94,36.46,165.0,2028.29,7875.93,10.851,0.02,308,1915,84.93,14.3,8.6506,2000-01-05 11:10:00\n633,3,14,0.0025,0.0015,100.0,518.67,642.21,1589.88,1396.53,14.62,21.6,556.01,2388.08,9064.23,1.3,47.28,524.25,2388.07,8144.1,8.3885,0.03,391,2388,100.0,39.14,23.549,2000-01-05 09:30:00\n157,1,158,35.0012,0.84,100.0,449.44,555.0,1359.18,1114.79,5.48,7.97,194.13,2222.81,8343.72,1.02,41.5,181.95,2387.94,8062.27,9.2753,0.02,331,2223,100.0,14.88,8.8772,2000-01-02 02:10:00\n804,3,185,25.0062,0.62,60.0,462.54,536.62,1252.21,1039.33,7.05,9.01,176.54,1915.46,8008.7,0.94,36.53,165.48,2028.35,7878.0,10.7779,0.02,305,1915,84.93,14.31,8.6881,2000-01-06 14:00:00\n194,1,195,42.0007,0.8413,100.0,445.0,548.81,1343.82,1111.8,3.91,5.7,137.93,2211.94,8314.94,1.02,41.96,130.49,2388.07,8081.77,9.3235,0.02,330,2212,100.0,10.63,6.3835,2000-01-02 08:20:00\n425,2,105,42.0015,0.84,100.0,445.0,549.47,1349.8,1113.55,3.91,5.71,139.0,2211.85,8314.08,1.02,41.89,130.39,2387.92,8081.79,9.3311,0.02,330,2212,100.0,10.59,6.3751,2000-01-03 22:50:00\n238,1,239,0.0014,0.0008,100.0,518.67,641.58,1586.47,1403.66,14.62,21.58,557.31,2388.03,9066.04,1.3,47.19,524.63,2388.03,8147.55,8.351,0.03,392,2388,100.0,39.17,23.4656,2000-01-02 15:40:00\n239,1,240,35.005,0.8401,100.0,449.44,555.61,1362.84,1120.5,5.48,7.97,194.77,2223.05,8356.51,1.02,41.73,183.71,2388.08,8072.6,9.2702,0.02,335,2223,100.0,15.06,8.968,2000-01-02 15:50:00\n537,2,217,42.0068,0.84,100.0,445.0,549.69,1357.71,1121.35,3.91,5.72,139.06,2211.88,8329.04,1.02,42.2,130.6,2388.0,8088.34,9.3774,0.02,331,2212,100.0,10.65,6.4184,2000-01-04 17:30:00\n112,1,113,0.001,0.0,100.0,518.67,641.49,1575.19,1392.92,14.62,21.58,552.99,2387.93,9055.13,1.3,47.06,520.68,2387.93,8133.53,8.3761,0.03,390,2388,100.0,38.85,23.4599,2000-01-01 18:40:00\n77,1,78,42.0033,0.8413,100.0,445.0,549.59,1339.95,1115.48,3.91,5.69,138.12,2211.94,8310.39,1.02,41.64,129.83,2387.92,8075.21,9.3775,0.02,328,2212,100.0,10.36,6.3782,2000-01-01 12:50:00\n831,3,212,42.0067,0.8413,100.0,445.0,549.4,1350.97,1120.42,3.91,5.7,140.11,2212.15,8334.19,1.03,42.03,131.34,2388.17,8100.6,9.2502,0.02,329,2212,100.0,10.77,6.4110000000000005,2000-01-06 18:30:00\n766,3,147,10.0037,0.2519,100.0,489.05,604.39,1495.36,1305.31,10.52,15.47,396.08,2318.87,8789.57,1.26,45.36,372.81,2388.08,8136.2,8.6022,0.03,369,2319,100.0,28.71,17.2478,2000-01-06 07:40:00\n671,3,52,0.0015,0.0018,100.0,518.67,642.41,1575.47,1390.03,14.62,21.6,556.12,2388.14,9060.64,1.3,47.31,524.69,2388.05,8143.66,8.375,0.03,392,2388,100.0,39.14,23.4563,2000-01-05 15:50:00\n300,1,301,41.999,0.8402,100.0,445.0,549.44,1356.84,1123.1,3.91,5.69,141.28,2212.38,8361.95,1.04,42.47,132.98,2388.5,8119.65,9.1917,0.02,332,2212,100.0,11.0,6.4417,2000-01-03 02:00:00\n710,3,91,42.0021,0.8415,100.0,445.0,549.02,1347.67,1120.26,3.91,5.7,139.2,2212.05,8323.34,1.02,41.96,131.03,2388.06,8092.38,9.2851,0.02,332,2212,100.0,10.74,6.3139,2000-01-05 22:20:00\n357,2,37,25.0012,0.62,60.0,462.54,536.85,1250.07,1035.7,7.05,9.02,175.84,1915.25,8014.23,0.94,36.57,165.45,2028.2,7870.36,10.9057,0.02,308,1915,84.93,14.44,8.6931,2000-01-03 11:30:00\n209,1,210,25.0063,0.6205,60.0,462.54,536.7,1257.95,1041.88,7.05,9.0,175.4,1915.33,8002.07,0.94,36.41,164.86,2028.27,7869.6,10.8446,0.02,305,1915,84.93,14.32,8.6213,2000-01-02 10:50:00\n74,1,75,10.0057,0.25,100.0,489.05,604.12,1497.28,1290.6,10.52,15.46,394.29,2318.67,8772.98,1.26,44.66,370.84,2387.85,8120.32,8.6157,0.03,367,2319,100.0,28.58,17.2542,2000-01-01 12:20:00\n855,3,236,20.004,0.7006,100.0,491.19,607.3,1485.01,1253.16,9.35,13.63,338.79,2324.23,8752.19,1.08,44.51,319.24,2388.34,8082.94,9.1136,0.02,365,2324,100.0,24.59,14.9814,2000-01-06 22:30:00\n236,1,237,25.0028,0.6208,60.0,462.54,536.68,1254.04,1040.96,7.05,9.0,175.54,1915.45,8014.38,0.94,36.45,164.93,2028.3,7874.62,10.8332,0.02,304,1915,84.93,14.41,8.6109,2000-01-02 15:20:00\n495,2,175,20.0057,0.7003,100.0,491.19,608.04,1488.24,1247.27,9.35,13.66,335.85,2323.97,8719.98,1.08,44.48,314.89,2388.06,8061.48,9.2246,0.02,364,2324,100.0,24.59,14.6864,2000-01-04 10:30:00\n707,3,88,35.0031,0.8409,100.0,449.44,555.53,1355.47,1121.11,5.48,7.98,195.44,2223.02,8357.57,1.02,41.61,183.36,2388.14,8072.11,9.2527,0.02,333,2223,100.0,14.94,8.8939,2000-01-05 21:50:00\n378,2,58,0.0004,0.0004,100.0,518.67,642.19,1588.23,1393.53,14.62,21.61,554.55,2388.05,9056.19,1.3,47.13,522.48,2388.06,8135.89,8.3963,0.03,393,2388,100.0,38.87,23.4439,2000-01-03 15:00:00\n788,3,169,42.0,0.84,100.0,445.0,549.33,1353.11,1127.86,3.91,5.7,139.21,2212.09,8327.83,1.03,41.97,131.29,2388.17,8097.28,9.2994,0.02,330,2212,100.0,10.55,6.3549,2000-01-06 11:20:00\n857,3,238,42.0033,0.8409,100.0,445.0,549.73,1364.48,1126.53,3.91,5.71,140.56,2212.2,8355.22,1.03,42.2,132.22,2388.24,8106.57,9.215,0.02,330,2212,100.0,10.67,6.5173,2000-01-06 22:50:00\n476,2,156,34.9985,0.84,100.0,449.44,555.44,1366.3,1130.24,5.48,8.0,194.62,2222.95,8351.6,1.02,41.77,183.14,2388.01,8071.6,9.3284,0.02,333,2223,100.0,14.94,8.8761,2000-01-04 07:20:00\n573,2,253,25.0043,0.62,60.0,462.54,536.7,1252.21,1053.96,7.05,9.03,175.25,1915.4,8012.72,0.94,36.94,164.3,2028.28,7877.51,10.9178,0.02,308,1915,84.93,14.21,8.5629,2000-01-04 23:30:00\n133,1,134,42.0002,0.84,100.0,445.0,548.9,1351.53,1112.92,3.91,5.7,136.97,2211.98,8315.98,1.02,41.72,129.89,2388.02,8075.05,9.3352,0.02,329,2212,100.0,10.69,6.3409,2000-01-01 22:10:00\n822,3,203,9.9996,0.2504,100.0,489.05,604.89,1490.35,1303.25,10.52,15.48,399.08,2319.02,8790.43,1.26,45.29,374.99,2388.16,8143.66,8.5711,0.03,371,2319,100.0,28.69,17.3419,2000-01-06 17:00:00\n11,1,12,34.9993,0.84,100.0,449.44,554.53,1365.99,1122.73,5.48,7.98,193.67,2222.78,8337.46,1.02,41.45,181.71,2387.86,8056.31,9.3041,0.02,332,2223,100.0,14.68,8.8752,2000-01-01 01:50:00\n347,2,27,34.9988,0.84,100.0,449.44,555.21,1356.22,1120.7,5.48,8.0,194.49,2222.8,8339.49,1.02,41.76,183.34,2387.93,8062.17,9.3035,0.02,333,2223,100.0,14.98,8.9975,2000-01-03 09:50:00\n336,2,16,20.0041,0.7,100.0,491.19,606.36,1481.61,1251.83,9.35,13.65,335.23,2323.91,8718.75,1.08,44.15,315.35,2388.05,8055.81,9.2104,0.02,365,2324,100.0,24.57,14.686,2000-01-03 08:00:00\n376,2,56,34.9991,0.8414,100.0,449.44,554.79,1366.01,1125.3,5.48,8.0,194.89,2222.91,8348.58,1.02,41.78,183.26,2387.95,8062.23,9.2588,0.02,333,2223,100.0,14.85,8.908999999999997,2000-01-03 14:40:00\n193,1,194,10.008,0.2514,100.0,489.05,604.14,1498.7,1309.3,10.52,15.46,395.34,2318.77,8766.13,1.26,45.11,371.37,2387.95,8128.62,8.6049,0.03,368,2319,100.0,28.89,17.2704,2000-01-02 08:10:00\n520,2,200,0.0016,0.001,100.0,518.67,642.77,1589.25,1405.28,14.62,21.61,553.43,2388.05,9060.44,1.3,47.32,521.55,2388.05,8136.07,8.4579,0.03,393,2388,100.0,38.8,23.3093,2000-01-04 14:40:00\n428,2,108,20.0061,0.7015,100.0,491.19,607.45,1478.4,1255.95,9.35,13.65,335.34,2323.89,8719.9,1.08,44.3,315.31,2387.99,8059.9,9.2274,0.02,363,2324,100.0,24.49,14.7474,2000-01-03 23:20:00\n155,1,156,19.9982,0.7,100.0,491.19,606.94,1474.86,1243.24,9.35,13.61,332.68,2323.75,8710.73,1.07,44.0,313.35,2387.81,8056.0,9.2035,0.02,363,2324,100.0,24.42,14.7066,2000-01-02 01:50:00\n154,1,155,42.0042,0.84,100.0,445.0,548.73,1343.72,1114.71,3.91,5.7,138.11,2211.93,8312.54,1.02,41.81,130.06,2388.0,8074.41,9.3734,0.02,329,2212,100.0,10.6,6.3018,2000-01-02 01:40:00\n753,3,134,41.9984,0.84,100.0,445.0,549.09,1351.99,1113.05,3.91,5.7,139.08,2212.0,8319.47,1.02,41.72,130.74,2388.13,8092.17,9.2931,0.02,329,2212,100.0,10.6,6.4263,2000-01-06 05:30:00\n273,1,274,42.0035,0.84,100.0,445.0,549.14,1361.98,1123.63,3.91,5.69,139.77,2212.19,8338.01,1.03,41.99,131.32,2388.29,8101.92,9.2248,0.02,331,2212,100.0,10.72,6.3296,2000-01-02 21:30:00\n92,1,93,20.0071,0.7,100.0,491.19,606.58,1473.21,1232.98,9.35,13.61,332.83,2323.65,8705.95,1.07,43.89,312.7,2387.82,8045.65,9.1983,0.02,363,2324,100.0,24.33,14.6484,2000-01-01 15:20:00\n544,2,224,10.0054,0.2506,100.0,489.05,604.81,1505.8,1311.77,10.52,15.49,393.7,2318.98,8784.0,1.26,45.56,371.1,2388.16,8129.8,8.6742,0.03,370,2319,100.0,28.44,16.9972,2000-01-04 18:40:00\n631,3,12,35.0047,0.8403,100.0,449.44,554.6,1358.45,1119.74,5.48,7.99,194.46,2223.01,8356.73,1.02,41.71,183.38,2388.07,8068.06,9.2648,0.02,333,2223,100.0,14.81,8.8708,2000-01-05 09:10:00\n287,1,288,0.0015,0.0,100.0,518.67,642.62,1584.53,1413.35,14.62,21.58,561.23,2388.26,9091.71,1.31,47.61,529.14,2388.24,8161.33,8.3212,0.03,393,2388,100.0,39.44,23.6491,2000-01-02 23:50:00\n36,1,37,35.0002,0.84,100.0,449.44,555.46,1356.76,1115.28,5.48,7.97,193.14,2222.77,8334.09,1.02,41.36,181.89,2387.88,8053.58,9.2801,0.02,332,2223,100.0,14.94,8.8709,2000-01-01 06:00:00\n358,2,38,20.0009,0.7,100.0,491.19,606.75,1477.64,1245.4,9.35,13.65,334.97,2323.86,8712.74,1.08,44.19,315.22,2388.05,8055.9,9.1984,0.02,364,2324,100.0,24.58,14.7194,2000-01-03 11:40:00\n385,2,65,24.9984,0.6203,60.0,462.54,536.55,1253.27,1049.71,7.05,9.03,175.83,1915.34,8007.44,0.94,36.45,165.04,2028.2,7874.26,10.87,0.02,306,1915,84.93,14.37,8.5985,2000-01-03 16:10:00\n503,2,183,10.0011,0.25,100.0,489.05,604.38,1506.6,1310.46,10.52,15.49,394.93,2318.91,8779.16,1.26,45.38,372.14,2388.1,8122.55,8.6128,0.03,369,2319,100.0,28.72,17.1658,2000-01-04 11:50:00\n321,2,1,41.9998,0.84,100.0,445.0,548.99,1341.82,1113.16,3.91,5.71,138.87,2211.84,8314.83,1.02,42.03,130.36,2387.98,8082.37,9.33,0.02,331,2212,100.0,10.77,6.2894,2000-01-03 05:30:00\n399,2,79,35.0001,0.84,100.0,449.44,555.5,1360.68,1127.17,5.48,8.0,194.84,2222.85,8346.27,1.02,41.56,182.83,2387.98,8064.86,9.3143,0.02,332,2223,100.0,14.73,8.8767,2000-01-03 18:30:00\n342,2,22,20.0075,0.7,100.0,491.19,606.9,1482.84,1243.64,9.35,13.65,335.29,2323.95,8722.93,1.08,44.05,315.96,2388.03,8059.65,9.2476,0.02,365,2324,100.0,24.64,14.7116,2000-01-03 09:00:00\n541,2,221,41.9987,0.84,100.0,445.0,549.49,1348.0,1124.59,3.91,5.71,139.21,2211.92,8317.87,1.02,42.25,130.39,2387.97,8087.2,9.3355,0.02,332,2212,100.0,10.59,6.3548,2000-01-04 18:10:00\n463,2,143,10.0021,0.25,100.0,489.05,604.88,1499.27,1303.06,10.52,15.49,393.99,2318.85,8776.11,1.26,45.36,372.17,2388.08,8133.92,8.6095,0.03,370,2319,100.0,28.58,17.2162,2000-01-04 05:10:00\n337,2,17,20.0009,0.7,100.0,491.19,607.35,1486.71,1236.43,9.35,13.65,334.39,2323.92,8723.79,1.08,44.12,315.26,2388.04,8060.85,9.1868,0.02,365,2324,100.0,24.5,14.7589,2000-01-03 08:10:00\n214,1,215,42.0022,0.8411,100.0,445.0,549.35,1349.11,1116.37,3.91,5.69,138.78,2211.99,8313.36,1.02,41.98,130.34,2388.06,8082.33,9.2955,0.02,330,2212,100.0,10.61,6.2636,2000-01-02 11:40:00\n424,2,104,25.0038,0.6208,60.0,462.54,536.67,1252.64,1048.84,7.05,9.02,175.56,1915.33,8009.62,0.94,36.52,165.1,2028.24,7871.57,10.848,0.02,306,1915,84.93,14.42,8.5925,2000-01-03 22:40:00\n364,2,44,42.0043,0.8415,100.0,445.0,548.59,1349.27,1122.59,3.91,5.72,139.06,2211.87,8310.25,1.02,42.02,130.71,2387.99,8086.73,9.3102,0.02,329,2212,100.0,10.79,6.3981,2000-01-03 12:40:00\n847,3,228,9.9984,0.2516,100.0,489.05,605.51,1502.49,1306.04,10.52,15.48,399.29,2319.14,8795.49,1.26,45.46,375.88,2388.31,8153.61,8.5493,0.03,370,2319,100.0,28.88,17.4225,2000-01-06 21:10:00\n62,1,63,0.0026,0.0,100.0,518.67,642.41,1574.98,1388.29,14.62,21.57,550.74,2387.57,9037.5,1.3,46.95,519.63,2387.56,8120.54,8.4093,0.03,390,2388,100.0,38.83,23.3222,2000-01-01 10:20:00\n477,2,157,25.0002,0.62,60.0,462.54,536.59,1259.51,1052.22,7.05,9.03,175.52,1915.3,8020.23,0.94,36.63,164.49,2028.23,7869.16,10.8835,0.02,305,1915,84.93,14.29,8.6256,2000-01-04 07:30:00\n299,1,300,0.0021,0.0,100.0,518.67,643.06,1596.09,1413.01,14.62,21.58,563.39,2388.31,9099.61,1.31,47.73,530.8,2388.32,8169.88,8.2907,0.03,396,2388,100.0,39.5,23.655,2000-01-03 01:50:00\n153,1,154,25.0,0.62,60.0,462.54,536.45,1250.45,1040.74,7.05,9.0,175.35,1915.28,7995.06,0.94,36.63,164.21,2028.17,7861.01,10.8484,0.02,306,1915,84.93,14.35,8.5502,2000-01-02 01:30:00\n244,1,245,19.9996,0.7,100.0,491.19,606.84,1485.52,1246.53,9.35,13.61,336.56,2323.91,8722.87,1.08,44.36,315.83,2388.06,8067.44,9.1293,0.02,364,2324,100.0,24.6,14.8015,2000-01-02 16:40:00\n646,3,27,10.0054,0.25,100.0,489.05,604.72,1495.4,1299.68,10.52,15.48,396.42,2318.89,8776.6,1.26,45.28,373.51,2388.05,8134.96,8.5882,0.03,369,2319,100.0,28.75,17.3681,2000-01-05 11:40:00\n437,2,117,10.0059,0.2506,100.0,489.05,604.21,1501.45,1299.84,10.52,15.49,395.74,2318.92,8770.07,1.26,45.08,371.9,2388.07,8126.91,8.6493,0.03,369,2319,100.0,28.77,17.0153,2000-01-04 00:50:00\n13,1,14,20.0056,0.7008,100.0,491.19,607.32,1470.33,1242.41,9.35,13.61,333.71,2323.72,8714.35,1.07,43.92,313.3,2387.85,8051.34,9.2272,0.02,364,2324,100.0,24.3,14.7105,2000-01-01 02:10:00\n152,1,153,25.0053,0.62,60.0,462.54,536.43,1262.22,1040.0,7.05,9.0,175.07,1915.25,8000.68,0.94,36.39,163.69,2028.18,7866.92,10.864,0.02,306,1915,84.93,14.42,8.5167,2000-01-02 01:20:00\n654,3,35,0.0002,0.0,100.0,518.67,642.28,1582.96,1409.55,14.62,21.6,556.26,2388.04,9062.8,1.3,47.21,524.31,2388.03,8145.59,8.3701,0.03,392,2388,100.0,39.03,23.5046,2000-01-05 13:00:00\n612,2,292,25.0012,0.6204,60.0,462.54,537.25,1266.48,1065.79,7.05,9.03,174.52,1915.45,8018.54,0.94,37.33,164.56,2028.37,7886.27,11.001,0.02,309,1915,84.93,14.06,8.3943,2000-01-05 06:00:00\n304,1,305,0.0016,0.0,100.0,518.67,642.94,1598.86,1421.57,14.62,21.58,564.02,2388.41,9097.85,1.31,47.87,531.54,2388.33,8176.48,8.2561,0.03,396,2388,100.0,39.25,23.6714,2000-01-03 02:40:00\n170,1,171,9.9998,0.25,100.0,489.05,604.45,1495.4,1299.94,10.52,15.46,393.7,2318.7,8776.96,1.26,44.95,371.0,2387.92,8129.09,8.5932,0.03,367,2319,100.0,28.56,17.2238,2000-01-02 04:20:00\n799,3,180,10.0077,0.25,100.0,489.05,604.52,1498.66,1306.23,10.52,15.48,397.82,2318.96,8784.15,1.26,45.24,374.74,2388.19,8148.16,8.5358,0.03,369,2319,100.0,28.84,17.2152,2000-01-06 13:10:00\n596,2,276,35.0048,0.8404,100.0,449.44,556.33,1370.97,1141.33,5.48,8.0,194.08,2223.04,8357.64,1.02,42.33,182.67,2388.13,8065.29,9.4044,0.02,338,2223,100.0,14.94,8.8533,2000-01-05 03:20:00\n827,3,208,25.0041,0.6217,60.0,462.54,536.71,1258.16,1045.31,7.05,9.01,176.6,1915.48,8018.53,0.94,36.55,165.84,2028.45,7882.85,10.784,0.02,306,1915,84.93,14.42,8.6976,2000-01-06 17:50:00\n34,1,35,9.9991,0.25,100.0,489.05,604.18,1491.92,1296.02,10.52,15.47,393.79,2318.73,8769.63,1.26,44.93,370.54,2387.9,8122.59,8.5963,0.03,367,2319,100.0,28.41,17.2067,2000-01-01 05:40:00\n452,2,132,25.0028,0.62,60.0,462.54,536.5,1261.99,1046.97,7.05,9.02,175.3,1915.26,8006.43,0.94,36.53,164.86,2028.13,7871.65,10.8833,0.02,306,1915,84.93,14.35,8.5933,2000-01-04 03:20:00\n441,2,121,42.0055,0.84,100.0,445.0,549.46,1354.41,1119.7,3.91,5.72,139.02,2211.84,8306.94,1.02,41.79,130.67,2387.91,8081.03,9.3361,0.02,332,2212,100.0,10.57,6.3467,2000-01-04 01:30:00\n374,2,54,35.006,0.84,100.0,449.44,554.9,1367.23,1127.67,5.48,8.0,193.95,2222.84,8344.06,1.02,41.73,183.32,2387.9,8066.86,9.3155,0.02,332,2223,100.0,14.87,8.937000000000003,2000-01-03 14:20:00\n253,1,254,10.0058,0.25,100.0,489.05,604.66,1499.83,1309.53,10.52,15.46,396.52,2318.94,8785.19,1.26,45.42,373.41,2388.11,8146.93,8.58,0.03,369,2319,100.0,28.71,17.2996,2000-01-02 18:10:00\n17,1,18,42.0018,0.84,100.0,445.0,549.42,1344.69,1113.86,3.91,5.7,137.42,2211.94,8309.02,1.02,41.7,130.18,2387.98,8079.03,9.347,0.02,329,2212,100.0,10.62,6.3735,2000-01-01 02:50:00\n417,2,97,25.0043,0.6216,60.0,462.54,536.72,1259.78,1038.96,7.05,9.02,176.14,1915.24,8001.69,0.94,36.55,164.73,2028.16,7874.23,10.8953,0.02,308,1915,84.93,14.5,8.6234,2000-01-03 21:30:00\n180,1,181,0.0022,0.0,100.0,518.67,641.86,1580.64,1395.85,14.62,21.58,553.53,2387.94,9048.86,1.3,47.16,522.95,2387.98,8139.7,8.3796,0.03,391,2388,100.0,39.06,23.4657,2000-01-02 06:00:00\n33,1,34,35.0052,0.8403,100.0,449.44,554.64,1351.01,1122.88,5.48,7.98,193.26,2222.77,8335.33,1.02,41.37,182.43,2387.87,8058.22,9.3291,0.02,333,2223,100.0,14.89,8.9402,2000-01-01 05:30:00\n326,2,6,10.0044,0.2519,100.0,489.05,604.02,1493.35,1294.04,10.52,15.49,395.04,2318.83,8764.91,1.26,45.14,372.3,2388.05,8122.94,8.6255,0.03,368,2319,100.0,28.77,17.2051,2000-01-03 06:20:00\n146,1,147,19.999,0.7005,100.0,491.19,606.66,1474.26,1239.48,9.35,13.61,333.69,2323.76,8714.07,1.07,44.14,313.76,2387.89,8057.27,9.1998,0.02,362,2324,100.0,24.46,14.7882,2000-01-02 00:20:00\n624,3,5,0.0007,0.0015,100.0,518.67,642.22,1584.73,1401.2,14.62,21.59,556.8,2388.11,9060.33,1.3,47.27,523.65,2387.95,8139.21,8.3341,0.03,392,2388,100.0,39.12,23.5334,2000-01-05 08:00:00\n772,3,153,35.0068,0.8405,100.0,449.44,555.29,1363.04,1125.19,5.48,7.99,195.55,2223.07,8359.38,1.03,41.78,184.24,2388.16,8073.05,9.248,0.02,332,2223,100.0,15.0,8.9979,2000-01-06 08:40:00\n89,1,90,0.0021,0.0006,100.0,518.67,642.07,1576.06,1384.53,14.62,21.58,552.98,2387.94,9048.04,1.3,47.19,520.69,2387.94,8131.56,8.4011,0.03,391,2388,100.0,38.95,23.4175,2000-01-01 14:50:00\n721,3,102,0.0017,0.0001,100.0,518.67,641.96,1590.71,1399.79,14.62,21.6,557.41,2388.05,9063.94,1.3,47.43,525.04,2388.06,8142.71,8.3691,0.03,391,2388,100.0,39.16,23.4612,2000-01-06 00:10:00\n224,1,225,25.0019,0.622,60.0,462.54,537.07,1256.43,1040.15,7.05,9.01,176.45,1915.41,8009.7,0.94,36.61,165.11,2028.29,7874.86,10.7836,0.02,308,1915,84.93,14.22,8.6566,2000-01-02 13:20:00\n555,2,235,25.0042,0.6205,60.0,462.54,537.09,1257.69,1044.48,7.05,9.03,176.04,1915.34,8013.49,0.94,36.85,164.28,2028.26,7876.69,10.8927,0.02,308,1915,84.93,14.11,8.6391,2000-01-04 20:30:00\n615,2,295,19.9982,0.7002,100.0,491.19,608.6,1501.41,1263.71,9.35,13.66,333.34,2324.21,8746.56,1.07,44.88,313.79,2388.27,8067.36,9.3213,0.03,368,2324,100.0,24.25,14.6146,2000-01-05 06:30:00\n254,1,255,35.0069,0.84,100.0,449.44,555.72,1353.47,1123.29,5.48,7.97,195.37,2223.04,8352.55,1.03,41.75,183.24,2388.16,8075.19,9.2251,0.02,333,2223,100.0,14.9,8.9047,2000-01-02 18:20:00\n797,3,178,20.0048,0.7012,100.0,491.19,607.1,1482.59,1243.88,9.35,13.63,337.17,2324.0,8724.32,1.08,44.25,317.04,2388.16,8065.36,9.0956,0.02,364,2324,100.0,24.62,14.7195,2000-01-06 12:50:00\n840,3,221,10.0029,0.251,100.0,489.05,604.49,1499.85,1311.48,10.52,15.48,398.01,2319.07,8797.46,1.26,45.38,375.36,2388.24,8150.68,8.5381,0.03,369,2319,100.0,28.81,17.2773,2000-01-06 20:00:00\n42,1,43,25.0043,0.6212,60.0,462.54,536.31,1256.04,1028.79,7.05,9.01,174.24,1915.24,7994.03,0.94,36.42,163.84,2028.18,7865.94,10.8548,0.02,305,1915,84.93,14.4,8.6184,2000-01-01 07:00:00\n551,2,231,41.9985,0.8416,100.0,445.0,549.31,1360.88,1130.19,3.91,5.72,139.01,2211.87,8325.47,1.02,42.26,130.27,2387.97,8083.41,9.4042,0.02,332,2212,100.0,10.55,6.242000000000001,2000-01-04 19:50:00\n411,2,91,20.0005,0.7,100.0,491.19,607.04,1479.77,1250.81,9.35,13.65,334.67,2323.89,8718.34,1.08,44.13,315.74,2388.07,8062.21,9.178,0.02,364,2324,100.0,24.5,14.8532,2000-01-03 20:30:00\n395,2,75,42.0022,0.84,100.0,445.0,549.37,1352.04,1118.96,3.91,5.72,139.41,2211.87,8317.53,1.02,42.03,130.92,2387.97,8080.28,9.3429,0.02,328,2212,100.0,10.62,6.4302,2000-01-03 17:50:00\n310,1,311,42.0044,0.8401,100.0,445.0,549.86,1364.9,1141.2,3.91,5.69,141.82,2212.41,8369.27,1.04,42.4,133.26,2388.5,8125.58,9.0937,0.02,332,2212,100.0,10.79,6.4548,2000-01-03 03:40:00\n513,2,193,20.0037,0.7007,100.0,491.19,607.66,1483.09,1245.67,9.35,13.66,334.38,2323.91,8728.61,1.08,44.33,314.94,2388.11,8061.85,9.2438,0.02,365,2324,100.0,24.64,14.6071,2000-01-04 13:30:00\n518,2,198,0.0003,0.0,100.0,518.67,643.19,1588.14,1401.02,14.62,21.61,553.01,2388.07,9055.52,1.3,47.43,521.8,2388.1,8132.51,8.4796,0.03,394,2388,100.0,38.82,23.3045,2000-01-04 14:20:00\n666,3,47,41.9996,0.84,100.0,445.0,549.39,1349.57,1112.58,3.91,5.7,139.72,2211.98,8321.42,1.03,41.71,131.26,2388.04,8090.08,9.3046,0.02,330,2212,100.0,10.63,6.3641,2000-01-05 15:00:00\n431,2,111,24.9986,0.621,60.0,462.54,536.46,1260.94,1039.47,7.05,9.02,176.42,1915.28,8004.51,0.94,36.43,164.56,2028.18,7871.81,10.8897,0.02,306,1915,84.93,14.31,8.52,2000-01-03 23:50:00\n120,1,121,35.001,0.84,100.0,449.44,555.1,1348.61,1113.96,5.48,7.98,192.81,2222.77,8334.48,1.02,41.52,182.13,2387.93,8058.81,9.2515,0.02,332,2223,100.0,14.82,8.9027,2000-01-01 20:00:00\n455,2,135,25.0044,0.62,60.0,462.54,536.65,1257.1,1044.39,7.05,9.02,175.55,1915.26,8007.59,0.94,36.61,164.68,2028.21,7875.09,10.8684,0.02,305,1915,84.93,14.29,8.6032,2000-01-04 03:50:00\n106,1,107,25.0073,0.6206,60.0,462.54,536.2,1258.8,1035.5,7.05,9.0,174.56,1915.23,7997.07,0.94,36.46,163.35,2028.12,7861.63,10.8509,0.02,305,1915,84.93,14.24,8.6356,2000-01-01 17:40:00\n113,1,114,10.0039,0.2509,100.0,489.05,604.28,1493.73,1295.14,10.52,15.46,393.2,2318.64,8769.27,1.26,45.0,369.99,2387.87,8122.62,8.6053,0.03,368,2319,100.0,28.6,17.1584,2000-01-01 18:50:00\n427,2,107,9.9981,0.25,100.0,489.05,604.74,1495.27,1306.32,10.52,15.49,395.82,2318.86,8771.13,1.26,45.28,372.07,2388.1,8126.06,8.6415,0.03,371,2319,100.0,28.82,17.1272,2000-01-03 23:10:00\n136,1,137,42.0051,0.8413,100.0,445.0,549.5,1343.94,1114.96,3.91,5.69,138.13,2211.94,8312.78,1.02,41.74,130.31,2388.0,8076.73,9.3641,0.02,328,2212,100.0,10.72,6.3056,2000-01-01 22:40:00\n345,2,25,10.0034,0.2504,100.0,489.05,604.66,1496.95,1294.67,10.52,15.49,395.16,2318.81,8773.75,1.26,45.22,371.67,2388.02,8123.71,8.629,0.03,367,2319,100.0,28.79,17.2477,2000-01-03 09:30:00\n741,3,122,0.0025,0.0017,100.0,518.67,642.32,1579.52,1402.07,14.62,21.6,556.69,2388.04,9058.36,1.3,47.31,524.32,2388.01,8141.56,8.3199,0.03,393,2388,100.0,39.24,23.406,2000-01-06 03:30:00\n632,3,13,10.0047,0.2512,100.0,489.05,604.45,1489.04,1305.94,10.52,15.48,396.04,2318.84,8781.53,1.26,45.09,372.52,2388.02,8135.63,8.5675,0.03,369,2319,100.0,28.83,17.2135,2000-01-05 09:20:00\n585,2,265,34.9984,0.84,100.0,449.44,556.19,1373.46,1142.13,5.48,8.0,194.33,2223.07,8362.67,1.02,42.25,183.11,2388.2,8070.09,9.3651,0.02,336,2223,100.0,14.7,8.8738,2000-01-05 01:30:00\n221,1,222,42.0007,0.84,100.0,445.0,549.39,1350.21,1109.78,3.91,5.69,138.61,2212.0,8321.04,1.02,41.77,129.9,2388.09,8084.32,9.2734,0.02,330,2212,100.0,10.72,6.4661,2000-01-02 12:50:00\n290,1,291,25.0067,0.62,60.0,462.54,536.86,1261.69,1053.07,7.05,9.0,177.71,1915.61,8027.32,0.94,36.9,166.78,2028.57,7892.67,10.7383,0.02,306,1915,84.93,14.39,8.5576,2000-01-03 00:20:00\n522,2,202,20.0062,0.7018,100.0,491.19,607.85,1486.14,1253.72,9.35,13.65,334.62,2324.01,8723.45,1.08,44.55,314.82,2388.09,8063.5,9.2398,0.02,363,2324,100.0,24.64,14.7055,2000-01-04 15:00:00\n402,2,82,10.0043,0.25,100.0,489.05,604.52,1497.85,1305.23,10.52,15.49,394.75,2318.84,8774.32,1.26,45.28,371.63,2388.07,8125.43,8.6053,0.03,369,2319,100.0,28.71,17.2704,2000-01-03 19:00:00\n590,2,270,10.0004,0.25,100.0,489.05,605.4,1505.26,1330.11,10.52,15.5,393.68,2319.14,8790.57,1.26,45.77,371.04,2388.27,8140.22,8.7052,0.03,370,2319,100.0,28.55,17.0503,2000-01-05 02:20:00\n859,3,240,41.9984,0.84,100.0,445.0,549.23,1355.9,1129.44,3.91,5.7,140.02,2212.16,8345.35,1.03,42.22,132.08,2388.28,8108.89,9.2067,0.02,331,2212,100.0,10.74,6.4060000000000015,2000-01-06 23:10:00\n90,1,91,9.9992,0.25,100.0,489.05,604.5,1495.21,1297.27,10.52,15.47,394.31,2318.68,8770.68,1.26,45.18,370.4,2387.93,8125.2,8.6104,0.03,366,2319,100.0,28.62,16.9787,2000-01-01 15:00:00\n285,1,286,35.0033,0.84,100.0,449.44,555.47,1362.33,1131.66,5.48,7.97,196.68,2223.32,8375.82,1.03,41.97,185.7,2388.42,8089.57,9.1451,0.02,335,2223,100.0,15.0,8.9859,2000-01-02 23:30:00\n474,2,154,41.9997,0.8414,100.0,445.0,549.82,1353.23,1118.16,3.91,5.71,138.85,2211.84,8313.4,1.02,41.92,130.1,2387.95,8083.39,9.3619,0.02,331,2212,100.0,10.76,6.4619,2000-01-04 07:00:00\n776,3,157,42.0063,0.8417,100.0,445.0,549.15,1349.27,1118.57,3.91,5.7,139.36,2212.08,8325.0,1.03,41.85,130.69,2388.11,8096.73,9.2735,0.02,332,2212,100.0,10.47,6.4362,2000-01-06 09:20:00\n215,1,216,24.9999,0.6203,60.0,462.54,536.62,1268.2,1041.39,7.05,9.0,175.64,1915.34,8002.48,0.94,36.47,164.85,2028.22,7872.86,10.8151,0.02,305,1915,84.93,14.39,8.6277,2000-01-02 11:50:00\n384,2,64,25.0044,0.6219,60.0,462.54,536.74,1249.68,1046.37,7.05,9.02,176.02,1915.26,8002.27,0.94,36.53,164.44,2028.13,7869.37,10.8451,0.02,306,1915,84.93,14.19,8.5394,2000-01-03 16:00:00\n858,3,239,24.9997,0.62,60.0,462.54,537.27,1270.23,1046.72,7.05,9.01,177.43,1915.57,8025.35,0.94,36.65,166.32,2028.46,7888.46,10.7744,0.02,308,1915,84.93,14.4,8.6578,2000-01-06 23:00:00\n787,3,168,42.0045,0.84,100.0,445.0,549.48,1347.56,1120.21,3.91,5.7,139.4,2212.04,8326.05,1.03,41.92,131.72,2388.18,8097.49,9.257,0.02,330,2212,100.0,10.72,6.4197,2000-01-06 11:10:00\n220,1,221,35.008,0.8419,100.0,449.44,555.22,1354.38,1120.61,5.48,7.97,194.68,2223.01,8346.78,1.02,41.86,183.51,2388.09,8067.12,9.2696,0.02,332,2223,100.0,14.76,8.9688,2000-01-02 12:40:00\n605,2,285,10.0026,0.25,100.0,489.05,605.62,1505.86,1323.3,10.52,15.5,393.2,2319.1,8793.96,1.26,45.86,370.2,2388.29,8134.69,8.7134,0.03,372,2319,100.0,28.21,17.0421,2000-01-05 04:50:00\n423,2,103,20.0077,0.7,100.0,491.19,607.05,1479.23,1251.22,9.35,13.65,335.28,2323.94,8715.66,1.08,44.17,315.46,2388.05,8053.72,9.2119,0.02,365,2324,100.0,24.33,14.6151,2000-01-03 22:30:00\n53,1,54,42.0026,0.841,100.0,445.0,548.85,1345.46,1108.95,3.91,5.7,138.18,2211.88,8311.53,1.02,41.8,129.83,2387.99,8075.98,9.355,0.02,329,2212,100.0,10.61,6.3754,2000-01-01 08:50:00\n669,3,50,25.0033,0.6211,60.0,462.54,536.38,1258.7,1039.37,7.05,9.01,176.51,1915.41,8008.66,0.94,36.61,165.61,2028.33,7874.2,10.8552,0.02,306,1915,84.93,14.41,8.589,2000-01-05 15:30:00\n563,2,243,0.0008,0.0,100.0,518.67,642.56,1594.19,1416.4,14.62,21.61,552.87,2388.14,9062.52,1.3,47.8,520.53,2388.13,8139.76,8.4624,0.03,393,2388,100.0,38.74,23.0691,2000-01-04 21:50:00\n616,2,296,20.0078,0.7,100.0,491.19,608.93,1495.42,1278.71,9.35,13.66,333.63,2324.17,8743.57,1.07,45.1,314.26,2388.35,8076.25,9.2883,0.03,368,2324,100.0,24.43,14.5192,2000-01-05 06:40:00\n622,3,3,0.0019,0.0002,100.0,518.67,642.37,1583.69,1394.99,14.62,21.6,555.55,2388.04,9060.27,1.3,47.25,523.91,2388.06,8144.02,8.3698,0.03,393,2388,100.0,39.24,23.5148,2000-01-05 07:40:00\n278,1,279,25.0009,0.62,60.0,462.54,536.49,1254.3,1044.41,7.05,9.0,176.65,1915.55,8025.76,0.94,36.55,165.35,2028.44,7883.24,10.7596,0.02,306,1915,84.93,14.45,8.7187,2000-01-02 22:20:00\n189,1,190,10.0042,0.25,100.0,489.05,604.66,1490.27,1289.4,10.52,15.46,394.2,2318.7,8770.12,1.26,45.0,371.31,2387.95,8129.69,8.6015,0.03,369,2319,100.0,28.78,17.153,2000-01-02 07:30:00\n464,2,144,20.002,0.7013,100.0,491.19,607.29,1485.66,1248.52,9.35,13.65,334.8,2323.89,8728.09,1.08,44.41,314.98,2388.05,8056.85,9.1827,0.02,364,2324,100.0,24.62,14.7756,2000-01-04 05:20:00\n50,1,51,10.0046,0.2505,100.0,489.05,604.11,1498.59,1303.71,10.52,15.47,393.47,2318.65,8773.48,1.26,45.03,371.04,2387.84,8124.64,8.5976,0.03,367,2319,100.0,28.47,17.1766,2000-01-01 08:20:00\n762,3,143,25.0072,0.62,60.0,462.54,536.69,1257.59,1042.87,7.05,9.01,176.57,1915.39,8013.9,0.94,36.76,164.89,2028.32,7876.66,10.8201,0.02,305,1915,84.93,14.46,8.5861,2000-01-06 07:00:00\n283,1,284,35.0062,0.84,100.0,449.44,556.03,1364.51,1135.44,5.48,7.97,195.98,2223.29,8370.24,1.03,41.92,185.13,2388.39,8085.22,9.1827,0.02,333,2223,100.0,14.94,9.1698,2000-01-02 23:10:00\n793,3,174,34.9982,0.8417,100.0,449.44,555.58,1362.66,1129.27,5.48,7.99,195.51,2223.1,8366.83,1.03,41.94,184.85,2388.17,8074.61,9.245,0.02,333,2223,100.0,14.76,9.0653,2000-01-06 12:10:00\n262,1,263,20.0005,0.7003,100.0,491.19,607.29,1485.86,1243.9,9.35,13.61,336.32,2324.03,8735.89,1.08,44.28,317.37,2388.17,8073.08,9.1316,0.02,365,2324,100.0,24.68,14.7969,2000-01-02 19:40:00\n83,1,84,20.0031,0.7,100.0,491.19,606.79,1469.57,1238.58,9.35,13.61,332.53,2323.7,8702.15,1.07,43.94,313.84,2387.83,8055.89,9.1847,0.02,364,2324,100.0,24.43,14.7178,2000-01-01 13:50:00\n479,2,159,0.0026,0.0016,100.0,518.67,642.3,1591.93,1402.39,14.62,21.61,553.26,2388.05,9052.71,1.3,47.43,521.77,2388.06,8131.65,8.4211,0.03,393,2388,100.0,39.02,23.2189,2000-01-04 07:50:00\n282,1,283,0.0026,0.0,100.0,518.67,642.63,1588.31,1407.42,14.62,21.58,559.9,2388.21,9076.58,1.31,47.55,528.45,2388.18,8160.17,8.307,0.03,394,2388,100.0,39.31,23.568,2000-01-02 23:00:00\n538,2,218,9.9983,0.2514,100.0,489.05,604.78,1500.15,1311.09,10.52,15.49,393.82,2318.97,8780.31,1.26,45.51,371.76,2388.17,8129.32,8.6958,0.03,369,2319,100.0,28.61,16.964000000000002,2000-01-04 17:40:00\n35,1,36,41.9996,0.8402,100.0,445.0,548.75,1339.51,1111.43,3.91,5.7,137.71,2211.84,8298.92,1.02,41.66,129.9,2387.98,8071.54,9.3344,0.02,329,2212,100.0,10.58,6.3067,2000-01-01 05:50:00\n289,1,290,10.0065,0.2502,100.0,489.05,604.32,1497.66,1299.22,10.52,15.46,399.91,2319.18,8812.72,1.27,45.41,376.74,2388.36,8154.71,8.5457,0.03,370,2319,100.0,28.81,17.2731,2000-01-03 00:10:00\n559,2,239,10.0044,0.2513,100.0,489.05,604.86,1514.65,1309.12,10.52,15.5,394.4,2319.02,8791.35,1.26,45.56,371.22,2388.2,8135.77,8.6854,0.03,372,2319,100.0,28.64,17.0496,2000-01-04 21:10:00\n777,3,158,42.0033,0.84,100.0,445.0,549.43,1355.52,1125.51,3.91,5.7,139.23,2212.06,8323.72,1.03,41.75,131.6,2388.12,8089.38,9.2777,0.02,330,2212,100.0,10.62,6.3918,2000-01-06 09:30:00\n434,2,114,20.0075,0.7001,100.0,491.19,606.84,1488.89,1246.02,9.35,13.65,334.38,2323.9,8732.8,1.08,44.09,315.16,2388.06,8058.07,9.2187,0.02,365,2324,100.0,24.71,14.7727,2000-01-04 00:20:00\n611,2,291,42.0055,0.84,100.0,445.0,550.15,1362.85,1142.72,3.91,5.72,138.36,2211.94,8339.17,1.02,42.59,130.24,2388.03,8097.77,9.4804,0.02,334,2212,100.0,10.52,6.2306,2000-01-05 05:50:00\n225,1,226,35.0033,0.84,100.0,449.44,555.31,1359.02,1116.75,5.48,7.97,194.78,2223.01,8350.81,1.02,41.68,183.02,2388.04,8067.6,9.2774,0.02,333,2223,100.0,15.02,8.9524,2000-01-02 13:30:00\n651,3,32,10.0034,0.2502,100.0,489.05,604.4,1495.03,1295.49,10.52,15.48,396.05,2318.88,8776.16,1.26,45.28,373.2,2388.1,8132.38,8.5913,0.03,368,2319,100.0,28.77,17.2713,2000-01-05 12:30:00\n595,2,275,35.0055,0.84,100.0,449.44,556.08,1370.15,1144.42,5.48,8.0,194.28,2223.02,8357.95,1.02,42.27,182.77,2388.15,8066.53,9.3835,0.02,335,2223,100.0,14.82,8.7855,2000-01-05 03:10:00\n167,1,168,35.0072,0.8408,100.0,449.44,554.56,1359.24,1122.2,5.48,7.97,194.26,2222.83,8343.54,1.02,41.64,182.5,2387.95,8062.85,9.3146,0.02,332,2223,100.0,14.86,9.0275,2000-01-02 03:50:00\n260,1,261,41.9997,0.84,100.0,445.0,548.83,1349.98,1127.96,3.91,5.69,139.12,2212.09,8335.55,1.03,42.01,131.15,2388.22,8098.4,9.2483,0.02,331,2212,100.0,10.5,6.4679,2000-01-02 19:20:00\n139,1,140,0.0009,0.0002,100.0,518.67,641.74,1588.39,1391.63,14.62,21.58,553.22,2387.94,9033.82,1.3,46.84,520.84,2387.91,8129.47,8.4,0.03,391,2388,100.0,38.95,23.3584,2000-01-01 23:10:00\n288,1,289,41.9986,0.84,100.0,445.0,549.2,1351.64,1128.54,3.91,5.69,140.08,2212.23,8349.72,1.03,42.2,133.09,2388.41,8114.22,9.2202,0.02,333,2212,100.0,10.81,6.4002,2000-01-03 00:00:00\n650,3,31,10.0025,0.25,100.0,489.05,604.86,1498.97,1300.06,10.52,15.48,395.91,2318.9,8786.83,1.26,45.35,372.83,2388.13,8136.05,8.5768,0.03,368,2319,100.0,28.74,17.2396,2000-01-05 12:20:00\n184,1,185,9.998,0.2518,100.0,489.05,604.7,1487.83,1304.36,10.52,15.46,394.18,2318.7,8770.5,1.26,44.95,371.75,2387.98,8129.38,8.5802,0.03,368,2319,100.0,28.65,17.1736,2000-01-02 06:40:00\n821,3,202,42.0064,0.84,100.0,445.0,549.06,1351.15,1126.16,3.91,5.71,140.38,2212.08,8335.73,1.03,41.98,131.58,2388.14,8101.38,9.2374,0.02,330,2212,100.0,10.61,6.511,2000-01-06 16:50:00\n796,3,177,20.0047,0.7013,100.0,491.19,607.29,1482.41,1250.6,9.35,13.64,336.44,2324.05,8733.35,1.08,44.26,316.92,2388.17,8066.47,9.1149,0.02,365,2324,100.0,24.53,14.8078,2000-01-06 12:40:00\n740,3,121,25.0012,0.6211,60.0,462.54,536.16,1255.48,1045.45,7.05,9.01,175.63,1915.38,8003.83,0.94,36.66,164.77,2028.34,7880.81,10.8502,0.02,307,1915,84.93,14.3,8.5979,2000-01-06 03:20:00\n465,2,145,41.9995,0.8413,100.0,445.0,549.3,1347.35,1126.69,3.91,5.71,139.0,2211.9,8315.97,1.02,41.98,130.91,2387.91,8086.18,9.343,0.02,330,2212,100.0,10.6,6.3849,2000-01-04 05:30:00\n409,2,89,25.0059,0.6211,60.0,462.54,536.28,1256.77,1041.22,7.05,9.03,175.78,1915.31,8006.35,0.94,36.59,164.51,2028.18,7870.66,10.8489,0.02,305,1915,84.93,14.43,8.5451,2000-01-03 20:10:00\n325,2,5,24.9999,0.62,60.0,462.54,537.0,1259.55,1043.95,7.05,9.03,175.64,1915.26,8012.87,0.94,36.34,165.3,2028.13,7867.08,10.8841,0.02,307,1915,84.93,14.26,8.5789,2000-01-03 06:10:00\n546,2,226,9.9993,0.25,100.0,489.05,605.21,1512.12,1308.88,10.52,15.49,394.3,2318.97,8781.76,1.26,45.38,370.91,2388.22,8125.68,8.6804,0.03,371,2319,100.0,28.5,17.1838,2000-01-04 19:00:00\n792,3,173,25.0065,0.62,60.0,462.54,536.61,1244.8,1046.45,7.05,9.01,175.85,1915.43,8014.09,0.94,36.63,164.84,2028.29,7882.17,10.7961,0.02,305,1915,84.93,14.27,8.6309,2000-01-06 12:00:00\n340,2,20,0.0013,0.0,100.0,518.67,641.71,1590.66,1402.08,14.62,21.61,554.16,2388.05,9047.28,1.3,47.18,521.73,2388.06,8132.47,8.3901,0.03,391,2388,100.0,39.1,23.4692,2000-01-03 08:40:00\n584,2,264,0.0002,0.0,100.0,518.67,643.25,1597.01,1423.87,14.62,21.61,552.85,2388.17,9066.22,1.3,47.94,520.39,2388.09,8141.51,8.4701,0.03,395,2388,100.0,38.74,23.2544,2000-01-05 01:20:00\n617,2,297,24.9993,0.6205,60.0,462.54,537.21,1264.64,1070.69,7.05,9.03,174.94,1915.47,8027.48,0.94,37.38,163.82,2028.42,7885.78,11.0337,0.02,308,1915,84.93,14.09,8.5068,2000-01-05 06:50:00\n55,1,56,20.0018,0.7,100.0,491.19,605.96,1478.09,1241.52,9.35,13.61,333.13,2323.69,8713.43,1.07,44.08,313.51,2387.8,8052.98,9.189,0.02,362,2324,100.0,24.42,14.5716,2000-01-01 09:10:00\n696,3,77,0.0009,0.0017,100.0,518.67,642.16,1588.17,1397.94,14.62,21.6,556.68,2388.08,9064.76,1.3,47.3,523.73,2388.07,8146.6,8.3629,0.03,393,2388,100.0,39.11,23.476,2000-01-05 20:00:00\n828,3,209,20.0033,0.7,100.0,491.19,607.43,1482.99,1250.28,9.35,13.64,337.27,2324.15,8742.96,1.08,44.55,318.41,2388.29,8075.66,9.1121,0.02,365,2324,100.0,24.63,14.8223,2000-01-06 18:00:00\n814,3,195,35.0058,0.84,100.0,449.44,555.28,1366.23,1120.92,5.48,7.99,195.69,2223.15,8366.06,1.03,41.81,184.95,2388.27,8083.37,9.2435,0.02,333,2223,100.0,14.88,8.9352,2000-01-06 15:40:00\n664,3,45,25.006,0.6202,60.0,462.54,536.19,1252.9,1044.37,7.05,9.01,176.4,1915.35,8013.42,0.94,36.47,165.29,2028.2,7872.6,10.8179,0.02,308,1915,84.93,14.48,8.6027,2000-01-05 14:40:00\n656,3,37,10.0064,0.25,100.0,489.05,604.38,1495.98,1305.73,10.52,15.48,395.54,2318.86,8782.9,1.26,44.98,373.32,2388.03,8136.45,8.5953,0.03,368,2319,100.0,28.83,17.137,2000-01-05 13:20:00\n286,1,287,41.9989,0.84,100.0,445.0,549.48,1358.59,1129.22,3.91,5.69,140.73,2212.29,8345.25,1.03,42.22,132.15,2388.34,8110.7,9.2351,0.02,332,2212,100.0,10.68,6.3814,2000-01-02 23:40:00\n163,1,164,0.0005,0.0001,100.0,518.67,642.03,1582.24,1381.65,14.62,21.57,552.92,2388.01,9046.81,1.3,46.98,520.35,2387.98,8126.93,8.3579,0.03,390,2388,100.0,38.83,23.3056,2000-01-02 03:10:00\n496,2,176,42.0036,0.8417,100.0,445.0,549.78,1347.81,1123.17,3.91,5.71,138.23,2211.95,8320.14,1.02,42.17,130.66,2387.99,8081.41,9.3494,0.02,331,2212,100.0,10.75,6.3057,2000-01-04 10:40:00\n539,2,219,0.0001,0.0003,100.0,518.67,642.39,1593.51,1411.1,14.62,21.61,553.21,2388.11,9058.41,1.3,47.63,521.31,2388.08,8134.25,8.4503,0.03,393,2388,100.0,38.8,23.2526,2000-01-04 17:50:00\n734,3,115,35.006,0.84,100.0,449.44,555.96,1363.82,1130.4,5.48,7.99,195.3,2223.04,8355.8,1.03,41.66,184.51,2388.12,8077.27,9.2275,0.02,335,2223,100.0,14.9,8.9598,2000-01-06 02:20:00\n482,2,162,42.0076,0.84,100.0,445.0,549.62,1356.89,1128.49,3.91,5.72,138.53,2211.89,8315.69,1.02,42.02,130.41,2387.92,8081.71,9.3541,0.02,330,2212,100.0,10.48,6.3066,2000-01-04 08:20:00\n523,2,203,25.0024,0.6206,60.0,462.54,537.3,1263.03,1049.22,7.05,9.03,175.38,1915.39,8008.77,0.94,36.82,164.42,2028.24,7871.47,10.8758,0.02,307,1915,84.93,14.27,8.5427,2000-01-04 15:10:00\n844,3,225,42.00100000000001,0.8413,100.0,445.0,549.11,1355.17,1125.82,3.91,5.7,139.66,2212.15,8337.88,1.03,42.06,131.85,2388.21,8101.86,9.2629,0.02,332,2212,100.0,10.67,6.3382,2000-01-06 20:40:00\n614,2,294,0.0006,0.0008,100.0,518.67,643.88,1593.31,1434.23,14.62,21.61,551.27,2388.28,9076.48,1.3,48.16,519.91,2388.28,8139.92,8.5105,0.03,396,2388,100.0,38.53,23.1601,2000-01-05 06:20:00\n213,1,214,25.0035,0.62,60.0,462.54,536.59,1261.02,1044.6,7.05,9.01,175.8,1915.37,8011.26,0.94,36.6,164.07,2028.24,7872.1,10.8204,0.02,306,1915,84.93,14.41,8.5856,2000-01-02 11:30:00\n658,3,39,25.0022,0.6211,60.0,462.54,536.84,1256.16,1048.08,7.05,9.01,175.96,1915.41,8009.67,0.94,36.4,165.6,2028.26,7880.33,10.7715,0.02,306,1915,84.93,14.13,8.6263,2000-01-05 13:40:00\n735,3,116,25.0034,0.62,60.0,462.54,536.56,1257.1,1048.28,7.05,9.01,175.9,1915.44,8014.52,0.94,36.32,165.26,2028.3,7875.31,10.8137,0.02,304,1915,84.93,14.29,8.5399,2000-01-06 02:30:00\n31,1,32,35.0063,0.84,100.0,449.44,554.87,1349.83,1117.86,5.48,7.97,193.77,2222.81,8346.2,1.02,41.33,182.53,2387.92,8062.45,9.3194,0.02,331,2223,100.0,15.12,8.9317,2000-01-01 05:10:00\n390,2,70,9.9993,0.2508,100.0,489.05,604.9,1504.04,1306.32,10.52,15.49,395.38,2318.89,8777.8,1.26,45.31,372.4,2388.03,8126.94,8.6117,0.03,367,2319,100.0,28.75,17.2308,2000-01-03 17:00:00\n760,3,141,42.0057,0.84,100.0,445.0,548.99,1341.15,1118.49,3.91,5.71,139.04,2212.0,8333.59,1.03,41.96,130.73,2388.14,8096.99,9.2797,0.02,330,2212,100.0,10.78,6.4552,2000-01-06 06:40:00\n657,3,38,35.0011,0.84,100.0,449.44,555.06,1362.46,1126.37,5.48,7.99,195.47,2223.03,8360.29,1.03,41.81,183.44,2388.11,8066.94,9.2512,0.02,333,2223,100.0,14.94,9.0608,2000-01-05 13:30:00\n718,3,99,25.0056,0.62,60.0,462.54,536.53,1261.39,1045.65,7.05,9.02,176.21,1915.43,8007.12,0.94,36.49,165.81,2028.33,7879.75,10.8297,0.02,306,1915,84.93,14.39,8.5882,2000-01-05 23:40:00\n784,3,165,35.0011,0.84,100.0,449.44,555.27,1361.24,1130.95,5.48,7.99,195.95,2223.11,8360.62,1.03,41.72,184.38,2388.16,8073.8,9.2371,0.02,332,2223,100.0,15.1,9.0651,2000-01-06 10:40:00\n203,1,204,42.0005,0.84,100.0,445.0,549.11,1347.56,1115.33,3.91,5.69,138.18,2212.03,8318.21,1.02,41.69,130.25,2388.08,8083.19,9.362,0.02,331,2212,100.0,10.68,6.311,2000-01-02 09:50:00\n359,2,39,10.0071,0.25,100.0,489.05,604.31,1494.42,1298.36,10.52,15.49,395.24,2318.83,8779.74,1.26,45.28,371.96,2388.03,8127.25,8.5914,0.03,369,2319,100.0,28.4,17.198,2000-01-03 11:50:00\n717,3,98,10.0029,0.2515,100.0,489.05,604.46,1502.16,1298.41,10.52,15.48,396.21,2318.96,8791.09,1.26,45.25,373.1,2388.07,8135.8,8.5852,0.03,368,2319,100.0,28.9,17.2293,2000-01-05 23:30:00\n757,3,138,24.999,0.6208,60.0,462.54,536.76,1262.06,1048.29,7.05,9.02,176.83,1915.41,8020.19,0.94,36.62,164.92,2028.27,7879.46,10.8114,0.02,307,1915,84.93,14.26,8.6944,2000-01-06 06:10:00\n436,2,116,42.0011,0.84,100.0,445.0,549.62,1345.98,1122.12,3.91,5.71,138.55,2211.84,8318.22,1.02,41.92,130.7,2387.87,8077.75,9.3314,0.02,331,2212,100.0,10.49,6.3718,2000-01-04 00:40:00\n135,1,136,19.9984,0.7004,100.0,491.19,606.8,1478.85,1233.36,9.35,13.61,333.0,2323.72,8713.36,1.07,43.72,313.44,2387.85,8056.84,9.1891,0.02,362,2324,100.0,24.41,14.6817,2000-01-01 22:30:00\n430,2,110,0.0028,0.0,100.0,518.67,641.9,1586.19,1402.49,14.62,21.61,554.11,2388.05,9053.69,1.3,47.18,522.07,2388.02,8133.99,8.4273,0.03,392,2388,100.0,38.85,23.3925,2000-01-03 23:40:00\n724,3,105,19.9995,0.7005,100.0,491.19,607.02,1478.05,1244.46,9.35,13.64,336.75,2323.98,8728.04,1.08,44.23,316.91,2388.11,8068.43,9.1293,0.02,365,2324,100.0,24.63,14.7334,2000-01-06 00:40:00\n642,3,23,42.0025,0.84,100.0,445.0,548.83,1346.29,1113.11,3.91,5.7,139.16,2211.95,8325.81,1.02,42.03,130.79,2388.09,8088.39,9.3039,0.02,330,2212,100.0,10.62,6.2996,2000-01-05 11:00:00\n406,2,86,20.0066,0.7,100.0,491.19,607.41,1475.23,1241.91,9.35,13.65,334.59,2323.93,8717.26,1.08,44.15,315.29,2388.04,8053.72,9.1984,0.02,364,2324,100.0,24.65,14.7602,2000-01-03 19:40:00\n738,3,119,0.0005,0.0,100.0,518.67,641.64,1583.19,1395.92,14.62,21.6,557.36,2388.07,9062.32,1.3,47.49,525.23,2388.05,8145.27,8.3435,0.03,392,2388,100.0,39.05,23.5285,2000-01-06 03:00:00\n752,3,133,25.0071,0.6207,60.0,462.54,536.73,1256.07,1037.27,7.05,9.02,176.84,1915.49,8016.27,0.94,36.52,165.17,2028.36,7879.57,10.8002,0.02,308,1915,84.93,14.31,8.6881,2000-01-06 05:20:00\n848,3,229,9.9985,0.2519,100.0,489.05,605.09,1498.77,1302.17,10.52,15.48,399.17,2319.11,8810.61,1.27,45.44,375.92,2388.34,8155.15,8.5124,0.03,370,2319,100.0,28.89,17.3343,2000-01-06 21:20:00\n819,3,200,0.0002,0.0007,100.0,518.67,642.48,1593.82,1403.18,14.62,21.6,558.43,2388.14,9072.07,1.3,47.5,526.19,2388.14,8151.16,8.3185,0.03,390,2388,100.0,39.24,23.457,2000-01-06 16:30:00\n444,2,124,19.9986,0.7001,100.0,491.19,607.31,1487.92,1243.37,9.35,13.65,334.99,2323.86,8721.8,1.08,44.27,315.52,2388.02,8058.86,9.1539,0.02,365,2324,100.0,24.64,14.7913,2000-01-04 02:00:00\n507,2,187,25.0079,0.621,60.0,462.54,536.79,1267.5,1044.27,7.05,9.03,175.09,1915.31,8008.73,0.94,36.68,164.63,2028.24,7867.48,10.8825,0.02,306,1915,84.93,14.39,8.6029,2000-01-04 12:30:00\n567,2,247,35.0026,0.8412,100.0,449.44,556.19,1372.84,1134.82,5.48,8.0,194.07,2223.02,8353.44,1.02,42.23,182.38,2388.15,8065.29,9.3679,0.02,335,2223,100.0,14.67,8.8561,2000-01-04 22:30:00\n600,2,280,35.0039,0.8415,100.0,449.44,557.08,1376.88,1140.42,5.48,8.0,194.3,2223.05,8366.42,1.02,42.29,182.27,2388.16,8069.51,9.3743,0.02,337,2223,100.0,14.72,8.8314,2000-01-05 04:00:00\n212,1,213,35.0074,0.84,100.0,449.44,555.73,1354.63,1113.96,5.48,7.98,194.94,2222.94,8348.13,1.02,41.64,183.36,2388.05,8069.55,9.2956,0.02,332,2223,100.0,14.96,8.9486,2000-01-02 11:20:00\n8,1,9,42.0016,0.84,100.0,445.0,549.55,1342.85,1101.67,3.91,5.7,138.02,2211.9,8307.81,1.02,41.44,129.65,2388.0,8071.13,9.3384,0.02,328,2212,100.0,10.63,6.3055,2000-01-01 01:20:00\n306,1,307,42.0038,0.84,100.0,445.0,549.93,1363.45,1137.96,3.91,5.69,141.34,2212.37,8363.26,1.04,42.5,133.13,2388.51,8125.15,9.1589,0.02,332,2212,100.0,10.81,6.459,2000-01-03 03:00:00\n108,1,109,10.003,0.25,100.0,489.05,604.47,1488.78,1294.97,10.52,15.46,394.06,2318.66,8775.38,1.26,45.03,370.39,2387.88,8125.0,8.6277,0.03,369,2319,100.0,28.69,17.2045,2000-01-01 18:00:00\n744,3,125,20.0033,0.7003,100.0,491.19,606.49,1484.78,1244.86,9.35,13.63,336.82,2323.94,8731.29,1.08,44.09,316.73,2388.18,8070.76,9.1229,0.02,365,2324,100.0,24.72,14.8731,2000-01-06 04:00:00\n836,3,217,20.0019,0.7,100.0,491.19,607.46,1476.23,1250.39,9.35,13.64,338.26,2324.14,8741.9,1.08,44.46,317.47,2388.3,8076.99,9.0995,0.02,367,2324,100.0,24.97,14.8945,2000-01-06 19:20:00\n176,1,177,19.9999,0.7011,100.0,491.19,606.63,1472.26,1237.47,9.35,13.61,333.76,2323.77,8709.96,1.07,43.88,314.35,2387.86,8057.58,9.1902,0.02,363,2324,100.0,24.53,14.6337,2000-01-02 05:20:00\n703,3,84,9.9999,0.25,100.0,489.05,604.49,1494.74,1294.07,10.52,15.48,396.11,2318.89,8781.99,1.26,45.05,373.02,2388.09,8133.76,8.5869,0.03,368,2319,100.0,28.75,17.282,2000-01-05 21:10:00\n674,3,55,9.9985,0.2509,100.0,489.05,604.54,1499.4,1308.08,10.52,15.48,396.18,2318.83,8776.65,1.26,45.29,372.91,2388.08,8133.39,8.5892,0.03,368,2319,100.0,28.74,17.2626,2000-01-05 16:20:00\n248,1,249,42.0024,0.8409,100.0,445.0,548.95,1346.85,1118.97,3.91,5.69,140.21,2212.07,8324.3,1.02,41.77,130.68,2388.17,8093.56,9.2824,0.02,330,2212,100.0,10.68,6.3449,2000-01-02 17:20:00\n45,1,46,0.002,0.0,100.0,518.67,642.87,1577.07,1404.99,14.62,21.58,551.15,2387.43,9036.5,1.3,47.14,519.26,2387.45,8120.96,8.4421,0.03,389,2388,100.0,38.95,23.1802,2000-01-01 07:30:00\n159,1,160,0.0029,0.0009,100.0,518.67,642.06,1580.22,1393.23,14.62,21.58,553.3,2387.93,9053.32,1.3,47.13,521.49,2387.98,8129.08,8.3918,0.03,392,2388,100.0,39.2,23.5729,2000-01-02 02:30:00\n266,1,267,20.0002,0.7,100.0,491.19,607.44,1479.5,1253.37,9.35,13.61,336.58,2324.06,8736.16,1.08,44.49,316.96,2388.18,8074.89,9.1133,0.02,366,2324,100.0,24.61,14.7606,2000-01-02 20:20:00\n661,3,42,25.0007,0.62,60.0,462.54,536.6,1258.48,1040.24,7.05,9.01,176.61,1915.4,8014.27,0.94,36.64,165.04,2028.25,7879.6,10.8301,0.02,307,1915,84.93,14.21,8.6573,2000-01-05 14:10:00\n80,1,81,20.0068,0.7005,100.0,491.19,606.94,1473.75,1233.96,9.35,13.61,332.48,2323.7,8713.87,1.07,43.87,313.92,2387.85,8054.25,9.18,0.02,364,2324,100.0,24.42,14.6309,2000-01-01 13:20:00\n307,1,308,42.0074,0.8412,100.0,445.0,549.88,1357.0,1132.47,3.91,5.69,141.26,2212.46,8366.82,1.04,42.42,133.22,2388.48,8126.42,9.1432,0.02,332,2212,100.0,10.66,6.4843,2000-01-03 03:10:00\n663,3,44,25.0066,0.6204,60.0,462.54,536.22,1258.21,1043.88,7.05,9.01,176.02,1915.38,8008.94,0.94,36.53,165.68,2028.37,7880.88,10.8142,0.02,305,1915,84.93,14.49,8.5888,2000-01-05 14:30:00\n268,1,269,20.0059,0.7,100.0,491.19,607.65,1487.92,1252.67,9.35,13.6,337.09,2324.0,8740.45,1.08,44.41,316.67,2388.21,8075.13,9.1096,0.02,364,2324,100.0,24.7,14.7164,2000-01-02 20:40:00\n517,2,197,0.0022,0.0014,100.0,518.67,642.69,1587.26,1409.53,14.62,21.61,553.56,2388.11,9050.08,1.3,47.45,521.44,2388.08,8136.6,8.433,0.03,394,2388,100.0,38.98,23.3108,2000-01-04 14:10:00\n320,1,321,42.0058,0.84,100.0,445.0,549.71,1368.61,1147.0,3.91,5.7,143.06,2212.51,8384.47,1.05,42.56,134.79,2388.61,8138.46,9.1322,0.02,335,2212,100.0,10.81,6.459,2000-01-03 05:20:00\n645,3,26,25.0017,0.62,60.0,462.54,536.74,1254.15,1037.46,7.05,9.01,176.28,1915.36,8008.24,0.94,36.39,165.35,2028.24,7874.86,10.8214,0.02,308,1915,84.93,14.27,8.5793,2000-01-05 11:30:00\n267,1,268,0.0009,0.0002,100.0,518.67,642.58,1594.92,1399.39,14.62,21.58,559.32,2388.17,9073.34,1.31,47.34,527.07,2388.13,8152.64,8.3204,0.03,394,2388,100.0,39.37,23.5567,2000-01-02 20:30:00\n97,1,98,10.0022,0.2515,100.0,489.05,604.08,1495.81,1303.74,10.52,15.47,393.61,2318.65,8755.21,1.26,44.94,370.9,2387.86,8129.98,8.6377,0.03,369,2319,100.0,28.55,17.1995,2000-01-01 16:10:00\n536,2,216,42.00100000000001,0.84,100.0,445.0,549.87,1355.82,1132.12,3.91,5.71,138.6,2211.87,8322.39,1.02,42.18,130.1,2387.99,8083.08,9.4086,0.02,331,2212,100.0,10.38,6.3828,2000-01-04 17:20:00\n404,2,84,41.99800000000001,0.8419,100.0,445.0,549.18,1344.75,1121.46,3.91,5.72,138.46,2211.88,8316.03,1.02,42.05,130.64,2387.91,8079.79,9.3356,0.02,329,2212,100.0,10.65,6.4072,2000-01-03 19:20:00\n249,1,250,35.0048,0.84,100.0,449.44,554.89,1357.53,1122.6,5.48,7.97,195.61,2223.07,8355.65,1.03,41.7,184.67,2388.24,8076.85,9.2412,0.02,334,2223,100.0,15.0,9.0137,2000-01-02 17:30:00\n18,1,19,20.0031,0.7,100.0,491.19,606.65,1472.33,1237.74,9.35,13.61,332.99,2323.67,8710.08,1.07,43.98,312.78,2387.8,8052.35,9.2416,0.02,363,2324,100.0,24.14,14.6014,2000-01-01 03:00:00\n497,2,177,25.0024,0.62,60.0,462.54,536.99,1255.83,1053.04,7.05,9.03,175.66,1915.36,8011.85,0.94,36.65,165.0,2028.21,7873.73,10.8943,0.02,308,1915,84.93,14.29,8.5773,2000-01-04 10:50:00\n508,2,188,42.0066,0.84,100.0,445.0,549.54,1357.89,1132.36,3.91,5.71,138.53,2211.88,8314.82,1.02,42.06,130.84,2387.97,8086.17,9.3594,0.02,332,2212,100.0,10.56,6.4369,2000-01-04 12:40:00\n166,1,167,20.0061,0.7,100.0,491.19,607.12,1467.56,1241.36,9.35,13.61,333.87,2323.76,8713.3,1.07,44.03,314.03,2387.88,8056.28,9.1756,0.02,361,2324,100.0,24.51,14.7196,2000-01-02 03:40:00\n25,1,26,19.9999,0.7,100.0,491.19,606.21,1477.25,1241.63,9.35,13.61,332.88,2323.73,8707.52,1.07,43.72,313.13,2387.83,8057.07,9.2044,0.02,363,2324,100.0,24.4,14.6063,2000-01-01 04:10:00\n492,2,172,0.0028,0.0,100.0,518.67,642.8,1592.74,1403.79,14.62,21.61,553.19,2388.1,9054.33,1.3,47.35,521.91,2388.08,8132.57,8.4205,0.03,392,2388,100.0,38.89,23.3759,2000-01-04 10:00:00\n545,2,225,0.0015,0.0,100.0,518.67,642.79,1596.66,1411.56,14.62,21.61,553.57,2388.04,9061.46,1.3,47.68,521.39,2388.07,8133.7,8.4303,0.03,395,2388,100.0,38.66,23.2301,2000-01-04 18:50:00\n71,1,72,42.0007,0.84,100.0,445.0,548.97,1351.21,1112.23,3.91,5.7,138.63,2211.95,8308.92,1.02,41.76,129.71,2387.99,8078.28,9.3343,0.02,328,2212,100.0,10.68,6.431,2000-01-01 11:50:00\n275,1,276,42.0047,0.8420000000000001,100.0,445.0,548.97,1353.03,1127.3,3.91,5.69,139.75,2212.24,8333.51,1.03,42.12,131.72,2388.24,8102.5,9.2316,0.02,331,2212,100.0,10.6,6.4066,2000-01-02 21:50:00\n801,3,182,34.9999,0.84,100.0,449.44,556.19,1366.62,1124.8,5.48,7.99,195.73,2223.12,8358.81,1.03,41.95,184.15,2388.2,8077.95,9.1943,0.02,334,2223,100.0,15.0,8.9836,2000-01-06 13:30:00\n577,2,257,42.0002,0.8420000000000001,100.0,445.0,549.61,1362.26,1132.34,3.91,5.72,138.25,2211.93,8325.6,1.02,42.37,130.65,2388.03,8093.22,9.3798,0.02,332,2212,100.0,10.33,6.2701,2000-01-05 00:10:00\n681,3,62,0.003,0.0005,100.0,518.67,641.96,1585.78,1399.39,14.62,21.6,555.5,2388.07,9061.47,1.3,47.32,524.25,2388.06,8143.54,8.3494,0.03,392,2388,100.0,39.24,23.6131,2000-01-05 17:30:00\n169,1,170,0.0007,0.0,100.0,518.67,641.85,1584.59,1390.28,14.62,21.58,553.44,2387.99,9054.14,1.3,47.1,520.78,2387.96,8127.85,8.4065,0.03,388,2388,100.0,39.0,23.4781,2000-01-02 04:10:00\n75,1,76,20.0005,0.7007,100.0,491.19,606.66,1474.37,1230.09,9.35,13.61,332.67,2323.7,8724.32,1.07,43.85,312.88,2387.89,8053.53,9.1911,0.02,363,2324,100.0,24.48,14.7474,2000-01-01 12:30:00\n712,3,93,42.0027,0.84,100.0,445.0,549.33,1356.03,1124.48,3.91,5.7,138.7,2211.99,8334.02,1.02,41.84,131.0,2388.09,8091.29,9.3098,0.02,329,2212,100.0,10.66,6.3553,2000-01-05 22:40:00\n620,3,1,20.0064,0.7005,100.0,491.19,606.99,1481.38,1244.7,9.35,13.63,336.33,2323.91,8726.27,1.08,44.08,316.12,2388.09,8061.99,9.1575,0.02,364,2324,100.0,24.5,14.6715,2000-01-05 07:20:00\n305,1,306,10.0007,0.25,100.0,489.05,605.24,1504.78,1321.7,10.52,15.46,401.75,2319.34,8820.97,1.27,45.72,378.11,2388.55,8164.4,8.5035,0.03,371,2319,100.0,28.87,17.3601,2000-01-03 02:50:00\n354,2,34,0.0029,0.0,100.0,518.67,641.89,1586.55,1404.47,14.62,21.61,554.84,2388.04,9049.53,1.3,47.35,521.94,2388.0,8130.69,8.3922,0.03,392,2388,100.0,39.03,23.4295,2000-01-03 11:00:00\n765,3,146,0.0018,0.0003,100.0,518.67,642.49,1589.18,1397.21,14.62,21.6,556.74,2388.11,9057.76,1.3,47.38,525.05,2388.02,8139.69,8.3326,0.03,392,2388,100.0,39.08,23.5588,2000-01-06 07:30:00\n690,3,71,41.9986,0.84,100.0,445.0,549.65,1349.68,1114.21,3.91,5.7,140.09,2212.06,8330.94,1.03,41.98,131.03,2388.1,8090.58,9.305,0.02,329,2212,100.0,10.64,6.2896,2000-01-05 19:00:00\n380,2,60,42.0043,0.84,100.0,445.0,549.08,1356.98,1113.03,3.91,5.71,138.72,2211.91,8313.87,1.02,41.68,130.52,2387.99,8080.12,9.3183,0.02,328,2212,100.0,10.54,6.4908,2000-01-03 15:20:00\n511,2,191,19.9981,0.7,100.0,491.19,607.66,1485.75,1249.98,9.35,13.66,334.64,2323.94,8721.75,1.07,44.31,314.93,2388.11,8063.23,9.2056,0.02,365,2324,100.0,24.46,14.7373,2000-01-04 13:10:00\n68,1,69,0.0008,0.0,100.0,518.67,641.46,1579.82,1390.55,14.62,21.59,553.15,2387.96,9053.86,1.3,47.14,520.54,2387.93,8129.57,8.4031,0.03,391,2388,100.0,39.06,23.3688,2000-01-01 11:20:00\n774,3,155,42.0063,0.84,100.0,445.0,549.47,1349.39,1118.51,3.91,5.7,139.46,2212.08,8326.02,1.03,42.03,131.65,2388.14,8093.46,9.2865,0.02,332,2212,100.0,10.62,6.4379,2000-01-06 09:00:00\n276,1,277,0.0018,0.0015,100.0,518.67,642.99,1589.05,1400.1,14.62,21.58,560.51,2388.16,9078.18,1.31,47.55,528.02,2388.2,8159.14,8.3149,0.03,392,2388,100.0,39.23,23.5959,2000-01-02 22:00:00\n594,2,274,41.999,0.84,100.0,445.0,549.54,1360.74,1140.92,3.91,5.72,138.87,2211.9,8331.33,1.02,42.51,129.88,2388.03,8094.48,9.4118,0.02,332,2212,100.0,10.56,6.3555,2000-01-05 03:00:00\n175,1,176,0.002,0.0,100.0,518.67,642.42,1583.99,1390.07,14.62,21.58,553.95,2388.01,9046.63,1.3,47.03,520.47,2387.96,8133.57,8.3899,0.03,390,2388,100.0,39.16,23.2878,2000-01-02 05:10:00\n216,1,217,0.002,0.0,100.0,518.67,642.1,1574.14,1398.44,14.62,21.58,554.81,2388.02,9057.94,1.3,47.15,522.64,2388.02,8139.46,8.343,0.03,392,2388,100.0,38.93,23.3649,2000-01-02 12:00:00\n572,2,252,10.0044,0.2504,100.0,489.05,605.28,1501.94,1320.7,10.52,15.49,394.05,2318.99,8783.62,1.26,45.74,370.62,2388.25,8129.74,8.7041,0.03,372,2319,100.0,28.53,17.0557,2000-01-04 23:20:00\n824,3,205,35.0075,0.84,100.0,449.44,555.21,1360.13,1125.26,5.48,7.99,196.09,2223.14,8365.02,1.03,41.95,184.3,2388.26,8079.6,9.1802,0.02,333,2223,100.0,15.01,8.9102,2000-01-06 17:20:00\n475,2,155,24.9996,0.6207,60.0,462.54,536.74,1263.44,1043.59,7.05,9.02,175.67,1915.29,8008.53,0.94,36.52,164.5,2028.23,7872.16,10.8701,0.02,307,1915,84.93,14.39,8.5646,2000-01-04 07:10:00\n851,3,232,20.0056,0.7,100.0,491.19,607.4,1488.09,1250.29,9.35,13.64,338.69,2324.23,8746.1,1.08,44.39,318.21,2388.38,8079.4,9.0891,0.02,366,2324,100.0,24.66,14.8373,2000-01-06 21:50:00\n372,2,52,25.0065,0.62,60.0,462.54,536.55,1261.04,1036.91,7.05,9.03,175.04,1915.31,8003.51,0.94,36.56,165.54,2028.2,7873.02,10.8458,0.02,306,1915,84.93,14.37,8.6849,2000-01-03 14:00:00\n177,1,178,35.0062,0.84,100.0,449.44,554.86,1361.43,1118.14,5.48,7.97,193.92,2222.91,8341.49,1.02,41.69,182.6,2387.99,8065.5,9.2727,0.02,332,2223,100.0,14.82,8.9495,2000-01-02 05:30:00\n202,1,203,42.0037,0.8404,100.0,445.0,548.94,1353.26,1116.27,3.91,5.69,137.64,2211.97,8326.18,1.02,41.96,129.69,2388.08,8085.69,9.3113,0.02,330,2212,100.0,10.66,6.3265,2000-01-02 09:40:00\n728,3,109,34.9993,0.84,100.0,449.44,555.18,1362.93,1126.8,5.48,7.99,194.99,2223.0,8354.6,1.02,41.59,183.93,2388.09,8070.11,9.2122,0.02,334,2223,100.0,14.87,9.0721,2000-01-06 01:20:00\n3,1,4,42.0,0.84,100.0,445.0,548.7,1341.24,1118.03,3.91,5.7,137.98,2211.88,8312.35,1.02,41.68,129.8,2388.02,8076.05,9.3369,0.02,328,2212,100.0,10.54,6.4176,2000-01-01 00:30:00\n263,1,264,35.0005,0.8411,100.0,449.44,555.31,1363.46,1128.57,5.48,7.97,195.67,2223.15,8371.53,1.03,41.91,184.18,2388.26,8084.44,9.2102,0.02,333,2223,100.0,14.86,8.985,2000-01-02 19:50:00\n446,2,126,10.0007,0.2505,100.0,489.05,603.87,1497.76,1310.74,10.52,15.49,394.94,2318.89,8767.57,1.26,45.2,371.92,2388.09,8126.26,8.6611,0.03,370,2319,100.0,28.47,17.2254,2000-01-04 02:20:00\n472,2,152,20.0073,0.7014,100.0,491.19,607.08,1485.12,1247.8,9.35,13.65,334.82,2323.93,8720.53,1.08,44.44,315.23,2388.11,8050.85,9.214,0.02,365,2324,100.0,24.53,14.7061,2000-01-04 06:40:00\n462,2,142,35.0022,0.8413,100.0,449.44,555.88,1369.41,1126.87,5.48,8.0,194.31,2222.91,8341.57,1.02,41.83,182.97,2387.95,8070.29,9.2772,0.02,335,2223,100.0,15.08,8.9247,2000-01-04 05:00:00\n261,1,262,20.0048,0.7,100.0,491.19,607.63,1481.14,1245.43,9.35,13.6,336.67,2324.05,8735.75,1.08,44.24,316.41,2388.13,8074.94,9.1391,0.02,365,2324,100.0,24.49,14.7044,2000-01-02 19:30:00\n251,1,252,42.0004,0.8408,100.0,445.0,549.18,1345.19,1116.2,3.91,5.69,139.2,2212.11,8319.91,1.02,41.89,130.67,2388.16,8093.13,9.2582,0.02,329,2212,100.0,10.86,6.4285,2000-01-02 17:50:00\n93,1,94,9.9987,0.2513,100.0,489.05,604.23,1492.53,1295.91,10.52,15.47,393.14,2318.68,8770.96,1.26,44.96,370.77,2387.92,8127.89,8.6593,0.03,368,2319,100.0,28.64,17.12,2000-01-01 15:30:00\n675,3,56,25.0023,0.6207,60.0,462.54,536.67,1260.47,1042.25,7.05,9.01,175.44,1915.4,8013.8,0.94,36.47,165.31,2028.24,7873.05,10.8266,0.02,305,1915,84.93,14.29,8.5714,2000-01-05 16:30:00\n226,1,227,42.0064,0.84,100.0,445.0,549.19,1345.9,1120.52,3.91,5.69,139.32,2212.01,8328.29,1.02,41.99,131.13,2388.12,8089.98,9.3128,0.02,330,2212,100.0,10.58,6.4738,2000-01-02 13:40:00\n24,1,25,42.0067,0.8413,100.0,445.0,549.12,1342.18,1115.02,3.91,5.7,138.85,2211.87,8305.97,1.02,41.7,130.08,2387.96,8071.47,9.3253,0.02,329,2212,100.0,10.46,6.3247,2000-01-01 04:00:00\n783,3,164,42.0028,0.84,100.0,445.0,549.25,1350.13,1117.95,3.91,5.7,139.61,2212.01,8328.88,1.03,41.96,131.12,2388.16,8093.21,9.2801,0.02,329,2212,100.0,10.67,6.4151,2000-01-06 10:30:00\n637,3,18,35.0028,0.84,100.0,449.44,555.49,1361.21,1126.03,5.48,7.99,195.66,2223.04,8346.46,1.02,41.8,183.98,2388.08,8070.94,9.2454,0.02,334,2223,100.0,14.98,8.9608,2000-01-05 10:10:00\n665,3,46,0.0019,0.0,100.0,518.67,642.05,1585.6,1394.05,14.62,21.6,556.0,2388.06,9063.02,1.3,47.28,523.65,2388.09,8142.11,8.3399,0.03,391,2388,100.0,38.97,23.5484,2000-01-05 14:50:00\n200,1,201,0.0024,0.0,100.0,518.67,641.85,1583.2,1397.76,14.62,21.58,554.19,2387.98,9049.68,1.3,47.0,521.59,2387.91,8139.36,8.3595,0.03,391,2388,100.0,38.97,23.3957,2000-01-02 09:20:00\n716,3,97,35.0038,0.8403,100.0,449.44,555.63,1364.31,1122.34,5.48,7.99,194.98,2223.01,8357.44,1.03,41.63,183.57,2388.14,8069.67,9.2227,0.02,333,2223,100.0,15.05,9.0023,2000-01-05 23:20:00\n15,1,16,20.0006,0.7012,100.0,491.19,606.15,1473.82,1246.43,9.35,13.61,333.02,2323.69,8716.98,1.07,43.84,312.96,2387.86,8050.95,9.1945,0.02,361,2324,100.0,24.54,14.6804,2000-01-01 02:30:00\n257,1,258,25.0004,0.6217,60.0,462.54,537.15,1255.24,1043.9,7.05,9.0,176.09,1915.48,8007.85,0.94,36.45,165.7,2028.35,7875.23,10.7976,0.02,307,1915,84.93,14.46,8.4971,2000-01-02 18:50:00\n14,1,15,25.0,0.62,60.0,462.54,536.12,1259.02,1037.54,7.05,9.01,174.83,1915.23,8004.94,0.94,36.43,163.43,2028.11,7863.73,10.9008,0.02,304,1915,84.93,14.27,8.5551,2000-01-01 02:20:00\n333,2,13,19.9982,0.7,100.0,491.19,607.13,1480.0,1245.08,9.35,13.65,335.1,2323.89,8717.54,1.08,44.16,315.3,2388.02,8055.42,9.1775,0.02,364,2324,100.0,24.64,14.717,2000-01-03 07:30:00\n229,1,230,34.999,0.84,100.0,449.44,555.1,1365.81,1122.93,5.48,7.97,194.78,2222.96,8356.18,1.02,41.9,183.4,2388.07,8065.63,9.2427,0.02,332,2223,100.0,15.02,8.8697,2000-01-02 14:10:00\n733,3,114,35.0003,0.84,100.0,449.44,555.32,1356.04,1116.26,5.48,7.99,195.8,2223.02,8356.83,1.03,41.67,184.04,2388.14,8076.63,9.2566,0.02,332,2223,100.0,14.95,8.8597,2000-01-06 02:10:00\n525,2,205,10.0037,0.2513,100.0,489.05,604.62,1499.25,1303.68,10.52,15.49,394.97,2318.94,8776.66,1.26,45.52,371.34,2388.15,8133.43,8.6485,0.03,370,2319,100.0,28.63,17.1697,2000-01-04 15:30:00\n846,3,227,0.0004,0.0002,100.0,518.67,642.89,1584.73,1407.82,14.62,21.6,560.02,2388.19,9076.28,1.31,47.33,527.51,2388.2,8156.64,8.334,0.03,394,2388,100.0,39.35,23.592,2000-01-06 21:00:00\n432,2,112,25.0009,0.6209,60.0,462.54,536.46,1263.65,1045.01,7.05,9.03,175.76,1915.3,8004.22,0.94,36.58,164.84,2028.2,7872.97,10.8806,0.02,306,1915,84.93,14.28,8.6015,2000-01-04 00:00:00\n780,3,161,41.9982,0.84,100.0,445.0,549.48,1348.4,1110.27,3.91,5.7,138.89,2212.06,8332.39,1.03,41.89,131.57,2388.16,8092.52,9.2584,0.02,329,2212,100.0,10.69,6.2747,2000-01-06 10:00:00\n816,3,197,0.0009,0.0009,100.0,518.67,642.75,1586.11,1399.26,14.62,21.6,558.92,2388.13,9068.33,1.3,47.41,526.33,2388.13,8151.03,8.3639,0.03,392,2388,100.0,38.99,23.5181,2000-01-06 16:00:00\n526,2,206,35.0056,0.8402,100.0,449.44,555.53,1366.2,1129.42,5.48,8.0,194.95,2223.0,8360.62,1.02,41.94,183.33,2388.12,8067.07,9.3219,0.02,333,2223,100.0,14.84,8.8497,2000-01-04 15:40:00\n805,3,186,25.0007,0.6218,60.0,462.54,536.86,1255.79,1042.82,7.05,9.01,176.18,1915.48,8024.07,0.94,36.68,165.63,2028.39,7881.58,10.8007,0.02,307,1915,84.93,14.35,8.649,2000-01-06 14:10:00\n99,1,100,35.0077,0.84,100.0,449.44,555.41,1362.76,1117.42,5.48,7.97,193.17,2222.83,8331.29,1.02,41.46,181.85,2387.9,8060.14,9.2897,0.02,329,2223,100.0,14.87,8.7767,2000-01-01 16:30:00\n576,2,256,25.0025,0.6203,60.0,462.54,536.98,1266.03,1061.79,7.05,9.03,175.28,1915.34,8011.84,0.94,37.15,164.34,2028.26,7876.06,10.9884,0.02,310,1915,84.93,14.44,8.6792,2000-01-05 00:00:00\n809,3,190,19.999,0.7,100.0,491.19,607.05,1486.42,1249.66,9.35,13.63,337.17,2324.04,8718.05,1.08,44.2,317.22,2388.2,8075.72,9.1018,0.02,365,2324,100.0,24.74,14.8875,2000-01-06 14:50:00\n697,3,78,42.0007,0.84,100.0,445.0,548.37,1354.61,1125.22,3.91,5.71,138.87,2211.97,8323.78,1.03,41.84,131.01,2388.09,8090.65,9.2709,0.02,330,2212,100.0,10.49,6.3863,2000-01-05 20:10:00\n759,3,140,24.9997,0.6217,60.0,462.54,536.35,1261.91,1042.28,7.05,9.02,176.3,1915.47,8016.83,0.94,36.62,165.18,2028.35,7878.78,10.7831,0.02,306,1915,84.93,14.39,8.6157,2000-01-06 06:30:00\n316,1,317,0.0014,0.0014,100.0,518.67,643.45,1599.21,1416.74,14.62,21.58,566.7,2388.48,9114.46,1.32,47.98,534.1,2388.47,8184.95,8.276,0.03,396,2388,100.0,39.58,23.6562,2000-01-03 04:40:00\n698,3,79,25.005,0.6201,60.0,462.54,536.71,1251.69,1036.48,7.05,9.01,175.67,1915.38,8009.99,0.94,36.67,164.92,2028.29,7877.44,10.8386,0.02,307,1915,84.93,14.44,8.6507,2000-01-05 20:20:00\n271,1,272,25.0,0.6216,60.0,462.54,536.35,1259.96,1044.78,7.05,9.0,176.96,1915.48,8022.24,0.94,36.62,165.29,2028.39,7883.6,10.771,0.02,305,1915,84.93,14.42,8.6392,2000-01-02 21:10:00\n57,1,58,42.0047,0.84,100.0,445.0,549.06,1341.57,1106.69,3.91,5.7,138.78,2211.87,8305.27,1.02,41.75,130.18,2387.96,8076.8,9.3639,0.02,327,2212,100.0,10.54,6.275,2000-01-01 09:30:00\n636,3,17,9.9995,0.2509,100.0,489.05,604.26,1493.77,1301.76,10.52,15.48,395.87,2318.91,8774.69,1.26,45.14,372.97,2388.08,8132.6,8.6165,0.03,370,2319,100.0,28.83,17.2655,2000-01-05 10:00:00\n683,3,64,25.0013,0.62,60.0,462.54,536.56,1253.42,1042.99,7.05,9.01,176.7,1915.36,8011.31,0.94,36.54,165.04,2028.3,7877.54,10.8164,0.02,307,1915,84.93,14.41,8.5929,2000-01-05 17:50:00\n144,1,145,10.0003,0.2507,100.0,489.05,604.5,1490.23,1302.75,10.52,15.46,393.97,2318.73,8770.42,1.26,45.04,370.46,2387.91,8126.56,8.616,0.03,368,2319,100.0,28.6,17.2085,2000-01-02 00:00:00\n807,3,188,42.0014,0.84,100.0,445.0,549.51,1351.65,1126.54,3.91,5.71,139.28,2212.15,8327.85,1.03,42.04,132.03,2388.15,8094.93,9.2667,0.02,330,2212,100.0,10.69,6.3867,2000-01-06 14:30:00\n689,3,70,41.9993,0.8408,100.0,445.0,548.71,1349.51,1116.8,3.91,5.7,139.07,2212.02,8315.23,1.02,41.86,131.22,2388.07,8091.2,9.3119,0.02,330,2212,100.0,10.69,6.3141,2000-01-05 18:50:00\n158,1,159,25.0015,0.62,60.0,462.54,536.91,1259.86,1042.78,7.05,9.0,175.17,1915.32,8007.18,0.94,36.58,163.87,2028.16,7870.52,10.8658,0.02,306,1915,84.93,14.24,8.7162,2000-01-02 02:20:00\n381,2,61,24.9999,0.6201,60.0,462.54,536.59,1254.97,1043.26,7.05,9.03,176.04,1915.26,8011.62,0.94,36.7,164.66,2028.19,7871.38,10.8503,0.02,307,1915,84.93,14.35,8.6672,2000-01-03 15:30:00\n117,1,118,9.9991,0.25,100.0,489.05,604.02,1494.48,1294.74,10.52,15.46,393.56,2318.74,8770.31,1.25,45.03,370.35,2387.9,8120.94,8.6331,0.03,366,2319,100.0,28.52,17.175,2000-01-01 19:30:00\n413,2,93,0.0016,0.0,100.0,518.67,642.2,1581.4,1406.87,14.62,21.61,554.47,2388.02,9047.32,1.3,47.47,521.7,2388.03,8131.08,8.4093,0.03,393,2388,100.0,38.94,23.433000000000003,2000-01-03 20:50:00\n317,1,318,10.0046,0.25,100.0,489.05,605.56,1509.31,1324.42,10.52,15.46,403.67,2319.53,8831.26,1.27,46.03,380.6,2388.74,8179.79,8.4656,0.03,374,2319,100.0,28.77,17.4422,2000-01-03 04:50:00\n88,1,89,20.0045,0.7,100.0,491.19,606.67,1483.0,1246.45,9.35,13.62,333.57,2323.78,8711.38,1.07,44.01,313.33,2387.85,8053.25,9.1871,0.02,364,2324,100.0,24.63,14.7623,2000-01-01 14:40:00\n570,2,250,19.9997,0.7,100.0,491.19,607.47,1481.16,1250.57,9.35,13.66,334.17,2324.07,8723.65,1.07,44.58,315.09,2388.2,8063.3,9.2713,0.02,366,2324,100.0,24.23,14.6756,2000-01-04 23:00:00\n755,3,136,35.0029,0.8418,100.0,449.44,555.34,1362.52,1117.04,5.48,7.99,194.78,2223.02,8353.93,1.03,41.88,184.07,2388.06,8075.12,9.2379,0.02,333,2223,100.0,14.92,8.9395,2000-01-06 05:50:00\n512,2,192,10.0028,0.25,100.0,489.05,605.19,1499.91,1307.04,10.52,15.49,394.74,2318.93,8772.67,1.26,45.38,371.56,2388.18,8123.07,8.6294,0.03,370,2319,100.0,28.29,17.0591,2000-01-04 13:20:00\n382,2,62,0.0014,0.0,100.0,518.67,642.52,1581.01,1397.71,14.62,21.61,554.76,2388.05,9046.76,1.3,47.18,521.8,2388.03,8133.77,8.4142,0.03,392,2388,100.0,39.02,23.3679,2000-01-03 15:40:00\n274,1,275,10.0064,0.25,100.0,489.05,604.48,1496.6,1306.66,10.52,15.46,397.55,2319.02,8800.78,1.26,45.57,374.73,2388.2,8144.53,8.5428,0.03,370,2319,100.0,28.91,17.2198,2000-01-02 21:40:00\n6,1,7,0.0019,0.0001,100.0,518.67,641.83,1583.47,1393.89,14.62,21.58,552.45,2387.92,9050.5,1.3,46.94,520.48,2387.89,8127.92,8.396,0.03,391,2388,100.0,38.93,23.4578,2000-01-01 01:00:00\n770,3,151,35.0026,0.841,100.0,449.44,555.08,1366.61,1121.57,5.48,7.99,194.79,2223.06,8362.22,1.03,41.8,184.9,2388.12,8080.91,9.2516,0.02,332,2223,100.0,14.88,8.972999999999997,2000-01-06 08:20:00\n4,1,5,25.0063,0.6207,60.0,462.54,536.1,1255.23,1033.59,7.05,9.0,174.82,1915.22,7994.94,0.93,36.48,164.11,2028.08,7865.8,10.8366,0.02,305,1915,84.93,14.03,8.6754,2000-01-01 00:40:00\n319,1,320,20.006,0.7002,100.0,491.19,607.24,1496.88,1266.21,9.35,13.61,343.77,2324.7,8781.14,1.09,45.01,323.53,2388.87,8108.6,9.0019,0.03,368,2324,100.0,24.9,15.0215,2000-01-03 05:10:00\n40,1,41,25.0009,0.6201,60.0,462.54,536.55,1254.48,1036.99,7.05,9.01,174.52,1915.22,8001.9,0.94,36.38,164.3,2028.14,7860.14,10.887,0.02,305,1915,84.93,14.46,8.6234,2000-01-01 06:40:00\n237,1,238,20.0044,0.7,100.0,491.19,606.95,1483.96,1245.64,9.35,13.6,335.17,2323.94,8731.97,1.08,44.17,315.69,2388.02,8070.89,9.1368,0.02,363,2324,100.0,24.7,14.6779,2000-01-02 15:30:00\n210,1,211,10.0068,0.25,100.0,489.05,604.55,1494.3,1307.09,10.52,15.46,394.35,2318.79,8779.87,1.26,45.04,371.62,2387.98,8129.98,8.5945,0.03,369,2319,100.0,28.75,17.2493,2000-01-02 11:00:00\n864,3,245,0.0021,0.0,100.0,518.67,642.44,1584.0,1404.13,14.62,21.6,561.44,2388.22,9082.02,1.31,47.61,528.24,2388.24,8158.62,8.3064,0.03,394,2388,100.0,39.32,23.5794,2000-01-07 00:00:00\n211,1,212,35.001999999999995,0.8406,100.0,449.44,555.02,1355.18,1117.9,5.48,7.97,194.11,2222.97,8342.38,1.02,41.5,183.32,2388.01,8068.23,9.3152,0.02,331,2223,100.0,14.8,8.977,2000-01-02 11:10:00\n608,2,288,42.0045,0.84,100.0,445.0,550.7,1364.22,1141.91,3.91,5.72,138.35,2211.92,8327.84,1.02,42.64,130.14,2387.98,8089.6,9.4403,0.02,332,2212,100.0,10.53,6.4089,2000-01-05 05:20:00\n504,2,184,34.9995,0.8404,100.0,449.44,556.03,1363.52,1129.36,5.48,8.0,194.54,2222.93,8350.38,1.02,41.94,182.57,2388.05,8069.75,9.3001,0.02,333,2223,100.0,14.93,8.9224,2000-01-04 12:00:00\n458,2,138,20.0047,0.7,100.0,491.19,606.91,1492.97,1242.61,9.35,13.65,335.82,2323.93,8722.63,1.08,44.33,314.97,2388.04,8059.02,9.183,0.02,365,2324,100.0,24.5,14.6179,2000-01-04 04:20:00\n481,2,161,42.0002,0.84,100.0,445.0,549.37,1347.3,1126.88,3.91,5.72,138.14,2211.9,8321.86,1.02,42.02,130.56,2387.9,8074.62,9.3614,0.02,330,2212,100.0,10.53,6.3527,2000-01-04 08:10:00\n812,3,193,10.0059,0.2504,100.0,489.05,604.79,1494.61,1310.4,10.52,15.48,397.24,2318.91,8791.41,1.26,45.19,374.47,2388.14,8141.0,8.5544,0.03,368,2319,100.0,28.79,17.3256,2000-01-06 15:20:00\n303,1,304,42.0048,0.8406,100.0,445.0,549.63,1359.16,1133.32,3.91,5.69,141.2,2212.35,8362.35,1.04,42.13,132.31,2388.5,8123.32,9.1626,0.02,333,2212,100.0,10.62,6.4352,2000-01-03 02:30:00\n64,1,65,0.0002,0.001,100.0,518.67,641.68,1576.52,1391.43,14.62,21.58,552.7,2387.96,9047.17,1.3,46.91,521.18,2387.92,8126.44,8.3885,0.03,389,2388,100.0,39.06,23.4061,2000-01-01 10:40:00\n603,2,283,25.0002,0.62,60.0,462.54,537.03,1266.95,1060.13,7.05,9.03,176.29,1915.43,8027.01,0.94,37.01,164.3,2028.34,7880.54,10.9639,0.02,309,1915,84.93,14.2,8.4953,2000-01-05 04:30:00\n363,2,43,9.9987,0.2511,100.0,489.05,604.92,1492.94,1298.75,10.52,15.49,395.69,2318.84,8772.06,1.26,45.23,372.19,2388.03,8129.69,8.6701,0.03,368,2319,100.0,28.65,17.2672,2000-01-03 12:30:00\n311,1,312,35.0045,0.8401,100.0,449.44,556.27,1373.18,1144.22,5.48,7.97,198.81,2223.64,8399.85,1.04,42.29,186.93,2388.71,8112.69,9.1149,0.02,336,2223,100.0,15.19,9.0905,2000-01-03 03:50:00\n701,3,82,25.0074,0.6203,60.0,462.54,536.42,1258.44,1042.28,7.05,9.02,176.0,1915.38,8011.28,0.94,36.57,165.53,2028.31,7872.96,10.8003,0.02,306,1915,84.93,14.25,8.6296,2000-01-05 20:50:00\n265,1,266,25.0053,0.62,60.0,462.54,536.32,1260.36,1042.58,7.05,9.0,177.5,1915.57,8020.18,0.94,36.9,165.27,2028.34,7883.9,10.774,0.02,307,1915,84.93,14.27,8.6284,2000-01-02 20:10:00\n471,2,151,0.0012,0.0004,100.0,518.67,642.47,1585.49,1393.29,14.62,21.61,553.58,2388.07,9046.99,1.3,47.39,522.05,2388.1,8132.37,8.4319,0.03,393,2388,100.0,38.82,23.2834,2000-01-04 06:30:00\n98,1,99,41.9985,0.84,100.0,445.0,549.42,1346.47,1111.37,3.91,5.7,137.6,2211.91,8304.08,1.02,41.49,129.92,2388.06,8077.4,9.3458,0.02,329,2212,100.0,10.71,6.2607,2000-01-01 16:20:00\n833,3,214,25.0034,0.6212,60.0,462.54,537.01,1261.92,1039.6,7.05,9.02,177.12,1915.53,8023.62,0.94,36.65,165.74,2028.45,7883.25,10.7806,0.02,307,1915,84.93,14.55,8.7334,2000-01-06 18:50:00\n677,3,58,20.0044,0.7008,100.0,491.19,607.09,1479.02,1246.99,9.35,13.63,336.07,2323.92,8729.51,1.08,44.05,315.79,2388.03,8062.56,9.1738,0.02,363,2324,100.0,24.69,14.7236,2000-01-05 16:50:00\n817,3,198,42.0024,0.8405,100.0,445.0,549.37,1351.6,1124.71,3.91,5.7,140.03,2212.06,8339.22,1.03,42.26,132.02,2388.16,8102.11,9.2538,0.02,330,2212,100.0,10.83,6.4586,2000-01-06 16:10:00\n338,2,18,35.0061,0.84,100.0,449.44,554.6,1356.57,1123.0,5.48,8.0,194.36,2222.83,8341.14,1.02,41.75,183.59,2387.97,8070.8,9.252,0.02,333,2223,100.0,14.91,8.9103,2000-01-03 08:20:00\n635,3,16,10.0018,0.25,100.0,489.05,604.09,1489.5,1303.05,10.52,15.48,395.04,2318.81,8785.68,1.26,45.03,373.04,2388.01,8133.88,8.5484,0.03,369,2319,100.0,28.56,17.2382,2000-01-05 09:50:00\n277,1,278,10.0075,0.2508,100.0,489.05,604.82,1503.68,1312.63,10.52,15.46,398.33,2319.1,8800.48,1.26,45.4,375.09,2388.24,8147.97,8.5569,0.03,368,2319,100.0,28.84,17.3829,2000-01-02 22:10:00\n"
  },
  {
    "path": "docs/source/examples/demo/utils.py",
    "content": "import os\nimport tarfile\nfrom zipfile import ZipFile\n\nimport requests\nfrom tqdm import tqdm\n\n\ndef download(url, output=\"data\"):\n    response = requests.get(url, stream=True)\n    assert response.status_code == 200, \"unable to download data\"\n    content_type = response.headers[\"Content-Type\"]\n    content = response.iter_content(chunk_size=int(1e6))\n    bar_format = \"Downloaded: {n}MB / {total}MB -{rate_fmt}, \"\n    bar_format += \"Elapsed: {elapsed}, Remaining: {remaining}, Progress: {l_bar}{bar}\"\n    total = round(int(response.headers.get(\"content-length\", 0)) / 1e6)\n    content = tqdm(content, total=total, unit=\"MB\", bar_format=bar_format)\n    extract(content, content_type, output)\n    response.close()\n\n\ndef extract(content, content_type, output):\n    if content_type == \"application/zip\":\n        extract_zip(content, output)\n    elif content_type == \"application/x-gzip\":\n        extract_tarball(content, output)\n    else:\n        raise TypeError(f'\"{content_type}\" not supported')\n\n\ndef extract_tarball(content, output):\n    with open(\"data.tar.gz\", \"wb\") as file:\n        for chunk in content:\n            file.write(chunk)\n\n    with tarfile.open(\"data.tar.gz\", \"r:gz\") as file:\n        file.extractall(output)\n\n    os.remove(\"data.tar.gz\")\n\n\ndef extract_zip(content, output):\n    with open(\"data.zip\", \"wb\") as file:\n        for chunk in content:\n            file.write(chunk)\n\n    with ZipFile(\"data.zip\", \"r\") as file:\n        file.extractall(output)\n\n    os.remove(\"data.zip\")\n"
  },
  {
    "path": "docs/source/examples/predict_bike_trips.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Predict Bike Trips\\n\",\n    \"\\n\",\n    \"In this tutorial, build a machine learning application to predict the number of bike trips from a station in the next biking period. This application is structured into three important steps:\\n\",\n    \"\\n\",\n    \"- Prediction Engineering\\n\",\n    \"- Feature Engineering\\n\",\n    \"- Machine Learning\\n\",\n    \"\\n\",\n    \"In the first step, create new labels from the data by using [Compose](https://compose.alteryx.com/). In the second step, generate features for the labels by using [Featuretools](https://featuretools.alteryx.com/). In the third step, search for the best machine learning pipeline using [EvalML](https://evalml.alteryx.com/). After working through these steps, you should understand how to build machine learning applications for real-world problems like forecasting demand.\\n\",\n    \"\\n\",\n    \"**Note: In order to run this example, you should have Featuretools 1.4.0 or newer and EvalML 0.41.0 or newer installed.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from demo.chicago_bike import load_sample\\n\",\n    \"from matplotlib.pyplot import subplots\\n\",\n    \"import composeml as cp\\n\",\n    \"import featuretools as ft\\n\",\n    \"import evalml\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use data provided by [Divvy](https://www.kaggle.com/yingwurenjian/chicago-divvy-bicycle-sharing-data), a bike share in Chicago. In this dataset, we have a record of each bike trip.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"df = load_sample()\\n\",\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Prediction Engineering\\n\",\n    \"\\n\",\n    \"> How many trips will occur from a station in the next biking period?\\n\",\n    \"\\n\",\n    \"You can change the length of the biking period to create different prediction problems. For example, how many bike trips will occur in the next 13 hours or the next week? Those variations can be done by simply tweaking a parameter. This helps you understand different scenarios that are crucial for making better decisions.\\n\",\n    \"\\n\",\n    \"### Defining the Labeling Function\\n\",\n    \"\\n\",\n    \"Define a labeling function to calculate the number of trips. Given that each observation is an individual trip, the number of trips is just the number of observations. Your labeling function should be used by a label maker to extract the training examples.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def trip_count(ds):\\n\",\n    \"    return len(ds)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Representing the Prediction Problem\\n\",\n    \"\\n\",\n    \"Represent the prediction problem by creating a label maker with the following parameters:\\n\",\n    \"\\n\",\n    \"- `target_dataframe_index` as the column for station ID where each trip starts from, since you want to process trips from each station.\\n\",\n    \"- `labeling_function` as the function to calculate the number of trips.\\n\",\n    \"- `time_index` as the column for the starting time of a trip. The biking periods are based on this time index.\\n\",\n    \"- `window_size` as the length of a biking period. You can easily change this parameter to create variations of the prediction problem.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lm = cp.LabelMaker(\\n\",\n    \"    target_dataframe_index=\\\"from_station_id\\\",\\n\",\n    \"    labeling_function=trip_count,\\n\",\n    \"    time_index=\\\"starttime\\\",\\n\",\n    \"    window_size=\\\"13h\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Finding the Training Examples\\n\",\n    \"\\n\",\n    \"Run a search to get the training examples by using the following parameters:\\n\",\n    \"\\n\",\n    \"- The trips sorted by the start time, since the search expects the trips to be sorted chronologically, otherwise an error is raised.\\n\",\n    \"- `num_examples_per_instance` to find the number of training examples per station. In this case, the search returns all existing examples.\\n\",\n    \"- `minimum_data` as the start time of the first biking period. This is also the first cutoff time for building features.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt = lm.search(\\n\",\n    \"    df.sort_values(\\\"starttime\\\"),\\n\",\n    \"    num_examples_per_instance=-1,\\n\",\n    \"    minimum_data=\\\"2014-06-30 08:00\\\",\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"lt.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The output from the search is a label times table with three columns:\\n\",\n    \"\\n\",\n    \"- The station ID associated to the trips. There can be many training examples generated from each station.\\n\",\n    \"- The start time of the biking period. This is also the cutoff time for building features. Only data that existed beforehand is valid to use for predictions.\\n\",\n    \"- The number of trips during the biking period window. This is calculated by our labeling function.\\n\",\n    \"\\n\",\n    \"As a helpful reference, you can print out the search settings that were used to generate these labels.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also get a better look at the labels by plotting the distribution and cumulative count across time.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"%matplotlib inline\\n\",\n    \"fig, ax = subplots(nrows=2, ncols=1, figsize=(6, 8))\\n\",\n    \"lt.plot.distribution(ax=ax[0])\\n\",\n    \"lt.plot.count_by_time(ax=ax[1])\\n\",\n    \"fig.tight_layout(pad=2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Feature Engineering\\n\",\n    \"\\n\",\n    \"In the previous step, you generated the labels. The next step is to generate features.\\n\",\n    \"\\n\",\n    \"### Representing the Data\\n\",\n    \"\\n\",\n    \"Start by representing the data with an EntitySet. That way, you can generate features based on the relational structure of the dataset. You currently have a single table of trips where one station can have many trips. This one-to-many relationship can be represented by normalizing a station dataframe. The same can be done with other one-to-many relationships like weather-to-trips. Because you want to make predictions based on the station where the trips started from, you should use this station dataframe as the target for generating features. Also, you should use the stop times of the trips as the time index for generating features, since data about a trip would likely be unavailable until the trip is complete.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"es = ft.EntitySet(\\\"chicago_bike\\\")\\n\",\n    \"\\n\",\n    \"es.add_dataframe(\\n\",\n    \"    dataframe=df.reset_index(),\\n\",\n    \"    dataframe_name=\\\"trips\\\",\\n\",\n    \"    time_index=\\\"stoptime\\\",\\n\",\n    \"    index=\\\"trip_id\\\",\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"trips\\\",\\n\",\n    \"    new_dataframe_name=\\\"from_station_id\\\",\\n\",\n    \"    index=\\\"from_station_id\\\",\\n\",\n    \"    make_time_index=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"trips\\\",\\n\",\n    \"    new_dataframe_name=\\\"weather\\\",\\n\",\n    \"    index=\\\"events\\\",\\n\",\n    \"    make_time_index=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"trips\\\",\\n\",\n    \"    new_dataframe_name=\\\"gender\\\",\\n\",\n    \"    index=\\\"gender\\\",\\n\",\n    \"    make_time_index=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.add_interesting_values(\\n\",\n    \"    dataframe_name=\\\"trips\\\", values={\\\"gender\\\": [\\\"Male\\\", \\\"Female\\\"], \\\"events\\\": [\\\"tstorms\\\"]}\\n\",\n    \")\\n\",\n    \"es.plot()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Calculating the Features\\n\",\n    \"\\n\",\n    \"Generate features using a method called Deep Feature Synthesis (DFS). The method automatically builds features by stacking and applying mathematical operations called primitives across relationships in an entityset. The more structured an entityset is, the better DFS can leverage the relationships to generate better features. Run DFS with the following parameters:\\n\",\n    \"\\n\",\n    \"- `entityset` as the entitset we structured previously.\\n\",\n    \"- `target_dataframe_name` as the station dataframe where the trips started from.\\n\",\n    \"- `cutoff_time` as the label times that we generated previously. The label values are appended to the feature matrix.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fm, fd = ft.dfs(\\n\",\n    \"    entityset=es,\\n\",\n    \"    target_dataframe_name=\\\"from_station_id\\\",\\n\",\n    \"    trans_primitives=[\\\"hour\\\", \\\"week\\\", \\\"is_weekend\\\"],\\n\",\n    \"    cutoff_time=lt,\\n\",\n    \"    cutoff_time_in_index=True,\\n\",\n    \"    include_cutoff_time=False,\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"fm.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are two outputs from DFS: a feature matrix and feature definitions. The feature matrix is a table that contains the feature values with the corresponding labels based on the cutoff times. Feature definitions are features in a list that can be stored and reused later to calculate the same set of features on future data.\\n\",\n    \"\\n\",\n    \"## Machine Learning\\n\",\n    \"\\n\",\n    \"In the previous steps, you generated the labels and features. The final step is to build the machine learning pipeline.\\n\",\n    \"\\n\",\n    \"### Splitting the Data\\n\",\n    \"\\n\",\n    \"Start by extracting the labels from the feature matrix and splitting the data into a training set and a holdout set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fm.reset_index(drop=True, inplace=True)\\n\",\n    \"y = fm.ww.pop(\\\"trip_count\\\")\\n\",\n    \"\\n\",\n    \"splits = evalml.preprocessing.split_data(\\n\",\n    \"    X=fm,\\n\",\n    \"    y=y,\\n\",\n    \"    test_size=0.1,\\n\",\n    \"    random_seed=0,\\n\",\n    \"    problem_type=\\\"regression\\\",\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"X_train, X_holdout, y_train, y_holdout = splits\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Finding the Best Model\\n\",\n    \"\\n\",\n    \"Run a search on the training set to find the best machine learning model. During the search process, predictions from several different pipelines are evaluated.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"automl = evalml.AutoMLSearch(\\n\",\n    \"    X_train=X_train,\\n\",\n    \"    y_train=y_train,\\n\",\n    \"    problem_type=\\\"regression\\\",\\n\",\n    \"    objective=\\\"r2\\\",\\n\",\n    \"    random_seed=3,\\n\",\n    \"    allowed_model_families=[\\\"extra_trees\\\", \\\"random_forest\\\"],\\n\",\n    \"    max_iterations=3,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"automl.search()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Once the search is complete, you can print out information about the best pipeline, like the parameters in each component.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"automl.best_pipeline.describe()\\n\",\n    \"automl.best_pipeline.graph()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let’s score the model performance by evaluating predictions on the holdout set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"best_pipeline = automl.best_pipeline.fit(X_train, y_train)\\n\",\n    \"\\n\",\n    \"score = best_pipeline.score(\\n\",\n    \"    X=X_holdout,\\n\",\n    \"    y=y_holdout,\\n\",\n    \"    objectives=[\\\"r2\\\"],\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"dict(score)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"From the pipeline, you can see which features are most important for predictions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"feature_importance = best_pipeline.feature_importance\\n\",\n    \"feature_importance = feature_importance.set_index(\\\"feature\\\")[\\\"importance\\\"]\\n\",\n    \"top_k = feature_importance.abs().sort_values().tail(20).index\\n\",\n    \"feature_importance[top_k].plot.barh(figsize=(8, 8), fontsize=14, width=0.7);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Making Predictions\\n\",\n    \"\\n\",\n    \"Now you are ready to make predictions with your trained model. Start by calculating the same set of features by using the feature definitions. Then use a cutoff time based on the latest information available in the dataset.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fm = ft.calculate_feature_matrix(\\n\",\n    \"    features=fd,\\n\",\n    \"    entityset=es,\\n\",\n    \"    cutoff_time=ft.pd.Timestamp(\\\"2014-07-02 08:00:00\\\"),\\n\",\n    \"    cutoff_time_in_index=True,\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"fm.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Predict the number of trips that will occur from a station in the next 13 hours.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y_pred = best_pipeline.predict(fm)\\n\",\n    \"y_pred = y_pred.values.round()\\n\",\n    \"\\n\",\n    \"prediction = fm[[]]\\n\",\n    \"prediction[\\\"trip_count (estimate)\\\"] = y_pred\\n\",\n    \"prediction.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Next Steps\\n\",\n    \"\\n\",\n    \"You have completed this tutorial. You can revisit each step to explore and fine-tune the model using different parameters until it is ready for production. For more information about how to work with the features produced by Featuretools, take a look at [the Featuretools documentation](https://featuretools.alteryx.com/). For more information about how to work with the models produced by EvalML, take a look at [the EvalML documentation](https://evalml.alteryx.com/).\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3.10.6 64-bit ('3.10.6')\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.10.6\"\n  },\n  \"vscode\": {\n   \"interpreter\": {\n    \"hash\": \"175a0a3732e9eeea35e317863527a17b85ae672598d99ca4a71576ee9ad73d9c\"\n   }\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "docs/source/examples/predict_next_purchase.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Predict Next Purchase\\n\",\n    \"\\n\",\n    \"In this tutorial, build a machine learning application that predicts whether customers will purchase a product within the next shopping period. This application is structured into three important steps:\\n\",\n    \"\\n\",\n    \"- Prediction Engineering\\n\",\n    \"- Feature Engineering\\n\",\n    \"- Machine Learning\\n\",\n    \"\\n\",\n    \"In the first step, you generate new labels from the data by using [Compose](https://compose.alteryx.com/). In the second step, you generate features for the labels by using [Featuretools](https://featuretools.alteryx.com/). In the third step, you search for the best machine learning pipeline by using [EvalML](https://evalml.alteryx.com/). After working through these steps, you should understand how to build machine learning applications for real-world problems like predicting consumer spending.\\n\",\n    \"\\n\",\n    \"**Note: In order to run this example, you should have Featuretools 1.4.0 or newer and EvalML 0.41.0 or newer installed.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from demo.next_purchase import load_sample\\n\",\n    \"from matplotlib.pyplot import subplots\\n\",\n    \"import composeml as cp\\n\",\n    \"import pandas as pd\\n\",\n    \"import featuretools as ft\\n\",\n    \"import evalml\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use this historical data of online grocery orders provided by [Instacart](https://www.kaggle.com/c/instacart-market-basket-analysis/data).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"df = load_sample()\\n\",\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Prediction Engineering\\n\",\n    \"\\n\",\n    \"> Will customers purchase a product within the next shopping period?\\n\",\n    \"\\n\",\n    \"In this prediction problem, there are two parameters:\\n\",\n    \"\\n\",\n    \"- The product that a customer can purchase.\\n\",\n    \"- The length of the shopping period.\\n\",\n    \"\\n\",\n    \"You can change these parameters to create different prediction problems. For example, will a customer purchase a banana within the next 3 days or an avocado within the next three weeks? These variations can be done by simply tweaking the parameters. This helps you explore different scenarios that are crucial for making better decisions.\\n\",\n    \"\\n\",\n    \"### Defining the Labeling Function\\n\",\n    \"\\n\",\n    \"Start by defining a labeling function that checks if a customer bought a given product. Make the product a parameter of the function. Our labeling function is used by a label maker to extract the training examples.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def bought_product(ds, product_name):\\n\",\n    \"    return ds.product_name.str.contains(product_name).any()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Representing the Prediction Problem\\n\",\n    \"\\n\",\n    \"Represent the prediction problem by creating a label maker with the following parameters:\\n\",\n    \"\\n\",\n    \"- `target_dataframe_index` as the columns for the customer ID, since you want to process orders for each customer.\\n\",\n    \"- `labeling_function` as the function you defined previously.\\n\",\n    \"- `time_index` as the column for the order time. The shoppings periods are based on this time index.\\n\",\n    \"- `window_size` as the length of a shopping period. You can easily change this parameter to create variations of the prediction problem.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lm = cp.LabelMaker(\\n\",\n    \"    target_dataframe_index=\\\"user_id\\\",\\n\",\n    \"    time_index=\\\"order_time\\\",\\n\",\n    \"    labeling_function=bought_product,\\n\",\n    \"    window_size=\\\"3d\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Finding the Training Examples\\n\",\n    \"\\n\",\n    \"Run a search to get the training examples by using the following parameters:\\n\",\n    \"\\n\",\n    \"- The grocery orders sorted by the order time, since the search expects the orders to be sorted chronologically. Otherwise, an error is raised.\\n\",\n    \"- `num_examples_per_instance` to find the number of training examples per customer. In this case, the search returns all existing examples.\\n\",\n    \"- `product_name` as the product to check for purchases. This parameter gets passed directly to the our labeling function.\\n\",\n    \"- `minimum_data` as the amount of data that is used to make features for the first training example.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt = lm.search(\\n\",\n    \"    df.sort_values(\\\"order_time\\\"),\\n\",\n    \"    num_examples_per_instance=-1,\\n\",\n    \"    product_name=\\\"Banana\\\",\\n\",\n    \"    minimum_data=pd.Timedelta(\\\"3d\\\"),\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"lt.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The output from the search is a label times table with three columns:\\n\",\n    \"\\n\",\n    \"- The customer ID associated to the orders. There can be many training examples generated from each customer.\\n\",\n    \"- The start time of the shopping period. This is also the cutoff time for building features. Only data that existed beforehand is valid to use for predictions.\\n\",\n    \"- Whether the product was purchased during the shopping period window. This is calculated by our labeling function.\\n\",\n    \"\\n\",\n    \"As a helpful reference, you can print out the search settings that were used to generate these labels. The description also shows us the label distribution which we can check for imbalanced labels.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can get a better look at the labels by plotting the distribution and cumulative count across time.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"%matplotlib inline\\n\",\n    \"fig, ax = subplots(nrows=2, ncols=1, figsize=(6, 8))\\n\",\n    \"lt.plot.distribution(ax=ax[0])\\n\",\n    \"lt.plot.count_by_time(ax=ax[1])\\n\",\n    \"fig.tight_layout(pad=2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Feature Engineering\\n\",\n    \"\\n\",\n    \"In the previous step, you generated the labels. The next step is to generate features.\\n\",\n    \"\\n\",\n    \"### Representing the Data\\n\",\n    \"\\n\",\n    \"Start by representing the data with an EntitySet. That way, you can generate features based on the relational structure of the dataset. You currently have a single table of orders where one customer can have many orders. This one-to-many relationship can be represented by normalizing a customer dataframe. The same can be done for other one-to-many relationships like aisle-to-products. Because you want to make predictions based on the customer, you should use this customer dataframe as the target for generating features.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"es = ft.EntitySet(\\\"instacart\\\")\\n\",\n    \"\\n\",\n    \"es.add_dataframe(\\n\",\n    \"    dataframe=df.reset_index(),\\n\",\n    \"    dataframe_name=\\\"order_products\\\",\\n\",\n    \"    time_index=\\\"order_time\\\",\\n\",\n    \"    index=\\\"id\\\",\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"order_products\\\",\\n\",\n    \"    new_dataframe_name=\\\"orders\\\",\\n\",\n    \"    index=\\\"order_id\\\",\\n\",\n    \"    additional_columns=[\\\"user_id\\\"],\\n\",\n    \"    make_time_index=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"orders\\\",\\n\",\n    \"    new_dataframe_name=\\\"customers\\\",\\n\",\n    \"    index=\\\"user_id\\\",\\n\",\n    \"    make_time_index=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"order_products\\\",\\n\",\n    \"    new_dataframe_name=\\\"products\\\",\\n\",\n    \"    index=\\\"product_id\\\",\\n\",\n    \"    additional_columns=[\\\"aisle_id\\\", \\\"department_id\\\"],\\n\",\n    \"    make_time_index=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"products\\\",\\n\",\n    \"    new_dataframe_name=\\\"aisles\\\",\\n\",\n    \"    index=\\\"aisle_id\\\",\\n\",\n    \"    additional_columns=[\\\"department_id\\\"],\\n\",\n    \"    make_time_index=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"aisles\\\",\\n\",\n    \"    new_dataframe_name=\\\"departments\\\",\\n\",\n    \"    index=\\\"department_id\\\",\\n\",\n    \"    make_time_index=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.add_interesting_values(\\n\",\n    \"    dataframe_name=\\\"order_products\\\",\\n\",\n    \"    values={\\\"department\\\": [\\\"produce\\\"], \\\"product_name\\\": [\\\"Banana\\\"]},\\n\",\n    \")\\n\",\n    \"es.plot()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Calculating the Features\\n\",\n    \"\\n\",\n    \"Now you can generate features by using a method called Deep Feature Synthesis (DFS). That method automatically builds features by stacking and applying mathematical operations called primitives across relationships in an entityset. The more structured an entityset is, the better DFS can leverage the relationships to generate better features. Let’s run DFS using the following parameters:\\n\",\n    \"\\n\",\n    \"- `entity_set` as the entityset we structured previously.\\n\",\n    \"- `target_dataframe_name` as the customer dataframe.\\n\",\n    \"- `cutoff_time` as the label times that we generated previously. The label values are appended to the feature matrix.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fm, fd = ft.dfs(\\n\",\n    \"    entityset=es,\\n\",\n    \"    target_dataframe_name=\\\"customers\\\",\\n\",\n    \"    cutoff_time=lt,\\n\",\n    \"    cutoff_time_in_index=True,\\n\",\n    \"    include_cutoff_time=False,\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"fm.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are two outputs from DFS: a feature matrix and feature definitions. The feature matrix is a table that contains the feature values with the corresponding labels based on the cutoff times. Feature definitions are features in a list that can be stored and reused later to calculate the same set of features on future data.\\n\",\n    \"\\n\",\n    \"## Machine Learning\\n\",\n    \"\\n\",\n    \"In the previous steps, you generated the labels and features. The final step is to build the machine learning pipeline.\\n\",\n    \"\\n\",\n    \"### Splitting the Data\\n\",\n    \"\\n\",\n    \"Start by extracting the labels from the feature matrix and splitting the data into a training set and a holdout set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fm.reset_index(drop=True, inplace=True)\\n\",\n    \"y = fm.ww.pop(\\\"bought_product\\\")\\n\",\n    \"\\n\",\n    \"splits = evalml.preprocessing.split_data(\\n\",\n    \"    X=fm,\\n\",\n    \"    y=y,\\n\",\n    \"    test_size=0.2,\\n\",\n    \"    random_seed=0,\\n\",\n    \"    problem_type=\\\"binary\\\",\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"X_train, X_holdout, y_train, y_holdout = splits\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Finding the Best Model\\n\",\n    \"\\n\",\n    \"Run a search on the training set to find the best machine learning model. During the search process, predictions from several different pipelines are evaluated.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"automl = evalml.AutoMLSearch(\\n\",\n    \"    X_train=fm,\\n\",\n    \"    y_train=y,\\n\",\n    \"    problem_type=\\\"binary\\\",\\n\",\n    \"    objective=\\\"f1\\\",\\n\",\n    \"    random_seed=0,\\n\",\n    \"    allowed_model_families=[\\\"catboost\\\", \\\"random_forest\\\"],\\n\",\n    \"    max_iterations=3,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"automl.search()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Once the search is complete, you can print out information about the best pipeline found, like the parameters in each component.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"automl.best_pipeline.describe()\\n\",\n    \"automl.best_pipeline.graph()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Score the model performance by evaluating predictions on the holdout set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"best_pipeline = automl.best_pipeline.fit(X_train, y_train)\\n\",\n    \"\\n\",\n    \"score = best_pipeline.score(\\n\",\n    \"    X=X_holdout,\\n\",\n    \"    y=y_holdout,\\n\",\n    \"    objectives=[\\\"f1\\\"],\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"dict(score)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"From the pipeline, you can see which features are most important for predictions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"feature_importance = best_pipeline.feature_importance\\n\",\n    \"feature_importance = feature_importance.set_index(\\\"feature\\\")[\\\"importance\\\"]\\n\",\n    \"top_k = feature_importance.abs().sort_values().tail(20).index\\n\",\n    \"feature_importance[top_k].plot.barh(figsize=(8, 8), fontsize=14, width=0.7);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Making Predictions\\n\",\n    \"\\n\",\n    \"You are ready to make predictions with your trained model. Start by calculating the same set of features by using the feature definitions. Also, use a cutoff time based on the latest information available in the dataset.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fm = ft.calculate_feature_matrix(\\n\",\n    \"    features=fd,\\n\",\n    \"    entityset=es,\\n\",\n    \"    cutoff_time=ft.pd.Timestamp(\\\"2015-03-02\\\"),\\n\",\n    \"    cutoff_time_in_index=True,\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"fm.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Predict whether customers will purchase bananas within the next 3 days.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y_pred = best_pipeline.predict(fm)\\n\",\n    \"y_pred = y_pred.values\\n\",\n    \"\\n\",\n    \"prediction = fm[[]]\\n\",\n    \"prediction[\\\"bought_product (estimate)\\\"] = y_pred\\n\",\n    \"prediction.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Next Steps\\n\",\n    \"\\n\",\n    \"You have completed this tutorial. You can revisit each step to explore and fine-tune the model using different parameters until it is ready for production. For more information about how to work with the features produced by Featuretools, take a look at [the Featuretools documentation](https://featuretools.alteryx.com/). For more information about how to work with the models produced by EvalML, take a look at [the EvalML documentation](https://evalml.alteryx.com/).\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"jupytext\": {\n   \"cell_metadata_filter\": \"-all\",\n   \"main_language\": \"python\",\n   \"notebook_metadata_filter\": \"-all\"\n  },\n  \"kernelspec\": {\n   \"display_name\": \"Python 3.10.6 64-bit ('3.10.6')\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.10.6\"\n  },\n  \"vscode\": {\n   \"interpreter\": {\n    \"hash\": \"175a0a3732e9eeea35e317863527a17b85ae672598d99ca4a71576ee9ad73d9c\"\n   }\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "docs/source/examples/predict_turbofan_degredation.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"# Predict Turbofan Degradation\\n\",\n    \"\\n\",\n    \"In this tutorial, build a machine learning application to predict turbofan engine degradation. This application is structured into three important steps:\\n\",\n    \"\\n\",\n    \"- Prediction Engineering\\n\",\n    \"- Feature Engineering\\n\",\n    \"- Machine Learning\\n\",\n    \"\\n\",\n    \"In the first step, create new labels from the data by using [Compose](https://compose.alteryx.com/). In the second step, generate features for the labels by using [Featuretools](https://featuretools.alteryx.com/). In the third step, search for the best machine learning pipeline using [EvalML](https://evalml.alteryx.com/). After working through these steps, you should understand how to build machine learning applications for real-world problems like forecasting demand.\\n\",\n    \"\\n\",\n    \"**Note: In order to run this example, you should have Featuretools 1.4.0 or newer and EvalML 0.41.0 or newer installed.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from demo.turbofan_degredation import load_sample\\n\",\n    \"from matplotlib.pyplot import subplots\\n\",\n    \"import composeml as cp\\n\",\n    \"import featuretools as ft\\n\",\n    \"import evalml\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Use a dataset provided by [NASA](https://www.kaggle.com/behrad3d/nasa-cmaps) simulating turbofan engine degradation. In the dataset, there is data about engines that have been monitored over time. Each engine had operational settings and sensor measurements recorded over a number of cycles. The remaining useful life (RUL) is the amount of cycles an engine has left before it needs maintenance. What makes this dataset special is that the engines run all the way until failure, giving us precise RUL information for every engine at every point in time. The model you build in this tutorial predicts RUL.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"df = load_sample()\\n\",\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Prediction Engineering\\n\",\n    \"\\n\",\n    \"> Which range is the RUL of a turbofan engine in?\\n\",\n    \"\\n\",\n    \"In this prediction problem, you want to group the RUL data into ranges, then predict which range the RUL is in. You can make variations in the ranges to create different prediction problems. For example, the ranges could be manually defined (0 - 150, 150 - 300, etc.) or based on the quartiles from historical observations. Bin the RUL to make variations, helping you explore different scenarios that are crucial for making better decisions.\\n\",\n    \"\\n\",\n    \"### Defining the Labeling Function\\n\",\n    \"\\n\",\n    \"Let’s start by defining the labeling function of an engine that calculates the RUL. Given that engines run all the way until failure, the RUL is just the remaining number of observations. Our labeling function will be used by a label maker to extract the training examples.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def rul(ds):\\n\",\n    \"    return len(ds) - 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"### Representing the Prediction Problem\\n\",\n    \"\\n\",\n    \"Represent the prediction problem by creating a label maker with the following parameters:\\n\",\n    \"\\n\",\n    \"- The `target_dataframe_index` as the column for the engine ID, since you want to process records for each engine.\\n\",\n    \"- The `labeling_function` as the function you defined previously.\\n\",\n    \"- The `time_index` as the column for the event time.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lm = cp.LabelMaker(\\n\",\n    \"    target_dataframe_index=\\\"engine_no\\\",\\n\",\n    \"    labeling_function=rul,\\n\",\n    \"    time_index=\\\"time\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"### Finding the Training Examples\\n\",\n    \"\\n\",\n    \"Run a search to get the training examples by using the following parameters:\\n\",\n    \"\\n\",\n    \"- The records sorted by the event time, since the search expects the records to be sorted chronologically. Otherwise, an error occurs.\\n\",\n    \"- `num_examples_per_instance` as the number of training examples to find for each engine.\\n\",\n    \"- `minimum_data` as the amount of data to use to make features for the first training example.\\n\",\n    \"- `gap` as the number of rows to skip between examples. This is done to cover different points in time of an engine.\\n\",\n    \"\\n\",\n    \"You can easily tweak these parameters and run more searches for training examples as the requirements of our model change.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt = lm.search(\\n\",\n    \"    df.sort_values(\\\"time\\\"),\\n\",\n    \"    num_examples_per_instance=20,\\n\",\n    \"    minimum_data=5,\\n\",\n    \"    gap=20,\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"lt.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"The output from the search is a label times table with three columns:\\n\",\n    \"\\n\",\n    \"- The engine ID associated to the records. There can be many training examples generated from each engine.\\n\",\n    \"- The event time of the engine. This is also known as a cutoff time for building features. Only data that existed beforehand is valid to use for predictions.\\n\",\n    \"- The value of the RUL. This is calculated by the labeling function.\\n\",\n    \"\\n\",\n    \"At this point, you only have continuous values of the RUL. As a helpful reference, you can print out the search settings that were used to generate these labels.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also get a better look at the values by plotting the distribution and the cumulative count across time.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"%matplotlib inline\\n\",\n    \"fig, ax = subplots(nrows=2, ncols=1, figsize=(6, 8))\\n\",\n    \"lt.plot.distribution(ax=ax[0])\\n\",\n    \"lt.plot.count_by_time(ax=ax[1])\\n\",\n    \"fig.tight_layout(pad=2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"With the continuous values, you can explore different ranges without running the search again. In this case, use quartiles to bin the values into ranges.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt = lt.bin(4, quantiles=True, precision=0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"When you print out the settings again, you can now see that the description of the labels has been updated and reflects the latest changes.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Look at the new label distribution and cumulative count across time.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fig, ax = subplots(nrows=2, ncols=1, figsize=(6, 8))\\n\",\n    \"lt.plot.distribution(ax=ax[0])\\n\",\n    \"lt.plot.count_by_time(ax=ax[1])\\n\",\n    \"fig.tight_layout(pad=2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"## Feature Engineering\\n\",\n    \"\\n\",\n    \"In the previous step, you generated the labels. The next step is to generate features.\\n\",\n    \"\\n\",\n    \"### Representing the Data\\n\",\n    \"\\n\",\n    \"Let’s start by representing the data with an EntitySet. That way, you can generate features based on the relational structure of the dataset. You currently have a single table of records where one engine can have many records. This one-to-many relationship can be represented by normalizing an engine dataframe. The same can be done for other one-to-many relationships. Because you want to make predictions based on the engine, you should use this engine dataframe as the target for generating features.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"es = ft.EntitySet(\\\"observations\\\")\\n\",\n    \"\\n\",\n    \"es.add_dataframe(\\n\",\n    \"    dataframe=df.reset_index(),\\n\",\n    \"    dataframe_name=\\\"records\\\",\\n\",\n    \"    index=\\\"id\\\",\\n\",\n    \"    time_index=\\\"time\\\",\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"records\\\",\\n\",\n    \"    new_dataframe_name=\\\"engines\\\",\\n\",\n    \"    index=\\\"engine_no\\\",\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.normalize_dataframe(\\n\",\n    \"    base_dataframe_name=\\\"records\\\",\\n\",\n    \"    new_dataframe_name=\\\"cycles\\\",\\n\",\n    \"    index=\\\"time_in_cycles\\\",\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"es.plot()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"### Calculating the Features\\n\",\n    \"\\n\",\n    \"Now you can generate features by using a method called Deep Feature Synthesis (DFS). That method automatically builds features by stacking and applying mathematical operations called primitives across relationships in an entityset. The more structured an entityset is, the better DFS can leverage the relationships to generate better features. Run DFS with these parameters:\\n\",\n    \"\\n\",\n    \"- `entityset` as the entityset we structured previously.\\n\",\n    \"- `target_dataframe_name` as the engine dataframe.\\n\",\n    \"- `cutoff_time` as the label times that we generated previously. The label values are appended to the feature matrix.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fm, fd = ft.dfs(\\n\",\n    \"    entityset=es,\\n\",\n    \"    target_dataframe_name=\\\"engines\\\",\\n\",\n    \"    agg_primitives=[\\\"sum\\\"],\\n\",\n    \"    trans_primitives=[],\\n\",\n    \"    cutoff_time=lt,\\n\",\n    \"    cutoff_time_in_index=True,\\n\",\n    \"    include_cutoff_time=False,\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"fm.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"There are two outputs from DFS: a feature matrix and feature definitions. The feature matrix is a table that contains the feature values with the corresponding labels based on the cutoff times. Feature definitions are features in a list that can be stored and reused later to calculate the same set of features on future data.\\n\",\n    \"\\n\",\n    \"## Machine Learning\\n\",\n    \"\\n\",\n    \"In the previous steps, generate the labels and features. The final step is to build the machine learning pipeline.\\n\",\n    \"\\n\",\n    \"### Splitting the Data\\n\",\n    \"\\n\",\n    \"Start by extracting the labels from the feature matrix and splitting the data into a training set and a holdout set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fm.reset_index(drop=True, inplace=True)\\n\",\n    \"y = fm.ww.pop(\\\"rul\\\").cat.codes\\n\",\n    \"\\n\",\n    \"splits = evalml.preprocessing.split_data(\\n\",\n    \"    X=fm,\\n\",\n    \"    y=y,\\n\",\n    \"    test_size=0.2,\\n\",\n    \"    random_seed=2,\\n\",\n    \"    problem_type=\\\"multiclass\\\",\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"X_train, X_holdout, y_train, y_holdout = splits\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"### Finding the Best Model\\n\",\n    \"\\n\",\n    \"Run a search on the training set to find the best machine learning model. During the search process, predictions from several different pipelines are evaluated to find the best pipeline.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"automl = evalml.AutoMLSearch(\\n\",\n    \"    X_train=X_train,\\n\",\n    \"    y_train=y_train,\\n\",\n    \"    problem_type=\\\"multiclass\\\",\\n\",\n    \"    objective=\\\"f1 macro\\\",\\n\",\n    \"    random_seed=0,\\n\",\n    \"    allowed_model_families=[\\\"catboost\\\", \\\"random_forest\\\"],\\n\",\n    \"    max_iterations=3,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"automl.search()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Once the search is complete, you can print out information about the best pipeline found, like the parameters in each component.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"automl.best_pipeline.describe()\\n\",\n    \"automl.best_pipeline.graph()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Score the model performance by evaluating predictions on the holdout set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"best_pipeline = automl.best_pipeline.fit(X_train, y_train)\\n\",\n    \"\\n\",\n    \"score = best_pipeline.score(\\n\",\n    \"    X=X_holdout,\\n\",\n    \"    y=y_holdout,\\n\",\n    \"    objectives=[\\\"f1 macro\\\"],\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"dict(score)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"From the pipeline, you can see which features are most important for predictions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"feature_importance = best_pipeline.feature_importance\\n\",\n    \"feature_importance = feature_importance.set_index(\\\"feature\\\")[\\\"importance\\\"]\\n\",\n    \"top_k = feature_importance.abs().sort_values().tail(20).index\\n\",\n    \"feature_importance[top_k].plot.barh(figsize=(8, 8), fontsize=14, width=0.7);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Making Predictions\\n\",\n    \"\\n\",\n    \"You are ready to make predictions with our trained model. Start by calculating the same set of features by using the feature definitions. Use a cutoff time based on the latest information available in the dataset.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fm = ft.calculate_feature_matrix(\\n\",\n    \"    features=fd,\\n\",\n    \"    entityset=es,\\n\",\n    \"    cutoff_time=ft.pd.Timestamp(\\\"2001-01-08\\\"),\\n\",\n    \"    cutoff_time_in_index=True,\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"fm.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now predict which one of the four ranges the RUL is in.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y_pred = best_pipeline.predict(fm)\\n\",\n    \"y_pred = y_pred.values\\n\",\n    \"\\n\",\n    \"prediction = fm[[]]\\n\",\n    \"prediction[\\\"rul (estimate)\\\"] = y_pred\\n\",\n    \"prediction.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Next Steps\\n\",\n    \"\\n\",\n    \"You have completed this tutorial. You can revisit each step to explore and fine-tune the model using different parameters until it is ready for production. For more information about how to work with the features produced by Featuretools, take a look at [the Featuretools documentation](https://featuretools.alteryx.com/). For more information about how to work with the models produced by EvalML, take a look at [the EvalML documentation](https://evalml.alteryx.com/).\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"celltoolbar\": \"Raw Cell Format\",\n  \"jupytext\": {\n   \"cell_metadata_filter\": \"-all\",\n   \"main_language\": \"python\",\n   \"notebook_metadata_filter\": \"-all\"\n  },\n  \"kernelspec\": {\n   \"display_name\": \"Python 3.10.6 64-bit ('3.10.6')\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.10.6\"\n  },\n  \"vscode\": {\n   \"interpreter\": {\n    \"hash\": \"175a0a3732e9eeea35e317863527a17b85ae672598d99ca4a71576ee9ad73d9c\"\n   }\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "docs/source/images/innovation_labs.xml",
    "content": "<mxfile host=\"Electron\" modified=\"2020-08-28T18:11:21.195Z\" agent=\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.5.3 Chrome/78.0.3904.130 Electron/7.1.9 Safari/537.36\" etag=\"qClC5hsCC0TGMAKUD1jm\" version=\"12.5.3\" type=\"device\"><diagram id=\"aKPOSDwQL8TOr5ASgo4A\" name=\"Page-1\">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</diagram></mxfile>"
  },
  {
    "path": "docs/source/images/label-maker.xml",
    "content": "<mxfile modified=\"2019-07-02T21:30:54.163Z\" host=\"www.draw.io\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36\" etag=\"7m8kOixzG-fyQ-LpKlHZ\" version=\"10.8.7\" type=\"device\"><diagram id=\"dXYWCnzsy4SLHoJbjquB\" name=\"Page-1\">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</diagram></mxfile>"
  },
  {
    "path": "docs/source/images/labeling-function.xml",
    "content": "<mxfile modified=\"2019-07-02T21:15:56.017Z\" host=\"www.draw.io\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36\" etag=\"WKIvZqprEX4tHkfuKc1l\" version=\"10.8.7\" type=\"device\"><diagram id=\"4wl_wSO49H53i_hpWO69\" name=\"Page-1\">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</diagram></mxfile>"
  },
  {
    "path": "docs/source/images/workflow.xml",
    "content": "<mxfile modified=\"2020-07-16T17:20:08.201Z\" host=\"Electron\" agent=\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.5.3 Chrome/78.0.3904.130 Electron/7.1.9 Safari/537.36\" etag=\"w7WmvxFFEr101-rQZ2pq\" version=\"12.5.3\" type=\"device\"><diagram id=\"1Q1pE_N-xS42v8DU2RtV\" name=\"Page-1\">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</diagram></mxfile>"
  },
  {
    "path": "docs/source/index.rst",
    "content": "================\nWhat is Compose?\n================\n\n.. toctree::\n    :hidden:\n    :maxdepth: 1\n\n    install\n    start\n    tutorials\n    user_guide\n    resources\n    api_reference\n    release_notes\n\n------------\n\n|\n\n.. image:: images/compose.png\n    :width: 500px\n    :align: center\n\n|\n\n**Compose** is a machine learning tool for automated prediction engineering. It allows you to structure prediction problems and generate labels for supervised learning. An end user defines an outcome of interest by writing a *labeling function*, then runs a search to automatically extract training examples from historical data. Its result is then provided to Featuretools_ for automated feature engineering and subsequently to EvalML_ for automated machine learning. The workflow of an applied machine learning engineer then becomes:\n\n.. _Featuretools: https://docs.featuretools.com/\n.. _EvalML: https://evalml.alteryx.com/\n\n|\n\n.. image:: images/workflow.png\n    :align: center\n\n|\n\nBy automating the early stage of the machine learning pipeline, our end user can easily define a task and solve it.\n\n.. _main-concepts:\n\nMain Concepts\n=============\n\nPrediction problems are structured by using a *label maker* and a *labeling function*. The label maker automatically extracts data along the time index to generate labels. The process starts by setting the first cutoff time after the minimum amount of data. Then subsequent cutoff times are spaced apart using *gaps*. Starting from each cutoff time, a window determines the amount of data, also referred to as a *data slice*, to pass into a labeling function.\n\n.. image:: images/label-maker.svg\n    :width: 650px\n    :align: center\n\nThe labeling function will then transform the extracted data slice into a label.\n\n.. image:: images/labeling-function.svg\n    :width: 425px\n    :align: center\n\nWhen a labeling function returns continuous values, there are :doc:`label transforms </user_guide/using_label_transforms>` available to further process the labels into discrete values.\n\n|\n"
  },
  {
    "path": "docs/source/install.md",
    "content": "# Install\n\nCompose is available for Python 3.8, 3.9, 3.10, and 3.11. It can be installed from [PyPI](https://pypi.org/project/composeml/), [conda-forge](https://anaconda.org/conda-forge/composeml), or from [source](https://github.com/alteryx/compose).\n\n## pip\n\nTo install Compose, run the following command:\n\n````{tab} PyPI\n```console\n$ python -m pip install composeml\n```\n````\n\n````{tab} Conda\n```console\n$ conda install -c conda-forge composeml\n```\n````\n\n````{tab} Source\n```console\ngit clone https://github.com/alteryx/compose.git\ncd compose\npython -m pip install .\n```\n````\n\n## Docker\nIt is also possible to run Compose inside a Docker container.\n\nYou can do so by installing it as a package inside a container (following the normal install guide) or\ncreating a new image with Compose pre-installed, using the following commands in your Dockerfile:\n\n```bash\nFROM python:3.8-slim-buster\nRUN apt-get update && apt-get -y update\nRUN apt-get install -y build-essential python3-pip python3-dev\nRUN pip -q install pip --upgrade\nRUN pip install composeml\n```\n\n## Add-ons\n\n* Update checker: Receive automatic notifications of new Compose releases\n\n````{tab} PyPI\n```console\n$ python -m pip install composeml[update_checker]\n```\n````\n\n````{tab} Conda\n```console\n$ conda install -c conda-forge alteryx-open-src-update-checker\n```\n````\n"
  },
  {
    "path": "docs/source/release_notes.rst",
    "content": "Release Notes\n-------------\n\nFuture Release\n==============\n    * Enhancements\n    * Fixes\n    * Changes\n        * Remove isort, add pre-commit-config.yaml, and run on all files (:pr:`366`)\n        * Specify black and ruff config arguments in pre-commit-config (:pr:`371`)\n        * Update s3 bucket for docs image (:pr:`384`)\n    * Documentation Changes\n    * Testing Changes\n\n    Thanks to the following people for contributing to this release:\n    :user:`gsheni`:\n\nv0.10.1 Jan 6, 2023\n===================\n    * Changes\n        * Update create feedstock pull request workflow (:pr:`364`)\n\n    Thanks to the following people for contributing to this release:\n    :user:`gsheni`\n\nv0.10.0 Jan 6, 2023\n===================\n    * Fixes\n        * Update to avoid error with a categorical target with unused categories (:pr:`349`)\n    * Changes\n        * Transition to pure pyproject.toml for project metadata (:pr:`351`)\n        * Change `target_dataframe_name` parameter name to `target_dataframe_index` (:pr:`353`)\n        * Delete MANIFEST.in and .coveragerc from root directory (:pr:`359`)\n    * Documentation Changes\n        * Temporarily restrict scikit-learn version to ``<1.2.0`` in dev requirements to allow docs to build (:pr:`361`)\n    * Testing Changes\n        * Add create feedstock PR workflow (:pr:`346`)\n\n    Thanks to the following people for contributing to this release:\n    :user:`gsheni`, :user:`thehomebrewnerd`\n\nBreaking Changes\n++++++++++++++++\n* The parameter ``target_dataframe_name`` has been changed to ``target_dataframe_index`` in ``LabelMaker``.\n\nv0.9.1 Nov 2, 2022\n==================\n    * Changes\n        * Explicitly set series dtype for ``LabelTimes.target_types`` (:pr:`337`)\n    * Documentation Changes\n        * Fix docs build and clean up release notes (:pr:`336`)\n\n    Thanks to the following people for contributing to this release:\n    :user:`thehomebrewnerd`\n\nv0.9.0 May 12, 2022\n===================\n    .. warning::\n        Compose will no longer support Python 3.7.\n\n    * Changes\n        * Update ipython to 7.31.1 (:pr:`286`)\n        * Transition to pyproject.toml and setup.cfg (:pr:`310`, :pr:`313`)\n        * Add support for python 3.10 (:pr:`318`)\n        * Fix Makefile output filepath (:pr:`320`)\n    * Documentation Changes\n        * Update README.md with Alteryx link (:pr:`289`, :pr:`290`, :pr:`314`)\n        * Add in-line tabs and copy-paste functionality to docs (:pr:`293`)\n        * Update nbconvert to version 6.4.5 to fix docs build issue (:pr:`305`)\n        * Update slack invite link to new (:pr:`316`)\n        * Update ``release.md`` with correct process (:pr:`324`)\n    * Testing Changes\n        * Add woodwork to ``test-requirements.txt`` (:pr:`296`)\n        * Upgrade black version to 22.3.0 to fix linting issue (:pr:`309`)\n\n    Thanks to the following people for contributing to this release:\n    :user:`gsheni`, :user:`mingdavidqi`, :user:`thehomebrewnerd`\n\nv0.8.0 Jan 20, 2022\n===================\n    * Enhancements\n        * Add issue templates for bugs, feature requests and documentation improvements (:pr:`271`)\n    * Changes\n        * Update pip to 21.3.1 for test requirements (:pr:`265`)\n        * Restrict to Python 3.7 to 3.9 (:pr:`265`)\n        * Use black and remove autopep8 for linting (:pr:`265`)\n        * Update minimum dependency checker with the correct reviewers (:pr:`267`)\n        * Rename ``LabelMaker.target_entity`` to ``LabelMaker.target_dataframe_name`` (:pr:`276`)\n    * Documentation Changes\n        * Update install instructions to specify correct python versions (:pr:`265`)\n        * Update example notebooks to use latest Featuretools and EvalML APIs (:pr:`275`)\n    * Testing Changes\n        * Add unit test for dropping empty data slices (:pr:`280`)\n        * Add auto approve workflow for dependency updates (:pr:`281`)\n\n    Thanks to the following people for contributing to this release:\n    :user:`gsheni`, :user:`jeff-hernandez`, :user:`thehomebrewnerd`\n\n    .. warning::\n\n        **Breaking Changes**\n            * The ``target_entity`` attribute of ``LabelMaker`` has been renamed to ``target_dataframe_name``.\n\nv0.7.0 Nov 2, 2021\n==================\n    * Enhancements\n        * Add ``maximum_data`` parameter to control when a search should stop (:pr:`216`)\n        * Add optional automatic update checker (:pr:`223`, :pr:`229`, :pr:`232`)\n        * Varying first cutoff time for each target group (:pr:`258`)\n    * Documentation Changes\n        * Update doc tutorials to the latest API changes (:pr:`227`)\n        * Pin documentation requirements to avoid warnings and breaking changes (:pr:`244`)\n    * Testing Changes\n        * Check if release notes were updated (:pr:`217`)\n        * Add minimum dependency checker to generate minimum requirement files (:pr:`218`)\n        * Add CI workflow for unit tests with minimum dependencies (:pr:`220`)\n        * Create separate worksflows for each CI job (:pr:`220`)\n        * Pass token to authorize uploading of codecov reports (:pr:`226`)\n        * Update minimum unit tests to run on all pull requests (:pr:`230`)\n        * Add workflow to check latest dependencies (:pr:`233`)\n        * Update reviewers for minimum and latest dependency checkers (:pr:`257`)\n\n    Thanks to the following people for contributing to this release:\n    :user:`gsheni`, :user:`jeff-hernandez`\n\nv0.6.0 Feb 11, 2021\n===================\n    * Enhancements\n        * Added description for continuous target distributions (:pr:`187`)\n    * Fixes\n        * Sorted label distribution in description (:pr:`188`)\n    * Documentation Changes\n        * Made logo easier to read (:pr:`182`)\n        * Added Alteryx footer to docs (:pr:`185`, :pr:`186`)\n        * Updated tutorials to the latest API changes (:pr:`190`, :pr:`198`, :pr:`204`)\n        * Updated repository links to GitHub (:pr:`191`)\n        * Added help page to docs (:pr:`194`)\n        * Improved docs based on tech writer feedback (:pr:`195`)\n        * Added open graph info to docs (:pr:`203`)\n    * Testing Changes\n        * Migrated CI tests to Github Actions (:pr:`184`, :pr:`189`)\n        * Updated tests to trigger on pull request events (:pr:`199`)\n\n    Thanks to the following people for contributing to this release:\n    :user:`flowersw`, :user:`jeff-hernandez`, :user:`rwedge`\n\nv0.5.1 Sep 22, 2020\n===================\n    * Documentation Changes\n        * Update F1 Macro in Turbofan Degradation Tutorial (:pr:`180`).\n        * Apply Pandas Docs Theme (:pr:`172`).\n        * Add Chicago Bike Tutorial (:pr:`157`).\n    * Testing Changes\n        * Test Doc Builds (:pr:`165`)\n\nv0.5.0 Aug 28, 2020\n===================\n    * Enhancements\n        * Added Column-Based Windows (:pr:`151`).\n    * Changes\n        * Refactored Data Slice Generator (:pr:`150`).\n    * Documentation Changes\n        * Updated README (:pr:`164`).\n        * Updated Predict Next Purchase Demo (:pr:`154`).\n        * Updated Predict Turbofan Degradation Demo (:pr:`154`).\n\n    .. warning::\n\n        **Breaking Changes**\n            * Attributes of the data slice context have changed. Inside a labeling function, the timestamps of a data slice can be referenced by :code:`ds.context.slice_start` and :code:`ds.context.slice_stop`. For more details, see :ref:`Data Slice Context <data-slice-context>`.\n\nv0.4.0 Jul 2, 2020\n==================\n    * Enhancements\n        * Target values can be sampled from each group (:pr:`138`).\n        * One of multiple targets can be selected (:pr:`147`).\n        * Labels can be binned using infinite edges represented as string (:pr:`133`).\n    * Changes\n        * The label times object was refactored to improve design and structure (:pr:`135`).\n\n    .. warning::\n\n        **Breaking Changes**\n            * Loading label times from previous versions will result in an error.\n\nv0.3.0 Jun 1, 2020\n==================\n    * Enhancements\n        * Label Search for Multiple Targets (:pr:`130`)\n    * Changes\n        * Column renamed from :code:`cutoff_time` to :code:`time` (:pr:`139`)\n\nv0.2.0 Apr 23, 2020\n===================\n    * Changes\n        * Dropped Support for Python 3.5 (:pr:`128`)\n        * Rename LabelTimes.name to LabelTimes.label_name (:pr:`126`)\n        * Support keyword arguments in Pandas methods. (:pr:`121`)\n    * Documentation Changes\n        * Improved data download in Predict Next Purchase (:pr:`76`)\n    * Testing Changes\n        * Added tests that use Python 3.8 in CirlceCI (:pr:`128`)\n\n    .. warning::\n\n        **Breaking Changes**\n            * ``LabelTimes.name`` has been renamed to ``LabelTimes.label_name``\n\nv0.1.8 Mar 11, 2020\n===================\n    * Fixes\n        * Support for Pandas 1.0\n\nv0.1.7 Jan 31, 2020\n===================\n    * Enhancements\n        * Added higher-level mappings to offsets.\n        * Track settings for sample transforms.\n    * Fixes\n        * Pinned Pandas version.\n    * Testing Changes\n        * Moved Featuretools to test requirements.\n\nv0.1.6 Oct 22, 2019\n===================\n    * Enhancements\n        * Serialization for Label Times\n    * Fixes\n        * Matplotlib Backend Fix\n        * Sampling Label Times\n    * Documentation Changes\n        * Added Data Slice Generator Guide\n    * Testing Changes\n        * Integration Tests for Python Versions 3.6 and 3.7\n\nv0.1.5 Sep 16, 2019\n===================\n    * Enhancements\n        * Added Slice Generator\n        * Added Seaborn Plots\n        * Added Data Slice Context\n        * Added Count per Group\n    * Documentation Changes\n        * Updated README\n        * Added Example: Predict Next Purchase\n        * Added Example: Predict RUL\n\nv0.1.4 Aug 7, 2019\n==================\n    * Enhancements\n        * Added Sample Transform\n        * Improved Progress Bar\n        * Improved Label Times description\n\nv0.1.3 Jul 9, 2019\n==================\n    * Enhancements\n        * Improved documentation\n        * Added testing for Featuretools compatibility\n        * Improved description of Label Times\n        * Refactored search in Label Maker\n        * Improved testing for Label Transforms\n\nv0.1.2 Jun 19, 2019\n===================\n    * Enhancements\n        * Add dynamic progress bar\n        * Add label transform for binning labels\n        * Improve code coverage\n        * Update documentation\n\nv0.1.1 May 31, 2019\n===================\n    * Initial Release\n"
  },
  {
    "path": "docs/source/resources/faq.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# FAQ\\n\",\n    \"\\n\",\n    \"## I have heard of autoML and automated feature engineering, how is this different?\\n\",\n    \"\\n\",\n    \"AutoML targets solving the problem once the labels or targets one wants to predict are well defined and  available. Feature engineering focuses on generating features, given a dataset, labels, and targets. Both assume that the target a user wants to predict is already defined and computed. In most real world scenarios, this is something a data scientist has to do: define an outcome to predict and create labeled training examples. We structured this process and called it prediction engineering (a play on an already well defined process feature engineering). This library provides an easy way for a user to define the target outcome and generate training examples automatically from relational, temporal, multi entity datasets.\\n\",\n    \"\\n\",\n    \"## I have used Featuretools for competing in KAGGLE, how can I use Compose?\\n\",\n    \"\\n\",\n    \"In most KAGGLE competitions the target to predict is already defined. In many cases, they follow the same way to represent training examples as us—“label times” (see here and here). Compose is a step prior to where KAGGLE starts. Indeed, it is a step that KAGGLE or the company sponsoring the competition might have to do or would have done before publishing the competition.\\n\",\n    \"\\n\",\n    \"## Why have I not encountered the need for Compose yet?\\n\",\n    \"\\n\",\n    \"In many cases, setting up prediction problem is done independently before even getting started on the machine learning. This has resulted in a very skewed availability of datasets with already defined prediction problems and labels. A number of times it also results in a data scientist not knowing how the label was defined. In opening up this part of the process, we are enabling data scientists to more flexibly define problems, explore more problems and solve problems to maximize the end goal - ROI.\\n\",\n    \"\\n\",\n    \"## I already have “Label times” file, do I need Compose?\\n\",\n    \"\\n\",\n    \"If you already have label times you don’t need LabelMaker and search. However, you could use the label transforms functionality of Compose to apply lead and threshold, as well as balance labels.\\n\",\n    \"\\n\",\n    \"## What is the best use of Compose?\\n\",\n    \"\\n\",\n    \"Since we have automated feature engineering and autoML, the best recommended use for Compose is to closely couple *LabelMaker* and *Search* functionality of Compose with the rest of the machine learning pipeline. Certain parameters used in *Search*, and *LabelMaker* and *label transforms* can be tuned alongside machine learning model.\\n\",\n    \"\\n\",\n    \"## Where can I read about your technical approach in detail?\\n\",\n    \"\\n\",\n    \"You can read about prediction engineering, the way we defined the search algorithm and technical details in this peer reviewed paper published in IEEE international conference on data science and advanced analytics. If you’re interested, you can also watch a video here. Please note that some of our thinking and terminology has evolved as we built this library and applied Compose to different industrial scale problems.\\n\",\n    \"\\n\",\n    \"## Do you think Compose should be part of a data scientist’s toolkit?\\n\",\n    \"\\n\",\n    \"Yes. As we mentioned above, extracting value out of your data is dependent on how you set the prediction problem. Currently, data scientists do not iterate through the setting up of the prediction problem because there is no structured way of doing it or algorithms and library to help do it. We believe that prediction engineering should be taken even more seriously than any other part of actually solving a problem.\\n\",\n    \"\\n\",\n    \"## How can I contribute labeling functions, or use cases?\\n\",\n    \"\\n\",\n    \"We are happy for anyone who can provide interesting labeling functions. To contribute an interesting new use case and labeling function, we request you create a representative synthetic data set, a labeling function and the parameters for label maker. Once you have these three, you can write a brief explanation about the use case and do a pull request.\\n\",\n    \"\\n\",\n    \"## I have a transaction file with the label as the last column, what are my label times?\\n\",\n    \"\\n\",\n    \"Your label times is the . However, when such a data set is given one should ask for how that label was generated. It could be one of very many cases: a human could have assigned it based on their assessment/analysis, it could have been automatically generated by a system, or it could have been computed using some data. If it is the third case one should ask for the function that computed the label or rewrite it. If it is (1), one should note that the ref_time would be slightly after the transaction timestamp.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"jupytext\": {\n   \"cell_metadata_filter\": \"-all\",\n   \"notebook_metadata_filter\": \"-all\"\n  },\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.7.5\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "docs/source/resources/help.rst",
    "content": "====\nHelp\n====\n\nCouldn't find what you were looking for? The Alteryx open source community is happy to provide support to users of Compose.\n\n\nDiscussion\n==========\n\nConversation happens in the following places:\n\n1.  **General usage questions** are directed to `StackOverflow`_ with the :code:`compose-ml` tag.\n2.  **Bug reports** are managed on the `GitHub issue\n    tracker`_.\n3.  **Chat** and collaboration within the community occurs on `Slack`_. For general usage questions, please post on\n    Stack Overflow where answers are more searchable by other users.\n\n.. _`StackOverflow`: https://stackoverflow.com/questions/tagged/compose-ml\n.. _`Github issue tracker`: https://github.com/alteryx/compose/issues\n.. _`Slack`: https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA\n\n\nAsking for help\n===============\n\nAll users levels, including beginners, should feel free to ask questions and\nreport bugs when using Compose. You can get better answers if follow a\nfew simple guidelines:\n\n1.  **Use the right resource**: We suggest using Github or StackOverflow.\n    Questions asked at these locations will be more searchable for other users.\n\n    - Slack should be used for community discussion and collaboration.\n    - For general questions on how something should work or tips, use StackOverflow.\n    - Bugs should be reported on Github.\n\n2.  **Ask in one place only**: Please post your question in one place\n    (StackOverflow or Github).\n\n3.  **Use examples**: Make `minimal, complete, verifiable examples\n    <https://stackoverflow.com/help/mcve>`_. You will get\n    much better answers if your provide code that people can use to reproduce\n    your problem.\n\n|\n"
  },
  {
    "path": "docs/source/resources.rst",
    "content": "=========\nResources\n=========\n\nFrequently asked questions and additional resources\n\n.. toctree::\n    :glob:\n    :maxdepth: 1\n\n    resources/faq\n    resources/help\n\n|\n"
  },
  {
    "path": "docs/source/start.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"=====\\n\",\n    \"Start\\n\",\n    \"=====\\n\",\n    \"\\n\",\n    \"In this example, you generate labels on a mock dataset of transactions. For each customer, you want to label whether the total purchase amount over the next hour of transactions will exceed $300. Additionally, you want to make your predictions one hour in advance.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import composeml as cp\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Load Data\\n\",\n    \"=========\\n\",\n    \"\\n\",\n    \"With the package installed, load the data. To get an idea on how the transactions looks, preview the data frame.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"df = cp.demos.load_transactions()\\n\",\n    \"\\n\",\n    \"df[df.columns[:7]].head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Create Labeling Function\\n\",\n    \"========================\\n\",\n    \"\\n\",\n    \"Define the labeling function that returns the total purchase amount given a hour of transactions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def total_spent(df):\\n\",\n    \"    total = df[\\\"amount\\\"].sum()\\n\",\n    \"    return total\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Construct Label Maker\\n\",\n    \"=====================\\n\",\n    \"\\n\",\n    \".. currentmodule:: composeml\\n\",\n    \"\\n\",\n    \"With the labeling function, create the :class:`LabelMaker` for this prediction problem. To process one hour of transactions for each customer, set the :code:`target_dataframe_index` to the customer ID and the :code:`window_size` to one hour.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"label_maker = cp.LabelMaker(\\n\",\n    \"    target_dataframe_index=\\\"customer_id\\\",\\n\",\n    \"    time_index=\\\"transaction_time\\\",\\n\",\n    \"    labeling_function=total_spent,\\n\",\n    \"    window_size=\\\"1h\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Generate Labels\\n\",\n    \"===============\\n\",\n    \"\\n\",\n    \"Automatically search and extract the labels using :py:meth:`LabelMaker.search`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels = label_maker.search(\\n\",\n    \"    df.sort_values(\\\"transaction_time\\\"),\\n\",\n    \"    num_examples_per_instance=-1,\\n\",\n    \"    gap=1,\\n\",\n    \"    verbose=True,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"labels.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"%matplotlib inline\\n\",\n    \"plot = labels.plot.dist()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Transform Labels\\n\",\n    \"================\\n\",\n    \"\\n\",\n    \"With the generated :class:`LabelTimes`, apply specific transforms for our prediction problem.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Apply Threshold on Labels\\n\",\n    \"-------------------------\\n\",\n    \"\\n\",\n    \"To make the labels binary, :py:meth:`LabelTimes.threshold` is applied for amounts exceeding $300.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels = labels.threshold(300)\\n\",\n    \"\\n\",\n    \"labels.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Lead Label Times\\n\",\n    \"----------------\\n\",\n    \"\\n\",\n    \"The label times are shifted one hour earlier for predicting in advance by using :py:meth:`LabelTimes.apply_lead`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels = labels.apply_lead(\\\"1h\\\")\\n\",\n    \"\\n\",\n    \"labels.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Describe Labels\\n\",\n    \"===============\\n\",\n    \"\\n\",\n    \"After transforming the labels, use :py:meth:`LabelTimes.describe` to print out the distribution with the settings and transforms that were used to make these labels. This is useful as a reference for understanding how the labels are generated from raw data. Also, the label distribution is helpful for determining if we have imbalanced labels.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Plot Labels\\n\",\n    \"===========\\n\",\n    \"\\n\",\n    \"You can use plots to inspect the labels.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Distribution\\n\",\n    \"------------\\n\",\n    \"\\n\",\n    \"This plot shows the label distribution.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"plot = labels.plot.distribution()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Count by Time\\n\",\n    \"-------------\\n\",\n    \"\\n\",\n    \"This plot shows the label distribution across cutoff times.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"plot = labels.plot.count_by_time()\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"celltoolbar\": \"Raw Cell Format\",\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.8.5\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "docs/source/tutorials.rst",
    "content": "=========\nTutorials\n=========\n\nUse these tutorial to learn how to use Compose for building AutoML applications.\n\n.. toctree::\n    :glob:\n    :maxdepth: 1\n\n    examples/*\n\n|\n"
  },
  {
    "path": "docs/source/user_guide/controlling_cutoff_times.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"fcfef470\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Controlling cutoff times in a label search\\n\",\n    \"\\n\",\n    \"The start time of the labeling process is known as the first cutoff time. You need data that exists before the first cutoff time to build features. You can use `minimum_data` in a label search to directly define the first cutoff time or the amount of data needed before the first cutoff time. Similarly, you can use `maximum_data` to directly define the last cutoff time. These parameters let you control when the labeling process starts and finishes.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"3cc3d374\",\n   \"metadata\": {\n    \"nbsphinx\": \"hidden\"\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from io import StringIO\\n\",\n    \"from pandas import read_csv\\n\",\n    \"\\n\",\n    \"transaction_data = \\\"\\\"\\\"\\n\",\n    \"customer_id,transaction_time,amount\\n\",\n    \"3,2021-03-31 18:51:27,52.29\\n\",\n    \"5,2021-03-22 06:56:05,33.81\\n\",\n    \"5,2021-03-20 23:45:21,76.3\\n\",\n    \"2,2021-03-30 10:06:59,32.72\\n\",\n    \"1,2021-02-17 11:01:22,59.16\\n\",\n    \"2,2021-01-16 10:59:44,56.33\\n\",\n    \"3,2021-01-12 07:53:00,61.84\\n\",\n    \"4,2021-03-15 21:00:25,34.91\\n\",\n    \"2,2021-01-26 10:01:37,69.88\\n\",\n    \"2,2021-02-07 05:42:14,49.7\\n\",\n    \"2,2021-03-15 16:35:16,41.08\\n\",\n    \"4,2021-02-06 13:17:19,32.34\\n\",\n    \"2,2021-02-21 09:42:48,86.15\\n\",\n    \"4,2021-03-24 00:40:24,97.08\\n\",\n    \"4,2021-03-23 04:27:47,58.81\\n\",\n    \"4,2021-02-23 13:32:22,59.67\\n\",\n    \"4,2021-02-10 03:46:16,96.36\\n\",\n    \"3,2021-03-13 09:24:54,25.4\\n\",\n    \"1,2021-01-27 13:58:38,26.15\\n\",\n    \"3,2021-02-23 03:26:58,28.96\\n\",\n    \"1,2021-01-05 09:55:18,24.6\\n\",\n    \"1,2021-03-09 07:14:27,49.64\\n\",\n    \"1,2021-02-10 23:27:37,31.29\\n\",\n    \"2,2021-01-23 18:19:05,42.88\\n\",\n    \"1,2021-01-05 22:50:52,58.58\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"created_account_data = \\\"\\\"\\\"\\n\",\n    \"customer_id,created_account\\n\",\n    \"1,2021-01-10\\n\",\n    \"2,2021-02-12\\n\",\n    \"3,2021-01-23\\n\",\n    \"4,2021-02-13\\n\",\n    \"5,2021-01-24\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"with StringIO(transaction_data) as data:\\n\",\n    \"    transactions = read_csv(data, parse_dates=[\\\"transaction_time\\\"])\\n\",\n    \"\\n\",\n    \"with StringIO(created_account_data) as data:\\n\",\n    \"    created_account = read_csv(\\n\",\n    \"        data, parse_dates=[\\\"created_account\\\"], index_col=\\\"customer_id\\\"\\n\",\n    \"    )[\\\"created_account\\\"]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"a49db5e1\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Labeling customer transactions\\n\",\n    \"\\n\",\n    \"For example, suppose you have customer transactions from the first quarter of 2021.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"cf63bed2\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import composeml as cp\\n\",\n    \"\\n\",\n    \"transactions.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"d6d19fff\",\n   \"metadata\": {},\n   \"source\": [\n    \"You want to calculate the total amount that customers spent over two weeks *only for February*. Start by defining a labeling function that sums up the transaction amount. Then, create a label maker that will label data over two weeks using the transaction time.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"6cb2d34a\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def total_amount(ds):\\n\",\n    \"    return ds.amount.sum()\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"lm = cp.LabelMaker(\\n\",\n    \"    labeling_function=total_amount,\\n\",\n    \"    time_index=\\\"transaction_time\\\",\\n\",\n    \"    target_dataframe_index=\\\"customer_id\\\",\\n\",\n    \"    window_size=\\\"14d\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"dee27ce4\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Defining the first and last cutoff time\\n\",\n    \"\\n\",\n    \"Now, you can use `minimum_data` in the label search to directly set the 1st of February as the first cutoff time. Since you are labeling data over two weeks, you can define the last cutoff time as the 15th.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"953ee7c3\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt = lm.search(\\n\",\n    \"    df=transactions.sort_values(\\\"transaction_time\\\"),\\n\",\n    \"    num_examples_per_instance=-1,\\n\",\n    \"    minimum_data=\\\"2021-02-01\\\",\\n\",\n    \"    maximum_data=\\\"2021-02-15\\\",\\n\",\n    \"    drop_empty=False,\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"lt\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"c23c02ae\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Changing the first cutoff time for each customer\\n\",\n    \"\\n\",\n    \"Suppose you have a lookup table that contains the dates when customers signed up and created their accounts. Now, you are interested in calculating the total amount that customers spent over two weeks *only after creating an account*.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"5fb84606\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"created_account\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"4edf1235\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can use the column of sign up dates directly as the first cutoff times in the labeling process. Each customer should only have one cutoff time.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"8463785d\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lt = lm.search(\\n\",\n    \"    df=transactions.sort_values(\\\"transaction_time\\\"),\\n\",\n    \"    num_examples_per_instance=-1,\\n\",\n    \"    minimum_data=created_account,\\n\",\n    \"    drop_empty=False,\\n\",\n    \"    verbose=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"lt.head(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"id\": \"cc91d60c\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"For more details on labeling data over specific periods, you can look at the guide on :doc:`generating data slices </user_guide/data_slice_generator>`.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"celltoolbar\": \"Edit Metadata\",\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.8.5\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  },
  {
    "path": "docs/source/user_guide/data_slice_generator.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"====================\\n\",\n    \"Data Slice Generator\\n\",\n    \"====================\\n\",\n    \"The data slice generator is the underlying function used to generate data slices for the labeling function. If the label maker raises an error during the search or the output labels don't seem correct, you need to check the logic in the labeling function or inspect the data for inherent errors. The data slice generator can help identify those problems. You also want to use the generator during the development of your labeling function as a best practice. But it is an optional step and not required to generate labels.\\n\",\n    \"\\n\",\n    \"In this guide, use the data slice generator to inspect data slices and apply a labeling function. To get started, load a mock dataset of transactions and sample the data to see how the transactions look.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import composeml as cp\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"df = cp.demos.load_transactions()\\n\",\n    \"df = df[df.columns[:7]]\\n\",\n    \"df.sample(n=5, random_state=0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Labeling Function\\n\",\n    \"=================\\n\",\n    \"Define a labeling function that returns how much a customer spent given a slice of transactions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def total_spent(df):\\n\",\n    \"    return df[\\\"amount\\\"].sum()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \".. currentmodule:: composeml\\n\",\n    \"\\n\",\n    \"Data Slices\\n\",\n    \"===========\\n\",\n    \"The :meth:`LabelMaker.slice` method creates the data slice generator. The parameters of this method can be passed directly to :meth:`LabelMaker.search` to generate the labels. In the following sections, we explain how to use the data slice generator to make data slices consecutive, overlap, or spread out.\\n\",\n    \"\\n\",\n    \".. seealso::\\n\",\n    \"    For a conceptual explanation of the process, see :ref:`Main Concepts <main-concepts>`.\\n\",\n    \"\\n\",\n    \"Consecutive\\n\",\n    \"-----------\\n\",\n    \"When the gap size is equal to the window size, the data slices are consecutive. In other words, the data slices do not overlap and are not spread out (in other words, don’t skip any data). This is the default value for the gap size. To demonstrate this example, generate data slices using these parameters.\\n\",\n    \"\\n\",\n    \"To start, create a label maker with the 2-hour window size.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lm = cp.LabelMaker(\\n\",\n    \"    target_dataframe_index=\\\"customer_id\\\",\\n\",\n    \"    time_index=\\\"transaction_time\\\",\\n\",\n    \"    labeling_function=total_spent,\\n\",\n    \"    window_size=\\\"2h\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Next, create a data slice generator with the 2-hour gap size. The default value for the gap size is the window size.\\n\",\n    \"\\n\",\n    \".. tip::\\n\",\n    \"   You can directly set :code:`minimum_data` as the first cutoff time.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"slices = lm.slice(\\n\",\n    \"    df.sort_values(\\\"transaction_time\\\"),\\n\",\n    \"    num_examples_per_instance=-1,\\n\",\n    \"    minimum_data=\\\"2014-01-01\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Consecutive - Data Slice #1\\n\",\n    \"~~~~~~~~~~~~~~~~~~~~~~~~~~~\\n\",\n    \"By printing this data slice, you can see that that it is the first slice of transactions (denoted by the :code:`slice_number`) for customer 1. This data slice contains all of the customer’s transactions that occurred within the 2-hour window between :code:`2014-01-01 00:00:00` and :code:`2014-01-01 02:00:00`. You can also see that the 2-hour gap aligns the cutoff times to the window, so the next data slice starts at the end of this data slice.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ds = next(slices)\\n\",\n    \"print(ds.context)\\n\",\n    \"ds\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Apply the labeling function for the total amount spent on this data slice.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"total_spent(ds)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Consecutive - Data Slice #2\\n\",\n    \"~~~~~~~~~~~~~~~~~~~~~~~~~~~\\n\",\n    \"In the second data slice, you can see the next 2 consecutive hours of transactions between :code:`2014-01-01 02:00:00` and :code:`2014-01-01 04:00:00`. This is useful for generating labels that consecutively process the data only once.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ds = next(slices)\\n\",\n    \"print(ds.context)\\n\",\n    \"ds\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Apply our labeling function for the total amount spent on this data slice.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"total_spent(ds)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Overlap\\n\",\n    \"-------\\n\",\n    \"When the the gap size is less than the window size, the data slices overlap. You can use this for rolling window based labeling processes. The amount of overlap is the difference between the window and gap size. For example, if the window size is 3 hours and the gap size is 1 hour, then 2 hours will overlap on each data slice. To demonstrate this example, generate data slices using these parameters.\\n\",\n    \"\\n\",\n    \"To start, create a label maker with the 3-hour window size.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lm = cp.LabelMaker(\\n\",\n    \"    target_dataframe_index=\\\"customer_id\\\",\\n\",\n    \"    time_index=\\\"transaction_time\\\",\\n\",\n    \"    labeling_function=total_spent,\\n\",\n    \"    window_size=\\\"3h\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Next, create a data slice generator with the 1-hour gap size.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"slices = lm.slice(\\n\",\n    \"    df.sort_values(\\\"transaction_time\\\"),\\n\",\n    \"    num_examples_per_instance=-1,\\n\",\n    \"    minimum_data=\\\"2014-01-01\\\",\\n\",\n    \"    gap=\\\"1h\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Overlap - Data Slice #1\\n\",\n    \"~~~~~~~~~~~~~~~~~~~~~~~\\n\",\n    \"The first data slice contains all of the customer’s transactions that occurred within the 3-hour window between :code:`2014-01-01 00:00:00` and :code:`2014-01-01 03:00:00`. The 1-hour gap spaces apart the cutoff time of this data slice at :code:`2014-01-01 00:00:00` from the cutoff time of the next data slice at :code:`2014-01-01 01:00:00`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ds = next(slices)\\n\",\n    \"print(ds.context)\\n\",\n    \"ds\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Apply our labeling function for the total spent on this data slice.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"total_spent(ds)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Overlap - Data Slice #2\\n\",\n    \"~~~~~~~~~~~~~~~~~~~~~~~\\n\",\n    \"In the second data slice, there is a 2-hour overlap on the transactions that occurred between :code:`2014-01-01 01:00:00` and :code:`2014-01-01 03:00:00`. By adjusting the gap size, you can set the precise amount of overlap in the data slices. That is useful for generating labels with specific overlap.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ds = next(slices)\\n\",\n    \"print(ds.context)\\n\",\n    \"ds\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Apply our labeling function for the total spent on this data slice.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"total_spent(ds)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Spread Out\\n\",\n    \"----------\\n\",\n    \"When the the gap size is greater than the window size, there is data in-between data slices that is skipped. You can use this for labeling data at specific intervals of time. The amount of data skipped is the difference between the gap and window size. For example, if the gap size is 3 hours and the window size is 1 hour, then 2 hours of data will be skipped in-between data slices. To demonstrate this example, generate data slices using these parameters.\\n\",\n    \"\\n\",\n    \"To start, create a label maker with the 1-hour window size.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lm = cp.LabelMaker(\\n\",\n    \"    target_dataframe_index=\\\"customer_id\\\",\\n\",\n    \"    time_index=\\\"transaction_time\\\",\\n\",\n    \"    labeling_function=total_spent,\\n\",\n    \"    window_size=\\\"1h\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Next, create a data slice generator with the 3-hour gap size.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"slices = lm.slice(\\n\",\n    \"    df.sort_values(\\\"transaction_time\\\"),\\n\",\n    \"    num_examples_per_instance=-1,\\n\",\n    \"    minimum_data=\\\"2014-01-01\\\",\\n\",\n    \"    gap=\\\"3h\\\",\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Spread Out - Data Slice #1\\n\",\n    \"~~~~~~~~~~~~~~~~~~~~~~~~~~\\n\",\n    \"The first data slice contains all of the customer’s transactions that occurred within the 1-hour window between :code:`2014-01-01 00:00:00` and :code:`2014-01-01 01:00:00`. The 3-hour gap spaces apart the cutoff time of this data slice at :code:`2014-01-01 00:00:00` from the cutoff time of the next data slice at :code:`2014-01-01 03:00:00`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ds = next(slices)\\n\",\n    \"print(ds.context)\\n\",\n    \"ds\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Apply our labeling function for the total spent on this data slice.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"total_spent(ds)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Spread Out - Data Slice #2\\n\",\n    \"~~~~~~~~~~~~~~~~~~~~~~~~~~\\n\",\n    \"In the second data slice, you can see that 2 hours of transactions were skipped between :code:`2014-01-01 01:00:00` and :code:`2014-01-01 03:00:00`. By adjusting the gap size, you can set the precise amount of data to skip in-between data slices. That is useful for generating labels that target specific portions of a dataset.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ds = next(slices)\\n\",\n    \"print(ds.context)\\n\",\n    \"ds\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Apply the labeling function for the total spent on this data slice.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"total_spent(ds)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \".. _data-slice-context:\\n\",\n    \"\\n\",\n    \"Data Slice Context\\n\",\n    \"==================\\n\",\n    \"Each data slice has a :code:`context` attribute to access its metadata. That is useful for integrating the context with the logic in the labeling function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"vars(ds.context)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"celltoolbar\": \"Raw Cell Format\",\n  \"jupytext\": {\n   \"cell_metadata_filter\": \"-all\",\n   \"notebook_metadata_filter\": \"-all\"\n  },\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.8.5\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "docs/source/user_guide/using_label_transforms.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \".. currentmodule:: composeml\\n\",\n    \"\\n\",\n    \"======================\\n\",\n    \"Using Label Transforms\\n\",\n    \"======================\\n\",\n    \"\\n\",\n    \"In this guide, you learn how to use the transforms that are available on :class:`LabelTimes`. Each transform returns a copy of the label times. This is useful for trying out multiple transforms in different settings without having to recalculate the labels. As a result, you can see which labels give a better performance in less time.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Generate Labels\\n\",\n    \"===============\\n\",\n    \"\\n\",\n    \"Start by generating labels on a mock dataset of transactions. Each label is defined as the total spent by a customer given one hour of transactions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import composeml as cp\\n\",\n    \"import pandas as pd\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def total_spent(df):\\n\",\n    \"    return df[\\\"amount\\\"].sum()\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"label_maker = cp.LabelMaker(\\n\",\n    \"    labeling_function=total_spent,\\n\",\n    \"    target_dataframe_index=\\\"customer_id\\\",\\n\",\n    \"    time_index=\\\"transaction_time\\\",\\n\",\n    \"    window_size=\\\"1h\\\",\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"labels = label_maker.search(\\n\",\n    \"    cp.demos.load_transactions(),\\n\",\n    \"    num_examples_per_instance=10,\\n\",\n    \"    minimum_data=pd.Timedelta(\\\"2h\\\"),\\n\",\n    \"    gap=\\\"2min\\\",\\n\",\n    \"    verbose=True,\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"To get an idea on how the labels looks, preview the data frame.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Threshold on Labels\\n\",\n    \"===================\\n\",\n    \"\\n\",\n    \":meth:`LabelTimes.threshold` creates binary labels by testing if label values are above a threshold. In this example, a threshold is applied to determine which customers spent over 100.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels.threshold(100).head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Lead Labels Times\\n\",\n    \"=================\\n\",\n    \"\\n\",\n    \":meth:`LabelTimes.apply_lead` shifts the label time to an earlier moment. This is useful for training a model to predict in advance. In this example, a one hour lead is applied to the label times.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels.apply_lead(\\\"1h\\\").head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Bin Labels\\n\",\n    \"==========\\n\",\n    \"\\n\",\n    \":meth:`LabelTimes.bin` bins the labels into discrete intervals. There are two types of bins. Bins could either be based on values or quantiles. Additionally, the widths of the bins could either be defined by the user or divided equally.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Value Based\\n\",\n    \"-----------\\n\",\n    \"\\n\",\n    \"To use bins based on values, :code:`quantiles` should be set to :code:`False`, the default value.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Equal Width\\n\",\n    \"~~~~~~~~~~~\\n\",\n    \"\\n\",\n    \"To group values into bins of equal width, set bins as a scalar value. In this example, total_spent is grouped into bins of equal width.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels.bin(4, quantiles=False).head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Custom Widths\\n\",\n    \"~~~~~~~~~~~~~\\n\",\n    \"\\n\",\n    \"To group values into bins of custom widths, set bins as an array of values to define edges. In this example, total_spent is grouped into bins of custom widths.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"inf = float(\\\"inf\\\")\\n\",\n    \"edges = [-inf, 34, 50, 67, inf]\\n\",\n    \"labels.bin(\\n\",\n    \"    edges,\\n\",\n    \"    quantiles=False,\\n\",\n    \").head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Quantile Based\\n\",\n    \"--------------\\n\",\n    \"\\n\",\n    \"To use bins based on quantiles, :code:`quantiles` should be set to :code:`True`.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Equal Width\\n\",\n    \"~~~~~~~~~~~\\n\",\n    \"\\n\",\n    \"To group values into quantile bins of equal width, set bins to the number of quantiles as a scalar value (for example, 4 for quartiles, 10 for deciles, etc.). In this example, the total spent is grouped into bins based on the quartiles.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels.bin(4, quantiles=True).head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"To verify quartile values, check the descriptive statistics.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"stats = labels.total_spent.describe()\\n\",\n    \"stats = stats.round(3).to_string()\\n\",\n    \"print(stats)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Custom Widths\\n\",\n    \"~~~~~~~~~~~~~\\n\",\n    \"\\n\",\n    \"To group values into quantile bins of custom widths, set bins as an array of quantiles. In this example, the total spent is grouped into quantile bins of custom widths.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"quantiles = [0, 0.34, 0.5, 0.67, 1]\\n\",\n    \"labels.bin(quantiles, quantiles=True).head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Label Bins\\n\",\n    \"----------\\n\",\n    \"\\n\",\n    \"To assign bins with custom labels, set :code:`labels` to the array of values. The number of labels need to match the number of bins. In this example, the total spent is grouped into bins with custom labels.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"values = [\\\"low\\\", \\\"medium\\\", \\\"high\\\"]\\n\",\n    \"labels.bin(3, labels=values).head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Describe Labels\\n\",\n    \"===============\\n\",\n    \"\\n\",\n    \":meth:`LabelTimes.describe` prints out the distribution with the settings and transforms that you've used to make the labels. This is useful as a reference for understanding how the labels were generated from raw data. Also, the label distribution is helpful for determining if we have imbalanced labels. In this example, a description of the labels is printed after transforming the labels into discrete values.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels.threshold(100).describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Sample Labels\\n\",\n    \"=============\\n\",\n    \"\\n\",\n    \":meth:`LabelTimes.sample` samples the labels based on a number or fraction. Samples can be reproduced by fixing :code:`random_state` to an integer.\\n\",\n    \"\\n\",\n    \"To sample 10 labels, :code:`n` is set to 10.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels.sample(n=10, random_state=0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Similarly, to sample 10% of labels, :code:`frac` is set to 10%.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels.sample(frac=0.1, random_state=0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Categorical Labels\\n\",\n    \"------------------\\n\",\n    \"\\n\",\n    \"When working with categorical labels, the number or fraction of labels for each category can be sampled by using a dictionary. Bin the labels into 4 bins to make categorical.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"categorical = labels.bin(4, labels=[\\\"A\\\", \\\"B\\\", \\\"C\\\", \\\"D\\\"])\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"To sample 2 labels per category, map each category to the number 2.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"n = {\\\"A\\\": 2, \\\"B\\\": 2, \\\"C\\\": 2, \\\"D\\\": 2}\\n\",\n    \"categorical.sample(n=n, random_state=0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\": [\n    \"Similarly, to sample 10% of labels per category, map each category to 10%.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"frac = {\\\"A\\\": 0.1, \\\"B\\\": 0.1, \\\"C\\\": 0.1, \\\"D\\\": 0.1}\\n\",\n    \"categorical.sample(frac=frac, random_state=0)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"celltoolbar\": \"Raw Cell Format\",\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.8.5\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "docs/source/user_guide.rst",
    "content": "==========\nUser Guide\n==========\n\nUse these guides to learn how to use label transformations and generate better training examples.\n\n.. toctree::\n    :glob:\n    :maxdepth: 1\n\n    user_guide/controlling_cutoff_times\n    user_guide/using_label_transforms\n    user_guide/data_slice_generator\n\n|\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[project]\nname = \"composeml\"\nreadme = \"README.md\"\ndescription = \"a framework for automated prediction engineering\"\ndynamic = [\"version\"]\nclassifiers = [\n    \"Development Status :: 5 - Production/Stable\",\n    \"Intended Audience :: Science/Research\",\n    \"Intended Audience :: Developers\",\n    \"Topic :: Software Development\",\n    \"Topic :: Scientific/Engineering\",\n    \"Programming Language :: Python\",\n    \"Programming Language :: Python :: 3\",\n    \"Programming Language :: Python :: 3.8\",\n    \"Programming Language :: Python :: 3.9\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Operating System :: OS Independent\",\n]\nauthors = [\n    {name=\"Alteryx, Inc.\", email=\"open_source_support@alteryx.com\"}\n]\nmaintainers = [\n    {name=\"Alteryx, Inc.\", email=\"open_source_support@alteryx.com\"}\n]\nkeywords = [\"prediction engineering\", \"data science\", \"machine learning\"]\nlicense = {text = \"BSD 3-clause\"}\nrequires-python = \">=3.8,<4\"\ndependencies = [\n    \"pandas >= 2.0.0\",\n    \"tqdm >= 4.32.0\",\n    \"matplotlib >= 3.3.3\",\n    \"seaborn >= 0.12.2\",\n]\n\n[project.urls]\n\"Documentation\" = \"https://compose.alteryx.com\"\n\"Source Code\"= \"https://github.com/alteryx/compose/\"\n\"Changes\" = \"https://compose.alteryx.com/en/latest/release_notes.html\"\n\"Issue Tracker\" = \"https://github.com/alteryx/compose/issues\"\n\"Twitter\" = \"https://twitter.com/alteryxoss\"\n\"Chat\" = \"https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA\"\n\n[project.optional-dependencies]\ntest = [\n    \"pip >= 21.3.1\",\n    \"pytest >= 7.1.2\",\n    \"pytest-cov >= 3.0.0\",\n    \"pytest-xdist >= 2.5.0\",\n    \"wheel >= 0.33.1\",\n    \"featuretools >= 1.27.0\",\n    \"woodwork >= 0.25.1\",\n    \"pyarrow >= 7.0.0\",\n]\nupdater = [\n    \"alteryx-open-src-update-checker >= 2.1.0\"\n]\ndocs = [\n    \"evalml >= 0.45.0\",\n    \"dask[distributed]\"\n]\ndev = [\n    \"ruff >= 0.0.231\",\n    \"pre-commit >= 2.20.0\",\n    \"black[jupyter] == 22.10.0\",\n    \"nbsphinx == 0.8.7\",\n    \"pydata-sphinx-theme == 0.7.1\",\n    \"Sphinx == 4.2.0\",\n    \"sphinx-inline-tabs == 2022.1.2b11\",\n    \"sphinx-copybutton == 0.4.0\",\n    \"myst-parser == 0.16.1\",\n    \"nbconvert == 6.4.5\",\n    \"ipython == 7.31.1\",\n    \"pygments == 2.10.0\",\n    \"jupyter == 1.0.0\",\n    \"pandoc == 1.1.0\",\n    \"ipykernel == 6.4.2\",\n    \"scikit-learn >= 0.20.0, !=0.22, <1.2.0\",\n]\ncomplete = [\n    \"composeml[updater]\",\n]\n\n[tool.setuptools]\ninclude-package-data = true\nlicense-files = [\n    \"LICENSE\",\n]\n\n[tool.setuptools.packages.find]\nnamespaces = true\n\n[tool.setuptools.package-data]\n\"*\" = [\n    \"*.txt\",\n    \"README.md\",\n]\n\"composeml.demos\" = [\n    \"*.csv\",\n]\n\n[tool.setuptools.exclude-package-data]\n\"*\" = [\n    \"* __pycache__\",\n    \"*.py[co]\",\n    \"docs/*\"\n]\n\n[tool.setuptools.dynamic]\nversion = {attr = \"composeml.version.__version__\"}\n\n[tool.pytest.ini_options]\naddopts = \"--doctest-modules\"\ntestpaths = [\n    \"composeml/tests/*\"\n]\nfilterwarnings = [\n    \"ignore::DeprecationWarning\",\n    \"ignore::PendingDeprecationWarning\"\n]\n\n[tool.ruff]\nline-length = 88\nignore = [\"E501\"]\nselect = [\n    # Pyflakes\n    \"F\",\n    # Pycodestyle\n    \"E\",\n    \"W\",\n    # isort\n    \"I001\"\n]\nsrc = [\"composeml\"]\n\n[tool.ruff.per-file-ignores]\n\"__init__.py\" = [\"E402\", \"F401\", \"I001\", \"E501\"]\n\n[tool.coverage.run]\nsource = [\"composeml\"]\n\n[tool.coverage.report]\nexclude_lines =[\n    \"pragma: no cover\",\n    \"def __repr__\",\n    \"raise AssertionError\",\n    \"raise NotImplementedError\",\n    \"if __name__ == .__main__.:\",\n    \"if self._verbose:\",\n    \"if verbose:\",\n    \"if profile:\",\n    \"pytest.skip\"\n]\n[build-system]\nrequires = [\n    \"setuptools >= 61.0.0\",\n    \"wheel\"\n]\nbuild-backend = \"setuptools.build_meta\"\n"
  },
  {
    "path": "release.md",
    "content": "# Release Process\n## Prerequisites\nThe environment variables `PYPI_USERNAME` and `PYPI_PASSWORD` must be already set in the repository as secrets. To add these variables, go to Secrets in the Settings of the repository.\n\n## Create Release Branch\n1. Branch off of main and name the branch the release version number (e.g. `release_v0.1.2`)\n2. Bump version number in `composeml/version.py`, and `composeml/tests/test_version.py`.\n\n## Create Release PR\nA release PR should have the version number as the title and the changelog updates as the PR body text. The contributors line is not necessary.\n\n## Create GitHub Release\nAfter the release pull request has been merged into the main branch, it is time draft the github release.\n* The target should be the main branch\n* The tag should be the version number with a v prefix (e.g. v0.1.2)\n* Release title is the same as the tag\n* Release description should be the full changelog updates for the release, including the line thanking contributors.\n\n## Release on PyPI\nAfter publishing the release on GitHub, a GitHub Action will automatically upload the package to PyPI."
  }
]