Repository: alteryx/compose Branch: main Commit: 87953ceaab69 Files: 96 Total size: 740.1 KB Directory structure: gitextract_0qfvetgz/ ├── .codecov.yml ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── blank_issue.md │ │ ├── bug_report.md │ │ ├── config.yml │ │ ├── documentation_improvement.md │ │ └── feature_request.md │ ├── auto_assign.yml │ └── workflows/ │ ├── auto_approve_dependency_PRs.yml │ ├── build_docs.yml │ ├── create_feedstock_pr.yaml │ ├── install_test.yml │ ├── latest_dependency_checker.yml │ ├── lint_check.yml │ ├── release.yml │ ├── release_notes_updated.yml │ └── unit_tests_with_latest_deps.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .readthedocs.yaml ├── LICENSE ├── Makefile ├── README.md ├── composeml/ │ ├── __init__.py │ ├── conftest.py │ ├── data_slice/ │ │ ├── __init__.py │ │ ├── extension.py │ │ ├── generator.py │ │ └── offset.py │ ├── demos/ │ │ ├── __init__.py │ │ └── transactions.csv │ ├── label_maker.py │ ├── label_search.py │ ├── label_times/ │ │ ├── __init__.py │ │ ├── description.py │ │ ├── deserialize.py │ │ ├── object.py │ │ └── plots.py │ ├── tests/ │ │ ├── __init__.py │ │ ├── requirement_files/ │ │ │ ├── latest_core_dependencies.txt │ │ │ ├── minimum_core_requirements.txt │ │ │ └── minimum_test_requirements.txt │ │ ├── test_data_slice/ │ │ │ ├── __init__.py │ │ │ ├── test_extension.py │ │ │ └── test_offset.py │ │ ├── test_datasets.py │ │ ├── test_featuretools.py │ │ ├── test_label_maker.py │ │ ├── test_label_plots.py │ │ ├── test_label_serialization.py │ │ ├── test_label_times.py │ │ ├── test_label_transforms/ │ │ │ ├── __init__.py │ │ │ ├── test_bin.py │ │ │ ├── test_lead.py │ │ │ ├── test_sample.py │ │ │ └── test_threshold.py │ │ ├── test_version.py │ │ └── utils.py │ ├── update_checker.py │ └── version.py ├── contributing.md ├── docs/ │ ├── Makefile │ ├── make.bat │ └── source/ │ ├── _static/ │ │ └── style.css │ ├── _templates/ │ │ ├── class.rst │ │ └── layout.html │ ├── api_reference.rst │ ├── conf.py │ ├── examples/ │ │ ├── demo/ │ │ │ ├── __init__.py │ │ │ ├── chicago_bike/ │ │ │ │ ├── __init__.py │ │ │ │ └── sample.csv │ │ │ ├── next_purchase/ │ │ │ │ ├── __init__.py │ │ │ │ └── sample.csv │ │ │ ├── turbofan_degredation/ │ │ │ │ ├── __init__.py │ │ │ │ └── sample.csv │ │ │ └── utils.py │ │ ├── predict_bike_trips.ipynb │ │ ├── predict_next_purchase.ipynb │ │ └── predict_turbofan_degredation.ipynb │ ├── images/ │ │ ├── innovation_labs.xml │ │ ├── label-maker.xml │ │ ├── labeling-function.xml │ │ └── workflow.xml │ ├── index.rst │ ├── install.md │ ├── release_notes.rst │ ├── resources/ │ │ ├── faq.ipynb │ │ └── help.rst │ ├── resources.rst │ ├── start.ipynb │ ├── tutorials.rst │ ├── user_guide/ │ │ ├── controlling_cutoff_times.ipynb │ │ ├── data_slice_generator.ipynb │ │ └── using_label_transforms.ipynb │ └── user_guide.rst ├── pyproject.toml └── release.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .codecov.yml ================================================ codecov: notify: require_ci_to_pass: yes comment: layout: "diff, files" coverage: precision: 2 round: down range: 90..100 status: project: default: target: 100% patch: default: target: 100% changes: no ignore: - "composeml/update_checker.py" ================================================ FILE: .github/ISSUE_TEMPLATE/blank_issue.md ================================================ --- name: Blank Issue about: Create a blank issue title: '' labels: '' assignees: '' --- ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug Report about: Create a bug report to help us improve Compose title: '' labels: 'bug' assignees: '' --- [A clear and concise description of what the bug is.] #### Code Sample, a copy-pastable example to reproduce your bug. ```python # Your code here ``` ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: true contact_links: - name: General Technical Question about: "If you have a question like *How should I create my label times?* you can ask on StackOverflow using the #compose-ml tag." url: https://stackoverflow.com/questions/tagged/compose-ml - name: Real-time chat url: https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA about: "If you want to meet others in the community and chat about all things Alteryx OSS then check out our Slack." ================================================ FILE: .github/ISSUE_TEMPLATE/documentation_improvement.md ================================================ --- name: Documentation Improvement about: Suggest an idea for improving the documentation title: '' labels: 'documentation' assignees: '' --- [a description of what documentation you believe needs to be fixed/improved] ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature Request about: Suggest an idea for this project title: '' labels: 'new feature' assignees: '' --- - As a [user/developer], I wish I could use Compose to ... #### Code Example ```python # Your code here, if applicable ``` ================================================ FILE: .github/auto_assign.yml ================================================ # Set to author to set pr creator as assignee addAssignees: author ================================================ FILE: .github/workflows/auto_approve_dependency_PRs.yml ================================================ name: Auto Approve Dependency PRs on: schedule: - cron: '*/30 * * * *' workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - name: Find dependency PRs id: find_prs run: | gh auth status 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 dep_pull_request=$(cat dep_PRs_waiting_approval.json | grep -Eo "[0-9]*") echo ::set-output name=dep_pull_request::${dep_pull_request} env: GITHUB_TOKEN: ${{ secrets.AUTO_APPROVE_TOKEN }} - name: Approve dependency PRs and enable auto-merge if: ${{ steps.find_prs.outputs.dep_pull_request > 1 }} run: | gh pr review --repo "${{ github.repository }}" --comment --body "auto approve" ${{ steps.find_prs.outputs.dep_pull_request }} gh pr review --repo "${{ github.repository }}" --approve ${{ steps.find_prs.outputs.dep_pull_request }} gh pr merge --repo "${{ github.repository }}" --auto --squash --delete-branch ${{ steps.find_prs.outputs.dep_pull_request }} env: GITHUB_TOKEN: ${{ secrets.AUTO_APPROVE_TOKEN }} ================================================ FILE: .github/workflows/build_docs.yml ================================================ on: pull_request: types: [opened, synchronize] push: branches: - main name: Build Docs jobs: doc_tests: name: Doc Tests / Python 3.8 runs-on: ubuntu-latest steps: - name: Set up Python 3.8 uses: actions/setup-python@v4 with: python-version: 3.8 - name: Checkout repository uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} - name: Build source distribution run: make package - name: Install package with doc requirements run: | python -m pip config --site set global.progress_bar off python -m pip install unpacked_sdist/ python -m pip install unpacked_sdist/[dev] python -m pip install unpacked_sdist/[docs] python -m pip check sudo apt install -q -y pandoc sudo apt install -q -y graphviz - name: Run doc tests run: make -C docs/ -e "SPHINXOPTS=-W" clean html ================================================ FILE: .github/workflows/create_feedstock_pr.yaml ================================================ name: Create Feedstock PR on: workflow_dispatch: inputs: version: description: 'released PyPI version to use (ex - v1.11.1)' required: true jobs: create_feedstock_pr: name: Create Feedstock PR runs-on: ubuntu-latest steps: - name: Checkout inputted version uses: actions/checkout@v3 with: repository: ${{ github.event.pull_request.head.repo.full_name }} ref: ${{ github.event.inputs.version }} path: "./compose" - name: Pull latest from upstream for user forked feedstock run: | gh auth status gh repo sync alteryx/composeml-feedstock --branch main --source conda-forge/composeml-feedstock --force env: GITHUB_TOKEN: ${{ secrets.AUTO_APPROVE_TOKEN }} - uses: actions/checkout@v3 with: repository: alteryx/composeml-feedstock ref: main path: "./composeml-feedstock" fetch-depth: '0' - name: Run Create Feedstock meta YAML id: create-feedstock-meta uses: alteryx/create-feedstock-meta-yaml@v4 with: project: "composeml" pypi_version: ${{ github.event.inputs.version }} project_metadata_filepath: "compose/pyproject.toml" meta_yaml_filepath: "composeml-feedstock/recipe/meta.yaml" - name: View updated meta yaml run: cat composeml-feedstock/recipe/meta.yaml - name: Push updated yaml run: | cd composeml-feedstock git config --unset-all http.https://github.com/.extraheader git config --global user.email "machineOSS@alteryx.com" git config --global user.name "machineAYX Bot" git remote set-url origin https://${{ secrets.AUTO_APPROVE_TOKEN }}@github.com/alteryx/composeml-feedstock git checkout -b ${{ github.event.inputs.version }} git add recipe/meta.yaml git commit -m "${{ github.event.inputs.version }}" git push origin ${{ github.event.inputs.version }} - name: Adding URL to job output run: | echo "Conda Feedstock Pull Request: https://github.com/alteryx/composeml-feedstock/pull/new/${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY ================================================ FILE: .github/workflows/install_test.yml ================================================ on: pull_request: types: [opened, synchronize] push: branches: - main name: Install Test jobs: install_cm_complete: name: ${{ matrix.os }} - ${{ matrix.python_version }} install compose strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] python_version: ["3.8", "3.9", "3.10", "3.11"] runs-on: ${{ matrix.os }} steps: - name: Set up python ${{ matrix.python_version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python_version }} - name: Checkout repository uses: actions/checkout@v3 - name: Build compose package run: make package - name: Install compose complete from sdist run: | pip config --site set global.progress_bar off python -m pip install "unpacked_sdist/[complete]" - name: Test by importing packages run: | python -c "import alteryx_open_src_update_checker" env: ALTERYX_OPEN_SRC_UPDATE_CHECKER: False - name: Check package conflicts run: | python -m pip check ================================================ FILE: .github/workflows/latest_dependency_checker.yml ================================================ # This workflow will install dependenies and if any critical dependencies have changed a pull request # will be created which will trigger a CI run with the new dependencies. name: Latest Dependency Checker on: workflow_dispatch: schedule: - cron: '0 * * * *' jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python 3.8 uses: actions/setup-python@v4 with: python-version: '3.8.x' - name: Install pip and virtualenv run: | python -m pip install --upgrade pip python -m pip install virtualenv - name: Update latest core dependencies run: | python -m virtualenv venv_core source venv_core/bin/activate python -m pip install --upgrade pip python -m pip install .[test] make checkdeps OUTPUT_FILEPATH=composeml/tests/requirement_files/latest_core_dependencies.txt - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: token: ${{ secrets.REPO_SCOPED_TOKEN }} commit-message: Update latest dependencies title: Automated Latest Dependency Updates author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> body: "This is an auto-generated PR with **latest** dependency updates. Please do not delete the `latest-dep-update` branch because it's needed by the auto-dependency bot." branch: latest-dep-update branch-suffix: short-commit-hash base: main assignees: machineFL reviewers: machineAYX ================================================ FILE: .github/workflows/lint_check.yml ================================================ on: pull_request: types: [opened, synchronize] push: branches: - main name: Lint Check jobs: lint_test: name: ${{ matrix.python_version }} lint check runs-on: ubuntu-latest strategy: fail-fast: false matrix: python_version: ["3.11"] steps: - name: Set up python ${{ matrix.python_version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python_version }} - name: Checkout repository uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} - name: Build compose package run: make package - name: Install compose with dev, and test requirements run: | pip config --site set global.progress_bar off python -m pip install --upgrade pip python -m pip install .[dev] - name: Run lint test run: make lint ================================================ FILE: .github/workflows/release.yml ================================================ on: release: types: [published] name: Release jobs: pypi: name: Release to PyPI runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Remove docs and tests before release run: | rm -rf docs/ - name: Upload to PyPI uses: FeatureLabs/gh-action-pypi-upload@v2 env: PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} PYPI_USERNAME: ${{ secrets.PYPI_USERNAME }} TEST_PYPI_USERNAME: ${{ secrets.TEST_PYPI_USERNAME }} TEST_PYPI_PASSWORD: ${{ secrets.TEST_PYPI_PASSWORD }} ================================================ FILE: .github/workflows/release_notes_updated.yml ================================================ name: Release Notes Updated on: pull_request: types: [opened, synchronize] jobs: release_notes_updated: name: release notes updated runs-on: ubuntu-latest steps: - name: Check for development branch id: branch shell: python run: | from re import compile main = '^main$' release = '^release_v\d+\.\d+\.\d+$' dep_update = '^latest-dep-update-[a-f0-9]{7}$' min_dep_update = '^min-dep-update-[a-f0-9]{7}$' regex = main, release, dep_update, min_dep_update patterns = list(map(compile, regex)) ref = "${{ github.event.pull_request.head.ref }}" is_dev = not any(pattern.match(ref) for pattern in patterns) print('::set-output name=is_dev::' + str(is_dev)) - name: Checkout repository if: ${{ steps.branch.outputs.is_dev == 'True' }} uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} - name: Check if release notes were updated if: ${{ steps.branch.outputs.is_dev == 'True' }} run: cat docs/source/release_notes.rst | grep ":pr:\`${{ github.event.number }}\`" ================================================ FILE: .github/workflows/unit_tests_with_latest_deps.yml ================================================ on: pull_request: types: [opened, synchronize] push: branches: - main name: Unit Tests - Latest Dependencies jobs: unit_tests: name: Unit Tests / Python ${{ matrix.python-version }} runs-on: ubuntu-latest strategy: matrix: python-version: ["3.8", "3.9", "3.10", "3.11"] steps: - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Checkout repository uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} - name: Build source distribution run: make package - name: Install package with test requirements run: | python -m pip config --site set global.progress_bar off python -m pip install --upgrade pip python -m pip install unpacked_sdist/[test] - if: ${{ matrix.python-version == 3.8 }} name: Run unit tests with code coverage run: | coverage erase cd unpacked_sdist/ pytest composeml/ -n auto --cov=composeml --cov-config=../pyproject.toml --cov-report=xml:../coverage.xml - if: ${{ matrix.python-version != 3.8 }} name: Run unit tests with no code coverage run: | cd unpacked_sdist/ pytest composeml/ -n auto - if: ${{ matrix.python-version == 3.8 }} name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true files: ${{ github.workspace }}/coverage.xml verbose: true ================================================ FILE: .gitignore ================================================ cb_model.json .DS_Store # IDE .vscode docs/source/examples/demo/*/download # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ docs/source/generated # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ ================================================ FILE: .pre-commit-config.yaml ================================================ exclude: | (?x) .html$|.csv$|.svg$|.md$|.txt$|.json$|.xml$|.pickle$|^.github/| (LICENSE.*|README.*) default_stages: [commit] repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: 'v4.3.0' hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/kynan/nbstripout rev: 0.5.0 hooks: - id: nbstripout entry: nbstripout language: python types: [jupyter] - repo: https://github.com/MarcoGorelli/absolufy-imports rev: 'v0.3.1' hooks: - id: absolufy-imports files: ^composeml/ - repo: https://github.com/asottile/add-trailing-comma rev: v2.2.3 hooks: - id: add-trailing-comma name: Add trailing comma - repo: https://github.com/python/black rev: 22.12.0 hooks: - id: black args: - --config=./pyproject.toml additional_dependencies: [".[jupyter]"] types_or: [python, jupyter] - repo: https://github.com/charliermarsh/ruff-pre-commit rev: 'v0.0.231' hooks: - id: ruff args: - --config=./pyproject.toml - --fix ================================================ FILE: .readthedocs.yaml ================================================ # .readthedocs.yml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/source/conf.py fail_on_warning: true # Optionally build your docs in additional formats such as PDF and ePub formats: [] # Optionally set the version of Python and requirements required to build your docs python: version: "3.8" install: - method: pip path: . extra_requirements: - dev - docs ================================================ FILE: LICENSE ================================================ BSD 3-Clause License Copyright (c) 2017, Feature Labs, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: Makefile ================================================ .PHONY: clean clean: find . -name '*.pyo' -delete find . -name '*.pyc' -delete find . -name __pycache__ -delete find . -name '*~' -delete find . -name '.coverage.*' -delete .PHONY: lint lint: black . --check --config=./pyproject.toml ruff . --config=./pyproject.toml .PHONY: lint-fix lint-fix: black . --config=./pyproject.toml ruff . --fix --config=./pyproject.toml .PHONY: test test: python -m pytest composeml/ -n auto .PHONY: testcoverage testcoverage: python -m pytest composeml/ --cov=composeml -n auto .PHONY: installdeps installdeps: upgradepip pip install -e ".[dev]" .PHONY: checkdeps checkdeps: $(eval allow_list='matplotlib|pandas|seaborn|woodwork|featuretools|evalml|tqdm') pip freeze | grep -v "alteryx/compose.git" | grep -E $(allow_list) > $(OUTPUT_FILEPATH) .PHONY: upgradepip upgradepip: python -m pip install --upgrade pip .PHONY: upgradebuild upgradebuild: python -m pip install --upgrade build .PHONY: upgradesetuptools upgradesetuptools: python -m pip install --upgrade setuptools .PHONY: package package: upgradepip upgradebuild upgradesetuptools python -m build $(eval PACKAGE=$(shell python -c 'import setuptools; setuptools.setup()' --version)) tar -zxvf "dist/composeml-${PACKAGE}.tar.gz" mv "composeml-${PACKAGE}" unpacked_sdist ================================================ FILE: README.md ================================================

Compose

"Build better training examples in a fraction of the time."

Tests ReadTheDocs PyPI Version StackOverflow PyPI Downloads


[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:

Compose


By 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. ## Installation Install with pip ``` python -m pip install composeml ``` or from the Conda-forge channel on [conda](https://anaconda.org/conda-forge/composeml): ``` conda install -c conda-forge composeml ``` ### Add-ons **Update checker** - Receive automatic notifications of new Compose releases ``` python -m pip install "composeml[update_checker]" ``` ## Example > Will a customer spend more than 300 in the next hour of transactions? In this example, we automatically generate new training examples from a historical dataset of transactions. ```python import composeml as cp df = cp.demos.load_transactions() df = df[df.columns[:7]] df.head() ```
transaction_id session_id transaction_time product_id amount customer_id device
298 1 2014-01-01 00:00:00 5 127.64 2 desktop
10 1 2014-01-01 00:09:45 5 57.39 2 desktop
495 1 2014-01-01 00:14:05 5 69.45 2 desktop
460 10 2014-01-01 02:33:50 5 123.19 2 tablet
302 10 2014-01-01 02:37:05 5 64.47 2 tablet
First, we represent the prediction problem with a labeling function and a label maker. ```python def total_spent(ds): return ds['amount'].sum() label_maker = cp.LabelMaker( target_dataframe_index="customer_id", time_index="transaction_time", labeling_function=total_spent, window_size="1h", ) ``` Then, we run a search to automatically generate the training examples. ```python label_times = label_maker.search( df.sort_values('transaction_time'), num_examples_per_instance=2, minimum_data='2014-01-01', drop_empty=False, verbose=False, ) label_times = label_times.threshold(300) label_times.head() ```
customer_id time total_spent
1 2014-01-01 00:00:00 True
1 2014-01-01 01:00:00 True
2 2014-01-01 00:00:00 False
2 2014-01-01 01:00:00 False
3 2014-01-01 00:00:00 False
We now have labels that are ready to use in [Featuretools](https://docs.featuretools.com/) to generate features. ## Support The 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: 1. For usage questions, use [Stack Overflow](https://stackoverflow.com/questions/tagged/compose-ml) with the `composeml` tag. 2. For bugs, issues, or feature requests start a Github [issue](https://github.com/alteryx/compose/issues/new). 3. For discussion regarding development on the core library, use [Slack](https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA). 4. For everything else, the core developers can be reached by email at open_source_support@alteryx.com ## Citing Compose Compose is built upon a newly defined part of the machine learning process — prediction engineering. If you use Compose, please consider citing this paper: James 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. BibTeX entry: ```bibtex @inproceedings{kanter2016label, title={Label, segment, featurize: a cross domain framework for prediction engineering}, author={Kanter, James Max and Gillespie, Owen and Veeramachaneni, Kalyan}, booktitle={2016 IEEE International Conference on Data Science and Advanced Analytics (DSAA)}, pages={430--439}, year={2016}, organization={IEEE} } ``` ## Acknowledgements The open source development has been supported in part by DARPA's Data driven discovery of models program (D3M). ## Alteryx **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.

Alteryx Open Source

================================================ FILE: composeml/__init__.py ================================================ # flake8:noqa from composeml.version import __version__ from composeml import demos, update_checker from composeml.label_maker import LabelMaker from composeml.label_times import LabelTimes, read_label_times ================================================ FILE: composeml/conftest.py ================================================ import pandas as pd import pytest from composeml import LabelTimes from composeml.tests.utils import read_csv @pytest.fixture(scope="session") def transactions(): df = read_csv( data=[ "time,amount,customer_id", "2019-01-01 08:00:00,1,0", "2019-01-01 08:30:00,1,0", "2019-01-01 09:00:00,1,1", "2019-01-01 09:30:00,1,1", "2019-01-01 10:00:00,1,1", "2019-01-01 10:30:00,1,2", "2019-01-01 11:00:00,1,2", "2019-01-01 11:30:00,1,2", "2019-01-01 12:00:00,1,2", "2019-01-01 12:30:00,1,3", ], ) return df @pytest.fixture(scope="session") def total_spent_fn(): def total_spent(df): value = df.amount.sum() return value return total_spent @pytest.fixture(scope="session") def unique_amounts_fn(): def unique_amounts(df): return df.amount.nunique() return unique_amounts @pytest.fixture def total_spent(): data = [ "customer_id,time,total_spent", "0,2019-01-01 08:00:00,9", "0,2019-01-01 08:30:00,8", "1,2019-01-01 09:00:00,7", "1,2019-01-01 09:30:00,6", "1,2019-01-01 10:00:00,5", "2,2019-01-01 10:30:00,4", "2,2019-01-01 11:00:00,3", "2,2019-01-01 11:30:00,2", "2,2019-01-01 12:00:00,1", "3,2019-01-01 12:30:00,0", ] data = read_csv(data, parse_dates=["time"]) kwargs = { "data": data, "target_columns": ["total_spent"], "target_dataframe_index": "customer_id", "search_settings": { "num_examples_per_instance": -1, }, } label_times = LabelTimes(**kwargs) return label_times @pytest.fixture def labels(): records = [ { "label_id": 0, "customer_id": 1, "time": "2014-01-01 00:45:00", "my_labeling_function": 226.92999999999998, }, { "label_id": 1, "customer_id": 1, "time": "2014-01-01 00:48:00", "my_labeling_function": 47.95, }, { "label_id": 2, "customer_id": 2, "time": "2014-01-01 00:01:00", "my_labeling_function": 283.46000000000004, }, { "label_id": 3, "customer_id": 2, "time": "2014-01-01 00:04:00", "my_labeling_function": 31.54, }, ] dtype = {"time": "datetime64[ns]"} values = pd.DataFrame(records).astype(dtype).set_index("label_id") values = values[["customer_id", "time", "my_labeling_function"]] values = LabelTimes( values, target_columns=["my_labeling_function"], target_dataframe_index="customer_id", ) return values @pytest.fixture(autouse=True) def add_labels(doctest_namespace, labels): doctest_namespace["labels"] = labels ================================================ FILE: composeml/data_slice/__init__.py ================================================ # flake8:noqa from composeml.data_slice.generator import DataSliceGenerator ================================================ FILE: composeml/data_slice/extension.py ================================================ import pandas as pd from composeml.data_slice.offset import DataSliceOffset, DataSliceStep class DataSliceContext: """Tracks contextual attributes about a data slice.""" def __init__( self, slice_number=0, slice_start=None, slice_stop=None, next_start=None, ): """Creates the data slice context. Args: slice_number (int): The latest count of data slices. slice_start (int or Timestamp): When the data slice starts. slice_stop (int or Timestamp): When the data slice stops. next_start (int or Timestamp): When the next data slice starts. """ self.next_start = next_start self.slice_stop = slice_stop self.slice_start = slice_start self.slice_number = slice_number def __repr__(self): """Represents the data slice context as a string.""" return self._series.fillna("").to_string() @property def _series(self): """Represents the data slice context as a pandas series.""" keys = reversed(list(vars(self))) attrs = {key: getattr(self, key) for key in keys} context = pd.Series(attrs, name="context") return context @property def count(self): """Alias for the data slice number.""" return self.slice_number @property def start(self): """Alias for the start point of a data slice.""" return self.slice_start @property def stop(self): """Alias for the stopping point of a data slice.""" return self.slice_stop class DataSliceFrame(pd.DataFrame): """Subclasses pandas data frame for data slice.""" _metadata = ["context"] @property def _constructor(self): return DataSliceFrame @property def ctx(self): """Alias for the data slice context.""" return self.context @pd.api.extensions.register_dataframe_accessor("slice") class DataSliceExtension: def __init__(self, df): self._df = df def __call__(self, size=None, start=None, stop=None, step=None, drop_empty=True): """Returns a data slice generator based on the data frame. Args: size (int or str): The size of each data slice. A string represents a timedelta or frequency. An integer represents the number of rows. The default value is the length of the data frame. start (int or str): Where to start the first data slice. stop (int or str): Where to stop generating data slices. step (int or str): The step size between data slices. The default value is the data slice size. drop_empty (bool): Whether to drop empty data slices. The default value is True. Returns: ds (generator): Returns a generator of data slices. """ self._check_index() offsets = self._check_offsets(size, start, stop, step) generator = self._apply(*offsets, drop_empty=drop_empty) return generator def __getitem__(self, offset): """Generates data slices from a slice object.""" if not isinstance(offset, slice): raise TypeError("must be a slice object") return self(size=offset.step, start=offset.start, stop=offset.stop) def _apply(self, size, start, stop, step, drop_empty=True): """Generates data slices based on the data frame.""" df = self._apply_start(self._df, start, step) if df.empty and drop_empty: return df df, slice_number = DataSliceFrame(df), 1 while start.value and start.value <= stop.value: if df.empty and drop_empty: break ds = self._apply_size(df, start, size) df = self._apply_step(df, start, step) if ds.empty and drop_empty: continue ds.context.next_start = start.value ds.context.slice_number = slice_number slice_number += 1 yield ds def _apply_size(self, df, start, size): """Returns a data slice calculated by the offsets.""" if size._is_offset_position: index = self._get_index(df, size.value) stop = index or self._last_index ds = df.iloc[: size.value] else: stop = start.value + size.value ds = df[:stop] # Pandas includes both endpoints when slicing by time. # This results in the right endpoint overlapping in consecutive data slices. # Resolved by making the right endpoint exclusive. # https://pandas.pydata.org/pandas-docs/version/0.19/gotchas.html#endpoints-are-inclusive if not ds.empty: overlap = ds.index == stop if overlap.any(): ds = ds[~overlap] ds.context = DataSliceContext(slice_start=start.value, slice_stop=stop) return ds def _apply_start(self, df, start, step): """Removes data before the index calculated by the offset.""" inplace = start.value == self._first_index if start._is_offset_position and not inplace: df = df.iloc[start.value :] first_index = df.first_valid_index() start.value = self._first_index = first_index if start._is_offset_timestamp and not inplace: df = df[df.index >= start.value] if step._is_offset_position: first_index = df.first_valid_index() start.value = self._first_index = first_index return df def _apply_step(self, df, start, step): """Strides the first index by the offset.""" if step._is_offset_position: df = df.iloc[step.value :] first_index = df.first_valid_index() start.value = first_index else: start.value += step.value df = df[start.value :] return df def _check_index(self): """Checks if index values are null or unsorted.""" null = self._df.index.isnull().any() assert not null, "index contains null values" assert self._is_sorted, "data frame must be sorted chronologically" self._first_index = self._df.first_valid_index() self._last_index = self._df.last_valid_index() def _check_offsets(self, size, start, stop, step): """Checks for valid data slice offsets.""" size = self._check_size(size or len(self._df)) start = self._check_start(start or self._first_index) stop = self._check_stop(stop or self._last_index) step = self._check_step(step or size) offsets = size, start, stop, step if any(offset._is_offset_frequency for offset in offsets): info = "offset by frequency requires a time index" assert self._is_time_index, info return offsets def _check_size(self, size): """Checks for valid offset size.""" if not isinstance(size, DataSliceStep): size = DataSliceStep(size) assert size._is_positive, "offset must be positive" return size def _check_start(self, start): """Checks for valid offset start.""" if not isinstance(start, DataSliceOffset): start = DataSliceOffset(start) if start._is_offset_frequency: start.value += self._first_index return start def _check_step(self, step): """Checks for valid offset step.""" if not isinstance(step, DataSliceStep): step = DataSliceStep(step) assert step._is_positive, "offset must be positive" return step def _check_stop(self, stop): """Checks for valid offset stop.""" if not isinstance(stop, DataSliceOffset): stop = DataSliceOffset(stop) if stop._is_offset_frequency: base = "first" if stop._is_positive else "last" value = getattr(self, f"_{base}_index") stop.value += value inplace = stop.value == self._last_index if stop._is_offset_position and not inplace: index = self._get_index(self._df, stop.value) stop.value = index or self._last_index return stop def _get_index(self, df, i): """Helper function for getting index values.""" if i < df.index.size and df.index.size > 0: return df.index[i] @property def _is_sorted(self): """Whether index values are sorted.""" return self._df.index.is_monotonic_increasing @property def _is_time_index(self): """Whether the data frame has a time index type.""" return pd.api.types.is_datetime64_any_dtype(self._df.index) ================================================ FILE: composeml/data_slice/generator.py ================================================ from composeml.data_slice.extension import DataSliceContext, DataSliceFrame class DataSliceGenerator: """Generates data slices for the lable maker.""" def __init__( self, window_size, gap=None, min_data=None, max_data=None, drop_empty=True, ): self.window_size = window_size self.gap = gap self.min_data = min_data self.max_data = max_data self.drop_empty = drop_empty def __call__(self, df): """Applies the data slice generator to the data frame.""" is_column = self.window_size in df method = "column" if is_column else "time" attr = f"_slice_by_{method}" return getattr(self, attr)(df) def _slice_by_column(self, df): """Slices the data frame by an existing column.""" slices = df.groupby(self.window_size, sort=False) slice_number = 1 for group, ds in slices: ds = DataSliceFrame(ds) ds.context = DataSliceContext( slice_number=slice_number, slice_start=ds.first_valid_index(), slice_stop=ds.last_valid_index(), ) setattr(ds.context, self.window_size, group) del ds.context.next_start slice_number += 1 yield ds def _slice_by_time(self, df): """Slices the data frame along the time index.""" data_slices = df.slice( size=self.window_size, start=self.min_data, stop=self.max_data, step=self.gap, drop_empty=self.drop_empty, ) for ds in data_slices: yield ds ================================================ FILE: composeml/data_slice/offset.py ================================================ import re import pandas as pd class DataSliceOffset: """Offsets for calculating data slice indices.""" def __init__(self, value): self.value = value self._check() def _check(self): """Checks if the value is a valid offset.""" if isinstance(self.value, str): self._parse_value() assert self._is_valid_offset, self._invalid_offset_error @property def _is_offset_base(self): """Whether offset is a base type.""" return issubclass(type(self.value), pd.tseries.offsets.BaseOffset) @property def _is_offset_position(self): """Whether offset is integer-location based.""" return pd.api.types.is_integer(self.value) @property def _is_offset_timedelta(self): """Whether offset is a timedelta.""" return isinstance(self.value, pd.Timedelta) @property def _is_offset_timestamp(self): """Whether offset is a timestamp.""" return isinstance(self.value, pd.Timestamp) @property def _is_offset_frequency(self): """Whether offset is a base type or timedelta.""" value = self._is_offset_base value |= self._is_offset_timedelta return value def __int__(self): """Typecasts offset value to an integer.""" if self._is_offset_position: return self.value elif self._is_offset_base: return self.value.n elif self._is_offset_timedelta: return self.value.value else: raise TypeError("offset must be position or frequency based") def __float__(self): """Typecasts offset value to a float.""" if self._is_offset_timestamp: return self.value.timestamp() else: raise TypeError("offset must be a timestamp") @property def _is_positive(self): """Whether the offset value is positive.""" timestamp = self._is_offset_timestamp numeric = float if timestamp else int return numeric(self) > 0 @property def _is_valid_offset(self): """Whether offset is a valid type.""" value = self._is_offset_position value |= self._is_offset_frequency value |= self._is_offset_timestamp return value @property def _invalid_offset_error(self): """Returns message for invalid offset.""" info = "offset must be position or time based\n\n" info += "\tFor information about offset aliases, visit the link below.\n" info += ( "\thttps://pandas.pydata.org/docs/user_guide/timeseries.html#offset-aliases" ) return info def _parse_offset_alias(self, alias): """Parses an alias to an offset.""" value = self._parse_offset_alias_phrase(alias) value = value or pd.tseries.frequencies.to_offset(alias) return value def _parse_offset_alias_phrase(self, value): """Parses an alias phrase to an offset.""" pattern = re.compile("until start of next (?P[a-z]+)") match = pattern.search(value.lower()) if match: match = match.groupdict() unit = match["unit"] if unit == "month": return pd.offsets.MonthBegin() if unit == "year": return pd.offsets.YearBegin() def _parse_value(self): """Parses the value to an offset.""" for parser in self._parsers: try: value = parser(self.value) if value is not None: self.value = value break except Exception: continue @property def _parsers(self): """Returns the value parsers.""" return pd.Timestamp, self._parse_offset_alias, pd.Timedelta class DataSliceStep(DataSliceOffset): @property def _is_valid_offset(self): """Whether offset is a valid type.""" value = self._is_offset_position value |= self._is_offset_frequency return value @property def _parsers(self): """Returns the value parsers.""" return self._parse_offset_alias, pd.Timedelta ================================================ FILE: composeml/demos/__init__.py ================================================ import os import pandas as pd DATA = os.path.join(os.path.dirname(__file__)) def load_transactions(): path = os.path.join(DATA, "transactions.csv") df = pd.read_csv(path, parse_dates=["transaction_time"]) return df ================================================ FILE: composeml/demos/transactions.csv ================================================ transaction_id,session_id,transaction_time,product_id,amount,customer_id,device,session_start,zip_code,join_date,date_of_birth,brand 298,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 10,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 495,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 460,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 302,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 212,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 440,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 405,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 180,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 220,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 253,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 340,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 301,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 346,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 161,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 420,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 468,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 281,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 270,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 453,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 74,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 207,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 122,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 40,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 377,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 206,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 94,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 84,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 256,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 292,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 490,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 154,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 73,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 240,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 297,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 391,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 461,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 44,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 327,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 48,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 442,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 285,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 225,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 254,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 465,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 487,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 117,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 196,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 226,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 288,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 494,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 380,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 236,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 87,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 109,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 275,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 101,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 80,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 163,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 293,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 103,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 488,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 413,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 191,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 372,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 387,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 287,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 190,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 7,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 19,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 392,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 398,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 152,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 221,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 403,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 368,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 334,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 333,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 339,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 43,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 199,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 355,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 352,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 182,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 177,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 259,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 274,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 214,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 441,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 146,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 483,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 159,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 186,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 378,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 110,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 497,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 467,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 267,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 493,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 338,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 ================================================ FILE: composeml/label_maker.py ================================================ from sys import stdout from pandas import Series from pandas.api.types import is_categorical_dtype from tqdm import tqdm from composeml.data_slice import DataSliceGenerator from composeml.label_search import ExampleSearch, LabelSearch from composeml.label_times import LabelTimes class LabelMaker: """Automatically makes labels for prediction problems.""" def __init__( self, target_dataframe_index, time_index, labeling_function=None, window_size=None, ): """Creates an instance of label maker. Args: target_dataframe_index (str): The index of the target dataframe, from which labels will be created. time_index (str): Name of time column in the data frame. labeling_function (function or list(function) or dict(str=function)): Function, list of functions, or dictionary of functions that transform a data slice. When set as a dictionary, the key is used as the name of the labeling function. 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. As an integer, the value can be the number of rows. Default value is all future data. """ self.labeling_function = labeling_function or {} self.target_dataframe_index = target_dataframe_index self.time_index = time_index self.window_size = window_size def _name_labeling_function(self, function): """Gets the names of the labeling functions.""" has_name = hasattr(function, "__name__") return function.__name__ if has_name else type(function).__name__ def _check_labeling_function(self, function, name=None): """Checks whether the labeling function is callable.""" assert callable(function), "labeling function must be callabe" return function @property def labeling_function(self): """Gets the labeling function(s).""" return self._labeling_function @labeling_function.setter def labeling_function(self, value): """Sets and formats the intial labeling function(s). Args: value (function or list(function) or dict(str=function)): Function that transforms a data slice to a label. """ if isinstance(value, dict): for name, function in value.items(): self._check_labeling_function(function) assert isinstance(name, str), "labeling function name must be string" if callable(value): value = [value] if isinstance(value, (tuple, list)): value = { self._name_labeling_function(function): self._check_labeling_function( function, ) for function in value } assert isinstance(value, dict), "value type for labeling function not supported" self._labeling_function = value def _check_cutoff_time(self, value): if isinstance(value, Series): if value.index.is_unique: return value.to_dict() else: raise ValueError("more than one cutoff time exists for a target group") else: return value def slice( self, df, num_examples_per_instance, minimum_data=None, maximum_data=None, gap=None, drop_empty=True, ): """Generates data slices of target dataframe. Args: df (DataFrame): Data frame to create slices on. num_examples_per_instance (int): Number of examples per unique instance of target dataframe. 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. 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 the first cutoff time. The value can also be an integer to denote the number of rows needed before the first cutoff time. 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. maximum_data (str): Maximum data before stopping the search. Default value is last time of index. gap (str or int): Time between examples. Default value is window size. If an integer, search will start on the first event after the minimum data. drop_empty (bool): Whether to drop empty slices. Default value is True. Returns: ds (generator): Returns a generator of data slices. """ self._check_example_count(num_examples_per_instance, gap) df = self.set_index(df) target_groups = df.groupby(self.target_dataframe_index) num_examples_per_instance = ExampleSearch._check_number( num_examples_per_instance, ) minimum_data = self._check_cutoff_time(minimum_data) minimum_data_varies = isinstance(minimum_data, dict) for group_key, df in target_groups: if minimum_data_varies: if group_key not in minimum_data: continue min_data_for_group = minimum_data[group_key] else: min_data_for_group = minimum_data generator = DataSliceGenerator( window_size=self.window_size, min_data=min_data_for_group, max_data=maximum_data, drop_empty=drop_empty, gap=gap, ) for ds in generator(df): setattr(ds.context, self.target_dataframe_index, group_key) yield ds if ds.context.slice_number >= num_examples_per_instance: break @property def _bar_format(self): """Template to format the progress bar during a label search.""" value = "Elapsed: {elapsed} | " value += "Remaining: {remaining} | " value += "Progress: {l_bar}{bar}| " value += self.target_dataframe_index + ": {n}/{total} " return value def _check_example_count(self, num_examples_per_instance, gap): """Checks whether example count corresponds to data slices.""" if self.window_size is None and gap is None: more_than_one = num_examples_per_instance > 1 assert ( not more_than_one ), "must specify gap if num_examples > 1 and window size = none" def search( self, df, num_examples_per_instance, minimum_data=None, maximum_data=None, gap=None, drop_empty=True, verbose=True, *args, **kwargs, ): """Searches the data to calculates labels. Args: df (DataFrame): Data frame to search and extract labels. num_examples_per_instance (int or dict): The expected number of examples to return from each dataframe group. A dictionary can be used to further specify the expected number of examples to return from each label. 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. 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 the first cutoff time. The value can also be an integer to denote the number of rows needed before the first cutoff time. 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. maximum_data (str): Maximum data before stopping the search. Defaults to the last value in the time index. gap (str or int): Time between examples. Default value is window size. If an integer, search will start on the first event after the minimum data. drop_empty (bool): Whether to drop empty slices. Default value is True. verbose (bool): Whether to render progress bar. Default value is True. *args: Positional arguments for labeling function. **kwargs: Keyword arguments for labeling function. Returns: lt (LabelTimes): Calculated labels with cutoff times. """ assert self.labeling_function, "missing labeling function(s)" self._check_example_count(num_examples_per_instance, gap) is_label_search = isinstance(num_examples_per_instance, dict) search = (LabelSearch if is_label_search else ExampleSearch)( num_examples_per_instance, ) # check minimum data cutoff time minimum_data = self._check_cutoff_time(minimum_data) minimum_data_varies = isinstance(minimum_data, dict) df = self.set_index(df) total = search.expected_count if search.is_finite else 1 # If the target is categorical, make sure there are no unused categories if is_categorical_dtype(df[self.target_dataframe_index]): df[self.target_dataframe_index] = df[ self.target_dataframe_index ].cat.remove_unused_categories() target_groups = df.groupby(self.target_dataframe_index) total *= target_groups.ngroups progress_bar = tqdm( total=total, file=stdout, disable=not verbose, bar_format=self._bar_format, ) records = [] for group_count, (group_key, df) in enumerate(target_groups, start=1): if minimum_data_varies: if group_key not in minimum_data: continue min_data_for_group = minimum_data[group_key] else: min_data_for_group = minimum_data generator = DataSliceGenerator( window_size=self.window_size, min_data=min_data_for_group, max_data=maximum_data, drop_empty=drop_empty, gap=gap, ) for ds in generator(df): setattr(ds.context, self.target_dataframe_index, group_key) items = self.labeling_function.items() labels = {name: lf(ds, *args, **kwargs) for name, lf in items} valid_labels = search.is_valid_labels(labels) if not valid_labels: continue records.append( { self.target_dataframe_index: group_key, "time": ds.context.slice_start, **labels, }, ) search.update_count(labels) # if finite search, update progress bar for the example found if search.is_finite: progress_bar.update(n=1) if search.is_complete: break # if finite search, update progress bar for missing examples if search.is_finite: progress_bar.update( n=group_count * search.expected_count - progress_bar.n, ) else: progress_bar.update( n=1, ) # otherwise, update progress bar once for each group search.reset_count() total -= progress_bar.n progress_bar.update(n=total) progress_bar.close() lt = LabelTimes( data=records, target_columns=list(self.labeling_function), target_dataframe_index=self.target_dataframe_index, search_settings={ "num_examples_per_instance": num_examples_per_instance, "minimum_data": minimum_data, "maximum_data": str(maximum_data), "window_size": str(self.window_size), "gap": str(gap), }, ) return lt def set_index(self, df): """Sets the time index in a data frame (if not already set). Args: df (DataFrame): Data frame to set time index in. Returns: df (DataFrame): Data frame with time index set. """ if df.index.name != self.time_index: df = df.set_index(self.time_index) if "time" not in str(df.index.dtype): df.index = df.index.astype("datetime64[ns]") return df ================================================ FILE: composeml/label_search.py ================================================ from collections import Counter from pandas import isnull class ExampleSearch: """A label search based on the number of examples. Args: expected_count (int): The expected number of examples to find. """ def __init__(self, expected_count): self.expected_count = self._check_number(expected_count) self.reset_count() @staticmethod def _check_number(n): """Checks and formats the expected number of examples.""" if n == -1 or n == "inf": return float("inf") else: info = "expected count must be numeric" assert isinstance(n, (int, float)), info return n @staticmethod def _is_finite_number(n): """Checks if a number if finite.""" return n > 0 and abs(n) != float("inf") @property def is_complete(self): """Whether the search has found the expected number of examples.""" return self.actual_count >= self.expected_count @property def is_finite(self): """Whether the expected number of examples is a finite number.""" return self._is_finite_number(self.expected_count) def is_valid_labels(self, labels): """Whether the label values are not null.""" return not any(map(isnull, labels.values())) def reset_count(self): """Reset the internal count of actual labels.""" self.actual_count = 0 def update_count(self, labels): """Update the internal count of actual labels.""" self.actual_count += 1 class LabelSearch(ExampleSearch): """A label search based on the number of examples for each label. Args: expected_label_counts (dict): The expected number of examples to be find for each label. The dictionary should map a label to the number of examples to find for the label. """ def __init__(self, expected_label_counts): items = expected_label_counts.items() self.expected_label_counts = Counter( {label: self._check_number(count) for label, count in items}, ) self.expected_count = sum(self.expected_label_counts.values()) self.actual_label_counts = Counter() @property def is_complete(self): """Whether the search has found the expected number of examples for each label.""" return len(self.expected_label_counts - self.actual_label_counts) == 0 def is_complete_label(self, label): """Whether the search has found the expected number of examples for a label.""" return ( self.actual_label_counts.get(label, 0) >= self.expected_label_counts[label] ) def is_valid_labels(self, labels): """Whether label values meet the search criteria. The search criteria is defined as label values that are not null, expected by the user, and have not reached the expected count. When these conditions are met by any label value, the labels are set to return to the user. This includes the other label values which share the same cutoff time. Args: labels (dict): The actual label values found during a search. Returns: value (bool): The value is True when valid, otherwise False. """ label_values = labels.values() not_null = super().is_valid_labels(labels) is_expected = not_null and any( label in self.expected_label_counts for label in label_values ) value = is_expected and any( not self.is_complete_label(label) for label in label_values ) return value def reset_count(self): """Reset the internal count of actual labels.""" self.actual_label_counts.clear() def update_count(self, labels): """Update the internal count of the actual labels. Args: labels (dict): The actual label values found during a search. """ self.actual_label_counts.update(labels.values()) ================================================ FILE: composeml/label_times/__init__.py ================================================ # flake8:noqa from composeml.label_times.deserialize import read_label_times from composeml.label_times.object import LabelTimes ================================================ FILE: composeml/label_times/description.py ================================================ import pandas as pd def describe_label_times(label_times): """Prints out label info with transform settings that reproduce labels.""" target_column = label_times.target_columns[0] is_discrete = label_times.is_discrete[target_column] if is_discrete: distribution = label_times[target_column].value_counts() distribution.sort_index(inplace=True) distribution.index = distribution.index.astype("str") distribution["Total:"] = distribution.sum() else: distribution = label_times[target_column].describe() print("Label Distribution\n" + "-" * 18, end="\n") print(distribution.to_string(), end="\n\n\n") metadata = label_times.settings target_column = metadata["label_times"]["target_columns"][0] target_type = metadata["label_times"]["target_types"][target_column] target_dataframe_index = metadata["label_times"]["target_dataframe_index"] settings = { "target_column": target_column, "target_dataframe_index": target_dataframe_index, "target_type": target_type, } settings.update(metadata["label_times"]["search_settings"]) settings = pd.Series(settings) print("Settings\n" + "-" * 8, end="\n") settings.sort_index(inplace=True) print(settings.to_string(), end="\n\n\n") print("Transforms\n" + "-" * 10, end="\n") transforms = metadata["label_times"]["transforms"] for step, transform in enumerate(transforms): transform = pd.Series(transform) transform.sort_index(inplace=True) name = transform.pop("transform") transform = transform.add_prefix(" - ") transform = transform.add_suffix(":") transform = transform.to_string() header = "{}. {}\n".format(step + 1, name) print(header + transform, end="\n\n") if len(transforms) == 0: print("No transforms applied", end="\n\n") ================================================ FILE: composeml/label_times/deserialize.py ================================================ import json import os import pandas as pd from composeml.label_times.object import LabelTimes def read_config(path): """Reads config file from disk.""" file = os.path.join(path, "settings.json") assert os.path.exists(file), "settings not found: '%s'" % file with open(file, "r") as file: settings = json.load(file) return settings def read_data(path): """Reads data file from disk.""" file = "" for file in os.listdir(path): if file.startswith("data"): break assert file.startswith("data"), "data not found" extension = os.path.splitext(file)[1].lstrip(".") info = "file extension must be csv, parquet, or pickle" assert extension in ["csv", "parquet", "pickle"], info read = getattr(pd, "read_%s" % extension) data = read(os.path.join(path, file)) return data def read_label_times(path, load_settings=True): """Reads label times from disk. Args: path (str): Directory where label times is stored. Returns: lt (LabelTimes): Deserialized label times. """ kwargs = {} data = read_data(path) if load_settings: config = read_config(path) data = data.astype(config["dtypes"]) kwargs.update(config["label_times"]) lt = LabelTimes(data=data, **kwargs) return lt ================================================ FILE: composeml/label_times/object.py ================================================ import json import os import pandas as pd from composeml.label_times.description import describe_label_times from composeml.label_times.plots import LabelPlots from composeml.version import __version__ SCHEMA_VERSION = "0.1.0" class LabelTimes(pd.DataFrame): """The data frame that contains labels and cutoff times for the target dataframe.""" def __init__( self, data=None, target_dataframe_index=None, target_types=None, target_columns=None, search_settings=None, transforms=None, *args, **kwargs, ): super().__init__(data=data, *args, **kwargs) self.target_dataframe_index = target_dataframe_index self.target_columns = target_columns or [] self.target_types = target_types or {} self.search_settings = search_settings or {} self.transforms = transforms or [] self.plot = LabelPlots(self) if not self.empty: self._check_label_times() def _assert_single_target(self): """Asserts that the label times object contains a single target.""" info = "must first select an individual target" assert self._is_single_target, info def _check_target_columns(self): """Validates the target columns.""" if not self.target_columns: self.target_columns = self._infer_target_columns() else: for target in self.target_columns: info = 'target "%s" not found in data frame' assert target in self.columns, info % target def _check_target_types(self): """Validates the target types.""" if isinstance(self.target_types, dict): self.target_types = pd.Series(self.target_types, dtype="object") if self.target_types.empty: self.target_types = self._infer_target_types() else: target_names = self.target_types.index.tolist() match = target_names == self.target_columns assert match, "target names in types must match target columns" def _check_label_times(self): """Validates the lables times object.""" self._check_target_columns() self._check_target_types() def _infer_target_columns(self): """Infers the names of the targets in the data frame. Returns: value (list): A list of the target names. """ not_targets = [self.target_dataframe_index, "time"] target_columns = self.columns.difference(not_targets) assert not target_columns.empty, "target columns not found" value = target_columns.tolist() return value @property def _is_single_target(self): return len(self.target_columns) == 1 def _get_target_type(self, dtype): is_discrete = pd.api.types.is_bool_dtype(dtype) is_discrete |= pd.api.types.is_categorical_dtype(dtype) is_discrete |= pd.api.types.is_object_dtype(dtype) value = "discrete" if is_discrete else "continuous" return value def _infer_target_types(self): """Infers the target type from the data type. Returns: types (Series): Inferred label type. Either "continuous" or "discrete". """ dtypes = self.dtypes[self.target_columns] types = dtypes.apply(self._get_target_type) return types def select(self, target): """Selects one of the target variables. Args: target (str): The name of the target column. Returns: lt (LabelTimes): A label times object that contains a single target. Examples: Create a label times object that contains multiple target variables. >>> entity = [0, 0, 1, 1] >>> labels = [True, False, True, False] >>> time = ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04'] >>> data = {'entity': entity, 'time': time, 'A': labels, 'B': labels} >>> lt = LabelTimes(data=data, target_dataframe_index='entity', target_columns=['A', 'B']) >>> lt entity time A B 0 0 2020-01-01 True True 1 0 2020-01-02 False False 2 1 2020-01-03 True True 3 1 2020-01-04 False False Select a single target from the label times. >>> lt.select('B') entity time B 0 0 2020-01-01 True 1 0 2020-01-02 False 2 1 2020-01-03 True 3 1 2020-01-04 False """ assert not self._is_single_target, "only one target exists" if not isinstance(target, str): raise TypeError("target name must be string") assert target in self.target_columns, 'target "%s" not found' % target lt = self.copy() lt.target_columns = [target] lt.target_types = lt.target_types[[target]] lt = lt[[self.target_dataframe_index, "time", target]] return lt @property def settings(self): """Returns metadata about the label times.""" return { "compose_version": __version__, "schema_version": SCHEMA_VERSION, "label_times": { "target_dataframe_index": self.target_dataframe_index, "target_columns": self.target_columns, "target_types": self.target_types.to_dict(), "search_settings": self.search_settings, "transforms": self.transforms, }, } @property def is_discrete(self): """Whether labels are discrete.""" return self.target_types.eq("discrete") @property def distribution(self): """Returns label distribution if labels are discrete.""" self._assert_single_target() target_column = self.target_columns[0] if self.is_discrete[target_column]: labels = self.assign(count=1) labels = labels.groupby(target_column) distribution = labels["count"].count() return distribution else: return self[target_column].describe() @property def count(self): """Returns label count per instance.""" self._assert_single_target() count = self.groupby(self.target_dataframe_index) count = count[self.target_columns[0]].count() count = count.to_frame("count") return count @property def count_by_time(self): """Returns label count across cutoff times.""" self._assert_single_target() target_column = self.target_columns[0] if self.is_discrete[target_column]: keys = ["time", target_column] value = self.groupby(keys).time.count() value = value.unstack(target_column).fillna(0) else: value = self.groupby("time") value = value[target_column].count() value = ( value.cumsum() ) # In Python 3.5, these values automatically convert to float. value = value.astype("int") return value def describe(self): """Prints out the settings used to make the label times.""" if not self.empty: self._assert_single_target() describe_label_times(self) def copy(self, deep=True): """Make a copy of this object's indices and data. Args: deep (bool): Make a deep copy, including a copy of the data and the indices. With ``deep=False`` neither the indices nor the data are copied. Default is True. Returns: lt (LabelTimes): A copy of the label times object. """ lt = super().copy(deep=deep) lt.target_dataframe_index = self.target_dataframe_index lt.target_columns = self.target_columns lt.target_types = self.target_types.copy() lt.search_settings = self.search_settings.copy() lt.transforms = self.transforms.copy() return lt def threshold(self, value, inplace=False): """Creates binary labels by testing if labels are above threshold. Args: value (float) : Value of threshold. inplace (bool) : Modify labels in place. Returns: labels (LabelTimes) : Instance of labels. """ self._assert_single_target() target_column = self.target_columns[0] labels = self if inplace else self.copy() labels[target_column] = labels[target_column].gt(value) labels.target_types[target_column] = "discrete" transform = {"transform": "threshold", "value": value} labels.transforms.append(transform) if not inplace: return labels def apply_lead(self, value, inplace=False): """Shifts the label times earlier for predicting in advance. Args: value (str) : Time to shift earlier. inplace (bool) : Modify labels in place. Returns: labels (LabelTimes) : Instance of labels. """ labels = self if inplace else self.copy() labels["time"] = labels["time"].sub(pd.Timedelta(value)) transform = {"transform": "apply_lead", "value": value} labels.transforms.append(transform) if not inplace: return labels def bin(self, bins, quantiles=False, labels=None, right=True, precision=3): """Bin labels into discrete intervals. Args: bins (int or array): The criteria to bin by. As an integer, the value can be the number of equal-width or quantile-based bins. If :code:`quantiles` is False, the value is defined as the number of equal-width bins. The range is extended by .1% on each side to include the minimum and maximum values. If :code:`quantiles` is True, the value is defined as the number of quantiles (e.g. 10 for deciles, 4 for quartiles, etc.) As an array, the value can be custom or quantile-based edges. If :code:`quantiles` is False, the value is defined as bin edges allowing for non-uniform width. No extension is done. 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) quantiles (bool): Determines whether to use a quantile-based discretization function. labels (array): Specifies the labels for the returned bins. Must be the same length as the resulting bins. right (bool) : Indicates whether bins includes the rightmost edge or not. Does not apply to quantile-based bins. precision (int): The precision at which to store and display the bins labels. Default value is 3. Returns: LabelTimes : Instance of labels. Examples: These are the target values for the examples. >>> data = [226.93, 47.95, 283.46, 31.54] >>> lt = LabelTimes({'target': data}) >>> lt target 0 226.93 1 47.95 2 283.46 3 31.54 Bin values using equal-widths. >>> lt.bin(2) target 0 (157.5, 283.46] 1 (31.288, 157.5] 2 (157.5, 283.46] 3 (31.288, 157.5] Bin values using custom-widths. >>> lt.bin([0, 200, 400]) target 0 (200, 400] 1 (0, 200] 2 (200, 400] 3 (0, 200] Bin values using infinite edges. >>> lt.bin(['-inf', 100, 'inf']) target 0 (100.0, inf] 1 (-inf, 100.0] 2 (100.0, inf] 3 (-inf, 100.0] Bin values using quartiles. >>> lt.bin(4, quantiles=True) target 0 (137.44, 241.062] 1 (43.848, 137.44] 2 (241.062, 283.46] 3 (31.538999999999998, 43.848] Bin values using custom quantiles with precision. >>> lt.bin([0, .5, 1], quantiles=True, precision=1) target 0 (137.4, 283.5] 1 (31.4, 137.4] 2 (137.4, 283.5] 3 (31.4, 137.4] Assign labels to bins. >>> lt.bin(2, labels=['low', 'high']) target 0 high 1 low 2 high 3 low """ # noqa self._assert_single_target() target_column = self.target_columns[0] values = self[target_column].values if quantiles: values = pd.qcut(values, q=bins, labels=labels, precision=precision) else: if isinstance(bins, list): for i, edge in enumerate(bins): if edge in ["-inf", "inf"]: bins[i] = float(edge) values = pd.cut( values, bins=bins, labels=labels, right=right, precision=precision, ) transform = { "transform": "bin", "bins": bins, "quantiles": quantiles, "labels": labels, "right": right, "precision": precision, } lt = self.copy() lt[target_column] = values lt.transforms.append(transform) lt.target_types[target_column] = "discrete" return lt def _sample(self, key, value, settings, random_state=None, replace=False): """Returns a random sample of labels. Args: key (str) : Determines the sampling method. Can either be 'n' or 'frac'. value (int or float) : Quantity to sample. settings (dict) : Transform settings used for sampling. random_state (int) : Seed for the random number generator. replace (bool) : Sample with or without replacement. Default value is False. Returns: LabelTimes : Random sample of labels. """ sample = super().sample( random_state=random_state, replace=replace, **{key: value} ) return sample def _sample_per_label(self, key, value, settings, random_state=None, replace=False): """Returns a random sample per label. Args: key (str) : Determines the sampling method. Can either be 'n' or 'frac'. value (dict) : Quantity to sample per label. settings (dict) : Transform settings used for sampling. random_state (int) : Seed for the random number generator. replace (bool) : Sample with or without replacement. Default value is False. Returns: LabelTimes : Random sample per label. """ sample_per_label = [] target_column = self.target_columns[0] for ( label, value, ) in value.items(): label = self[self[target_column] == label] sample = label._sample( key, value, settings, random_state=random_state, replace=replace, ) sample_per_label.append(sample) sample = pd.concat(sample_per_label, axis=0, sort=False) return sample def sample( self, n=None, frac=None, random_state=None, replace=False, per_instance=False, ): """Return a random sample of labels. Args: n (int or dict) : Sample number of labels. A dictionary returns the number of samples to each label. Cannot be used with frac. frac (float or dict) : Sample fraction of labels. A dictionary returns the sample fraction to each label. Cannot be used with n. random_state (int) : Seed for the random number generator. replace (bool) : Sample with or without replacement. Default value is False. per_instance (bool): Whether to apply sampling to each group. Default is False. Returns: LabelTimes : Random sample of labels. Examples: Create a label times object. >>> entity = [0, 0, 1, 1] >>> labels = [True, False, True, False] >>> data = {'entity': entity, 'labels': labels} >>> lt = LabelTimes(data=data, target_dataframe_index='entity', target_columns=['labels']) >>> lt entity labels 0 0 True 1 0 False 2 1 True 3 1 False Sample a number of the examples. >>> lt.sample(n=3, random_state=0) entity labels 1 0 False 2 1 True 3 1 False Sample a fraction of the examples. >>> lt.sample(frac=.25, random_state=0) entity labels 2 1 True Sample a number of the examples for specific labels. >>> n = {True: 1, False: 1} >>> lt.sample(n=n, random_state=0) entity labels 2 1 True 3 1 False Sample a fraction of the examples for specific labels. >>> frac = {True: .5, False: .5} >>> lt.sample(frac=frac, random_state=0) entity labels 2 1 True 3 1 False Sample a number of the examples from each entity group. >>> lt.sample(n={True: 1}, per_instance=True, random_state=0) entity labels 0 0 True 2 1 True Sample a fraction of the examples from each entity group. >>> lt.sample(frac=.5, per_instance=True, random_state=0) entity labels 1 0 False 3 1 False """ # noqa self._assert_single_target() settings = { "transform": "sample", "n": n, "frac": frac, "random_state": random_state, "replace": replace, "per_instance": per_instance, } key, value = ("n", n) if n else ("frac", frac) assert value, "must set value for 'n' or 'frac'" per_label = isinstance(value, dict) method = "_sample_per_label" if per_label else "_sample" def transform(lt): sample = getattr(lt, method)( key=key, value=value, settings=settings, random_state=random_state, replace=replace, ) return sample if per_instance: groupby = self.groupby(self.target_dataframe_index, group_keys=False) sample = groupby.apply(transform) else: sample = transform(self) sample = sample.copy() sample.sort_index(inplace=True) sample.transforms.append(settings) return sample def equals(self, other, **kwargs): """Determines if two label time objects are the same. Args: other (LabelTimes) : Other label time object for comparison. **kwargs: Keyword arguments to pass to underlying pandas.DataFrame.equals method Returns: bool : Whether label time objects are the same. """ is_equal = super().equals(other, **kwargs) is_equal &= self.settings == other.settings return is_equal def _save_settings(self, path): """Write the settings in json format to disk. Args: path (str) : Directory on disk to write to. """ settings = self.settings dtypes = self.dtypes.astype("str") settings["dtypes"] = dtypes.to_dict() file = os.path.join(path, "settings.json") with open(file, "w") as file: json.dump(settings, file) def to_csv(self, path, save_settings=True, **kwargs): """Write label times in csv format to disk. Args: path (str) : Location on disk to write to (will be created as a directory). save_settings (bool) : Whether to save the settings used to make the label times. **kwargs: Keyword arguments to pass to underlying pandas.DataFrame.to_csv method """ os.makedirs(path, exist_ok=True) file = os.path.join(path, "data.csv") super().to_csv(file, index=False, **kwargs) if save_settings: self._save_settings(path) def to_parquet(self, path, save_settings=True, **kwargs): """Write label times in parquet format to disk. Args: path (str) : Location on disk to write to (will be created as a directory). save_settings (bool) : Whether to save the settings used to make the label times. **kwargs: Keyword arguments to pass to underlying pandas.DataFrame.to_parquet method """ os.makedirs(path, exist_ok=True) file = os.path.join(path, "data.parquet") super().to_parquet(file, compression=None, engine="auto", **kwargs) if save_settings: self._save_settings(path) def to_pickle(self, path, save_settings=True, **kwargs): """Write label times in pickle format to disk. Args: path (str) : Location on disk to write to (will be created as a directory). save_settings (bool) : Whether to save the settings used to make the label times. **kwargs: Keyword arguments to pass to underlying pandas.DataFrame.to_pickle method """ os.makedirs(path, exist_ok=True) file = os.path.join(path, "data.pickle") super().to_pickle(file, **kwargs) if save_settings: self._save_settings(path) # ---------------------------------------- # Subclassing Pandas Data Frame # ---------------------------------------- _metadata = [ "search_settings", "target_columns", "target_dataframe_index", "target_types", "transforms", ] def __finalize__(self, other, method=None, **kwargs): """Propagate metadata from other label times data frames. Args: other (LabelTimes) : The label times from which to get the attributes from. method (str) : A passed method name for optionally taking different types of propagation actions based on this value. """ if method == "concat": other = other.objs[0] for key in self._metadata: value = getattr(other, key, None) setattr(self, key, value) return self return super().__finalize__(other=other, method=method, **kwargs) @property def _constructor(self): return LabelTimes ================================================ FILE: composeml/label_times/plots.py ================================================ import matplotlib as mpl # isort:skip import pandas as pd import seaborn as sns # Raises an import error on OSX if not included. # https://matplotlib.org/3.1.0/faq/osx_framework.html#working-with-matplotlib-on-osx mpl.use("agg") # noqa pd.plotting.register_matplotlib_converters() sns.set_context("notebook") sns.set_style("darkgrid") COLOR = sns.color_palette("Set1", n_colors=100, desat=0.75) class LabelPlots: """Creates plots for Label Times.""" def __init__(self, label_times): """Initializes Label Plots. Args: label_times (LabelTimes) : instance of Label Times """ self._label_times = label_times def count_by_time(self, ax=None, **kwargs): """Plots the label distribution across cutoff times.""" count_by_time = self._label_times.count_by_time count_by_time.sort_index(inplace=True) target_column = self._label_times.target_columns[0] ax = ax or mpl.pyplot.axes(label=id(self)) vmin = count_by_time.index.min() vmax = count_by_time.index.max() ax.set_xlim(vmin, vmax) locator = mpl.dates.AutoDateLocator() formatter = mpl.dates.AutoDateFormatter(locator) ax.xaxis.set_major_locator(locator) ax.xaxis.set_major_formatter(formatter) for label in ax.get_xticklabels(): label.set_rotation(30) if len(count_by_time.shape) > 1: ax.stackplot( count_by_time.index, count_by_time.values.T, labels=count_by_time.columns, colors=COLOR, alpha=0.9, **kwargs, ) ax.legend( loc="upper left", title=target_column, facecolor="w", framealpha=0.9, ) ax.set_title("Label Count vs. Cutoff Times") ax.set_ylabel("Count") ax.set_xlabel("Time") else: ax.fill_between( count_by_time.index, count_by_time.values.T, color=COLOR[1], ) ax.set_title("Label vs. Cutoff Times") ax.set_ylabel(target_column) ax.set_xlabel("Time") return ax @property def dist(self): """Alias for distribution.""" return self.distribution def distribution(self, **kwargs): """Plots the label distribution.""" self._label_times._assert_single_target() target_column = self._label_times.target_columns[0] dist = self._label_times[target_column] is_discrete = self._label_times.is_discrete[target_column] if is_discrete: ax = sns.countplot(x=dist, palette=COLOR, **kwargs) else: ax = sns.histplot(x=dist, kde=True, color=COLOR[1], **kwargs) ax.set_title("Label Distribution") ax.set_ylabel("Count") return ax ================================================ FILE: composeml/tests/__init__.py ================================================ ================================================ FILE: composeml/tests/requirement_files/latest_core_dependencies.txt ================================================ featuretools==1.27.0 matplotlib==3.7.2 pandas==2.0.3 seaborn==0.12.2 tqdm==4.66.1 woodwork==0.25.1 ================================================ FILE: composeml/tests/requirement_files/minimum_core_requirements.txt ================================================ matplotlib==3.3.3 pandas==2.0.0 seaborn==0.12.2 tqdm==4.32.0 ================================================ FILE: composeml/tests/requirement_files/minimum_test_requirements.txt ================================================ featuretools==1.27.0 matplotlib==3.3.3 pandas==2.0.0 pip==21.3.1 pyarrow==7.0.0 pytest-cov==3.0.0 pytest-xdist==2.5.0 pytest==7.1.2 seaborn==0.12.2 tqdm==4.32.0 wheel==0.33.1 woodwork==0.25.1 ================================================ FILE: composeml/tests/test_data_slice/__init__.py ================================================ ================================================ FILE: composeml/tests/test_data_slice/test_extension.py ================================================ import pandas as pd from pytest import fixture, mark, raises from composeml import LabelMaker @fixture def data_slice(transactions): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", window_size="1h", ) ds = next(lm.slice(transactions, num_examples_per_instance=1)) return ds def test_context(data_slice): print(data_slice.context) context = str(data_slice.context) actual = context.splitlines() expected = [ "customer_id 0", "slice_number 1", "slice_start 2019-01-01 08:00:00", "slice_stop 2019-01-01 09:00:00", "next_start 2019-01-01 09:00:00", ] assert actual == expected def test_context_aliases(data_slice): assert data_slice.context == data_slice.ctx assert data_slice.context.slice_number == data_slice.ctx.count assert data_slice.context.slice_start == data_slice.ctx.start assert data_slice.context.slice_stop == data_slice.ctx.stop @mark.parametrize( "time_based,offsets", argvalues=[ [False, (2, 4, 2)], [False, (2, -6, 2)], [True, (pd.Timedelta("1h"), pd.Timedelta("2h"), pd.Timedelta("1h"))], [True, (pd.Timedelta("1h"), pd.Timedelta("-2h30min"), pd.Timedelta("1h"))], [True, ("2019-01-01 09:00:00", "2019-01-01 10:00:00", pd.Timedelta("1h"))], ], ) def test_subscriptable_slices(transactions, time_based, offsets): if time_based: dtypes = {"time": "datetime64[ns]"} transactions = transactions.astype(dtypes) transactions.set_index("time", inplace=True) start, stop, size = offsets slices = transactions.slice[start:stop:size] actual = tuple(map(len, slices)) assert actual == (2, 2) def test_subscriptable_error(transactions): with raises(TypeError, match="must be a slice object"): transactions.slice[0] def test_time_index_error(transactions): match = "offset by frequency requires a time index" with raises(AssertionError, match=match): transactions.slice[::"1h"] def test_minimum_data_per_group(transactions): lm = LabelMaker( "customer_id", labeling_function=len, time_index="time", window_size="1h", ) minimum_data = {1: "2019-01-01 09:00:00", 3: "2019-01-01 12:00:00"} lengths = [len(ds) for ds in lm.slice(transactions, 1, minimum_data=minimum_data)] assert lengths == [2, 1] def test_drop_empty(transactions): df = transactions.astype({"time": "datetime64[ns]"}) df.set_index("time", inplace=True) df.sort_index(inplace=True) ds = df.slice( size="1h", drop_empty=True, stop="2019-01-01 15:00:00", start="2019-01-01 08:00:00", ) assert len(list(ds)) == 5 ================================================ FILE: composeml/tests/test_data_slice/test_offset.py ================================================ from pytest import raises from composeml.data_slice.offset import DataSliceOffset def test_numeric_typecast(): assert int(DataSliceOffset("1 nanosecond")) == 1 assert float(DataSliceOffset("1970-01-01")) == 0.0 def test_numeric_typecast_errors(): match = "offset must be position or frequency based" with raises(TypeError, match=match): int(DataSliceOffset("1970-01-01")) match = "offset must be a timestamp" with raises(TypeError, match=match): float(DataSliceOffset("1 nanosecond")) def test_invalid_value(): match = "offset must be position or time based" with raises(AssertionError, match=match): DataSliceOffset(None) def test_alias_phrase(): phrase = "until start of next month" actual = DataSliceOffset(phrase).value expected = DataSliceOffset("MS").value assert actual == expected phrase = "until start of next year" actual = DataSliceOffset(phrase).value expected = DataSliceOffset("YS").value assert actual == expected ================================================ FILE: composeml/tests/test_datasets.py ================================================ import pytest from composeml import demos @pytest.fixture def transactions(): return demos.load_transactions() def test_transactions(transactions): assert len(transactions) == 100 ================================================ FILE: composeml/tests/test_featuretools.py ================================================ import featuretools as ft import pytest from composeml import LabelMaker def total_spent(df): total = df.amount.sum() return total @pytest.fixture def labels(): df = ft.demo.load_mock_customer(return_single_table=True, random_seed=0) df = df[["transaction_time", "customer_id", "amount"]] df.sort_values("transaction_time", inplace=True) lm = LabelMaker( target_dataframe_index="customer_id", time_index="transaction_time", labeling_function=total_spent, window_size="1h", ) lt = lm.search( df, minimum_data="10min", num_examples_per_instance=2, gap="30min", drop_empty=True, verbose=False, ) lt = lt.threshold(1250) return lt def test_dfs(labels): target_column = labels.target_columns[0] es = ft.demo.load_mock_customer(return_entityset=True, random_seed=0) feature_matrix, _ = ft.dfs( entityset=es, target_dataframe_name="customers", cutoff_time=labels, cutoff_time_in_index=True, ) assert target_column in feature_matrix columns = ["customer_id", "time", target_column] given_labels = feature_matrix.reset_index()[columns] given_labels = given_labels.sort_values(["customer_id", "time"]) given_labels = given_labels.reset_index(drop=True) given_labels = given_labels.rename_axis("label_id") assert given_labels.equals(labels) ================================================ FILE: composeml/tests/test_label_maker.py ================================================ import pandas as pd import pytest from composeml import LabelMaker from composeml.tests.utils import to_csv def test_search_default(transactions, total_spent_fn): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, ) given_labels = lm.search(transactions, num_examples_per_instance=1) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "0,2019-01-01 08:00:00,2", "1,2019-01-01 09:00:00,3", "2,2019-01-01 10:30:00,4", "3,2019-01-01 12:30:00,1", ] assert given_labels == labels def test_search_examples_per_label(transactions, total_spent_fn): def total_spent(ds): return total_spent_fn(ds) > 2 lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent, ) n_examples = {True: -1, False: 1} given_labels = lm.search(transactions, num_examples_per_instance=n_examples, gap=1) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "0,2019-01-01 08:00:00,False", "1,2019-01-01 09:00:00,True", "1,2019-01-01 09:30:00,False", "2,2019-01-01 10:30:00,True", "2,2019-01-01 11:00:00,True", "2,2019-01-01 11:30:00,False", "3,2019-01-01 12:30:00,False", ] assert given_labels == labels def test_search_with_undefined_labels(transactions, total_spent_fn): def total_spent(ds): return total_spent_fn(ds) % 3 lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent, ) n_examples = {1: 1, 2: 1} given_labels = lm.search(transactions, num_examples_per_instance=n_examples, gap=1) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "0,2019-01-01 08:00:00,2", "0,2019-01-01 08:30:00,1", "1,2019-01-01 09:30:00,2", "1,2019-01-01 10:00:00,1", "2,2019-01-01 10:30:00,1", "2,2019-01-01 11:30:00,2", "3,2019-01-01 12:30:00,1", ] assert given_labels == labels def test_search_with_multiple_targets(transactions, total_spent_fn, unique_amounts_fn): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", window_size=2, labeling_function={ "total_spent": total_spent_fn, "unique_amounts": unique_amounts_fn, }, ) expected = [ "customer_id,time,total_spent,unique_amounts", "0,2019-01-01 08:00:00,2,1", "1,2019-01-01 09:00:00,2,1", "1,2019-01-01 10:00:00,1,1", "2,2019-01-01 10:30:00,2,1", "2,2019-01-01 11:30:00,2,1", "3,2019-01-01 12:30:00,1,1", ] lt = lm.search(transactions, num_examples_per_instance=-1) actual = lt.pipe(to_csv, index=False) info = "unexpected calculated values" assert actual == expected, info expected = [ "customer_id,time,unique_amounts", "0,2019-01-01 08:00:00,1", "1,2019-01-01 09:00:00,1", "1,2019-01-01 10:00:00,1", "2,2019-01-01 10:30:00,1", "2,2019-01-01 11:30:00,1", "3,2019-01-01 12:30:00,1", ] actual = lt.select("unique_amounts") actual = actual.pipe(to_csv, index=False) info = "selected values differ from calculated values" assert actual == expected, info def test_search_offset_mix_0(transactions, total_spent_fn): """ Test offset mix with window_size (absolute), minimum_data (absolute), and gap (absolute). """ lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, window_size="2h", ) given_labels = lm.search( transactions, num_examples_per_instance=2, minimum_data="30min", gap="2h", drop_empty=True, ) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "0,2019-01-01 08:30:00,1", "1,2019-01-01 09:30:00,2", "2,2019-01-01 11:00:00,3", ] assert given_labels == labels def test_search_offset_mix_1(transactions, total_spent_fn): """ Test offset mix with window_size (relative), minimum_data (absolute), and gap (absolute). """ lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, window_size=4, ) given_labels = lm.search( transactions, num_examples_per_instance=2, minimum_data="2019-01-01 10:00:00", gap="4h", ) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "1,2019-01-01 10:00:00,1", "2,2019-01-01 10:00:00,4", "3,2019-01-01 10:00:00,1", ] assert given_labels == labels def test_search_offset_mix_2(transactions, total_spent_fn): """ Test offset mix with window_size (absolute), minimum_data (relative), and gap (absolute). """ lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, window_size="30min", ) given_labels = lm.search( transactions, num_examples_per_instance=2, minimum_data=2, ) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "1,2019-01-01 10:00:00,1", "2,2019-01-01 11:30:00,1", "2,2019-01-01 12:00:00,1", ] assert given_labels == labels def test_search_offset_mix_3(transactions, total_spent_fn): """ Test offset mix with window_size (absolute), minimum_data (absolute), and gap (relative). """ lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, window_size="8h", ) given_labels = lm.search( transactions, num_examples_per_instance=-1, minimum_data="2019-01-01 08:00:00", gap=1, ) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "0,2019-01-01 08:00:00,2", "0,2019-01-01 08:30:00,1", "1,2019-01-01 09:00:00,3", "1,2019-01-01 09:30:00,2", "1,2019-01-01 10:00:00,1", "2,2019-01-01 10:30:00,4", "2,2019-01-01 11:00:00,3", "2,2019-01-01 11:30:00,2", "2,2019-01-01 12:00:00,1", "3,2019-01-01 12:30:00,1", ] assert given_labels == labels def test_search_offset_mix_4(transactions, total_spent_fn): """ Test offset mix with window_size (relative), minimum_data (relative), and gap (absolute). """ lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, window_size=1, ) given_labels = lm.search( transactions, num_examples_per_instance=2, gap="30min", ) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "0,2019-01-01 08:00:00,1", "0,2019-01-01 08:30:00,1", "1,2019-01-01 09:00:00,1", "1,2019-01-01 09:30:00,1", "2,2019-01-01 10:30:00,1", "2,2019-01-01 11:00:00,1", "3,2019-01-01 12:30:00,1", ] assert given_labels == labels def test_search_offset_mix_5(transactions, total_spent_fn): """ Test offset mix with window_size (relative), minimum_data (absolute), and gap (relative). """ lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, window_size=2, ) labels = lm.search( transactions, num_examples_per_instance=2, minimum_data="1h", gap=2, ) labels = to_csv(labels, index=False) expected_labels = [ "customer_id,time,total_spent", "0,2019-01-01 08:00:00,2", "1,2019-01-01 09:00:00,2", "1,2019-01-01 10:00:00,1", "2,2019-01-01 10:30:00,2", "2,2019-01-01 11:30:00,2", "3,2019-01-01 12:30:00,1", ] assert labels == expected_labels def test_search_offset_mix_6(transactions, total_spent_fn): """ Test offset mix with window_size (absolute), minimum_data (relative), and gap (relative). """ lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, window_size="1h", ) given_labels = lm.search( transactions, num_examples_per_instance=1, minimum_data=3, gap=1, ) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "2,2019-01-01 12:00:00,1", ] assert given_labels == labels def test_search_offset_mix_7(transactions, total_spent_fn): """ Test offset mix with window_size (relative), minimum_data (relative), and gap (relative). """ lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, window_size=10, ) given_labels = lm.search( transactions, num_examples_per_instance=float("inf"), ) given_labels = to_csv(given_labels, index=False) labels = [ "customer_id,time,total_spent", "0,2019-01-01 08:00:00,2", "1,2019-01-01 09:00:00,3", "2,2019-01-01 10:30:00,4", "3,2019-01-01 12:30:00,1", ] assert given_labels == labels def test_search_offset_negative_0(transactions, total_spent_fn): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=lambda: None, window_size=2, ) match = "offset must be positive" with pytest.raises(AssertionError, match=match): lm.search( transactions, num_examples_per_instance=2, minimum_data=-1, gap=-1, ) def test_search_offset_negative_1(transactions, total_spent_fn): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=lambda: None, window_size=2, ) match = "offset must be positive" with pytest.raises(AssertionError, match=match): lm.search( transactions, num_examples_per_instance=2, minimum_data="-1h", gap="-1h", ) def test_search_invalid_n_examples(transactions, total_spent_fn): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, ) with pytest.raises(AssertionError, match="must specify gap"): next(lm.slice(transactions, num_examples_per_instance=2)) with pytest.raises(AssertionError, match="must specify gap"): lm.search(transactions, num_examples_per_instance=2) def test_column_based_windows(transactions, total_spent_fn): session_id = [1, 2, 3, 3, 4, 5, 5, 5, 6, 7] df = transactions.assign(session_id=session_id) lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", window_size="session_id", labeling_function=total_spent_fn, ) actual = lm.search(df, -1).pipe(to_csv, index=False) expected = [ "customer_id,time,total_spent", "0,2019-01-01 08:00:00,1", "0,2019-01-01 08:30:00,1", "1,2019-01-01 09:00:00,2", "1,2019-01-01 10:00:00,1", "2,2019-01-01 10:30:00,3", "2,2019-01-01 12:00:00,1", "3,2019-01-01 12:30:00,1", ] assert actual == expected def test_search_with_invalid_index(transactions, total_spent_fn): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=lambda df: None, window_size=2, ) df = transactions.sample(n=10, random_state=0) match = "data frame must be sorted chronologically" with pytest.raises(AssertionError, match=match): lm.search(df, num_examples_per_instance=2) df = transactions.assign(time=pd.NaT) match = "index contains null values" with pytest.raises(AssertionError, match=match): lm.search(df, num_examples_per_instance=2) def test_search_on_empty_labels(transactions): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=lambda ds: None, window_size=2, ) given_labels = lm.search( transactions, minimum_data=1, num_examples_per_instance=2, gap=1, ) assert given_labels.empty def test_data_slice_overlap(transactions, total_spent_fn): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, window_size="1h", ) for ds in lm.slice(transactions, num_examples_per_instance=2): overlap = ds.index == ds.context.slice_stop assert not overlap.any() def test_label_type(transactions, total_spent_fn): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, ) lt = lm.search(transactions, num_examples_per_instance=1) assert lt.target_types["total_spent"] == "continuous" assert lt.bin(2).target_types["total_spent"] == "discrete" def test_search_with_maximum_data(transactions): lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=len, window_size="1h", ) lt = lm.search( df=transactions.sort_values("time"), num_examples_per_instance=-1, minimum_data="2019-01-01 08:00:00", maximum_data="2019-01-01 09:00:00", drop_empty=False, ) expected = [ "customer_id,time,len", "0,2019-01-01 08:00:00,2", "0,2019-01-01 09:00:00,0", "1,2019-01-01 08:00:00,0", "1,2019-01-01 09:00:00,2", "2,2019-01-01 08:00:00,0", "2,2019-01-01 09:00:00,0", "3,2019-01-01 08:00:00,0", "3,2019-01-01 09:00:00,0", ] actual = lt.pipe(to_csv, index=False) assert actual == expected lt = lm.search( df=transactions.sort_values("time"), num_examples_per_instance=-1, maximum_data="30min", drop_empty=False, gap="30min", ) expected = [ "customer_id,time,len", "0,2019-01-01 08:00:00,2", "0,2019-01-01 08:30:00,1", "1,2019-01-01 09:00:00,2", "1,2019-01-01 09:30:00,2", "2,2019-01-01 10:30:00,2", "2,2019-01-01 11:00:00,2", "3,2019-01-01 12:30:00,1", "3,2019-01-01 13:00:00,0", ] actual = lt.pipe(to_csv, index=False) assert actual == expected @pytest.mark.parametrize( "minimum_data", [ {1: "2019-01-01 09:30:00", 2: "2019-01-01 11:30:00"}, {1: pd.Timedelta("30min"), 2: pd.Timedelta("1h")}, {1: 1, 2: 2}, ], ) def test_minimum_data_per_group(transactions, minimum_data): lm = LabelMaker( "customer_id", labeling_function=len, time_index="time", window_size="1h", ) for supported_type in [minimum_data, pd.Series(minimum_data)]: lt = lm.search(transactions, 1, minimum_data=supported_type) actual = to_csv(lt, index=False) expected = [ "customer_id,time,len", "1,2019-01-01 09:30:00,2", "2,2019-01-01 11:30:00,2", ] assert actual == expected def test_minimum_data_per_group_error(transactions): lm = LabelMaker( "customer_id", labeling_function=len, time_index="time", window_size="1h", ) data = ["2019-01-01 09:00:00", "2019-01-01 12:00:00"] minimum_data = pd.Series(data=data, index=[1, 1]) match = "more than one cutoff time exists for a target group" with pytest.raises(ValueError, match=match): lm.search(transactions, 1, minimum_data=minimum_data) def test_label_maker_categorical_target_with_missing_data(transactions, total_spent_fn): transactions = transactions.copy() transactions["customer_id"] = transactions["customer_id"].astype("category") lm = LabelMaker( target_dataframe_index="customer_id", time_index="time", window_size=3, labeling_function=total_spent_fn, ) # use on only the first 8 rows so the df will not contain data for customer 3 lm.search(transactions.head(8), -1) ================================================ FILE: composeml/tests/test_label_plots.py ================================================ from pytest import raises def test_count_by_time_categorical(total_spent): total_spent = total_spent.bin(2, labels=range(2)) title = total_spent.plot.count_by_time().get_title() assert title == "Label Count vs. Cutoff Times" def test_count_by_time_continuous(total_spent): title = total_spent.plot.count_by_time().get_title() assert title == "Label vs. Cutoff Times" def test_distribution_categorical(total_spent): ax = total_spent.bin(2, labels=range(2)) title = ax.plot.dist().get_title() assert title == "Label Distribution" def test_distribution_continuous(total_spent): title = total_spent.plot.dist().get_title() assert title == "Label Distribution" def test_single_target(total_spent): lt = total_spent.copy() lt.target_columns.append("target_2") match = "must first select an individual target" with raises(AssertionError, match=match): lt.plot.dist() with raises(AssertionError, match=match): lt.plot.count_by_time() ================================================ FILE: composeml/tests/test_label_serialization.py ================================================ import os import shutil import pandas as pd import pytest import composeml as cp @pytest.fixture def path(): pwd = os.path.dirname(__file__) path = os.path.join(pwd, ".cache") yield path shutil.rmtree(path) @pytest.fixture def total_spent(transactions, total_spent_fn): lm = cp.LabelMaker( target_dataframe_index="customer_id", time_index="time", labeling_function=total_spent_fn, ) lt = lm.search(transactions, num_examples_per_instance=1, verbose=False) return lt def test_csv(path, total_spent): total_spent.to_csv(path) total_spent_copy = cp.read_label_times(path) pd.testing.assert_frame_equal(total_spent, total_spent_copy) assert total_spent.equals(total_spent_copy) def test_parquet(path, total_spent): total_spent.to_parquet(path) total_spent_copy = cp.read_label_times(path) pd.testing.assert_frame_equal(total_spent, total_spent_copy) assert total_spent.equals(total_spent_copy) def test_pickle(path, total_spent): total_spent.to_pickle(path) total_spent_copy = cp.read_label_times(path) pd.testing.assert_frame_equal(total_spent, total_spent_copy) assert total_spent.equals(total_spent_copy) ================================================ FILE: composeml/tests/test_label_times.py ================================================ from pytest import raises from composeml.label_times import LabelTimes from composeml.tests.utils import to_csv def test_count_by_time_categorical(total_spent): given_answer = total_spent.bin(2, labels=range(2)) given_answer = to_csv(given_answer.count_by_time) answer = [ "time,0,1", "2019-01-01 08:00:00,0,1", "2019-01-01 08:30:00,0,2", "2019-01-01 09:00:00,0,3", "2019-01-01 09:30:00,0,4", "2019-01-01 10:00:00,0,5", "2019-01-01 10:30:00,1,5", "2019-01-01 11:00:00,2,5", "2019-01-01 11:30:00,3,5", "2019-01-01 12:00:00,4,5", "2019-01-01 12:30:00,5,5", ] assert given_answer == answer def test_count_by_time_continuous(total_spent): given_answer = total_spent.count_by_time given_answer = to_csv(given_answer, header=True, index=True) answer = [ "time,total_spent", "2019-01-01 08:00:00,1", "2019-01-01 08:30:00,2", "2019-01-01 09:00:00,3", "2019-01-01 09:30:00,4", "2019-01-01 10:00:00,5", "2019-01-01 10:30:00,6", "2019-01-01 11:00:00,7", "2019-01-01 11:30:00,8", "2019-01-01 12:00:00,9", "2019-01-01 12:30:00,10", ] assert given_answer == answer def test_sorted_distribution(capsys, total_spent): bins = [0, 5, 10, 20] total_spent.bin(bins).describe() captured = capsys.readouterr() out = "\n".join( [ "Label Distribution", "------------------", "total_spent", "(0, 5] 5", "(5, 10] 4", "(10, 20] 0", "Total: 9", "", "", "Settings", "--------", "num_examples_per_instance -1", "target_column total_spent", "target_dataframe_index customer_id", "target_type discrete", "", "", "Transforms", "----------", "1. bin", " - bins: [0, 5, 10, 20]", " - labels: None", " - precision: 3", " - quantiles: False", " - right: True", "", "", ], ) assert captured.out == out def test_describe_no_transforms(capsys): data = {"target": range(3)} LabelTimes(data).describe() captured = capsys.readouterr() out = "\n".join( [ "Label Distribution", "------------------", "count 3.0", "mean 1.0", "std 1.0", "min 0.0", "25% 0.5", "50% 1.0", "75% 1.5", "max 2.0", "", "", "Settings", "--------", "target_column target", "target_dataframe_index None", "target_type continuous", "", "", "Transforms", "----------", "No transforms applied", "", "", ], ) assert captured.out == out def test_distribution_categorical(total_spent): labels = range(2) given_answer = total_spent.bin(2, labels=labels).distribution given_answer = to_csv(given_answer) answer = [ "total_spent,count", "0,5", "1,5", ] assert given_answer == answer def test_distribution_continous(total_spent): distribution = total_spent.distribution actual = to_csv(distribution.round(4)) expected = [ ",total_spent", "count,10.0", "mean,4.5", "std,3.0277", "min,0.0", "25%,2.25", "50%,4.5", "75%,6.75", "max,9.0", ] assert actual == expected def test_target_type(total_spent): types = total_spent.target_types assert types["total_spent"] == "continuous" total_spent = total_spent.threshold(5) types = total_spent.target_types assert types["total_spent"] == "discrete" def test_count(total_spent): given_answer = total_spent.count given_answer = to_csv(given_answer, index=True) answer = [ "customer_id,count", "0,2", "1,3", "2,4", "3,1", ] assert given_answer == answer def test_label_select_errors(total_spent): match = "only one target exists" with raises(AssertionError, match=match): total_spent.select("a") lt = total_spent.copy() lt.target_columns.append("b") match = "target name must be string" with raises(TypeError, match=match): total_spent.select(123) match = 'target "a" not found' with raises(AssertionError, match=match): lt.select("a") ================================================ FILE: composeml/tests/test_label_transforms/__init__.py ================================================ ================================================ FILE: composeml/tests/test_label_transforms/test_bin.py ================================================ import pandas as pd from pytest import raises def test_bins(labels): given_labels = labels.bin(2) transform = given_labels.transforms[0] assert transform["transform"] == "bin" assert transform["bins"] == 2 assert transform["quantiles"] is False assert transform["labels"] is None assert transform["right"] is True answer = [ pd.Interval(157.5, 283.46, closed="right"), pd.Interval(31.288, 157.5, closed="right"), pd.Interval(157.5, 283.46, closed="right"), pd.Interval(31.288, 157.5, closed="right"), ] answer = pd.Categorical(answer, ordered=True) labels = labels.assign(my_labeling_function=answer) pd.testing.assert_frame_equal(given_labels, labels) def test_quantile_bins(labels): given_labels = labels.bin(2, quantiles=True) transform = given_labels.transforms[0] assert transform["transform"] == "bin" assert transform["bins"] == 2 assert transform["quantiles"] is True assert transform["labels"] is None assert transform["right"] is True answer = [ pd.Interval(137.44, 283.46, closed="right"), pd.Interval(31.538999999999998, 137.44, closed="right"), pd.Interval(137.44, 283.46, closed="right"), pd.Interval(31.538999999999998, 137.44, closed="right"), ] answer = pd.Categorical(answer, ordered=True) labels = labels.assign(my_labeling_function=answer) pd.testing.assert_frame_equal(given_labels, labels) def test_single_target(total_spent): lt = total_spent.copy() lt.target_columns.append("target_2") match = "must first select an individual target" with raises(AssertionError, match=match): lt.bin(2) ================================================ FILE: composeml/tests/test_label_transforms/test_lead.py ================================================ import pandas as pd def test_lead(labels): labels = labels.apply_lead("10min") transform = labels.transforms[0] assert transform["transform"] == "apply_lead" assert transform["value"] == "10min" answer = [ "2014-01-01 00:35:00", "2014-01-01 00:38:00", "2013-12-31 23:51:00", "2013-12-31 23:54:00", ] time = pd.Series(answer, name="time", dtype="datetime64[ns]") time = time.rename_axis("label_id") pd.testing.assert_series_equal(labels["time"], time) ================================================ FILE: composeml/tests/test_label_transforms/test_sample.py ================================================ import pytest from composeml import LabelTimes from composeml.tests.utils import read_csv, to_csv @pytest.fixture def labels(labels): return labels.threshold(100) def test_sample_n_int(labels): given_answer = labels.sample(n=2, random_state=0) given_answer = given_answer.sort_index() given_answer = to_csv(given_answer, index=True) answer = [ "label_id,customer_id,time,my_labeling_function", "2,2,2014-01-01 00:01:00,True", "3,2,2014-01-01 00:04:00,False", ] assert given_answer == answer def test_sample_n_per_label(labels): n = {True: 1, False: 2} given_answer = labels.sample(n=n, random_state=0) given_answer = given_answer.sort_index() given_answer = to_csv(given_answer, index=True) answer = [ "label_id,customer_id,time,my_labeling_function", "1,1,2014-01-01 00:48:00,False", "2,2,2014-01-01 00:01:00,True", "3,2,2014-01-01 00:04:00,False", ] assert given_answer == answer def test_sample_frac_int(labels): given_answer = labels.sample(frac=0.25, random_state=0) given_answer = given_answer.sort_index() given_answer = to_csv(given_answer, index=True) answer = [ "label_id,customer_id,time,my_labeling_function", "2,2,2014-01-01 00:01:00,True", ] assert given_answer == answer def test_sample_frac_per_label(labels): frac = {True: 1.0, False: 0.5} given_answer = labels.sample(frac=frac, random_state=0) given_answer = given_answer.sort_index() given_answer = to_csv(given_answer, index=True) answer = [ "label_id,customer_id,time,my_labeling_function", "0,1,2014-01-01 00:45:00,True", "2,2,2014-01-01 00:01:00,True", "3,2,2014-01-01 00:04:00,False", ] assert given_answer == answer def test_sample_in_transforms(labels): n = {True: 2, False: 2} transform = { "transform": "sample", "n": n, "frac": None, "random_state": None, "replace": False, "per_instance": False, } sample = labels.sample(n=n) assert transform != labels.transforms[-1] assert transform == sample.transforms[-1] def test_sample_with_replacement(labels): assert labels.shape[0] < 20 n = {True: 10, False: 10} sample = labels.sample(n=n, replace=True) assert sample.shape[0] == 20 def test_single_target(total_spent): lt = total_spent.copy() lt.target_columns.append("target_2") match = "must first select an individual target" with pytest.raises(AssertionError, match=match): lt.sample(2) def test_sample_n_per_instance(): data = read_csv( [ "target_dataframe_index,labels", "0,a", "0,b", "1,a", "1,b", ], ) lt = LabelTimes(data=data, target_dataframe_index="target_dataframe_index") sample = lt.sample(n={"a": 1}, per_instance=True, random_state=0) actual = to_csv(sample, index=False) expected = [ "target_dataframe_index,labels", "0,a", "1,a", ] assert expected == actual def test_sample_frac_per_instance(): data = read_csv( [ "target_dataframe_index,labels", "0,a", "0,a", "0,a", "0,a", "1,a", "1,a", ], ) lt = LabelTimes(data=data, target_dataframe_index="target_dataframe_index") sample = lt.sample(frac={"a": 0.5}, per_instance=True, random_state=0) actual = to_csv(sample, index=False) expected = [ "target_dataframe_index,labels", "0,a", "0,a", "1,a", ] assert expected == actual ================================================ FILE: composeml/tests/test_label_transforms/test_threshold.py ================================================ from pytest import raises def test_threshold(labels): labels = labels.threshold(200) transform = labels.transforms[0] assert transform["transform"] == "threshold" assert transform["value"] == 200 answer = [True, False, True, False] target_column = labels.target_columns[0] given_answer = labels[target_column].values.tolist() assert given_answer == answer def test_single_target(total_spent): lt = total_spent.copy() lt.target_columns.append("target_2") match = "must first select an individual target" with raises(AssertionError, match=match): lt.threshold(200) ================================================ FILE: composeml/tests/test_version.py ================================================ from composeml import __version__ def test_version(): assert __version__ == "0.10.1" ================================================ FILE: composeml/tests/utils.py ================================================ from io import StringIO import pandas as pd def read_csv(data, **kwargs): """Helper function for creating a dataframe from in-memory CSV string (or list of strings). Args: data (str or list) : CSV string(s) Returns: DataFrame : Instance of a dataframe. """ if isinstance(data, list): data = "\n".join(data) # This creates a file-like object for reading in CSV string. with StringIO(data) as data: df = pd.read_csv(data, **kwargs) return df def to_csv(label_times, **kwargs): df = pd.DataFrame(label_times) csv = df.to_csv(**kwargs) return csv.splitlines() ================================================ FILE: composeml/update_checker.py ================================================ from pkg_resources import iter_entry_points for entry_point in iter_entry_points("alteryx_open_src_initialize"): try: method = entry_point.load() if callable(method): method("composeml") except Exception: pass ================================================ FILE: composeml/version.py ================================================ __version__ = "0.10.1" ================================================ FILE: contributing.md ================================================ # Contributing to Compose :+1::tada: First off, thank you for taking the time to contribute! :tada::+1: Whether you are a novice or experienced software developer, all contributions and suggestions are welcome! There are many ways to contribute to Compose, with the most common ones being contribution of code or documentation to the project. **To contribute, you can:** 1. 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) 2. 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) 3. Make changes to the codebase, see [Contributing to the codebase](#Contributing-to-the-Codebase). 4. Improve our documentation, which can be found under the [docs](docs/) directory or at https://compose.alteryx.com/en/stable/ 5. [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. 6. 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". ## Contributing to the Codebase Before 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. #### 1. Fork and clone repo * 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. * 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. ```bash git clone https://github.com/your-user-name/compose.git cd compose git remote add upstream https://github.com/alteryx/compose ``` * 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. ```bash python -m venv venv source venv/bin/activate make installdeps git checkout -b issue####-branch_name ``` #### 2. Implement your Pull Request * Implement your pull request. If needed, add new tests or update the documentation. * Before submitting to GitHub, verify the tests run and the code lints properly ```bash # runs linting make lint # will fix some common linting issues automatically make lint-fix # runs test make test ``` * If you made changes to the documentation, build the documentation locally. ```bash # go to docs and build cd docs make html # view docs locally open build/html/index.html ``` #### 3. Submit your Pull Request * Once your changes are ready to be submitted, make sure to push your changes to GitHub before creating a pull request. * 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. ```bash git fetch upstream git merge upstream/main ``` * 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. * If this is your first contribution, you will need to sign the Contributor License Agreement as directed. * 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: * Enhancements: new features or additions to Compose. * Fixes: things like bugfixes or adding more descriptive error messages. * Changes: modifications to an existing part of Compose. * Documentation Changes * Testing Changes Documentation or testing changes rarely warrant an individual release notes entry; the PR number can be added to their respective "Miscellaneous changes" entries. * 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! ## Report issues When 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. ================================================ FILE: docs/Makefile ================================================ # Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SOURCEDIR = source BUILDDIR = build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ================================================ FILE: docs/make.bat ================================================ @ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=source set BUILDDIR=build if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% :end popd ================================================ FILE: docs/source/_static/style.css ================================================ .footer { background-color: #0D2345; padding-bottom: 40px; padding-top: 40px; width: 100%; } .footer-cell-1 { grid-row: 1; grid-column: 1 / 3; } .footer-cell-2 { grid-row: 1; grid-column: 4; margin-bottom: 15px; text-align: right; } .footer-cell-3 { grid-row: 2; grid-column: 1 / 5; } .footer-cell-4 { grid-row: 3; grid-column: 1 / 3; } .footer-container { display: grid; margin-left: 10%; margin-right: 10%; } .footer-image-alteryx { padding-top: 22px; width: 270px; } .footer-image-copyright { width: 180px; } .footer-image-github { width: 50px; } .footer-image-twitter { width: 60px; } .footer-line { border-top: 2px solid white; margin-left: 7px; margin-right: 15px; } ================================================ FILE: docs/source/_templates/class.rst ================================================ {{ fullname | escape | underline}} .. currentmodule:: {{ module }} .. autoclass:: {{ objname }} {% block methods %} {% if methods %} .. rubric:: Methods .. autosummary:: :nosignatures: :toctree: methods {% for item in methods %} {%- if item not in inherited_members %} ~{{ name }}.{{ item }} {%- endif %} {%- endfor %} {% endif %} {% endblock %} ================================================ FILE: docs/source/_templates/layout.html ================================================ {% extends "!layout.html" %} {%- block extrahead %} {% set image = 'https://alteryx-oss-web-images.s3.amazonaws.com/compose_open_graph.png' %} {% set description = 'A machine learning tool for automated prediction engineering' %} {% if meta is defined %} {% if meta.description is defined %} {% set description = meta.description %} {% endif %} {% endif %} {% endblock %} {%- block footer %} {% endblock %} ================================================ FILE: docs/source/api_reference.rst ================================================ .. currentmodule:: composeml ============= API Reference ============= Label Maker =========== .. autosummary:: :toctree: generated :template: class.rst :nosignatures: LabelMaker Label Times ============ .. autosummary:: :toctree: generated :template: class.rst :nosignatures: LabelTimes Transform Methods ----------------- .. autosummary:: :nosignatures: LabelTimes.apply_lead LabelTimes.bin LabelTimes.sample LabelTimes.threshold .. currentmodule:: composeml.label_times.plots Label Plots =========== .. autosummary:: :toctree: generated :template: class.rst :nosignatures: LabelPlots Plotting Methods ---------------- .. autosummary:: :nosignatures: LabelPlots.count_by_time LabelPlots.distribution ================================================ FILE: docs/source/conf.py ================================================ # -*- coding: utf-8 -*- # # Configuration file for the Sphinx documentation builder. # # This file does only contain a selection of the most common options. For a # full list see the documentation: # http://www.sphinx-doc.org/en/master/config # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) from composeml import __version__ as version # -- Project information ----------------------------------------------------- project = "Compose" copyright = "2020, Alteryx, Inc." author = "Alteryx, Inc." # The full version, including alpha/beta/rc tags release = version # -- General configuration --------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "nbsphinx", "sphinx.ext.autodoc", "sphinx.ext.autosummary", "sphinx.ext.intersphinx", "sphinx.ext.napoleon", "sphinx.ext.viewcode", "sphinx.ext.extlinks", "sphinx_inline_tabs", "sphinx_copybutton", "myst_parser", ] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = ".rst" # The master toctree document. master_doc = "index" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = ["**.ipynb_checkpoints"] # The name of the Pygments (syntax highlighting) style to use. pygments_style = None # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "pydata_sphinx_theme" html_logo = "images/compose_nav2.png" html_favicon = "images/favicon.ico" html_theme_options = { "icon_links": [ { "name": "GitHub", "url": "https://github.com/alteryx/compose", "icon": "fab fa-github-square", "type": "fontawesome", }, { "name": "Twitter", "url": "https://twitter.com/AlteryxOSS", "icon": "fab fa-twitter-square", "type": "fontawesome", }, { "name": "Slack", "url": "https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA", "icon": "fab fa-slack", "type": "fontawesome", }, ], "collapse_navigation": False, "navigation_depth": 2, } # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # Custom sidebar templates, must be a dictionary that maps document names # to template names. # # The default sidebars (for documents that don't match any pattern) are # defined by theme itself. Builtin themes are using these templates by # default: ``['localtoc.html', 'relations.html', 'sourcelink.html', # 'searchbox.html']``. # # html_sidebars = {} # -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. htmlhelp_basename = "Composedoc" # -- Options for LaTeX output ------------------------------------------------ latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, "Compose.tex", "Compose Documentation", "Alteryx, Inc.", "manual"), ] # -- Options for manual page output ------------------------------------------ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [(master_doc, "composeml", "Compose Documentation", [author], 1)] # -- Options for Texinfo output ---------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( master_doc, "Compose", "Compose Documentation", author, "Compose", "One line description of project.", "Miscellaneous", ), ] # -- Options for Epub output ------------------------------------------------- # Bibliographic Dublin Core info. epub_title = project # The unique identifier of the text. This can be a ISBN number # or the project homepage. # # epub_identifier = '' # A unique identification for the text. # # epub_uid = '' # A list of files that should not be packed into the epub file. epub_exclude_files = ["search.html"] # -- Options for Markdown files ---------------------------------------------- myst_admonition_enable = True myst_deflist_enable = True myst_heading_anchors = 3 # -- Options for Sphinx Copy Button ------------------------------------------ copybutton_prompt_text = "myinputprompt" copybutton_prompt_text = r">>> |\.\.\. |\$ |In \[\d*\]: | {2,5}\.\.\.: | {5,8}: " copybutton_prompt_is_regexp = True # -- Extension configuration ------------------------------------------------- extlinks = { "issue": ("https://github.com/alteryx/compose/issues/%s", "#"), "pr": ("https://github.com/alteryx/compose/pull/%s", "#"), "user": ("https://github.com/%s", "@"), } autosummary_generate = ["api_reference.rst"] templates_path = ["_templates"] def setup(app): app.add_css_file("style.css") html_show_sphinx = False ================================================ FILE: docs/source/examples/demo/__init__.py ================================================ import os import warnings warnings.filterwarnings("ignore") PWD = os.path.dirname(__file__) ================================================ FILE: docs/source/examples/demo/chicago_bike/__init__.py ================================================ from demo import PWD from pandas import read_csv from os.path import join PWD = join(PWD, "chicago_bike") def _read(file): return read_csv( join(PWD, file), parse_dates=["starttime", "stoptime"], index_col="trip_id", ) def load_sample(): return _read("sample.csv") ================================================ FILE: docs/source/examples/demo/chicago_bike/sample.csv ================================================ trip_id,gender,starttime,stoptime,tripduration,temperature,events,from_station_id,dpcapacity_start,to_station_id,dpcapacity_end 2331610,Female,2014-06-29 13:35:00,2014-06-29 13:56:00,20.75,82.9,cloudy,178,15.0,76,39.0 2347603,Female,2014-06-30 12:07:00,2014-06-30 12:37:00,30.15,82.0,cloudy,211,19.0,177,15.0 2345120,Male,2014-06-30 08:36:00,2014-06-30 08:43:00,6.516666666666668,75.0,cloudy,340,15.0,67,15.0 2347527,Male,2014-06-30 12:00:00,2014-06-30 12:08:00,7.25,82.0,cloudy,56,19.0,56,19.0 2344421,Male,2014-06-30 08:04:00,2014-06-30 08:11:00,7.316666666666666,75.0,cloudy,77,23.0,37,19.0 2336431,Male,2014-06-29 16:31:00,2014-06-29 16:53:00,21.816666666666666,84.9,cloudy,349,15.0,13,19.0 2351574,Male,2014-06-30 16:55:00,2014-06-30 17:07:00,11.783333333333333,84.0,cloudy,190,15.0,93,15.0 2351672,Male,2014-06-30 16:58:00,2014-06-30 17:13:00,15.533333333333333,84.0,cloudy,37,19.0,289,19.0 2351751,Male,2014-06-30 17:00:00,2014-06-30 17:07:00,7.566666666666666,84.0,cloudy,169,15.0,134,19.0 2331505,Female,2014-06-29 13:29:00,2014-06-29 13:36:00,7.716666666666668,82.9,cloudy,181,31.0,106,27.0 2336748,Male,2014-06-29 16:44:00,2014-06-29 17:05:00,21.08333333333333,84.9,cloudy,268,15.0,232,23.0 2350914,Male,2014-06-30 16:27:00,2014-06-30 16:36:00,8.3,84.0,cloudy,49,27.0,191,23.0 2341339,Female,2014-06-29 20:48:00,2014-06-29 21:15:00,26.88333333333333,81.0,cloudy,99,19.0,62,27.0 2352857,Female,2014-06-30 17:36:00,2014-06-30 17:40:00,4.4,84.0,cloudy,304,15.0,303,15.0 2340830,Female,2014-06-29 20:11:00,2014-06-29 20:19:00,7.5166666666666675,81.0,cloudy,123,15.0,116,15.0 2343445,Male,2014-06-30 07:00:00,2014-06-30 07:03:00,3.083333333333333,73.0,cloudy,74,23.0,48,27.0 2338352,Male,2014-06-29 17:59:00,2014-06-29 18:11:00,11.7,84.9,cloudy,84,19.0,134,19.0 2338548,Male,2014-06-29 18:07:00,2014-06-29 18:41:00,33.9,84.2,cloudy,349,15.0,73,19.0 2338565,Male,2014-06-29 18:08:00,2014-06-29 18:25:00,17.183333333333334,84.2,cloudy,176,19.0,152,15.0 2340701,Male,2014-06-29 19:58:00,2014-06-29 20:28:00,30.36666666666667,82.0,cloudy,234,19.0,293,19.0 2338809,Male,2014-06-29 18:22:00,2014-06-29 18:43:00,21.233333333333334,84.2,cloudy,254,15.0,249,15.0 2349824,Male,2014-06-30 15:15:00,2014-06-30 15:29:00,13.45,84.9,cloudy,283,23.0,186,15.0 2352795,Male,2014-06-30 17:34:00,2014-06-30 17:51:00,17.233333333333334,84.0,cloudy,168,19.0,168,19.0 2350998,Male,2014-06-30 16:26:00,2014-06-30 16:35:00,9.2,84.0,cloudy,52,31.0,91,31.0 2349370,Male,2014-06-30 14:37:00,2014-06-30 14:48:00,11.433333333333335,87.1,cloudy,290,15.0,213,15.0 2354718,Male,2014-06-30 19:49:00,2014-06-30 20:07:00,18.733333333333334,73.0,tstorms,55,15.0,55,15.0 2351674,Male,2014-06-30 16:58:00,2014-06-30 17:06:00,8.1,84.0,cloudy,264,19.0,66,19.0 2338317,Male,2014-06-29 17:57:00,2014-06-29 18:34:00,37.3,84.9,cloudy,263,11.0,75,23.0 2342680,Male,2014-06-29 23:22:00,2014-06-29 23:28:00,5.416666666666668,78.1,cloudy,350,15.0,214,15.0 2341145,Male,2014-06-29 20:33:00,2014-06-29 21:02:00,28.766666666666666,81.0,cloudy,341,19.0,150,11.0 2352020,Male,2014-06-30 17:06:00,2014-06-30 17:15:00,9.116666666666667,84.0,cloudy,264,19.0,212,31.0 2334784,Male,2014-06-29 15:27:00,2014-06-29 15:54:00,26.91666666666667,82.9,cloudy,324,15.0,295,15.0 2344311,Male,2014-06-30 07:57:00,2014-06-30 08:11:00,14.133333333333333,73.0,cloudy,75,23.0,35,39.0 2343074,Male,2014-06-30 05:35:00,2014-06-30 05:41:00,5.9833333333333325,73.0,cloudy,332,15.0,327,19.0 2341720,Female,2014-06-29 21:15:00,2014-06-29 21:19:00,3.5166666666666666,79.0,cloudy,248,15.0,322,15.0 2353889,Male,2014-06-30 18:18:00,2014-06-30 18:21:00,2.9166666666666665,82.0,tstorms,309,11.0,158,15.0 2342764,Male,2014-06-29 23:50:00,2014-06-30 00:13:00,23.48333333333333,78.1,cloudy,244,19.0,303,15.0 2352400,Female,2014-06-30 17:20:00,2014-06-30 17:42:00,21.95,84.0,cloudy,81,39.0,340,15.0 2331873,Male,2014-06-29 13:46:00,2014-06-29 14:10:00,24.91666666666667,82.9,cloudy,156,15.0,94,19.0 2351727,Male,2014-06-30 16:59:00,2014-06-30 17:16:00,16.633333333333333,84.0,cloudy,134,19.0,69,19.0 2345935,Male,2014-06-30 09:22:00,2014-06-30 09:30:00,7.6,78.1,cloudy,255,31.0,90,35.0 2353412,Male,2014-06-30 17:56:00,2014-06-30 18:23:00,26.88333333333333,84.0,cloudy,51,31.0,223,15.0 2349890,Male,2014-06-30 15:22:00,2014-06-30 15:30:00,8.0,84.9,cloudy,181,31.0,106,27.0 2336202,Male,2014-06-29 16:22:00,2014-06-29 16:29:00,6.833333333333332,84.9,cloudy,268,15.0,143,15.0 2332401,Male,2014-06-29 14:04:00,2014-06-29 14:32:00,28.3,84.0,cloudy,312,15.0,94,19.0 2348888,Male,2014-06-30 13:56:00,2014-06-30 13:59:00,3.15,84.9,cloudy,60,19.0,93,15.0 2347827,Male,2014-06-30 12:20:00,2014-06-30 12:31:00,11.85,82.0,cloudy,287,27.0,291,19.0 2335752,Male,2014-06-29 16:05:00,2014-06-29 16:12:00,7.05,84.9,cloudy,144,15.0,87,19.0 2346051,Male,2014-06-30 09:33:00,2014-06-30 09:49:00,16.85,78.1,cloudy,120,15.0,51,31.0 2348804,Male,2014-06-30 13:49:00,2014-06-30 13:57:00,8.366666666666667,84.9,cloudy,51,31.0,26,31.0 2337626,Male,2014-06-29 17:22:00,2014-06-29 17:30:00,8.1,84.9,cloudy,16,11.0,309,11.0 2336628,Male,2014-06-29 16:39:00,2014-06-29 16:55:00,16.25,84.9,cloudy,154,15.0,69,19.0 2349449,Male,2014-06-30 14:44:00,2014-06-30 14:49:00,5.466666666666668,87.1,cloudy,185,11.0,290,15.0 2352026,Male,2014-06-30 17:08:00,2014-06-30 17:18:00,9.366666666666667,84.0,cloudy,195,31.0,91,31.0 2339115,Male,2014-06-29 18:36:00,2014-06-29 18:41:00,4.35,84.2,cloudy,114,27.0,232,23.0 2345532,Male,2014-06-30 08:56:00,2014-06-30 09:00:00,3.9166666666666665,75.0,cloudy,174,23.0,98,15.0 2332243,Male,2014-06-29 13:58:00,2014-06-29 14:24:00,26.33333333333333,82.9,cloudy,333,15.0,93,15.0 2346818,Male,2014-06-30 10:52:00,2014-06-30 10:59:00,6.833333333333332,78.1,cloudy,48,27.0,291,19.0 2353493,Male,2014-06-30 17:59:00,2014-06-30 18:17:00,17.933333333333334,84.0,cloudy,66,19.0,69,19.0 2337808,Female,2014-06-29 17:31:00,2014-06-29 17:47:00,16.416666666666668,84.9,cloudy,35,39.0,255,31.0 2354440,Male,2014-06-30 18:52:00,2014-06-30 18:56:00,4.166666666666667,82.0,tstorms,75,23.0,198,19.0 2344857,Male,2014-06-30 08:25:00,2014-06-30 08:35:00,10.116666666666667,75.0,cloudy,77,23.0,37,19.0 2338197,Male,2014-06-29 17:51:00,2014-06-29 18:09:00,18.766666666666666,84.9,cloudy,177,15.0,99,19.0 2349939,Male,2014-06-30 15:24:00,2014-06-30 15:30:00,5.4,84.9,cloudy,72,15.0,338,15.0 2347092,Male,2014-06-30 11:22:00,2014-06-30 11:32:00,9.733333333333333,79.0,cloudy,110,23.0,194,11.0 2347136,Female,2014-06-30 11:26:00,2014-06-30 11:31:00,4.966666666666667,79.0,cloudy,74,23.0,181,31.0 2342887,Male,2014-06-30 00:38:00,2014-06-30 00:43:00,5.616666666666666,78.1,cloudy,226,15.0,300,15.0 2344767,Female,2014-06-30 08:20:00,2014-06-30 08:41:00,21.116666666666667,75.0,cloudy,220,19.0,173,15.0 2351335,Male,2014-06-30 16:47:00,2014-06-30 16:53:00,6.1,84.0,cloudy,51,31.0,192,39.0 2348169,Male,2014-06-30 12:54:00,2014-06-30 13:02:00,8.4,82.0,cloudy,66,19.0,110,23.0 2354487,Male,2014-06-30 18:56:00,2014-06-30 19:05:00,8.833333333333334,82.0,tstorms,118,19.0,34,15.0 2345814,Male,2014-06-30 09:13:00,2014-06-30 09:30:00,16.916666666666668,78.1,cloudy,24,15.0,90,35.0 2344619,Male,2014-06-30 08:14:00,2014-06-30 08:38:00,23.66666666666667,75.0,cloudy,131,15.0,110,23.0 2336070,Female,2014-06-29 16:16:00,2014-06-29 16:36:00,19.983333333333334,84.9,cloudy,97,35.0,137,15.0 2353002,Male,2014-06-30 17:40:00,2014-06-30 17:46:00,5.133333333333334,84.0,cloudy,210,19.0,183,15.0 2334944,Male,2014-06-29 15:33:00,2014-06-29 16:09:00,35.65,82.9,cloudy,249,15.0,234,19.0 2352711,Male,2014-06-30 17:31:00,2014-06-30 17:41:00,9.916666666666666,84.0,cloudy,212,31.0,192,39.0 2346848,Male,2014-06-30 10:55:00,2014-06-30 11:02:00,7.116666666666666,78.1,cloudy,240,23.0,117,23.0 2334688,Male,2014-06-29 15:23:00,2014-06-29 15:46:00,23.466666666666665,82.9,cloudy,324,15.0,85,23.0 2346252,Female,2014-06-30 09:50:00,2014-06-30 09:58:00,8.016666666666667,78.1,cloudy,144,15.0,60,19.0 2343617,Male,2014-06-30 07:16:00,2014-06-30 07:22:00,5.85,73.0,cloudy,292,11.0,229,19.0 2344957,Male,2014-06-30 08:29:00,2014-06-30 08:40:00,11.433333333333335,75.0,cloudy,232,23.0,251,15.0 2339764,Male,2014-06-29 19:12:00,2014-06-29 19:28:00,16.116666666666667,82.0,cloudy,164,23.0,30,15.0 2339479,Female,2014-06-29 18:54:00,2014-06-29 19:13:00,18.666666666666668,84.2,cloudy,225,15.0,157,15.0 2344240,Female,2014-06-30 07:52:00,2014-06-30 08:01:00,9.35,73.0,cloudy,310,11.0,87,19.0 2351425,Female,2014-06-30 16:50:00,2014-06-30 16:52:00,2.083333333333333,84.0,cloudy,314,15.0,244,19.0 2351605,Male,2014-06-30 16:53:00,2014-06-30 17:05:00,11.95,84.0,cloudy,120,15.0,279,15.0 2334617,Male,2014-06-29 15:21:00,2014-06-29 15:59:00,38.05,82.9,cloudy,346,15.0,215,15.0 2338547,Male,2014-06-29 18:07:00,2014-06-29 18:21:00,14.466666666666667,84.2,cloudy,176,19.0,71,15.0 2340148,Male,2014-06-29 19:33:00,2014-06-29 19:41:00,7.466666666666668,82.0,cloudy,94,19.0,127,15.0 2354544,Male,2014-06-30 19:02:00,2014-06-30 19:09:00,6.716666666666668,73.0,tstorms,344,15.0,234,19.0 2354549,Male,2014-06-30 19:03:00,2014-06-30 19:09:00,6.65,73.0,tstorms,114,27.0,347,15.0 2343237,Male,2014-06-30 06:35:00,2014-06-30 06:52:00,17.6,73.0,cloudy,168,19.0,76,39.0 2353805,Male,2014-06-30 18:14:00,2014-06-30 18:19:00,5.633333333333334,82.0,tstorms,91,31.0,80,19.0 2345494,Female,2014-06-30 08:55:00,2014-06-30 09:05:00,9.933333333333334,75.0,cloudy,192,39.0,43,43.0 2345516,Male,2014-06-30 08:55:00,2014-06-30 09:00:00,5.166666666666667,75.0,cloudy,77,23.0,80,19.0 2349455,Female,2014-06-30 14:44:00,2014-06-30 15:04:00,19.85,87.1,cloudy,71,15.0,291,19.0 2352905,Male,2014-06-30 17:38:00,2014-06-30 18:01:00,23.4,84.0,cloudy,90,35.0,274,15.0 2349049,Male,2014-06-30 14:10:00,2014-06-30 14:24:00,13.366666666666667,87.1,cloudy,44,27.0,198,19.0 2333292,Male,2014-06-29 14:34:00,2014-06-29 14:49:00,15.1,84.0,cloudy,115,23.0,165,19.0 2342336,Male,2014-06-29 22:28:00,2014-06-29 22:38:00,9.45,78.1,cloudy,154,15.0,246,11.0 2345149,Male,2014-06-30 08:38:00,2014-06-30 08:47:00,9.3,75.0,cloudy,59,19.0,170,15.0 2338660,Female,2014-06-29 18:12:00,2014-06-29 18:43:00,31.0,84.2,cloudy,177,15.0,332,15.0 2341225,Male,2014-06-29 20:39:00,2014-06-29 21:14:00,35.016666666666666,81.0,cloudy,85,23.0,14,15.0 2343302,Female,2014-06-30 06:41:00,2014-06-30 06:48:00,6.8,73.0,cloudy,276,11.0,69,19.0 2344562,Male,2014-06-30 08:12:00,2014-06-30 08:18:00,6.65,75.0,cloudy,43,43.0,174,23.0 2343592,Female,2014-06-30 07:09:00,2014-06-30 07:36:00,26.65,73.0,cloudy,297,15.0,93,15.0 2344473,Male,2014-06-30 08:06:00,2014-06-30 08:13:00,6.45,75.0,cloudy,287,27.0,91,31.0 2350673,Male,2014-06-30 16:12:00,2014-06-30 16:25:00,12.133333333333333,84.0,cloudy,51,31.0,301,19.0 2353814,Male,2014-06-30 18:14:00,2014-06-30 18:29:00,15.216666666666667,82.0,tstorms,168,19.0,43,43.0 2332398,Female,2014-06-29 14:04:00,2014-06-29 14:10:00,5.766666666666668,84.0,cloudy,209,11.0,120,15.0 2334744,Male,2014-06-29 15:26:00,2014-06-29 15:34:00,8.25,82.9,cloudy,198,19.0,66,19.0 2348254,Male,2014-06-30 13:03:00,2014-06-30 13:14:00,11.716666666666667,84.9,cloudy,318,15.0,311,15.0 2343661,Male,2014-06-30 07:20:00,2014-06-30 07:30:00,10.516666666666667,73.0,cloudy,15,15.0,280,11.0 2353389,Male,2014-06-30 17:55:00,2014-06-30 18:02:00,6.8,84.0,cloudy,210,19.0,305,15.0 2348103,Female,2014-06-30 12:50:00,2014-06-30 12:56:00,5.9,82.0,cloudy,113,15.0,331,19.0 2353703,Male,2014-06-30 18:09:00,2014-06-30 18:32:00,23.48333333333333,82.0,tstorms,52,31.0,16,11.0 2343517,Male,2014-06-30 07:08:00,2014-06-30 07:18:00,10.016666666666667,73.0,cloudy,50,27.0,195,31.0 2351496,Female,2014-06-30 16:52:00,2014-06-30 16:59:00,6.55,84.0,cloudy,244,19.0,308,11.0 2332643,Female,2014-06-29 14:11:00,2014-06-29 14:20:00,9.166666666666666,84.0,cloudy,291,19.0,212,31.0 2352918,Female,2014-06-30 17:38:00,2014-06-30 17:49:00,11.366666666666667,84.0,cloudy,174,23.0,90,35.0 2345454,Male,2014-06-30 08:52:00,2014-06-30 08:58:00,6.0,75.0,cloudy,36,31.0,100,23.0 2352036,Female,2014-06-30 17:08:00,2014-06-30 17:13:00,4.733333333333333,84.0,cloudy,130,15.0,16,11.0 2340128,Male,2014-06-29 19:32:00,2014-06-29 19:49:00,17.583333333333332,82.0,cloudy,76,39.0,341,19.0 2352250,Male,2014-06-30 17:15:00,2014-06-30 17:20:00,5.15,84.0,cloudy,118,19.0,288,11.0 2344345,Male,2014-06-30 08:00:00,2014-06-30 08:07:00,7.216666666666668,75.0,cloudy,37,19.0,194,11.0 2338757,Male,2014-06-29 18:18:00,2014-06-29 18:34:00,15.5,84.2,cloudy,174,23.0,22,15.0 2343113,Male,2014-06-30 06:02:00,2014-06-30 06:06:00,4.033333333333333,73.0,cloudy,153,19.0,115,23.0 2337013,Female,2014-06-29 16:54:00,2014-06-29 17:20:00,25.7,84.9,cloudy,118,19.0,326,11.0 2339012,Female,2014-06-29 18:31:00,2014-06-29 19:10:00,38.38333333333333,84.2,cloudy,34,15.0,114,27.0 2343454,Male,2014-06-30 07:02:00,2014-06-30 07:06:00,4.633333333333334,73.0,cloudy,69,19.0,160,15.0 2332706,Female,2014-06-29 14:14:00,2014-06-29 14:17:00,3.4166666666666665,84.0,cloudy,302,19.0,152,15.0 2353305,Male,2014-06-30 17:51:00,2014-06-30 17:56:00,5.0,84.0,cloudy,195,31.0,81,39.0 2344660,Male,2014-06-30 08:16:00,2014-06-30 08:24:00,8.55,75.0,cloudy,191,23.0,181,31.0 2352761,Male,2014-06-30 17:33:00,2014-06-30 17:40:00,7.2,84.0,cloudy,71,15.0,75,23.0 2353277,Male,2014-06-30 17:50:00,2014-06-30 18:08:00,17.616666666666667,84.0,cloudy,198,19.0,183,15.0 2340101,Male,2014-06-29 19:30:00,2014-06-29 19:48:00,18.366666666666667,82.0,cloudy,286,23.0,130,15.0 2351677,Female,2014-06-30 16:57:00,2014-06-30 17:07:00,9.466666666666667,84.0,cloudy,261,15.0,21,15.0 2346809,Male,2014-06-30 10:52:00,2014-06-30 11:08:00,16.4,78.1,cloudy,303,15.0,238,15.0 2351366,Male,2014-06-30 16:48:00,2014-06-30 17:12:00,23.83333333333333,84.0,cloudy,126,15.0,158,15.0 2337456,Female,2014-06-29 17:14:00,2014-06-29 17:17:00,3.2666666666666666,84.9,cloudy,219,11.0,310,11.0 2345074,Male,2014-06-30 08:34:00,2014-06-30 08:38:00,3.966666666666667,75.0,cloudy,272,11.0,147,15.0 2347405,Male,2014-06-30 11:47:00,2014-06-30 11:54:00,6.4,79.0,cloudy,19,15.0,342,15.0 2339183,Male,2014-06-29 18:41:00,2014-06-29 19:00:00,19.233333333333334,84.2,cloudy,177,15.0,26,31.0 2352683,Female,2014-06-30 17:28:00,2014-06-30 17:47:00,19.683333333333334,84.0,cloudy,91,31.0,255,31.0 2347624,Male,2014-06-30 12:09:00,2014-06-30 12:20:00,11.8,82.0,cloudy,112,15.0,53,19.0 2338311,Female,2014-06-29 17:57:00,2014-06-29 18:11:00,14.2,84.9,cloudy,56,19.0,57,15.0 2351400,Male,2014-06-30 16:50:00,2014-06-30 17:04:00,14.583333333333336,84.0,cloudy,106,27.0,91,31.0 2351143,Male,2014-06-30 16:38:00,2014-06-30 16:45:00,7.216666666666668,84.0,cloudy,264,19.0,164,23.0 2339778,Female,2014-06-29 19:13:00,2014-06-29 19:21:00,8.016666666666667,82.0,cloudy,344,15.0,297,15.0 2334632,Male,2014-06-29 15:22:00,2014-06-29 15:37:00,15.033333333333333,82.9,cloudy,334,19.0,289,19.0 2350917,Male,2014-06-30 16:27:00,2014-06-30 16:29:00,2.066666666666667,84.0,cloudy,152,15.0,302,19.0 2341760,Female,2014-06-29 21:20:00,2014-06-29 21:26:00,6.216666666666668,79.0,cloudy,300,15.0,329,15.0 2332198,Male,2014-06-29 13:56:00,2014-06-29 14:12:00,15.716666666666667,82.9,cloudy,315,11.0,290,15.0 2344977,Male,2014-06-30 08:30:00,2014-06-30 08:34:00,3.95,75.0,cloudy,28,15.0,118,19.0 2352320,Female,2014-06-30 17:17:00,2014-06-30 17:45:00,27.73333333333333,84.0,cloudy,249,15.0,324,15.0 2338104,Male,2014-06-29 17:44:00,2014-06-29 18:04:00,19.9,84.9,cloudy,165,19.0,141,23.0 2341930,Female,2014-06-29 21:36:00,2014-06-29 21:47:00,11.2,79.0,cloudy,268,15.0,113,15.0 2348512,Female,2014-06-30 13:25:00,2014-06-30 13:36:00,10.166666666666666,84.9,cloudy,20,15.0,92,19.0 2352406,Male,2014-06-30 17:20:00,2014-06-30 17:25:00,4.733333333333333,84.0,cloudy,284,23.0,321,19.0 2338071,Male,2014-06-29 17:43:00,2014-06-29 18:08:00,25.08333333333333,84.9,cloudy,16,11.0,340,15.0 2352448,Male,2014-06-30 17:21:00,2014-06-30 17:48:00,27.0,84.0,cloudy,164,23.0,15,15.0 2343943,Male,2014-06-30 07:39:00,2014-06-30 07:50:00,11.316666666666665,73.0,cloudy,301,19.0,49,27.0 2352087,Male,2014-06-30 17:07:00,2014-06-30 17:23:00,16.05,84.0,cloudy,91,31.0,138,15.0 2339857,Male,2014-06-29 19:17:00,2014-06-29 19:36:00,19.533333333333328,82.0,cloudy,117,23.0,324,15.0 2332104,Female,2014-06-29 13:54:00,2014-06-29 14:17:00,23.5,82.9,cloudy,277,15.0,199,15.0 2350106,Male,2014-06-30 15:35:00,2014-06-30 15:51:00,16.366666666666667,84.9,cloudy,33,27.0,84,19.0 2344762,Male,2014-06-30 08:20:00,2014-06-30 08:29:00,8.566666666666666,75.0,cloudy,43,43.0,174,23.0 2351014,Female,2014-06-30 16:31:00,2014-06-30 16:43:00,12.25,84.0,cloudy,110,23.0,192,39.0 2338425,Female,2014-06-29 18:02:00,2014-06-29 18:14:00,11.483333333333333,84.2,cloudy,255,31.0,90,35.0 2343236,Female,2014-06-30 06:35:00,2014-06-30 06:40:00,5.016666666666667,73.0,cloudy,190,15.0,67,15.0 2339713,Female,2014-06-29 19:09:00,2014-06-29 19:21:00,11.316666666666665,82.0,cloudy,302,19.0,230,19.0 2331669,Female,2014-06-29 13:38:00,2014-06-29 13:52:00,13.916666666666664,82.9,cloudy,13,19.0,20,15.0 2353506,Male,2014-06-30 18:00:00,2014-06-30 18:09:00,9.416666666666666,82.0,tstorms,177,15.0,156,15.0 2352319,Female,2014-06-30 17:17:00,2014-06-30 17:26:00,9.35,84.0,cloudy,43,43.0,5,19.0 2352719,Male,2014-06-30 17:31:00,2014-06-30 17:37:00,5.866666666666666,84.0,cloudy,138,15.0,289,19.0 2336553,Female,2014-06-29 16:36:00,2014-06-29 16:48:00,12.416666666666664,84.9,cloudy,332,15.0,250,19.0 2353056,Female,2014-06-30 17:42:00,2014-06-30 17:51:00,8.766666666666667,84.0,cloudy,176,19.0,94,19.0 2335260,Male,2014-06-29 15:47:00,2014-06-29 16:13:00,26.1,82.9,cloudy,264,19.0,268,15.0 2351678,Female,2014-06-30 16:58:00,2014-06-30 17:01:00,3.333333333333333,84.0,cloudy,213,15.0,159,9.0 2340477,Male,2014-06-29 19:51:00,2014-06-29 20:05:00,13.916666666666664,82.0,cloudy,327,19.0,299,15.0 2341171,Male,2014-06-29 20:35:00,2014-06-29 20:46:00,10.983333333333333,81.0,cloudy,93,15.0,153,19.0 2350877,Female,2014-06-30 16:25:00,2014-06-30 16:40:00,14.716666666666667,84.0,cloudy,137,15.0,280,11.0 2351710,Male,2014-06-30 16:59:00,2014-06-30 17:03:00,4.633333333333334,84.0,cloudy,37,19.0,192,39.0 2334946,Male,2014-06-29 15:33:00,2014-06-29 15:47:00,13.3,82.9,cloudy,343,15.0,177,15.0 2346480,Male,2014-06-30 10:17:00,2014-06-30 10:42:00,24.88333333333333,78.1,cloudy,272,11.0,284,23.0 2335266,Female,2014-06-29 15:47:00,2014-06-29 15:57:00,9.633333333333333,82.9,cloudy,343,15.0,93,15.0 2351856,Male,2014-06-30 17:04:00,2014-06-30 17:13:00,9.333333333333334,84.0,cloudy,195,31.0,91,31.0 2339206,Female,2014-06-29 18:42:00,2014-06-29 19:05:00,23.65,84.2,cloudy,176,19.0,329,15.0 2343736,Male,2014-06-30 07:25:00,2014-06-30 07:37:00,11.983333333333333,73.0,cloudy,291,19.0,52,31.0 2342166,Female,2014-06-29 22:03:00,2014-06-29 22:10:00,6.6,78.1,cloudy,326,11.0,242,15.0 2347637,Male,2014-06-30 12:09:00,2014-06-30 12:22:00,12.55,82.0,cloudy,24,15.0,91,31.0 2351226,Male,2014-06-30 16:42:00,2014-06-30 17:00:00,17.266666666666666,84.0,cloudy,51,31.0,61,15.0 2346964,Male,2014-06-30 11:09:00,2014-06-30 11:13:00,4.066666666666666,79.0,cloudy,196,19.0,47,19.0 2346583,Male,2014-06-30 10:31:00,2014-06-30 10:46:00,14.5,78.1,cloudy,207,15.0,108,19.0 2346569,Male,2014-06-30 10:30:00,2014-06-30 10:56:00,25.73333333333333,78.1,cloudy,313,19.0,313,19.0 2340978,Male,2014-06-29 20:22:00,2014-06-29 20:41:00,19.016666666666666,81.0,cloudy,268,15.0,268,15.0 2336751,Male,2014-06-29 16:44:00,2014-06-29 16:53:00,8.683333333333334,84.9,cloudy,301,19.0,94,19.0 2338598,Male,2014-06-29 18:08:00,2014-06-29 18:17:00,8.316666666666666,84.2,cloudy,330,19.0,114,27.0 2333013,Male,2014-06-29 14:24:00,2014-06-29 14:33:00,8.733333333333333,84.0,cloudy,250,19.0,156,15.0 2345612,Male,2014-06-30 08:59:00,2014-06-30 09:28:00,29.11666666666667,75.0,cloudy,119,19.0,20,15.0 2341697,Female,2014-06-29 21:13:00,2014-06-29 21:23:00,10.133333333333333,79.0,cloudy,144,15.0,115,23.0 2346246,Male,2014-06-30 09:50:00,2014-06-30 10:04:00,14.4,78.1,cloudy,168,19.0,287,27.0 2352797,Male,2014-06-30 17:34:00,2014-06-30 17:43:00,8.516666666666667,84.0,cloudy,286,23.0,90,35.0 2351388,Male,2014-06-30 16:49:00,2014-06-30 17:09:00,19.866666666666667,84.0,cloudy,66,19.0,273,15.0 2342788,Male,2014-06-29 23:53:00,2014-06-30 00:06:00,12.8,78.1,cloudy,67,15.0,117,23.0 2331967,Male,2014-06-29 13:49:00,2014-06-29 13:53:00,4.633333333333334,82.9,cloudy,195,31.0,51,31.0 2343373,Male,2014-06-30 06:49:00,2014-06-30 07:00:00,10.533333333333333,73.0,cloudy,174,23.0,26,31.0 2345782,Male,2014-06-30 09:11:00,2014-06-30 09:23:00,11.333333333333336,78.1,cloudy,199,15.0,283,23.0 2351848,Male,2014-06-30 17:03:00,2014-06-30 17:26:00,23.266666666666666,84.0,cloudy,286,23.0,25,23.0 2351827,Male,2014-06-30 17:03:00,2014-06-30 17:06:00,3.6666666666666665,84.0,cloudy,134,19.0,192,39.0 2353711,Male,2014-06-30 18:09:00,2014-06-30 18:19:00,9.3,82.0,tstorms,69,19.0,123,15.0 2351929,Male,2014-06-30 17:06:00,2014-06-30 17:12:00,5.783333333333332,84.0,cloudy,158,15.0,16,11.0 2351752,Male,2014-06-30 16:57:00,2014-06-30 17:18:00,21.133333333333333,84.0,cloudy,75,23.0,305,15.0 2343398,Male,2014-06-30 06:53:00,2014-06-30 06:57:00,3.566666666666667,73.0,cloudy,192,39.0,283,23.0 2343962,Male,2014-06-30 07:38:00,2014-06-30 07:40:00,2.3,73.0,cloudy,93,15.0,60,19.0 2344075,Male,2014-06-30 07:47:00,2014-06-30 07:54:00,6.85,73.0,cloudy,66,19.0,47,19.0 2332299,Male,2014-06-29 14:00:00,2014-06-29 14:17:00,16.333333333333332,84.0,cloudy,177,15.0,249,15.0 2343187,Male,2014-06-30 06:28:00,2014-06-30 06:38:00,10.033333333333333,73.0,cloudy,190,15.0,20,15.0 2344731,Male,2014-06-30 08:20:00,2014-06-30 08:32:00,12.45,75.0,cloudy,75,23.0,51,31.0 2350115,Male,2014-06-30 15:35:00,2014-06-30 15:56:00,21.48333333333333,84.9,cloudy,36,31.0,350,15.0 2350788,Male,2014-06-30 16:20:00,2014-06-30 16:32:00,11.95,84.0,cloudy,149,11.0,149,11.0 2344797,Male,2014-06-30 08:22:00,2014-06-30 08:25:00,3.3,75.0,cloudy,316,19.0,344,15.0 2342324,Male,2014-06-29 22:26:00,2014-06-29 22:38:00,11.233333333333333,78.1,cloudy,120,15.0,280,11.0 2333178,Female,2014-06-29 14:30:00,2014-06-29 14:53:00,23.08333333333333,84.0,cloudy,150,11.0,247,15.0 2346655,Male,2014-06-30 10:37:00,2014-06-30 11:23:00,46.48333333333333,78.1,cloudy,157,15.0,164,23.0 2343777,Male,2014-06-30 07:29:00,2014-06-30 07:45:00,15.7,73.0,cloudy,192,39.0,120,15.0 2354481,Female,2014-06-30 18:55:00,2014-06-30 19:19:00,23.9,82.0,tstorms,232,23.0,156,15.0 2351837,Male,2014-06-30 17:03:00,2014-06-30 17:19:00,15.733333333333333,84.0,cloudy,28,15.0,350,15.0 2350694,Male,2014-06-30 16:14:00,2014-06-30 16:18:00,4.5,84.0,cloudy,181,31.0,111,19.0 2333345,Male,2014-06-29 14:36:00,2014-06-29 14:57:00,20.933333333333334,84.0,cloudy,177,15.0,312,15.0 2352571,Male,2014-06-30 17:26:00,2014-06-30 17:38:00,12.366666666666667,84.0,cloudy,93,15.0,258,19.0 2351868,Male,2014-06-30 17:04:00,2014-06-30 17:08:00,4.116666666666666,84.0,cloudy,195,31.0,43,43.0 2347621,Male,2014-06-30 12:09:00,2014-06-30 12:33:00,24.86666666666667,82.0,cloudy,77,23.0,301,19.0 2353457,Male,2014-06-30 17:58:00,2014-06-30 18:08:00,9.9,84.0,cloudy,152,15.0,227,15.0 2348064,Male,2014-06-30 12:47:00,2014-06-30 12:54:00,6.966666666666668,82.0,cloudy,198,19.0,84,19.0 2350322,Female,2014-06-30 15:50:00,2014-06-30 16:03:00,12.55,84.9,cloudy,100,23.0,186,15.0 2343897,Male,2014-06-30 07:37:00,2014-06-30 07:54:00,17.2,73.0,cloudy,220,19.0,53,19.0 2339298,Male,2014-06-29 18:46:00,2014-06-29 19:01:00,14.45,84.2,cloudy,260,19.0,130,15.0 2344057,Female,2014-06-30 07:46:00,2014-06-30 07:52:00,5.7,73.0,cloudy,239,15.0,344,15.0 2344853,Male,2014-06-30 08:25:00,2014-06-30 08:39:00,14.433333333333335,75.0,cloudy,48,27.0,134,19.0 2352075,Male,2014-06-30 17:10:00,2014-06-30 17:18:00,8.416666666666666,84.0,cloudy,43,43.0,174,23.0 2350492,Male,2014-06-30 16:01:00,2014-06-30 16:27:00,26.45,84.0,cloudy,100,23.0,127,15.0 2354454,Female,2014-06-30 18:53:00,2014-06-30 19:09:00,16.133333333333333,82.0,tstorms,17,15.0,305,15.0 2337105,Male,2014-06-29 16:59:00,2014-06-29 17:23:00,24.216666666666665,84.9,cloudy,177,15.0,177,15.0 2340733,Male,2014-06-29 20:04:00,2014-06-29 20:20:00,15.333333333333336,81.0,cloudy,35,39.0,45,15.0 2334807,Male,2014-06-29 15:28:00,2014-06-29 15:36:00,7.65,82.9,cloudy,205,15.0,14,15.0 2351822,Male,2014-06-30 17:03:00,2014-06-30 17:15:00,12.516666666666667,84.0,cloudy,261,15.0,77,23.0 2343839,Male,2014-06-30 07:34:00,2014-06-30 07:40:00,5.916666666666668,73.0,cloudy,165,19.0,117,23.0 2344144,Male,2014-06-30 07:50:00,2014-06-30 07:55:00,5.1,73.0,cloudy,130,15.0,213,15.0 2340841,Male,2014-06-29 20:12:00,2014-06-29 20:21:00,9.45,81.0,cloudy,174,23.0,22,15.0 2345813,Male,2014-06-30 09:13:00,2014-06-30 09:22:00,9.2,78.1,cloudy,66,19.0,48,27.0 2340464,Male,2014-06-29 19:50:00,2014-06-29 19:59:00,8.116666666666667,82.0,cloudy,110,23.0,26,31.0 2347532,Male,2014-06-30 12:01:00,2014-06-30 12:14:00,13.3,82.0,cloudy,51,31.0,255,31.0 2345015,Male,2014-06-30 08:31:00,2014-06-30 08:58:00,26.66666666666667,75.0,cloudy,94,19.0,174,23.0 2338571,Female,2014-06-29 18:08:00,2014-06-29 18:28:00,20.45,84.2,cloudy,258,19.0,289,19.0 2352362,Male,2014-06-30 17:19:00,2014-06-30 17:30:00,11.433333333333335,84.0,cloudy,100,23.0,175,19.0 2353464,Male,2014-06-30 17:58:00,2014-06-30 18:02:00,3.616666666666666,84.0,cloudy,69,19.0,315,11.0 2353853,Female,2014-06-30 18:16:00,2014-06-30 18:23:00,6.666666666666668,82.0,tstorms,113,15.0,144,15.0 2352361,Male,2014-06-30 17:18:00,2014-06-30 17:34:00,15.35,84.0,cloudy,287,27.0,28,15.0 2337845,Female,2014-06-29 17:32:00,2014-06-29 17:37:00,4.65,84.9,cloudy,17,15.0,183,15.0 2345287,Male,2014-06-30 08:43:00,2014-06-30 08:47:00,3.583333333333333,75.0,cloudy,343,15.0,67,15.0 2346267,Male,2014-06-30 09:53:00,2014-06-30 10:13:00,20.33333333333333,78.1,cloudy,141,23.0,37,19.0 2335819,Male,2014-06-29 16:08:00,2014-06-29 16:21:00,12.866666666666667,84.9,cloudy,289,19.0,152,15.0 2354722,Male,2014-06-30 19:53:00,2014-06-30 20:04:00,11.2,73.0,tstorms,135,11.0,278,15.0 2339292,Female,2014-06-29 18:46:00,2014-06-29 18:57:00,11.2,84.2,cloudy,274,15.0,57,15.0 2346354,Male,2014-06-30 10:05:00,2014-06-30 10:15:00,10.15,78.1,cloudy,146,11.0,50,27.0 2347951,Female,2014-06-30 12:37:00,2014-06-30 13:05:00,27.53333333333333,82.0,cloudy,196,19.0,349,15.0 2339736,Male,2014-06-29 19:11:00,2014-06-29 19:24:00,13.733333333333333,82.0,cloudy,198,19.0,261,15.0 2335941,Male,2014-06-29 16:12:00,2014-06-29 16:29:00,16.583333333333332,84.9,cloudy,97,35.0,35,39.0 2349387,Female,2014-06-30 14:38:00,2014-06-30 14:52:00,13.566666666666665,87.1,cloudy,37,19.0,59,19.0 2352072,Female,2014-06-30 17:10:00,2014-06-30 17:17:00,7.333333333333332,84.0,cloudy,98,15.0,321,19.0 2353726,Female,2014-06-30 18:06:00,2014-06-30 18:13:00,7.25,82.0,tstorms,58,19.0,210,19.0 2332642,Female,2014-06-29 14:11:00,2014-06-29 14:20:00,8.85,84.0,cloudy,315,11.0,128,15.0 2354460,Male,2014-06-30 18:54:00,2014-06-30 18:59:00,5.416666666666668,82.0,tstorms,51,31.0,52,31.0 2332204,Male,2014-06-29 13:57:00,2014-06-29 14:12:00,15.833333333333336,82.9,cloudy,291,19.0,13,19.0 2340677,Female,2014-06-29 20:02:00,2014-06-29 20:06:00,4.466666666666667,81.0,cloudy,181,31.0,110,23.0 2340045,Male,2014-06-29 19:27:00,2014-06-29 19:46:00,18.566666666666666,82.0,cloudy,233,15.0,61,15.0 2336433,Female,2014-06-29 16:31:00,2014-06-29 16:40:00,9.416666666666666,84.9,cloudy,260,19.0,259,15.0 2332489,Female,2014-06-29 14:07:00,2014-06-29 14:26:00,19.016666666666666,84.0,cloudy,76,39.0,273,15.0 2351029,Male,2014-06-30 16:32:00,2014-06-30 16:42:00,10.15,84.0,cloudy,110,23.0,91,31.0 2352926,Male,2014-06-30 17:38:00,2014-06-30 17:54:00,15.616666666666667,84.0,cloudy,199,15.0,60,19.0 2351736,Female,2014-06-30 17:00:00,2014-06-30 17:19:00,19.2,84.0,cloudy,100,23.0,340,15.0 2343715,Male,2014-06-30 07:24:00,2014-06-30 07:34:00,10.266666666666667,73.0,cloudy,91,31.0,195,31.0 2352847,Male,2014-06-30 17:36:00,2014-06-30 17:45:00,9.033333333333333,84.0,cloudy,286,23.0,91,31.0 2351793,Female,2014-06-30 17:01:00,2014-06-30 17:17:00,15.916666666666664,84.0,cloudy,69,19.0,228,11.0 2347166,Male,2014-06-30 11:29:00,2014-06-30 11:36:00,7.3,79.0,cloudy,236,15.0,48,27.0 2350257,Male,2014-06-30 15:46:00,2014-06-30 15:52:00,6.283333333333332,84.9,cloudy,250,19.0,115,23.0 2351478,Male,2014-06-30 16:52:00,2014-06-30 17:04:00,11.55,84.0,cloudy,48,27.0,192,39.0 2345866,Male,2014-06-30 09:16:00,2014-06-30 09:22:00,6.516666666666668,78.1,cloudy,77,23.0,37,19.0 2335695,Male,2014-06-29 15:51:00,2014-06-29 16:03:00,11.95,82.9,cloudy,254,15.0,256,15.0 2338304,Male,2014-06-29 17:56:00,2014-06-29 18:11:00,14.683333333333335,84.9,cloudy,51,31.0,268,15.0 2346323,Female,2014-06-30 09:59:00,2014-06-30 10:52:00,52.51666666666666,78.1,cloudy,294,15.0,35,39.0 2350321,Female,2014-06-30 15:50:00,2014-06-30 16:08:00,17.85,84.9,cloudy,173,15.0,91,31.0 2354762,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 2342510,Male,2014-06-29 22:54:00,2014-06-29 23:07:00,12.75,78.1,cloudy,93,15.0,228,11.0 2347885,Male,2014-06-30 12:32:00,2014-06-30 12:46:00,13.916666666666664,82.0,cloudy,100,23.0,35,39.0 2337576,Male,2014-06-29 17:20:00,2014-06-29 17:46:00,26.18333333333333,84.9,cloudy,334,19.0,118,19.0 2349426,Male,2014-06-30 14:42:00,2014-06-30 14:56:00,14.7,87.1,cloudy,176,19.0,127,15.0 2353938,Male,2014-06-30 18:21:00,2014-06-30 18:33:00,11.95,82.0,tstorms,316,19.0,242,15.0 2342152,Male,2014-06-29 22:02:00,2014-06-29 22:18:00,16.533333333333335,78.1,cloudy,59,19.0,15,15.0 2344840,Male,2014-06-30 08:24:00,2014-06-30 08:32:00,8.516666666666667,75.0,cloudy,192,39.0,32,19.0 2345628,Female,2014-06-30 09:02:00,2014-06-30 09:16:00,14.4,78.1,cloudy,329,15.0,301,19.0 2351063,Female,2014-06-30 16:33:00,2014-06-30 16:43:00,10.05,84.0,cloudy,317,15.0,21,15.0 2338694,Male,2014-06-29 18:14:00,2014-06-29 18:26:00,12.116666666666667,84.2,cloudy,46,19.0,286,23.0 2354535,Male,2014-06-30 19:01:00,2014-06-30 19:08:00,6.2333333333333325,73.0,tstorms,81,39.0,181,31.0 2345366,Female,2014-06-30 08:47:00,2014-06-30 09:15:00,27.63333333333333,75.0,cloudy,157,15.0,100,23.0 2354086,Male,2014-06-30 18:30:00,2014-06-30 18:46:00,16.7,82.0,tstorms,177,15.0,251,15.0 2349564,Female,2014-06-30 14:55:00,2014-06-30 15:02:00,7.566666666666666,87.1,cloudy,175,19.0,283,23.0 2348380,Male,2014-06-30 13:13:00,2014-06-30 13:33:00,19.7,84.9,cloudy,160,15.0,160,15.0 2345755,Male,2014-06-30 09:10:00,2014-06-30 09:13:00,2.8,78.1,cloudy,289,19.0,118,19.0 2344779,Female,2014-06-30 08:21:00,2014-06-30 08:35:00,14.133333333333333,75.0,cloudy,46,19.0,37,19.0 2333051,Female,2014-06-29 14:25:00,2014-06-29 14:40:00,14.883333333333333,84.0,cloudy,177,15.0,232,23.0 2345070,Male,2014-06-30 08:33:00,2014-06-30 08:54:00,20.733333333333334,75.0,cloudy,334,19.0,106,27.0 2349711,Female,2014-06-30 15:06:00,2014-06-30 15:09:00,2.533333333333333,84.9,cloudy,254,15.0,240,23.0 2336947,Male,2014-06-29 16:52:00,2014-06-29 17:09:00,16.883333333333333,84.9,cloudy,303,15.0,332,15.0 2351463,Male,2014-06-30 16:52:00,2014-06-30 17:02:00,9.783333333333333,84.0,cloudy,134,19.0,54,19.0 2341668,Male,2014-06-29 21:11:00,2014-06-29 21:30:00,18.5,79.0,cloudy,260,19.0,123,15.0 2354526,Male,2014-06-30 19:00:00,2014-06-30 19:12:00,11.683333333333335,73.0,tstorms,301,19.0,324,15.0 2343491,Female,2014-06-30 07:04:00,2014-06-30 07:19:00,14.716666666666667,73.0,cloudy,236,15.0,98,15.0 2353858,Male,2014-06-30 18:16:00,2014-06-30 18:30:00,13.883333333333333,82.0,tstorms,287,27.0,27,19.0 2353221,Male,2014-06-30 17:48:00,2014-06-30 17:51:00,3.2666666666666666,84.0,cloudy,67,15.0,343,15.0 2349165,Female,2014-06-30 14:19:00,2014-06-30 14:42:00,22.68333333333333,87.1,cloudy,311,15.0,13,19.0 2347569,Male,2014-06-30 12:02:00,2014-06-30 12:06:00,3.683333333333333,82.0,cloudy,291,19.0,176,19.0 2333650,Male,2014-06-29 14:46:00,2014-06-29 15:04:00,17.283333333333335,84.0,cloudy,141,23.0,153,19.0 2333882,Male,2014-06-29 14:55:00,2014-06-29 15:18:00,23.11666666666667,84.0,cloudy,282,15.0,331,19.0 2341182,Female,2014-06-29 20:35:00,2014-06-29 20:48:00,13.016666666666667,81.0,cloudy,334,19.0,141,23.0 2353666,Male,2014-06-30 18:07:00,2014-06-30 18:14:00,6.55,82.0,tstorms,52,31.0,174,23.0 2339126,Female,2014-06-29 18:37:00,2014-06-29 18:54:00,17.266666666666666,84.2,cloudy,48,27.0,156,15.0 2349638,Male,2014-06-30 15:00:00,2014-06-30 15:15:00,14.516666666666667,84.9,cloudy,196,19.0,174,23.0 2334781,Female,2014-06-29 15:27:00,2014-06-29 15:49:00,21.9,82.9,cloudy,219,11.0,342,15.0 2336401,Female,2014-06-29 16:29:00,2014-06-29 16:46:00,16.283333333333335,84.9,cloudy,177,15.0,85,23.0 2349074,Male,2014-06-30 14:12:00,2014-06-30 14:28:00,15.783333333333333,87.1,cloudy,299,15.0,114,27.0 2337090,Male,2014-06-29 16:58:00,2014-06-29 17:04:00,5.9,84.9,cloudy,217,15.0,77,23.0 2340769,Male,2014-06-29 20:04:00,2014-06-29 20:24:00,20.55,81.0,cloudy,35,39.0,337,19.0 2343116,Female,2014-06-30 06:03:00,2014-06-30 06:06:00,3.216666666666667,73.0,cloudy,135,11.0,206,15.0 2346424,Male,2014-06-30 10:12:00,2014-06-30 10:35:00,23.41666666666667,78.1,cloudy,214,15.0,36,31.0 2353320,Male,2014-06-30 17:52:00,2014-06-30 18:00:00,7.983333333333332,84.0,cloudy,90,35.0,99,19.0 2352468,Male,2014-06-30 17:22:00,2014-06-30 17:27:00,4.55,84.0,cloudy,93,15.0,58,19.0 2332112,Female,2014-06-29 13:54:00,2014-06-29 14:07:00,13.333333333333336,82.9,cloudy,90,35.0,110,23.0 2347875,Male,2014-06-30 12:32:00,2014-06-30 12:40:00,8.383333333333333,82.0,cloudy,197,19.0,26,31.0 2351028,Male,2014-06-30 16:24:00,2014-06-30 16:36:00,12.316666666666665,84.0,cloudy,110,23.0,289,19.0 2339279,Male,2014-06-29 18:45:00,2014-06-29 18:52:00,6.883333333333334,84.2,cloudy,220,19.0,117,23.0 2336476,Female,2014-06-29 16:32:00,2014-06-29 16:50:00,17.1,84.9,cloudy,177,15.0,152,15.0 2350756,Male,2014-06-30 16:17:00,2014-06-30 16:20:00,2.8,84.0,cloudy,24,15.0,199,15.0 2337889,Male,2014-06-29 17:34:00,2014-06-29 17:42:00,7.333333333333332,84.9,cloudy,329,15.0,300,15.0 2345638,Male,2014-06-30 09:02:00,2014-06-30 09:18:00,15.833333333333336,78.1,cloudy,192,39.0,98,15.0 2353860,Male,2014-06-30 18:16:00,2014-06-30 18:38:00,21.08333333333333,82.0,tstorms,287,27.0,199,15.0 2352133,Male,2014-06-30 17:12:00,2014-06-30 17:17:00,5.45,84.0,cloudy,195,31.0,51,31.0 2353128,Male,2014-06-30 17:44:00,2014-06-30 18:07:00,22.91666666666667,84.0,cloudy,48,27.0,274,15.0 2347685,Male,2014-06-30 12:13:00,2014-06-30 12:21:00,7.533333333333332,82.0,cloudy,46,19.0,47,19.0 2341456,Male,2014-06-29 20:56:00,2014-06-29 21:15:00,18.2,81.0,cloudy,141,23.0,30,15.0 2334006,Female,2014-06-29 14:59:00,2014-06-29 15:07:00,7.866666666666666,84.0,cloudy,177,15.0,334,19.0 2349601,Male,2014-06-30 14:57:00,2014-06-30 15:11:00,14.016666666666667,87.1,cloudy,342,15.0,77,23.0 2343298,Female,2014-06-30 06:41:00,2014-06-30 07:06:00,25.316666666666666,73.0,cloudy,72,15.0,110,23.0 2352534,Female,2014-06-30 17:25:00,2014-06-30 17:36:00,11.666666666666664,84.0,cloudy,55,15.0,205,15.0 2347822,Female,2014-06-30 12:26:00,2014-06-30 12:38:00,12.2,82.0,cloudy,191,23.0,26,31.0 2343588,Male,2014-06-30 07:14:00,2014-06-30 07:24:00,10.333333333333334,73.0,cloudy,58,19.0,331,19.0 2334433,Female,2014-06-29 15:14:00,2014-06-29 15:42:00,28.066666666666666,82.9,cloudy,106,27.0,128,15.0 2339205,Male,2014-06-29 18:42:00,2014-06-29 18:50:00,7.783333333333332,84.2,cloudy,93,15.0,289,19.0 2346063,Male,2014-06-30 09:33:00,2014-06-30 09:48:00,14.483333333333333,78.1,cloudy,150,11.0,341,19.0 2334023,Male,2014-06-29 15:00:00,2014-06-29 15:18:00,18.183333333333334,82.9,cloudy,249,15.0,177,15.0 2349292,Male,2014-06-30 14:30:00,2014-06-30 14:44:00,13.866666666666667,87.1,cloudy,93,15.0,85,23.0 2341119,Male,2014-06-29 20:31:00,2014-06-29 20:39:00,8.366666666666667,81.0,cloudy,93,15.0,127,15.0 2347413,Male,2014-06-30 11:48:00,2014-06-30 12:05:00,16.983333333333334,79.0,cloudy,37,19.0,211,19.0 2353248,Male,2014-06-30 17:49:00,2014-06-30 17:56:00,7.083333333333332,84.0,cloudy,80,19.0,75,23.0 2344173,Male,2014-06-30 07:51:00,2014-06-30 07:57:00,5.833333333333332,73.0,cloudy,143,15.0,118,19.0 2352089,Male,2014-06-30 17:10:00,2014-06-30 17:14:00,3.3833333333333333,84.0,cloudy,198,19.0,91,31.0 2350641,Female,2014-06-30 16:10:00,2014-06-30 16:23:00,12.9,84.0,cloudy,211,19.0,192,39.0 2355038,Male,2014-06-30 21:22:00,2014-06-30 21:29:00,7.45,70.0,tstorms,100,23.0,26,31.0 2338614,Male,2014-06-29 18:10:00,2014-06-29 18:18:00,7.616666666666666,84.2,cloudy,74,23.0,199,15.0 2354266,Male,2014-06-30 18:40:00,2014-06-30 18:45:00,5.4833333333333325,82.0,tstorms,199,15.0,264,19.0 2348317,Male,2014-06-30 13:07:00,2014-06-30 13:12:00,4.85,84.9,cloudy,56,19.0,164,23.0 2332629,Male,2014-06-29 14:11:00,2014-06-29 14:20:00,9.216666666666667,84.0,cloudy,57,15.0,14,15.0 2352933,Male,2014-06-30 17:39:00,2014-06-30 17:53:00,14.033333333333333,84.0,cloudy,16,11.0,268,15.0 2354221,Male,2014-06-30 18:37:00,2014-06-30 18:49:00,11.883333333333333,82.0,tstorms,321,19.0,338,15.0 2337933,Female,2014-06-29 17:36:00,2014-06-29 17:48:00,11.45,84.9,cloudy,94,19.0,13,19.0 2341060,Female,2014-06-29 20:27:00,2014-06-29 20:40:00,12.766666666666667,81.0,cloudy,31,23.0,60,19.0 2343582,Male,2014-06-30 07:13:00,2014-06-30 07:23:00,10.366666666666667,73.0,cloudy,289,19.0,110,23.0 2352722,Female,2014-06-30 17:31:00,2014-06-30 17:53:00,21.95,84.0,cloudy,106,27.0,156,15.0 2339405,Male,2014-06-29 18:51:00,2014-06-29 19:00:00,8.616666666666667,84.2,cloudy,177,15.0,157,15.0 2337470,Female,2014-06-29 17:15:00,2014-06-29 17:32:00,17.366666666666667,84.9,cloudy,115,23.0,289,19.0 2334390,Male,2014-06-29 15:13:00,2014-06-29 15:23:00,9.666666666666666,82.9,cloudy,321,19.0,120,15.0 2348900,Female,2014-06-30 13:57:00,2014-06-30 14:02:00,4.55,84.9,cloudy,289,19.0,94,19.0 2351440,Female,2014-06-30 16:48:00,2014-06-30 17:10:00,21.88333333333333,84.0,cloudy,99,19.0,255,31.0 2347054,Female,2014-06-30 11:19:00,2014-06-30 11:33:00,14.783333333333333,79.0,cloudy,115,23.0,313,19.0 2334795,Male,2014-06-29 15:28:00,2014-06-29 15:31:00,2.816666666666667,82.9,cloudy,289,19.0,291,19.0 2341391,Male,2014-06-29 20:52:00,2014-06-29 21:01:00,9.583333333333334,81.0,cloudy,291,19.0,224,19.0 2339673,Male,2014-06-29 19:06:00,2014-06-29 19:12:00,6.266666666666668,82.0,cloudy,69,19.0,276,11.0 2345830,Female,2014-06-30 09:14:00,2014-06-30 09:25:00,10.933333333333335,78.1,cloudy,340,15.0,300,15.0 2351542,Male,2014-06-30 16:54:00,2014-06-30 16:59:00,4.833333333333333,84.0,cloudy,174,23.0,37,19.0 2334427,Male,2014-06-29 15:14:00,2014-06-29 16:03:00,48.93333333333333,82.9,cloudy,332,15.0,326,11.0 2349672,Male,2014-06-30 15:04:00,2014-06-30 15:08:00,4.316666666666666,84.9,cloudy,74,23.0,110,23.0 2351105,Female,2014-06-30 16:36:00,2014-06-30 16:48:00,12.15,84.0,cloudy,110,23.0,50,27.0 2351575,Male,2014-06-30 16:55:00,2014-06-30 17:01:00,5.7,84.0,cloudy,49,27.0,174,23.0 2343462,Male,2014-06-30 06:57:00,2014-06-30 07:21:00,23.68333333333333,73.0,cloudy,219,11.0,286,23.0 2340353,Male,2014-06-29 19:44:00,2014-06-29 19:54:00,10.533333333333333,82.0,cloudy,13,19.0,165,19.0 2331882,Male,2014-06-29 13:46:00,2014-06-29 13:52:00,5.783333333333332,82.9,cloudy,285,15.0,277,15.0 2343406,Male,2014-06-30 06:54:00,2014-06-30 07:06:00,11.133333333333333,73.0,cloudy,15,15.0,73,19.0 2335509,Male,2014-06-29 15:56:00,2014-06-29 16:14:00,18.666666666666668,82.9,cloudy,91,31.0,176,19.0 2354778,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 2352931,Male,2014-06-30 17:37:00,2014-06-30 17:44:00,7.2666666666666675,84.0,cloudy,283,23.0,91,31.0 2353847,Female,2014-06-30 18:16:00,2014-06-30 18:32:00,16.15,82.0,tstorms,35,39.0,177,15.0 2348722,Male,2014-06-30 13:37:00,2014-06-30 13:43:00,6.066666666666666,84.9,cloudy,283,23.0,77,23.0 2354393,Male,2014-06-30 18:49:00,2014-06-30 18:58:00,8.8,82.0,tstorms,49,27.0,5,19.0 2332155,Male,2014-06-29 13:55:00,2014-06-29 14:00:00,4.966666666666667,82.9,cloudy,59,19.0,273,15.0 2344370,Female,2014-06-30 08:01:00,2014-06-30 08:14:00,12.916666666666664,75.0,cloudy,66,19.0,199,15.0 2335580,Female,2014-06-29 15:58:00,2014-06-29 16:04:00,6.266666666666668,82.9,cloudy,298,15.0,242,15.0 2354106,Male,2014-06-30 18:30:00,2014-06-30 18:35:00,4.016666666666667,82.0,tstorms,109,19.0,22,15.0 2344294,Female,2014-06-30 07:56:00,2014-06-30 08:11:00,15.633333333333333,73.0,cloudy,75,23.0,317,15.0 2345623,Male,2014-06-30 09:02:00,2014-06-30 09:08:00,6.4833333333333325,78.1,cloudy,73,19.0,283,23.0 2333230,Male,2014-06-29 14:31:00,2014-06-29 14:59:00,28.15,84.0,cloudy,85,23.0,213,15.0 2346075,Female,2014-06-30 09:34:00,2014-06-30 09:59:00,24.816666666666666,78.1,cloudy,290,15.0,56,19.0 2337128,Female,2014-06-29 16:59:00,2014-06-29 17:26:00,26.73333333333333,84.9,cloudy,177,15.0,268,15.0 2337637,Female,2014-06-29 17:22:00,2014-06-29 17:38:00,15.3,84.9,cloudy,229,19.0,223,15.0 2343221,Male,2014-06-30 06:33:00,2014-06-30 06:37:00,3.616666666666666,73.0,cloudy,134,19.0,75,23.0 2348411,Male,2014-06-30 13:16:00,2014-06-30 13:22:00,5.233333333333333,84.9,cloudy,309,11.0,213,15.0 2343277,Male,2014-06-30 06:38:00,2014-06-30 06:41:00,2.833333333333333,73.0,cloudy,31,23.0,337,19.0 2335794,Male,2014-06-29 16:07:00,2014-06-29 16:18:00,11.1,84.9,cloudy,219,11.0,330,19.0 2336145,Female,2014-06-29 16:19:00,2014-06-29 16:38:00,18.683333333333334,84.9,cloudy,340,15.0,20,15.0 2333394,Male,2014-06-29 14:37:00,2014-06-29 15:04:00,26.78333333333333,84.0,cloudy,140,19.0,56,19.0 2347022,Female,2014-06-30 11:15:00,2014-06-30 11:30:00,15.683333333333335,79.0,cloudy,140,19.0,33,27.0 2350330,Female,2014-06-30 15:51:00,2014-06-30 16:17:00,26.11666666666667,84.9,cloudy,268,15.0,226,15.0 2339473,Male,2014-06-29 18:54:00,2014-06-29 19:21:00,27.03333333333333,84.2,cloudy,35,39.0,195,31.0 2340554,Female,2014-06-29 19:55:00,2014-06-29 20:12:00,16.15,82.0,cloudy,337,19.0,143,15.0 2351544,Male,2014-06-30 16:55:00,2014-06-30 17:06:00,11.2,84.0,cloudy,286,23.0,44,27.0 2351746,Male,2014-06-30 17:00:00,2014-06-30 17:17:00,17.666666666666668,84.0,cloudy,98,15.0,94,19.0 2341651,Male,2014-06-29 21:09:00,2014-06-29 21:27:00,17.533333333333335,79.0,cloudy,199,15.0,93,15.0 2345890,Male,2014-06-30 09:14:00,2014-06-30 09:30:00,15.833333333333336,78.1,cloudy,256,15.0,327,19.0 2351745,Male,2014-06-30 17:00:00,2014-06-30 17:19:00,19.8,84.0,cloudy,85,23.0,299,15.0 2344318,Male,2014-06-30 07:58:00,2014-06-30 08:16:00,18.233333333333334,73.0,cloudy,340,15.0,48,27.0 2337591,Male,2014-06-29 17:20:00,2014-06-29 17:31:00,11.25,84.9,cloudy,94,19.0,332,15.0 2341117,Male,2014-06-29 20:31:00,2014-06-29 20:35:00,4.133333333333334,81.0,cloudy,307,15.0,190,15.0 2343700,Male,2014-06-30 07:23:00,2014-06-30 07:32:00,8.583333333333334,73.0,cloudy,174,23.0,195,31.0 2353307,Male,2014-06-30 17:51:00,2014-06-30 18:00:00,8.983333333333333,84.0,cloudy,74,23.0,27,19.0 2340137,Female,2014-06-29 19:32:00,2014-06-29 19:44:00,12.383333333333333,82.0,cloudy,338,15.0,321,19.0 2341801,Male,2014-06-29 21:24:00,2014-06-29 21:40:00,15.516666666666667,79.0,cloudy,93,15.0,250,19.0 2336141,Male,2014-06-29 16:19:00,2014-06-29 16:26:00,6.9,84.9,cloudy,329,15.0,349,15.0 2339683,Male,2014-06-29 19:07:00,2014-06-29 19:30:00,22.6,82.0,cloudy,249,15.0,324,15.0 2335772,Male,2014-06-29 16:06:00,2014-06-29 16:13:00,6.566666666666666,84.9,cloudy,339,11.0,135,11.0 2337208,Male,2014-06-29 17:03:00,2014-06-29 17:12:00,9.483333333333333,84.9,cloudy,328,15.0,247,15.0 2346072,Male,2014-06-30 09:34:00,2014-06-30 09:44:00,9.666666666666666,78.1,cloudy,22,15.0,191,23.0 2340748,Male,2014-06-29 20:05:00,2014-06-29 20:22:00,17.266666666666666,81.0,cloudy,211,19.0,144,15.0 2344670,Male,2014-06-30 08:17:00,2014-06-30 08:26:00,9.783333333333333,75.0,cloudy,5,19.0,51,31.0 2354199,Female,2014-06-30 18:36:00,2014-06-30 18:40:00,3.6,82.0,tstorms,302,19.0,152,15.0 2345243,Male,2014-06-30 08:41:00,2014-06-30 08:59:00,18.233333333333334,75.0,cloudy,146,11.0,264,19.0 2348093,Female,2014-06-30 12:48:00,2014-06-30 13:05:00,16.2,82.0,cloudy,249,15.0,256,15.0 2350453,Male,2014-06-30 15:58:00,2014-06-30 16:05:00,6.95,84.9,cloudy,287,27.0,43,43.0 2347131,Male,2014-06-30 11:25:00,2014-06-30 11:45:00,20.166666666666668,79.0,cloudy,85,23.0,195,31.0 2339054,Female,2014-06-29 18:34:00,2014-06-29 18:54:00,20.666666666666668,84.2,cloudy,114,27.0,177,15.0 2348224,Female,2014-06-30 12:59:00,2014-06-30 13:07:00,7.133333333333334,82.0,cloudy,197,19.0,100,23.0 2344320,Male,2014-06-30 07:58:00,2014-06-30 08:05:00,6.883333333333334,73.0,cloudy,66,19.0,48,27.0 2346079,Male,2014-06-30 09:34:00,2014-06-30 09:52:00,18.4,78.1,cloudy,255,31.0,150,11.0 2352592,Male,2014-06-30 17:27:00,2014-06-30 17:38:00,11.066666666666665,84.0,cloudy,53,19.0,174,23.0 2331703,Male,2014-06-29 13:39:00,2014-06-29 13:44:00,4.6,82.9,cloudy,13,19.0,153,19.0 2351149,Female,2014-06-30 16:38:00,2014-06-30 16:50:00,11.65,84.0,cloudy,48,27.0,26,31.0 2350441,Male,2014-06-30 15:58:00,2014-06-30 16:10:00,12.05,84.9,cloudy,198,19.0,214,15.0 2345659,Male,2014-06-30 09:04:00,2014-06-30 09:15:00,11.25,78.1,cloudy,174,23.0,195,31.0 2348503,Male,2014-06-30 13:24:00,2014-06-30 13:28:00,3.983333333333333,84.9,cloudy,75,23.0,134,19.0 2337918,Female,2014-06-29 17:36:00,2014-06-29 17:46:00,10.266666666666667,84.9,cloudy,268,15.0,20,15.0 2343792,Male,2014-06-30 07:30:00,2014-06-30 07:54:00,24.36666666666667,73.0,cloudy,259,15.0,51,31.0 2350608,Male,2014-06-30 16:07:00,2014-06-30 16:15:00,7.233333333333332,84.0,cloudy,90,35.0,26,31.0 2344182,Female,2014-06-30 07:51:00,2014-06-30 07:56:00,4.95,73.0,cloudy,80,19.0,73,19.0 2345072,Female,2014-06-30 08:29:00,2014-06-30 09:04:00,35.63333333333333,75.0,cloudy,299,15.0,90,35.0 2339656,Female,2014-06-29 18:49:00,2014-06-29 19:04:00,14.433333333333335,84.2,cloudy,304,15.0,253,15.0 2348591,Female,2014-06-30 13:29:00,2014-06-30 13:36:00,7.75,84.9,cloudy,230,19.0,153,19.0 2338202,Female,2014-06-29 17:51:00,2014-06-29 18:06:00,15.083333333333336,84.9,cloudy,60,19.0,162,14.0 2355057,Male,2014-06-30 21:38:00,2014-06-30 21:43:00,4.266666666666667,70.0,tstorms,284,23.0,286,23.0 2352242,Female,2014-06-30 17:15:00,2014-06-30 17:26:00,11.116666666666667,84.0,cloudy,177,15.0,303,15.0 2352338,Female,2014-06-30 17:17:00,2014-06-30 17:26:00,9.066666666666666,84.0,cloudy,90,35.0,174,23.0 2345132,Male,2014-06-30 08:37:00,2014-06-30 08:47:00,9.783333333333333,75.0,cloudy,233,15.0,81,39.0 2335712,Male,2014-06-29 16:04:00,2014-06-29 16:07:00,3.283333333333333,84.9,cloudy,227,15.0,318,15.0 2352303,Female,2014-06-30 17:17:00,2014-06-30 17:24:00,7.5166666666666675,84.0,cloudy,114,27.0,229,19.0 2337824,Male,2014-06-29 17:31:00,2014-06-29 17:45:00,13.516666666666667,84.9,cloudy,226,15.0,227,15.0 2336943,Male,2014-06-29 16:52:00,2014-06-29 16:58:00,5.966666666666668,84.9,cloudy,156,15.0,153,19.0 2353572,Female,2014-06-30 18:03:00,2014-06-30 18:07:00,3.983333333333333,82.0,tstorms,242,15.0,239,15.0 2354058,Male,2014-06-30 18:28:00,2014-06-30 18:31:00,3.4166666666666665,82.0,tstorms,87,19.0,302,19.0 2350567,Male,2014-06-30 16:05:00,2014-06-30 16:18:00,13.2,84.0,cloudy,49,27.0,301,19.0 2334159,Male,2014-06-29 15:05:00,2014-06-29 15:26:00,21.466666666666665,82.9,cloudy,140,19.0,198,19.0 2351286,Male,2014-06-30 16:45:00,2014-06-30 17:04:00,19.366666666666667,84.0,cloudy,284,23.0,177,15.0 2336252,Male,2014-06-29 16:24:00,2014-06-29 16:30:00,6.116666666666666,84.9,cloudy,35,39.0,76,39.0 2343982,Male,2014-06-30 07:41:00,2014-06-30 08:05:00,23.566666666666666,73.0,cloudy,123,15.0,27,19.0 2332865,Male,2014-06-29 14:19:00,2014-06-29 14:24:00,5.0,84.0,cloudy,57,15.0,59,19.0 2335921,Male,2014-06-29 16:11:00,2014-06-29 16:19:00,8.083333333333334,84.9,cloudy,284,23.0,76,39.0 2353230,Male,2014-06-30 17:48:00,2014-06-30 17:53:00,5.433333333333334,84.0,cloudy,98,15.0,100,23.0 2353413,Male,2014-06-30 17:56:00,2014-06-30 18:06:00,10.1,84.0,cloudy,108,19.0,317,15.0 2335562,Male,2014-06-29 15:58:00,2014-06-29 16:11:00,13.35,82.9,cloudy,249,15.0,293,19.0 2345660,Male,2014-06-30 09:04:00,2014-06-30 09:13:00,8.7,78.1,cloudy,191,23.0,37,19.0 2346723,Male,2014-06-30 10:45:00,2014-06-30 10:54:00,9.483333333333333,78.1,cloudy,31,23.0,25,23.0 2341270,Male,2014-06-29 20:43:00,2014-06-29 20:55:00,11.95,81.0,cloudy,152,15.0,141,23.0 2345136,Male,2014-06-30 08:37:00,2014-06-30 08:51:00,14.366666666666667,75.0,cloudy,191,23.0,176,19.0 2331541,Female,2014-06-29 13:32:00,2014-06-29 13:46:00,13.85,82.9,cloudy,153,19.0,324,15.0 2354229,Female,2014-06-30 18:37:00,2014-06-30 18:46:00,8.633333333333333,82.0,tstorms,50,27.0,134,19.0 2343734,Female,2014-06-30 07:25:00,2014-06-30 07:31:00,6.7,73.0,cloudy,303,15.0,117,23.0 2343464,Male,2014-06-30 07:02:00,2014-06-30 07:07:00,4.8,73.0,cloudy,195,31.0,194,11.0 2336906,Female,2014-06-29 16:50:00,2014-06-29 16:56:00,5.75,84.9,cloudy,84,19.0,112,15.0 2338105,Female,2014-06-29 17:44:00,2014-06-29 18:11:00,26.43333333333333,84.9,cloudy,25,23.0,255,31.0 2354326,Female,2014-06-30 18:43:00,2014-06-30 18:46:00,2.433333333333333,82.0,tstorms,232,23.0,304,15.0 2350146,Male,2014-06-30 15:37:00,2014-06-30 15:43:00,6.35,84.9,cloudy,49,27.0,321,19.0 2338869,Female,2014-06-29 18:25:00,2014-06-29 18:31:00,5.533333333333332,84.2,cloudy,301,19.0,268,15.0 2343245,Male,2014-06-30 06:35:00,2014-06-30 06:42:00,7.183333333333334,73.0,cloudy,195,31.0,37,19.0 2344296,Male,2014-06-30 07:54:00,2014-06-30 08:02:00,8.516666666666667,73.0,cloudy,119,19.0,342,15.0 2347680,Female,2014-06-30 12:15:00,2014-06-30 12:28:00,12.916666666666664,82.0,cloudy,87,19.0,310,11.0 2345884,Male,2014-06-30 09:18:00,2014-06-30 09:27:00,9.816666666666666,78.1,cloudy,301,19.0,211,19.0 2341320,Male,2014-06-29 20:46:00,2014-06-29 21:07:00,20.983333333333334,81.0,cloudy,218,11.0,132,15.0 2332699,Female,2014-06-29 14:14:00,2014-06-29 14:19:00,5.283333333333333,84.0,cloudy,99,19.0,173,15.0 2348777,Male,2014-06-30 13:47:00,2014-06-30 13:54:00,7.083333333333332,84.9,cloudy,174,23.0,197,19.0 2350562,Male,2014-06-30 16:01:00,2014-06-30 16:06:00,4.65,84.0,cloudy,75,23.0,175,19.0 2352363,Male,2014-06-30 17:18:00,2014-06-30 17:25:00,6.2,84.0,cloudy,110,23.0,212,31.0 2336789,Male,2014-06-29 16:46:00,2014-06-29 16:50:00,3.866666666666666,84.9,cloudy,250,19.0,230,19.0 2348410,Male,2014-06-30 13:16:00,2014-06-30 13:39:00,23.016666666666666,84.9,cloudy,85,23.0,245,15.0 2339589,Female,2014-06-29 19:00:00,2014-06-29 19:28:00,28.716666666666665,82.0,cloudy,334,19.0,173,15.0 2343864,Male,2014-06-30 07:35:00,2014-06-30 07:45:00,10.1,73.0,cloudy,174,23.0,24,15.0 2344873,Male,2014-06-30 08:26:00,2014-06-30 08:41:00,15.616666666666667,75.0,cloudy,77,23.0,261,15.0 2347602,Male,2014-06-30 12:07:00,2014-06-30 12:26:00,18.9,82.0,cloudy,124,15.0,112,15.0 2344185,Female,2014-06-30 07:51:00,2014-06-30 08:08:00,16.283333333333335,73.0,cloudy,291,19.0,77,23.0 2345672,Male,2014-06-30 09:05:00,2014-06-30 09:20:00,15.066666666666665,78.1,cloudy,144,15.0,212,31.0 2353535,Male,2014-06-30 18:01:00,2014-06-30 18:11:00,9.616666666666667,82.0,tstorms,329,15.0,153,19.0 2340017,Female,2014-06-29 19:25:00,2014-06-29 19:31:00,5.183333333333334,82.0,cloudy,206,15.0,207,15.0 2333096,Male,2014-06-29 14:27:00,2014-06-29 14:31:00,4.466666666666667,84.0,cloudy,93,15.0,327,19.0 2349643,Male,2014-06-30 14:57:00,2014-06-30 15:15:00,17.233333333333334,87.1,cloudy,99,19.0,27,19.0 2343514,Female,2014-06-30 07:07:00,2014-06-30 07:17:00,9.466666666666667,73.0,cloudy,56,19.0,211,19.0 2334123,Male,2014-06-29 15:03:00,2014-06-29 15:28:00,24.28333333333333,82.9,cloudy,338,15.0,341,19.0 2348619,Male,2014-06-30 13:34:00,2014-06-30 13:44:00,9.8,84.9,cloudy,25,23.0,264,19.0 2349720,Female,2014-06-30 15:08:00,2014-06-30 15:23:00,15.766666666666667,84.9,cloudy,255,31.0,35,39.0 2347626,Male,2014-06-30 12:03:00,2014-06-30 12:13:00,9.883333333333333,82.0,cloudy,283,23.0,192,39.0 2339494,Male,2014-06-29 18:55:00,2014-06-29 19:20:00,24.8,84.2,cloudy,198,19.0,140,19.0 2336470,Female,2014-06-29 16:32:00,2014-06-29 16:54:00,22.566666666666666,84.9,cloudy,37,19.0,193,15.0 2352653,Male,2014-06-30 17:29:00,2014-06-30 17:34:00,5.816666666666666,84.0,cloudy,140,19.0,301,19.0 2331699,Male,2014-06-29 13:39:00,2014-06-29 13:47:00,7.566666666666666,82.9,cloudy,258,19.0,308,11.0 2350710,Male,2014-06-30 16:15:00,2014-06-30 16:28:00,13.533333333333333,84.0,cloudy,285,15.0,22,15.0 2341199,Male,2014-06-29 20:37:00,2014-06-29 20:48:00,11.216666666666667,81.0,cloudy,94,19.0,60,19.0 2338543,Male,2014-06-29 18:07:00,2014-06-29 18:14:00,6.7333333333333325,84.2,cloudy,115,23.0,157,15.0 2350787,Male,2014-06-30 16:20:00,2014-06-30 16:36:00,16.9,84.0,cloudy,205,15.0,283,23.0 2332559,Male,2014-06-29 14:09:00,2014-06-29 14:24:00,15.366666666666667,84.0,cloudy,28,15.0,130,15.0 2332822,Male,2014-06-29 14:18:00,2014-06-29 14:23:00,4.733333333333333,84.0,cloudy,100,23.0,287,27.0 2335654,Male,2014-06-29 16:01:00,2014-06-29 16:07:00,5.666666666666668,84.9,cloudy,339,11.0,279,15.0 2348062,Male,2014-06-30 12:46:00,2014-06-30 12:58:00,11.933333333333335,82.0,cloudy,92,19.0,108,19.0 2351085,Female,2014-06-30 16:35:00,2014-06-30 17:05:00,29.93333333333333,84.0,cloudy,93,15.0,238,15.0 2341229,Male,2014-06-29 20:40:00,2014-06-29 20:43:00,2.8,81.0,cloudy,240,23.0,254,15.0 2354392,Male,2014-06-30 18:49:00,2014-06-30 18:52:00,2.833333333333333,82.0,tstorms,337,19.0,25,23.0 2353330,Male,2014-06-30 17:53:00,2014-06-30 18:08:00,15.3,84.0,cloudy,177,15.0,245,15.0 2344016,Male,2014-06-30 07:44:00,2014-06-30 07:52:00,8.216666666666667,73.0,cloudy,174,23.0,31,23.0 2353746,Male,2014-06-30 18:11:00,2014-06-30 18:18:00,6.866666666666666,82.0,tstorms,216,15.0,130,15.0 2345276,Male,2014-06-30 08:43:00,2014-06-30 09:07:00,24.48333333333333,75.0,cloudy,17,15.0,199,15.0 2342491,Male,2014-06-29 22:51:00,2014-06-29 23:07:00,16.2,78.1,cloudy,130,15.0,337,19.0 2338291,Male,2014-06-29 17:54:00,2014-06-29 18:22:00,27.65,84.9,cloudy,47,19.0,22,15.0 2351060,Male,2014-06-30 16:33:00,2014-06-30 16:42:00,9.066666666666666,84.0,cloudy,264,19.0,91,31.0 2355065,Male,2014-06-30 21:43:00,2014-06-30 21:50:00,6.4,70.0,tstorms,291,19.0,337,19.0 2340374,Male,2014-06-29 19:43:00,2014-06-29 19:52:00,9.5,82.0,cloudy,62,27.0,335,15.0 2337689,Male,2014-06-29 17:25:00,2014-06-29 17:44:00,18.65,84.9,cloudy,26,31.0,268,15.0 2352751,Male,2014-06-30 17:32:00,2014-06-30 17:43:00,10.616666666666667,84.0,cloudy,284,23.0,35,39.0 2349941,Male,2014-06-30 15:24:00,2014-06-30 15:31:00,7.116666666666666,84.9,cloudy,115,23.0,250,19.0 2336484,Male,2014-06-29 16:33:00,2014-06-29 16:37:00,4.616666666666666,84.9,cloudy,106,27.0,31,23.0 2342695,Male,2014-06-29 23:25:00,2014-06-29 23:29:00,4.083333333333333,78.1,cloudy,36,31.0,174,23.0 2347574,Male,2014-06-30 12:04:00,2014-06-30 12:11:00,7.25,82.0,cloudy,77,23.0,346,15.0 2337517,Male,2014-06-29 17:17:00,2014-06-29 17:29:00,12.183333333333335,84.9,cloudy,53,19.0,143,15.0 2351242,Male,2014-06-30 16:43:00,2014-06-30 16:55:00,11.966666666666667,84.0,cloudy,195,31.0,191,23.0 2343312,Female,2014-06-30 06:43:00,2014-06-30 06:58:00,14.85,73.0,cloudy,176,19.0,77,23.0 2344454,Female,2014-06-30 08:05:00,2014-06-30 08:29:00,24.4,75.0,cloudy,203,15.0,75,23.0 2345222,Male,2014-06-30 08:40:00,2014-06-30 08:49:00,8.116666666666667,75.0,cloudy,217,15.0,74,23.0 2340043,Female,2014-06-29 19:27:00,2014-06-29 19:59:00,31.68333333333333,82.0,cloudy,198,19.0,99,19.0 2341056,Male,2014-06-29 20:27:00,2014-06-29 20:34:00,6.85,81.0,cloudy,199,15.0,46,19.0 2351667,Female,2014-06-30 16:57:00,2014-06-30 17:04:00,6.333333333333332,84.0,cloudy,59,19.0,338,15.0 2343686,Male,2014-06-30 07:22:00,2014-06-30 07:28:00,6.45,73.0,cloudy,91,31.0,80,19.0 2346315,Male,2014-06-30 09:58:00,2014-06-30 10:04:00,5.9,78.1,cloudy,321,19.0,98,15.0 2348656,Male,2014-06-30 13:37:00,2014-06-30 13:46:00,8.516666666666667,84.9,cloudy,173,15.0,35,39.0 2346784,Male,2014-06-30 10:49:00,2014-06-30 11:05:00,16.9,78.1,cloudy,341,19.0,197,19.0 2351203,Female,2014-06-30 16:41:00,2014-06-30 16:52:00,10.666666666666666,84.0,cloudy,254,15.0,227,15.0 2350994,Male,2014-06-30 16:30:00,2014-06-30 16:44:00,14.233333333333333,84.0,cloudy,337,19.0,91,31.0 2348598,Male,2014-06-30 13:34:00,2014-06-30 13:45:00,11.833333333333336,84.9,cloudy,60,19.0,127,15.0 2348252,Male,2014-06-30 13:02:00,2014-06-30 13:05:00,3.183333333333333,84.9,cloudy,115,23.0,300,15.0 2332470,Female,2014-06-29 14:06:00,2014-06-29 14:11:00,5.133333333333334,84.0,cloudy,144,15.0,94,19.0 2353092,Male,2014-06-30 17:43:00,2014-06-30 17:53:00,9.366666666666667,84.0,cloudy,81,39.0,176,19.0 2352618,Male,2014-06-30 17:28:00,2014-06-30 17:35:00,7.566666666666666,84.0,cloudy,109,19.0,192,39.0 2348148,Male,2014-06-30 12:54:00,2014-06-30 12:57:00,3.55,82.0,cloudy,210,19.0,61,15.0 2333562,Male,2014-06-29 14:43:00,2014-06-29 14:55:00,11.8,84.0,cloudy,48,27.0,144,15.0 2353850,Male,2014-06-30 18:16:00,2014-06-30 18:27:00,10.8,82.0,tstorms,173,15.0,91,31.0 2345117,Female,2014-06-30 08:36:00,2014-06-30 08:38:00,2.1166666666666667,75.0,cloudy,202,15.0,202,15.0 2352731,Male,2014-06-30 17:32:00,2014-06-30 17:43:00,10.883333333333333,84.0,cloudy,174,23.0,80,19.0 2347535,Male,2014-06-30 12:01:00,2014-06-30 12:21:00,19.4,82.0,cloudy,144,15.0,71,15.0 2338237,Female,2014-06-29 17:53:00,2014-06-29 18:07:00,14.116666666666667,84.9,cloudy,301,19.0,86,15.0 2344115,Male,2014-06-30 07:48:00,2014-06-30 08:01:00,12.983333333333333,73.0,cloudy,280,11.0,15,15.0 2354766,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 2346243,Female,2014-06-30 09:50:00,2014-06-30 09:58:00,8.283333333333333,78.1,cloudy,344,15.0,293,19.0 2353371,Female,2014-06-30 17:55:00,2014-06-30 18:03:00,8.033333333333333,84.0,cloudy,177,15.0,220,19.0 2353936,Male,2014-06-30 18:21:00,2014-06-30 18:35:00,14.25,82.0,tstorms,195,31.0,255,31.0 2353072,Male,2014-06-30 17:42:00,2014-06-30 17:52:00,9.2,84.0,cloudy,98,15.0,80,19.0 2336242,Female,2014-06-29 16:23:00,2014-06-29 16:37:00,13.2,84.9,cloudy,219,11.0,113,15.0 2347677,Male,2014-06-30 12:14:00,2014-06-30 12:19:00,5.0,82.0,cloudy,45,15.0,197,19.0 2347776,Male,2014-06-30 12:24:00,2014-06-30 12:36:00,11.616666666666667,82.0,cloudy,231,15.0,117,23.0 2352582,Male,2014-06-30 17:27:00,2014-06-30 17:33:00,6.1,84.0,cloudy,192,39.0,80,19.0 2348532,Male,2014-06-30 13:27:00,2014-06-30 13:30:00,3.45,84.9,cloudy,88,15.0,346,15.0 2347836,Male,2014-06-30 12:29:00,2014-06-30 12:33:00,4.466666666666667,82.0,cloudy,75,23.0,283,23.0 2349010,Male,2014-06-30 14:03:00,2014-06-30 14:13:00,10.25,87.1,cloudy,99,19.0,51,31.0 2351323,Male,2014-06-30 16:46:00,2014-06-30 16:52:00,5.7333333333333325,84.0,cloudy,69,19.0,160,15.0 2353447,Male,2014-06-30 17:58:00,2014-06-30 18:22:00,24.6,84.0,cloudy,174,23.0,290,15.0 2338844,Male,2014-06-29 18:24:00,2014-06-29 19:04:00,40.41666666666666,84.2,cloudy,183,15.0,305,15.0 2336079,Male,2014-06-29 16:17:00,2014-06-29 16:23:00,6.166666666666668,84.9,cloudy,152,15.0,131,15.0 2346297,Male,2014-06-30 09:57:00,2014-06-30 10:04:00,7.283333333333332,78.1,cloudy,47,19.0,37,19.0 2338816,Male,2014-06-29 18:22:00,2014-06-29 18:36:00,14.166666666666664,84.2,cloudy,15,15.0,59,19.0 2348073,Female,2014-06-30 12:47:00,2014-06-30 13:01:00,14.133333333333333,82.0,cloudy,87,19.0,303,15.0 2351796,Male,2014-06-30 17:02:00,2014-06-30 17:14:00,12.566666666666665,84.0,cloudy,191,23.0,301,19.0 2336555,Female,2014-06-29 16:36:00,2014-06-29 16:59:00,23.3,84.9,cloudy,183,15.0,226,15.0 2351824,Male,2014-06-30 17:03:00,2014-06-30 17:27:00,24.53333333333333,84.0,cloudy,48,27.0,228,11.0 2346472,Female,2014-06-30 10:10:00,2014-06-30 10:16:00,5.683333333333334,78.1,cloudy,49,27.0,191,23.0 2346445,Male,2014-06-30 10:14:00,2014-06-30 10:19:00,5.4,78.1,cloudy,303,15.0,117,23.0 2346676,Female,2014-06-30 10:40:00,2014-06-30 10:55:00,14.8,78.1,cloudy,176,19.0,51,31.0 2334203,Female,2014-06-29 15:06:00,2014-06-29 15:34:00,27.466666666666665,82.9,cloudy,76,39.0,110,23.0 2344721,Male,2014-06-30 08:19:00,2014-06-30 08:31:00,11.366666666666667,75.0,cloudy,50,27.0,264,19.0 2343569,Male,2014-06-30 07:12:00,2014-06-30 07:17:00,4.4,73.0,cloudy,31,23.0,48,27.0 2344188,Male,2014-06-30 07:52:00,2014-06-30 08:01:00,9.55,73.0,cloudy,50,27.0,77,23.0 2336138,Female,2014-06-29 16:19:00,2014-06-29 16:28:00,8.85,84.9,cloudy,57,15.0,55,15.0 2345214,Male,2014-06-30 08:37:00,2014-06-30 08:47:00,9.816666666666666,75.0,cloudy,91,31.0,55,15.0 2345841,Male,2014-06-30 09:15:00,2014-06-30 09:21:00,6.416666666666668,78.1,cloudy,175,19.0,192,39.0 2352539,Male,2014-06-30 17:25:00,2014-06-30 17:54:00,29.6,84.0,cloudy,91,31.0,260,19.0 2345630,Female,2014-06-30 09:02:00,2014-06-30 09:06:00,4.433333333333334,78.1,cloudy,326,11.0,234,19.0 2332861,Male,2014-06-29 14:19:00,2014-06-29 14:27:00,8.316666666666666,84.0,cloudy,211,19.0,301,19.0 2347689,Male,2014-06-30 12:16:00,2014-06-30 12:43:00,27.6,82.0,cloudy,81,39.0,286,23.0 2352802,Male,2014-06-30 17:34:00,2014-06-30 17:39:00,4.766666666666667,84.0,cloudy,54,19.0,29,15.0 2333112,Male,2014-06-29 14:27:00,2014-06-29 14:44:00,16.933333333333334,84.0,cloudy,71,15.0,268,15.0 2338759,Male,2014-06-29 18:18:00,2014-06-29 18:30:00,11.533333333333333,84.2,cloudy,240,23.0,245,15.0 2331534,Male,2014-06-29 13:32:00,2014-06-29 13:49:00,16.6,82.9,cloudy,261,15.0,75,23.0 2354707,Male,2014-06-30 19:35:00,2014-06-30 19:48:00,13.266666666666667,73.0,tstorms,19,15.0,55,15.0 2341579,Male,2014-06-29 21:04:00,2014-06-29 21:24:00,19.35,79.0,cloudy,220,19.0,312,15.0 2347842,Male,2014-06-30 12:29:00,2014-06-30 12:46:00,16.4,82.0,cloudy,116,15.0,92,19.0 2354875,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 2342153,Female,2014-06-29 21:58:00,2014-06-29 22:04:00,5.783333333333332,79.0,cloudy,229,19.0,165,19.0 2349660,Male,2014-06-30 15:03:00,2014-06-30 15:09:00,6.016666666666668,84.9,cloudy,283,23.0,91,31.0 2354363,Male,2014-06-30 18:46:00,2014-06-30 18:54:00,8.066666666666666,82.0,tstorms,191,23.0,84,19.0 2339165,Male,2014-06-29 18:39:00,2014-06-29 18:54:00,15.066666666666665,84.2,cloudy,90,35.0,48,27.0 2343029,Male,2014-06-30 03:02:00,2014-06-30 03:21:00,18.233333333333334,75.0,tstorms,69,19.0,144,15.0 2341309,Male,2014-06-29 20:46:00,2014-06-29 20:55:00,8.683333333333334,81.0,cloudy,315,11.0,123,15.0 2342025,Male,2014-06-29 21:47:00,2014-06-29 22:07:00,20.533333333333328,79.0,cloudy,312,15.0,313,19.0 2345865,Male,2014-06-30 09:15:00,2014-06-30 09:20:00,4.383333333333334,78.1,cloudy,91,31.0,233,15.0 2353040,Female,2014-06-30 17:42:00,2014-06-30 18:04:00,21.95,84.0,cloudy,174,23.0,141,23.0 2338439,Female,2014-06-29 18:03:00,2014-06-29 18:24:00,20.883333333333333,84.2,cloudy,319,15.0,28,15.0 2351729,Male,2014-06-30 16:59:00,2014-06-30 17:09:00,9.5,84.0,cloudy,199,15.0,91,31.0 2340839,Female,2014-06-29 20:12:00,2014-06-29 20:20:00,8.25,81.0,cloudy,76,39.0,194,11.0 2337044,Male,2014-06-29 16:56:00,2014-06-29 17:11:00,14.883333333333333,84.9,cloudy,328,15.0,204,15.0 2353974,Male,2014-06-30 18:23:00,2014-06-30 18:30:00,6.75,82.0,tstorms,240,23.0,256,15.0 2346686,Male,2014-06-30 10:41:00,2014-06-30 10:53:00,11.966666666666667,78.1,cloudy,341,19.0,168,19.0 2348872,Male,2014-06-30 13:55:00,2014-06-30 14:05:00,10.366666666666667,84.9,cloudy,307,15.0,69,19.0 2353059,Male,2014-06-30 17:42:00,2014-06-30 17:58:00,15.566666666666665,84.0,cloudy,91,31.0,16,11.0 2350856,Female,2014-06-30 16:24:00,2014-06-30 16:31:00,6.716666666666668,84.0,cloudy,143,15.0,289,19.0 2353471,Male,2014-06-30 17:59:00,2014-06-30 18:21:00,22.45,84.0,cloudy,85,23.0,190,15.0 2347630,Female,2014-06-30 12:05:00,2014-06-30 12:28:00,22.86666666666667,82.0,cloudy,321,19.0,196,19.0 2351128,Male,2014-06-30 16:37:00,2014-06-30 16:53:00,16.216666666666665,84.0,cloudy,261,15.0,91,31.0 2351256,Male,2014-06-30 16:43:00,2014-06-30 17:18:00,34.23333333333333,84.0,cloudy,211,19.0,153,19.0 2342536,Female,2014-06-29 22:58:00,2014-06-29 23:11:00,12.7,78.1,cloudy,333,15.0,259,15.0 2340438,Female,2014-06-29 19:49:00,2014-06-29 19:56:00,7.616666666666666,82.0,cloudy,135,11.0,207,15.0 2353014,Male,2014-06-30 17:41:00,2014-06-30 17:44:00,2.8666666666666667,84.0,cloudy,240,23.0,306,15.0 2350702,Male,2014-06-30 16:14:00,2014-06-30 16:19:00,4.716666666666667,84.0,cloudy,192,39.0,37,19.0 2341584,Male,2014-06-29 21:05:00,2014-06-29 21:17:00,12.683333333333335,79.0,cloudy,228,11.0,260,19.0 2337732,Female,2014-06-29 17:27:00,2014-06-29 17:41:00,13.616666666666667,84.9,cloudy,117,23.0,228,11.0 2346250,Male,2014-06-30 09:50:00,2014-06-30 09:56:00,6.2,78.1,cloudy,66,19.0,53,19.0 2351927,Male,2014-06-30 17:06:00,2014-06-30 17:16:00,9.733333333333333,84.0,cloudy,66,19.0,86,15.0 2331805,Male,2014-06-29 13:43:00,2014-06-29 14:05:00,22.25,82.9,cloudy,220,19.0,323,15.0 2331461,Female,2014-06-29 13:30:00,2014-06-29 13:36:00,6.4833333333333325,82.9,cloudy,186,15.0,56,19.0 2349847,Male,2014-06-30 15:17:00,2014-06-30 15:28:00,11.416666666666664,84.9,cloudy,243,15.0,230,19.0 2333666,Female,2014-06-29 14:47:00,2014-06-29 15:15:00,28.316666666666666,84.0,cloudy,291,19.0,85,23.0 2353724,Male,2014-06-30 18:06:00,2014-06-30 18:27:00,20.466666666666665,82.0,tstorms,43,43.0,217,15.0 2350471,Male,2014-06-30 16:00:00,2014-06-30 16:08:00,7.566666666666666,84.0,cloudy,86,15.0,333,15.0 2333022,Male,2014-06-29 14:25:00,2014-06-29 14:49:00,23.966666666666665,84.0,cloudy,59,19.0,35,39.0 2339250,Male,2014-06-29 18:44:00,2014-06-29 18:50:00,6.3,84.2,cloudy,114,27.0,226,15.0 2345917,Male,2014-06-30 09:21:00,2014-06-30 09:27:00,6.516666666666668,78.1,cloudy,238,15.0,344,15.0 2345045,Female,2014-06-30 08:32:00,2014-06-30 08:39:00,6.266666666666668,75.0,cloudy,22,15.0,282,15.0 2353382,Male,2014-06-30 17:55:00,2014-06-30 18:18:00,22.58333333333333,84.0,cloudy,100,23.0,222,19.0 2341096,Female,2014-06-29 20:29:00,2014-06-29 20:35:00,5.383333333333334,81.0,cloudy,299,15.0,114,27.0 2336597,Male,2014-06-29 16:38:00,2014-06-29 16:56:00,18.483333333333334,84.9,cloudy,232,23.0,324,15.0 2332128,Male,2014-06-29 13:54:00,2014-06-29 14:17:00,22.3,82.9,cloudy,177,15.0,254,15.0 2354546,Male,2014-06-30 19:02:00,2014-06-30 19:19:00,16.166666666666668,73.0,tstorms,43,43.0,199,15.0 2334757,Male,2014-06-29 15:26:00,2014-06-29 15:43:00,16.783333333333335,82.9,cloudy,307,15.0,291,19.0 2353627,Male,2014-06-30 18:06:00,2014-06-30 18:13:00,7.133333333333334,82.0,tstorms,59,19.0,178,15.0 2354828,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 2344487,Male,2014-06-30 08:04:00,2014-06-30 08:12:00,7.85,75.0,cloudy,191,23.0,43,43.0 2353525,Male,2014-06-30 18:00:00,2014-06-30 18:18:00,17.85,82.0,tstorms,176,19.0,157,15.0 2350890,Male,2014-06-30 16:26:00,2014-06-30 16:30:00,3.733333333333333,84.0,cloudy,54,19.0,186,15.0 2355018,Male,2014-06-30 21:16:00,2014-06-30 21:24:00,7.733333333333332,70.0,tstorms,67,15.0,117,23.0 2350656,Male,2014-06-30 16:11:00,2014-06-30 16:15:00,3.7666666666666666,84.0,cloudy,307,15.0,188,15.0 2349658,Male,2014-06-30 15:01:00,2014-06-30 15:05:00,4.283333333333333,84.9,cloudy,222,19.0,309,11.0 2349820,Male,2014-06-30 15:15:00,2014-06-30 15:24:00,9.2,84.9,cloudy,241,15.0,137,15.0 2348693,Male,2014-06-30 13:41:00,2014-06-30 13:49:00,8.916666666666666,84.9,cloudy,206,15.0,15,15.0 2345135,Male,2014-06-30 08:37:00,2014-06-30 08:48:00,10.616666666666667,75.0,cloudy,92,19.0,164,23.0 2351182,Male,2014-06-30 16:40:00,2014-06-30 16:46:00,6.35,84.0,cloudy,43,43.0,287,27.0 2345859,Male,2014-06-30 09:15:00,2014-06-30 09:33:00,17.4,78.1,cloudy,66,19.0,342,15.0 2341445,Male,2014-06-29 20:55:00,2014-06-29 21:35:00,39.56666666666667,81.0,cloudy,85,23.0,156,15.0 2341649,Male,2014-06-29 21:09:00,2014-06-29 21:27:00,17.4,79.0,cloudy,94,19.0,199,15.0 2352924,Male,2014-06-30 17:38:00,2014-06-30 17:45:00,6.75,84.0,cloudy,44,27.0,110,23.0 2338158,Male,2014-06-29 17:47:00,2014-06-29 17:53:00,6.016666666666668,84.9,cloudy,158,15.0,123,15.0 2351902,Male,2014-06-30 17:05:00,2014-06-30 17:17:00,12.083333333333336,84.0,cloudy,91,31.0,99,19.0 2343174,Male,2014-06-30 06:26:00,2014-06-30 06:31:00,5.4833333333333325,73.0,cloudy,192,39.0,80,19.0 2350866,Male,2014-06-30 16:25:00,2014-06-30 16:35:00,10.7,84.0,cloudy,165,19.0,327,19.0 2339462,Male,2014-06-29 18:54:00,2014-06-29 19:04:00,10.366666666666667,84.2,cloudy,283,23.0,110,23.0 2351950,Female,2014-06-30 17:07:00,2014-06-30 17:30:00,23.53333333333333,84.0,cloudy,100,23.0,158,15.0 2345357,Male,2014-06-30 08:47:00,2014-06-30 09:06:00,19.683333333333334,75.0,cloudy,317,15.0,36,31.0 2345207,Female,2014-06-30 08:40:00,2014-06-30 09:07:00,27.03333333333333,75.0,cloudy,330,19.0,60,19.0 2333087,Male,2014-06-29 14:26:00,2014-06-29 14:32:00,5.7,84.0,cloudy,307,15.0,166,15.0 2343808,Male,2014-06-30 07:31:00,2014-06-30 07:37:00,6.016666666666668,73.0,cloudy,337,19.0,48,27.0 2339985,Male,2014-06-29 19:23:00,2014-06-29 19:40:00,17.0,82.0,cloudy,226,15.0,344,15.0 2353177,Male,2014-06-30 17:46:00,2014-06-30 18:01:00,14.883333333333333,84.0,cloudy,168,19.0,22,15.0 2351721,Female,2014-06-30 16:59:00,2014-06-30 17:07:00,7.8,84.0,cloudy,223,15.0,94,19.0 2344269,Male,2014-06-30 07:55:00,2014-06-30 08:00:00,5.25,73.0,cloudy,264,19.0,81,39.0 2339532,Female,2014-06-29 18:57:00,2014-06-29 19:12:00,15.583333333333336,84.2,cloudy,176,19.0,99,19.0 2352203,Male,2014-06-30 17:13:00,2014-06-30 17:23:00,10.1,84.0,cloudy,283,23.0,195,31.0 2348944,Male,2014-06-30 14:00:00,2014-06-30 14:03:00,3.3666666666666667,87.1,cloudy,49,27.0,283,23.0 2338670,Female,2014-06-29 18:13:00,2014-06-29 18:23:00,10.366666666666667,84.2,cloudy,302,19.0,223,15.0 2353495,Female,2014-06-30 17:59:00,2014-06-30 18:35:00,35.666666666666664,84.0,cloudy,162,14.0,173,15.0 2350786,Male,2014-06-30 16:19:00,2014-06-30 16:24:00,4.283333333333333,84.0,cloudy,115,23.0,153,19.0 2333855,Male,2014-06-29 14:54:00,2014-06-29 15:00:00,6.4833333333333325,84.0,cloudy,110,23.0,66,19.0 2335381,Male,2014-06-29 15:51:00,2014-06-29 16:08:00,17.166666666666668,82.9,cloudy,37,19.0,35,39.0 2336340,Female,2014-06-29 16:28:00,2014-06-29 16:49:00,20.883333333333333,84.9,cloudy,177,15.0,176,19.0 2345059,Male,2014-06-30 08:31:00,2014-06-30 08:39:00,8.15,75.0,cloudy,255,31.0,37,19.0 2336765,Male,2014-06-29 16:44:00,2014-06-29 16:47:00,2.466666666666667,84.9,cloudy,168,19.0,59,19.0 2333088,Male,2014-06-29 14:26:00,2014-06-29 14:34:00,7.4,84.0,cloudy,339,11.0,339,11.0 2336021,Male,2014-06-29 16:14:00,2014-06-29 16:43:00,28.78333333333333,84.9,cloudy,321,19.0,90,35.0 2347625,Male,2014-06-30 12:09:00,2014-06-30 12:17:00,8.6,82.0,cloudy,42,15.0,321,19.0 2342837,Male,2014-06-30 00:14:00,2014-06-30 00:38:00,24.516666666666666,78.1,cloudy,303,15.0,256,15.0 2333869,Female,2014-06-29 14:50:00,2014-06-29 15:16:00,25.73333333333333,84.0,cloudy,324,15.0,74,23.0 2345138,Male,2014-06-30 08:37:00,2014-06-30 08:46:00,9.183333333333334,75.0,cloudy,198,19.0,81,39.0 2355126,Male,2014-06-30 23:08:00,2014-06-30 23:13:00,5.066666666666666,68.0,tstorms,174,23.0,44,27.0 2343057,Male,2014-06-30 05:21:00,2014-06-30 05:43:00,21.9,73.0,cloudy,220,19.0,77,23.0 2337813,Male,2014-06-29 17:31:00,2014-06-29 17:36:00,5.283333333333333,84.9,cloudy,81,39.0,50,27.0 2342100,Male,2014-06-29 21:57:00,2014-06-29 22:01:00,3.816666666666667,79.0,cloudy,118,19.0,138,15.0 2347316,Male,2014-06-30 11:41:00,2014-06-30 11:47:00,5.85,79.0,cloudy,68,23.0,174,23.0 2351744,Female,2014-06-30 16:59:00,2014-06-30 17:25:00,25.38333333333333,84.0,cloudy,337,19.0,222,19.0 2345283,Male,2014-06-30 08:43:00,2014-06-30 08:53:00,10.116666666666667,75.0,cloudy,233,15.0,37,19.0 2353742,Male,2014-06-30 18:11:00,2014-06-30 18:17:00,5.6,82.0,tstorms,123,15.0,290,15.0 2339655,Male,2014-06-29 19:05:00,2014-06-29 19:14:00,9.433333333333334,82.0,cloudy,176,19.0,141,23.0 2350568,Male,2014-06-30 16:05:00,2014-06-30 16:09:00,3.8,84.0,cloudy,48,27.0,31,23.0 2354648,Male,2014-06-30 19:14:00,2014-06-30 19:17:00,3.25,73.0,tstorms,198,19.0,77,23.0 2351472,Male,2014-06-30 16:52:00,2014-06-30 16:57:00,4.933333333333334,84.0,cloudy,98,15.0,212,31.0 2354779,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 2353322,Male,2014-06-30 17:52:00,2014-06-30 17:57:00,5.233333333333333,84.0,cloudy,136,15.0,55,15.0 2343923,Male,2014-06-30 07:38:00,2014-06-30 07:51:00,12.733333333333333,73.0,cloudy,192,39.0,110,23.0 2345743,Male,2014-06-30 09:09:00,2014-06-30 09:17:00,7.983333333333332,78.1,cloudy,91,31.0,212,31.0 2337593,Male,2014-06-29 17:20:00,2014-06-29 17:39:00,19.166666666666668,84.9,cloudy,50,27.0,301,19.0 2335374,Male,2014-06-29 15:51:00,2014-06-29 15:54:00,3.066666666666667,82.9,cloudy,48,27.0,74,23.0 2346184,Male,2014-06-30 09:44:00,2014-06-30 09:47:00,2.933333333333333,78.1,cloudy,44,27.0,52,31.0 2338838,Male,2014-06-29 18:23:00,2014-06-29 18:44:00,20.433333333333334,84.2,cloudy,309,11.0,75,23.0 2349846,Male,2014-06-30 15:16:00,2014-06-30 15:22:00,5.9,84.9,cloudy,243,15.0,297,15.0 2345139,Male,2014-06-30 08:37:00,2014-06-30 08:48:00,10.733333333333333,75.0,cloudy,59,19.0,36,31.0 2341110,Female,2014-06-29 20:30:00,2014-06-29 20:37:00,6.366666666666666,81.0,cloudy,198,19.0,217,15.0 2347744,Male,2014-06-30 12:22:00,2014-06-30 12:30:00,8.233333333333333,82.0,cloudy,211,19.0,85,23.0 2338669,Male,2014-06-29 18:13:00,2014-06-29 18:20:00,6.966666666666668,84.2,cloudy,194,11.0,56,19.0 2334189,Male,2014-06-29 15:06:00,2014-06-29 15:14:00,8.016666666666667,82.9,cloudy,152,15.0,324,15.0 2338408,Male,2014-06-29 18:01:00,2014-06-29 18:10:00,8.75,84.2,cloudy,111,19.0,164,23.0 2336303,Male,2014-06-29 16:27:00,2014-06-29 16:42:00,14.983333333333333,84.9,cloudy,264,19.0,85,23.0 2343126,Male,2014-06-30 06:08:00,2014-06-30 06:15:00,7.05,73.0,cloudy,318,15.0,229,19.0 2351374,Male,2014-06-30 16:46:00,2014-06-30 16:52:00,6.666666666666668,84.0,cloudy,287,27.0,284,23.0 2349412,Male,2014-06-30 14:40:00,2014-06-30 15:05:00,24.7,87.1,cloudy,44,27.0,106,27.0 2344827,Male,2014-06-30 08:23:00,2014-06-30 08:27:00,4.033333333333333,75.0,cloudy,340,15.0,13,19.0 2346498,Male,2014-06-30 10:20:00,2014-06-30 10:36:00,16.433333333333334,78.1,cloudy,341,19.0,255,31.0 2344479,Female,2014-06-30 08:07:00,2014-06-30 08:20:00,13.2,75.0,cloudy,198,19.0,317,15.0 2344102,Male,2014-06-30 07:47:00,2014-06-30 07:58:00,10.55,73.0,cloudy,74,23.0,49,27.0 2351252,Female,2014-06-30 16:43:00,2014-06-30 17:04:00,20.533333333333328,84.0,cloudy,111,19.0,152,15.0 2353871,Female,2014-06-30 18:17:00,2014-06-30 18:23:00,6.2,82.0,tstorms,60,19.0,327,19.0 2349938,Female,2014-06-30 15:24:00,2014-06-30 15:36:00,11.35,84.9,cloudy,85,23.0,110,23.0 2351813,Male,2014-06-30 17:02:00,2014-06-30 17:05:00,2.75,84.0,cloudy,52,31.0,44,27.0 2333286,Female,2014-06-29 14:33:00,2014-06-29 14:54:00,20.766666666666666,84.0,cloudy,94,19.0,232,23.0 2339891,Female,2014-06-29 19:18:00,2014-06-29 19:23:00,5.083333333333333,82.0,cloudy,289,19.0,27,19.0 2352836,Male,2014-06-30 17:32:00,2014-06-30 17:46:00,13.2,84.0,cloudy,58,19.0,226,15.0 2354683,Male,2014-06-30 19:17:00,2014-06-30 19:31:00,13.666666666666664,73.0,tstorms,144,15.0,229,19.0 2344889,Male,2014-06-30 08:26:00,2014-06-30 08:33:00,7.116666666666666,75.0,cloudy,192,39.0,81,39.0 2348415,Male,2014-06-30 13:17:00,2014-06-30 13:37:00,20.233333333333334,84.9,cloudy,46,19.0,302,19.0 2339587,Male,2014-06-29 18:59:00,2014-06-29 19:12:00,12.833333333333336,84.2,cloudy,268,15.0,313,19.0 2350243,Male,2014-06-30 15:45:00,2014-06-30 15:59:00,14.466666666666667,84.9,cloudy,85,23.0,177,15.0 2338773,Male,2014-06-29 18:19:00,2014-06-29 18:30:00,10.566666666666666,84.2,cloudy,152,15.0,143,15.0 2354339,Male,2014-06-30 18:44:00,2014-06-30 18:49:00,5.266666666666667,82.0,tstorms,140,19.0,301,19.0 2353153,Female,2014-06-30 17:45:00,2014-06-30 18:04:00,19.1,84.0,cloudy,85,23.0,349,15.0 2340778,Female,2014-06-29 20:08:00,2014-06-29 20:24:00,15.833333333333336,81.0,cloudy,76,39.0,35,39.0 2343422,Male,2014-06-30 06:56:00,2014-06-30 06:59:00,3.1166666666666667,73.0,cloudy,327,19.0,225,15.0 2350980,Male,2014-06-30 16:30:00,2014-06-30 16:38:00,8.683333333333334,84.0,cloudy,181,31.0,176,19.0 2335337,Female,2014-06-29 15:50:00,2014-06-29 15:56:00,5.766666666666668,82.9,cloudy,288,11.0,289,19.0 2354482,Female,2014-06-30 18:55:00,2014-06-30 19:01:00,5.233333333333333,82.0,tstorms,118,19.0,94,19.0 2346486,Female,2014-06-30 10:18:00,2014-06-30 10:35:00,16.75,78.1,cloudy,308,11.0,69,19.0 2347448,Male,2014-06-30 11:52:00,2014-06-30 11:55:00,3.0,79.0,cloudy,115,23.0,226,15.0 2339301,Male,2014-06-29 18:46:00,2014-06-29 19:11:00,24.86666666666667,84.2,cloudy,340,15.0,333,15.0 2352786,Male,2014-06-30 17:34:00,2014-06-30 17:52:00,17.816666666666666,84.0,cloudy,25,23.0,334,19.0 2345606,Female,2014-06-30 09:00:00,2014-06-30 09:16:00,15.25,78.1,cloudy,117,23.0,223,15.0 2342850,Male,2014-06-30 00:22:00,2014-06-30 00:27:00,4.716666666666667,78.1,cloudy,131,15.0,347,15.0 2338718,Male,2014-06-29 18:13:00,2014-06-29 18:26:00,13.05,84.2,cloudy,80,19.0,22,15.0 2331687,Female,2014-06-29 13:39:00,2014-06-29 13:57:00,18.2,82.9,cloudy,255,31.0,100,23.0 2351174,Male,2014-06-30 16:39:00,2014-06-30 17:05:00,25.566666666666666,84.0,cloudy,287,27.0,309,11.0 2338195,Male,2014-06-29 17:50:00,2014-06-29 18:10:00,19.35,84.9,cloudy,199,15.0,177,15.0 2342084,Male,2014-06-29 21:55:00,2014-06-29 22:01:00,6.416666666666668,79.0,cloudy,211,19.0,85,23.0 2339036,Female,2014-06-29 18:32:00,2014-06-29 18:40:00,7.633333333333334,84.2,cloudy,94,19.0,289,19.0 2336872,Male,2014-06-29 16:49:00,2014-06-29 16:55:00,6.4833333333333325,84.9,cloudy,211,19.0,53,19.0 2334140,Female,2014-06-29 15:04:00,2014-06-29 15:20:00,16.35,82.9,cloudy,231,15.0,157,15.0 2341669,Male,2014-06-29 21:11:00,2014-06-29 21:27:00,15.233333333333333,79.0,cloudy,174,23.0,35,39.0 2347821,Male,2014-06-30 12:28:00,2014-06-30 12:33:00,5.25,82.0,cloudy,71,15.0,119,19.0 2344522,Male,2014-06-30 08:10:00,2014-06-30 08:15:00,5.3,75.0,cloudy,91,31.0,68,23.0 2354437,Male,2014-06-30 18:52:00,2014-06-30 19:05:00,12.716666666666667,82.0,tstorms,143,15.0,303,15.0 2344125,Male,2014-06-30 07:49:00,2014-06-30 08:27:00,38.266666666666666,73.0,cloudy,306,15.0,81,39.0 2350919,Male,2014-06-30 16:27:00,2014-06-30 16:36:00,8.466666666666667,84.0,cloudy,195,31.0,91,31.0 2342909,Male,2014-06-30 00:54:00,2014-06-30 01:07:00,12.25,78.1,cloudy,115,23.0,304,15.0 2345432,Male,2014-06-30 08:51:00,2014-06-30 08:56:00,4.516666666666667,75.0,cloudy,15,15.0,205,15.0 2334840,Female,2014-06-29 15:29:00,2014-06-29 15:48:00,18.35,82.9,cloudy,181,31.0,233,15.0 2350475,Male,2014-06-30 16:00:00,2014-06-30 16:10:00,9.716666666666667,84.0,cloudy,195,31.0,50,27.0 2355045,Male,2014-06-30 21:26:00,2014-06-30 21:48:00,21.86666666666667,70.0,tstorms,210,19.0,246,11.0 2344003,Male,2014-06-30 07:43:00,2014-06-30 07:49:00,6.333333333333332,73.0,cloudy,106,27.0,212,31.0 2335553,Male,2014-06-29 15:57:00,2014-06-29 16:12:00,14.816666666666665,82.9,cloudy,184,19.0,72,15.0 2346487,Female,2014-06-30 10:19:00,2014-06-30 10:32:00,13.866666666666667,78.1,cloudy,174,23.0,110,23.0 2349434,Male,2014-06-30 14:42:00,2014-06-30 14:51:00,9.066666666666666,87.1,cloudy,196,19.0,283,23.0 2343913,Male,2014-06-30 07:37:00,2014-06-30 07:48:00,10.233333333333333,73.0,cloudy,74,23.0,68,23.0 2343484,Female,2014-06-30 07:04:00,2014-06-30 07:38:00,33.61666666666667,73.0,cloudy,141,23.0,68,23.0 2338409,Male,2014-06-29 18:01:00,2014-06-29 18:04:00,2.9,84.2,cloudy,87,19.0,67,15.0 2351092,Male,2014-06-30 16:35:00,2014-06-30 16:40:00,4.683333333333334,84.0,cloudy,181,31.0,140,19.0 2351500,Male,2014-06-30 16:53:00,2014-06-30 17:06:00,12.883333333333333,84.0,cloudy,24,15.0,75,23.0 2343212,Male,2014-06-30 06:32:00,2014-06-30 06:49:00,17.8,73.0,cloudy,273,15.0,66,19.0 2346869,Male,2014-06-30 10:59:00,2014-06-30 11:24:00,25.15,78.1,cloudy,201,15.0,52,31.0 2343072,Male,2014-06-30 05:35:00,2014-06-30 05:43:00,7.9,73.0,cloudy,255,31.0,341,19.0 2353365,Male,2014-06-30 17:55:00,2014-06-30 18:01:00,6.25,84.0,cloudy,194,11.0,91,31.0 2353269,Male,2014-06-30 17:50:00,2014-06-30 18:02:00,12.416666666666664,84.0,cloudy,91,31.0,57,15.0 2349537,Male,2014-06-30 14:51:00,2014-06-30 15:08:00,16.416666666666668,87.1,cloudy,31,23.0,57,15.0 2345231,Male,2014-06-30 08:41:00,2014-06-30 08:53:00,12.433333333333335,75.0,cloudy,273,15.0,37,19.0 2334527,Male,2014-06-29 15:18:00,2014-06-29 15:29:00,11.033333333333333,82.9,cloudy,331,19.0,332,15.0 2345398,Male,2014-06-30 08:49:00,2014-06-30 09:00:00,11.1,75.0,cloudy,66,19.0,264,19.0 2332394,Female,2014-06-29 14:04:00,2014-06-29 14:18:00,14.333333333333336,84.0,cloudy,59,19.0,90,35.0 2343297,Male,2014-06-30 06:40:00,2014-06-30 07:04:00,23.38333333333333,73.0,cloudy,190,15.0,91,31.0 2354170,Female,2014-06-30 18:35:00,2014-06-30 18:43:00,8.65,82.0,tstorms,251,15.0,256,15.0 2352806,Male,2014-06-30 17:34:00,2014-06-30 17:51:00,16.533333333333335,84.0,cloudy,268,15.0,85,23.0 2350515,Male,2014-06-30 16:02:00,2014-06-30 16:05:00,2.75,84.0,cloudy,75,23.0,169,15.0 2348687,Male,2014-06-30 13:40:00,2014-06-30 14:05:00,25.36666666666667,84.9,cloudy,164,23.0,211,19.0 2335444,Female,2014-06-29 15:54:00,2014-06-29 16:00:00,6.166666666666668,82.9,cloudy,188,15.0,67,15.0 2333255,Male,2014-06-29 14:32:00,2014-06-29 14:46:00,14.25,84.0,cloudy,260,19.0,61,15.0 2345836,Male,2014-06-30 09:15:00,2014-06-30 09:28:00,12.916666666666664,78.1,cloudy,84,19.0,37,19.0 2339377,Male,2014-06-29 18:50:00,2014-06-29 19:00:00,10.216666666666667,84.2,cloudy,56,19.0,26,31.0 2343500,Male,2014-06-30 07:06:00,2014-06-30 07:31:00,25.36666666666667,73.0,cloudy,25,23.0,97,35.0 2347315,Male,2014-06-30 11:41:00,2014-06-30 11:53:00,11.566666666666665,79.0,cloudy,67,15.0,240,23.0 2338411,Female,2014-06-29 18:01:00,2014-06-29 18:28:00,26.966666666666665,84.2,cloudy,249,15.0,177,15.0 2349085,Male,2014-06-30 14:13:00,2014-06-30 14:18:00,4.883333333333334,87.1,cloudy,77,23.0,49,27.0 2348534,Male,2014-06-30 13:27:00,2014-06-30 13:29:00,2.6,84.9,cloudy,37,19.0,50,27.0 2341035,Male,2014-06-29 20:25:00,2014-06-29 20:40:00,14.55,81.0,cloudy,58,19.0,141,23.0 2341327,Female,2014-06-29 20:42:00,2014-06-29 20:52:00,9.716666666666667,81.0,cloudy,156,15.0,343,15.0 2339224,Male,2014-06-29 18:43:00,2014-06-29 18:55:00,11.9,84.2,cloudy,324,15.0,301,19.0 2350499,Male,2014-06-30 16:01:00,2014-06-30 16:14:00,12.8,84.0,cloudy,198,19.0,284,23.0 2353698,Male,2014-06-30 18:08:00,2014-06-30 18:17:00,8.983333333333333,82.0,tstorms,229,19.0,127,15.0 2351762,Female,2014-06-30 17:01:00,2014-06-30 17:17:00,16.5,84.0,cloudy,20,15.0,153,19.0 2352373,Male,2014-06-30 17:19:00,2014-06-30 17:39:00,19.566666666666666,84.0,cloudy,196,19.0,210,19.0 2353888,Male,2014-06-30 18:18:00,2014-06-30 18:25:00,6.5,82.0,tstorms,199,15.0,74,23.0 2344985,Male,2014-06-30 08:30:00,2014-06-30 08:36:00,6.016666666666668,75.0,cloudy,192,39.0,37,19.0 2340287,Male,2014-06-29 19:40:00,2014-06-29 19:42:00,2.283333333333333,82.0,cloudy,261,15.0,342,15.0 2345720,Male,2014-06-30 09:08:00,2014-06-30 09:13:00,5.05,78.1,cloudy,77,23.0,98,15.0 2347633,Male,2014-06-30 12:09:00,2014-06-30 12:25:00,16.283333333333335,82.0,cloudy,35,39.0,91,31.0 2344564,Male,2014-06-30 08:12:00,2014-06-30 08:26:00,14.716666666666667,75.0,cloudy,120,15.0,36,31.0 2331671,Female,2014-06-29 13:38:00,2014-06-29 13:52:00,14.366666666666667,82.9,cloudy,324,15.0,27,19.0 2351598,Male,2014-06-30 16:56:00,2014-06-30 17:22:00,25.73333333333333,84.0,cloudy,44,27.0,129,15.0 2349878,Male,2014-06-30 15:21:00,2014-06-30 15:30:00,9.116666666666667,84.9,cloudy,286,23.0,74,23.0 2353819,Male,2014-06-30 18:15:00,2014-06-30 18:30:00,15.533333333333333,82.0,tstorms,181,31.0,144,15.0 2341212,Male,2014-06-29 20:38:00,2014-06-29 20:42:00,4.25,81.0,cloudy,58,19.0,16,11.0 2348351,Male,2014-06-30 13:07:00,2014-06-30 13:10:00,3.033333333333333,84.9,cloudy,128,15.0,214,15.0 2349751,Male,2014-06-30 15:10:00,2014-06-30 15:21:00,11.45,84.9,cloudy,110,23.0,287,27.0 2349555,Female,2014-06-30 14:54:00,2014-06-30 15:05:00,11.533333333333333,87.1,cloudy,333,15.0,285,15.0 2343978,Male,2014-06-30 07:41:00,2014-06-30 07:44:00,2.75,73.0,cloudy,306,15.0,240,23.0 2340762,Male,2014-06-29 20:07:00,2014-06-29 20:17:00,10.566666666666666,81.0,cloudy,76,39.0,33,27.0 2340252,Male,2014-06-29 19:38:00,2014-06-29 19:56:00,17.883333333333333,82.0,cloudy,228,11.0,324,15.0 2346858,Male,2014-06-30 10:57:00,2014-06-30 11:02:00,4.983333333333333,78.1,cloudy,301,19.0,140,19.0 2341057,Female,2014-06-29 20:27:00,2014-06-29 20:35:00,7.583333333333332,81.0,cloudy,333,15.0,58,19.0 2343714,Male,2014-06-30 07:24:00,2014-06-30 07:32:00,8.516666666666667,73.0,cloudy,174,23.0,43,43.0 2345114,Male,2014-06-30 08:36:00,2014-06-30 08:43:00,6.883333333333334,75.0,cloudy,84,19.0,91,31.0 2352369,Female,2014-06-30 17:19:00,2014-06-30 17:31:00,11.933333333333335,84.0,cloudy,48,27.0,66,19.0 2339210,Male,2014-06-29 18:42:00,2014-06-29 18:52:00,9.683333333333334,84.2,cloudy,289,19.0,85,23.0 2353279,Female,2014-06-30 17:50:00,2014-06-30 18:13:00,23.266666666666666,84.0,cloudy,116,15.0,332,15.0 2334976,Male,2014-06-29 15:35:00,2014-06-29 15:48:00,13.05,82.9,cloudy,177,15.0,329,15.0 2350311,Female,2014-06-30 15:49:00,2014-06-30 16:07:00,18.266666666666666,84.9,cloudy,337,19.0,144,15.0 2353340,Male,2014-06-30 17:53:00,2014-06-30 18:04:00,10.716666666666667,84.0,cloudy,26,31.0,174,23.0 2343441,Male,2014-06-30 07:00:00,2014-06-30 07:11:00,11.483333333333333,73.0,cloudy,231,15.0,244,19.0 2353263,Male,2014-06-30 17:50:00,2014-06-30 17:59:00,8.933333333333334,84.0,cloudy,74,23.0,27,19.0 2353089,Male,2014-06-30 17:43:00,2014-06-30 17:46:00,2.716666666666667,84.0,cloudy,240,23.0,254,15.0 2350120,Male,2014-06-30 15:35:00,2014-06-30 15:48:00,12.65,84.9,cloudy,26,31.0,192,39.0 2334194,Male,2014-06-29 15:06:00,2014-06-29 15:26:00,19.816666666666666,82.9,cloudy,123,15.0,13,19.0 2354567,Male,2014-06-30 19:05:00,2014-06-30 19:55:00,50.23333333333333,73.0,tstorms,177,15.0,67,15.0 2352764,Male,2014-06-30 17:33:00,2014-06-30 17:36:00,3.083333333333333,84.0,cloudy,24,15.0,99,19.0 2350953,Male,2014-06-30 16:29:00,2014-06-30 16:52:00,22.766666666666666,84.0,cloudy,225,15.0,73,19.0 2343435,Female,2014-06-30 06:58:00,2014-06-30 07:06:00,7.716666666666668,73.0,cloudy,255,31.0,37,19.0 2343289,Male,2014-06-30 06:39:00,2014-06-30 06:46:00,7.1,73.0,cloudy,192,39.0,71,15.0 2336898,Female,2014-06-29 16:50:00,2014-06-29 17:09:00,19.316666666666666,84.9,cloudy,61,15.0,152,15.0 2343669,Male,2014-06-30 07:20:00,2014-06-30 07:25:00,4.566666666666666,73.0,cloudy,190,15.0,67,15.0 2346331,Male,2014-06-30 10:01:00,2014-06-30 10:10:00,8.8,78.1,cloudy,169,15.0,169,15.0 2350292,Male,2014-06-30 15:48:00,2014-06-30 15:57:00,8.85,84.9,cloudy,92,19.0,91,31.0 2351212,Male,2014-06-30 16:41:00,2014-06-30 16:51:00,9.783333333333333,84.0,cloudy,52,31.0,174,23.0 2334735,Male,2014-06-29 15:26:00,2014-06-29 15:35:00,9.083333333333334,82.9,cloudy,42,15.0,147,15.0 2344026,Male,2014-06-30 07:44:00,2014-06-30 08:01:00,17.05,73.0,cloudy,192,39.0,331,19.0 2347290,Male,2014-06-30 11:39:00,2014-06-30 11:49:00,9.933333333333334,79.0,cloudy,51,31.0,217,15.0 2353202,Male,2014-06-30 17:47:00,2014-06-30 17:57:00,9.633333333333333,84.0,cloudy,195,31.0,173,15.0 2352276,Female,2014-06-30 17:15:00,2014-06-30 17:21:00,5.066666666666666,84.0,cloudy,234,19.0,293,19.0 2334290,Male,2014-06-29 15:09:00,2014-06-29 15:25:00,16.133333333333333,82.9,cloudy,324,15.0,188,15.0 2354155,Female,2014-06-30 18:33:00,2014-06-30 18:42:00,8.55,82.0,tstorms,306,15.0,244,19.0 2354555,Female,2014-06-30 19:03:00,2014-06-30 19:18:00,14.933333333333335,73.0,tstorms,280,11.0,15,15.0 2352297,Male,2014-06-30 17:16:00,2014-06-30 17:35:00,18.616666666666667,84.0,cloudy,5,19.0,237,15.0 2333663,Male,2014-06-29 14:47:00,2014-06-29 15:11:00,24.7,84.0,cloudy,306,15.0,325,15.0 2338387,Female,2014-06-29 18:00:00,2014-06-29 18:12:00,11.45,84.2,cloudy,54,19.0,301,19.0 2334706,Female,2014-06-29 15:24:00,2014-06-29 15:50:00,25.36666666666667,82.9,cloudy,260,19.0,58,19.0 2352490,Male,2014-06-30 17:23:00,2014-06-30 17:38:00,15.1,84.0,cloudy,331,19.0,192,39.0 2345567,Female,2014-06-30 08:58:00,2014-06-30 09:07:00,8.566666666666666,75.0,cloudy,192,39.0,217,15.0 2343979,Male,2014-06-30 07:41:00,2014-06-30 07:52:00,10.366666666666667,73.0,cloudy,26,31.0,31,23.0 2347648,Male,2014-06-30 12:11:00,2014-06-30 12:17:00,5.65,82.0,cloudy,72,15.0,120,15.0 2343022,Male,2014-06-30 02:49:00,2014-06-30 02:56:00,6.4833333333333325,75.9,tstorms,325,15.0,344,15.0 2344761,Male,2014-06-30 08:20:00,2014-06-30 08:43:00,22.28333333333333,75.0,cloudy,150,11.0,247,15.0 2354841,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 2343301,Male,2014-06-30 06:41:00,2014-06-30 06:46:00,4.933333333333334,73.0,cloudy,319,15.0,13,19.0 2347512,Female,2014-06-30 11:58:00,2014-06-30 12:03:00,4.916666666666667,79.0,cloudy,300,15.0,156,15.0 2338442,Female,2014-06-29 18:03:00,2014-06-29 18:10:00,7.316666666666666,84.2,cloudy,184,19.0,279,15.0 2331523,Female,2014-06-29 13:32:00,2014-06-29 13:36:00,3.9166666666666665,82.9,cloudy,177,15.0,313,19.0 2341092,Female,2014-06-29 20:29:00,2014-06-29 20:36:00,6.516666666666668,81.0,cloudy,117,23.0,229,19.0 2346782,Male,2014-06-30 10:48:00,2014-06-30 10:51:00,2.083333333333333,78.1,cloudy,94,19.0,141,23.0 2343070,Male,2014-06-30 05:33:00,2014-06-30 05:49:00,15.75,73.0,cloudy,276,11.0,92,19.0 2352743,Male,2014-06-30 17:32:00,2014-06-30 17:38:00,6.116666666666666,84.0,cloudy,75,23.0,66,19.0 2345457,Male,2014-06-30 08:52:00,2014-06-30 09:09:00,16.383333333333333,75.0,cloudy,191,23.0,97,35.0 2342802,Male,2014-06-29 23:58:00,2014-06-30 00:04:00,6.0,78.1,cloudy,174,23.0,50,27.0 2345879,Female,2014-06-30 09:17:00,2014-06-30 09:26:00,8.55,78.1,cloudy,27,19.0,60,19.0 2354004,Female,2014-06-30 18:25:00,2014-06-30 18:31:00,5.583333333333332,82.0,tstorms,84,19.0,233,15.0 2345267,Female,2014-06-30 08:42:00,2014-06-30 08:49:00,6.616666666666666,75.0,cloudy,21,15.0,75,23.0 2341906,Male,2014-06-29 21:33:00,2014-06-29 21:41:00,8.016666666666667,79.0,cloudy,337,19.0,301,19.0 2353195,Male,2014-06-30 17:47:00,2014-06-30 17:57:00,10.3,84.0,cloudy,284,23.0,174,23.0 2351576,Female,2014-06-30 16:52:00,2014-06-30 17:11:00,19.1,84.0,cloudy,47,19.0,192,39.0 2343316,Female,2014-06-30 06:44:00,2014-06-30 06:56:00,12.933333333333335,73.0,cloudy,67,15.0,58,19.0 2345673,Male,2014-06-30 09:03:00,2014-06-30 09:15:00,11.433333333333335,78.1,cloudy,91,31.0,52,31.0 2350060,Female,2014-06-30 15:31:00,2014-06-30 15:40:00,9.0,84.9,cloudy,241,15.0,137,15.0 2332386,Male,2014-06-29 14:03:00,2014-06-29 14:19:00,15.433333333333335,84.0,cloudy,56,19.0,106,27.0 2354685,Male,2014-06-30 19:17:00,2014-06-30 19:21:00,3.95,73.0,tstorms,77,23.0,66,19.0 2353543,Male,2014-06-30 18:02:00,2014-06-30 18:05:00,3.2666666666666666,82.0,tstorms,302,19.0,190,15.0 2334165,Female,2014-06-29 15:05:00,2014-06-29 15:43:00,38.11666666666667,82.9,cloudy,294,15.0,177,15.0 2335183,Male,2014-06-29 15:44:00,2014-06-29 16:08:00,23.86666666666667,82.9,cloudy,334,19.0,93,15.0 2352396,Female,2014-06-30 17:20:00,2014-06-30 17:46:00,26.266666666666666,84.0,cloudy,208,15.0,219,11.0 2333734,Male,2014-06-29 14:49:00,2014-06-29 14:58:00,9.233333333333333,84.0,cloudy,5,19.0,76,39.0 2352908,Male,2014-06-30 17:38:00,2014-06-30 17:40:00,2.3833333333333333,84.0,cloudy,268,15.0,268,15.0 2334646,Male,2014-06-29 15:23:00,2014-06-29 15:34:00,10.966666666666667,82.9,cloudy,58,19.0,143,15.0 2347029,Male,2014-06-30 11:16:00,2014-06-30 11:20:00,3.733333333333333,79.0,cloudy,192,39.0,91,31.0 2341046,Male,2014-06-29 20:26:00,2014-06-29 20:39:00,13.583333333333336,81.0,cloudy,116,15.0,216,15.0 2351755,Male,2014-06-30 17:00:00,2014-06-30 17:06:00,6.016666666666668,84.0,cloudy,276,11.0,116,15.0 2339161,Female,2014-06-29 18:39:00,2014-06-29 18:45:00,5.883333333333334,84.2,cloudy,24,15.0,47,19.0 2332742,Male,2014-06-29 14:15:00,2014-06-29 14:25:00,9.166666666666666,84.0,cloudy,111,19.0,110,23.0 2342671,Male,2014-06-29 23:20:00,2014-06-29 23:30:00,10.45,78.1,cloudy,76,39.0,110,23.0 2339391,Male,2014-06-29 18:50:00,2014-06-29 18:57:00,6.666666666666668,84.2,cloudy,66,19.0,44,27.0 2337832,Male,2014-06-29 17:32:00,2014-06-29 17:42:00,10.433333333333334,84.9,cloudy,138,15.0,110,23.0 2352083,Female,2014-06-30 17:10:00,2014-06-30 17:17:00,7.183333333333334,84.0,cloudy,26,31.0,43,43.0 2336923,Female,2014-06-29 16:51:00,2014-06-29 16:59:00,8.133333333333333,84.9,cloudy,324,15.0,144,15.0 2353328,Male,2014-06-30 17:53:00,2014-06-30 18:00:00,7.7,84.0,cloudy,75,23.0,56,19.0 2344939,Female,2014-06-30 08:28:00,2014-06-30 08:33:00,4.766666666666667,75.0,cloudy,290,15.0,123,15.0 2337622,Male,2014-06-29 17:22:00,2014-06-29 17:24:00,2.4166666666666665,84.9,cloudy,48,27.0,74,23.0 2353293,Male,2014-06-30 17:51:00,2014-06-30 18:01:00,10.216666666666667,84.0,cloudy,98,15.0,195,31.0 2353640,Male,2014-06-30 18:06:00,2014-06-30 18:17:00,10.583333333333334,82.0,tstorms,69,19.0,222,19.0 2354232,Male,2014-06-30 18:38:00,2014-06-30 18:44:00,6.666666666666668,82.0,tstorms,198,19.0,66,19.0 2343124,Male,2014-06-30 06:07:00,2014-06-30 06:10:00,3.066666666666667,73.0,cloudy,173,15.0,173,15.0 2344561,Female,2014-06-30 08:12:00,2014-06-30 08:27:00,15.666666666666664,75.0,cloudy,183,15.0,91,31.0 2353009,Male,2014-06-30 17:41:00,2014-06-30 17:52:00,11.966666666666667,84.0,cloudy,195,31.0,174,23.0 2340717,Male,2014-06-29 20:04:00,2014-06-29 20:16:00,12.133333333333333,81.0,cloudy,177,15.0,313,19.0 2335547,Male,2014-06-29 15:57:00,2014-06-29 16:18:00,20.883333333333333,82.9,cloudy,143,15.0,17,15.0 2340288,Male,2014-06-29 19:40:00,2014-06-29 20:01:00,20.816666666666666,82.0,cloudy,220,19.0,309,11.0 2352939,Female,2014-06-30 17:36:00,2014-06-30 17:50:00,14.416666666666664,84.0,cloudy,308,11.0,239,15.0 2337929,Male,2014-06-29 17:36:00,2014-06-29 18:02:00,25.55,84.9,cloudy,62,27.0,284,23.0 2346751,Female,2014-06-30 10:46:00,2014-06-30 11:12:00,25.41666666666667,78.1,cloudy,28,15.0,113,15.0 2345641,Male,2014-06-30 09:03:00,2014-06-30 09:15:00,11.933333333333335,78.1,cloudy,198,19.0,86,15.0 2353343,Male,2014-06-30 17:53:00,2014-06-30 18:01:00,8.116666666666667,84.0,cloudy,51,31.0,198,19.0 2347695,Male,2014-06-30 12:16:00,2014-06-30 12:32:00,16.316666666666666,82.0,cloudy,232,23.0,347,15.0 2354109,Female,2014-06-30 18:31:00,2014-06-30 18:33:00,2.533333333333333,82.0,tstorms,60,19.0,93,15.0 2353112,Male,2014-06-30 17:44:00,2014-06-30 17:47:00,3.15,84.0,cloudy,240,23.0,254,15.0 2353636,Female,2014-06-30 18:06:00,2014-06-30 18:14:00,8.233333333333333,82.0,tstorms,283,23.0,59,19.0 2346531,Female,2014-06-30 10:25:00,2014-06-30 10:37:00,12.616666666666667,78.1,cloudy,111,19.0,26,31.0 2350667,Female,2014-06-30 16:12:00,2014-06-30 16:29:00,16.833333333333332,84.0,cloudy,331,19.0,163,15.0 2352263,Male,2014-06-30 17:13:00,2014-06-30 17:23:00,10.216666666666667,84.0,cloudy,36,31.0,134,19.0 2343139,Male,2014-06-30 06:15:00,2014-06-30 06:26:00,10.483333333333333,73.0,cloudy,91,31.0,5,19.0 2346334,Female,2014-06-30 10:02:00,2014-06-30 10:09:00,7.4,78.1,cloudy,278,15.0,184,19.0 2352069,Male,2014-06-30 17:10:00,2014-06-30 17:18:00,8.55,84.0,cloudy,111,19.0,91,31.0 2331932,Female,2014-06-29 13:48:00,2014-06-29 13:58:00,10.4,82.9,cloudy,20,15.0,94,19.0 2331609,Female,2014-06-29 13:35:00,2014-06-29 13:55:00,19.766666666666666,82.9,cloudy,35,39.0,177,15.0 2343604,Male,2014-06-30 07:15:00,2014-06-30 07:22:00,6.9833333333333325,73.0,cloudy,321,19.0,49,27.0 2333195,Female,2014-06-29 14:30:00,2014-06-29 14:41:00,11.316666666666665,84.0,cloudy,165,19.0,154,15.0 2337860,Male,2014-06-29 17:33:00,2014-06-29 17:40:00,7.25,84.9,cloudy,247,15.0,322,15.0 2343204,Male,2014-06-30 06:31:00,2014-06-30 06:43:00,12.5,73.0,cloudy,185,11.0,327,19.0 2343372,Male,2014-06-30 06:49:00,2014-06-30 06:54:00,5.533333333333332,73.0,cloudy,50,27.0,197,19.0 2353786,Male,2014-06-30 18:13:00,2014-06-30 18:16:00,2.783333333333333,82.0,tstorms,311,15.0,243,15.0 2348832,Male,2014-06-30 13:51:00,2014-06-30 13:58:00,6.966666666666668,84.9,cloudy,215,15.0,217,15.0 2347916,Male,2014-06-30 12:35:00,2014-06-30 12:45:00,10.116666666666667,82.0,cloudy,99,19.0,100,23.0 2351389,Male,2014-06-30 16:49:00,2014-06-30 16:53:00,3.816666666666667,84.0,cloudy,100,23.0,47,19.0 2347162,Female,2014-06-30 11:28:00,2014-06-30 11:38:00,9.95,79.0,cloudy,5,19.0,81,39.0 2351953,Male,2014-06-30 17:07:00,2014-06-30 17:22:00,15.866666666666667,84.0,cloudy,80,19.0,5,19.0 2343136,Male,2014-06-30 06:14:00,2014-06-30 06:26:00,12.016666666666667,73.0,cloudy,137,15.0,50,27.0 2345949,Female,2014-06-30 09:23:00,2014-06-30 09:32:00,8.833333333333334,78.1,cloudy,195,31.0,100,23.0 2336436,Male,2014-06-29 16:31:00,2014-06-29 16:43:00,11.983333333333333,84.9,cloudy,129,15.0,342,15.0 2353707,Male,2014-06-30 18:09:00,2014-06-30 18:20:00,11.616666666666667,82.0,tstorms,306,15.0,316,19.0 2340111,Male,2014-06-29 19:31:00,2014-06-29 19:42:00,11.2,82.0,cloudy,338,15.0,341,19.0 2340435,Female,2014-06-29 19:44:00,2014-06-29 19:50:00,5.716666666666668,82.0,cloudy,300,15.0,332,15.0 2352062,Male,2014-06-30 17:09:00,2014-06-30 17:19:00,9.75,84.0,cloudy,287,27.0,110,23.0 2336716,Female,2014-06-29 16:43:00,2014-06-29 17:04:00,21.78333333333333,84.9,cloudy,131,15.0,157,15.0 2344547,Male,2014-06-30 08:11:00,2014-06-30 08:26:00,15.133333333333333,75.0,cloudy,171,11.0,36,31.0 2347859,Male,2014-06-30 12:30:00,2014-06-30 12:55:00,24.016666666666666,82.0,cloudy,334,19.0,173,15.0 2345740,Male,2014-06-30 09:09:00,2014-06-30 09:18:00,8.566666666666666,78.1,cloudy,91,31.0,43,43.0 2331961,Male,2014-06-29 13:48:00,2014-06-29 13:56:00,7.566666666666666,82.9,cloudy,196,19.0,43,43.0 2349634,Female,2014-06-30 15:00:00,2014-06-30 15:12:00,12.483333333333333,84.9,cloudy,287,27.0,287,27.0 2347818,Male,2014-06-30 12:27:00,2014-06-30 12:33:00,5.95,82.0,cloudy,36,31.0,134,19.0 2344695,Female,2014-06-30 08:18:00,2014-06-30 08:30:00,12.616666666666667,75.0,cloudy,192,39.0,110,23.0 2351968,Female,2014-06-30 17:07:00,2014-06-30 17:22:00,15.55,84.0,cloudy,48,27.0,332,15.0 2349769,Female,2014-06-30 15:11:00,2014-06-30 15:29:00,17.7,84.9,cloudy,69,19.0,143,15.0 2339858,Male,2014-06-29 19:17:00,2014-06-29 19:22:00,4.883333333333334,82.0,cloudy,223,15.0,225,15.0 2347741,Female,2014-06-30 12:16:00,2014-06-30 13:14:00,58.56666666666667,82.0,cloudy,52,31.0,52,31.0 2345428,Female,2014-06-30 08:51:00,2014-06-30 09:00:00,8.55,75.0,cloudy,346,15.0,233,15.0 2353422,Male,2014-06-30 17:57:00,2014-06-30 18:05:00,8.15,84.0,cloudy,68,23.0,282,15.0 ================================================ FILE: docs/source/examples/demo/next_purchase/__init__.py ================================================ import os import pandas as pd import requests import tarfile from demo import PWD, utils from tqdm import tqdm URL = r"https://s3.amazonaws.com/instacart-datasets/instacart_online_grocery_shopping_2017_05_01.tar.gz" PWD = os.path.join(PWD, "next_purchase") def _add_time(df, start="2015-01-01"): def timedelta(value, string): return pd.Timedelta(string.format(value)) def process_orders(user): orders = user.groupby("order_id") days = orders.days_since_prior_order.first() days = days.cumsum().apply(timedelta, string="{}d") days = days.add(pd.Timestamp(start)) hour_of_day = orders.order_hour_of_day.first() hour_of_day = hour_of_day.apply(timedelta, string="{}h") order_time = days.add(hour_of_day) return order_time df.days_since_prior_order.fillna(0, inplace=True) order_time = df.groupby("user_id").apply(process_orders).rename("order_time") columns = [ "order_number", "order_dow", "order_hour_of_day", "days_since_prior_order", "eval_set", ] df.drop(columns, axis=1, inplace=True) df = df.merge(order_time.reset_index(), on=["user_id", "order_id"]) return df def _data(nrows=1000000): output = os.path.join(PWD, "download") path = os.path.join(output, "instacart_2017_05_01") if not os.path.exists(path): utils.download(URL, output) file = os.path.join(path, "order_products__prior.csv") order_products = pd.read_csv(file, nrows=nrows) file = os.path.join(path, "products.csv") products = pd.read_csv(file) file = os.path.join(path, "departments.csv") departments = pd.read_csv(file) file = os.path.join(path, "orders.csv") orders = pd.read_csv(file, nrows=nrows) df = order_products.merge(products).merge(departments).merge(orders) df = df.pipe(_add_time) return df def _read(file): path = os.path.join(PWD, file) df = pd.read_csv(path, parse_dates=["order_time"], index_col="id") return df def load_sample(): return _read("sample.csv") ================================================ FILE: docs/source/examples/demo/next_purchase/sample.csv ================================================ id,order_id,product_id,add_to_cart_order,reordered,product_name,aisle_id,department_id,department,user_id,order_time 24,623,33120,1,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-01-04 12:00:00 25,623,40706,3,1,Organic Grape Tomatoes,123,4,produce,37804,2015-01-04 12:00:00 26,623,38777,5,1,Organic Green Seedless Grapes,123,4,produce,37804,2015-01-04 12:00:00 27,623,34126,9,1,Organic Italian Parsley Bunch,16,4,produce,37804,2015-01-04 12:00:00 28,623,19678,4,1,Organic Russet Potato,83,4,produce,37804,2015-01-04 12:00:00 29,623,10749,11,1,Organic Red Bell Pepper,83,4,produce,37804,2015-01-04 12:00:00 30,623,27521,2,1,Organic Lacinato (Dinosaur) Kale,83,4,produce,37804,2015-01-04 12:00:00 31,623,4562,6,1,English Seedless Cucumber,83,4,produce,37804,2015-01-04 12:00:00 32,623,47788,7,1,Honeydew Melon,24,4,produce,37804,2015-01-04 12:00:00 33,623,14575,8,1,Organic Cello Lettuce,83,4,produce,37804,2015-01-04 12:00:00 34,623,32052,10,1,Organic Brown Rice Cake Salt-Free,78,19,snacks,37804,2015-01-04 12:00:00 35,726,33120,3,1,Organic Egg Whites,86,16,dairy eggs,57362,2015-01-08 17:00:00 36,726,32655,5,1,Organic Large Grade AA Brown Eggs,86,16,dairy eggs,57362,2015-01-08 17:00:00 37,726,17794,4,1,Carrots,83,4,produce,57362,2015-01-08 17:00:00 38,726,31915,2,1,Organic Red Delicious Apple,24,4,produce,57362,2015-01-08 17:00:00 39,726,25181,6,1,Fragrance Free Automatic Dishwasher Tablets,74,17,household,57362,2015-01-08 17:00:00 40,726,46737,7,1,2x Ultra Liquid Laundry Detergent,75,17,household,57362,2015-01-08 17:00:00 41,726,24489,1,1,Organic Whole Strawberries,116,1,frozen,57362,2015-01-08 17:00:00 183,10084,33120,10,1,Organic Egg Whites,86,16,dairy eggs,6851,2015-01-12 22:00:00 184,10084,432,11,1,Vanilla Almond Breeze Almond Milk,91,16,dairy eggs,6851,2015-01-12 22:00:00 185,10084,21903,8,1,Organic Baby Spinach,123,4,produce,6851,2015-01-12 22:00:00 186,10084,13176,7,1,Bag of Organic Bananas,24,4,produce,6851,2015-01-12 22:00:00 187,10084,47766,6,1,Organic Avocado,24,4,produce,6851,2015-01-12 22:00:00 188,10084,21137,14,0,Organic Strawberries,24,4,produce,6851,2015-01-12 22:00:00 189,10084,35547,9,1,Organic Baby Kale,83,4,produce,6851,2015-01-12 22:00:00 190,10084,39275,13,1,Organic Blueberries,123,4,produce,6851,2015-01-12 22:00:00 191,10084,5876,5,1,Organic Lemon,24,4,produce,6851,2015-01-12 22:00:00 192,10084,19057,12,1,Organic Large Extra Fancy Fuji Apple,24,4,produce,6851,2015-01-12 22:00:00 193,10084,36702,4,1,Active Electrolyte Enhanced Drink Tabs 10 Servings Tri-Berry,47,11,personal care,6851,2015-01-12 22:00:00 194,10084,4352,1,1,Beverage Tab Wild Berry,47,11,personal care,6851,2015-01-12 22:00:00 195,10084,40589,3,1,Lemonlime Electrolyte Tabs,90,7,beverages,6851,2015-01-12 22:00:00 196,10084,20574,2,1,Roasted Turkey,96,20,deli,6851,2015-01-12 22:00:00 318,13368,33120,4,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-01-07 18:00:00 319,13368,39275,1,1,Organic Blueberries,123,4,produce,37804,2015-01-07 18:00:00 320,13368,40706,8,1,Organic Grape Tomatoes,123,4,produce,37804,2015-01-07 18:00:00 321,13368,6873,7,1,Organic Iceberg Lettuce,83,4,produce,37804,2015-01-07 18:00:00 322,13368,10749,5,1,Organic Red Bell Pepper,83,4,produce,37804,2015-01-07 18:00:00 323,13368,27521,6,1,Organic Lacinato (Dinosaur) Kale,83,4,produce,37804,2015-01-07 18:00:00 324,13368,4562,9,1,English Seedless Cucumber,83,4,produce,37804,2015-01-07 18:00:00 325,13368,10974,3,1,Gluten Free Rice & Shine Hot Cereal,130,14,breakfast,37804,2015-01-07 18:00:00 326,13368,24489,2,1,Organic Whole Strawberries,116,1,frozen,37804,2015-01-07 18:00:00 391,18214,33120,1,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-01-30 19:00:00 392,18214,30391,2,1,Organic Cucumber,83,4,produce,37804,2015-01-30 19:00:00 393,18214,6873,6,0,Organic Iceberg Lettuce,83,4,produce,37804,2015-01-30 19:00:00 394,18214,7500,4,1,Organic Vanilla Extract,17,13,pantry,37804,2015-01-30 19:00:00 395,18214,39562,5,0,"Baking Soda Toothpowder, Dazzling Mint",20,11,personal care,37804,2015-01-30 19:00:00 396,18214,10974,3,1,Gluten Free Rice & Shine Hot Cereal,130,14,breakfast,37804,2015-01-30 19:00:00 641,26249,33120,5,1,Organic Egg Whites,86,16,dairy eggs,8167,2015-01-08 11:00:00 642,26249,20842,3,1,Total 0% Greek Yogurt,120,16,dairy eggs,8167,2015-01-08 11:00:00 643,26249,21903,6,1,Organic Baby Spinach,123,4,produce,8167,2015-01-08 11:00:00 644,26249,21137,7,1,Organic Strawberries,24,4,produce,8167,2015-01-08 11:00:00 645,26249,49683,1,1,Cucumber Kirby,83,4,produce,8167,2015-01-08 11:00:00 646,26249,8277,4,1,Apple Honeycrisp Organic,24,4,produce,8167,2015-01-08 11:00:00 647,26249,45007,2,1,Organic Zucchini,83,4,produce,8167,2015-01-08 11:00:00 648,26249,10343,8,1,Teriyaki Chicken Bowl,38,1,frozen,8167,2015-01-08 11:00:00 649,26249,19174,9,1,Chicken Enchilada Bowl,38,1,frozen,8167,2015-01-08 11:00:00 1078,41962,33120,5,1,Organic Egg Whites,86,16,dairy eggs,57362,2015-01-23 17:00:00 1079,41962,12384,11,1,Organic Lactose Free 1% Lowfat Milk,91,16,dairy eggs,57362,2015-01-23 17:00:00 1080,41962,23955,23,0,Vanilla Soy Milk,91,16,dairy eggs,57362,2015-01-23 17:00:00 1081,41962,27086,9,1,Half & Half,53,16,dairy eggs,57362,2015-01-23 17:00:00 1082,41962,46820,10,1,Vanilla Pure Almond Milk,91,16,dairy eggs,57362,2015-01-23 17:00:00 1083,41962,21903,21,0,Organic Baby Spinach,123,4,produce,57362,2015-01-23 17:00:00 1084,41962,13176,1,1,Bag of Organic Bananas,24,4,produce,57362,2015-01-23 17:00:00 1085,41962,31915,2,1,Organic Red Delicious Apple,24,4,produce,57362,2015-01-23 17:00:00 1086,41962,45007,20,0,Organic Zucchini,83,4,produce,57362,2015-01-23 17:00:00 1087,41962,17284,14,1,Organic Sugar Snap Peas,83,4,produce,57362,2015-01-23 17:00:00 1088,41962,41220,18,1,Organic Romaine Lettuce,83,4,produce,57362,2015-01-23 17:00:00 1089,41962,3896,4,1,Organic Honey Sweet Whole Wheat Bread,112,3,bakery,57362,2015-01-23 17:00:00 1090,41962,48415,7,1,Big California Sourdough Bread,112,3,bakery,57362,2015-01-23 17:00:00 1091,41962,46011,22,0,Honest Sweet Orange Vanilla Detangling Conditioner,22,11,personal care,57362,2015-01-23 17:00:00 1092,41962,25069,15,1,Organic Aged Earl Grey Tea,94,7,beverages,57362,2015-01-23 17:00:00 1093,41962,45635,17,1,Blueberry B Fruit Smoothie,31,7,beverages,57362,2015-01-23 17:00:00 1094,41962,7677,16,1,Strawberry Banana Flavored 4 Juice Smoothie Blend,98,7,beverages,57362,2015-01-23 17:00:00 1095,41962,5764,12,1,Organic SprouTofu Teriyaki Tofu Cutlets,14,20,deli,57362,2015-01-23 17:00:00 1096,41962,1103,3,1,Hickory Smoked Turkey Breast,96,20,deli,57362,2015-01-23 17:00:00 1097,41962,30290,8,1,100% Recycled Bath Tissue Rolls,54,17,household,57362,2015-01-23 17:00:00 1098,41962,47008,13,1,Sliced Water Chestnuts,66,6,international,57362,2015-01-23 17:00:00 1099,41962,24489,6,1,Organic Whole Strawberries,116,1,frozen,57362,2015-01-23 17:00:00 1100,41962,45013,19,0,Apple Sauce,99,15,canned goods,57362,2015-01-23 17:00:00 1211,45253,33120,4,1,Organic Egg Whites,86,16,dairy eggs,8167,2015-01-16 21:00:00 1212,45253,20842,1,1,Total 0% Greek Yogurt,120,16,dairy eggs,8167,2015-01-16 21:00:00 1213,45253,8277,2,1,Apple Honeycrisp Organic,24,4,produce,8167,2015-01-16 21:00:00 1214,45253,21077,3,1,Cara Cara Navel Orange,24,4,produce,8167,2015-01-16 21:00:00 1215,45253,34565,5,1,Peanut Butter Whole Grain Clusters,57,14,breakfast,8167,2015-01-16 21:00:00 1216,45253,28682,8,0,Chocolate Peanut Butter Cup Gelato,37,1,frozen,8167,2015-01-16 21:00:00 1217,45253,10343,6,1,Teriyaki Chicken Bowl,38,1,frozen,8167,2015-01-16 21:00:00 1218,45253,19174,7,1,Chicken Enchilada Bowl,38,1,frozen,8167,2015-01-16 21:00:00 1361,50496,33120,2,1,Organic Egg Whites,86,16,dairy eggs,32620,2015-01-31 13:00:00 1362,50496,24838,16,1,Unsweetened Almondmilk,91,16,dairy eggs,32620,2015-01-31 13:00:00 1363,50496,13176,1,1,Bag of Organic Bananas,24,4,produce,32620,2015-01-31 13:00:00 1364,50496,8518,23,1,Organic Red Onion,83,4,produce,32620,2015-01-31 13:00:00 1365,50496,40706,15,1,Organic Grape Tomatoes,123,4,produce,32620,2015-01-31 13:00:00 1366,50496,27104,3,1,Fresh Cauliflower,83,4,produce,32620,2015-01-31 13:00:00 1367,50496,44359,21,0,Organic Small Bunch Celery,83,4,produce,32620,2015-01-31 13:00:00 1368,50496,47734,24,0,Organic Green Cabbage,83,4,produce,32620,2015-01-31 13:00:00 1369,50496,40723,20,1,Organic Cripps Pink Apples,24,4,produce,32620,2015-01-31 13:00:00 1370,50496,41220,22,0,Organic Romaine Lettuce,83,4,produce,32620,2015-01-31 13:00:00 1371,50496,10913,19,0,Gluten Free Rice Almond Bread,112,3,bakery,32620,2015-01-31 13:00:00 1372,50496,2996,13,0,Honeysuckle Hand Soap,25,11,personal care,32620,2015-01-31 13:00:00 1373,50496,34137,18,0,Chocolate Sea Salt,3,19,snacks,32620,2015-01-31 13:00:00 1374,50496,9515,11,1,Natural Classic Pork Breakfast Sausage,52,1,frozen,32620,2015-01-31 13:00:00 1375,50496,436,8,1,Petite Brussels Sprouts,116,1,frozen,32620,2015-01-31 13:00:00 1376,50496,31263,9,1,Breaded Fish Sticks,34,1,frozen,32620,2015-01-31 13:00:00 1377,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 1378,50496,7461,6,1,Pinto Beans No Salt Added,59,15,canned goods,32620,2015-01-31 13:00:00 1379,50496,28849,5,1,No Salt Added Black Beans,59,15,canned goods,32620,2015-01-31 13:00:00 1380,50496,22395,7,1,Tomato Sauce,81,15,canned goods,32620,2015-01-31 13:00:00 1381,50496,20670,12,1,Organic Lentil Vegetable Soup,69,15,canned goods,32620,2015-01-31 13:00:00 1382,50496,5024,10,1,Dark Red Kidney Beans No Salt Added,59,15,canned goods,32620,2015-01-31 13:00:00 1383,50496,16131,4,1,"Organic Chicken Noodle Soup, Reduced Sodium",69,15,canned goods,32620,2015-01-31 13:00:00 1384,50496,18542,17,0,Protein Bar Mint Chocolate,100,21,missing,32620,2015-01-31 13:00:00 1637,60837,33120,5,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-02-01 16:00:00 1638,60837,13176,2,1,Bag of Organic Bananas,24,4,produce,37804,2015-02-01 16:00:00 1639,60837,40706,3,1,Organic Grape Tomatoes,123,4,produce,37804,2015-02-01 16:00:00 1640,60837,38777,7,1,Organic Green Seedless Grapes,123,4,produce,37804,2015-02-01 16:00:00 1641,60837,12496,4,1,Radish,83,4,produce,37804,2015-02-01 16:00:00 1642,60837,27521,6,1,Organic Lacinato (Dinosaur) Kale,83,4,produce,37804,2015-02-01 16:00:00 1643,60837,43768,1,1,Organic Bell Pepper,83,4,produce,37804,2015-02-01 16:00:00 2453,90352,33120,2,1,Organic Egg Whites,86,16,dairy eggs,37804,2015-02-03 19:00:00 2454,90352,13176,1,1,Bag of Organic Bananas,24,4,produce,37804,2015-02-03 19:00:00 2455,90352,42265,5,1,Organic Baby Carrots,123,4,produce,37804,2015-02-03 19:00:00 2456,90352,40706,3,1,Organic Grape Tomatoes,123,4,produce,37804,2015-02-03 19:00:00 2457,90352,19678,7,1,Organic Russet Potato,83,4,produce,37804,2015-02-03 19:00:00 2458,90352,10749,10,1,Organic Red Bell Pepper,83,4,produce,37804,2015-02-03 19:00:00 2459,90352,47759,6,1,Mandarin Oranges,24,4,produce,37804,2015-02-03 19:00:00 2460,90352,11526,8,1,Napa Cabbage,83,4,produce,37804,2015-02-03 19:00:00 2461,90352,8021,4,1,100% Recycled Paper Towels,54,17,household,37804,2015-02-03 19:00:00 2462,90352,20995,9,1,Organic Broccoli Florets,116,1,frozen,37804,2015-02-03 19:00:00 2471,92051,33120,3,1,Organic Egg Whites,86,16,dairy eggs,8167,2015-01-21 09:00:00 2472,92051,19348,9,1,Fat Free Milk,84,16,dairy eggs,8167,2015-01-21 09:00:00 2473,92051,20842,1,1,Total 0% Greek Yogurt,120,16,dairy eggs,8167,2015-01-21 09:00:00 2474,92051,49683,6,1,Cucumber Kirby,83,4,produce,8167,2015-01-21 09:00:00 2475,92051,8277,4,1,Apple Honeycrisp Organic,24,4,produce,8167,2015-01-21 09:00:00 2476,92051,21077,2,1,Cara Cara Navel Orange,24,4,produce,8167,2015-01-21 09:00:00 2477,92051,15803,5,1,Organic Sweet Potato Puree,17,13,pantry,8167,2015-01-21 09:00:00 2478,92051,13877,7,1,Smoked Salmon,15,12,meat seafood,8167,2015-01-21 09:00:00 2479,92051,10343,8,1,Teriyaki Chicken Bowl,38,1,frozen,8167,2015-01-21 09:00:00 2523,96076,33120,5,1,Organic Egg Whites,86,16,dairy eggs,6851,2015-02-07 19:00:00 2524,96076,47144,4,0,Unsweetened Original Almond Breeze Almond Milk,91,16,dairy eggs,6851,2015-02-07 19:00:00 2525,96076,25533,2,1,Vegan Chao Creamy Original Cheese Slices,21,16,dairy eggs,6851,2015-02-07 19:00:00 2526,96076,35090,3,1,"Chao, Vegan, Coconut Herb, Slices",21,16,dairy eggs,6851,2015-02-07 19:00:00 2527,96076,13176,11,1,Bag of Organic Bananas,24,4,produce,6851,2015-02-07 19:00:00 2528,96076,35547,1,1,Organic Baby Kale,83,4,produce,6851,2015-02-07 19:00:00 2529,96076,1360,7,1,Crunchy Peanut Butter,88,13,pantry,6851,2015-02-07 19:00:00 2530,96076,18027,6,0,Ezekiel 4:9 Bread Organic Sprouted Whole Grain,112,3,bakery,6851,2015-02-07 19:00:00 2531,96076,24810,9,0,Organic Lightly Salted Brown Rice Cakes,78,19,snacks,6851,2015-02-07 19:00:00 2532,96076,42719,8,1,Natural Premium Coconut Water,98,7,beverages,6851,2015-02-07 19:00:00 2533,96076,20574,10,0,Roasted Turkey,96,20,deli,6851,2015-02-07 19:00:00 2646,102955,33120,7,1,Organic Egg Whites,86,16,dairy eggs,57362,2015-02-01 16:00:00 2647,102955,651,14,1,Organic Salted Butter,36,16,dairy eggs,57362,2015-02-01 16:00:00 2648,102955,13176,1,1,Bag of Organic Bananas,24,4,produce,57362,2015-02-01 16:00:00 2649,102955,31915,4,1,Organic Red Delicious Apple,24,4,produce,57362,2015-02-01 16:00:00 2650,102955,6860,12,1,Organic Balsamic Vinaigrette,89,13,pantry,57362,2015-02-01 16:00:00 2651,102955,3896,3,1,Organic Honey Sweet Whole Wheat Bread,112,3,bakery,57362,2015-02-01 16:00:00 2652,102955,48415,15,1,Big California Sourdough Bread,112,3,bakery,57362,2015-02-01 16:00:00 2653,102955,36302,11,0,"Soap, Coconut Creme",25,11,personal care,57362,2015-02-01 16:00:00 2654,102955,13605,9,1,Frosted berry Strawberry Toaster Pastries,48,14,breakfast,57362,2015-02-01 16:00:00 2655,102955,25767,13,1,Organic Multi Grain Squares Cereal,121,14,breakfast,57362,2015-02-01 16:00:00 2656,102955,23288,6,1,Distilled Water,115,7,beverages,57362,2015-02-01 16:00:00 2657,102955,18873,10,1,Organic Earl Grey Black Tea 16 Count,94,7,beverages,57362,2015-02-01 16:00:00 2658,102955,1103,2,1,Hickory Smoked Turkey Breast,96,20,deli,57362,2015-02-01 16:00:00 2659,102955,30290,8,1,100% Recycled Bath Tissue Rolls,54,17,household,57362,2015-02-01 16:00:00 2660,102955,24489,5,1,Organic Whole Strawberries,116,1,frozen,57362,2015-02-01 16:00:00 3291,13331,33754,1,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-03 09:00:00 3292,13331,18523,4,1,Total 2% All Natural Greek Strained Yogurt with Honey,120,16,dairy eggs,31606,2015-01-03 09:00:00 3293,13331,30169,5,1,Total 2% All Natural Plain Greek Yogurt,120,16,dairy eggs,31606,2015-01-03 09:00:00 3294,13331,4957,2,1,Total 2% Lowfat Greek Strained Yogurt With Blueberry,120,16,dairy eggs,31606,2015-01-03 09:00:00 3295,13331,33787,6,1,Total 2% Lowfat Greek Strained Yogurt with Peach,120,16,dairy eggs,31606,2015-01-03 09:00:00 3296,13331,25340,7,1,Large Yellow Flesh Nectarine,24,4,produce,31606,2015-01-03 09:00:00 3297,13331,30756,9,1,Mandarin Clementine Bag,24,4,produce,31606,2015-01-03 09:00:00 3298,13331,43442,8,1,Veggie Tray,123,4,produce,31606,2015-01-03 09:00:00 3299,13331,48559,3,1,Synergy Organic Kombucha Gingerberry,31,7,beverages,31606,2015-01-03 09:00:00 3555,16686,33754,4,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-08 10:00:00 3556,16686,27845,10,1,Organic Whole Milk,84,16,dairy eggs,31606,2015-01-08 10:00:00 3557,16686,39475,8,1,Total Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-08 10:00:00 3558,16686,18523,6,1,Total 2% All Natural Greek Strained Yogurt with Honey,120,16,dairy eggs,31606,2015-01-08 10:00:00 3559,16686,4957,1,1,Total 2% Lowfat Greek Strained Yogurt With Blueberry,120,16,dairy eggs,31606,2015-01-08 10:00:00 3560,16686,33787,5,1,Total 2% Lowfat Greek Strained Yogurt with Peach,120,16,dairy eggs,31606,2015-01-08 10:00:00 3561,16686,8061,7,1,Pineapple Yogurt 2%,120,16,dairy eggs,31606,2015-01-08 10:00:00 3562,16686,28204,12,1,Organic Fuji Apple,24,4,produce,31606,2015-01-08 10:00:00 3563,16686,37646,11,1,Organic Gala Apples,24,4,produce,31606,2015-01-08 10:00:00 3564,16686,39877,2,1,Organic Granny Smith Apple,24,4,produce,31606,2015-01-08 10:00:00 3565,16686,47759,3,1,Mandarin Oranges,24,4,produce,31606,2015-01-08 10:00:00 3566,16686,31683,9,1,Original No Pulp 100% Florida Orange Juice,31,7,beverages,31606,2015-01-08 10:00:00 4193,32918,33754,2,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-10 09:00:00 4194,32918,30169,4,1,Total 2% All Natural Plain Greek Yogurt,120,16,dairy eggs,31606,2015-01-10 09:00:00 4195,32918,4957,1,1,Total 2% Lowfat Greek Strained Yogurt With Blueberry,120,16,dairy eggs,31606,2015-01-10 09:00:00 4196,32918,33787,5,1,Total 2% Lowfat Greek Strained Yogurt with Peach,120,16,dairy eggs,31606,2015-01-10 09:00:00 4197,32918,8061,9,1,Pineapple Yogurt 2%,120,16,dairy eggs,31606,2015-01-10 09:00:00 4198,32918,19057,6,1,Organic Large Extra Fancy Fuji Apple,24,4,produce,31606,2015-01-10 09:00:00 4199,32918,25340,8,1,Large Yellow Flesh Nectarine,24,4,produce,31606,2015-01-10 09:00:00 4200,32918,47759,7,1,Mandarin Oranges,24,4,produce,31606,2015-01-10 09:00:00 4201,32918,48559,3,1,Synergy Organic Kombucha Gingerberry,31,7,beverages,31606,2015-01-10 09:00:00 4202,32918,26620,11,0,Peach Pear Flavored Sparkling Water,115,7,beverages,31606,2015-01-10 09:00:00 4203,32918,49520,10,0,Orange Sparkling Water,115,7,beverages,31606,2015-01-10 09:00:00 4350,34537,33754,1,0,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,19114,2015-01-01 13:00:00 4351,34537,39475,9,0,Total Greek Strained Yogurt,120,16,dairy eggs,19114,2015-01-01 13:00:00 4352,34537,30233,15,0,Organic Large Brown Grade AA Cage Free Eggs,86,16,dairy eggs,19114,2015-01-01 13:00:00 4353,34537,4269,14,0,Mild Cheddar Cheese,21,16,dairy eggs,19114,2015-01-01 13:00:00 4354,34537,21903,6,0,Organic Baby Spinach,123,4,produce,19114,2015-01-01 13:00:00 4355,34537,13176,4,0,Bag of Organic Bananas,24,4,produce,19114,2015-01-01 13:00:00 4356,34537,47209,3,0,Organic Hass Avocado,24,4,produce,19114,2015-01-01 13:00:00 4357,34537,42265,11,0,Organic Baby Carrots,123,4,produce,19114,2015-01-01 13:00:00 4358,34537,22825,10,0,Organic D'Anjou Pears,24,4,produce,19114,2015-01-01 13:00:00 4359,34537,39275,7,0,Organic Blueberries,123,4,produce,19114,2015-01-01 13:00:00 4360,34537,37646,16,0,Organic Gala Apples,24,4,produce,19114,2015-01-01 13:00:00 4361,34537,8174,19,0,Organic Navel Orange,24,4,produce,19114,2015-01-01 13:00:00 4362,34537,47042,20,0,Organic Red On the Vine Tomato,83,4,produce,19114,2015-01-01 13:00:00 4363,34537,39040,21,0,Organic Sliced Crimini Mushrooms,123,4,produce,19114,2015-01-01 13:00:00 4364,34537,18362,18,0,Organic Bread with 21 Whole Grains,112,3,bakery,19114,2015-01-01 13:00:00 4365,34537,2855,2,0,Organic Good Seed Bread,112,3,bakery,19114,2015-01-01 13:00:00 4366,34537,40063,17,0,Gluten Free Chocolate Chip Cookies,61,19,snacks,19114,2015-01-01 13:00:00 4367,34537,20734,25,0,Organic Medjool Dates,117,19,snacks,19114,2015-01-01 13:00:00 4368,34537,49174,12,0,Raincoast Crisps Cranberry And Hazelnut Crackers,78,19,snacks,19114,2015-01-01 13:00:00 4369,34537,25670,5,0,High Pulp Orange Juice,31,7,beverages,19114,2015-01-01 13:00:00 4370,34537,12686,22,0,Organic Jalapeno Cilantro Hummus,67,20,deli,19114,2015-01-01 13:00:00 4371,34537,8230,8,0,100% Recycled Bathroom Tissue,54,17,household,19114,2015-01-01 13:00:00 4372,34537,8638,24,0,Vanilla Milk Chocolate Almond Ice Cream Bars,37,1,frozen,19114,2015-01-01 13:00:00 4373,34537,8436,23,0,Organic Waffles Flax Plus,52,1,frozen,19114,2015-01-01 13:00:00 4374,34537,29195,13,0,Wild Sardines in Extra Virgin Olive Oil,95,15,canned goods,19114,2015-01-01 13:00:00 4734,41684,33754,2,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,31606,2015-01-14 08:00:00 4735,41684,4957,3,1,Total 2% Lowfat Greek Strained Yogurt With Blueberry,120,16,dairy eggs,31606,2015-01-14 08:00:00 4736,41684,33787,5,1,Total 2% Lowfat Greek Strained Yogurt with Peach,120,16,dairy eggs,31606,2015-01-14 08:00:00 4737,41684,8061,4,1,Pineapple Yogurt 2%,120,16,dairy eggs,31606,2015-01-14 08:00:00 4738,41684,6740,6,1,Organic Braeburn Apple,24,4,produce,31606,2015-01-14 08:00:00 4739,41684,19057,7,1,Organic Large Extra Fancy Fuji Apple,24,4,produce,31606,2015-01-14 08:00:00 4740,41684,44632,8,1,Sparkling Water Grapefruit,115,7,beverages,31606,2015-01-14 08:00:00 4741,41684,48559,1,1,Synergy Organic Kombucha Gingerberry,31,7,beverages,31606,2015-01-14 08:00:00 4784,41964,33754,3,1,Total 2% with Strawberry Lowfat Greek Strained Yogurt,120,16,dairy eggs,19114,2015-01-14 15:00:00 4785,41964,1463,8,1,Organic Milk,84,16,dairy eggs,19114,2015-01-14 15:00:00 4786,41964,32655,10,1,Organic Large Grade AA Brown Eggs,86,16,dairy eggs,19114,2015-01-14 15:00:00 4787,41964,4269,9,1,Mild Cheddar Cheese,21,16,dairy eggs,19114,2015-01-14 15:00:00 4788,41964,13176,5,1,Bag of Organic Bananas,24,4,produce,19114,2015-01-14 15:00:00 4789,41964,27966,4,1,Organic Raspberries,123,4,produce,19114,2015-01-14 15:00:00 4790,41964,47209,2,1,Organic Hass Avocado,24,4,produce,19114,2015-01-14 15:00:00 4791,41964,21137,11,1,Organic Strawberries,24,4,produce,19114,2015-01-14 15:00:00 4792,41964,48745,16,0,Globe Eggplant,83,4,produce,19114,2015-01-14 15:00:00 4793,41964,42265,7,1,Organic Baby Carrots,123,4,produce,19114,2015-01-14 15:00:00 4794,41964,41950,6,0,Organic Tomato Cluster,83,4,produce,19114,2015-01-14 15:00:00 4795,41964,39275,18,1,Organic Blueberries,123,4,produce,19114,2015-01-14 15:00:00 4796,41964,26940,17,0,Organic Large Green Asparagus,83,4,produce,19114,2015-01-14 15:00:00 4797,41964,43154,1,1,Sparkling Mineral Water,115,7,beverages,19114,2015-01-14 15:00:00 4798,41964,21051,13,1,Baba Ghannouge Eggplant Dip,67,20,deli,19114,2015-01-14 15:00:00 4799,41964,4193,15,0,"Ravioli, Spinach & Cheese",12,9,dry goods pasta,19114,2015-01-14 15:00:00 4800,41964,43908,14,0,Butternut Squash Ravioli,38,1,frozen,19114,2015-01-14 15:00:00 4801,41964,4921,12,1,Organic Roasted Garlic Mushroom Lentil Soup,69,15,canned goods,19114,2015-01-14 15:00:00 ================================================ FILE: docs/source/examples/demo/turbofan_degredation/__init__.py ================================================ import os import pandas as pd from demo import utils URL = r"https://ti.arc.nasa.gov/c/6/" PWD = os.path.dirname(__file__) def _download_data(): output = os.path.join(PWD, "download") utils.download(URL, output) def _data(): path = os.path.join(PWD, "download", "train_FD004.txt") if not os.path.exists(path): _download_data() cols = ["engine_no", "time_in_cycles"] cols += ["operational_setting_{}".format(i + 1) for i in range(3)] cols += ["sensor_measurement_{}".format(i + 1) for i in range(26)] df = pd.read_csv(path, sep=" ", header=None, names=cols) df = df.drop(cols[-5:], axis=1).rename_axis("id") df["time"] = pd.date_range("1/1/2000", periods=df.shape[0], freq="600s") return df def _read(file): path = os.path.join(PWD, file) df = pd.read_csv(path, parse_dates=["time"], index_col="id") return df def load_sample(): return _read("sample.csv") ================================================ FILE: docs/source/examples/demo/turbofan_degredation/sample.csv ================================================ 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 270,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 401,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 810,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 66,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 328,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 324,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 630,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 72,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 127,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 640,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 405,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 842,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 295,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 67,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 490,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 178,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 179,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 641,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 70,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 397,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 535,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 473,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 781,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 782,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 678,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 613,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 433,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 849,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 704,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 247,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 861,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 63,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 47,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 588,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 459,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 76,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 673,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 856,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 419,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 379,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 138,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 700,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 408,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 732,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 362,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 795,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 720,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 550,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 420,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 330,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 110,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 124,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 164,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 191,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 582,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 350,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 768,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 147,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 775,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 723,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 604,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 791,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 383,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 104,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 228,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 794,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 65,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 837,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 730,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 668,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 643,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 633,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 157,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 804,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 194,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 425,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 238,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 239,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 537,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 112,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 77,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 831,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 766,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 671,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 300,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 710,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 357,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 209,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 74,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 855,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 236,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 495,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 707,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 378,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 788,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 857,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 476,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 573,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 133,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 822,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 11,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 347,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 336,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 376,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 193,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 520,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 428,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 155,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 154,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 753,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 273,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 92,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 544,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 631,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 287,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 36,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 358,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 385,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 503,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 321,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 399,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 342,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 541,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 463,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 337,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 214,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 424,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 364,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 847,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 62,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 477,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 299,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 153,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 244,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 646,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 437,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 13,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 152,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 654,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 612,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 304,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 170,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 799,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 596,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 827,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 34,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 452,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 441,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 374,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 253,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 17,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 417,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 180,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 33,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 326,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 146,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 624,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 772,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 89,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 721,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 224,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 555,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 615,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 254,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 797,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 840,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 42,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 551,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 411,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 395,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 310,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 513,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 518,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 666,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 431,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 120,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 455,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 106,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 113,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 427,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 136,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 345,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 741,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 632,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 585,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 221,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 290,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 522,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 402,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 590,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 859,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 90,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 285,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 474,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 776,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 215,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 384,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 858,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 787,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 220,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 605,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 423,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 53,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 669,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 563,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 616,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 622,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 278,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 189,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 464,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 50,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 762,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 283,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 793,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 262,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 83,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 479,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 282,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 538,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 35,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 289,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 559,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 777,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 434,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 611,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 225,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 651,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 595,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 167,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 260,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 139,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 288,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 650,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 184,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 821,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 796,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 740,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 465,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 409,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 325,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 546,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 792,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 340,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 584,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 617,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 55,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 696,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 828,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 814,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 664,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 656,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 286,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 163,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 496,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 539,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 734,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 482,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 523,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 844,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 614,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 213,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 658,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 735,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 31,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 390,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 760,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 657,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 718,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 784,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 203,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 359,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 717,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 757,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 436,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 135,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 430,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 724,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 642,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 406,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 738,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 752,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 848,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 819,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 444,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 507,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 567,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 600,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 212,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 8,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 306,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 108,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 744,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 836,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 176,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 703,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 674,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 248,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 45,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 159,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 266,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 661,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 80,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 307,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 663,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 268,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 517,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 320,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 645,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 267,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 97,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 536,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 404,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 249,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 18,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 497,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 508,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 166,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 25,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 492,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 545,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 71,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 275,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 801,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 577,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 681,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 169,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 75,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 712,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 620,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 305,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 354,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 765,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 690,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 380,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 511,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 68,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 774,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 276,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 594,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 175,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 216,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 572,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 824,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 475,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 851,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 372,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 177,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 202,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 728,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 3,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 263,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 446,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 472,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 462,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 261,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 251,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 93,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 675,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 226,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 24,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 783,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 637,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 665,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 200,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 716,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 15,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 257,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 14,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 333,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 229,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 733,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 525,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 846,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 432,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 780,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 816,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 526,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 805,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 99,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 576,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 809,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 697,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 759,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 316,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 698,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 271,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 57,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 636,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 683,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 144,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 807,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 689,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 158,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 381,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 117,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 413,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 317,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 88,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 570,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 755,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 512,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 382,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 274,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 6,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 770,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 4,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 319,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 40,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 237,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 210,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 864,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 211,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 608,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 504,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 458,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 481,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 812,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 303,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 64,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 603,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 363,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 311,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 701,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 265,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 471,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 98,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 833,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 677,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 817,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 338,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 635,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 277,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 ================================================ FILE: docs/source/examples/demo/utils.py ================================================ import os import tarfile from zipfile import ZipFile import requests from tqdm import tqdm def download(url, output="data"): response = requests.get(url, stream=True) assert response.status_code == 200, "unable to download data" content_type = response.headers["Content-Type"] content = response.iter_content(chunk_size=int(1e6)) bar_format = "Downloaded: {n}MB / {total}MB -{rate_fmt}, " bar_format += "Elapsed: {elapsed}, Remaining: {remaining}, Progress: {l_bar}{bar}" total = round(int(response.headers.get("content-length", 0)) / 1e6) content = tqdm(content, total=total, unit="MB", bar_format=bar_format) extract(content, content_type, output) response.close() def extract(content, content_type, output): if content_type == "application/zip": extract_zip(content, output) elif content_type == "application/x-gzip": extract_tarball(content, output) else: raise TypeError(f'"{content_type}" not supported') def extract_tarball(content, output): with open("data.tar.gz", "wb") as file: for chunk in content: file.write(chunk) with tarfile.open("data.tar.gz", "r:gz") as file: file.extractall(output) os.remove("data.tar.gz") def extract_zip(content, output): with open("data.zip", "wb") as file: for chunk in content: file.write(chunk) with ZipFile("data.zip", "r") as file: file.extractall(output) os.remove("data.zip") ================================================ FILE: docs/source/examples/predict_bike_trips.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Predict Bike Trips\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", "- Prediction Engineering\n", "- Feature Engineering\n", "- Machine Learning\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", "**Note: In order to run this example, you should have Featuretools 1.4.0 or newer and EvalML 0.41.0 or newer installed.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from demo.chicago_bike import load_sample\n", "from matplotlib.pyplot import subplots\n", "import composeml as cp\n", "import featuretools as ft\n", "import evalml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = load_sample()\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prediction Engineering\n", "\n", "> How many trips will occur from a station in the next biking period?\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", "### Defining the Labeling Function\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def trip_count(ds):\n", " return len(ds)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Representing the Prediction Problem\n", "\n", "Represent the prediction problem by creating a label maker with the following parameters:\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", "- `labeling_function` as the function to calculate the number of trips.\n", "- `time_index` as the column for the starting time of a trip. The biking periods are based on this time index.\n", "- `window_size` as the length of a biking period. You can easily change this parameter to create variations of the prediction problem." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lm = cp.LabelMaker(\n", " target_dataframe_index=\"from_station_id\",\n", " labeling_function=trip_count,\n", " time_index=\"starttime\",\n", " window_size=\"13h\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Finding the Training Examples\n", "\n", "Run a search to get the training examples by using the following parameters:\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", "- `num_examples_per_instance` to find the number of training examples per station. In this case, the search returns all existing examples.\n", "- `minimum_data` as the start time of the first biking period. This is also the first cutoff time for building features." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lt = lm.search(\n", " df.sort_values(\"starttime\"),\n", " num_examples_per_instance=-1,\n", " minimum_data=\"2014-06-30 08:00\",\n", " verbose=False,\n", ")\n", "\n", "lt.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The output from the search is a label times table with three columns:\n", "\n", "- The station ID associated to the trips. There can be many training examples generated from each station.\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", "- The number of trips during the biking period window. This is calculated by our labeling function.\n", "\n", "As a helpful reference, you can print out the search settings that were used to generate these labels." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lt.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also get a better look at the labels by plotting the distribution and cumulative count across time." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "fig, ax = subplots(nrows=2, ncols=1, figsize=(6, 8))\n", "lt.plot.distribution(ax=ax[0])\n", "lt.plot.count_by_time(ax=ax[1])\n", "fig.tight_layout(pad=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Feature Engineering\n", "\n", "In the previous step, you generated the labels. The next step is to generate features.\n", "\n", "### Representing the Data\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "es = ft.EntitySet(\"chicago_bike\")\n", "\n", "es.add_dataframe(\n", " dataframe=df.reset_index(),\n", " dataframe_name=\"trips\",\n", " time_index=\"stoptime\",\n", " index=\"trip_id\",\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"trips\",\n", " new_dataframe_name=\"from_station_id\",\n", " index=\"from_station_id\",\n", " make_time_index=False,\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"trips\",\n", " new_dataframe_name=\"weather\",\n", " index=\"events\",\n", " make_time_index=False,\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"trips\",\n", " new_dataframe_name=\"gender\",\n", " index=\"gender\",\n", " make_time_index=False,\n", ")\n", "\n", "es.add_interesting_values(\n", " dataframe_name=\"trips\", values={\"gender\": [\"Male\", \"Female\"], \"events\": [\"tstorms\"]}\n", ")\n", "es.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculating the Features\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", "- `entityset` as the entitset we structured previously.\n", "- `target_dataframe_name` as the station dataframe where the trips started from.\n", "- `cutoff_time` as the label times that we generated previously. The label values are appended to the feature matrix." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fm, fd = ft.dfs(\n", " entityset=es,\n", " target_dataframe_name=\"from_station_id\",\n", " trans_primitives=[\"hour\", \"week\", \"is_weekend\"],\n", " cutoff_time=lt,\n", " cutoff_time_in_index=True,\n", " include_cutoff_time=False,\n", " verbose=False,\n", ")\n", "\n", "fm.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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", "## Machine Learning\n", "\n", "In the previous steps, you generated the labels and features. The final step is to build the machine learning pipeline.\n", "\n", "### Splitting the Data\n", "\n", "Start by extracting the labels from the feature matrix and splitting the data into a training set and a holdout set." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fm.reset_index(drop=True, inplace=True)\n", "y = fm.ww.pop(\"trip_count\")\n", "\n", "splits = evalml.preprocessing.split_data(\n", " X=fm,\n", " y=y,\n", " test_size=0.1,\n", " random_seed=0,\n", " problem_type=\"regression\",\n", ")\n", "\n", "X_train, X_holdout, y_train, y_holdout = splits" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Finding the Best Model\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "automl = evalml.AutoMLSearch(\n", " X_train=X_train,\n", " y_train=y_train,\n", " problem_type=\"regression\",\n", " objective=\"r2\",\n", " random_seed=3,\n", " allowed_model_families=[\"extra_trees\", \"random_forest\"],\n", " max_iterations=3,\n", ")\n", "\n", "automl.search()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once the search is complete, you can print out information about the best pipeline, like the parameters in each component." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "automl.best_pipeline.describe()\n", "automl.best_pipeline.graph()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let’s score the model performance by evaluating predictions on the holdout set." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "best_pipeline = automl.best_pipeline.fit(X_train, y_train)\n", "\n", "score = best_pipeline.score(\n", " X=X_holdout,\n", " y=y_holdout,\n", " objectives=[\"r2\"],\n", ")\n", "\n", "dict(score)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the pipeline, you can see which features are most important for predictions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "feature_importance = best_pipeline.feature_importance\n", "feature_importance = feature_importance.set_index(\"feature\")[\"importance\"]\n", "top_k = feature_importance.abs().sort_values().tail(20).index\n", "feature_importance[top_k].plot.barh(figsize=(8, 8), fontsize=14, width=0.7);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Making Predictions\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fm = ft.calculate_feature_matrix(\n", " features=fd,\n", " entityset=es,\n", " cutoff_time=ft.pd.Timestamp(\"2014-07-02 08:00:00\"),\n", " cutoff_time_in_index=True,\n", " verbose=False,\n", ")\n", "\n", "fm.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Predict the number of trips that will occur from a station in the next 13 hours." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "y_pred = best_pipeline.predict(fm)\n", "y_pred = y_pred.values.round()\n", "\n", "prediction = fm[[]]\n", "prediction[\"trip_count (estimate)\"] = y_pred\n", "prediction.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Next Steps\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/)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.10.6 64-bit ('3.10.6')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6" }, "vscode": { "interpreter": { "hash": "175a0a3732e9eeea35e317863527a17b85ae672598d99ca4a71576ee9ad73d9c" } } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: docs/source/examples/predict_next_purchase.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Predict Next Purchase\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", "- Prediction Engineering\n", "- Feature Engineering\n", "- Machine Learning\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", "**Note: In order to run this example, you should have Featuretools 1.4.0 or newer and EvalML 0.41.0 or newer installed.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from demo.next_purchase import load_sample\n", "from matplotlib.pyplot import subplots\n", "import composeml as cp\n", "import pandas as pd\n", "import featuretools as ft\n", "import evalml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use this historical data of online grocery orders provided by [Instacart](https://www.kaggle.com/c/instacart-market-basket-analysis/data)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = load_sample()\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prediction Engineering\n", "\n", "> Will customers purchase a product within the next shopping period?\n", "\n", "In this prediction problem, there are two parameters:\n", "\n", "- The product that a customer can purchase.\n", "- The length of the shopping period.\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", "### Defining the Labeling Function\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def bought_product(ds, product_name):\n", " return ds.product_name.str.contains(product_name).any()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Representing the Prediction Problem\n", "\n", "Represent the prediction problem by creating a label maker with the following parameters:\n", "\n", "- `target_dataframe_index` as the columns for the customer ID, since you want to process orders for each customer.\n", "- `labeling_function` as the function you defined previously.\n", "- `time_index` as the column for the order time. The shoppings periods are based on this time index.\n", "- `window_size` as the length of a shopping period. You can easily change this parameter to create variations of the prediction problem." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lm = cp.LabelMaker(\n", " target_dataframe_index=\"user_id\",\n", " time_index=\"order_time\",\n", " labeling_function=bought_product,\n", " window_size=\"3d\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Finding the Training Examples\n", "\n", "Run a search to get the training examples by using the following parameters:\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", "- `num_examples_per_instance` to find the number of training examples per customer. In this case, the search returns all existing examples.\n", "- `product_name` as the product to check for purchases. This parameter gets passed directly to the our labeling function.\n", "- `minimum_data` as the amount of data that is used to make features for the first training example." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lt = lm.search(\n", " df.sort_values(\"order_time\"),\n", " num_examples_per_instance=-1,\n", " product_name=\"Banana\",\n", " minimum_data=pd.Timedelta(\"3d\"),\n", " verbose=False,\n", ")\n", "\n", "lt.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The output from the search is a label times table with three columns:\n", "\n", "- The customer ID associated to the orders. There can be many training examples generated from each customer.\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", "- Whether the product was purchased during the shopping period window. This is calculated by our labeling function.\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lt.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can get a better look at the labels by plotting the distribution and cumulative count across time." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "fig, ax = subplots(nrows=2, ncols=1, figsize=(6, 8))\n", "lt.plot.distribution(ax=ax[0])\n", "lt.plot.count_by_time(ax=ax[1])\n", "fig.tight_layout(pad=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Feature Engineering\n", "\n", "In the previous step, you generated the labels. The next step is to generate features.\n", "\n", "### Representing the Data\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "es = ft.EntitySet(\"instacart\")\n", "\n", "es.add_dataframe(\n", " dataframe=df.reset_index(),\n", " dataframe_name=\"order_products\",\n", " time_index=\"order_time\",\n", " index=\"id\",\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"order_products\",\n", " new_dataframe_name=\"orders\",\n", " index=\"order_id\",\n", " additional_columns=[\"user_id\"],\n", " make_time_index=False,\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"orders\",\n", " new_dataframe_name=\"customers\",\n", " index=\"user_id\",\n", " make_time_index=False,\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"order_products\",\n", " new_dataframe_name=\"products\",\n", " index=\"product_id\",\n", " additional_columns=[\"aisle_id\", \"department_id\"],\n", " make_time_index=False,\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"products\",\n", " new_dataframe_name=\"aisles\",\n", " index=\"aisle_id\",\n", " additional_columns=[\"department_id\"],\n", " make_time_index=False,\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"aisles\",\n", " new_dataframe_name=\"departments\",\n", " index=\"department_id\",\n", " make_time_index=False,\n", ")\n", "\n", "es.add_interesting_values(\n", " dataframe_name=\"order_products\",\n", " values={\"department\": [\"produce\"], \"product_name\": [\"Banana\"]},\n", ")\n", "es.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculating the Features\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", "- `entity_set` as the entityset we structured previously.\n", "- `target_dataframe_name` as the customer dataframe.\n", "- `cutoff_time` as the label times that we generated previously. The label values are appended to the feature matrix." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fm, fd = ft.dfs(\n", " entityset=es,\n", " target_dataframe_name=\"customers\",\n", " cutoff_time=lt,\n", " cutoff_time_in_index=True,\n", " include_cutoff_time=False,\n", " verbose=False,\n", ")\n", "\n", "fm.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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", "## Machine Learning\n", "\n", "In the previous steps, you generated the labels and features. The final step is to build the machine learning pipeline.\n", "\n", "### Splitting the Data\n", "\n", "Start by extracting the labels from the feature matrix and splitting the data into a training set and a holdout set." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fm.reset_index(drop=True, inplace=True)\n", "y = fm.ww.pop(\"bought_product\")\n", "\n", "splits = evalml.preprocessing.split_data(\n", " X=fm,\n", " y=y,\n", " test_size=0.2,\n", " random_seed=0,\n", " problem_type=\"binary\",\n", ")\n", "\n", "X_train, X_holdout, y_train, y_holdout = splits" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Finding the Best Model\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "automl = evalml.AutoMLSearch(\n", " X_train=fm,\n", " y_train=y,\n", " problem_type=\"binary\",\n", " objective=\"f1\",\n", " random_seed=0,\n", " allowed_model_families=[\"catboost\", \"random_forest\"],\n", " max_iterations=3,\n", ")\n", "\n", "automl.search()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once the search is complete, you can print out information about the best pipeline found, like the parameters in each component." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "automl.best_pipeline.describe()\n", "automl.best_pipeline.graph()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Score the model performance by evaluating predictions on the holdout set." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "best_pipeline = automl.best_pipeline.fit(X_train, y_train)\n", "\n", "score = best_pipeline.score(\n", " X=X_holdout,\n", " y=y_holdout,\n", " objectives=[\"f1\"],\n", ")\n", "\n", "dict(score)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the pipeline, you can see which features are most important for predictions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "feature_importance = best_pipeline.feature_importance\n", "feature_importance = feature_importance.set_index(\"feature\")[\"importance\"]\n", "top_k = feature_importance.abs().sort_values().tail(20).index\n", "feature_importance[top_k].plot.barh(figsize=(8, 8), fontsize=14, width=0.7);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Making Predictions\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fm = ft.calculate_feature_matrix(\n", " features=fd,\n", " entityset=es,\n", " cutoff_time=ft.pd.Timestamp(\"2015-03-02\"),\n", " cutoff_time_in_index=True,\n", " verbose=False,\n", ")\n", "\n", "fm.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Predict whether customers will purchase bananas within the next 3 days." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "y_pred = best_pipeline.predict(fm)\n", "y_pred = y_pred.values\n", "\n", "prediction = fm[[]]\n", "prediction[\"bought_product (estimate)\"] = y_pred\n", "prediction.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Next Steps\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/)." ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "-all", "main_language": "python", "notebook_metadata_filter": "-all" }, "kernelspec": { "display_name": "Python 3.10.6 64-bit ('3.10.6')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6" }, "vscode": { "interpreter": { "hash": "175a0a3732e9eeea35e317863527a17b85ae672598d99ca4a71576ee9ad73d9c" } } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: docs/source/examples/predict_turbofan_degredation.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "# Predict Turbofan Degradation\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", "- Prediction Engineering\n", "- Feature Engineering\n", "- Machine Learning\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", "**Note: In order to run this example, you should have Featuretools 1.4.0 or newer and EvalML 0.41.0 or newer installed.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from demo.turbofan_degredation import load_sample\n", "from matplotlib.pyplot import subplots\n", "import composeml as cp\n", "import featuretools as ft\n", "import evalml" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = load_sample()\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prediction Engineering\n", "\n", "> Which range is the RUL of a turbofan engine in?\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", "### Defining the Labeling Function\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def rul(ds):\n", " return len(ds) - 1" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "### Representing the Prediction Problem\n", "\n", "Represent the prediction problem by creating a label maker with the following parameters:\n", "\n", "- The `target_dataframe_index` as the column for the engine ID, since you want to process records for each engine.\n", "- The `labeling_function` as the function you defined previously.\n", "- The `time_index` as the column for the event time." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lm = cp.LabelMaker(\n", " target_dataframe_index=\"engine_no\",\n", " labeling_function=rul,\n", " time_index=\"time\",\n", ")" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "### Finding the Training Examples\n", "\n", "Run a search to get the training examples by using the following parameters:\n", "\n", "- The records sorted by the event time, since the search expects the records to be sorted chronologically. Otherwise, an error occurs.\n", "- `num_examples_per_instance` as the number of training examples to find for each engine.\n", "- `minimum_data` as the amount of data to use to make features for the first training example.\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", "You can easily tweak these parameters and run more searches for training examples as the requirements of our model change." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lt = lm.search(\n", " df.sort_values(\"time\"),\n", " num_examples_per_instance=20,\n", " minimum_data=5,\n", " gap=20,\n", " verbose=False,\n", ")\n", "\n", "lt.head()" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "The output from the search is a label times table with three columns:\n", "\n", "- The engine ID associated to the records. There can be many training examples generated from each engine.\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", "- The value of the RUL. This is calculated by the labeling function.\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lt.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also get a better look at the values by plotting the distribution and the cumulative count across time." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "fig, ax = subplots(nrows=2, ncols=1, figsize=(6, 8))\n", "lt.plot.distribution(ax=ax[0])\n", "lt.plot.count_by_time(ax=ax[1])\n", "fig.tight_layout(pad=2)" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lt = lt.bin(4, quantiles=True, precision=0)" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lt.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Look at the new label distribution and cumulative count across time." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig, ax = subplots(nrows=2, ncols=1, figsize=(6, 8))\n", "lt.plot.distribution(ax=ax[0])\n", "lt.plot.count_by_time(ax=ax[1])\n", "fig.tight_layout(pad=2)" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "## Feature Engineering\n", "\n", "In the previous step, you generated the labels. The next step is to generate features.\n", "\n", "### Representing the Data\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "es = ft.EntitySet(\"observations\")\n", "\n", "es.add_dataframe(\n", " dataframe=df.reset_index(),\n", " dataframe_name=\"records\",\n", " index=\"id\",\n", " time_index=\"time\",\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"records\",\n", " new_dataframe_name=\"engines\",\n", " index=\"engine_no\",\n", ")\n", "\n", "es.normalize_dataframe(\n", " base_dataframe_name=\"records\",\n", " new_dataframe_name=\"cycles\",\n", " index=\"time_in_cycles\",\n", ")\n", "\n", "es.plot()" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "### Calculating the Features\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", "- `entityset` as the entityset we structured previously.\n", "- `target_dataframe_name` as the engine dataframe.\n", "- `cutoff_time` as the label times that we generated previously. The label values are appended to the feature matrix." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fm, fd = ft.dfs(\n", " entityset=es,\n", " target_dataframe_name=\"engines\",\n", " agg_primitives=[\"sum\"],\n", " trans_primitives=[],\n", " cutoff_time=lt,\n", " cutoff_time_in_index=True,\n", " include_cutoff_time=False,\n", " verbose=False,\n", ")\n", "\n", "fm.head()" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "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", "## Machine Learning\n", "\n", "In the previous steps, generate the labels and features. The final step is to build the machine learning pipeline.\n", "\n", "### Splitting the Data\n", "\n", "Start by extracting the labels from the feature matrix and splitting the data into a training set and a holdout set." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fm.reset_index(drop=True, inplace=True)\n", "y = fm.ww.pop(\"rul\").cat.codes\n", "\n", "splits = evalml.preprocessing.split_data(\n", " X=fm,\n", " y=y,\n", " test_size=0.2,\n", " random_seed=2,\n", " problem_type=\"multiclass\",\n", ")\n", "\n", "X_train, X_holdout, y_train, y_holdout = splits" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "### Finding the Best Model\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "automl = evalml.AutoMLSearch(\n", " X_train=X_train,\n", " y_train=y_train,\n", " problem_type=\"multiclass\",\n", " objective=\"f1 macro\",\n", " random_seed=0,\n", " allowed_model_families=[\"catboost\", \"random_forest\"],\n", " max_iterations=3,\n", ")\n", "\n", "automl.search()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once the search is complete, you can print out information about the best pipeline found, like the parameters in each component." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "automl.best_pipeline.describe()\n", "automl.best_pipeline.graph()" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Score the model performance by evaluating predictions on the holdout set." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "best_pipeline = automl.best_pipeline.fit(X_train, y_train)\n", "\n", "score = best_pipeline.score(\n", " X=X_holdout,\n", " y=y_holdout,\n", " objectives=[\"f1 macro\"],\n", ")\n", "\n", "dict(score)" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "From the pipeline, you can see which features are most important for predictions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "feature_importance = best_pipeline.feature_importance\n", "feature_importance = feature_importance.set_index(\"feature\")[\"importance\"]\n", "top_k = feature_importance.abs().sort_values().tail(20).index\n", "feature_importance[top_k].plot.barh(figsize=(8, 8), fontsize=14, width=0.7);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Making Predictions\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fm = ft.calculate_feature_matrix(\n", " features=fd,\n", " entityset=es,\n", " cutoff_time=ft.pd.Timestamp(\"2001-01-08\"),\n", " cutoff_time_in_index=True,\n", " verbose=False,\n", ")\n", "\n", "fm.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now predict which one of the four ranges the RUL is in." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "y_pred = best_pipeline.predict(fm)\n", "y_pred = y_pred.values\n", "\n", "prediction = fm[[]]\n", "prediction[\"rul (estimate)\"] = y_pred\n", "prediction.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Next Steps\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/)." ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "jupytext": { "cell_metadata_filter": "-all", "main_language": "python", "notebook_metadata_filter": "-all" }, "kernelspec": { "display_name": "Python 3.10.6 64-bit ('3.10.6')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6" }, "vscode": { "interpreter": { "hash": "175a0a3732e9eeea35e317863527a17b85ae672598d99ca4a71576ee9ad73d9c" } } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: docs/source/images/innovation_labs.xml ================================================ 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 ================================================ FILE: docs/source/images/label-maker.xml ================================================ 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 ================================================ FILE: docs/source/images/labeling-function.xml ================================================ 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 ================================================ FILE: docs/source/images/workflow.xml ================================================ 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 ================================================ FILE: docs/source/index.rst ================================================ ================ What is Compose? ================ .. toctree:: :hidden: :maxdepth: 1 install start tutorials user_guide resources api_reference release_notes ------------ | .. image:: images/compose.png :width: 500px :align: center | **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: .. _Featuretools: https://docs.featuretools.com/ .. _EvalML: https://evalml.alteryx.com/ | .. image:: images/workflow.png :align: center | By automating the early stage of the machine learning pipeline, our end user can easily define a task and solve it. .. _main-concepts: Main Concepts ============= Prediction 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. .. image:: images/label-maker.svg :width: 650px :align: center The labeling function will then transform the extracted data slice into a label. .. image:: images/labeling-function.svg :width: 425px :align: center When a labeling function returns continuous values, there are :doc:`label transforms ` available to further process the labels into discrete values. | ================================================ FILE: docs/source/install.md ================================================ # Install Compose 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). ## pip To install Compose, run the following command: ````{tab} PyPI ```console $ python -m pip install composeml ``` ```` ````{tab} Conda ```console $ conda install -c conda-forge composeml ``` ```` ````{tab} Source ```console git clone https://github.com/alteryx/compose.git cd compose python -m pip install . ``` ```` ## Docker It is also possible to run Compose inside a Docker container. You can do so by installing it as a package inside a container (following the normal install guide) or creating a new image with Compose pre-installed, using the following commands in your Dockerfile: ```bash FROM python:3.8-slim-buster RUN apt-get update && apt-get -y update RUN apt-get install -y build-essential python3-pip python3-dev RUN pip -q install pip --upgrade RUN pip install composeml ``` ## Add-ons * Update checker: Receive automatic notifications of new Compose releases ````{tab} PyPI ```console $ python -m pip install composeml[update_checker] ``` ```` ````{tab} Conda ```console $ conda install -c conda-forge alteryx-open-src-update-checker ``` ```` ================================================ FILE: docs/source/release_notes.rst ================================================ Release Notes ------------- Future Release ============== * Enhancements * Fixes * Changes * Remove isort, add pre-commit-config.yaml, and run on all files (:pr:`366`) * Specify black and ruff config arguments in pre-commit-config (:pr:`371`) * Update s3 bucket for docs image (:pr:`384`) * Documentation Changes * Testing Changes Thanks to the following people for contributing to this release: :user:`gsheni`: v0.10.1 Jan 6, 2023 =================== * Changes * Update create feedstock pull request workflow (:pr:`364`) Thanks to the following people for contributing to this release: :user:`gsheni` v0.10.0 Jan 6, 2023 =================== * Fixes * Update to avoid error with a categorical target with unused categories (:pr:`349`) * Changes * Transition to pure pyproject.toml for project metadata (:pr:`351`) * Change `target_dataframe_name` parameter name to `target_dataframe_index` (:pr:`353`) * Delete MANIFEST.in and .coveragerc from root directory (:pr:`359`) * Documentation Changes * Temporarily restrict scikit-learn version to ``<1.2.0`` in dev requirements to allow docs to build (:pr:`361`) * Testing Changes * Add create feedstock PR workflow (:pr:`346`) Thanks to the following people for contributing to this release: :user:`gsheni`, :user:`thehomebrewnerd` Breaking Changes ++++++++++++++++ * The parameter ``target_dataframe_name`` has been changed to ``target_dataframe_index`` in ``LabelMaker``. v0.9.1 Nov 2, 2022 ================== * Changes * Explicitly set series dtype for ``LabelTimes.target_types`` (:pr:`337`) * Documentation Changes * Fix docs build and clean up release notes (:pr:`336`) Thanks to the following people for contributing to this release: :user:`thehomebrewnerd` v0.9.0 May 12, 2022 =================== .. warning:: Compose will no longer support Python 3.7. * Changes * Update ipython to 7.31.1 (:pr:`286`) * Transition to pyproject.toml and setup.cfg (:pr:`310`, :pr:`313`) * Add support for python 3.10 (:pr:`318`) * Fix Makefile output filepath (:pr:`320`) * Documentation Changes * Update README.md with Alteryx link (:pr:`289`, :pr:`290`, :pr:`314`) * Add in-line tabs and copy-paste functionality to docs (:pr:`293`) * Update nbconvert to version 6.4.5 to fix docs build issue (:pr:`305`) * Update slack invite link to new (:pr:`316`) * Update ``release.md`` with correct process (:pr:`324`) * Testing Changes * Add woodwork to ``test-requirements.txt`` (:pr:`296`) * Upgrade black version to 22.3.0 to fix linting issue (:pr:`309`) Thanks to the following people for contributing to this release: :user:`gsheni`, :user:`mingdavidqi`, :user:`thehomebrewnerd` v0.8.0 Jan 20, 2022 =================== * Enhancements * Add issue templates for bugs, feature requests and documentation improvements (:pr:`271`) * Changes * Update pip to 21.3.1 for test requirements (:pr:`265`) * Restrict to Python 3.7 to 3.9 (:pr:`265`) * Use black and remove autopep8 for linting (:pr:`265`) * Update minimum dependency checker with the correct reviewers (:pr:`267`) * Rename ``LabelMaker.target_entity`` to ``LabelMaker.target_dataframe_name`` (:pr:`276`) * Documentation Changes * Update install instructions to specify correct python versions (:pr:`265`) * Update example notebooks to use latest Featuretools and EvalML APIs (:pr:`275`) * Testing Changes * Add unit test for dropping empty data slices (:pr:`280`) * Add auto approve workflow for dependency updates (:pr:`281`) Thanks to the following people for contributing to this release: :user:`gsheni`, :user:`jeff-hernandez`, :user:`thehomebrewnerd` .. warning:: **Breaking Changes** * The ``target_entity`` attribute of ``LabelMaker`` has been renamed to ``target_dataframe_name``. v0.7.0 Nov 2, 2021 ================== * Enhancements * Add ``maximum_data`` parameter to control when a search should stop (:pr:`216`) * Add optional automatic update checker (:pr:`223`, :pr:`229`, :pr:`232`) * Varying first cutoff time for each target group (:pr:`258`) * Documentation Changes * Update doc tutorials to the latest API changes (:pr:`227`) * Pin documentation requirements to avoid warnings and breaking changes (:pr:`244`) * Testing Changes * Check if release notes were updated (:pr:`217`) * Add minimum dependency checker to generate minimum requirement files (:pr:`218`) * Add CI workflow for unit tests with minimum dependencies (:pr:`220`) * Create separate worksflows for each CI job (:pr:`220`) * Pass token to authorize uploading of codecov reports (:pr:`226`) * Update minimum unit tests to run on all pull requests (:pr:`230`) * Add workflow to check latest dependencies (:pr:`233`) * Update reviewers for minimum and latest dependency checkers (:pr:`257`) Thanks to the following people for contributing to this release: :user:`gsheni`, :user:`jeff-hernandez` v0.6.0 Feb 11, 2021 =================== * Enhancements * Added description for continuous target distributions (:pr:`187`) * Fixes * Sorted label distribution in description (:pr:`188`) * Documentation Changes * Made logo easier to read (:pr:`182`) * Added Alteryx footer to docs (:pr:`185`, :pr:`186`) * Updated tutorials to the latest API changes (:pr:`190`, :pr:`198`, :pr:`204`) * Updated repository links to GitHub (:pr:`191`) * Added help page to docs (:pr:`194`) * Improved docs based on tech writer feedback (:pr:`195`) * Added open graph info to docs (:pr:`203`) * Testing Changes * Migrated CI tests to Github Actions (:pr:`184`, :pr:`189`) * Updated tests to trigger on pull request events (:pr:`199`) Thanks to the following people for contributing to this release: :user:`flowersw`, :user:`jeff-hernandez`, :user:`rwedge` v0.5.1 Sep 22, 2020 =================== * Documentation Changes * Update F1 Macro in Turbofan Degradation Tutorial (:pr:`180`). * Apply Pandas Docs Theme (:pr:`172`). * Add Chicago Bike Tutorial (:pr:`157`). * Testing Changes * Test Doc Builds (:pr:`165`) v0.5.0 Aug 28, 2020 =================== * Enhancements * Added Column-Based Windows (:pr:`151`). * Changes * Refactored Data Slice Generator (:pr:`150`). * Documentation Changes * Updated README (:pr:`164`). * Updated Predict Next Purchase Demo (:pr:`154`). * Updated Predict Turbofan Degradation Demo (:pr:`154`). .. warning:: **Breaking Changes** * 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 `. v0.4.0 Jul 2, 2020 ================== * Enhancements * Target values can be sampled from each group (:pr:`138`). * One of multiple targets can be selected (:pr:`147`). * Labels can be binned using infinite edges represented as string (:pr:`133`). * Changes * The label times object was refactored to improve design and structure (:pr:`135`). .. warning:: **Breaking Changes** * Loading label times from previous versions will result in an error. v0.3.0 Jun 1, 2020 ================== * Enhancements * Label Search for Multiple Targets (:pr:`130`) * Changes * Column renamed from :code:`cutoff_time` to :code:`time` (:pr:`139`) v0.2.0 Apr 23, 2020 =================== * Changes * Dropped Support for Python 3.5 (:pr:`128`) * Rename LabelTimes.name to LabelTimes.label_name (:pr:`126`) * Support keyword arguments in Pandas methods. (:pr:`121`) * Documentation Changes * Improved data download in Predict Next Purchase (:pr:`76`) * Testing Changes * Added tests that use Python 3.8 in CirlceCI (:pr:`128`) .. warning:: **Breaking Changes** * ``LabelTimes.name`` has been renamed to ``LabelTimes.label_name`` v0.1.8 Mar 11, 2020 =================== * Fixes * Support for Pandas 1.0 v0.1.7 Jan 31, 2020 =================== * Enhancements * Added higher-level mappings to offsets. * Track settings for sample transforms. * Fixes * Pinned Pandas version. * Testing Changes * Moved Featuretools to test requirements. v0.1.6 Oct 22, 2019 =================== * Enhancements * Serialization for Label Times * Fixes * Matplotlib Backend Fix * Sampling Label Times * Documentation Changes * Added Data Slice Generator Guide * Testing Changes * Integration Tests for Python Versions 3.6 and 3.7 v0.1.5 Sep 16, 2019 =================== * Enhancements * Added Slice Generator * Added Seaborn Plots * Added Data Slice Context * Added Count per Group * Documentation Changes * Updated README * Added Example: Predict Next Purchase * Added Example: Predict RUL v0.1.4 Aug 7, 2019 ================== * Enhancements * Added Sample Transform * Improved Progress Bar * Improved Label Times description v0.1.3 Jul 9, 2019 ================== * Enhancements * Improved documentation * Added testing for Featuretools compatibility * Improved description of Label Times * Refactored search in Label Maker * Improved testing for Label Transforms v0.1.2 Jun 19, 2019 =================== * Enhancements * Add dynamic progress bar * Add label transform for binning labels * Improve code coverage * Update documentation v0.1.1 May 31, 2019 =================== * Initial Release ================================================ FILE: docs/source/resources/faq.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# FAQ\n", "\n", "## I have heard of autoML and automated feature engineering, how is this different?\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", "## I have used Featuretools for competing in KAGGLE, how can I use Compose?\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", "## Why have I not encountered the need for Compose yet?\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", "## I already have “Label times” file, do I need Compose?\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", "## What is the best use of Compose?\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", "## Where can I read about your technical approach in detail?\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", "## Do you think Compose should be part of a data scientist’s toolkit?\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", "## How can I contribute labeling functions, or use cases?\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", "## I have a transaction file with the label as the last column, what are my label times?\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." ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "-all", "notebook_metadata_filter": "-all" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.5" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: docs/source/resources/help.rst ================================================ ==== Help ==== Couldn't find what you were looking for? The Alteryx open source community is happy to provide support to users of Compose. Discussion ========== Conversation happens in the following places: 1. **General usage questions** are directed to `StackOverflow`_ with the :code:`compose-ml` tag. 2. **Bug reports** are managed on the `GitHub issue tracker`_. 3. **Chat** and collaboration within the community occurs on `Slack`_. For general usage questions, please post on Stack Overflow where answers are more searchable by other users. .. _`StackOverflow`: https://stackoverflow.com/questions/tagged/compose-ml .. _`Github issue tracker`: https://github.com/alteryx/compose/issues .. _`Slack`: https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA Asking for help =============== All users levels, including beginners, should feel free to ask questions and report bugs when using Compose. You can get better answers if follow a few simple guidelines: 1. **Use the right resource**: We suggest using Github or StackOverflow. Questions asked at these locations will be more searchable for other users. - Slack should be used for community discussion and collaboration. - For general questions on how something should work or tips, use StackOverflow. - Bugs should be reported on Github. 2. **Ask in one place only**: Please post your question in one place (StackOverflow or Github). 3. **Use examples**: Make `minimal, complete, verifiable examples `_. You will get much better answers if your provide code that people can use to reproduce your problem. | ================================================ FILE: docs/source/resources.rst ================================================ ========= Resources ========= Frequently asked questions and additional resources .. toctree:: :glob: :maxdepth: 1 resources/faq resources/help | ================================================ FILE: docs/source/start.ipynb ================================================ { "cells": [ { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "=====\n", "Start\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import composeml as cp" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Load Data\n", "=========\n", "\n", "With the package installed, load the data. To get an idea on how the transactions looks, preview the data frame." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = cp.demos.load_transactions()\n", "\n", "df[df.columns[:7]].head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Create Labeling Function\n", "========================\n", "\n", "Define the labeling function that returns the total purchase amount given a hour of transactions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def total_spent(df):\n", " total = df[\"amount\"].sum()\n", " return total" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Construct Label Maker\n", "=====================\n", "\n", ".. currentmodule:: composeml\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "label_maker = cp.LabelMaker(\n", " target_dataframe_index=\"customer_id\",\n", " time_index=\"transaction_time\",\n", " labeling_function=total_spent,\n", " window_size=\"1h\",\n", ")" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Generate Labels\n", "===============\n", "\n", "Automatically search and extract the labels using :py:meth:`LabelMaker.search`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels = label_maker.search(\n", " df.sort_values(\"transaction_time\"),\n", " num_examples_per_instance=-1,\n", " gap=1,\n", " verbose=True,\n", ")\n", "\n", "labels.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "plot = labels.plot.dist()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Transform Labels\n", "================\n", "\n", "With the generated :class:`LabelTimes`, apply specific transforms for our prediction problem.\n", "\n", "\n", "Apply Threshold on Labels\n", "-------------------------\n", "\n", "To make the labels binary, :py:meth:`LabelTimes.threshold` is applied for amounts exceeding $300." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels = labels.threshold(300)\n", "\n", "labels.head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Lead Label Times\n", "----------------\n", "\n", "The label times are shifted one hour earlier for predicting in advance by using :py:meth:`LabelTimes.apply_lead`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels = labels.apply_lead(\"1h\")\n", "\n", "labels.head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Describe Labels\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels.describe()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Plot Labels\n", "===========\n", "\n", "You can use plots to inspect the labels.\n", "\n", "\n", "Distribution\n", "------------\n", "\n", "This plot shows the label distribution." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot = labels.plot.distribution()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Count by Time\n", "-------------\n", "\n", "This plot shows the label distribution across cutoff times." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot = labels.plot.count_by_time()" ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: docs/source/tutorials.rst ================================================ ========= Tutorials ========= Use these tutorial to learn how to use Compose for building AutoML applications. .. toctree:: :glob: :maxdepth: 1 examples/* | ================================================ FILE: docs/source/user_guide/controlling_cutoff_times.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "fcfef470", "metadata": {}, "source": [ "# Controlling cutoff times in a label search\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." ] }, { "cell_type": "code", "execution_count": null, "id": "3cc3d374", "metadata": { "nbsphinx": "hidden" }, "outputs": [], "source": [ "from io import StringIO\n", "from pandas import read_csv\n", "\n", "transaction_data = \"\"\"\n", "customer_id,transaction_time,amount\n", "3,2021-03-31 18:51:27,52.29\n", "5,2021-03-22 06:56:05,33.81\n", "5,2021-03-20 23:45:21,76.3\n", "2,2021-03-30 10:06:59,32.72\n", "1,2021-02-17 11:01:22,59.16\n", "2,2021-01-16 10:59:44,56.33\n", "3,2021-01-12 07:53:00,61.84\n", "4,2021-03-15 21:00:25,34.91\n", "2,2021-01-26 10:01:37,69.88\n", "2,2021-02-07 05:42:14,49.7\n", "2,2021-03-15 16:35:16,41.08\n", "4,2021-02-06 13:17:19,32.34\n", "2,2021-02-21 09:42:48,86.15\n", "4,2021-03-24 00:40:24,97.08\n", "4,2021-03-23 04:27:47,58.81\n", "4,2021-02-23 13:32:22,59.67\n", "4,2021-02-10 03:46:16,96.36\n", "3,2021-03-13 09:24:54,25.4\n", "1,2021-01-27 13:58:38,26.15\n", "3,2021-02-23 03:26:58,28.96\n", "1,2021-01-05 09:55:18,24.6\n", "1,2021-03-09 07:14:27,49.64\n", "1,2021-02-10 23:27:37,31.29\n", "2,2021-01-23 18:19:05,42.88\n", "1,2021-01-05 22:50:52,58.58\n", "\"\"\"\n", "\n", "created_account_data = \"\"\"\n", "customer_id,created_account\n", "1,2021-01-10\n", "2,2021-02-12\n", "3,2021-01-23\n", "4,2021-02-13\n", "5,2021-01-24\n", "\"\"\"\n", "\n", "with StringIO(transaction_data) as data:\n", " transactions = read_csv(data, parse_dates=[\"transaction_time\"])\n", "\n", "with StringIO(created_account_data) as data:\n", " created_account = read_csv(\n", " data, parse_dates=[\"created_account\"], index_col=\"customer_id\"\n", " )[\"created_account\"]" ] }, { "cell_type": "markdown", "id": "a49db5e1", "metadata": {}, "source": [ "## Labeling customer transactions\n", "\n", "For example, suppose you have customer transactions from the first quarter of 2021." ] }, { "cell_type": "code", "execution_count": null, "id": "cf63bed2", "metadata": {}, "outputs": [], "source": [ "import composeml as cp\n", "\n", "transactions.head()" ] }, { "cell_type": "markdown", "id": "d6d19fff", "metadata": {}, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "id": "6cb2d34a", "metadata": {}, "outputs": [], "source": [ "def total_amount(ds):\n", " return ds.amount.sum()\n", "\n", "\n", "lm = cp.LabelMaker(\n", " labeling_function=total_amount,\n", " time_index=\"transaction_time\",\n", " target_dataframe_index=\"customer_id\",\n", " window_size=\"14d\",\n", ")" ] }, { "cell_type": "markdown", "id": "dee27ce4", "metadata": {}, "source": [ "### Defining the first and last cutoff time\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." ] }, { "cell_type": "code", "execution_count": null, "id": "953ee7c3", "metadata": {}, "outputs": [], "source": [ "lt = lm.search(\n", " df=transactions.sort_values(\"transaction_time\"),\n", " num_examples_per_instance=-1,\n", " minimum_data=\"2021-02-01\",\n", " maximum_data=\"2021-02-15\",\n", " drop_empty=False,\n", " verbose=False,\n", ")\n", "\n", "lt" ] }, { "cell_type": "markdown", "id": "c23c02ae", "metadata": {}, "source": [ "### Changing the first cutoff time for each customer\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*." ] }, { "cell_type": "code", "execution_count": null, "id": "5fb84606", "metadata": {}, "outputs": [], "source": [ "created_account" ] }, { "cell_type": "markdown", "id": "4edf1235", "metadata": {}, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "id": "8463785d", "metadata": {}, "outputs": [], "source": [ "lt = lm.search(\n", " df=transactions.sort_values(\"transaction_time\"),\n", " num_examples_per_instance=-1,\n", " minimum_data=created_account,\n", " drop_empty=False,\n", " verbose=False,\n", ")\n", "\n", "lt.head(10)" ] }, { "cell_type": "raw", "id": "cc91d60c", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "For more details on labeling data over specific periods, you can look at the guide on :doc:`generating data slices `." ] } ], "metadata": { "celltoolbar": "Edit Metadata", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: docs/source/user_guide/data_slice_generator.ipynb ================================================ { "cells": [ { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "====================\n", "Data Slice Generator\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", "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import composeml as cp" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = cp.demos.load_transactions()\n", "df = df[df.columns[:7]]\n", "df.sample(n=5, random_state=0)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Labeling Function\n", "=================\n", "Define a labeling function that returns how much a customer spent given a slice of transactions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def total_spent(df):\n", " return df[\"amount\"].sum()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ".. currentmodule:: composeml\n", "\n", "Data Slices\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", ".. seealso::\n", " For a conceptual explanation of the process, see :ref:`Main Concepts `.\n", "\n", "Consecutive\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", "To start, create a label maker with the 2-hour window size." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lm = cp.LabelMaker(\n", " target_dataframe_index=\"customer_id\",\n", " time_index=\"transaction_time\",\n", " labeling_function=total_spent,\n", " window_size=\"2h\",\n", ")" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "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", ".. tip::\n", " You can directly set :code:`minimum_data` as the first cutoff time." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "slices = lm.slice(\n", " df.sort_values(\"transaction_time\"),\n", " num_examples_per_instance=-1,\n", " minimum_data=\"2014-01-01\",\n", ")" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Consecutive - Data Slice #1\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ds = next(slices)\n", "print(ds.context)\n", "ds" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Apply the labeling function for the total amount spent on this data slice." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total_spent(ds)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Consecutive - Data Slice #2\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ds = next(slices)\n", "print(ds.context)\n", "ds" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Apply our labeling function for the total amount spent on this data slice." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total_spent(ds)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Overlap\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", "To start, create a label maker with the 3-hour window size." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lm = cp.LabelMaker(\n", " target_dataframe_index=\"customer_id\",\n", " time_index=\"transaction_time\",\n", " labeling_function=total_spent,\n", " window_size=\"3h\",\n", ")" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Next, create a data slice generator with the 1-hour gap size." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "slices = lm.slice(\n", " df.sort_values(\"transaction_time\"),\n", " num_examples_per_instance=-1,\n", " minimum_data=\"2014-01-01\",\n", " gap=\"1h\",\n", ")" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Overlap - Data Slice #1\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`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ds = next(slices)\n", "print(ds.context)\n", "ds" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Apply our labeling function for the total spent on this data slice." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total_spent(ds)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Overlap - Data Slice #2\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ds = next(slices)\n", "print(ds.context)\n", "ds" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Apply our labeling function for the total spent on this data slice." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total_spent(ds)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Spread Out\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", "To start, create a label maker with the 1-hour window size." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lm = cp.LabelMaker(\n", " target_dataframe_index=\"customer_id\",\n", " time_index=\"transaction_time\",\n", " labeling_function=total_spent,\n", " window_size=\"1h\",\n", ")" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Next, create a data slice generator with the 3-hour gap size." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "slices = lm.slice(\n", " df.sort_values(\"transaction_time\"),\n", " num_examples_per_instance=-1,\n", " minimum_data=\"2014-01-01\",\n", " gap=\"3h\",\n", ")" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Spread Out - Data Slice #1\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`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ds = next(slices)\n", "print(ds.context)\n", "ds" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Apply our labeling function for the total spent on this data slice." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total_spent(ds)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Spread Out - Data Slice #2\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ds = next(slices)\n", "print(ds.context)\n", "ds" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Apply the labeling function for the total spent on this data slice." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total_spent(ds)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ".. _data-slice-context:\n", "\n", "Data Slice Context\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "vars(ds.context)" ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "jupytext": { "cell_metadata_filter": "-all", "notebook_metadata_filter": "-all" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: docs/source/user_guide/using_label_transforms.ipynb ================================================ { "cells": [ { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ".. currentmodule:: composeml\n", "\n", "======================\n", "Using Label Transforms\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", "Generate Labels\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import composeml as cp\n", "import pandas as pd\n", "\n", "\n", "def total_spent(df):\n", " return df[\"amount\"].sum()\n", "\n", "\n", "label_maker = cp.LabelMaker(\n", " labeling_function=total_spent,\n", " target_dataframe_index=\"customer_id\",\n", " time_index=\"transaction_time\",\n", " window_size=\"1h\",\n", ")\n", "\n", "labels = label_maker.search(\n", " cp.demos.load_transactions(),\n", " num_examples_per_instance=10,\n", " minimum_data=pd.Timedelta(\"2h\"),\n", " gap=\"2min\",\n", " verbose=True,\n", ")" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "To get an idea on how the labels looks, preview the data frame." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels.head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Threshold on Labels\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels.threshold(100).head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Lead Labels Times\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels.apply_lead(\"1h\").head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Bin Labels\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", "Value Based\n", "-----------\n", "\n", "To use bins based on values, :code:`quantiles` should be set to :code:`False`, the default value.\n", "\n", "\n", "Equal Width\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels.bin(4, quantiles=False).head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Custom Widths\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "inf = float(\"inf\")\n", "edges = [-inf, 34, 50, 67, inf]\n", "labels.bin(\n", " edges,\n", " quantiles=False,\n", ").head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Quantile Based\n", "--------------\n", "\n", "To use bins based on quantiles, :code:`quantiles` should be set to :code:`True`.\n", "\n", "\n", "Equal Width\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels.bin(4, quantiles=True).head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "To verify quartile values, check the descriptive statistics." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "stats = labels.total_spent.describe()\n", "stats = stats.round(3).to_string()\n", "print(stats)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Custom Widths\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "quantiles = [0, 0.34, 0.5, 0.67, 1]\n", "labels.bin(quantiles, quantiles=True).head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Label Bins\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "values = [\"low\", \"medium\", \"high\"]\n", "labels.bin(3, labels=values).head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Describe Labels\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels.threshold(100).describe()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Sample Labels\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", "To sample 10 labels, :code:`n` is set to 10." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels.sample(n=10, random_state=0)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Similarly, to sample 10% of labels, :code:`frac` is set to 10%." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "labels.sample(frac=0.1, random_state=0)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Categorical Labels\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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "categorical = labels.bin(4, labels=[\"A\", \"B\", \"C\", \"D\"])" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "To sample 2 labels per category, map each category to the number 2." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n = {\"A\": 2, \"B\": 2, \"C\": 2, \"D\": 2}\n", "categorical.sample(n=n, random_state=0)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Similarly, to sample 10% of labels per category, map each category to 10%." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "frac = {\"A\": 0.1, \"B\": 0.1, \"C\": 0.1, \"D\": 0.1}\n", "categorical.sample(frac=frac, random_state=0)" ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: docs/source/user_guide.rst ================================================ ========== User Guide ========== Use these guides to learn how to use label transformations and generate better training examples. .. toctree:: :glob: :maxdepth: 1 user_guide/controlling_cutoff_times user_guide/using_label_transforms user_guide/data_slice_generator | ================================================ FILE: pyproject.toml ================================================ [project] name = "composeml" readme = "README.md" description = "a framework for automated prediction engineering" dynamic = ["version"] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Science/Research", "Intended Audience :: Developers", "Topic :: Software Development", "Topic :: Scientific/Engineering", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Operating System :: OS Independent", ] authors = [ {name="Alteryx, Inc.", email="open_source_support@alteryx.com"} ] maintainers = [ {name="Alteryx, Inc.", email="open_source_support@alteryx.com"} ] keywords = ["prediction engineering", "data science", "machine learning"] license = {text = "BSD 3-clause"} requires-python = ">=3.8,<4" dependencies = [ "pandas >= 2.0.0", "tqdm >= 4.32.0", "matplotlib >= 3.3.3", "seaborn >= 0.12.2", ] [project.urls] "Documentation" = "https://compose.alteryx.com" "Source Code"= "https://github.com/alteryx/compose/" "Changes" = "https://compose.alteryx.com/en/latest/release_notes.html" "Issue Tracker" = "https://github.com/alteryx/compose/issues" "Twitter" = "https://twitter.com/alteryxoss" "Chat" = "https://join.slack.com/t/alteryx-oss/shared_invite/zt-182tyvuxv-NzIn6eiCEf8TBziuKp0bNA" [project.optional-dependencies] test = [ "pip >= 21.3.1", "pytest >= 7.1.2", "pytest-cov >= 3.0.0", "pytest-xdist >= 2.5.0", "wheel >= 0.33.1", "featuretools >= 1.27.0", "woodwork >= 0.25.1", "pyarrow >= 7.0.0", ] updater = [ "alteryx-open-src-update-checker >= 2.1.0" ] docs = [ "evalml >= 0.45.0", "dask[distributed]" ] dev = [ "ruff >= 0.0.231", "pre-commit >= 2.20.0", "black[jupyter] == 22.10.0", "nbsphinx == 0.8.7", "pydata-sphinx-theme == 0.7.1", "Sphinx == 4.2.0", "sphinx-inline-tabs == 2022.1.2b11", "sphinx-copybutton == 0.4.0", "myst-parser == 0.16.1", "nbconvert == 6.4.5", "ipython == 7.31.1", "pygments == 2.10.0", "jupyter == 1.0.0", "pandoc == 1.1.0", "ipykernel == 6.4.2", "scikit-learn >= 0.20.0, !=0.22, <1.2.0", ] complete = [ "composeml[updater]", ] [tool.setuptools] include-package-data = true license-files = [ "LICENSE", ] [tool.setuptools.packages.find] namespaces = true [tool.setuptools.package-data] "*" = [ "*.txt", "README.md", ] "composeml.demos" = [ "*.csv", ] [tool.setuptools.exclude-package-data] "*" = [ "* __pycache__", "*.py[co]", "docs/*" ] [tool.setuptools.dynamic] version = {attr = "composeml.version.__version__"} [tool.pytest.ini_options] addopts = "--doctest-modules" testpaths = [ "composeml/tests/*" ] filterwarnings = [ "ignore::DeprecationWarning", "ignore::PendingDeprecationWarning" ] [tool.ruff] line-length = 88 ignore = ["E501"] select = [ # Pyflakes "F", # Pycodestyle "E", "W", # isort "I001" ] src = ["composeml"] [tool.ruff.per-file-ignores] "__init__.py" = ["E402", "F401", "I001", "E501"] [tool.coverage.run] source = ["composeml"] [tool.coverage.report] exclude_lines =[ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if self._verbose:", "if verbose:", "if profile:", "pytest.skip" ] [build-system] requires = [ "setuptools >= 61.0.0", "wheel" ] build-backend = "setuptools.build_meta" ================================================ FILE: release.md ================================================ # Release Process ## Prerequisites The 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. ## Create Release Branch 1. Branch off of main and name the branch the release version number (e.g. `release_v0.1.2`) 2. Bump version number in `composeml/version.py`, and `composeml/tests/test_version.py`. ## Create Release PR A 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. ## Create GitHub Release After the release pull request has been merged into the main branch, it is time draft the github release. * The target should be the main branch * The tag should be the version number with a v prefix (e.g. v0.1.2) * Release title is the same as the tag * Release description should be the full changelog updates for the release, including the line thanking contributors. ## Release on PyPI After publishing the release on GitHub, a GitHub Action will automatically upload the package to PyPI.