diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 0000000..14b82b0
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,37 @@
+# Contributing to AlphaPy
+Thank you for your contributions. This document discusses:
+
+- Reporting an issue
+- Submitting a fix
+- Proposing new features
+- Becoming a maintainer
+
+## Github
+We use Github to host our code, to track both issues and feature requests, and also accept pull requests. Pull requests are the best way to propose changes to the codebase ([Github Flow](https://guides.github.com/introduction/flow/index.html)).
+
+1. Fork the repo and create your branch from `master`.
+2. Add tests if possible.
+3. If you've changed an API, update the RST documentation.
+4. Run your code through lint.
+5. Issue the pull request.
+
+## Contribute under the Apache 2.0 Software License
+When you submit code changes, your submissions fall under the [Apache 2.0 License](https://github.com/ScottfreeLLC/AlphaPy/blob/master/LICENSE) that covers the project.
+
+## Report bugs using Github's [Issues](https://github.com/ScottfreeLLC/AlphaPy/issues)
+We use GitHub Issues to track public bugs. Report a bug by [opening a new issue](https://github.com/ScottfreeLLC/AlphaPy/issues).
+
+## Bug Reports and Feature Requests
+
+[Bug Report Template](https://github.com/ScottfreeLLC/AlphaPy/blob/master/.github/ISSUE_TEMPLATE/bug_report.md)
+
+[Feature Request Template](https://github.com/ScottfreeLLC/AlphaPy/blob/master/.github/ISSUE_TEMPLATE/feature_request.md)
+
+## Coding Style
+Please browse the repository to get a sense of how we structure our code and document our functions.
+
+## License
+By contributing, you agree that your contributions will be licensed under its Apache 2.0 License.
+
+## References
+This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md).
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..037a123
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+# These are supported funding model platforms
+
+github: [ScottfreeLLC]
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..dd84ea7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,38 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Desktop (please complete the following information):**
+ - OS: [e.g. iOS]
+ - Browser [e.g. chrome, safari]
+ - Version [e.g. 22]
+
+**Smartphone (please complete the following information):**
+ - Device: [e.g. iPhone6]
+ - OS: [e.g. iOS8.1]
+ - Browser [e.g. stock browser, safari]
+ - Version [e.g. 22]
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md
new file mode 100644
index 0000000..48d5f81
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/custom.md
@@ -0,0 +1,10 @@
+---
+name: Custom issue template
+about: Describe this issue template's purpose here.
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..bbcbbe7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.gitignore b/.gitignore
index de6fafb..e42261c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,26 @@
-
-*.pyc
-
-*.iml
-
-.idea/.name
-
-*.egg-info*
-
-*build*
-
-*.whl
-
-*.gz
+.DS_Store
+
+*.pyc
+
+*.iml
+
+*.egg-info*
+
+*build*
+
+*.whl
+
+*.gz
+
+.idea/*
+
+.eggs/*
+
+alphapy/examples/Trading System/.ipynb_checkpoints/A Trading System-checkpoint.ipynb
+*.pkl
+*.png
+*.code-workspace
+alphapy/.vscode/launch.json
+alphapy/.vscode/settings.json
+*.log
+docs/.vscode/settings.json
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..be55dc5
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,40 @@
+language: python
+sudo: false
+
+python:
+ - "3.7"
+ - "3.8"
+
+before_install:
+ # We do this conditionally because it saves us some downloading if the
+ # version is the same.
+ - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
+ wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh -O miniconda.sh;
+ else
+ wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
+ fi
+ - bash miniconda.sh -b -p $HOME/miniconda
+ - export PATH="$HOME/miniconda/bin:$PATH"
+ - hash -r
+ - conda config --set always_yes yes --set changeps1 no
+ - conda update -q conda
+ # Useful for debugging any issues with conda
+ - conda info -a
+
+install:
+ # Replace dep1 dep2 ... with your dependencies
+ - conda create -q -n testenv python=$TRAVIS_PYTHON_VERSION bokeh ipython matplotlib numpy pandas pyyaml scikit-learn scipy seaborn pandas-datareader
+ - source activate testenv
+ - pip install category_encoders
+ - pip install imbalanced-learn
+ - pip install pyfolio
+
+script:
+ nosetests
+
+notifications:
+ email: false
+
+branches:
+ only:
+ - master
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..0169ccd
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at scottfree.analytics@scottfreellc.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/README.rst b/README.rst
index 4eb5b3c..112ee55 100644
--- a/README.rst
+++ b/README.rst
@@ -1,13 +1,26 @@
AlphaPy
=======
+|badge_pypi| |badge_downloads| |badge_docs|
+
**AlphaPy** is a machine learning framework for both speculators and
-data scientists. It is written in Python with the ``scikit-learn``
-and ``pandas`` libraries, as well as many other helpful libraries
-for feature engineering and visualization. Here are just some of the
-things you can do with AlphaPy:
+data scientists. It is written in Python mainly with the ``scikit-learn``
+and ``pandas`` libraries, as well as many other helpful
+packages for feature engineering and visualization.
+
+🚀 **AlphaPy Pro is Now Available!**
+
+**AlphaPy Pro** - the professional edition of AlphaPy - is now publicly available!
+Featuring modern Python 3.12+ support, enhanced performance, and enterprise-grade capabilities.
+
+* **Repository**: https://github.com/ScottfreeLLC/alphapy-pro
+* **Documentation**: https://scottfreellc.github.io/alphapy-pro/
+* **Installation**: ``pip install alphapy-pro``
+
+Here are just some of the things you can do with **AlphaPy (legacy)**:
-* Run machine learning models using ``scikit-learn`` and ``xgboost``.
+* Run machine learning models using ``scikit-learn``, ``Keras``, ``xgboost``, ``LightGBM``, and ``CatBoost``.
+* Generate blended or stacked ensembles.
* Create models for analyzing the markets with *MarketFlow*.
* Predict sporting events with *SportFlow*.
* Develop trading systems and analyze portfolios using *MarketFlow*
@@ -18,15 +31,56 @@ things you can do with AlphaPy:
:alt: AlphaPy Model Pipeline
:align: center
+AlphaPy Pro: Now Available!
+---------------------------
+
+**AlphaPy Pro** is the next generation of AlphaPy with enhanced features and modern capabilities:
+
+* **Modern Python 3.12+** support with UV package management
+* **Enhanced MarketFlow** with advanced financial ML features
+* **MetaLabeling Support** for sophisticated financial modeling
+* **NLP Features** for sentiment analysis and text processing
+* **Automated CI/CD** with GitHub Actions and PyPI publishing
+* **Comprehensive Documentation** with tutorials and examples
+
+**Quick Start with AlphaPy Pro**::
+
+ pip install alphapy-pro
+
+**Links**:
+
+* **GitHub Repository**: https://github.com/ScottfreeLLC/alphapy-pro
+* **Documentation**: https://scottfreellc.github.io/alphapy-pro/
+* **PyPI Package**: https://pypi.org/project/alphapy-pro/
+
+**Note**: Active development has moved to AlphaPy Pro. This repository (AlphaPy) remains available for users who rely on the original version.
+
+Documentation
+-------------
+
+http://alphapy.readthedocs.io/en/latest/
+
Installation
------------
-You should already have pip, Python, and XGBoost (see below)
-installed on your system. Run the following command to install
+You should already have pip, Python, and optionally XGBoost, LightGBM, and
+CatBoost installed on your system (see below). Run the following command to install
AlphaPy::
pip install -U alphapy
+Pyfolio
+~~~~~~~
+
+Pyfolio is automatically installed by AlphaPy, but if you encounter
+the following error when trying to create a tear sheet:
+
+ *AttributeError: 'numpy.int64' object has no attribute 'to_pydatetime'*
+
+Install pyfolio with this command:
+
+ pip install git+https://github.com/quantopian/pyfolio
+
XGBoost
~~~~~~~
@@ -34,10 +88,17 @@ For Mac and Windows users, XGBoost will *not* install automatically
with ``pip``. For instructions to install XGBoost on your specific
platform, go to http://xgboost.readthedocs.io/en/latest/build.html.
-Documentation
--------------
+LightGBM
+~~~~~~~~
-http://alphapy.readthedocs.io/en/latest/
+For instructions to install LightGBM on your specific
+platform, go to https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html.
+
+CatBoost
+~~~~~~~~
+
+For instructions to install CatBoost on your specific
+platform, go to https://catboost.ai/docs/concepts/python-installation.html.
MarketFlow
----------
@@ -60,16 +121,23 @@ SportFlow
:alt: SportFlow
:align: center
+GamePT
+------
+
+You can find an implementation of MarketFlow here:
+
+https://www.scottfreellc.com/gamept
+
Support
-------
The official channel for support is to open an issue on Github.
-http://github.com/ScottFreeLLC/AlphaPy/issues
+http://github.com/ScottfreeLLC/AlphaPy/issues
Follow us on Twitter:
-https://twitter.com/scottfreellc?lang=en
+https://twitter.com/_AlphaPy_?lang=en
Donations
---------
@@ -77,3 +145,8 @@ Donations
If you like the software, please donate:
http://alphapy.readthedocs.io/en/latest/introduction/support.html#donations
+
+
+.. |badge_pypi| image:: https://badge.fury.io/py/alphapy.svg
+.. |badge_docs| image:: https://readthedocs.org/projects/alphapy/badge/?version=latest
+.. |badge_downloads| image:: https://static.pepy.tech/badge/alphapy
diff --git a/alphapy/.DS_Store b/alphapy/.DS_Store
new file mode 100644
index 0000000..5008ddf
Binary files /dev/null and b/alphapy/.DS_Store differ
diff --git a/alphapy/__main__.py b/alphapy/__main__.py
index 86ab413..a92ff6c 100644
--- a/alphapy/__main__.py
+++ b/alphapy/__main__.py
@@ -4,7 +4,7 @@
# Module : __main__
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,16 +22,27 @@
################################################################################
+#
+# Suppress Warnings
+#
+
+import warnings
+warnings.simplefilter(action='ignore', category=DeprecationWarning)
+warnings.simplefilter(action='ignore', category=FutureWarning)
+
+
#
# Imports
#
+print(__doc__)
+
from alphapy.data import get_data
from alphapy.data import sample_data
from alphapy.data import shuffle_data
from alphapy.estimators import get_estimators
from alphapy.estimators import scorers
-from alphapy.features import apply_treatments
+from alphapy.features import apply_transforms
from alphapy.features import create_crosstabs
from alphapy.features import create_features
from alphapy.features import create_interactions
@@ -39,6 +50,7 @@
from alphapy.features import remove_lv_features
from alphapy.features import save_features
from alphapy.features import select_features
+from alphapy.frame import write_frame
from alphapy.globals import CSEP, PSEP, SSEP, USEP
from alphapy.globals import ModelType
from alphapy.globals import Partition, datasets
@@ -46,7 +58,6 @@
from alphapy.model import first_fit
from alphapy.model import generate_metrics
from alphapy.model import get_model_config
-from alphapy.model import get_class_weights
from alphapy.model import load_feature_map
from alphapy.model import load_predictor
from alphapy.model import make_predictions
@@ -56,10 +67,9 @@
from alphapy.model import save_model
from alphapy.model import save_predictions
from alphapy.optimize import hyper_grid_search
-from alphapy.optimize import rfe_search
from alphapy.optimize import rfecv_search
from alphapy.plots import generate_plots
-from alphapy.utilities import np_store_data
+from alphapy.utilities import get_datestamp
import argparse
from datetime import datetime
@@ -67,6 +77,8 @@
import numpy as np
import os
import pandas as pd
+from sklearn.model_selection import train_test_split
+import sys
#
@@ -106,14 +118,18 @@ def training_pipeline(model):
# Unpack the model specifications
calibration = model.specs['calibration']
+ directory = model.specs['directory']
drop = model.specs['drop']
+ extension = model.specs['extension']
feature_selection = model.specs['feature_selection']
grid_search = model.specs['grid_search']
model_type = model.specs['model_type']
- predict_mode = model.specs['predict_mode']
rfe = model.specs['rfe']
sampling = model.specs['sampling']
scorer = model.specs['scorer']
+ seed = model.specs['seed']
+ separator = model.specs['separator']
+ split = model.specs['split']
target = model.specs['target']
# Get train and test data
@@ -121,6 +137,14 @@ def training_pipeline(model):
X_train, y_train = get_data(model, Partition.train)
X_test, y_test = get_data(model, Partition.test)
+ # If there is no test partition, then we will split the train partition
+
+ if X_test.empty:
+ logger.info("No Test Data Found")
+ logger.info("Splitting Training Data")
+ X_train, X_test, y_train, y_test = train_test_split(
+ X_train, y_train, test_size=split, random_state=seed)
+
# Determine if there are any test labels
if y_test.any():
@@ -128,13 +152,6 @@ def training_pipeline(model):
model.test_labels = True
model = save_features(model, X_train, X_test, y_train, y_test)
- # Drop features
-
- logger.info("Dropping Features: %s", drop)
- X_train = drop_features(X_train, drop)
- X_test = drop_features(X_test, drop)
- model = save_features(model, X_train, X_test)
-
# Log feature statistics
logger.info("Original Feature Statistics")
@@ -155,16 +172,30 @@ def training_pipeline(model):
if X_train.shape[1] == X_test.shape[1]:
split_point = X_train.shape[0]
- X = pd.concat([X_train, X_test])
+ X_all = pd.concat([X_train, X_test])
else:
raise IndexError("The number of training and test columns [%d, %d] must match." %
(X_train.shape[1], X_test.shape[1]))
- # Apply treatments to the feature matrix
+ # Apply transforms to the feature matrix
+ X_all = apply_transforms(model, X_all)
- all_features = apply_treatments(model, X)
- X_train, X_test = np.array_split(all_features, [split_point])
- model = save_features(model, X_train, X_test)
+ # Drop features
+ X_all = drop_features(X_all, drop)
+
+ # Save the train and test files with extracted and dropped features
+
+ datestamp = get_datestamp()
+ data_dir = SSEP.join([directory, 'input'])
+ df_train = X_all.iloc[:split_point, :]
+ df_train[target] = y_train
+ output_file = USEP.join([model.train_file, datestamp])
+ write_frame(df_train, data_dir, output_file, extension, separator, index=False)
+ df_test = X_all.iloc[split_point:, :]
+ if y_test.any():
+ df_test[target] = y_test
+ output_file = USEP.join([model.test_file, datestamp])
+ write_frame(df_test, data_dir, output_file, extension, separator, index=False)
# Create crosstabs for any categorical features
@@ -173,20 +204,20 @@ def training_pipeline(model):
# Create initial features
- all_features = create_features(model, all_features)
- X_train, X_test = np.array_split(all_features, [split_point])
+ X_all = create_features(model, X_all, X_train, X_test, y_train)
+ X_train, X_test = np.array_split(X_all, [split_point])
model = save_features(model, X_train, X_test)
# Generate interactions
- all_features = create_interactions(model, all_features)
- X_train, X_test = np.array_split(all_features, [split_point])
+ X_all = create_interactions(model, X_all)
+ X_train, X_test = np.array_split(X_all, [split_point])
model = save_features(model, X_train, X_test)
# Remove low-variance features
- all_features = remove_lv_features(model, all_features)
- X_train, X_test = np.array_split(all_features, [split_point])
+ X_all = remove_lv_features(model, X_all)
+ X_train, X_test = np.array_split(X_all, [split_point])
model = save_features(model, X_train, X_test)
# Shuffle the data [if specified]
@@ -199,8 +230,6 @@ def training_pipeline(model):
model = sample_data(model)
else:
logger.info("Skipping Sampling")
- # Get sample weights (classification only)
- model = get_class_weights(model)
# Perform feature selection, independent of algorithm
@@ -226,18 +255,19 @@ def training_pipeline(model):
# select estimator
try:
estimator = estimators[algo]
- scoring = estimator.scoring
est = estimator.estimator
except KeyError:
logger.info("Algorithm %s not found", algo)
# initial fit
model = first_fit(model, algo, est)
+ # copy feature name master into feature names per algorithm
+ model.fnames_algo[algo] = model.feature_names
# recursive feature elimination
if rfe:
- if scoring:
+ has_coef = hasattr(est, "coef_")
+ has_fimp = hasattr(est, "feature_importances_")
+ if has_coef or has_fimp:
model = rfecv_search(model, algo)
- elif hasattr(est, "coef_"):
- model = rfe_search(model, algo)
else:
logger.info("No RFE Available for %s", algo)
# grid search
@@ -301,13 +331,13 @@ def prediction_pipeline(model):
directory = model.specs['directory']
drop = model.specs['drop']
- extension = model.specs['extension']
feature_selection = model.specs['feature_selection']
model_type = model.specs['model_type']
rfe = model.specs['rfe']
- separator = model.specs['separator']
- # Get all data. We need original train and test for interactions.
+ # Get all data. We need original train and test for encodings.
+
+ X_train, y_train = get_data(model, Partition.train)
partition = Partition.predict
X_predict, _ = get_data(model, partition)
@@ -315,28 +345,26 @@ def prediction_pipeline(model):
# Load feature_map
model = load_feature_map(model, directory)
- # Drop features
-
- logger.info("Dropping Features: %s", drop)
- X_predict = drop_features(X_predict, drop)
-
# Log feature statistics
logger.info("Feature Statistics")
logger.info("Number of Prediction Rows : %d", X_predict.shape[0])
logger.info("Number of Prediction Columns : %d", X_predict.shape[1])
- # Apply treatments to the feature matrix
- all_features = apply_treatments(model, X_predict)
+ # Apply transforms to the feature matrix
+ X_all = apply_transforms(model, X_predict)
+
+ # Drop features
+ X_all = drop_features(X_all, drop)
# Create initial features
- all_features = create_features(model, all_features)
+ X_all = create_features(model, X_all, X_train, X_predict, y_train)
# Generate interactions
- all_features = create_interactions(model, all_features)
+ X_all = create_interactions(model, X_all)
# Remove low-variance features
- all_features = remove_lv_features(model, all_features)
+ X_all = remove_lv_features(model, X_all)
# Load the univariate support vector, if any
@@ -344,8 +372,8 @@ def prediction_pipeline(model):
logger.info("Getting Univariate Support")
try:
support = model.feature_map['uni_support']
- all_features = all_features[:, support]
- logger.info("New Feature Count : %d", all_features.shape[1])
+ X_all = X_all[:, support]
+ logger.info("New Feature Count : %d", X_all.shape[1])
except:
logger.info("No Univariate Support")
@@ -355,8 +383,8 @@ def prediction_pipeline(model):
logger.info("Getting RFE Support")
try:
support = model.feature_map['rfe_support']
- all_features = all_features[:, support]
- logger.info("New Feature Count : %d", all_features.shape[1])
+ X_all = X_all[:, support]
+ logger.info("New Feature Count : %d", X_all.shape[1])
except:
logger.info("No RFE Support")
@@ -367,19 +395,16 @@ def prediction_pipeline(model):
logger.info("Making Predictions")
tag = 'BEST'
- model.preds[(tag, partition)] = predictor.predict(all_features)
+ model.preds[(tag, partition)] = predictor.predict(X_all)
if model_type == ModelType.classification:
- model.probas[(tag, partition)] = predictor.predict_proba(all_features)[:, 1]
-
- # Get date stamp to record file creation
-
- d = datetime.now()
- f = "%Y%m%d"
- timestamp = d.strftime(f)
+ model.probas[(tag, partition)] = predictor.predict_proba(X_all)[:, 1]
# Save predictions
save_predictions(model, tag, partition)
+ # Return the model
+ return model
+
#
# Function main_pipeline
@@ -434,7 +459,7 @@ def main(args=None):
# Logging
logging.basicConfig(format="[%(asctime)s] %(levelname)s\t%(message)s",
- filename="alphapy.log", filemode='a', level=logging.DEBUG,
+ filename="alphapy.log", filemode='a', level=logging.INFO,
datefmt='%m/%d/%y %H:%M:%S')
formatter = logging.Formatter("[%(asctime)s] %(levelname)s\t%(message)s",
datefmt='%m/%d/%y %H:%M:%S')
diff --git a/alphapy/analysis.py b/alphapy/analysis.py
index d893a89..111eb0f 100644
--- a/alphapy/analysis.py
+++ b/alphapy/analysis.py
@@ -4,7 +4,7 @@
# Module : analysis
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2019 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,8 +28,9 @@
from alphapy.__main__ import main_pipeline
from alphapy.frame import load_frames
+from alphapy.frame import sequence_frame
from alphapy.frame import write_frame
-from alphapy.globals import SSEP, USEP
+from alphapy.globals import SSEP, TAG_ID, USEP
from alphapy.utilities import subtract_days
from datetime import timedelta
@@ -94,7 +95,7 @@ class Analysis(object):
analyses = {}
# __new__
-
+
def __new__(cls,
model,
group):
@@ -122,7 +123,7 @@ def __init__(self,
self.group = group
# add analysis to analyses list
Analysis.analyses[an] = self
-
+
# __str__
def __str__(self):
@@ -133,7 +134,7 @@ def __str__(self):
# Function run_analysis
#
-def run_analysis(analysis, forecast_period, leaders,
+def run_analysis(analysis, lag_period, forecast_period, leaders,
predict_history, splits=True):
r"""Run an analysis for a given model and group.
@@ -147,10 +148,14 @@ def run_analysis(analysis, forecast_period, leaders,
----------
analysis : alphapy.Analysis
The analysis to run.
+ lag_period : int
+ The number of lagged features for the analysis.
forecast_period : int
The period for forecasting the target of the analysis.
leaders : list
The features that are contemporaneous with the target.
+ predict_history : int
+ The number of periods required for lookback calculations.
splits : bool, optional
If ``True``, then the data for each member of the analysis
group are in separate files.
@@ -185,6 +190,7 @@ def run_analysis(analysis, forecast_period, leaders,
train_date = model.specs['train_date']
# Calculate split date
+ logger.info("Analysis Dates")
split_date = subtract_days(predict_date, predict_history)
# Load the data frames
@@ -194,43 +200,57 @@ def run_analysis(analysis, forecast_period, leaders,
if predict_mode:
# create predict frame
+ logger.info("Split Date for Prediction Mode: %s", split_date)
predict_frame = pd.DataFrame()
else:
# create train and test frames
+ logger.info("Split Date for Training Mode: %s", predict_date)
train_frame = pd.DataFrame()
test_frame = pd.DataFrame()
# Subset each individual frame and add to the master frame
+ leaders.extend([TAG_ID])
for df in data_frames:
+ try:
+ tag = df[TAG_ID].unique()[0]
+ except:
+ tag = 'Unknown'
+ first_date = df.index[0]
last_date = df.index[-1]
- # shift the target for the forecast period
- if forecast_period > 0:
- df[target] = df[target].shift(-forecast_period)
- # shift any leading features if necessary
- if leaders:
- df[leaders] = df[leaders].shift(-1)
+ logger.info("Analyzing %s from %s to %s", tag, first_date, last_date)
+ # sequence leaders, laggards, and target(s)
+ df = sequence_frame(df, target, forecast_period, leaders, lag_period)
# get frame subsets
if predict_mode:
new_predict = df.loc[(df.index >= split_date) & (df.index <= last_date)]
if len(new_predict) > 0:
predict_frame = predict_frame.append(new_predict)
else:
- logger.info("A prediction frame has zero rows. Check prediction date.")
+ logger.info("Prediction frame %s has zero rows. Check prediction date.",
+ tag)
else:
# split data into train and test
- new_train = df.loc[(df.index >= train_date) & (df.index < split_date)]
+ new_train = df.loc[(df.index >= train_date) & (df.index < predict_date)]
if len(new_train) > 0:
new_train = new_train.dropna()
train_frame = train_frame.append(new_train)
- new_test = df.loc[(df.index >= split_date) & (df.index <= last_date)]
+ new_test = df.loc[(df.index >= predict_date) & (df.index <= last_date)]
if len(new_test) > 0:
+ # check if target column has NaN values
+ nan_count = df[target].isnull().sum()
+ forecast_check = forecast_period - 1
+ if nan_count != forecast_check:
+ logger.info("%s has %d records with NaN targets", tag, nan_count)
+ # drop records with NaN values in target column
new_test = new_test.dropna(subset=[target])
+ # append selected records to the test frame
test_frame = test_frame.append(new_test)
else:
- logger.info("A testing frame has zero rows. Check prediction date.")
+ logger.info("Testing frame %s has zero rows. Check prediction date.",
+ tag)
else:
- logger.warning("A training frame has zero rows. Check data source.")
+ logger.info("Training frame %s has zero rows. Check data source.", tag)
# Write out the frames for input into the AlphaPy pipeline
diff --git a/alphapy/calendrical.py b/alphapy/calendrical.py
new file mode 100644
index 0000000..c368536
--- /dev/null
+++ b/alphapy/calendrical.py
@@ -0,0 +1,1275 @@
+################################################################################
+#
+# Package : calendrical
+# Created : July 11, 2017
+# Reference : Calendrical Calculations, Cambridge Press, 2002
+#
+# Copyright 2020 ScottFree Analytics LLC
+# Mark Conway & Robert D. Scott II
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+
+#
+# Imports
+#
+
+import calendar
+import logging
+import math
+import pandas as pd
+
+
+#
+# Initialize logger
+#
+
+logger = logging.getLogger(__name__)
+
+
+#
+# Function expand_dates
+#
+
+def expand_dates(date_list):
+ expanded_dates = []
+ for item in date_list:
+ if type(item) == str:
+ expanded_dates.append(item)
+ elif type(item) == list:
+ start_date = item[0]
+ end_date = item[1]
+ dates_dt = pd.date_range(start_date, end_date).tolist()
+ dates_str = [x.strftime('%Y-%m-%d') for x in dates_dt]
+ expanded_dates.extend(dates_str)
+ else:
+ logger.info("Error in date: %s" % item)
+ return expanded_dates
+
+
+#
+# Function biz_day_month
+#
+
+def biz_day_month(rdate):
+ r"""Calculate the business day of the month.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+
+ Returns
+ -------
+ bdm : int
+ Business day of month.
+ """
+
+ gyear, gmonth, _ = rdate_to_gdate(rdate)
+ rdate1 = gdate_to_rdate(gyear, gmonth, 1)
+
+ bdm = 0
+ index_date = rdate1
+ while index_date <= rdate:
+ dw = day_of_week(index_date)
+ week_day = dw >= 1 and dw <= 5
+ if week_day:
+ bdm += 1
+ index_date += 1
+
+ holidays = set_holidays(gyear, True)
+ for h in holidays:
+ holiday = holidays[h]
+ in_period = holiday >= rdate1 and holiday <= rdate
+ dwh = day_of_week(holiday)
+ week_day = dwh >= 1 and dwh <= 5
+ if in_period and week_day:
+ bdm -= 1
+ return bdm
+
+
+#
+# Function biz_day_week
+#
+
+def biz_day_week(rdate):
+ r"""Calculate the business day of the week.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+
+ Returns
+ -------
+ bdw : int
+ Business day of week.
+ """
+
+ gyear, _, _ = rdate_to_gdate(rdate)
+ dw = day_of_week(rdate)
+ week_day = dw >= 1 and dw <= 5
+
+ bdw = 0
+ if week_day:
+ rdate1 = rdate - dw + 1
+ rdate2 = rdate - 1
+ holidays = set_holidays(gyear, True)
+ for h in holidays:
+ holiday = holidays[h]
+ in_period = holiday >= rdate1 and holiday <= rdate2
+ if in_period:
+ bdw -= 1
+ return bdw
+
+
+#
+# Function day_of_week
+#
+
+def day_of_week(rdate):
+ r"""Get the ordinal day of the week.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+
+ Returns
+ -------
+ dw : int
+ Ordinal day of the week.
+ """
+ dw = rdate % 7
+ return dw
+
+
+#
+# Function day_of_year
+#
+
+def day_of_year(gyear, gmonth, gday):
+ r"""Calculate the day number of the given calendar year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+ gmonth : int
+ Gregorian month.
+ gday : int
+ Gregorian day.
+
+ Returns
+ -------
+ dy : int
+ Day number of year in RDate format.
+ """
+ dy = subtract_dates(gyear - 1, 12, 31, gyear, gmonth, gday)
+ return dy
+
+
+#
+# Function days_left_in_year
+#
+
+def days_left_in_year(gyear, gmonth, gday):
+ r"""Calculate the number of days remaining in the calendar year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+ gmonth : int
+ Gregorian month.
+ gday : int
+ Gregorian day.
+
+ Returns
+ -------
+ days_left : int
+ Calendar days remaining in RDate format.
+ """
+ days_left = subtract_dates(gyear, gmonth, gday, gyear, 12, 31)
+ return days_left
+
+
+#
+# Function first_kday
+#
+
+def first_kday(k, gyear, gmonth, gday):
+ r"""Calculate the first kday in RDate format.
+
+ Parameters
+ ----------
+ k : int
+ Day of the week.
+ gyear : int
+ Gregorian year.
+ gmonth : int
+ Gregorian month.
+ gday : int
+ Gregorian day.
+
+ Returns
+ -------
+ fkd : int
+ first-kday in RDate format.
+ """
+ fkd = nth_kday(1, k, gyear, gmonth, gday)
+ return fkd
+
+
+#
+# Function gdate_to_rdate
+#
+
+def gdate_to_rdate(gyear, gmonth, gday):
+ r"""Convert Gregorian date to RDate format.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+ gmonth : int
+ Gregorian month.
+ gday : int
+ Gregorian day.
+
+ Returns
+ -------
+ rdate : int
+ RDate date format.
+ """
+
+ if gmonth <= 2:
+ rfactor = 0
+ elif gmonth > 2 and leap_year(gyear):
+ rfactor = -1
+ else:
+ rfactor = -2
+
+ rdate = 365 * (gyear - 1) \
+ + math.floor((gyear - 1) / 4) \
+ - math.floor((gyear - 1) / 100) \
+ + math.floor((gyear - 1) / 400) \
+ + math.floor(((367 * gmonth) - 362) / 12) \
+ + gday + rfactor
+ return(rdate)
+
+
+#
+# Function get_nth_kday_of_month
+#
+
+def get_nth_kday_of_month(gday, gmonth, gyear):
+ r"""Convert Gregorian date to RDate format.
+
+ Parameters
+ ----------
+ gday : int
+ Gregorian day.
+ gmonth : int
+ Gregorian month.
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ nth : int
+ Ordinal number of a given day's occurrence within the month,
+ for example, the third Friday of the month.
+ """
+
+ this_month = calendar.monthcalendar(gyear, gmonth)
+ nth_kday_tuple = next(((i, e.index(gday)) for i, e in enumerate(this_month) if gday in e), None)
+ tuple_row = nth_kday_tuple[0]
+ tuple_pos = nth_kday_tuple[1]
+ nth = tuple_row + 1
+ if tuple_row > 0 and this_month[0][tuple_pos] == 0:
+ nth -= 1
+ return nth
+
+
+#
+# Function get_rdate
+#
+
+def get_rdate(row):
+ r"""Extract RDate from a dataframe.
+
+ Parameters
+ ----------
+ row : pandas.DataFrame
+ Row of a dataframe containing year, month, and day.
+
+ Returns
+ -------
+ rdate : int
+ RDate date format.
+ """
+ return gdate_to_rdate(row['year'], row['month'], row['day'])
+
+
+#
+# Function kday_after
+#
+
+def kday_after(rdate, k):
+ r"""Calculate the day after a given RDate.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+ k : int
+ Day of the week.
+
+ Returns
+ -------
+ kda : int
+ kday-after in RDate format.
+ """
+ kda = kday_on_before(rdate + 7, k)
+ return kda
+
+
+#
+# Function kday_before
+#
+
+def kday_before(rdate, k):
+ r"""Calculate the day before a given RDate.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+ k : int
+ Day of the week.
+
+ Returns
+ -------
+ kdb : int
+ kday-before in RDate format.
+ """
+ kdb = kday_on_before(rdate - 1, k)
+ return kdb
+
+
+#
+# Function kday_nearest
+#
+
+def kday_nearest(rdate, k):
+ r"""Calculate the day nearest a given RDate.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+ k : int
+ Day of the week.
+
+ Returns
+ -------
+ kdn : int
+ kday-nearest in RDate format.
+ """
+ kdn = kday_on_before(rdate + 3, k)
+ return kdn
+
+
+#
+# Function kday_on_after
+#
+
+def kday_on_after(rdate, k):
+ r"""Calculate the day on or after a given RDate.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+ k : int
+ Day of the week.
+
+ Returns
+ -------
+ kdoa : int
+ kday-on-or-after in RDate format.
+ """
+ kdoa = kday_on_before(rdate + 6, k)
+ return kdoa
+
+
+#
+# Function kday_on_before
+#
+
+def kday_on_before(rdate, k):
+ r"""Calculate the day on or before a given RDate.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+ k : int
+ Day of the week.
+
+ Returns
+ -------
+ kdob : int
+ kday-on-or-before in RDate format.
+ """
+ kdob = rdate - day_of_week(rdate - k)
+ return kdob
+
+
+#
+# Function last_kday
+#
+
+def last_kday(k, gyear, gmonth, gday):
+ r"""Calculate the last kday in RDate format.
+
+ Parameters
+ ----------
+ k : int
+ Day of the week.
+ gyear : int
+ Gregorian year.
+ gmonth : int
+ Gregorian month.
+ gday : int
+ Gregorian day.
+
+ Returns
+ -------
+ lkd : int
+ last-kday in RDate format.
+ """
+ lkd = nth_kday(-1, k, gyear, gmonth, gday)
+ return lkd
+
+
+#
+# Function leap_year
+#
+
+def leap_year(gyear):
+ r"""Determine if this is a Gregorian leap year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ leap_year : bool
+ True if a Gregorian leap year, else False.
+ """
+
+ mod1 = (gyear % 4 == 0)
+ mod2 = True
+ if gyear % 100 == 0:
+ mod2 = gyear % 400 == 0
+
+ leap_year = False
+ if mod1 and mod2:
+ leap_year = True
+ return leap_year
+
+
+#
+# Function next_event
+#
+
+def next_event(rdate, events):
+ r"""Find the next event after a given date.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+ events : list of RDate (int)
+ Monthly events in RDate format.
+
+ Returns
+ -------
+ event : RDate (int)
+ Next event in RDate format.
+ """
+ try:
+ event = next(e for e in events if e > rdate)
+ except:
+ event = 0
+ return event
+
+
+#
+# Function next_holiday
+#
+
+def next_holiday(rdate, holidays):
+ r"""Find the next holiday after a given date.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+ holidays : dict of RDate (int)
+ Holidays in RDate format.
+
+ Returns
+ -------
+ holiday : RDate (int)
+ Next holiday in RDate format.
+ """
+ try:
+ holiday = next(h for h in sorted(holidays.values()) if h > rdate)
+ except:
+ holiday = 0
+ return holiday
+
+
+#
+# Function nth_bizday
+#
+
+def nth_bizday(n, gyear, gmonth):
+ r"""Calculate the nth business day in a month.
+
+ Parameters
+ ----------
+ n : int
+ Number of the business day to get.
+ gyear : int
+ Gregorian year.
+ gmonth : int
+ Gregorian month.
+
+ Returns
+ -------
+ bizday : int
+ Nth business day of a given month in RDate format.
+ """
+
+ rdate = gdate_to_rdate(gyear, gmonth, 1)
+ holidays = set_holidays(gyear, True)
+ ibd = 0
+ idate = rdate
+ while (ibd < n):
+ dw = day_of_week(idate)
+ week_day = dw >= 1 and dw <= 5
+ if week_day and idate not in holidays.values():
+ ibd += 1
+ bizday = idate
+ idate += 1
+ return bizday
+
+
+#
+# Function nth_kday
+#
+
+def nth_kday(n, k, gyear, gmonth, gday):
+ r"""Calculate the nth-kday in RDate format.
+
+ Parameters
+ ----------
+ n : int
+ Occurrence of a given day counting in either direction.
+ k : int
+ Day of the week.
+ gyear : int
+ Gregorian year.
+ gmonth : int
+ Gregorian month.
+ gday : int
+ Gregorian day.
+
+ Returns
+ -------
+ nthkday : int
+ nth-kday in RDate format.
+ """
+
+ rdate = gdate_to_rdate(gyear, gmonth, gday)
+ if n > 0:
+ nthkday = 7 * n + kday_before(rdate, k)
+ else:
+ nthkday = 7 * n + kday_after(rdate, k)
+ return nthkday
+
+
+#
+# Function previous_event
+#
+
+def previous_event(rdate, events):
+ r"""Find the previous event before a given date.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+ events : list of RDate (int)
+ Monthly events in RDate format.
+
+ Returns
+ -------
+ event : RDate (int)
+ Previous event in RDate format.
+ """
+ try:
+ event = next(e for e in sorted(events, reverse=True) if e < rdate)
+ except:
+ event = 0
+ return event
+
+
+#
+# Function previous_holiday
+#
+
+def previous_holiday(rdate, holidays):
+ r"""Find the previous holiday before a given date.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+ holidays : dict of RDate (int)
+ Holidays in RDate format.
+
+ Returns
+ -------
+ holiday : RDate (int)
+ Previous holiday in RDate format.
+ """
+ try:
+ holiday = next(h for h in sorted(holidays.values(), reverse=True) if h < rdate)
+ except:
+ holiday = 0
+ return holiday
+
+
+#
+# Function rdate_to_gdate
+#
+
+def rdate_to_gdate(rdate):
+ r"""Convert RDate format to Gregorian date format.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+
+ Returns
+ -------
+ gyear : int
+ Gregorian year.
+ gmonth : int
+ Gregorian month.
+ gday : int
+ Gregorian day.
+ """
+
+ gyear = rdate_to_gyear(rdate)
+ priordays = rdate - gdate_to_rdate(gyear, 1, 1)
+ value1 = gdate_to_rdate(gyear, 3, 1)
+ if rdate < value1:
+ correction = 0
+ elif rdate >= value1 and leap_year(gyear):
+ correction = 1
+ else:
+ correction = 2
+ gmonth = math.floor((12 * (priordays + correction) + 373) / 367)
+ gday = rdate - gdate_to_rdate(gyear, gmonth, 1) + 1
+ return gyear, gmonth, gday
+
+
+#
+# Function rdate_to_gyear
+#
+
+def rdate_to_gyear(rdate):
+ r"""Convert RDate format to Gregorian year.
+
+ Parameters
+ ----------
+ rdate : int
+ RDate date format.
+
+ Returns
+ -------
+ gyear : int
+ Gregorian year.
+ """
+
+ d0 = rdate - 1
+ n400 = math.floor(d0 / 146097)
+ d1 = d0 % 146097
+ n100 = math.floor(d1 / 36524)
+ d2 = d1 % 36524
+ n4 = math.floor(d2 / 1461)
+ d3 = d2 % 1461
+ n1 = math.floor(d3 / 365)
+
+ theyear = 400 * n400 + 100 * n100 + 4 * n4 + n1
+ if n100 == 4 or n1 == 4:
+ gyear = theyear
+ else:
+ gyear = theyear + 1
+ return gyear
+
+
+#
+# Function set_events
+#
+
+def set_events(n, k, gyear, gday):
+ r"""Define monthly events for a given year.
+
+ Parameters
+ ----------
+ n : int
+ Occurrence of a given day counting in either direction.
+ k : int
+ Day of the week.
+ gyear : int
+ Gregorian year for the events.
+ gday : int
+ Gregorian day representing the first day to consider.
+
+ Returns
+ -------
+ events : list of RDate (int)
+ Monthly events in RDate format.
+
+ Example
+ -------
+ >>> # Options Expiration (Third Friday of every month)
+ >>> set_events(3, 5, 2017, 1)
+ """
+
+ events = []
+ month_range = range(1, 13)
+ for m in month_range:
+ rdate = nth_kday(n, k, gyear, m, gday)
+ events.append(rdate)
+ return events
+
+
+#
+# Function subtract_dates
+#
+
+def subtract_dates(gyear1, gmonth1, gday1, gyear2, gmonth2, gday2):
+ r"""Calculate the difference between two Gregorian dates.
+
+ Parameters
+ ----------
+ gyear1 : int
+ Gregorian year of first date.
+ gmonth1 : int
+ Gregorian month of first date.
+ gday1 : int
+ Gregorian day of first date.
+ gyear2 : int
+ Gregorian year of successive date.
+ gmonth2 : int
+ Gregorian month of successive date.
+ gday2 : int
+ Gregorian day of successive date.
+
+ Returns
+ -------
+ delta_days : int
+ Difference in days in RDate format.
+ """
+ delta_days = gdate_to_rdate(gyear2, gmonth2, gday2) \
+ - gdate_to_rdate(gyear1, gmonth1, gday1)
+ return delta_days
+
+
+
+#
+# Holiday Functions in Calendar Order
+#
+
+
+#
+# Function new_years_day
+#
+
+def new_years_day(gyear, observed):
+ r"""Get New Year's day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+ observed : bool
+ False if the exact date, True if the weekday.
+
+ Returns
+ -------
+ nyday : int
+ New Year's Day in RDate format.
+ """
+ nyday = gdate_to_rdate(gyear, 1, 1)
+ if observed and day_of_week(nyday) == 0:
+ nyday += 1
+ return nyday
+
+
+#
+# Function mlk_day
+#
+
+def mlk_day(gyear):
+ r"""Get Martin Luther King Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ mlkday : int
+ Martin Luther King Day in RDate format.
+ """
+ mlkday = nth_kday(3, 1, gyear, 1, 1)
+ return mlkday
+
+
+#
+# Function valentines_day
+#
+
+def valentines_day(gyear):
+ r"""Get Valentine's day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ valentines : int
+ Valentine's Day in RDate format.
+ """
+ valentines = gdate_to_rdate(gyear, 2, 14)
+ return valentines
+
+
+#
+# Function presidents_day
+#
+
+def presidents_day(gyear):
+ r"""Get President's Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ prezday : int
+ President's Day in RDate format.
+ """
+ prezday = nth_kday(3, 1, gyear, 2, 1)
+ return prezday
+
+
+#
+# Function saint_patricks_day
+#
+
+def saint_patricks_day(gyear):
+ r"""Get Saint Patrick's day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+ observed : bool
+ False if the exact date, True if the weekday.
+
+ Returns
+ -------
+ patricks : int
+ Saint Patrick's Day in RDate format.
+ """
+ patricks = gdate_to_rdate(gyear, 3, 17)
+ return patricks
+
+
+#
+# Function good_friday
+#
+
+def good_friday(gyear):
+ r"""Get Good Friday for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ gf : int
+ Good Friday in RDate format.
+ """
+ gf = easter_day(gyear) - 2
+ return gf
+
+
+#
+# Function easter_day
+#
+
+def easter_day(gyear):
+ r"""Get Easter Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ ed : int
+ Easter Day in RDate format.
+ """
+
+ century = math.floor(gyear / 100) + 1
+ epacts = (14 + 11 * (gyear % 19) - math.floor(3 * century / 4) \
+ + math.floor((5 + 8 * century) / 25)) % 30
+ if epacts == 0 or (epacts == 1 and 10 < (gyear % 19)):
+ epacta = epacts + 1
+ else:
+ epacta = epacts
+ rdate = gdate_to_rdate(gyear, 4, 19) - epacta
+ ed = kday_after(rdate, 0)
+ return ed
+
+
+#
+# Function cinco_de_mayo
+#
+
+def cinco_de_mayo(gyear):
+ r"""Get Cinco de Mayo for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ cinco_de_mayo : int
+ Cinco de Mayo in RDate format.
+ """
+ cinco = gdate_to_rdate(gyear, 5, 5)
+ return cinco
+
+
+#
+# Function mothers_day
+#
+
+def mothers_day(gyear):
+ r"""Get Mother's Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ mothers_day : int
+ Mother's Day in RDate format.
+ """
+ mothers_day = nth_kday(2, 0, gyear, 5, 1)
+ return mothers_day
+
+
+#
+# Function memorial_day
+#
+
+def memorial_day(gyear):
+ r"""Get Memorial Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ md : int
+ Memorial Day in RDate format.
+ """
+ md = last_kday(1, gyear, 5, 31)
+ return md
+
+
+#
+# Function fathers_day
+#
+
+def fathers_day(gyear):
+ r"""Get Father's Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ fathers_day : int
+ Father's Day in RDate format.
+ """
+ fathers_day = nth_kday(3, 0, gyear, 6, 1)
+ return fathers_day
+
+
+#
+# Function independence_day
+#
+
+def independence_day(gyear, observed):
+ r"""Get Independence Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+ observed : bool
+ False if the exact date, True if the weekday.
+
+ Returns
+ -------
+ d4j : int
+ Independence Day in RDate format.
+ """
+ d4j = gdate_to_rdate(gyear, 7, 4)
+ if observed:
+ if day_of_week(d4j) == 6:
+ d4j -= 1
+ if day_of_week(d4j) == 0:
+ d4j += 1
+ return d4j
+
+
+#
+# Function labor_day
+#
+
+def labor_day(gyear):
+ r"""Get Labor Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ lday : int
+ Labor Day in RDate format.
+ """
+ lday = first_kday(1, gyear, 9, 1)
+ return lday
+
+
+#
+# Function halloween
+#
+
+def halloween(gyear):
+ r"""Get Halloween for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ halloween : int
+ Halloween in RDate format.
+ """
+ halloween = gdate_to_rdate(gyear, 10, 31)
+ return halloween
+
+
+#
+# Function veterans_day
+#
+
+def veterans_day(gyear, observed):
+ r"""Get Veteran's day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+ observed : bool
+ False if the exact date, True if the weekday.
+
+ Returns
+ -------
+ veterans : int
+ Veteran's Day in RDate format.
+ """
+ veterans = gdate_to_rdate(gyear, 11, 11)
+ if observed and day_of_week(veterans) == 0:
+ veterans += 1
+ return veterans
+
+
+#
+# Function thanksgiving_day
+#
+
+def thanksgiving_day(gyear):
+ r"""Get Thanksgiving Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+
+ Returns
+ -------
+ tday : int
+ Thanksgiving Day in RDate format.
+ """
+ tday = nth_kday(4, 4, gyear, 11, 1)
+ return tday
+
+
+#
+# Function christmas_day
+#
+
+def christmas_day(gyear, observed):
+ r"""Get Christmas Day for a given year.
+
+ Parameters
+ ----------
+ gyear : int
+ Gregorian year.
+ observed : bool
+ False if the exact date, True if the weekday.
+
+ Returns
+ -------
+ xmas : int
+ Christmas Day in RDate format.
+ """
+ xmas = gdate_to_rdate(gyear, 12, 25)
+ if observed:
+ if day_of_week(xmas) == 6:
+ xmas -= 1
+ if day_of_week(xmas) == 0:
+ xmas += 1
+ return xmas
+
+
+#
+# Define holiday map
+#
+
+holiday_map = {"New Year's Day" : (new_years_day, True),
+ "MLK Day" : (mlk_day, False),
+ "Valentine's Day" : (valentines_day, False),
+ "President's Day" : (presidents_day, False),
+ "St. Patrick's Day" : (saint_patricks_day, False),
+ "Good Friday" : (good_friday, False),
+ "Easter" : (easter_day, False),
+ "Cinco de Mayo" : (cinco_de_mayo, False),
+ "Mother's Day" : (mothers_day, False),
+ "Memorial Day" : (memorial_day, False),
+ "Father's Day" : (fathers_day, False),
+ "Independence Day" : (independence_day, True),
+ "Labor Day" : (labor_day, False),
+ "Halloween" : (halloween, False),
+ "Veteran's Day" : (veterans_day, True),
+ "Thanksgiving" : (thanksgiving_day, False),
+ "Christmas" : (christmas_day, True)}
+
+
+#
+# Function get_holiday_names
+#
+
+def get_holiday_names():
+ r"""Get the list of defined holidays.
+
+ Returns
+ -------
+ holidays : list of str
+ List of holiday names.
+ """
+ holidays = [h for h in holiday_map]
+ return holidays
+
+
+#
+# Function set_holidays
+#
+
+def set_holidays(gyear, observe):
+ r"""Determine if this is a Gregorian leap year.
+
+ Parameters
+ ----------
+ gyear : int
+ Value for the corresponding key.
+ observe : bool
+ True to get the observed date, otherwise False.
+
+ Returns
+ -------
+ holidays : dict of int
+ Set of holidays in RDate format for a given year.
+ """
+
+ holidays = {}
+ for h in holiday_map:
+ hfunc = holiday_map[h][0]
+ observed = holiday_map[h][1]
+ if observed:
+ holidays[h] = hfunc(gyear, observe)
+ else:
+ holidays[h] = hfunc(gyear)
+ return holidays
diff --git a/alphapy/data.py b/alphapy/data.py
index 161b6ad..b2f4bcc 100644
--- a/alphapy/data.py
+++ b/alphapy/data.py
@@ -4,7 +4,7 @@
# Module : data
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2019 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,16 +31,19 @@
from alphapy.frame import read_frame
from alphapy.globals import ModelType
from alphapy.globals import Partition, datasets
-from alphapy.globals import PSEP, SSEP
+from alphapy.globals import PSEP, SSEP, USEP
from alphapy.globals import SamplingMethod
from alphapy.globals import WILDCARD
+from alphapy.space import Space
+import arrow
from datetime import datetime
from datetime import timedelta
+from iexfinance.stocks import get_historical_data
+from iexfinance.stocks import get_historical_intraday
from imblearn.combine import SMOTEENN
from imblearn.combine import SMOTETomek
-from imblearn.ensemble import BalanceCascade
-from imblearn.ensemble import EasyEnsemble
+import imblearn.ensemble
from imblearn.over_sampling import RandomOverSampler
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import ClusterCentroids
@@ -54,13 +57,17 @@
from imblearn.under_sampling import RepeatedEditedNearestNeighbours
from imblearn.under_sampling import TomekLinks
import logging
+import math
import numpy as np
+import os
import pandas as pd
+pd.core.common.is_list_like = pd.api.types.is_list_like
import pandas_datareader.data as web
import re
import requests
from scipy import sparse
from sklearn.preprocessing import LabelEncoder
+import sys
#
@@ -103,8 +110,11 @@ def get_data(model, partition):
model_type = model.specs['model_type']
separator = model.specs['separator']
target = model.specs['target']
- test_file = model.test_file
- train_file = model.train_file
+
+ # Initialize X and y
+
+ X = pd.DataFrame()
+ y = np.empty([0, 0])
# Read in the file
@@ -112,34 +122,32 @@ def get_data(model, partition):
input_dir = SSEP.join([directory, 'input'])
df = read_frame(input_dir, filename, extension, separator)
- # Assign target and drop it if necessary
+ # Get features and target
- y = np.empty([0, 0])
- if target in df.columns:
- logger.info("Found target %s in data frame", target)
- # check if target column has NaN values
- nan_count = df[target].isnull().sum()
- if nan_count > 0:
- logger.info("Found %d records with NaN target values", nan_count)
- logger.info("Labels (y) for %s will not be used", partition)
+ if not df.empty:
+ if target in df.columns:
+ logger.info("Found target %s in data frame", target)
+ # check if target column has NaN values
+ nan_count = df[target].isnull().sum()
+ if nan_count > 0:
+ logger.info("Found %d records with NaN target values", nan_count)
+ logger.info("Labels (y) for %s will not be used", partition)
+ else:
+ # assign the target column to y
+ y = df[target]
+ # encode label only for classification
+ if model_type == ModelType.classification:
+ y = LabelEncoder().fit_transform(y)
+ logger.info("Labels (y) found for %s", partition)
+ # drop the target from the original frame
+ df = df.drop([target], axis=1)
else:
- # assign the target column to y
- y = df[target]
- # encode label only for classification
- if model_type == ModelType.classification:
- y = LabelEncoder().fit_transform(y)
- logger.info("Labels (y) found for %s", partition)
- # drop the target from the original frame
- df = df.drop([target], axis=1)
- else:
- logger.info("Target %s not found in %s", target, partition)
-
- # Extract features
-
- if features == WILDCARD:
- X = df
- else:
- X = df[features]
+ logger.info("Target %s not found in %s", target, partition)
+ # Extract features
+ if features == WILDCARD:
+ X = df
+ else:
+ X = df[features]
# Labels are returned usually only for training data
return X, y
@@ -247,7 +255,7 @@ def sample_data(model):
elif sampling_method == SamplingMethod.under_nearmiss:
sampler = NearMiss(version=1)
elif sampling_method == SamplingMethod.under_ncr:
- sampler = NeighbourhoodCleaningRule(size_ngh=51)
+ sampler = NeighbourhoodCleaningRule()
elif sampling_method == SamplingMethod.over_random:
sampler = RandomOverSampler(ratio=ratio)
elif sampling_method == SamplingMethod.over_smote:
@@ -260,16 +268,18 @@ def sample_data(model):
sampler = SMOTETomek(ratio=ratio)
elif sampling_method == SamplingMethod.overunder_smote_enn:
sampler = SMOTEENN(ratio=ratio)
- elif sampling_method == SamplingMethod.ensemble_easy:
- sampler = EasyEnsemble()
elif sampling_method == SamplingMethod.ensemble_bc:
sampler = BalanceCascade()
+ elif sampling_method == SamplingMethod.ensemble_easy:
+ sampler = EasyEnsemble()
else:
raise ValueError("Unknown Sampling Method %s" % sampling_method)
# Get the newly sampled features.
-
- X, y = sampler.fit_sample(X_train, y_train)
+ try:
+ X, y = sampler.fit_sample(X_train, y_train)
+ except AttributeError:
+ X, y = sampler.fit_resample(X_train, y_train)
logger.info("Original Samples : %d", X_train.shape[0])
logger.info("New Samples : %d", X.shape[0])
@@ -283,10 +293,100 @@ def sample_data(model):
#
-# Function get_google_data
+# Function convert_data
#
-def get_google_data(symbol, lookback_period, fractal):
+def convert_data(df, index_column, intraday_data):
+ r"""Convert the market data frame to canonical format.
+
+ Parameters
+ ----------
+ df : pandas.DataFrame
+ The intraday dataframe.
+ index_column : str
+ The name of the index column.
+ intraday_data : bool
+ Flag set to True if the frame contains intraday data.
+
+ Returns
+ -------
+ df : pandas.DataFrame
+ The canonical dataframe with date/time index.
+
+ """
+
+ # Standardize column names
+ df = df.rename(columns = lambda x: x.lower().replace(' ',''))
+
+ # Create the time/date index if not already done
+
+ if not isinstance(df.index, pd.DatetimeIndex):
+ df.reset_index(inplace=True)
+ if intraday_data:
+ dt_column = df['date'] + ' ' + df['time']
+ else:
+ dt_column = df['date']
+ df[index_column] = pd.to_datetime(dt_column)
+ df.set_index(pd.DatetimeIndex(df[index_column]),
+ drop=True, inplace=True)
+ del df['date']
+ if intraday_data:
+ del df['time']
+
+ # Make the remaining columns floating point
+
+ cols_float = ['open', 'high', 'low', 'close', 'volume']
+ df[cols_float] = df[cols_float].astype(float)
+
+ # Order the frame by increasing date if necessary
+ df = df.sort_index()
+
+ return df
+
+
+#
+# Function enhance_intraday_data
+#
+
+def enhance_intraday_data(df):
+ r"""Add columns to the intraday dataframe.
+
+ Parameters
+ ----------
+ df : pandas.DataFrame
+ The intraday dataframe.
+
+ Returns
+ -------
+ df : pandas.DataFrame
+ The dataframe with bar number and end-of-day columns.
+
+ """
+
+ # Group by date first
+
+ df['date'] = df.index.strftime('%Y-%m-%d')
+ date_group = df.groupby('date')
+
+ # Number the intraday bars
+ df['bar_number'] = date_group.cumcount()
+
+ # Mark the end of the trading day
+
+ df['end_of_day'] = False
+ df.loc[date_group.tail(1).index, 'end_of_day'] = True
+
+ # Return the enhanced frame
+
+ del df['date']
+ return df
+
+
+#
+# Function get_google_intraday_data
+#
+
+def get_google_intraday_data(symbol, lookback_period, fractal):
r"""Get Google Finance intraday data.
We get intraday data from the Google Finance API, even though
@@ -312,20 +412,22 @@ def get_google_data(symbol, lookback_period, fractal):
# Google requires upper-case symbol, otherwise not found
symbol = symbol.upper()
- # convert fractal to interval
+ # Initialize data frame
+ df = pd.DataFrame()
+ # Convert fractal to interval
interval = 60 * int(re.findall('\d+', fractal)[0])
# Google has a 50-day limit
max_days = 50
if lookback_period > max_days:
lookback_period = max_days
- # set Google data constants
+ # Set Google data constants
toffset = 7
line_length = 6
- # make the request to Google
- base_url = 'https://www.google.com/finance/getprices?q={}&i={}&p={}d&f=d,o,h,l,c,v'
+ # Make the request to Google
+ base_url = 'https://finance.google.com/finance/getprices?q={}&i={}&p={}d&f=d,o,h,l,c,v'
url = base_url.format(symbol, interval, lookback_period)
response = requests.get(url)
- # process the response
+ # Process the response
text = response.text.split('\n')
records = []
for line in text[toffset:]:
@@ -345,117 +447,415 @@ def get_google_data(symbol, lookback_period, fractal):
dt = datetime.fromtimestamp(day_item + (interval * offset))
dt = pd.to_datetime(dt)
dt_date = dt.strftime('%Y-%m-%d')
- record = (dt, dt_date, open_item, high_item, low_item, close_item, volume_item)
+ dt_time = dt.strftime('%H:%M:%S')
+ record = (dt_date, dt_time, open_item, high_item, low_item, close_item, volume_item)
records.append(record)
- # create data frame
- cols = ['datetime', 'date', 'open', 'high', 'low', 'close', 'volume']
+ # Create data frame
+ cols = ['date', 'time', 'open', 'high', 'low', 'close', 'volume']
df = pd.DataFrame.from_records(records, columns=cols)
- # convert to proper data types
- cols_float = ['open', 'high', 'low', 'close']
- df[cols_float] = df[cols_float].astype(float)
- df['volume'] = df['volume'].astype(int)
- # number the intraday bars
- date_group = df.groupby('date')
- df['bar_number'] = date_group.cumcount()
- # mark the end of the trading day
- df['end_of_day'] = False
- del df['date']
- df.loc[date_group.tail(1).index, 'end_of_day'] = True
- # set the index to datetime
- df.index = df['datetime']
- del df['datetime']
- # return the dataframe
+ # Return the dataframe
return df
#
-# Function get_yahoo_data
+# Function get_google_data
#
-def get_yahoo_data(symbol, lookback_period):
- r"""Get Yahoo Finance daily data.
+def get_google_data(schema, subschema, symbol, intraday_data, data_fractal,
+ from_date, to_date, lookback_period):
+ r"""Get data from Google.
Parameters
----------
+ schema : str
+ The schema (including any subschema) for this data feed.
+ subschema : str
+ Any subschema for this data feed.
symbol : str
A valid stock symbol.
+ intraday_data : bool
+ If True, then get intraday data.
+ data_fractal : str
+ Pandas offset alias.
+ from_date : str
+ Starting date for symbol retrieval.
+ to_date : str
+ Ending date for symbol retrieval.
lookback_period : int
- The number of days of daily data to retrieve.
+ The number of periods of data to retrieve.
Returns
-------
df : pandas.DataFrame
- The dataframe containing the intraday data.
+ The dataframe containing the market data.
+
+ """
+
+ df = pd.DataFrame()
+ if intraday_data:
+ # use internal function
+ # df = get_google_intraday_data(symbol, lookback_period, data_fractal)
+ logger.info("Google Finance API for intraday data no longer available")
+ else:
+ # Google Finance API no longer available
+ logger.info("Google Finance API for daily data no longer available")
+ return df
+
+
+#
+# Function get_iex_data
+#
+
+def get_iex_data(schema, subschema, symbol, intraday_data, data_fractal,
+ from_date, to_date, lookback_period):
+ r"""Get data from IEX.
+
+ Parameters
+ ----------
+ schema : str
+ The schema (including any subschema) for this data feed.
+ subschema : str
+ Any subschema for this data feed.
+ symbol : str
+ A valid stock symbol.
+ intraday_data : bool
+ If True, then get intraday data.
+ data_fractal : str
+ Pandas offset alias.
+ from_date : str
+ Starting date for symbol retrieval.
+ to_date : str
+ Ending date for symbol retrieval.
+ lookback_period : int
+ The number of periods of data to retrieve.
+
+ Returns
+ -------
+ df : pandas.DataFrame
+ The dataframe containing the market data.
"""
- # Calculate the start and end date for Yahoo.
+ symbol = symbol.upper()
+ df = pd.DataFrame()
+
+ if intraday_data:
+ # use iexfinance function to get intraday data for each date
+ df = pd.DataFrame()
+ for d in pd.date_range(from_date, to_date):
+ dstr = d.strftime('%Y-%m-%d')
+ logger.info("%s Data for %s", symbol, dstr)
+ try:
+ df1 = get_historical_intraday(symbol, d, output_format="pandas")
+ df1_len = len(df1)
+ if df1_len > 0:
+ logger.info("%s: %d rows", symbol, df1_len)
+ df = df.append(df1)
+ else:
+ logger.info("%s: No Trading Data for %s", symbol, dstr)
+ except:
+ iex_error = "*** IEX Intraday Data Error (check Quota) ***"
+ logger.error(iex_error)
+ sys.exit(iex_error)
+ else:
+ # use iexfinance function for historical daily data
+ try:
+ df = get_historical_data(symbol, from_date, to_date, output_format="pandas")
+ except:
+ iex_error = "*** IEX Daily Data Error (check Quota) ***"
+ logger.error(iex_error)
+ sys.exit(iex_error)
+ return df
+
+
+#
+# Function get_pandas_data
+#
+
+def get_pandas_data(schema, subschema, symbol, intraday_data, data_fractal,
+ from_date, to_date, lookback_period):
+ r"""Get Pandas Web Reader data.
+
+ Parameters
+ ----------
+ schema : str
+ The schema (including any subschema) for this data feed.
+ subschema : str
+ Any subschema for this data feed.
+ symbol : str
+ A valid stock symbol.
+ intraday_data : bool
+ If True, then get intraday data.
+ data_fractal : str
+ Pandas offset alias.
+ from_date : str
+ Starting date for symbol retrieval.
+ to_date : str
+ Ending date for symbol retrieval.
+ lookback_period : int
+ The number of periods of data to retrieve.
- start = datetime.now() - timedelta(lookback_period)
- end = datetime.now()
+ Returns
+ -------
+ df : pandas.DataFrame
+ The dataframe containing the market data.
+
+ """
# Call the Pandas Web data reader.
- df = web.DataReader(symbol, 'yahoo', start, end)
+ try:
+ df = web.DataReader(symbol, schema, from_date, to_date)
+ except:
+ df = pd.DataFrame()
+ logger.info("Could not retrieve %s data with pandas-datareader", symbol.upper())
- # Set time series as index
+ return df
- if len(df) > 0:
- df.reset_index(level=0, inplace=True)
- df = df.rename(columns = lambda x: x.lower().replace(' ',''))
- df['datetime'] = pd.to_datetime(df['date'])
- del df['date']
- df.index = df['datetime']
- del df['datetime']
+
+#
+# Function get_quandl_data
+#
+
+def get_quandl_data(schema, subschema, symbol, intraday_data, data_fractal,
+ from_date, to_date, lookback_period):
+ r"""Get Quandl data.
+
+ Parameters
+ ----------
+ schema : str
+ The schema for this data feed.
+ subschema : str
+ Any subschema for this data feed.
+ symbol : str
+ A valid stock symbol.
+ intraday_data : bool
+ If True, then get intraday data.
+ data_fractal : str
+ Pandas offset alias.
+ from_date : str
+ Starting date for symbol retrieval.
+ to_date : str
+ Ending date for symbol retrieval.
+ lookback_period : int
+ The number of periods of data to retrieve.
+
+ Returns
+ -------
+ df : pandas.DataFrame
+ The dataframe containing the market data.
+
+ """
+
+ # Quandl is a special case with subfeeds.
+
+ symbol = SSEP.join([subschema.upper(), symbol.upper()])
+
+ # Call the Pandas Web data reader.
+
+ df = get_pandas_data(schema, subschema, symbol, intraday_data, data_fractal,
+ from_date, to_date, lookback_period)
+
+ return df
+
+
+#
+# Function get_yahoo_data
+#
+
+def get_yahoo_data(schema, subschema, symbol, intraday_data, data_fractal,
+ from_date, to_date, lookback_period):
+ r"""Get Yahoo data.
+
+ Parameters
+ ----------
+ schema : str
+ The schema (including any subschema) for this data feed.
+ subschema : str
+ Any subschema for this data feed.
+ symbol : str
+ A valid stock symbol.
+ intraday_data : bool
+ If True, then get intraday data.
+ data_fractal : str
+ Pandas offset alias.
+ from_date : str
+ Starting date for symbol retrieval.
+ to_date : str
+ Ending date for symbol retrieval.
+ lookback_period : int
+ The number of periods of data to retrieve.
+
+ Returns
+ -------
+ df : pandas.DataFrame
+ The dataframe containing the market data.
+
+ """
+
+ df = pd.DataFrame()
+ if intraday_data:
+ url = 'https://query1.finance.yahoo.com/v8/finance/chart/'
+ data_range = ''.join([str(lookback_period), 'd'])
+ interval = int(''.join(filter(str.isdigit, data_fractal)))
+ fractal = re.sub(r'\d+', '', data_fractal)
+ mapper = {'H': 60, 'T': 1, 'min':1, 'S': 1./60}
+ interval = math.ceil(interval * mapper[fractal])
+ data_interval = ''.join([str(interval), 'm'])
+ qualifiers = '{}?range={}&interval={}'.format(symbol, data_range, data_interval)
+ request = url + qualifiers
+ logger.info(request)
+ response = requests.get(request)
+ response_json = response.json()['chart']
+ if response_json['result']:
+ body = response_json['result'][0]
+ dt = pd.Series(map(lambda x: arrow.get(x).to('EST').datetime.replace(tzinfo=None), body['timestamp']), name='dt')
+ df = pd.DataFrame(body['indicators']['quote'][0], index=dt)
+ df = df.loc[:, ('open', 'high', 'low', 'close', 'volume')]
+ else:
+ logger.info("Could not get data from %s", schema)
+ logger.info(response_json['error']['code'])
+ logger.info(response_json['error']['description'])
+ else:
+ # use pandas data reader
+ df = get_pandas_data(schema, subschema, symbol, intraday_data, data_fractal,
+ from_date, to_date, lookback_period)
return df
#
-# Function get_feed_data
+# Data Dispatch Tables
+#
+
+data_dispatch_table = {'google' : get_google_data,
+ 'iex' : get_iex_data,
+ 'pandas' : get_pandas_data,
+ 'quandl' : get_quandl_data,
+ 'yahoo' : get_yahoo_data}
+
+
+#
+# Function get_market_data
#
-def get_feed_data(group, lookback_period):
+def get_market_data(model, market_specs, group, lookback_period, intraday_data=False):
r"""Get data from an external feed.
Parameters
----------
+ model : alphapy.Model
+ The model object describing the data.
+ market_specs : dict
+ The specifications for controlling the MarketFlow pipeline.
group : alphapy.Group
The group of symbols.
lookback_period : int
- The number of days of data to retrieve.
+ The number of periods of data to retrieve.
+ intraday_data : bool
+ If True, then get intraday data.
Returns
-------
- daily_data : bool
- ``True`` if daily data
+ n_periods : int
+ The maximum number of periods actually retrieved.
"""
+ # Unpack market specifications
+
+ data_fractal = market_specs['data_fractal']
+ subschema = market_specs['subschema']
+
+ # Unpack model specifications
+
+ directory = model.specs['directory']
+ extension = model.specs['extension']
+ separator = model.specs['separator']
+
+ # Unpack group elements
+
gspace = group.space
+ schema = gspace.schema
fractal = gspace.fractal
+
# Determine the feed source
- if 'd' in fractal:
- # daily data (date only)
- logger.info("Getting Daily Data")
- daily_data = True
- else:
+
+ if intraday_data:
# intraday data (date and time)
- logger.info("Getting Intraday Data (Google 50-day limit)")
- daily_data = False
+ logger.info("%s Intraday Data [%s] for %d periods",
+ schema, data_fractal, lookback_period)
+ index_column = 'datetime'
+ else:
+ # daily data or higher (date only)
+ logger.info("%s Daily Data [%s] for %d periods",
+ schema, data_fractal, lookback_period)
+ index_column = 'date'
+
# Get the data from the relevant feed
- for item in group.members:
- logger.info("Getting %s data for last %d days", item, lookback_period)
- if daily_data:
- df = get_yahoo_data(item, lookback_period)
+
+ data_dir = SSEP.join([directory, 'data'])
+ n_periods = 0
+ resample_data = True if fractal != data_fractal else False
+
+ # Date Arithmetic
+
+ to_date = pd.to_datetime('today')
+ from_date = to_date - pd.to_timedelta(lookback_period, unit='d')
+ to_date = to_date.strftime('%Y-%m-%d')
+ from_date = from_date.strftime('%Y-%m-%d')
+
+ # Get the data from the specified data feed
+
+ df = pd.DataFrame()
+ for symbol in group.members:
+ logger.info("Getting %s data from %s to %s",
+ symbol.upper(), from_date, to_date)
+ # Locate the data source
+ if schema == 'data':
+ # local intraday or daily
+ dspace = Space(gspace.subject, gspace.schema, data_fractal)
+ fname = frame_name(symbol.lower(), dspace)
+ df = read_frame(data_dir, fname, extension, separator)
+ elif schema in data_dispatch_table.keys():
+ df = data_dispatch_table[schema](schema,
+ subschema,
+ symbol,
+ intraday_data,
+ data_fractal,
+ from_date,
+ to_date,
+ lookback_period)
else:
- df = get_google_data(item, lookback_period, fractal)
- if len(df) > 0:
+ logger.error("Unsupported Data Source: %s", schema)
+ # Now that we have content, standardize the data
+ if not df.empty:
+ logger.info("Rows: %d [%s]", len(df), data_fractal)
+ # convert data to canonical form
+ df = convert_data(df, index_column, intraday_data)
+ # resample data and forward fill any NA values
+ if resample_data:
+ df = df.resample(fractal).agg({'open' : 'first',
+ 'high' : 'max',
+ 'low' : 'min',
+ 'close' : 'last',
+ 'volume' : 'sum'})
+ df.dropna(axis=0, how='any', inplace=True)
+ logger.info("Rows after Resampling at %s: %d",
+ fractal, len(df))
+ # add intraday columns if necessary
+ if intraday_data:
+ df = enhance_intraday_data(df)
# allocate global Frame
- newf = Frame(item.lower(), gspace, df)
+ newf = Frame(symbol.lower(), gspace, df)
if newf is None:
- logger.error("Could not allocate Frame for: %s", item)
+ logger.error("Could not allocate Frame for: %s", symbol.upper())
+ # calculate maximum number of periods
+ df_len = len(df)
+ if df_len > n_periods:
+ n_periods = df_len
else:
- logger.info("Could not get data for: %s", item)
- # Indicate whether or not data is daily
- return daily_data
+ logger.info("No DataFrame for %s", symbol.upper())
+
+ # The number of periods actually retrieved
+ return n_periods
diff --git a/alphapy/estimators.py b/alphapy/estimators.py
index 9ebd4c9..4394dba 100644
--- a/alphapy/estimators.py
+++ b/alphapy/estimators.py
@@ -4,7 +4,7 @@
# Module : estimators
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2019 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -30,6 +30,10 @@
from alphapy.globals import Objective
from alphapy.globals import SSEP
+from keras.layers import *
+from keras.models import Sequential
+from keras.wrappers.scikit_learn import KerasClassifier
+from keras.wrappers.scikit_learn import KerasRegressor
import logging
import numpy as np
from scipy.stats import randint as sp_randint
@@ -42,16 +46,12 @@
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
-from sklearn.linear_model import RandomizedLasso
-from sklearn.linear_model import RandomizedLogisticRegression
-from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import LinearSVC
-from sklearn.svm import OneClassSVM
from sklearn.svm import SVC
-import xgboost as xgb
+import sys
import yaml
@@ -66,33 +66,37 @@
# Define scorers
#
-scorers = {'accuracy' : (ModelType.classification, Objective.maximize),
- 'average_precision' : (ModelType.classification, Objective.maximize),
- 'f1' : (ModelType.classification, Objective.maximize),
- 'f1_macro' : (ModelType.classification, Objective.maximize),
- 'f1_micro' : (ModelType.classification, Objective.maximize),
- 'f1_samples' : (ModelType.classification, Objective.maximize),
- 'f1_weighted' : (ModelType.classification, Objective.maximize),
- 'neg_log_loss' : (ModelType.classification, Objective.minimize),
- 'precision' : (ModelType.classification, Objective.maximize),
- 'recall' : (ModelType.classification, Objective.maximize),
- 'roc_auc' : (ModelType.classification, Objective.maximize),
- 'adjusted_rand_score' : (ModelType.clustering, Objective.maximize),
- 'mean_absolute_error' : (ModelType.regression, Objective.minimize),
- 'neg_mean_squared_error' : (ModelType.regression, Objective.minimize),
- 'median_absolute_error' : (ModelType.regression, Objective.minimize),
- 'r2' : (ModelType.regression, Objective.maximize)}
+scorers = {'accuracy' : (ModelType.classification, Objective.maximize),
+ 'average_precision' : (ModelType.classification, Objective.maximize),
+ 'balanced_accuracy' : (ModelType.classification, Objective.maximize),
+ 'brier_score_loss' : (ModelType.classification, Objective.minimize),
+ 'f1' : (ModelType.classification, Objective.maximize),
+ 'f1_macro' : (ModelType.classification, Objective.maximize),
+ 'f1_micro' : (ModelType.classification, Objective.maximize),
+ 'f1_samples' : (ModelType.classification, Objective.maximize),
+ 'f1_weighted' : (ModelType.classification, Objective.maximize),
+ 'neg_log_loss' : (ModelType.classification, Objective.minimize),
+ 'precision' : (ModelType.classification, Objective.maximize),
+ 'recall' : (ModelType.classification, Objective.maximize),
+ 'roc_auc' : (ModelType.classification, Objective.maximize),
+ 'adjusted_rand_score' : (ModelType.clustering, Objective.maximize),
+ 'explained_variance' : (ModelType.regression, Objective.maximize),
+ 'neg_mean_absolute_error' : (ModelType.regression, Objective.minimize),
+ 'neg_mean_squared_error' : (ModelType.regression, Objective.minimize),
+ 'neg_mean_squared_log_error' : (ModelType.regression, Objective.minimize),
+ 'neg_median_absolute_error' : (ModelType.regression, Objective.minimize),
+ 'r2' : (ModelType.regression, Objective.maximize)}
#
# Define XGB scoring map
#
-xgb_score_map = {'neg_log_loss' : 'logloss',
- 'mean_absolute_error' : 'mae',
- 'neg_mean_squared_error' : 'rmse',
- 'precision' : 'map',
- 'roc_auc' : 'auc'}
+xgb_score_map = {'neg_log_loss' : 'logloss',
+ 'neg_mean_absolute_error' : 'mae',
+ 'neg_mean_squared_error' : 'rmse',
+ 'precision' : 'map',
+ 'roc_auc' : 'auc'}
#
@@ -112,95 +116,45 @@ class Estimator:
A scikit-learn, TensorFlow, or XGBoost function.
grid : dict
The dictionary of hyperparameters for grid search.
- scoring : bool, optional
- Use a scoring function to evaluate the best model.
"""
# __new__
-
+
def __new__(cls,
algorithm,
model_type,
estimator,
- grid,
- scoring=False):
+ grid):
return super(Estimator, cls).__new__(cls)
-
+
# __init__
-
+
def __init__(self,
algorithm,
model_type,
estimator,
- grid,
- scoring=False):
+ grid):
self.algorithm = algorithm.upper()
self.model_type = model_type
self.estimator = estimator
self.grid = grid
- self.scoring = scoring
-
+
# __str__
def __str__(self):
return self.name
-#
-# Classes
-#
-
-class AdaBoostClassifierCoef(AdaBoostClassifier):
- """An AdaBoost classifier where the coefficients are set to
- the feature importances for Recursive Feature Elimination
- to work.
-
- """
- def fit(self, *args, **kwargs):
- super(AdaBoostClassifierCoef, self).fit(*args, **kwargs)
- self.coef_ = self.feature_importances_
-
-
-class ExtraTreesClassifierCoef(ExtraTreesClassifier):
- """An Extra Trees classifier where the coefficients are set to
- the feature importances for Recursive Feature Elimination
- to work.
-
- """
- def fit(self, *args, **kwargs):
- super(ExtraTreesClassifierCoef, self).fit(*args, **kwargs)
- self.coef_ = self.feature_importances_
-
-
-class RandomForestClassifierCoef(RandomForestClassifier):
- """A Random Forest classifier where the coefficients are set to
- the feature importances for Recursive Feature Elimination
- to work.
-
- """
- def fit(self, *args, **kwargs):
- super(RandomForestClassifierCoef, self).fit(*args, **kwargs)
- self.coef_ = self.feature_importances_
-
-class GradientBoostingClassifierCoef(GradientBoostingClassifier):
- """A Gradient Boostin classifier where the coefficients are set to
- the feature importances for Recursive Feature Elimination
- to work.
-
- """
- def fit(self, *args, **kwargs):
- super(GradientBoostingClassifierCoef, self).fit(*args, **kwargs)
- self.coef_ = self.feature_importances_
-
-
#
# Define estimator map
#
-estimator_map = {'AB' : AdaBoostClassifierCoef,
- 'GB' : GradientBoostingClassifierCoef,
+estimator_map = {'AB' : AdaBoostClassifier,
+ 'GB' : GradientBoostingClassifier,
'GBR' : GradientBoostingRegressor,
+ 'KERASC' : KerasClassifier,
+ 'KERASR' : KerasRegressor,
'KNN' : KNeighborsClassifier,
'KNR' : KNeighborsRegressor,
'LOGR' : LogisticRegression,
@@ -209,17 +163,48 @@ def fit(self, *args, **kwargs):
'LSVM' : SVC,
'NB' : MultinomialNB,
'RBF' : SVC,
- 'RF' : RandomForestClassifierCoef,
+ 'RF' : RandomForestClassifier,
'RFR' : RandomForestRegressor,
'SVM' : SVC,
- 'XGB' : xgb.XGBClassifier,
- 'XGBM' : xgb.XGBClassifier,
- 'XGBR' : xgb.XGBRegressor,
- 'XT' : ExtraTreesClassifierCoef,
+ 'XT' : ExtraTreesClassifier,
'XTR' : ExtraTreesRegressor
}
+#
+# Find optional packages
+#
+
+def find_optional_packages():
+
+ module_name = 'xgboost'
+ try:
+ import xgboost as xgb
+ estimator_map['XGB'] = xgb.XGBClassifier
+ estimator_map['XGBM'] = xgb.XGBClassifier
+ estimator_map['XGBR'] = xgb.XGBRegressor
+ except:
+ logger.info("Cannot load %s" % module_name)
+
+ module_name = 'lightgbm'
+ try:
+ import lightgbm as lgb
+ estimator_map['LGB'] = lgb.LGBMClassifier
+ estimator_map['LGBR'] = lgb.LGBMRegressor
+ except:
+ logger.info("Cannot load %s" % module_name)
+
+ module_name = 'catboost'
+ try:
+ import catboost as catb
+ estimator_map['CATB'] = catb.CatBoostClassifier
+ estimator_map['CATBR'] = catb.CatBoostRegressor
+ except:
+ logger.info("Cannot load %s" % module_name)
+
+ return
+
+
#
# Function get_algos_config
#
@@ -246,15 +231,24 @@ def get_algos_config(cfg_dir):
full_path = SSEP.join([cfg_dir, 'algos.yml'])
with open(full_path, 'r') as ymlfile:
- specs = yaml.load(ymlfile)
+ specs = yaml.load(ymlfile, Loader=yaml.FullLoader)
+
+ # Find optional packages
+
+ find_optional_packages()
# Ensure each algorithm has required keys
- required_keys = ['model_type', 'params', 'grid', 'scoring']
+ minimum_keys = ['model_type', 'params', 'grid']
+ required_keys_keras = minimum_keys + ['layers', 'compiler']
for algo in specs:
+ if 'KERAS' in algo:
+ required_keys = required_keys_keras
+ else:
+ required_keys = minimum_keys
algo_keys = list(specs[algo].keys())
if set(algo_keys) != set(required_keys):
- logger.warning("Algorithm %s is missing the required keys %s",
+ logger.warning("Algorithm %s has the wrong keys %s",
algo, required_keys)
logger.warning("Keys found instead: %s", algo_keys)
else:
@@ -271,24 +265,57 @@ def get_algos_config(cfg_dir):
#
-# Function get_estimators
+# Function create_keras_model
#
-# AdaBoost (feature_importances_)
-# Gradient Boosting (feature_importances_)
-# K-Nearest Neighbors (NA)
-# Linear Regression (coef_)
-# Linear Support Vector Machine (coef_)
-# Logistic Regression (coef_)
-# Naive Bayes (coef_)
-# Radial Basis Function (NA)
-# Random Forest (feature_importances_)
-# Support Vector Machine (NA)
-# XGBoost Binary (NA)
-# XGBoost Multi (NA)
-# Extra Trees (feature_importances_)
-# Random Forest (feature_importances_)
-# Randomized Lasso
+def create_keras_model(nlayers,
+ layer1=None,
+ layer2=None,
+ layer3=None,
+ layer4=None,
+ layer5=None,
+ layer6=None,
+ layer7=None,
+ layer8=None,
+ layer9=None,
+ layer10=None,
+ optimizer=None,
+ loss=None,
+ metrics=None):
+ r"""Create a Keras Sequential model.
+
+ Parameters
+ ----------
+ nlayers : int
+ Number of layers of the Sequential model.
+ layer1...layer10 : str
+ Ordered layers of the Sequential model.
+ optimizer : str
+ Compiler optimizer for the Sequential model.
+ loss : str
+ Compiler loss function for the Sequential model.
+ metrics : str
+ Compiler evaluation metric for the Sequential model.
+
+ Returns
+ -------
+ model : keras.models.Sequential
+ Compiled Keras Sequential Model.
+
+ """
+
+ model = Sequential()
+ for i in range(nlayers):
+ lvar = 'layer' + str(i+1)
+ layer = eval(lvar)
+ model.add(eval(layer))
+ model.compile(optimizer=optimizer, loss=loss, metrics=[metrics])
+ return model
+
+
+#
+# Function get_estimators
+#
def get_estimators(model):
r"""Define all the AlphaPy estimators based on the contents
@@ -314,15 +341,23 @@ def get_estimators(model):
seed = model.specs['seed']
verbosity = model.specs['verbosity']
+ # Reference training data for Keras input_dim
+ X_train = model.X_train
+
# Initialize estimator dictionary
estimators = {}
# Global parameter substitution fields
+
ps_fields = {'n_estimators' : 'n_estimators',
+ 'iterations' : 'n_estimators',
'n_jobs' : 'n_jobs',
'nthread' : 'n_jobs',
- 'random_state' : 'seed',
+ 'thread_count' : 'n_jobs',
'seed' : 'seed',
+ 'random_state' : 'seed',
+ 'random_seed' : 'seed',
+ 'verbosity' : 'verbosity',
'verbose' : 'verbosity'}
# Get algorithm specifications
@@ -338,11 +373,32 @@ def get_estimators(model):
for param in params:
if param in ps_fields and isinstance(param, str):
algo_specs[algo]['params'][param] = eval(ps_fields[param])
- func = estimator_map[algo]
- est = func(**params)
- grid = algo_specs[algo]['grid']
- scoring = algo_specs[algo]['scoring']
- estimators[algo] = Estimator(algo, model_type, est, grid, scoring)
+ try:
+ algo_found = True
+ func = estimator_map[algo]
+ except:
+ algo_found = False
+ logger.info("Algorithm %s not found (check package installation)" % algo)
+ if algo_found:
+ if 'KERAS' in algo:
+ params['build_fn'] = create_keras_model
+ layers = algo_specs[algo]['layers']
+ params['nlayers'] = len(layers)
+ input_dim_string = ', input_dim={})'.format(X_train.shape[1])
+ layers[0] = layers[0].replace(')', input_dim_string)
+ for i, layer in enumerate(layers):
+ params['layer'+str(i+1)] = layer
+ compiler = algo_specs[algo]['compiler']
+ params['optimizer'] = compiler['optimizer']
+ params['loss'] = compiler['loss']
+ try:
+ params['metrics'] = compiler['metrics']
+ except:
+ pass
+ est = func(**params)
+ grid = algo_specs[algo]['grid']
+ estimators[algo] = Estimator(algo, model_type, est, grid)
+
# return the entire classifier list
return estimators
diff --git a/alphapy/examples/Kaggle/config/algos.yml b/alphapy/examples/Kaggle/config/algos.yml
deleted file mode 100644
index ab4678a..0000000
--- a/alphapy/examples/Kaggle/config/algos.yml
+++ /dev/null
@@ -1,250 +0,0 @@
-#
-# Algorithms
-#
-
-AB:
- # AdaBoost
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "random_state" : seed}
- grid : {"n_estimators" : [10, 50, 100, 150, 200],
- "learning_rate" : [0.2, 0.5, 0.7, 1.0, 1.5, 2.0],
- "algorithm" : ['SAMME', 'SAMME.R']}
- scoring : True
-
-GB:
- # Gradient Boosting
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "max_depth" : 3,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"loss" : ['deviance', 'exponential'],
- "learning_rate" : [0.05, 0.1, 0.15],
- "n_estimators" : [50, 100, 200],
- "max_depth" : [3, 5, 10],
- "min_samples_split" : [2, 3],
- "min_samples_leaf" : [1, 2]}
- scoring : True
-
-GBR:
- # Gradient Boosting Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {}
- scoring : False
-
-KNN:
- # K-Nearest Neighbors
- model_type : classification
- params : {"n_jobs" : n_jobs}
- grid : {"n_neighbors" : [3, 5, 7, 10],
- "weights" : ['uniform', 'distance'],
- "algorithm" : ['ball_tree', 'kd_tree', 'brute', 'auto'],
- "leaf_size" : [10, 20, 30, 40, 50]}
- scoring : False
-
-KNR:
- # K-Nearest Neighbor Regression
- model_type : regression
- params : {"n_jobs" : n_jobs}
- grid : {}
- scoring : False
-
-LOGR:
- # Logistic Regression
- model_type : classification
- params : {"random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"penalty" : ['l2'],
- "C" : [0.00001, 0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 1e4, 1e5, 1e6, 1e7],
- "fit_intercept" : [True, False],
- "solver" : ['newton-cg', 'lbfgs', 'liblinear', 'sag']}
- scoring : True
-
-LR:
- # Linear Regression
- model_type : regression
- params : {"n_jobs" : n_jobs}
- grid : {"fit_intercept" : [True, False],
- "normalize" : [True, False],
- "copy_X" : [True, False]}
- scoring : False
-
-LSVC:
- # Linear Support Vector Classification
- model_type : classification
- params : {"C" : 0.01,
- "max_iter" : 2000,
- "penalty" : 'l1',
- "dual" : False,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "penalty" : ['l1', 'l2'],
- "dual" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "max_iter" : [500, 1000, 2000]}
- scoring : False
-
-LSVM:
- # Linear Support Vector Machine
- model_type : classification
- params : {"kernel" : 'linear',
- "probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-NB:
- # Naive Bayes
- model_type : classification
- params : {}
- grid : {"alpha" : [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0, 5.0, 10.0],
- "fit_prior" : [True, False]}
- scoring : True
-
-RBF:
- # Radial Basis Function
- model_type : classification
- params : {"kernel" : 'rbf',
- "probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-RF:
- # Random Forest
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "max_depth" : 10,
- "min_samples_split" : 5,
- "min_samples_leaf" : 3,
- "bootstrap" : True,
- "criterion" : 'entropy',
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"n_estimators" : [21, 51, 101, 201, 501],
- "max_depth" : [5, 7, 10, 20],
- "min_samples_split" : [2, 3, 5, 10],
- "min_samples_leaf" : [1, 2, 3],
- "bootstrap" : [True, False],
- "criterion" : ['gini', 'entropy']}
- scoring : True
-
-RFR:
- # Random Forest Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {}
- scoring : False
-
-SVM:
- # Support Vector Machine
- model_type : classification
- params : {"probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-XGB:
- # XGBoost Binary
- model_type : classification
- params : {"objective" : 'binary:logistic',
- "n_estimators" : 300,
- "seed" : seed,
- "max_depth" : 3,
- "learning_rate" : 0.05,
- "min_child_weight" : 1.0,
- "subsample" : 1.0,
- "colsample_bytree" : 1.0,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {"n_estimators" : [21, 51, 101, 201, 501],
- "max_depth" : [5, 6, 7, 8, 9, 10, 12, 15, 20],
- "learning_rate" : [0.01, 0.02, 0.05, 0.1, 0.2],
- "min_child_weight" : [1.0, 1.1],
- "subsample" : [0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
- "colsample_bytree" : [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]}
- scoring : False
-
-XGBM:
- # XGBoost Multiclass
- model_type : multiclass
- params : {"objective" : 'multi:softmax',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 10,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {}
- scoring : False
-
-XGBR:
- # XGBoost Regression
- model_type : regression
- params : {"objective" : 'reg:linear',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 10,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "seed" : seed,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {}
- scoring : False
-
-XT:
- # Extra Trees
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"n_estimators" : [21, 51, 101, 201, 501, 1001, 2001],
- "max_features" : ['auto', 'sqrt', 'log2'],
- "max_depth" : [3, 5, 7, 10, 20, 30],
- "min_samples_split" : [2, 3],
- "min_samples_leaf" : [1, 2],
- "bootstrap" : [True, False],
- "warm_start" : [True, False]}
- scoring : True
-
-XTR:
- # Extra Trees Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {}
- scoring : False
diff --git a/alphapy/examples/Kaggle/config/model.yml b/alphapy/examples/Kaggle/config/model.yml
deleted file mode 100644
index 3fd559f..0000000
--- a/alphapy/examples/Kaggle/config/model.yml
+++ /dev/null
@@ -1,107 +0,0 @@
-project:
- directory : .
- file_extension : csv
- submission_file : 'gender_submission'
- submit_probas : False
-
-data:
- drop : ['PassengerId']
- features : '*'
- sampling :
- option : False
- method : under_random
- ratio : 0.5
- sentinel : -1
- separator : ','
- shuffle : False
- split : 0.4
- target : Survived
- target_value : 1
-
-model:
- algorithms : ['RF', 'XGB']
- balance_classes : True
- calibration :
- option : False
- type : sigmoid
- cv_folds : 3
- estimators : 51
- feature_selection :
- option : False
- percentage : 50
- uni_grid : [5, 10, 15, 20, 25]
- score_func : f_classif
- grid_search :
- option : True
- iterations : 50
- random : True
- subsample : False
- sampling_pct : 0.2
- pvalue_level : 0.01
- rfe :
- option : True
- step : 3
- scoring_function : roc_auc
- type : classification
-
-features:
- clustering :
- option : True
- increment : 3
- maximum : 30
- minimum : 3
- counts :
- option : True
- encoding :
- rounding : 2
- type : factorize
- factors : []
- interactions :
- option : True
- poly_degree : 5
- sampling_pct : 10
- isomap :
- option : False
- components : 2
- neighbors : 5
- logtransform :
- option : False
- numpy :
- option : True
- pca :
- option : False
- increment : 1
- maximum : 10
- minimum : 2
- whiten : False
- scaling :
- option : True
- type : standard
- scipy :
- option : False
- text :
- ngrams : 3
- vectorize : False
- tsne :
- option : False
- components : 2
- learning_rate : 1000.0
- perplexity : 30.0
- variance :
- option : True
- threshold : 0.1
-
-pipeline:
- number_jobs : -1
- seed : 42
- verbosity : 0
-
-plots:
- calibration : True
- confusion_matrix : True
- importances : True
- learning_curve : True
- roc_curve : True
-
-xgboost:
- stopping_rounds : 20
diff --git a/alphapy/examples/Kaggle/input/gender_submission.csv b/alphapy/examples/Kaggle/input/gender_submission.csv
deleted file mode 100644
index 7594506..0000000
--- a/alphapy/examples/Kaggle/input/gender_submission.csv
+++ /dev/null
@@ -1,419 +0,0 @@
-PassengerId,Survived
-892,0
-893,1
-894,0
-895,0
-896,1
-897,0
-898,1
-899,0
-900,1
-901,0
-902,0
-903,0
-904,1
-905,0
-906,1
-907,1
-908,0
-909,0
-910,1
-911,1
-912,0
-913,0
-914,1
-915,0
-916,1
-917,0
-918,1
-919,0
-920,0
-921,0
-922,0
-923,0
-924,1
-925,1
-926,0
-927,0
-928,1
-929,1
-930,0
-931,0
-932,0
-933,0
-934,0
-935,1
-936,1
-937,0
-938,0
-939,0
-940,1
-941,1
-942,0
-943,0
-944,1
-945,1
-946,0
-947,0
-948,0
-949,0
-950,0
-951,1
-952,0
-953,0
-954,0
-955,1
-956,0
-957,1
-958,1
-959,0
-960,0
-961,1
-962,1
-963,0
-964,1
-965,0
-966,1
-967,0
-968,0
-969,1
-970,0
-971,1
-972,0
-973,0
-974,0
-975,0
-976,0
-977,0
-978,1
-979,1
-980,1
-981,0
-982,1
-983,0
-984,1
-985,0
-986,0
-987,0
-988,1
-989,0
-990,1
-991,0
-992,1
-993,0
-994,0
-995,0
-996,1
-997,0
-998,0
-999,0
-1000,0
-1001,0
-1002,0
-1003,1
-1004,1
-1005,1
-1006,1
-1007,0
-1008,0
-1009,1
-1010,0
-1011,1
-1012,1
-1013,0
-1014,1
-1015,0
-1016,0
-1017,1
-1018,0
-1019,1
-1020,0
-1021,0
-1022,0
-1023,0
-1024,1
-1025,0
-1026,0
-1027,0
-1028,0
-1029,0
-1030,1
-1031,0
-1032,1
-1033,1
-1034,0
-1035,0
-1036,0
-1037,0
-1038,0
-1039,0
-1040,0
-1041,0
-1042,1
-1043,0
-1044,0
-1045,1
-1046,0
-1047,0
-1048,1
-1049,1
-1050,0
-1051,1
-1052,1
-1053,0
-1054,1
-1055,0
-1056,0
-1057,1
-1058,0
-1059,0
-1060,1
-1061,1
-1062,0
-1063,0
-1064,0
-1065,0
-1066,0
-1067,1
-1068,1
-1069,0
-1070,1
-1071,1
-1072,0
-1073,0
-1074,1
-1075,0
-1076,1
-1077,0
-1078,1
-1079,0
-1080,1
-1081,0
-1082,0
-1083,0
-1084,0
-1085,0
-1086,0
-1087,0
-1088,0
-1089,1
-1090,0
-1091,1
-1092,1
-1093,0
-1094,0
-1095,1
-1096,0
-1097,0
-1098,1
-1099,0
-1100,1
-1101,0
-1102,0
-1103,0
-1104,0
-1105,1
-1106,1
-1107,0
-1108,1
-1109,0
-1110,1
-1111,0
-1112,1
-1113,0
-1114,1
-1115,0
-1116,1
-1117,1
-1118,0
-1119,1
-1120,0
-1121,0
-1122,0
-1123,1
-1124,0
-1125,0
-1126,0
-1127,0
-1128,0
-1129,0
-1130,1
-1131,1
-1132,1
-1133,1
-1134,0
-1135,0
-1136,0
-1137,0
-1138,1
-1139,0
-1140,1
-1141,1
-1142,1
-1143,0
-1144,0
-1145,0
-1146,0
-1147,0
-1148,0
-1149,0
-1150,1
-1151,0
-1152,0
-1153,0
-1154,1
-1155,1
-1156,0
-1157,0
-1158,0
-1159,0
-1160,1
-1161,0
-1162,0
-1163,0
-1164,1
-1165,1
-1166,0
-1167,1
-1168,0
-1169,0
-1170,0
-1171,0
-1172,1
-1173,0
-1174,1
-1175,1
-1176,1
-1177,0
-1178,0
-1179,0
-1180,0
-1181,0
-1182,0
-1183,1
-1184,0
-1185,0
-1186,0
-1187,0
-1188,1
-1189,0
-1190,0
-1191,0
-1192,0
-1193,0
-1194,0
-1195,0
-1196,1
-1197,1
-1198,0
-1199,0
-1200,0
-1201,1
-1202,0
-1203,0
-1204,0
-1205,1
-1206,1
-1207,1
-1208,0
-1209,0
-1210,0
-1211,0
-1212,0
-1213,0
-1214,0
-1215,0
-1216,1
-1217,0
-1218,1
-1219,0
-1220,0
-1221,0
-1222,1
-1223,0
-1224,0
-1225,1
-1226,0
-1227,0
-1228,0
-1229,0
-1230,0
-1231,0
-1232,0
-1233,0
-1234,0
-1235,1
-1236,0
-1237,1
-1238,0
-1239,1
-1240,0
-1241,1
-1242,1
-1243,0
-1244,0
-1245,0
-1246,1
-1247,0
-1248,1
-1249,0
-1250,0
-1251,1
-1252,0
-1253,1
-1254,1
-1255,0
-1256,1
-1257,1
-1258,0
-1259,1
-1260,1
-1261,0
-1262,0
-1263,1
-1264,0
-1265,0
-1266,1
-1267,1
-1268,1
-1269,0
-1270,0
-1271,0
-1272,0
-1273,0
-1274,1
-1275,1
-1276,0
-1277,1
-1278,0
-1279,0
-1280,0
-1281,0
-1282,0
-1283,1
-1284,0
-1285,0
-1286,0
-1287,1
-1288,0
-1289,1
-1290,0
-1291,0
-1292,1
-1293,0
-1294,1
-1295,0
-1296,0
-1297,0
-1298,0
-1299,0
-1300,1
-1301,1
-1302,1
-1303,1
-1304,1
-1305,0
-1306,1
-1307,0
-1308,0
-1309,0
diff --git a/alphapy/examples/Kaggle/input/test.csv b/alphapy/examples/Kaggle/input/test.csv
deleted file mode 100644
index f705412..0000000
--- a/alphapy/examples/Kaggle/input/test.csv
+++ /dev/null
@@ -1,419 +0,0 @@
-PassengerId,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
-892,3,"Kelly, Mr. James",male,34.5,0,0,330911,7.8292,,Q
-893,3,"Wilkes, Mrs. James (Ellen Needs)",female,47,1,0,363272,7,,S
-894,2,"Myles, Mr. Thomas Francis",male,62,0,0,240276,9.6875,,Q
-895,3,"Wirz, Mr. Albert",male,27,0,0,315154,8.6625,,S
-896,3,"Hirvonen, Mrs. Alexander (Helga E Lindqvist)",female,22,1,1,3101298,12.2875,,S
-897,3,"Svensson, Mr. Johan Cervin",male,14,0,0,7538,9.225,,S
-898,3,"Connolly, Miss. Kate",female,30,0,0,330972,7.6292,,Q
-899,2,"Caldwell, Mr. Albert Francis",male,26,1,1,248738,29,,S
-900,3,"Abrahim, Mrs. Joseph (Sophie Halaut Easu)",female,18,0,0,2657,7.2292,,C
-901,3,"Davies, Mr. John Samuel",male,21,2,0,A/4 48871,24.15,,S
-902,3,"Ilieff, Mr. Ylio",male,,0,0,349220,7.8958,,S
-903,1,"Jones, Mr. Charles Cresson",male,46,0,0,694,26,,S
-904,1,"Snyder, Mrs. John Pillsbury (Nelle Stevenson)",female,23,1,0,21228,82.2667,B45,S
-905,2,"Howard, Mr. Benjamin",male,63,1,0,24065,26,,S
-906,1,"Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood)",female,47,1,0,W.E.P. 5734,61.175,E31,S
-907,2,"del Carlo, Mrs. Sebastiano (Argenia Genovesi)",female,24,1,0,SC/PARIS 2167,27.7208,,C
-908,2,"Keane, Mr. Daniel",male,35,0,0,233734,12.35,,Q
-909,3,"Assaf, Mr. Gerios",male,21,0,0,2692,7.225,,C
-910,3,"Ilmakangas, Miss. Ida Livija",female,27,1,0,STON/O2. 3101270,7.925,,S
-911,3,"Assaf Khalil, Mrs. Mariana (Miriam"")""",female,45,0,0,2696,7.225,,C
-912,1,"Rothschild, Mr. Martin",male,55,1,0,PC 17603,59.4,,C
-913,3,"Olsen, Master. Artur Karl",male,9,0,1,C 17368,3.1708,,S
-914,1,"Flegenheim, Mrs. Alfred (Antoinette)",female,,0,0,PC 17598,31.6833,,S
-915,1,"Williams, Mr. Richard Norris II",male,21,0,1,PC 17597,61.3792,,C
-916,1,"Ryerson, Mrs. Arthur Larned (Emily Maria Borie)",female,48,1,3,PC 17608,262.375,B57 B59 B63 B66,C
-917,3,"Robins, Mr. Alexander A",male,50,1,0,A/5. 3337,14.5,,S
-918,1,"Ostby, Miss. Helene Ragnhild",female,22,0,1,113509,61.9792,B36,C
-919,3,"Daher, Mr. Shedid",male,22.5,0,0,2698,7.225,,C
-920,1,"Brady, Mr. John Bertram",male,41,0,0,113054,30.5,A21,S
-921,3,"Samaan, Mr. Elias",male,,2,0,2662,21.6792,,C
-922,2,"Louch, Mr. Charles Alexander",male,50,1,0,SC/AH 3085,26,,S
-923,2,"Jefferys, Mr. Clifford Thomas",male,24,2,0,C.A. 31029,31.5,,S
-924,3,"Dean, Mrs. Bertram (Eva Georgetta Light)",female,33,1,2,C.A. 2315,20.575,,S
-925,3,"Johnston, Mrs. Andrew G (Elizabeth Lily"" Watson)""",female,,1,2,W./C. 6607,23.45,,S
-926,1,"Mock, Mr. Philipp Edmund",male,30,1,0,13236,57.75,C78,C
-927,3,"Katavelas, Mr. Vassilios (Catavelas Vassilios"")""",male,18.5,0,0,2682,7.2292,,C
-928,3,"Roth, Miss. Sarah A",female,,0,0,342712,8.05,,S
-929,3,"Cacic, Miss. Manda",female,21,0,0,315087,8.6625,,S
-930,3,"Sap, Mr. Julius",male,25,0,0,345768,9.5,,S
-931,3,"Hee, Mr. Ling",male,,0,0,1601,56.4958,,S
-932,3,"Karun, Mr. Franz",male,39,0,1,349256,13.4167,,C
-933,1,"Franklin, Mr. Thomas Parham",male,,0,0,113778,26.55,D34,S
-934,3,"Goldsmith, Mr. Nathan",male,41,0,0,SOTON/O.Q. 3101263,7.85,,S
-935,2,"Corbett, Mrs. Walter H (Irene Colvin)",female,30,0,0,237249,13,,S
-936,1,"Kimball, Mrs. Edwin Nelson Jr (Gertrude Parsons)",female,45,1,0,11753,52.5542,D19,S
-937,3,"Peltomaki, Mr. Nikolai Johannes",male,25,0,0,STON/O 2. 3101291,7.925,,S
-938,1,"Chevre, Mr. Paul Romaine",male,45,0,0,PC 17594,29.7,A9,C
-939,3,"Shaughnessy, Mr. Patrick",male,,0,0,370374,7.75,,Q
-940,1,"Bucknell, Mrs. William Robert (Emma Eliza Ward)",female,60,0,0,11813,76.2917,D15,C
-941,3,"Coutts, Mrs. William (Winnie Minnie"" Treanor)""",female,36,0,2,C.A. 37671,15.9,,S
-942,1,"Smith, Mr. Lucien Philip",male,24,1,0,13695,60,C31,S
-943,2,"Pulbaum, Mr. Franz",male,27,0,0,SC/PARIS 2168,15.0333,,C
-944,2,"Hocking, Miss. Ellen Nellie""""",female,20,2,1,29105,23,,S
-945,1,"Fortune, Miss. Ethel Flora",female,28,3,2,19950,263,C23 C25 C27,S
-946,2,"Mangiavacchi, Mr. Serafino Emilio",male,,0,0,SC/A.3 2861,15.5792,,C
-947,3,"Rice, Master. Albert",male,10,4,1,382652,29.125,,Q
-948,3,"Cor, Mr. Bartol",male,35,0,0,349230,7.8958,,S
-949,3,"Abelseth, Mr. Olaus Jorgensen",male,25,0,0,348122,7.65,F G63,S
-950,3,"Davison, Mr. Thomas Henry",male,,1,0,386525,16.1,,S
-951,1,"Chaudanson, Miss. Victorine",female,36,0,0,PC 17608,262.375,B61,C
-952,3,"Dika, Mr. Mirko",male,17,0,0,349232,7.8958,,S
-953,2,"McCrae, Mr. Arthur Gordon",male,32,0,0,237216,13.5,,S
-954,3,"Bjorklund, Mr. Ernst Herbert",male,18,0,0,347090,7.75,,S
-955,3,"Bradley, Miss. Bridget Delia",female,22,0,0,334914,7.725,,Q
-956,1,"Ryerson, Master. John Borie",male,13,2,2,PC 17608,262.375,B57 B59 B63 B66,C
-957,2,"Corey, Mrs. Percy C (Mary Phyllis Elizabeth Miller)",female,,0,0,F.C.C. 13534,21,,S
-958,3,"Burns, Miss. Mary Delia",female,18,0,0,330963,7.8792,,Q
-959,1,"Moore, Mr. Clarence Bloomfield",male,47,0,0,113796,42.4,,S
-960,1,"Tucker, Mr. Gilbert Milligan Jr",male,31,0,0,2543,28.5375,C53,C
-961,1,"Fortune, Mrs. Mark (Mary McDougald)",female,60,1,4,19950,263,C23 C25 C27,S
-962,3,"Mulvihill, Miss. Bertha E",female,24,0,0,382653,7.75,,Q
-963,3,"Minkoff, Mr. Lazar",male,21,0,0,349211,7.8958,,S
-964,3,"Nieminen, Miss. Manta Josefina",female,29,0,0,3101297,7.925,,S
-965,1,"Ovies y Rodriguez, Mr. Servando",male,28.5,0,0,PC 17562,27.7208,D43,C
-966,1,"Geiger, Miss. Amalie",female,35,0,0,113503,211.5,C130,C
-967,1,"Keeping, Mr. Edwin",male,32.5,0,0,113503,211.5,C132,C
-968,3,"Miles, Mr. Frank",male,,0,0,359306,8.05,,S
-969,1,"Cornell, Mrs. Robert Clifford (Malvina Helen Lamson)",female,55,2,0,11770,25.7,C101,S
-970,2,"Aldworth, Mr. Charles Augustus",male,30,0,0,248744,13,,S
-971,3,"Doyle, Miss. Elizabeth",female,24,0,0,368702,7.75,,Q
-972,3,"Boulos, Master. Akar",male,6,1,1,2678,15.2458,,C
-973,1,"Straus, Mr. Isidor",male,67,1,0,PC 17483,221.7792,C55 C57,S
-974,1,"Case, Mr. Howard Brown",male,49,0,0,19924,26,,S
-975,3,"Demetri, Mr. Marinko",male,,0,0,349238,7.8958,,S
-976,2,"Lamb, Mr. John Joseph",male,,0,0,240261,10.7083,,Q
-977,3,"Khalil, Mr. Betros",male,,1,0,2660,14.4542,,C
-978,3,"Barry, Miss. Julia",female,27,0,0,330844,7.8792,,Q
-979,3,"Badman, Miss. Emily Louisa",female,18,0,0,A/4 31416,8.05,,S
-980,3,"O'Donoghue, Ms. Bridget",female,,0,0,364856,7.75,,Q
-981,2,"Wells, Master. Ralph Lester",male,2,1,1,29103,23,,S
-982,3,"Dyker, Mrs. Adolf Fredrik (Anna Elisabeth Judith Andersson)",female,22,1,0,347072,13.9,,S
-983,3,"Pedersen, Mr. Olaf",male,,0,0,345498,7.775,,S
-984,1,"Davidson, Mrs. Thornton (Orian Hays)",female,27,1,2,F.C. 12750,52,B71,S
-985,3,"Guest, Mr. Robert",male,,0,0,376563,8.05,,S
-986,1,"Birnbaum, Mr. Jakob",male,25,0,0,13905,26,,C
-987,3,"Tenglin, Mr. Gunnar Isidor",male,25,0,0,350033,7.7958,,S
-988,1,"Cavendish, Mrs. Tyrell William (Julia Florence Siegel)",female,76,1,0,19877,78.85,C46,S
-989,3,"Makinen, Mr. Kalle Edvard",male,29,0,0,STON/O 2. 3101268,7.925,,S
-990,3,"Braf, Miss. Elin Ester Maria",female,20,0,0,347471,7.8542,,S
-991,3,"Nancarrow, Mr. William Henry",male,33,0,0,A./5. 3338,8.05,,S
-992,1,"Stengel, Mrs. Charles Emil Henry (Annie May Morris)",female,43,1,0,11778,55.4417,C116,C
-993,2,"Weisz, Mr. Leopold",male,27,1,0,228414,26,,S
-994,3,"Foley, Mr. William",male,,0,0,365235,7.75,,Q
-995,3,"Johansson Palmquist, Mr. Oskar Leander",male,26,0,0,347070,7.775,,S
-996,3,"Thomas, Mrs. Alexander (Thamine Thelma"")""",female,16,1,1,2625,8.5167,,C
-997,3,"Holthen, Mr. Johan Martin",male,28,0,0,C 4001,22.525,,S
-998,3,"Buckley, Mr. Daniel",male,21,0,0,330920,7.8208,,Q
-999,3,"Ryan, Mr. Edward",male,,0,0,383162,7.75,,Q
-1000,3,"Willer, Mr. Aaron (Abi Weller"")""",male,,0,0,3410,8.7125,,S
-1001,2,"Swane, Mr. George",male,18.5,0,0,248734,13,F,S
-1002,2,"Stanton, Mr. Samuel Ward",male,41,0,0,237734,15.0458,,C
-1003,3,"Shine, Miss. Ellen Natalia",female,,0,0,330968,7.7792,,Q
-1004,1,"Evans, Miss. Edith Corse",female,36,0,0,PC 17531,31.6792,A29,C
-1005,3,"Buckley, Miss. Katherine",female,18.5,0,0,329944,7.2833,,Q
-1006,1,"Straus, Mrs. Isidor (Rosalie Ida Blun)",female,63,1,0,PC 17483,221.7792,C55 C57,S
-1007,3,"Chronopoulos, Mr. Demetrios",male,18,1,0,2680,14.4542,,C
-1008,3,"Thomas, Mr. John",male,,0,0,2681,6.4375,,C
-1009,3,"Sandstrom, Miss. Beatrice Irene",female,1,1,1,PP 9549,16.7,G6,S
-1010,1,"Beattie, Mr. Thomson",male,36,0,0,13050,75.2417,C6,C
-1011,2,"Chapman, Mrs. John Henry (Sara Elizabeth Lawry)",female,29,1,0,SC/AH 29037,26,,S
-1012,2,"Watt, Miss. Bertha J",female,12,0,0,C.A. 33595,15.75,,S
-1013,3,"Kiernan, Mr. John",male,,1,0,367227,7.75,,Q
-1014,1,"Schabert, Mrs. Paul (Emma Mock)",female,35,1,0,13236,57.75,C28,C
-1015,3,"Carver, Mr. Alfred John",male,28,0,0,392095,7.25,,S
-1016,3,"Kennedy, Mr. John",male,,0,0,368783,7.75,,Q
-1017,3,"Cribb, Miss. Laura Alice",female,17,0,1,371362,16.1,,S
-1018,3,"Brobeck, Mr. Karl Rudolf",male,22,0,0,350045,7.7958,,S
-1019,3,"McCoy, Miss. Alicia",female,,2,0,367226,23.25,,Q
-1020,2,"Bowenur, Mr. Solomon",male,42,0,0,211535,13,,S
-1021,3,"Petersen, Mr. Marius",male,24,0,0,342441,8.05,,S
-1022,3,"Spinner, Mr. Henry John",male,32,0,0,STON/OQ. 369943,8.05,,S
-1023,1,"Gracie, Col. Archibald IV",male,53,0,0,113780,28.5,C51,C
-1024,3,"Lefebre, Mrs. Frank (Frances)",female,,0,4,4133,25.4667,,S
-1025,3,"Thomas, Mr. Charles P",male,,1,0,2621,6.4375,,C
-1026,3,"Dintcheff, Mr. Valtcho",male,43,0,0,349226,7.8958,,S
-1027,3,"Carlsson, Mr. Carl Robert",male,24,0,0,350409,7.8542,,S
-1028,3,"Zakarian, Mr. Mapriededer",male,26.5,0,0,2656,7.225,,C
-1029,2,"Schmidt, Mr. August",male,26,0,0,248659,13,,S
-1030,3,"Drapkin, Miss. Jennie",female,23,0,0,SOTON/OQ 392083,8.05,,S
-1031,3,"Goodwin, Mr. Charles Frederick",male,40,1,6,CA 2144,46.9,,S
-1032,3,"Goodwin, Miss. Jessie Allis",female,10,5,2,CA 2144,46.9,,S
-1033,1,"Daniels, Miss. Sarah",female,33,0,0,113781,151.55,,S
-1034,1,"Ryerson, Mr. Arthur Larned",male,61,1,3,PC 17608,262.375,B57 B59 B63 B66,C
-1035,2,"Beauchamp, Mr. Henry James",male,28,0,0,244358,26,,S
-1036,1,"Lindeberg-Lind, Mr. Erik Gustaf (Mr Edward Lingrey"")""",male,42,0,0,17475,26.55,,S
-1037,3,"Vander Planke, Mr. Julius",male,31,3,0,345763,18,,S
-1038,1,"Hilliard, Mr. Herbert Henry",male,,0,0,17463,51.8625,E46,S
-1039,3,"Davies, Mr. Evan",male,22,0,0,SC/A4 23568,8.05,,S
-1040,1,"Crafton, Mr. John Bertram",male,,0,0,113791,26.55,,S
-1041,2,"Lahtinen, Rev. William",male,30,1,1,250651,26,,S
-1042,1,"Earnshaw, Mrs. Boulton (Olive Potter)",female,23,0,1,11767,83.1583,C54,C
-1043,3,"Matinoff, Mr. Nicola",male,,0,0,349255,7.8958,,C
-1044,3,"Storey, Mr. Thomas",male,60.5,0,0,3701,,,S
-1045,3,"Klasen, Mrs. (Hulda Kristina Eugenia Lofqvist)",female,36,0,2,350405,12.1833,,S
-1046,3,"Asplund, Master. Filip Oscar",male,13,4,2,347077,31.3875,,S
-1047,3,"Duquemin, Mr. Joseph",male,24,0,0,S.O./P.P. 752,7.55,,S
-1048,1,"Bird, Miss. Ellen",female,29,0,0,PC 17483,221.7792,C97,S
-1049,3,"Lundin, Miss. Olga Elida",female,23,0,0,347469,7.8542,,S
-1050,1,"Borebank, Mr. John James",male,42,0,0,110489,26.55,D22,S
-1051,3,"Peacock, Mrs. Benjamin (Edith Nile)",female,26,0,2,SOTON/O.Q. 3101315,13.775,,S
-1052,3,"Smyth, Miss. Julia",female,,0,0,335432,7.7333,,Q
-1053,3,"Touma, Master. Georges Youssef",male,7,1,1,2650,15.2458,,C
-1054,2,"Wright, Miss. Marion",female,26,0,0,220844,13.5,,S
-1055,3,"Pearce, Mr. Ernest",male,,0,0,343271,7,,S
-1056,2,"Peruschitz, Rev. Joseph Maria",male,41,0,0,237393,13,,S
-1057,3,"Kink-Heilmann, Mrs. Anton (Luise Heilmann)",female,26,1,1,315153,22.025,,S
-1058,1,"Brandeis, Mr. Emil",male,48,0,0,PC 17591,50.4958,B10,C
-1059,3,"Ford, Mr. Edward Watson",male,18,2,2,W./C. 6608,34.375,,S
-1060,1,"Cassebeer, Mrs. Henry Arthur Jr (Eleanor Genevieve Fosdick)",female,,0,0,17770,27.7208,,C
-1061,3,"Hellstrom, Miss. Hilda Maria",female,22,0,0,7548,8.9625,,S
-1062,3,"Lithman, Mr. Simon",male,,0,0,S.O./P.P. 251,7.55,,S
-1063,3,"Zakarian, Mr. Ortin",male,27,0,0,2670,7.225,,C
-1064,3,"Dyker, Mr. Adolf Fredrik",male,23,1,0,347072,13.9,,S
-1065,3,"Torfa, Mr. Assad",male,,0,0,2673,7.2292,,C
-1066,3,"Asplund, Mr. Carl Oscar Vilhelm Gustafsson",male,40,1,5,347077,31.3875,,S
-1067,2,"Brown, Miss. Edith Eileen",female,15,0,2,29750,39,,S
-1068,2,"Sincock, Miss. Maude",female,20,0,0,C.A. 33112,36.75,,S
-1069,1,"Stengel, Mr. Charles Emil Henry",male,54,1,0,11778,55.4417,C116,C
-1070,2,"Becker, Mrs. Allen Oliver (Nellie E Baumgardner)",female,36,0,3,230136,39,F4,S
-1071,1,"Compton, Mrs. Alexander Taylor (Mary Eliza Ingersoll)",female,64,0,2,PC 17756,83.1583,E45,C
-1072,2,"McCrie, Mr. James Matthew",male,30,0,0,233478,13,,S
-1073,1,"Compton, Mr. Alexander Taylor Jr",male,37,1,1,PC 17756,83.1583,E52,C
-1074,1,"Marvin, Mrs. Daniel Warner (Mary Graham Carmichael Farquarson)",female,18,1,0,113773,53.1,D30,S
-1075,3,"Lane, Mr. Patrick",male,,0,0,7935,7.75,,Q
-1076,1,"Douglas, Mrs. Frederick Charles (Mary Helene Baxter)",female,27,1,1,PC 17558,247.5208,B58 B60,C
-1077,2,"Maybery, Mr. Frank Hubert",male,40,0,0,239059,16,,S
-1078,2,"Phillips, Miss. Alice Frances Louisa",female,21,0,1,S.O./P.P. 2,21,,S
-1079,3,"Davies, Mr. Joseph",male,17,2,0,A/4 48873,8.05,,S
-1080,3,"Sage, Miss. Ada",female,,8,2,CA. 2343,69.55,,S
-1081,2,"Veal, Mr. James",male,40,0,0,28221,13,,S
-1082,2,"Angle, Mr. William A",male,34,1,0,226875,26,,S
-1083,1,"Salomon, Mr. Abraham L",male,,0,0,111163,26,,S
-1084,3,"van Billiard, Master. Walter John",male,11.5,1,1,A/5. 851,14.5,,S
-1085,2,"Lingane, Mr. John",male,61,0,0,235509,12.35,,Q
-1086,2,"Drew, Master. Marshall Brines",male,8,0,2,28220,32.5,,S
-1087,3,"Karlsson, Mr. Julius Konrad Eugen",male,33,0,0,347465,7.8542,,S
-1088,1,"Spedden, Master. Robert Douglas",male,6,0,2,16966,134.5,E34,C
-1089,3,"Nilsson, Miss. Berta Olivia",female,18,0,0,347066,7.775,,S
-1090,2,"Baimbrigge, Mr. Charles Robert",male,23,0,0,C.A. 31030,10.5,,S
-1091,3,"Rasmussen, Mrs. (Lena Jacobsen Solvang)",female,,0,0,65305,8.1125,,S
-1092,3,"Murphy, Miss. Nora",female,,0,0,36568,15.5,,Q
-1093,3,"Danbom, Master. Gilbert Sigvard Emanuel",male,0.33,0,2,347080,14.4,,S
-1094,1,"Astor, Col. John Jacob",male,47,1,0,PC 17757,227.525,C62 C64,C
-1095,2,"Quick, Miss. Winifred Vera",female,8,1,1,26360,26,,S
-1096,2,"Andrew, Mr. Frank Thomas",male,25,0,0,C.A. 34050,10.5,,S
-1097,1,"Omont, Mr. Alfred Fernand",male,,0,0,F.C. 12998,25.7417,,C
-1098,3,"McGowan, Miss. Katherine",female,35,0,0,9232,7.75,,Q
-1099,2,"Collett, Mr. Sidney C Stuart",male,24,0,0,28034,10.5,,S
-1100,1,"Rosenbaum, Miss. Edith Louise",female,33,0,0,PC 17613,27.7208,A11,C
-1101,3,"Delalic, Mr. Redjo",male,25,0,0,349250,7.8958,,S
-1102,3,"Andersen, Mr. Albert Karvin",male,32,0,0,C 4001,22.525,,S
-1103,3,"Finoli, Mr. Luigi",male,,0,0,SOTON/O.Q. 3101308,7.05,,S
-1104,2,"Deacon, Mr. Percy William",male,17,0,0,S.O.C. 14879,73.5,,S
-1105,2,"Howard, Mrs. Benjamin (Ellen Truelove Arman)",female,60,1,0,24065,26,,S
-1106,3,"Andersson, Miss. Ida Augusta Margareta",female,38,4,2,347091,7.775,,S
-1107,1,"Head, Mr. Christopher",male,42,0,0,113038,42.5,B11,S
-1108,3,"Mahon, Miss. Bridget Delia",female,,0,0,330924,7.8792,,Q
-1109,1,"Wick, Mr. George Dennick",male,57,1,1,36928,164.8667,,S
-1110,1,"Widener, Mrs. George Dunton (Eleanor Elkins)",female,50,1,1,113503,211.5,C80,C
-1111,3,"Thomson, Mr. Alexander Morrison",male,,0,0,32302,8.05,,S
-1112,2,"Duran y More, Miss. Florentina",female,30,1,0,SC/PARIS 2148,13.8583,,C
-1113,3,"Reynolds, Mr. Harold J",male,21,0,0,342684,8.05,,S
-1114,2,"Cook, Mrs. (Selena Rogers)",female,22,0,0,W./C. 14266,10.5,F33,S
-1115,3,"Karlsson, Mr. Einar Gervasius",male,21,0,0,350053,7.7958,,S
-1116,1,"Candee, Mrs. Edward (Helen Churchill Hungerford)",female,53,0,0,PC 17606,27.4458,,C
-1117,3,"Moubarek, Mrs. George (Omine Amenia"" Alexander)""",female,,0,2,2661,15.2458,,C
-1118,3,"Asplund, Mr. Johan Charles",male,23,0,0,350054,7.7958,,S
-1119,3,"McNeill, Miss. Bridget",female,,0,0,370368,7.75,,Q
-1120,3,"Everett, Mr. Thomas James",male,40.5,0,0,C.A. 6212,15.1,,S
-1121,2,"Hocking, Mr. Samuel James Metcalfe",male,36,0,0,242963,13,,S
-1122,2,"Sweet, Mr. George Frederick",male,14,0,0,220845,65,,S
-1123,1,"Willard, Miss. Constance",female,21,0,0,113795,26.55,,S
-1124,3,"Wiklund, Mr. Karl Johan",male,21,1,0,3101266,6.4958,,S
-1125,3,"Linehan, Mr. Michael",male,,0,0,330971,7.8792,,Q
-1126,1,"Cumings, Mr. John Bradley",male,39,1,0,PC 17599,71.2833,C85,C
-1127,3,"Vendel, Mr. Olof Edvin",male,20,0,0,350416,7.8542,,S
-1128,1,"Warren, Mr. Frank Manley",male,64,1,0,110813,75.25,D37,C
-1129,3,"Baccos, Mr. Raffull",male,20,0,0,2679,7.225,,C
-1130,2,"Hiltunen, Miss. Marta",female,18,1,1,250650,13,,S
-1131,1,"Douglas, Mrs. Walter Donald (Mahala Dutton)",female,48,1,0,PC 17761,106.425,C86,C
-1132,1,"Lindstrom, Mrs. Carl Johan (Sigrid Posse)",female,55,0,0,112377,27.7208,,C
-1133,2,"Christy, Mrs. (Alice Frances)",female,45,0,2,237789,30,,S
-1134,1,"Spedden, Mr. Frederic Oakley",male,45,1,1,16966,134.5,E34,C
-1135,3,"Hyman, Mr. Abraham",male,,0,0,3470,7.8875,,S
-1136,3,"Johnston, Master. William Arthur Willie""""",male,,1,2,W./C. 6607,23.45,,S
-1137,1,"Kenyon, Mr. Frederick R",male,41,1,0,17464,51.8625,D21,S
-1138,2,"Karnes, Mrs. J Frank (Claire Bennett)",female,22,0,0,F.C.C. 13534,21,,S
-1139,2,"Drew, Mr. James Vivian",male,42,1,1,28220,32.5,,S
-1140,2,"Hold, Mrs. Stephen (Annie Margaret Hill)",female,29,1,0,26707,26,,S
-1141,3,"Khalil, Mrs. Betros (Zahie Maria"" Elias)""",female,,1,0,2660,14.4542,,C
-1142,2,"West, Miss. Barbara J",female,0.92,1,2,C.A. 34651,27.75,,S
-1143,3,"Abrahamsson, Mr. Abraham August Johannes",male,20,0,0,SOTON/O2 3101284,7.925,,S
-1144,1,"Clark, Mr. Walter Miller",male,27,1,0,13508,136.7792,C89,C
-1145,3,"Salander, Mr. Karl Johan",male,24,0,0,7266,9.325,,S
-1146,3,"Wenzel, Mr. Linhart",male,32.5,0,0,345775,9.5,,S
-1147,3,"MacKay, Mr. George William",male,,0,0,C.A. 42795,7.55,,S
-1148,3,"Mahon, Mr. John",male,,0,0,AQ/4 3130,7.75,,Q
-1149,3,"Niklasson, Mr. Samuel",male,28,0,0,363611,8.05,,S
-1150,2,"Bentham, Miss. Lilian W",female,19,0,0,28404,13,,S
-1151,3,"Midtsjo, Mr. Karl Albert",male,21,0,0,345501,7.775,,S
-1152,3,"de Messemaeker, Mr. Guillaume Joseph",male,36.5,1,0,345572,17.4,,S
-1153,3,"Nilsson, Mr. August Ferdinand",male,21,0,0,350410,7.8542,,S
-1154,2,"Wells, Mrs. Arthur Henry (Addie"" Dart Trevaskis)""",female,29,0,2,29103,23,,S
-1155,3,"Klasen, Miss. Gertrud Emilia",female,1,1,1,350405,12.1833,,S
-1156,2,"Portaluppi, Mr. Emilio Ilario Giuseppe",male,30,0,0,C.A. 34644,12.7375,,C
-1157,3,"Lyntakoff, Mr. Stanko",male,,0,0,349235,7.8958,,S
-1158,1,"Chisholm, Mr. Roderick Robert Crispin",male,,0,0,112051,0,,S
-1159,3,"Warren, Mr. Charles William",male,,0,0,C.A. 49867,7.55,,S
-1160,3,"Howard, Miss. May Elizabeth",female,,0,0,A. 2. 39186,8.05,,S
-1161,3,"Pokrnic, Mr. Mate",male,17,0,0,315095,8.6625,,S
-1162,1,"McCaffry, Mr. Thomas Francis",male,46,0,0,13050,75.2417,C6,C
-1163,3,"Fox, Mr. Patrick",male,,0,0,368573,7.75,,Q
-1164,1,"Clark, Mrs. Walter Miller (Virginia McDowell)",female,26,1,0,13508,136.7792,C89,C
-1165,3,"Lennon, Miss. Mary",female,,1,0,370371,15.5,,Q
-1166,3,"Saade, Mr. Jean Nassr",male,,0,0,2676,7.225,,C
-1167,2,"Bryhl, Miss. Dagmar Jenny Ingeborg ",female,20,1,0,236853,26,,S
-1168,2,"Parker, Mr. Clifford Richard",male,28,0,0,SC 14888,10.5,,S
-1169,2,"Faunthorpe, Mr. Harry",male,40,1,0,2926,26,,S
-1170,2,"Ware, Mr. John James",male,30,1,0,CA 31352,21,,S
-1171,2,"Oxenham, Mr. Percy Thomas",male,22,0,0,W./C. 14260,10.5,,S
-1172,3,"Oreskovic, Miss. Jelka",female,23,0,0,315085,8.6625,,S
-1173,3,"Peacock, Master. Alfred Edward",male,0.75,1,1,SOTON/O.Q. 3101315,13.775,,S
-1174,3,"Fleming, Miss. Honora",female,,0,0,364859,7.75,,Q
-1175,3,"Touma, Miss. Maria Youssef",female,9,1,1,2650,15.2458,,C
-1176,3,"Rosblom, Miss. Salli Helena",female,2,1,1,370129,20.2125,,S
-1177,3,"Dennis, Mr. William",male,36,0,0,A/5 21175,7.25,,S
-1178,3,"Franklin, Mr. Charles (Charles Fardon)",male,,0,0,SOTON/O.Q. 3101314,7.25,,S
-1179,1,"Snyder, Mr. John Pillsbury",male,24,1,0,21228,82.2667,B45,S
-1180,3,"Mardirosian, Mr. Sarkis",male,,0,0,2655,7.2292,F E46,C
-1181,3,"Ford, Mr. Arthur",male,,0,0,A/5 1478,8.05,,S
-1182,1,"Rheims, Mr. George Alexander Lucien",male,,0,0,PC 17607,39.6,,S
-1183,3,"Daly, Miss. Margaret Marcella Maggie""""",female,30,0,0,382650,6.95,,Q
-1184,3,"Nasr, Mr. Mustafa",male,,0,0,2652,7.2292,,C
-1185,1,"Dodge, Dr. Washington",male,53,1,1,33638,81.8583,A34,S
-1186,3,"Wittevrongel, Mr. Camille",male,36,0,0,345771,9.5,,S
-1187,3,"Angheloff, Mr. Minko",male,26,0,0,349202,7.8958,,S
-1188,2,"Laroche, Miss. Louise",female,1,1,2,SC/Paris 2123,41.5792,,C
-1189,3,"Samaan, Mr. Hanna",male,,2,0,2662,21.6792,,C
-1190,1,"Loring, Mr. Joseph Holland",male,30,0,0,113801,45.5,,S
-1191,3,"Johansson, Mr. Nils",male,29,0,0,347467,7.8542,,S
-1192,3,"Olsson, Mr. Oscar Wilhelm",male,32,0,0,347079,7.775,,S
-1193,2,"Malachard, Mr. Noel",male,,0,0,237735,15.0458,D,C
-1194,2,"Phillips, Mr. Escott Robert",male,43,0,1,S.O./P.P. 2,21,,S
-1195,3,"Pokrnic, Mr. Tome",male,24,0,0,315092,8.6625,,S
-1196,3,"McCarthy, Miss. Catherine Katie""""",female,,0,0,383123,7.75,,Q
-1197,1,"Crosby, Mrs. Edward Gifford (Catherine Elizabeth Halstead)",female,64,1,1,112901,26.55,B26,S
-1198,1,"Allison, Mr. Hudson Joshua Creighton",male,30,1,2,113781,151.55,C22 C26,S
-1199,3,"Aks, Master. Philip Frank",male,0.83,0,1,392091,9.35,,S
-1200,1,"Hays, Mr. Charles Melville",male,55,1,1,12749,93.5,B69,S
-1201,3,"Hansen, Mrs. Claus Peter (Jennie L Howard)",female,45,1,0,350026,14.1083,,S
-1202,3,"Cacic, Mr. Jego Grga",male,18,0,0,315091,8.6625,,S
-1203,3,"Vartanian, Mr. David",male,22,0,0,2658,7.225,,C
-1204,3,"Sadowitz, Mr. Harry",male,,0,0,LP 1588,7.575,,S
-1205,3,"Carr, Miss. Jeannie",female,37,0,0,368364,7.75,,Q
-1206,1,"White, Mrs. John Stuart (Ella Holmes)",female,55,0,0,PC 17760,135.6333,C32,C
-1207,3,"Hagardon, Miss. Kate",female,17,0,0,AQ/3. 30631,7.7333,,Q
-1208,1,"Spencer, Mr. William Augustus",male,57,1,0,PC 17569,146.5208,B78,C
-1209,2,"Rogers, Mr. Reginald Harry",male,19,0,0,28004,10.5,,S
-1210,3,"Jonsson, Mr. Nils Hilding",male,27,0,0,350408,7.8542,,S
-1211,2,"Jefferys, Mr. Ernest Wilfred",male,22,2,0,C.A. 31029,31.5,,S
-1212,3,"Andersson, Mr. Johan Samuel",male,26,0,0,347075,7.775,,S
-1213,3,"Krekorian, Mr. Neshan",male,25,0,0,2654,7.2292,F E57,C
-1214,2,"Nesson, Mr. Israel",male,26,0,0,244368,13,F2,S
-1215,1,"Rowe, Mr. Alfred G",male,33,0,0,113790,26.55,,S
-1216,1,"Kreuchen, Miss. Emilie",female,39,0,0,24160,211.3375,,S
-1217,3,"Assam, Mr. Ali",male,23,0,0,SOTON/O.Q. 3101309,7.05,,S
-1218,2,"Becker, Miss. Ruth Elizabeth",female,12,2,1,230136,39,F4,S
-1219,1,"Rosenshine, Mr. George (Mr George Thorne"")""",male,46,0,0,PC 17585,79.2,,C
-1220,2,"Clarke, Mr. Charles Valentine",male,29,1,0,2003,26,,S
-1221,2,"Enander, Mr. Ingvar",male,21,0,0,236854,13,,S
-1222,2,"Davies, Mrs. John Morgan (Elizabeth Agnes Mary White) ",female,48,0,2,C.A. 33112,36.75,,S
-1223,1,"Dulles, Mr. William Crothers",male,39,0,0,PC 17580,29.7,A18,C
-1224,3,"Thomas, Mr. Tannous",male,,0,0,2684,7.225,,C
-1225,3,"Nakid, Mrs. Said (Waika Mary"" Mowad)""",female,19,1,1,2653,15.7417,,C
-1226,3,"Cor, Mr. Ivan",male,27,0,0,349229,7.8958,,S
-1227,1,"Maguire, Mr. John Edward",male,30,0,0,110469,26,C106,S
-1228,2,"de Brito, Mr. Jose Joaquim",male,32,0,0,244360,13,,S
-1229,3,"Elias, Mr. Joseph",male,39,0,2,2675,7.2292,,C
-1230,2,"Denbury, Mr. Herbert",male,25,0,0,C.A. 31029,31.5,,S
-1231,3,"Betros, Master. Seman",male,,0,0,2622,7.2292,,C
-1232,2,"Fillbrook, Mr. Joseph Charles",male,18,0,0,C.A. 15185,10.5,,S
-1233,3,"Lundstrom, Mr. Thure Edvin",male,32,0,0,350403,7.5792,,S
-1234,3,"Sage, Mr. John George",male,,1,9,CA. 2343,69.55,,S
-1235,1,"Cardeza, Mrs. James Warburton Martinez (Charlotte Wardle Drake)",female,58,0,1,PC 17755,512.3292,B51 B53 B55,C
-1236,3,"van Billiard, Master. James William",male,,1,1,A/5. 851,14.5,,S
-1237,3,"Abelseth, Miss. Karen Marie",female,16,0,0,348125,7.65,,S
-1238,2,"Botsford, Mr. William Hull",male,26,0,0,237670,13,,S
-1239,3,"Whabee, Mrs. George Joseph (Shawneene Abi-Saab)",female,38,0,0,2688,7.2292,,C
-1240,2,"Giles, Mr. Ralph",male,24,0,0,248726,13.5,,S
-1241,2,"Walcroft, Miss. Nellie",female,31,0,0,F.C.C. 13528,21,,S
-1242,1,"Greenfield, Mrs. Leo David (Blanche Strouse)",female,45,0,1,PC 17759,63.3583,D10 D12,C
-1243,2,"Stokes, Mr. Philip Joseph",male,25,0,0,F.C.C. 13540,10.5,,S
-1244,2,"Dibden, Mr. William",male,18,0,0,S.O.C. 14879,73.5,,S
-1245,2,"Herman, Mr. Samuel",male,49,1,2,220845,65,,S
-1246,3,"Dean, Miss. Elizabeth Gladys Millvina""""",female,0.17,1,2,C.A. 2315,20.575,,S
-1247,1,"Julian, Mr. Henry Forbes",male,50,0,0,113044,26,E60,S
-1248,1,"Brown, Mrs. John Murray (Caroline Lane Lamson)",female,59,2,0,11769,51.4792,C101,S
-1249,3,"Lockyer, Mr. Edward",male,,0,0,1222,7.8792,,S
-1250,3,"O'Keefe, Mr. Patrick",male,,0,0,368402,7.75,,Q
-1251,3,"Lindell, Mrs. Edvard Bengtsson (Elin Gerda Persson)",female,30,1,0,349910,15.55,,S
-1252,3,"Sage, Master. William Henry",male,14.5,8,2,CA. 2343,69.55,,S
-1253,2,"Mallet, Mrs. Albert (Antoinette Magnin)",female,24,1,1,S.C./PARIS 2079,37.0042,,C
-1254,2,"Ware, Mrs. John James (Florence Louise Long)",female,31,0,0,CA 31352,21,,S
-1255,3,"Strilic, Mr. Ivan",male,27,0,0,315083,8.6625,,S
-1256,1,"Harder, Mrs. George Achilles (Dorothy Annan)",female,25,1,0,11765,55.4417,E50,C
-1257,3,"Sage, Mrs. John (Annie Bullen)",female,,1,9,CA. 2343,69.55,,S
-1258,3,"Caram, Mr. Joseph",male,,1,0,2689,14.4583,,C
-1259,3,"Riihivouri, Miss. Susanna Juhantytar Sanni""""",female,22,0,0,3101295,39.6875,,S
-1260,1,"Gibson, Mrs. Leonard (Pauline C Boeson)",female,45,0,1,112378,59.4,,C
-1261,2,"Pallas y Castello, Mr. Emilio",male,29,0,0,SC/PARIS 2147,13.8583,,C
-1262,2,"Giles, Mr. Edgar",male,21,1,0,28133,11.5,,S
-1263,1,"Wilson, Miss. Helen Alice",female,31,0,0,16966,134.5,E39 E41,C
-1264,1,"Ismay, Mr. Joseph Bruce",male,49,0,0,112058,0,B52 B54 B56,S
-1265,2,"Harbeck, Mr. William H",male,44,0,0,248746,13,,S
-1266,1,"Dodge, Mrs. Washington (Ruth Vidaver)",female,54,1,1,33638,81.8583,A34,S
-1267,1,"Bowen, Miss. Grace Scott",female,45,0,0,PC 17608,262.375,,C
-1268,3,"Kink, Miss. Maria",female,22,2,0,315152,8.6625,,S
-1269,2,"Cotterill, Mr. Henry Harry""""",male,21,0,0,29107,11.5,,S
-1270,1,"Hipkins, Mr. William Edward",male,55,0,0,680,50,C39,S
-1271,3,"Asplund, Master. Carl Edgar",male,5,4,2,347077,31.3875,,S
-1272,3,"O'Connor, Mr. Patrick",male,,0,0,366713,7.75,,Q
-1273,3,"Foley, Mr. Joseph",male,26,0,0,330910,7.8792,,Q
-1274,3,"Risien, Mrs. Samuel (Emma)",female,,0,0,364498,14.5,,S
-1275,3,"McNamee, Mrs. Neal (Eileen O'Leary)",female,19,1,0,376566,16.1,,S
-1276,2,"Wheeler, Mr. Edwin Frederick""""",male,,0,0,SC/PARIS 2159,12.875,,S
-1277,2,"Herman, Miss. Kate",female,24,1,2,220845,65,,S
-1278,3,"Aronsson, Mr. Ernst Axel Algot",male,24,0,0,349911,7.775,,S
-1279,2,"Ashby, Mr. John",male,57,0,0,244346,13,,S
-1280,3,"Canavan, Mr. Patrick",male,21,0,0,364858,7.75,,Q
-1281,3,"Palsson, Master. Paul Folke",male,6,3,1,349909,21.075,,S
-1282,1,"Payne, Mr. Vivian Ponsonby",male,23,0,0,12749,93.5,B24,S
-1283,1,"Lines, Mrs. Ernest H (Elizabeth Lindsey James)",female,51,0,1,PC 17592,39.4,D28,S
-1284,3,"Abbott, Master. Eugene Joseph",male,13,0,2,C.A. 2673,20.25,,S
-1285,2,"Gilbert, Mr. William",male,47,0,0,C.A. 30769,10.5,,S
-1286,3,"Kink-Heilmann, Mr. Anton",male,29,3,1,315153,22.025,,S
-1287,1,"Smith, Mrs. Lucien Philip (Mary Eloise Hughes)",female,18,1,0,13695,60,C31,S
-1288,3,"Colbert, Mr. Patrick",male,24,0,0,371109,7.25,,Q
-1289,1,"Frolicher-Stehli, Mrs. Maxmillian (Margaretha Emerentia Stehli)",female,48,1,1,13567,79.2,B41,C
-1290,3,"Larsson-Rondberg, Mr. Edvard A",male,22,0,0,347065,7.775,,S
-1291,3,"Conlon, Mr. Thomas Henry",male,31,0,0,21332,7.7333,,Q
-1292,1,"Bonnell, Miss. Caroline",female,30,0,0,36928,164.8667,C7,S
-1293,2,"Gale, Mr. Harry",male,38,1,0,28664,21,,S
-1294,1,"Gibson, Miss. Dorothy Winifred",female,22,0,1,112378,59.4,,C
-1295,1,"Carrau, Mr. Jose Pedro",male,17,0,0,113059,47.1,,S
-1296,1,"Frauenthal, Mr. Isaac Gerald",male,43,1,0,17765,27.7208,D40,C
-1297,2,"Nourney, Mr. Alfred (Baron von Drachstedt"")""",male,20,0,0,SC/PARIS 2166,13.8625,D38,C
-1298,2,"Ware, Mr. William Jeffery",male,23,1,0,28666,10.5,,S
-1299,1,"Widener, Mr. George Dunton",male,50,1,1,113503,211.5,C80,C
-1300,3,"Riordan, Miss. Johanna Hannah""""",female,,0,0,334915,7.7208,,Q
-1301,3,"Peacock, Miss. Treasteall",female,3,1,1,SOTON/O.Q. 3101315,13.775,,S
-1302,3,"Naughton, Miss. Hannah",female,,0,0,365237,7.75,,Q
-1303,1,"Minahan, Mrs. William Edward (Lillian E Thorpe)",female,37,1,0,19928,90,C78,Q
-1304,3,"Henriksson, Miss. Jenny Lovisa",female,28,0,0,347086,7.775,,S
-1305,3,"Spector, Mr. Woolf",male,,0,0,A.5. 3236,8.05,,S
-1306,1,"Oliva y Ocana, Dona. Fermina",female,39,0,0,PC 17758,108.9,C105,C
-1307,3,"Saether, Mr. Simon Sivertsen",male,38.5,0,0,SOTON/O.Q. 3101262,7.25,,S
-1308,3,"Ware, Mr. Frederick",male,,0,0,359309,8.05,,S
-1309,3,"Peter, Master. Michael J",male,,1,1,2668,22.3583,,C
diff --git a/alphapy/examples/Kaggle/input/train.csv b/alphapy/examples/Kaggle/input/train.csv
deleted file mode 100644
index 63b68ab..0000000
--- a/alphapy/examples/Kaggle/input/train.csv
+++ /dev/null
@@ -1,892 +0,0 @@
-PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
-1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
-2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
-3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S
-4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S
-5,0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S
-6,0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q
-7,0,1,"McCarthy, Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S
-8,0,3,"Palsson, Master. Gosta Leonard",male,2,3,1,349909,21.075,,S
-9,1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27,0,2,347742,11.1333,,S
-10,1,2,"Nasser, Mrs. Nicholas (Adele Achem)",female,14,1,0,237736,30.0708,,C
-11,1,3,"Sandstrom, Miss. Marguerite Rut",female,4,1,1,PP 9549,16.7,G6,S
-12,1,1,"Bonnell, Miss. Elizabeth",female,58,0,0,113783,26.55,C103,S
-13,0,3,"Saundercock, Mr. William Henry",male,20,0,0,A/5. 2151,8.05,,S
-14,0,3,"Andersson, Mr. Anders Johan",male,39,1,5,347082,31.275,,S
-15,0,3,"Vestrom, Miss. Hulda Amanda Adolfina",female,14,0,0,350406,7.8542,,S
-16,1,2,"Hewlett, Mrs. (Mary D Kingcome) ",female,55,0,0,248706,16,,S
-17,0,3,"Rice, Master. Eugene",male,2,4,1,382652,29.125,,Q
-18,1,2,"Williams, Mr. Charles Eugene",male,,0,0,244373,13,,S
-19,0,3,"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)",female,31,1,0,345763,18,,S
-20,1,3,"Masselmani, Mrs. Fatima",female,,0,0,2649,7.225,,C
-21,0,2,"Fynney, Mr. Joseph J",male,35,0,0,239865,26,,S
-22,1,2,"Beesley, Mr. Lawrence",male,34,0,0,248698,13,D56,S
-23,1,3,"McGowan, Miss. Anna ""Annie""",female,15,0,0,330923,8.0292,,Q
-24,1,1,"Sloper, Mr. William Thompson",male,28,0,0,113788,35.5,A6,S
-25,0,3,"Palsson, Miss. Torborg Danira",female,8,3,1,349909,21.075,,S
-26,1,3,"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)",female,38,1,5,347077,31.3875,,S
-27,0,3,"Emir, Mr. Farred Chehab",male,,0,0,2631,7.225,,C
-28,0,1,"Fortune, Mr. Charles Alexander",male,19,3,2,19950,263,C23 C25 C27,S
-29,1,3,"O'Dwyer, Miss. Ellen ""Nellie""",female,,0,0,330959,7.8792,,Q
-30,0,3,"Todoroff, Mr. Lalio",male,,0,0,349216,7.8958,,S
-31,0,1,"Uruchurtu, Don. Manuel E",male,40,0,0,PC 17601,27.7208,,C
-32,1,1,"Spencer, Mrs. William Augustus (Marie Eugenie)",female,,1,0,PC 17569,146.5208,B78,C
-33,1,3,"Glynn, Miss. Mary Agatha",female,,0,0,335677,7.75,,Q
-34,0,2,"Wheadon, Mr. Edward H",male,66,0,0,C.A. 24579,10.5,,S
-35,0,1,"Meyer, Mr. Edgar Joseph",male,28,1,0,PC 17604,82.1708,,C
-36,0,1,"Holverson, Mr. Alexander Oskar",male,42,1,0,113789,52,,S
-37,1,3,"Mamee, Mr. Hanna",male,,0,0,2677,7.2292,,C
-38,0,3,"Cann, Mr. Ernest Charles",male,21,0,0,A./5. 2152,8.05,,S
-39,0,3,"Vander Planke, Miss. Augusta Maria",female,18,2,0,345764,18,,S
-40,1,3,"Nicola-Yarred, Miss. Jamila",female,14,1,0,2651,11.2417,,C
-41,0,3,"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)",female,40,1,0,7546,9.475,,S
-42,0,2,"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)",female,27,1,0,11668,21,,S
-43,0,3,"Kraeff, Mr. Theodor",male,,0,0,349253,7.8958,,C
-44,1,2,"Laroche, Miss. Simonne Marie Anne Andree",female,3,1,2,SC/Paris 2123,41.5792,,C
-45,1,3,"Devaney, Miss. Margaret Delia",female,19,0,0,330958,7.8792,,Q
-46,0,3,"Rogers, Mr. William John",male,,0,0,S.C./A.4. 23567,8.05,,S
-47,0,3,"Lennon, Mr. Denis",male,,1,0,370371,15.5,,Q
-48,1,3,"O'Driscoll, Miss. Bridget",female,,0,0,14311,7.75,,Q
-49,0,3,"Samaan, Mr. Youssef",male,,2,0,2662,21.6792,,C
-50,0,3,"Arnold-Franchi, Mrs. Josef (Josefine Franchi)",female,18,1,0,349237,17.8,,S
-51,0,3,"Panula, Master. Juha Niilo",male,7,4,1,3101295,39.6875,,S
-52,0,3,"Nosworthy, Mr. Richard Cater",male,21,0,0,A/4. 39886,7.8,,S
-53,1,1,"Harper, Mrs. Henry Sleeper (Myna Haxtun)",female,49,1,0,PC 17572,76.7292,D33,C
-54,1,2,"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)",female,29,1,0,2926,26,,S
-55,0,1,"Ostby, Mr. Engelhart Cornelius",male,65,0,1,113509,61.9792,B30,C
-56,1,1,"Woolner, Mr. Hugh",male,,0,0,19947,35.5,C52,S
-57,1,2,"Rugg, Miss. Emily",female,21,0,0,C.A. 31026,10.5,,S
-58,0,3,"Novel, Mr. Mansouer",male,28.5,0,0,2697,7.2292,,C
-59,1,2,"West, Miss. Constance Mirium",female,5,1,2,C.A. 34651,27.75,,S
-60,0,3,"Goodwin, Master. William Frederick",male,11,5,2,CA 2144,46.9,,S
-61,0,3,"Sirayanian, Mr. Orsen",male,22,0,0,2669,7.2292,,C
-62,1,1,"Icard, Miss. Amelie",female,38,0,0,113572,80,B28,
-63,0,1,"Harris, Mr. Henry Birkhardt",male,45,1,0,36973,83.475,C83,S
-64,0,3,"Skoog, Master. Harald",male,4,3,2,347088,27.9,,S
-65,0,1,"Stewart, Mr. Albert A",male,,0,0,PC 17605,27.7208,,C
-66,1,3,"Moubarek, Master. Gerios",male,,1,1,2661,15.2458,,C
-67,1,2,"Nye, Mrs. (Elizabeth Ramell)",female,29,0,0,C.A. 29395,10.5,F33,S
-68,0,3,"Crease, Mr. Ernest James",male,19,0,0,S.P. 3464,8.1583,,S
-69,1,3,"Andersson, Miss. Erna Alexandra",female,17,4,2,3101281,7.925,,S
-70,0,3,"Kink, Mr. Vincenz",male,26,2,0,315151,8.6625,,S
-71,0,2,"Jenkin, Mr. Stephen Curnow",male,32,0,0,C.A. 33111,10.5,,S
-72,0,3,"Goodwin, Miss. Lillian Amy",female,16,5,2,CA 2144,46.9,,S
-73,0,2,"Hood, Mr. Ambrose Jr",male,21,0,0,S.O.C. 14879,73.5,,S
-74,0,3,"Chronopoulos, Mr. Apostolos",male,26,1,0,2680,14.4542,,C
-75,1,3,"Bing, Mr. Lee",male,32,0,0,1601,56.4958,,S
-76,0,3,"Moen, Mr. Sigurd Hansen",male,25,0,0,348123,7.65,F G73,S
-77,0,3,"Staneff, Mr. Ivan",male,,0,0,349208,7.8958,,S
-78,0,3,"Moutal, Mr. Rahamin Haim",male,,0,0,374746,8.05,,S
-79,1,2,"Caldwell, Master. Alden Gates",male,0.83,0,2,248738,29,,S
-80,1,3,"Dowdell, Miss. Elizabeth",female,30,0,0,364516,12.475,,S
-81,0,3,"Waelens, Mr. Achille",male,22,0,0,345767,9,,S
-82,1,3,"Sheerlinck, Mr. Jan Baptist",male,29,0,0,345779,9.5,,S
-83,1,3,"McDermott, Miss. Brigdet Delia",female,,0,0,330932,7.7875,,Q
-84,0,1,"Carrau, Mr. Francisco M",male,28,0,0,113059,47.1,,S
-85,1,2,"Ilett, Miss. Bertha",female,17,0,0,SO/C 14885,10.5,,S
-86,1,3,"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)",female,33,3,0,3101278,15.85,,S
-87,0,3,"Ford, Mr. William Neal",male,16,1,3,W./C. 6608,34.375,,S
-88,0,3,"Slocovski, Mr. Selman Francis",male,,0,0,SOTON/OQ 392086,8.05,,S
-89,1,1,"Fortune, Miss. Mabel Helen",female,23,3,2,19950,263,C23 C25 C27,S
-90,0,3,"Celotti, Mr. Francesco",male,24,0,0,343275,8.05,,S
-91,0,3,"Christmann, Mr. Emil",male,29,0,0,343276,8.05,,S
-92,0,3,"Andreasson, Mr. Paul Edvin",male,20,0,0,347466,7.8542,,S
-93,0,1,"Chaffee, Mr. Herbert Fuller",male,46,1,0,W.E.P. 5734,61.175,E31,S
-94,0,3,"Dean, Mr. Bertram Frank",male,26,1,2,C.A. 2315,20.575,,S
-95,0,3,"Coxon, Mr. Daniel",male,59,0,0,364500,7.25,,S
-96,0,3,"Shorney, Mr. Charles Joseph",male,,0,0,374910,8.05,,S
-97,0,1,"Goldschmidt, Mr. George B",male,71,0,0,PC 17754,34.6542,A5,C
-98,1,1,"Greenfield, Mr. William Bertram",male,23,0,1,PC 17759,63.3583,D10 D12,C
-99,1,2,"Doling, Mrs. John T (Ada Julia Bone)",female,34,0,1,231919,23,,S
-100,0,2,"Kantor, Mr. Sinai",male,34,1,0,244367,26,,S
-101,0,3,"Petranec, Miss. Matilda",female,28,0,0,349245,7.8958,,S
-102,0,3,"Petroff, Mr. Pastcho (""Pentcho"")",male,,0,0,349215,7.8958,,S
-103,0,1,"White, Mr. Richard Frasar",male,21,0,1,35281,77.2875,D26,S
-104,0,3,"Johansson, Mr. Gustaf Joel",male,33,0,0,7540,8.6542,,S
-105,0,3,"Gustafsson, Mr. Anders Vilhelm",male,37,2,0,3101276,7.925,,S
-106,0,3,"Mionoff, Mr. Stoytcho",male,28,0,0,349207,7.8958,,S
-107,1,3,"Salkjelsvik, Miss. Anna Kristine",female,21,0,0,343120,7.65,,S
-108,1,3,"Moss, Mr. Albert Johan",male,,0,0,312991,7.775,,S
-109,0,3,"Rekic, Mr. Tido",male,38,0,0,349249,7.8958,,S
-110,1,3,"Moran, Miss. Bertha",female,,1,0,371110,24.15,,Q
-111,0,1,"Porter, Mr. Walter Chamberlain",male,47,0,0,110465,52,C110,S
-112,0,3,"Zabour, Miss. Hileni",female,14.5,1,0,2665,14.4542,,C
-113,0,3,"Barton, Mr. David John",male,22,0,0,324669,8.05,,S
-114,0,3,"Jussila, Miss. Katriina",female,20,1,0,4136,9.825,,S
-115,0,3,"Attalah, Miss. Malake",female,17,0,0,2627,14.4583,,C
-116,0,3,"Pekoniemi, Mr. Edvard",male,21,0,0,STON/O 2. 3101294,7.925,,S
-117,0,3,"Connors, Mr. Patrick",male,70.5,0,0,370369,7.75,,Q
-118,0,2,"Turpin, Mr. William John Robert",male,29,1,0,11668,21,,S
-119,0,1,"Baxter, Mr. Quigg Edmond",male,24,0,1,PC 17558,247.5208,B58 B60,C
-120,0,3,"Andersson, Miss. Ellis Anna Maria",female,2,4,2,347082,31.275,,S
-121,0,2,"Hickman, Mr. Stanley George",male,21,2,0,S.O.C. 14879,73.5,,S
-122,0,3,"Moore, Mr. Leonard Charles",male,,0,0,A4. 54510,8.05,,S
-123,0,2,"Nasser, Mr. Nicholas",male,32.5,1,0,237736,30.0708,,C
-124,1,2,"Webber, Miss. Susan",female,32.5,0,0,27267,13,E101,S
-125,0,1,"White, Mr. Percival Wayland",male,54,0,1,35281,77.2875,D26,S
-126,1,3,"Nicola-Yarred, Master. Elias",male,12,1,0,2651,11.2417,,C
-127,0,3,"McMahon, Mr. Martin",male,,0,0,370372,7.75,,Q
-128,1,3,"Madsen, Mr. Fridtjof Arne",male,24,0,0,C 17369,7.1417,,S
-129,1,3,"Peter, Miss. Anna",female,,1,1,2668,22.3583,F E69,C
-130,0,3,"Ekstrom, Mr. Johan",male,45,0,0,347061,6.975,,S
-131,0,3,"Drazenoic, Mr. Jozef",male,33,0,0,349241,7.8958,,C
-132,0,3,"Coelho, Mr. Domingos Fernandeo",male,20,0,0,SOTON/O.Q. 3101307,7.05,,S
-133,0,3,"Robins, Mrs. Alexander A (Grace Charity Laury)",female,47,1,0,A/5. 3337,14.5,,S
-134,1,2,"Weisz, Mrs. Leopold (Mathilde Francoise Pede)",female,29,1,0,228414,26,,S
-135,0,2,"Sobey, Mr. Samuel James Hayden",male,25,0,0,C.A. 29178,13,,S
-136,0,2,"Richard, Mr. Emile",male,23,0,0,SC/PARIS 2133,15.0458,,C
-137,1,1,"Newsom, Miss. Helen Monypeny",female,19,0,2,11752,26.2833,D47,S
-138,0,1,"Futrelle, Mr. Jacques Heath",male,37,1,0,113803,53.1,C123,S
-139,0,3,"Osen, Mr. Olaf Elon",male,16,0,0,7534,9.2167,,S
-140,0,1,"Giglio, Mr. Victor",male,24,0,0,PC 17593,79.2,B86,C
-141,0,3,"Boulos, Mrs. Joseph (Sultana)",female,,0,2,2678,15.2458,,C
-142,1,3,"Nysten, Miss. Anna Sofia",female,22,0,0,347081,7.75,,S
-143,1,3,"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)",female,24,1,0,STON/O2. 3101279,15.85,,S
-144,0,3,"Burke, Mr. Jeremiah",male,19,0,0,365222,6.75,,Q
-145,0,2,"Andrew, Mr. Edgardo Samuel",male,18,0,0,231945,11.5,,S
-146,0,2,"Nicholls, Mr. Joseph Charles",male,19,1,1,C.A. 33112,36.75,,S
-147,1,3,"Andersson, Mr. August Edvard (""Wennerstrom"")",male,27,0,0,350043,7.7958,,S
-148,0,3,"Ford, Miss. Robina Maggie ""Ruby""",female,9,2,2,W./C. 6608,34.375,,S
-149,0,2,"Navratil, Mr. Michel (""Louis M Hoffman"")",male,36.5,0,2,230080,26,F2,S
-150,0,2,"Byles, Rev. Thomas Roussel Davids",male,42,0,0,244310,13,,S
-151,0,2,"Bateman, Rev. Robert James",male,51,0,0,S.O.P. 1166,12.525,,S
-152,1,1,"Pears, Mrs. Thomas (Edith Wearne)",female,22,1,0,113776,66.6,C2,S
-153,0,3,"Meo, Mr. Alfonzo",male,55.5,0,0,A.5. 11206,8.05,,S
-154,0,3,"van Billiard, Mr. Austin Blyler",male,40.5,0,2,A/5. 851,14.5,,S
-155,0,3,"Olsen, Mr. Ole Martin",male,,0,0,Fa 265302,7.3125,,S
-156,0,1,"Williams, Mr. Charles Duane",male,51,0,1,PC 17597,61.3792,,C
-157,1,3,"Gilnagh, Miss. Katherine ""Katie""",female,16,0,0,35851,7.7333,,Q
-158,0,3,"Corn, Mr. Harry",male,30,0,0,SOTON/OQ 392090,8.05,,S
-159,0,3,"Smiljanic, Mr. Mile",male,,0,0,315037,8.6625,,S
-160,0,3,"Sage, Master. Thomas Henry",male,,8,2,CA. 2343,69.55,,S
-161,0,3,"Cribb, Mr. John Hatfield",male,44,0,1,371362,16.1,,S
-162,1,2,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)",female,40,0,0,C.A. 33595,15.75,,S
-163,0,3,"Bengtsson, Mr. John Viktor",male,26,0,0,347068,7.775,,S
-164,0,3,"Calic, Mr. Jovo",male,17,0,0,315093,8.6625,,S
-165,0,3,"Panula, Master. Eino Viljami",male,1,4,1,3101295,39.6875,,S
-166,1,3,"Goldsmith, Master. Frank John William ""Frankie""",male,9,0,2,363291,20.525,,S
-167,1,1,"Chibnall, Mrs. (Edith Martha Bowerman)",female,,0,1,113505,55,E33,S
-168,0,3,"Skoog, Mrs. William (Anna Bernhardina Karlsson)",female,45,1,4,347088,27.9,,S
-169,0,1,"Baumann, Mr. John D",male,,0,0,PC 17318,25.925,,S
-170,0,3,"Ling, Mr. Lee",male,28,0,0,1601,56.4958,,S
-171,0,1,"Van der hoef, Mr. Wyckoff",male,61,0,0,111240,33.5,B19,S
-172,0,3,"Rice, Master. Arthur",male,4,4,1,382652,29.125,,Q
-173,1,3,"Johnson, Miss. Eleanor Ileen",female,1,1,1,347742,11.1333,,S
-174,0,3,"Sivola, Mr. Antti Wilhelm",male,21,0,0,STON/O 2. 3101280,7.925,,S
-175,0,1,"Smith, Mr. James Clinch",male,56,0,0,17764,30.6958,A7,C
-176,0,3,"Klasen, Mr. Klas Albin",male,18,1,1,350404,7.8542,,S
-177,0,3,"Lefebre, Master. Henry Forbes",male,,3,1,4133,25.4667,,S
-178,0,1,"Isham, Miss. Ann Elizabeth",female,50,0,0,PC 17595,28.7125,C49,C
-179,0,2,"Hale, Mr. Reginald",male,30,0,0,250653,13,,S
-180,0,3,"Leonard, Mr. Lionel",male,36,0,0,LINE,0,,S
-181,0,3,"Sage, Miss. Constance Gladys",female,,8,2,CA. 2343,69.55,,S
-182,0,2,"Pernot, Mr. Rene",male,,0,0,SC/PARIS 2131,15.05,,C
-183,0,3,"Asplund, Master. Clarence Gustaf Hugo",male,9,4,2,347077,31.3875,,S
-184,1,2,"Becker, Master. Richard F",male,1,2,1,230136,39,F4,S
-185,1,3,"Kink-Heilmann, Miss. Luise Gretchen",female,4,0,2,315153,22.025,,S
-186,0,1,"Rood, Mr. Hugh Roscoe",male,,0,0,113767,50,A32,S
-187,1,3,"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)",female,,1,0,370365,15.5,,Q
-188,1,1,"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")",male,45,0,0,111428,26.55,,S
-189,0,3,"Bourke, Mr. John",male,40,1,1,364849,15.5,,Q
-190,0,3,"Turcin, Mr. Stjepan",male,36,0,0,349247,7.8958,,S
-191,1,2,"Pinsky, Mrs. (Rosa)",female,32,0,0,234604,13,,S
-192,0,2,"Carbines, Mr. William",male,19,0,0,28424,13,,S
-193,1,3,"Andersen-Jensen, Miss. Carla Christine Nielsine",female,19,1,0,350046,7.8542,,S
-194,1,2,"Navratil, Master. Michel M",male,3,1,1,230080,26,F2,S
-195,1,1,"Brown, Mrs. James Joseph (Margaret Tobin)",female,44,0,0,PC 17610,27.7208,B4,C
-196,1,1,"Lurette, Miss. Elise",female,58,0,0,PC 17569,146.5208,B80,C
-197,0,3,"Mernagh, Mr. Robert",male,,0,0,368703,7.75,,Q
-198,0,3,"Olsen, Mr. Karl Siegwart Andreas",male,42,0,1,4579,8.4042,,S
-199,1,3,"Madigan, Miss. Margaret ""Maggie""",female,,0,0,370370,7.75,,Q
-200,0,2,"Yrois, Miss. Henriette (""Mrs Harbeck"")",female,24,0,0,248747,13,,S
-201,0,3,"Vande Walle, Mr. Nestor Cyriel",male,28,0,0,345770,9.5,,S
-202,0,3,"Sage, Mr. Frederick",male,,8,2,CA. 2343,69.55,,S
-203,0,3,"Johanson, Mr. Jakob Alfred",male,34,0,0,3101264,6.4958,,S
-204,0,3,"Youseff, Mr. Gerious",male,45.5,0,0,2628,7.225,,C
-205,1,3,"Cohen, Mr. Gurshon ""Gus""",male,18,0,0,A/5 3540,8.05,,S
-206,0,3,"Strom, Miss. Telma Matilda",female,2,0,1,347054,10.4625,G6,S
-207,0,3,"Backstrom, Mr. Karl Alfred",male,32,1,0,3101278,15.85,,S
-208,1,3,"Albimona, Mr. Nassef Cassem",male,26,0,0,2699,18.7875,,C
-209,1,3,"Carr, Miss. Helen ""Ellen""",female,16,0,0,367231,7.75,,Q
-210,1,1,"Blank, Mr. Henry",male,40,0,0,112277,31,A31,C
-211,0,3,"Ali, Mr. Ahmed",male,24,0,0,SOTON/O.Q. 3101311,7.05,,S
-212,1,2,"Cameron, Miss. Clear Annie",female,35,0,0,F.C.C. 13528,21,,S
-213,0,3,"Perkin, Mr. John Henry",male,22,0,0,A/5 21174,7.25,,S
-214,0,2,"Givard, Mr. Hans Kristensen",male,30,0,0,250646,13,,S
-215,0,3,"Kiernan, Mr. Philip",male,,1,0,367229,7.75,,Q
-216,1,1,"Newell, Miss. Madeleine",female,31,1,0,35273,113.275,D36,C
-217,1,3,"Honkanen, Miss. Eliina",female,27,0,0,STON/O2. 3101283,7.925,,S
-218,0,2,"Jacobsohn, Mr. Sidney Samuel",male,42,1,0,243847,27,,S
-219,1,1,"Bazzani, Miss. Albina",female,32,0,0,11813,76.2917,D15,C
-220,0,2,"Harris, Mr. Walter",male,30,0,0,W/C 14208,10.5,,S
-221,1,3,"Sunderland, Mr. Victor Francis",male,16,0,0,SOTON/OQ 392089,8.05,,S
-222,0,2,"Bracken, Mr. James H",male,27,0,0,220367,13,,S
-223,0,3,"Green, Mr. George Henry",male,51,0,0,21440,8.05,,S
-224,0,3,"Nenkoff, Mr. Christo",male,,0,0,349234,7.8958,,S
-225,1,1,"Hoyt, Mr. Frederick Maxfield",male,38,1,0,19943,90,C93,S
-226,0,3,"Berglund, Mr. Karl Ivar Sven",male,22,0,0,PP 4348,9.35,,S
-227,1,2,"Mellors, Mr. William John",male,19,0,0,SW/PP 751,10.5,,S
-228,0,3,"Lovell, Mr. John Hall (""Henry"")",male,20.5,0,0,A/5 21173,7.25,,S
-229,0,2,"Fahlstrom, Mr. Arne Jonas",male,18,0,0,236171,13,,S
-230,0,3,"Lefebre, Miss. Mathilde",female,,3,1,4133,25.4667,,S
-231,1,1,"Harris, Mrs. Henry Birkhardt (Irene Wallach)",female,35,1,0,36973,83.475,C83,S
-232,0,3,"Larsson, Mr. Bengt Edvin",male,29,0,0,347067,7.775,,S
-233,0,2,"Sjostedt, Mr. Ernst Adolf",male,59,0,0,237442,13.5,,S
-234,1,3,"Asplund, Miss. Lillian Gertrud",female,5,4,2,347077,31.3875,,S
-235,0,2,"Leyson, Mr. Robert William Norman",male,24,0,0,C.A. 29566,10.5,,S
-236,0,3,"Harknett, Miss. Alice Phoebe",female,,0,0,W./C. 6609,7.55,,S
-237,0,2,"Hold, Mr. Stephen",male,44,1,0,26707,26,,S
-238,1,2,"Collyer, Miss. Marjorie ""Lottie""",female,8,0,2,C.A. 31921,26.25,,S
-239,0,2,"Pengelly, Mr. Frederick William",male,19,0,0,28665,10.5,,S
-240,0,2,"Hunt, Mr. George Henry",male,33,0,0,SCO/W 1585,12.275,,S
-241,0,3,"Zabour, Miss. Thamine",female,,1,0,2665,14.4542,,C
-242,1,3,"Murphy, Miss. Katherine ""Kate""",female,,1,0,367230,15.5,,Q
-243,0,2,"Coleridge, Mr. Reginald Charles",male,29,0,0,W./C. 14263,10.5,,S
-244,0,3,"Maenpaa, Mr. Matti Alexanteri",male,22,0,0,STON/O 2. 3101275,7.125,,S
-245,0,3,"Attalah, Mr. Sleiman",male,30,0,0,2694,7.225,,C
-246,0,1,"Minahan, Dr. William Edward",male,44,2,0,19928,90,C78,Q
-247,0,3,"Lindahl, Miss. Agda Thorilda Viktoria",female,25,0,0,347071,7.775,,S
-248,1,2,"Hamalainen, Mrs. William (Anna)",female,24,0,2,250649,14.5,,S
-249,1,1,"Beckwith, Mr. Richard Leonard",male,37,1,1,11751,52.5542,D35,S
-250,0,2,"Carter, Rev. Ernest Courtenay",male,54,1,0,244252,26,,S
-251,0,3,"Reed, Mr. James George",male,,0,0,362316,7.25,,S
-252,0,3,"Strom, Mrs. Wilhelm (Elna Matilda Persson)",female,29,1,1,347054,10.4625,G6,S
-253,0,1,"Stead, Mr. William Thomas",male,62,0,0,113514,26.55,C87,S
-254,0,3,"Lobb, Mr. William Arthur",male,30,1,0,A/5. 3336,16.1,,S
-255,0,3,"Rosblom, Mrs. Viktor (Helena Wilhelmina)",female,41,0,2,370129,20.2125,,S
-256,1,3,"Touma, Mrs. Darwis (Hanne Youssef Razi)",female,29,0,2,2650,15.2458,,C
-257,1,1,"Thorne, Mrs. Gertrude Maybelle",female,,0,0,PC 17585,79.2,,C
-258,1,1,"Cherry, Miss. Gladys",female,30,0,0,110152,86.5,B77,S
-259,1,1,"Ward, Miss. Anna",female,35,0,0,PC 17755,512.3292,,C
-260,1,2,"Parrish, Mrs. (Lutie Davis)",female,50,0,1,230433,26,,S
-261,0,3,"Smith, Mr. Thomas",male,,0,0,384461,7.75,,Q
-262,1,3,"Asplund, Master. Edvin Rojj Felix",male,3,4,2,347077,31.3875,,S
-263,0,1,"Taussig, Mr. Emil",male,52,1,1,110413,79.65,E67,S
-264,0,1,"Harrison, Mr. William",male,40,0,0,112059,0,B94,S
-265,0,3,"Henry, Miss. Delia",female,,0,0,382649,7.75,,Q
-266,0,2,"Reeves, Mr. David",male,36,0,0,C.A. 17248,10.5,,S
-267,0,3,"Panula, Mr. Ernesti Arvid",male,16,4,1,3101295,39.6875,,S
-268,1,3,"Persson, Mr. Ernst Ulrik",male,25,1,0,347083,7.775,,S
-269,1,1,"Graham, Mrs. William Thompson (Edith Junkins)",female,58,0,1,PC 17582,153.4625,C125,S
-270,1,1,"Bissette, Miss. Amelia",female,35,0,0,PC 17760,135.6333,C99,S
-271,0,1,"Cairns, Mr. Alexander",male,,0,0,113798,31,,S
-272,1,3,"Tornquist, Mr. William Henry",male,25,0,0,LINE,0,,S
-273,1,2,"Mellinger, Mrs. (Elizabeth Anne Maidment)",female,41,0,1,250644,19.5,,S
-274,0,1,"Natsch, Mr. Charles H",male,37,0,1,PC 17596,29.7,C118,C
-275,1,3,"Healy, Miss. Hanora ""Nora""",female,,0,0,370375,7.75,,Q
-276,1,1,"Andrews, Miss. Kornelia Theodosia",female,63,1,0,13502,77.9583,D7,S
-277,0,3,"Lindblom, Miss. Augusta Charlotta",female,45,0,0,347073,7.75,,S
-278,0,2,"Parkes, Mr. Francis ""Frank""",male,,0,0,239853,0,,S
-279,0,3,"Rice, Master. Eric",male,7,4,1,382652,29.125,,Q
-280,1,3,"Abbott, Mrs. Stanton (Rosa Hunt)",female,35,1,1,C.A. 2673,20.25,,S
-281,0,3,"Duane, Mr. Frank",male,65,0,0,336439,7.75,,Q
-282,0,3,"Olsson, Mr. Nils Johan Goransson",male,28,0,0,347464,7.8542,,S
-283,0,3,"de Pelsmaeker, Mr. Alfons",male,16,0,0,345778,9.5,,S
-284,1,3,"Dorking, Mr. Edward Arthur",male,19,0,0,A/5. 10482,8.05,,S
-285,0,1,"Smith, Mr. Richard William",male,,0,0,113056,26,A19,S
-286,0,3,"Stankovic, Mr. Ivan",male,33,0,0,349239,8.6625,,C
-287,1,3,"de Mulder, Mr. Theodore",male,30,0,0,345774,9.5,,S
-288,0,3,"Naidenoff, Mr. Penko",male,22,0,0,349206,7.8958,,S
-289,1,2,"Hosono, Mr. Masabumi",male,42,0,0,237798,13,,S
-290,1,3,"Connolly, Miss. Kate",female,22,0,0,370373,7.75,,Q
-291,1,1,"Barber, Miss. Ellen ""Nellie""",female,26,0,0,19877,78.85,,S
-292,1,1,"Bishop, Mrs. Dickinson H (Helen Walton)",female,19,1,0,11967,91.0792,B49,C
-293,0,2,"Levy, Mr. Rene Jacques",male,36,0,0,SC/Paris 2163,12.875,D,C
-294,0,3,"Haas, Miss. Aloisia",female,24,0,0,349236,8.85,,S
-295,0,3,"Mineff, Mr. Ivan",male,24,0,0,349233,7.8958,,S
-296,0,1,"Lewy, Mr. Ervin G",male,,0,0,PC 17612,27.7208,,C
-297,0,3,"Hanna, Mr. Mansour",male,23.5,0,0,2693,7.2292,,C
-298,0,1,"Allison, Miss. Helen Loraine",female,2,1,2,113781,151.55,C22 C26,S
-299,1,1,"Saalfeld, Mr. Adolphe",male,,0,0,19988,30.5,C106,S
-300,1,1,"Baxter, Mrs. James (Helene DeLaudeniere Chaput)",female,50,0,1,PC 17558,247.5208,B58 B60,C
-301,1,3,"Kelly, Miss. Anna Katherine ""Annie Kate""",female,,0,0,9234,7.75,,Q
-302,1,3,"McCoy, Mr. Bernard",male,,2,0,367226,23.25,,Q
-303,0,3,"Johnson, Mr. William Cahoone Jr",male,19,0,0,LINE,0,,S
-304,1,2,"Keane, Miss. Nora A",female,,0,0,226593,12.35,E101,Q
-305,0,3,"Williams, Mr. Howard Hugh ""Harry""",male,,0,0,A/5 2466,8.05,,S
-306,1,1,"Allison, Master. Hudson Trevor",male,0.92,1,2,113781,151.55,C22 C26,S
-307,1,1,"Fleming, Miss. Margaret",female,,0,0,17421,110.8833,,C
-308,1,1,"Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)",female,17,1,0,PC 17758,108.9,C65,C
-309,0,2,"Abelson, Mr. Samuel",male,30,1,0,P/PP 3381,24,,C
-310,1,1,"Francatelli, Miss. Laura Mabel",female,30,0,0,PC 17485,56.9292,E36,C
-311,1,1,"Hays, Miss. Margaret Bechstein",female,24,0,0,11767,83.1583,C54,C
-312,1,1,"Ryerson, Miss. Emily Borie",female,18,2,2,PC 17608,262.375,B57 B59 B63 B66,C
-313,0,2,"Lahtinen, Mrs. William (Anna Sylfven)",female,26,1,1,250651,26,,S
-314,0,3,"Hendekovic, Mr. Ignjac",male,28,0,0,349243,7.8958,,S
-315,0,2,"Hart, Mr. Benjamin",male,43,1,1,F.C.C. 13529,26.25,,S
-316,1,3,"Nilsson, Miss. Helmina Josefina",female,26,0,0,347470,7.8542,,S
-317,1,2,"Kantor, Mrs. Sinai (Miriam Sternin)",female,24,1,0,244367,26,,S
-318,0,2,"Moraweck, Dr. Ernest",male,54,0,0,29011,14,,S
-319,1,1,"Wick, Miss. Mary Natalie",female,31,0,2,36928,164.8667,C7,S
-320,1,1,"Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone)",female,40,1,1,16966,134.5,E34,C
-321,0,3,"Dennis, Mr. Samuel",male,22,0,0,A/5 21172,7.25,,S
-322,0,3,"Danoff, Mr. Yoto",male,27,0,0,349219,7.8958,,S
-323,1,2,"Slayter, Miss. Hilda Mary",female,30,0,0,234818,12.35,,Q
-324,1,2,"Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh)",female,22,1,1,248738,29,,S
-325,0,3,"Sage, Mr. George John Jr",male,,8,2,CA. 2343,69.55,,S
-326,1,1,"Young, Miss. Marie Grice",female,36,0,0,PC 17760,135.6333,C32,C
-327,0,3,"Nysveen, Mr. Johan Hansen",male,61,0,0,345364,6.2375,,S
-328,1,2,"Ball, Mrs. (Ada E Hall)",female,36,0,0,28551,13,D,S
-329,1,3,"Goldsmith, Mrs. Frank John (Emily Alice Brown)",female,31,1,1,363291,20.525,,S
-330,1,1,"Hippach, Miss. Jean Gertrude",female,16,0,1,111361,57.9792,B18,C
-331,1,3,"McCoy, Miss. Agnes",female,,2,0,367226,23.25,,Q
-332,0,1,"Partner, Mr. Austen",male,45.5,0,0,113043,28.5,C124,S
-333,0,1,"Graham, Mr. George Edward",male,38,0,1,PC 17582,153.4625,C91,S
-334,0,3,"Vander Planke, Mr. Leo Edmondus",male,16,2,0,345764,18,,S
-335,1,1,"Frauenthal, Mrs. Henry William (Clara Heinsheimer)",female,,1,0,PC 17611,133.65,,S
-336,0,3,"Denkoff, Mr. Mitto",male,,0,0,349225,7.8958,,S
-337,0,1,"Pears, Mr. Thomas Clinton",male,29,1,0,113776,66.6,C2,S
-338,1,1,"Burns, Miss. Elizabeth Margaret",female,41,0,0,16966,134.5,E40,C
-339,1,3,"Dahl, Mr. Karl Edwart",male,45,0,0,7598,8.05,,S
-340,0,1,"Blackwell, Mr. Stephen Weart",male,45,0,0,113784,35.5,T,S
-341,1,2,"Navratil, Master. Edmond Roger",male,2,1,1,230080,26,F2,S
-342,1,1,"Fortune, Miss. Alice Elizabeth",female,24,3,2,19950,263,C23 C25 C27,S
-343,0,2,"Collander, Mr. Erik Gustaf",male,28,0,0,248740,13,,S
-344,0,2,"Sedgwick, Mr. Charles Frederick Waddington",male,25,0,0,244361,13,,S
-345,0,2,"Fox, Mr. Stanley Hubert",male,36,0,0,229236,13,,S
-346,1,2,"Brown, Miss. Amelia ""Mildred""",female,24,0,0,248733,13,F33,S
-347,1,2,"Smith, Miss. Marion Elsie",female,40,0,0,31418,13,,S
-348,1,3,"Davison, Mrs. Thomas Henry (Mary E Finck)",female,,1,0,386525,16.1,,S
-349,1,3,"Coutts, Master. William Loch ""William""",male,3,1,1,C.A. 37671,15.9,,S
-350,0,3,"Dimic, Mr. Jovan",male,42,0,0,315088,8.6625,,S
-351,0,3,"Odahl, Mr. Nils Martin",male,23,0,0,7267,9.225,,S
-352,0,1,"Williams-Lambert, Mr. Fletcher Fellows",male,,0,0,113510,35,C128,S
-353,0,3,"Elias, Mr. Tannous",male,15,1,1,2695,7.2292,,C
-354,0,3,"Arnold-Franchi, Mr. Josef",male,25,1,0,349237,17.8,,S
-355,0,3,"Yousif, Mr. Wazli",male,,0,0,2647,7.225,,C
-356,0,3,"Vanden Steen, Mr. Leo Peter",male,28,0,0,345783,9.5,,S
-357,1,1,"Bowerman, Miss. Elsie Edith",female,22,0,1,113505,55,E33,S
-358,0,2,"Funk, Miss. Annie Clemmer",female,38,0,0,237671,13,,S
-359,1,3,"McGovern, Miss. Mary",female,,0,0,330931,7.8792,,Q
-360,1,3,"Mockler, Miss. Helen Mary ""Ellie""",female,,0,0,330980,7.8792,,Q
-361,0,3,"Skoog, Mr. Wilhelm",male,40,1,4,347088,27.9,,S
-362,0,2,"del Carlo, Mr. Sebastiano",male,29,1,0,SC/PARIS 2167,27.7208,,C
-363,0,3,"Barbara, Mrs. (Catherine David)",female,45,0,1,2691,14.4542,,C
-364,0,3,"Asim, Mr. Adola",male,35,0,0,SOTON/O.Q. 3101310,7.05,,S
-365,0,3,"O'Brien, Mr. Thomas",male,,1,0,370365,15.5,,Q
-366,0,3,"Adahl, Mr. Mauritz Nils Martin",male,30,0,0,C 7076,7.25,,S
-367,1,1,"Warren, Mrs. Frank Manley (Anna Sophia Atkinson)",female,60,1,0,110813,75.25,D37,C
-368,1,3,"Moussa, Mrs. (Mantoura Boulos)",female,,0,0,2626,7.2292,,C
-369,1,3,"Jermyn, Miss. Annie",female,,0,0,14313,7.75,,Q
-370,1,1,"Aubart, Mme. Leontine Pauline",female,24,0,0,PC 17477,69.3,B35,C
-371,1,1,"Harder, Mr. George Achilles",male,25,1,0,11765,55.4417,E50,C
-372,0,3,"Wiklund, Mr. Jakob Alfred",male,18,1,0,3101267,6.4958,,S
-373,0,3,"Beavan, Mr. William Thomas",male,19,0,0,323951,8.05,,S
-374,0,1,"Ringhini, Mr. Sante",male,22,0,0,PC 17760,135.6333,,C
-375,0,3,"Palsson, Miss. Stina Viola",female,3,3,1,349909,21.075,,S
-376,1,1,"Meyer, Mrs. Edgar Joseph (Leila Saks)",female,,1,0,PC 17604,82.1708,,C
-377,1,3,"Landergren, Miss. Aurora Adelia",female,22,0,0,C 7077,7.25,,S
-378,0,1,"Widener, Mr. Harry Elkins",male,27,0,2,113503,211.5,C82,C
-379,0,3,"Betros, Mr. Tannous",male,20,0,0,2648,4.0125,,C
-380,0,3,"Gustafsson, Mr. Karl Gideon",male,19,0,0,347069,7.775,,S
-381,1,1,"Bidois, Miss. Rosalie",female,42,0,0,PC 17757,227.525,,C
-382,1,3,"Nakid, Miss. Maria (""Mary"")",female,1,0,2,2653,15.7417,,C
-383,0,3,"Tikkanen, Mr. Juho",male,32,0,0,STON/O 2. 3101293,7.925,,S
-384,1,1,"Holverson, Mrs. Alexander Oskar (Mary Aline Towner)",female,35,1,0,113789,52,,S
-385,0,3,"Plotcharsky, Mr. Vasil",male,,0,0,349227,7.8958,,S
-386,0,2,"Davies, Mr. Charles Henry",male,18,0,0,S.O.C. 14879,73.5,,S
-387,0,3,"Goodwin, Master. Sidney Leonard",male,1,5,2,CA 2144,46.9,,S
-388,1,2,"Buss, Miss. Kate",female,36,0,0,27849,13,,S
-389,0,3,"Sadlier, Mr. Matthew",male,,0,0,367655,7.7292,,Q
-390,1,2,"Lehmann, Miss. Bertha",female,17,0,0,SC 1748,12,,C
-391,1,1,"Carter, Mr. William Ernest",male,36,1,2,113760,120,B96 B98,S
-392,1,3,"Jansson, Mr. Carl Olof",male,21,0,0,350034,7.7958,,S
-393,0,3,"Gustafsson, Mr. Johan Birger",male,28,2,0,3101277,7.925,,S
-394,1,1,"Newell, Miss. Marjorie",female,23,1,0,35273,113.275,D36,C
-395,1,3,"Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson)",female,24,0,2,PP 9549,16.7,G6,S
-396,0,3,"Johansson, Mr. Erik",male,22,0,0,350052,7.7958,,S
-397,0,3,"Olsson, Miss. Elina",female,31,0,0,350407,7.8542,,S
-398,0,2,"McKane, Mr. Peter David",male,46,0,0,28403,26,,S
-399,0,2,"Pain, Dr. Alfred",male,23,0,0,244278,10.5,,S
-400,1,2,"Trout, Mrs. William H (Jessie L)",female,28,0,0,240929,12.65,,S
-401,1,3,"Niskanen, Mr. Juha",male,39,0,0,STON/O 2. 3101289,7.925,,S
-402,0,3,"Adams, Mr. John",male,26,0,0,341826,8.05,,S
-403,0,3,"Jussila, Miss. Mari Aina",female,21,1,0,4137,9.825,,S
-404,0,3,"Hakkarainen, Mr. Pekka Pietari",male,28,1,0,STON/O2. 3101279,15.85,,S
-405,0,3,"Oreskovic, Miss. Marija",female,20,0,0,315096,8.6625,,S
-406,0,2,"Gale, Mr. Shadrach",male,34,1,0,28664,21,,S
-407,0,3,"Widegren, Mr. Carl/Charles Peter",male,51,0,0,347064,7.75,,S
-408,1,2,"Richards, Master. William Rowe",male,3,1,1,29106,18.75,,S
-409,0,3,"Birkeland, Mr. Hans Martin Monsen",male,21,0,0,312992,7.775,,S
-410,0,3,"Lefebre, Miss. Ida",female,,3,1,4133,25.4667,,S
-411,0,3,"Sdycoff, Mr. Todor",male,,0,0,349222,7.8958,,S
-412,0,3,"Hart, Mr. Henry",male,,0,0,394140,6.8583,,Q
-413,1,1,"Minahan, Miss. Daisy E",female,33,1,0,19928,90,C78,Q
-414,0,2,"Cunningham, Mr. Alfred Fleming",male,,0,0,239853,0,,S
-415,1,3,"Sundman, Mr. Johan Julian",male,44,0,0,STON/O 2. 3101269,7.925,,S
-416,0,3,"Meek, Mrs. Thomas (Annie Louise Rowley)",female,,0,0,343095,8.05,,S
-417,1,2,"Drew, Mrs. James Vivian (Lulu Thorne Christian)",female,34,1,1,28220,32.5,,S
-418,1,2,"Silven, Miss. Lyyli Karoliina",female,18,0,2,250652,13,,S
-419,0,2,"Matthews, Mr. William John",male,30,0,0,28228,13,,S
-420,0,3,"Van Impe, Miss. Catharina",female,10,0,2,345773,24.15,,S
-421,0,3,"Gheorgheff, Mr. Stanio",male,,0,0,349254,7.8958,,C
-422,0,3,"Charters, Mr. David",male,21,0,0,A/5. 13032,7.7333,,Q
-423,0,3,"Zimmerman, Mr. Leo",male,29,0,0,315082,7.875,,S
-424,0,3,"Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren)",female,28,1,1,347080,14.4,,S
-425,0,3,"Rosblom, Mr. Viktor Richard",male,18,1,1,370129,20.2125,,S
-426,0,3,"Wiseman, Mr. Phillippe",male,,0,0,A/4. 34244,7.25,,S
-427,1,2,"Clarke, Mrs. Charles V (Ada Maria Winfield)",female,28,1,0,2003,26,,S
-428,1,2,"Phillips, Miss. Kate Florence (""Mrs Kate Louise Phillips Marshall"")",female,19,0,0,250655,26,,S
-429,0,3,"Flynn, Mr. James",male,,0,0,364851,7.75,,Q
-430,1,3,"Pickard, Mr. Berk (Berk Trembisky)",male,32,0,0,SOTON/O.Q. 392078,8.05,E10,S
-431,1,1,"Bjornstrom-Steffansson, Mr. Mauritz Hakan",male,28,0,0,110564,26.55,C52,S
-432,1,3,"Thorneycroft, Mrs. Percival (Florence Kate White)",female,,1,0,376564,16.1,,S
-433,1,2,"Louch, Mrs. Charles Alexander (Alice Adelaide Slow)",female,42,1,0,SC/AH 3085,26,,S
-434,0,3,"Kallio, Mr. Nikolai Erland",male,17,0,0,STON/O 2. 3101274,7.125,,S
-435,0,1,"Silvey, Mr. William Baird",male,50,1,0,13507,55.9,E44,S
-436,1,1,"Carter, Miss. Lucile Polk",female,14,1,2,113760,120,B96 B98,S
-437,0,3,"Ford, Miss. Doolina Margaret ""Daisy""",female,21,2,2,W./C. 6608,34.375,,S
-438,1,2,"Richards, Mrs. Sidney (Emily Hocking)",female,24,2,3,29106,18.75,,S
-439,0,1,"Fortune, Mr. Mark",male,64,1,4,19950,263,C23 C25 C27,S
-440,0,2,"Kvillner, Mr. Johan Henrik Johannesson",male,31,0,0,C.A. 18723,10.5,,S
-441,1,2,"Hart, Mrs. Benjamin (Esther Ada Bloomfield)",female,45,1,1,F.C.C. 13529,26.25,,S
-442,0,3,"Hampe, Mr. Leon",male,20,0,0,345769,9.5,,S
-443,0,3,"Petterson, Mr. Johan Emil",male,25,1,0,347076,7.775,,S
-444,1,2,"Reynaldo, Ms. Encarnacion",female,28,0,0,230434,13,,S
-445,1,3,"Johannesen-Bratthammer, Mr. Bernt",male,,0,0,65306,8.1125,,S
-446,1,1,"Dodge, Master. Washington",male,4,0,2,33638,81.8583,A34,S
-447,1,2,"Mellinger, Miss. Madeleine Violet",female,13,0,1,250644,19.5,,S
-448,1,1,"Seward, Mr. Frederic Kimber",male,34,0,0,113794,26.55,,S
-449,1,3,"Baclini, Miss. Marie Catherine",female,5,2,1,2666,19.2583,,C
-450,1,1,"Peuchen, Major. Arthur Godfrey",male,52,0,0,113786,30.5,C104,S
-451,0,2,"West, Mr. Edwy Arthur",male,36,1,2,C.A. 34651,27.75,,S
-452,0,3,"Hagland, Mr. Ingvald Olai Olsen",male,,1,0,65303,19.9667,,S
-453,0,1,"Foreman, Mr. Benjamin Laventall",male,30,0,0,113051,27.75,C111,C
-454,1,1,"Goldenberg, Mr. Samuel L",male,49,1,0,17453,89.1042,C92,C
-455,0,3,"Peduzzi, Mr. Joseph",male,,0,0,A/5 2817,8.05,,S
-456,1,3,"Jalsevac, Mr. Ivan",male,29,0,0,349240,7.8958,,C
-457,0,1,"Millet, Mr. Francis Davis",male,65,0,0,13509,26.55,E38,S
-458,1,1,"Kenyon, Mrs. Frederick R (Marion)",female,,1,0,17464,51.8625,D21,S
-459,1,2,"Toomey, Miss. Ellen",female,50,0,0,F.C.C. 13531,10.5,,S
-460,0,3,"O'Connor, Mr. Maurice",male,,0,0,371060,7.75,,Q
-461,1,1,"Anderson, Mr. Harry",male,48,0,0,19952,26.55,E12,S
-462,0,3,"Morley, Mr. William",male,34,0,0,364506,8.05,,S
-463,0,1,"Gee, Mr. Arthur H",male,47,0,0,111320,38.5,E63,S
-464,0,2,"Milling, Mr. Jacob Christian",male,48,0,0,234360,13,,S
-465,0,3,"Maisner, Mr. Simon",male,,0,0,A/S 2816,8.05,,S
-466,0,3,"Goncalves, Mr. Manuel Estanslas",male,38,0,0,SOTON/O.Q. 3101306,7.05,,S
-467,0,2,"Campbell, Mr. William",male,,0,0,239853,0,,S
-468,0,1,"Smart, Mr. John Montgomery",male,56,0,0,113792,26.55,,S
-469,0,3,"Scanlan, Mr. James",male,,0,0,36209,7.725,,Q
-470,1,3,"Baclini, Miss. Helene Barbara",female,0.75,2,1,2666,19.2583,,C
-471,0,3,"Keefe, Mr. Arthur",male,,0,0,323592,7.25,,S
-472,0,3,"Cacic, Mr. Luka",male,38,0,0,315089,8.6625,,S
-473,1,2,"West, Mrs. Edwy Arthur (Ada Mary Worth)",female,33,1,2,C.A. 34651,27.75,,S
-474,1,2,"Jerwan, Mrs. Amin S (Marie Marthe Thuillard)",female,23,0,0,SC/AH Basle 541,13.7917,D,C
-475,0,3,"Strandberg, Miss. Ida Sofia",female,22,0,0,7553,9.8375,,S
-476,0,1,"Clifford, Mr. George Quincy",male,,0,0,110465,52,A14,S
-477,0,2,"Renouf, Mr. Peter Henry",male,34,1,0,31027,21,,S
-478,0,3,"Braund, Mr. Lewis Richard",male,29,1,0,3460,7.0458,,S
-479,0,3,"Karlsson, Mr. Nils August",male,22,0,0,350060,7.5208,,S
-480,1,3,"Hirvonen, Miss. Hildur E",female,2,0,1,3101298,12.2875,,S
-481,0,3,"Goodwin, Master. Harold Victor",male,9,5,2,CA 2144,46.9,,S
-482,0,2,"Frost, Mr. Anthony Wood ""Archie""",male,,0,0,239854,0,,S
-483,0,3,"Rouse, Mr. Richard Henry",male,50,0,0,A/5 3594,8.05,,S
-484,1,3,"Turkula, Mrs. (Hedwig)",female,63,0,0,4134,9.5875,,S
-485,1,1,"Bishop, Mr. Dickinson H",male,25,1,0,11967,91.0792,B49,C
-486,0,3,"Lefebre, Miss. Jeannie",female,,3,1,4133,25.4667,,S
-487,1,1,"Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby)",female,35,1,0,19943,90,C93,S
-488,0,1,"Kent, Mr. Edward Austin",male,58,0,0,11771,29.7,B37,C
-489,0,3,"Somerton, Mr. Francis William",male,30,0,0,A.5. 18509,8.05,,S
-490,1,3,"Coutts, Master. Eden Leslie ""Neville""",male,9,1,1,C.A. 37671,15.9,,S
-491,0,3,"Hagland, Mr. Konrad Mathias Reiersen",male,,1,0,65304,19.9667,,S
-492,0,3,"Windelov, Mr. Einar",male,21,0,0,SOTON/OQ 3101317,7.25,,S
-493,0,1,"Molson, Mr. Harry Markland",male,55,0,0,113787,30.5,C30,S
-494,0,1,"Artagaveytia, Mr. Ramon",male,71,0,0,PC 17609,49.5042,,C
-495,0,3,"Stanley, Mr. Edward Roland",male,21,0,0,A/4 45380,8.05,,S
-496,0,3,"Yousseff, Mr. Gerious",male,,0,0,2627,14.4583,,C
-497,1,1,"Eustis, Miss. Elizabeth Mussey",female,54,1,0,36947,78.2667,D20,C
-498,0,3,"Shellard, Mr. Frederick William",male,,0,0,C.A. 6212,15.1,,S
-499,0,1,"Allison, Mrs. Hudson J C (Bessie Waldo Daniels)",female,25,1,2,113781,151.55,C22 C26,S
-500,0,3,"Svensson, Mr. Olof",male,24,0,0,350035,7.7958,,S
-501,0,3,"Calic, Mr. Petar",male,17,0,0,315086,8.6625,,S
-502,0,3,"Canavan, Miss. Mary",female,21,0,0,364846,7.75,,Q
-503,0,3,"O'Sullivan, Miss. Bridget Mary",female,,0,0,330909,7.6292,,Q
-504,0,3,"Laitinen, Miss. Kristina Sofia",female,37,0,0,4135,9.5875,,S
-505,1,1,"Maioni, Miss. Roberta",female,16,0,0,110152,86.5,B79,S
-506,0,1,"Penasco y Castellana, Mr. Victor de Satode",male,18,1,0,PC 17758,108.9,C65,C
-507,1,2,"Quick, Mrs. Frederick Charles (Jane Richards)",female,33,0,2,26360,26,,S
-508,1,1,"Bradley, Mr. George (""George Arthur Brayton"")",male,,0,0,111427,26.55,,S
-509,0,3,"Olsen, Mr. Henry Margido",male,28,0,0,C 4001,22.525,,S
-510,1,3,"Lang, Mr. Fang",male,26,0,0,1601,56.4958,,S
-511,1,3,"Daly, Mr. Eugene Patrick",male,29,0,0,382651,7.75,,Q
-512,0,3,"Webber, Mr. James",male,,0,0,SOTON/OQ 3101316,8.05,,S
-513,1,1,"McGough, Mr. James Robert",male,36,0,0,PC 17473,26.2875,E25,S
-514,1,1,"Rothschild, Mrs. Martin (Elizabeth L. Barrett)",female,54,1,0,PC 17603,59.4,,C
-515,0,3,"Coleff, Mr. Satio",male,24,0,0,349209,7.4958,,S
-516,0,1,"Walker, Mr. William Anderson",male,47,0,0,36967,34.0208,D46,S
-517,1,2,"Lemore, Mrs. (Amelia Milley)",female,34,0,0,C.A. 34260,10.5,F33,S
-518,0,3,"Ryan, Mr. Patrick",male,,0,0,371110,24.15,,Q
-519,1,2,"Angle, Mrs. William A (Florence ""Mary"" Agnes Hughes)",female,36,1,0,226875,26,,S
-520,0,3,"Pavlovic, Mr. Stefo",male,32,0,0,349242,7.8958,,S
-521,1,1,"Perreault, Miss. Anne",female,30,0,0,12749,93.5,B73,S
-522,0,3,"Vovk, Mr. Janko",male,22,0,0,349252,7.8958,,S
-523,0,3,"Lahoud, Mr. Sarkis",male,,0,0,2624,7.225,,C
-524,1,1,"Hippach, Mrs. Louis Albert (Ida Sophia Fischer)",female,44,0,1,111361,57.9792,B18,C
-525,0,3,"Kassem, Mr. Fared",male,,0,0,2700,7.2292,,C
-526,0,3,"Farrell, Mr. James",male,40.5,0,0,367232,7.75,,Q
-527,1,2,"Ridsdale, Miss. Lucy",female,50,0,0,W./C. 14258,10.5,,S
-528,0,1,"Farthing, Mr. John",male,,0,0,PC 17483,221.7792,C95,S
-529,0,3,"Salonen, Mr. Johan Werner",male,39,0,0,3101296,7.925,,S
-530,0,2,"Hocking, Mr. Richard George",male,23,2,1,29104,11.5,,S
-531,1,2,"Quick, Miss. Phyllis May",female,2,1,1,26360,26,,S
-532,0,3,"Toufik, Mr. Nakli",male,,0,0,2641,7.2292,,C
-533,0,3,"Elias, Mr. Joseph Jr",male,17,1,1,2690,7.2292,,C
-534,1,3,"Peter, Mrs. Catherine (Catherine Rizk)",female,,0,2,2668,22.3583,,C
-535,0,3,"Cacic, Miss. Marija",female,30,0,0,315084,8.6625,,S
-536,1,2,"Hart, Miss. Eva Miriam",female,7,0,2,F.C.C. 13529,26.25,,S
-537,0,1,"Butt, Major. Archibald Willingham",male,45,0,0,113050,26.55,B38,S
-538,1,1,"LeRoy, Miss. Bertha",female,30,0,0,PC 17761,106.425,,C
-539,0,3,"Risien, Mr. Samuel Beard",male,,0,0,364498,14.5,,S
-540,1,1,"Frolicher, Miss. Hedwig Margaritha",female,22,0,2,13568,49.5,B39,C
-541,1,1,"Crosby, Miss. Harriet R",female,36,0,2,WE/P 5735,71,B22,S
-542,0,3,"Andersson, Miss. Ingeborg Constanzia",female,9,4,2,347082,31.275,,S
-543,0,3,"Andersson, Miss. Sigrid Elisabeth",female,11,4,2,347082,31.275,,S
-544,1,2,"Beane, Mr. Edward",male,32,1,0,2908,26,,S
-545,0,1,"Douglas, Mr. Walter Donald",male,50,1,0,PC 17761,106.425,C86,C
-546,0,1,"Nicholson, Mr. Arthur Ernest",male,64,0,0,693,26,,S
-547,1,2,"Beane, Mrs. Edward (Ethel Clarke)",female,19,1,0,2908,26,,S
-548,1,2,"Padro y Manent, Mr. Julian",male,,0,0,SC/PARIS 2146,13.8625,,C
-549,0,3,"Goldsmith, Mr. Frank John",male,33,1,1,363291,20.525,,S
-550,1,2,"Davies, Master. John Morgan Jr",male,8,1,1,C.A. 33112,36.75,,S
-551,1,1,"Thayer, Mr. John Borland Jr",male,17,0,2,17421,110.8833,C70,C
-552,0,2,"Sharp, Mr. Percival James R",male,27,0,0,244358,26,,S
-553,0,3,"O'Brien, Mr. Timothy",male,,0,0,330979,7.8292,,Q
-554,1,3,"Leeni, Mr. Fahim (""Philip Zenni"")",male,22,0,0,2620,7.225,,C
-555,1,3,"Ohman, Miss. Velin",female,22,0,0,347085,7.775,,S
-556,0,1,"Wright, Mr. George",male,62,0,0,113807,26.55,,S
-557,1,1,"Duff Gordon, Lady. (Lucille Christiana Sutherland) (""Mrs Morgan"")",female,48,1,0,11755,39.6,A16,C
-558,0,1,"Robbins, Mr. Victor",male,,0,0,PC 17757,227.525,,C
-559,1,1,"Taussig, Mrs. Emil (Tillie Mandelbaum)",female,39,1,1,110413,79.65,E67,S
-560,1,3,"de Messemaeker, Mrs. Guillaume Joseph (Emma)",female,36,1,0,345572,17.4,,S
-561,0,3,"Morrow, Mr. Thomas Rowan",male,,0,0,372622,7.75,,Q
-562,0,3,"Sivic, Mr. Husein",male,40,0,0,349251,7.8958,,S
-563,0,2,"Norman, Mr. Robert Douglas",male,28,0,0,218629,13.5,,S
-564,0,3,"Simmons, Mr. John",male,,0,0,SOTON/OQ 392082,8.05,,S
-565,0,3,"Meanwell, Miss. (Marion Ogden)",female,,0,0,SOTON/O.Q. 392087,8.05,,S
-566,0,3,"Davies, Mr. Alfred J",male,24,2,0,A/4 48871,24.15,,S
-567,0,3,"Stoytcheff, Mr. Ilia",male,19,0,0,349205,7.8958,,S
-568,0,3,"Palsson, Mrs. Nils (Alma Cornelia Berglund)",female,29,0,4,349909,21.075,,S
-569,0,3,"Doharr, Mr. Tannous",male,,0,0,2686,7.2292,,C
-570,1,3,"Jonsson, Mr. Carl",male,32,0,0,350417,7.8542,,S
-571,1,2,"Harris, Mr. George",male,62,0,0,S.W./PP 752,10.5,,S
-572,1,1,"Appleton, Mrs. Edward Dale (Charlotte Lamson)",female,53,2,0,11769,51.4792,C101,S
-573,1,1,"Flynn, Mr. John Irwin (""Irving"")",male,36,0,0,PC 17474,26.3875,E25,S
-574,1,3,"Kelly, Miss. Mary",female,,0,0,14312,7.75,,Q
-575,0,3,"Rush, Mr. Alfred George John",male,16,0,0,A/4. 20589,8.05,,S
-576,0,3,"Patchett, Mr. George",male,19,0,0,358585,14.5,,S
-577,1,2,"Garside, Miss. Ethel",female,34,0,0,243880,13,,S
-578,1,1,"Silvey, Mrs. William Baird (Alice Munger)",female,39,1,0,13507,55.9,E44,S
-579,0,3,"Caram, Mrs. Joseph (Maria Elias)",female,,1,0,2689,14.4583,,C
-580,1,3,"Jussila, Mr. Eiriik",male,32,0,0,STON/O 2. 3101286,7.925,,S
-581,1,2,"Christy, Miss. Julie Rachel",female,25,1,1,237789,30,,S
-582,1,1,"Thayer, Mrs. John Borland (Marian Longstreth Morris)",female,39,1,1,17421,110.8833,C68,C
-583,0,2,"Downton, Mr. William James",male,54,0,0,28403,26,,S
-584,0,1,"Ross, Mr. John Hugo",male,36,0,0,13049,40.125,A10,C
-585,0,3,"Paulner, Mr. Uscher",male,,0,0,3411,8.7125,,C
-586,1,1,"Taussig, Miss. Ruth",female,18,0,2,110413,79.65,E68,S
-587,0,2,"Jarvis, Mr. John Denzil",male,47,0,0,237565,15,,S
-588,1,1,"Frolicher-Stehli, Mr. Maxmillian",male,60,1,1,13567,79.2,B41,C
-589,0,3,"Gilinski, Mr. Eliezer",male,22,0,0,14973,8.05,,S
-590,0,3,"Murdlin, Mr. Joseph",male,,0,0,A./5. 3235,8.05,,S
-591,0,3,"Rintamaki, Mr. Matti",male,35,0,0,STON/O 2. 3101273,7.125,,S
-592,1,1,"Stephenson, Mrs. Walter Bertram (Martha Eustis)",female,52,1,0,36947,78.2667,D20,C
-593,0,3,"Elsbury, Mr. William James",male,47,0,0,A/5 3902,7.25,,S
-594,0,3,"Bourke, Miss. Mary",female,,0,2,364848,7.75,,Q
-595,0,2,"Chapman, Mr. John Henry",male,37,1,0,SC/AH 29037,26,,S
-596,0,3,"Van Impe, Mr. Jean Baptiste",male,36,1,1,345773,24.15,,S
-597,1,2,"Leitch, Miss. Jessie Wills",female,,0,0,248727,33,,S
-598,0,3,"Johnson, Mr. Alfred",male,49,0,0,LINE,0,,S
-599,0,3,"Boulos, Mr. Hanna",male,,0,0,2664,7.225,,C
-600,1,1,"Duff Gordon, Sir. Cosmo Edmund (""Mr Morgan"")",male,49,1,0,PC 17485,56.9292,A20,C
-601,1,2,"Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy)",female,24,2,1,243847,27,,S
-602,0,3,"Slabenoff, Mr. Petco",male,,0,0,349214,7.8958,,S
-603,0,1,"Harrington, Mr. Charles H",male,,0,0,113796,42.4,,S
-604,0,3,"Torber, Mr. Ernst William",male,44,0,0,364511,8.05,,S
-605,1,1,"Homer, Mr. Harry (""Mr E Haven"")",male,35,0,0,111426,26.55,,C
-606,0,3,"Lindell, Mr. Edvard Bengtsson",male,36,1,0,349910,15.55,,S
-607,0,3,"Karaic, Mr. Milan",male,30,0,0,349246,7.8958,,S
-608,1,1,"Daniel, Mr. Robert Williams",male,27,0,0,113804,30.5,,S
-609,1,2,"Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue)",female,22,1,2,SC/Paris 2123,41.5792,,C
-610,1,1,"Shutes, Miss. Elizabeth W",female,40,0,0,PC 17582,153.4625,C125,S
-611,0,3,"Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren)",female,39,1,5,347082,31.275,,S
-612,0,3,"Jardin, Mr. Jose Neto",male,,0,0,SOTON/O.Q. 3101305,7.05,,S
-613,1,3,"Murphy, Miss. Margaret Jane",female,,1,0,367230,15.5,,Q
-614,0,3,"Horgan, Mr. John",male,,0,0,370377,7.75,,Q
-615,0,3,"Brocklebank, Mr. William Alfred",male,35,0,0,364512,8.05,,S
-616,1,2,"Herman, Miss. Alice",female,24,1,2,220845,65,,S
-617,0,3,"Danbom, Mr. Ernst Gilbert",male,34,1,1,347080,14.4,,S
-618,0,3,"Lobb, Mrs. William Arthur (Cordelia K Stanlick)",female,26,1,0,A/5. 3336,16.1,,S
-619,1,2,"Becker, Miss. Marion Louise",female,4,2,1,230136,39,F4,S
-620,0,2,"Gavey, Mr. Lawrence",male,26,0,0,31028,10.5,,S
-621,0,3,"Yasbeck, Mr. Antoni",male,27,1,0,2659,14.4542,,C
-622,1,1,"Kimball, Mr. Edwin Nelson Jr",male,42,1,0,11753,52.5542,D19,S
-623,1,3,"Nakid, Mr. Sahid",male,20,1,1,2653,15.7417,,C
-624,0,3,"Hansen, Mr. Henry Damsgaard",male,21,0,0,350029,7.8542,,S
-625,0,3,"Bowen, Mr. David John ""Dai""",male,21,0,0,54636,16.1,,S
-626,0,1,"Sutton, Mr. Frederick",male,61,0,0,36963,32.3208,D50,S
-627,0,2,"Kirkland, Rev. Charles Leonard",male,57,0,0,219533,12.35,,Q
-628,1,1,"Longley, Miss. Gretchen Fiske",female,21,0,0,13502,77.9583,D9,S
-629,0,3,"Bostandyeff, Mr. Guentcho",male,26,0,0,349224,7.8958,,S
-630,0,3,"O'Connell, Mr. Patrick D",male,,0,0,334912,7.7333,,Q
-631,1,1,"Barkworth, Mr. Algernon Henry Wilson",male,80,0,0,27042,30,A23,S
-632,0,3,"Lundahl, Mr. Johan Svensson",male,51,0,0,347743,7.0542,,S
-633,1,1,"Stahelin-Maeglin, Dr. Max",male,32,0,0,13214,30.5,B50,C
-634,0,1,"Parr, Mr. William Henry Marsh",male,,0,0,112052,0,,S
-635,0,3,"Skoog, Miss. Mabel",female,9,3,2,347088,27.9,,S
-636,1,2,"Davis, Miss. Mary",female,28,0,0,237668,13,,S
-637,0,3,"Leinonen, Mr. Antti Gustaf",male,32,0,0,STON/O 2. 3101292,7.925,,S
-638,0,2,"Collyer, Mr. Harvey",male,31,1,1,C.A. 31921,26.25,,S
-639,0,3,"Panula, Mrs. Juha (Maria Emilia Ojala)",female,41,0,5,3101295,39.6875,,S
-640,0,3,"Thorneycroft, Mr. Percival",male,,1,0,376564,16.1,,S
-641,0,3,"Jensen, Mr. Hans Peder",male,20,0,0,350050,7.8542,,S
-642,1,1,"Sagesser, Mlle. Emma",female,24,0,0,PC 17477,69.3,B35,C
-643,0,3,"Skoog, Miss. Margit Elizabeth",female,2,3,2,347088,27.9,,S
-644,1,3,"Foo, Mr. Choong",male,,0,0,1601,56.4958,,S
-645,1,3,"Baclini, Miss. Eugenie",female,0.75,2,1,2666,19.2583,,C
-646,1,1,"Harper, Mr. Henry Sleeper",male,48,1,0,PC 17572,76.7292,D33,C
-647,0,3,"Cor, Mr. Liudevit",male,19,0,0,349231,7.8958,,S
-648,1,1,"Simonius-Blumer, Col. Oberst Alfons",male,56,0,0,13213,35.5,A26,C
-649,0,3,"Willey, Mr. Edward",male,,0,0,S.O./P.P. 751,7.55,,S
-650,1,3,"Stanley, Miss. Amy Zillah Elsie",female,23,0,0,CA. 2314,7.55,,S
-651,0,3,"Mitkoff, Mr. Mito",male,,0,0,349221,7.8958,,S
-652,1,2,"Doling, Miss. Elsie",female,18,0,1,231919,23,,S
-653,0,3,"Kalvik, Mr. Johannes Halvorsen",male,21,0,0,8475,8.4333,,S
-654,1,3,"O'Leary, Miss. Hanora ""Norah""",female,,0,0,330919,7.8292,,Q
-655,0,3,"Hegarty, Miss. Hanora ""Nora""",female,18,0,0,365226,6.75,,Q
-656,0,2,"Hickman, Mr. Leonard Mark",male,24,2,0,S.O.C. 14879,73.5,,S
-657,0,3,"Radeff, Mr. Alexander",male,,0,0,349223,7.8958,,S
-658,0,3,"Bourke, Mrs. John (Catherine)",female,32,1,1,364849,15.5,,Q
-659,0,2,"Eitemiller, Mr. George Floyd",male,23,0,0,29751,13,,S
-660,0,1,"Newell, Mr. Arthur Webster",male,58,0,2,35273,113.275,D48,C
-661,1,1,"Frauenthal, Dr. Henry William",male,50,2,0,PC 17611,133.65,,S
-662,0,3,"Badt, Mr. Mohamed",male,40,0,0,2623,7.225,,C
-663,0,1,"Colley, Mr. Edward Pomeroy",male,47,0,0,5727,25.5875,E58,S
-664,0,3,"Coleff, Mr. Peju",male,36,0,0,349210,7.4958,,S
-665,1,3,"Lindqvist, Mr. Eino William",male,20,1,0,STON/O 2. 3101285,7.925,,S
-666,0,2,"Hickman, Mr. Lewis",male,32,2,0,S.O.C. 14879,73.5,,S
-667,0,2,"Butler, Mr. Reginald Fenton",male,25,0,0,234686,13,,S
-668,0,3,"Rommetvedt, Mr. Knud Paust",male,,0,0,312993,7.775,,S
-669,0,3,"Cook, Mr. Jacob",male,43,0,0,A/5 3536,8.05,,S
-670,1,1,"Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright)",female,,1,0,19996,52,C126,S
-671,1,2,"Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford)",female,40,1,1,29750,39,,S
-672,0,1,"Davidson, Mr. Thornton",male,31,1,0,F.C. 12750,52,B71,S
-673,0,2,"Mitchell, Mr. Henry Michael",male,70,0,0,C.A. 24580,10.5,,S
-674,1,2,"Wilhelms, Mr. Charles",male,31,0,0,244270,13,,S
-675,0,2,"Watson, Mr. Ennis Hastings",male,,0,0,239856,0,,S
-676,0,3,"Edvardsson, Mr. Gustaf Hjalmar",male,18,0,0,349912,7.775,,S
-677,0,3,"Sawyer, Mr. Frederick Charles",male,24.5,0,0,342826,8.05,,S
-678,1,3,"Turja, Miss. Anna Sofia",female,18,0,0,4138,9.8417,,S
-679,0,3,"Goodwin, Mrs. Frederick (Augusta Tyler)",female,43,1,6,CA 2144,46.9,,S
-680,1,1,"Cardeza, Mr. Thomas Drake Martinez",male,36,0,1,PC 17755,512.3292,B51 B53 B55,C
-681,0,3,"Peters, Miss. Katie",female,,0,0,330935,8.1375,,Q
-682,1,1,"Hassab, Mr. Hammad",male,27,0,0,PC 17572,76.7292,D49,C
-683,0,3,"Olsvigen, Mr. Thor Anderson",male,20,0,0,6563,9.225,,S
-684,0,3,"Goodwin, Mr. Charles Edward",male,14,5,2,CA 2144,46.9,,S
-685,0,2,"Brown, Mr. Thomas William Solomon",male,60,1,1,29750,39,,S
-686,0,2,"Laroche, Mr. Joseph Philippe Lemercier",male,25,1,2,SC/Paris 2123,41.5792,,C
-687,0,3,"Panula, Mr. Jaako Arnold",male,14,4,1,3101295,39.6875,,S
-688,0,3,"Dakic, Mr. Branko",male,19,0,0,349228,10.1708,,S
-689,0,3,"Fischer, Mr. Eberhard Thelander",male,18,0,0,350036,7.7958,,S
-690,1,1,"Madill, Miss. Georgette Alexandra",female,15,0,1,24160,211.3375,B5,S
-691,1,1,"Dick, Mr. Albert Adrian",male,31,1,0,17474,57,B20,S
-692,1,3,"Karun, Miss. Manca",female,4,0,1,349256,13.4167,,C
-693,1,3,"Lam, Mr. Ali",male,,0,0,1601,56.4958,,S
-694,0,3,"Saad, Mr. Khalil",male,25,0,0,2672,7.225,,C
-695,0,1,"Weir, Col. John",male,60,0,0,113800,26.55,,S
-696,0,2,"Chapman, Mr. Charles Henry",male,52,0,0,248731,13.5,,S
-697,0,3,"Kelly, Mr. James",male,44,0,0,363592,8.05,,S
-698,1,3,"Mullens, Miss. Katherine ""Katie""",female,,0,0,35852,7.7333,,Q
-699,0,1,"Thayer, Mr. John Borland",male,49,1,1,17421,110.8833,C68,C
-700,0,3,"Humblen, Mr. Adolf Mathias Nicolai Olsen",male,42,0,0,348121,7.65,F G63,S
-701,1,1,"Astor, Mrs. John Jacob (Madeleine Talmadge Force)",female,18,1,0,PC 17757,227.525,C62 C64,C
-702,1,1,"Silverthorne, Mr. Spencer Victor",male,35,0,0,PC 17475,26.2875,E24,S
-703,0,3,"Barbara, Miss. Saiide",female,18,0,1,2691,14.4542,,C
-704,0,3,"Gallagher, Mr. Martin",male,25,0,0,36864,7.7417,,Q
-705,0,3,"Hansen, Mr. Henrik Juul",male,26,1,0,350025,7.8542,,S
-706,0,2,"Morley, Mr. Henry Samuel (""Mr Henry Marshall"")",male,39,0,0,250655,26,,S
-707,1,2,"Kelly, Mrs. Florence ""Fannie""",female,45,0,0,223596,13.5,,S
-708,1,1,"Calderhead, Mr. Edward Pennington",male,42,0,0,PC 17476,26.2875,E24,S
-709,1,1,"Cleaver, Miss. Alice",female,22,0,0,113781,151.55,,S
-710,1,3,"Moubarek, Master. Halim Gonios (""William George"")",male,,1,1,2661,15.2458,,C
-711,1,1,"Mayne, Mlle. Berthe Antonine (""Mrs de Villiers"")",female,24,0,0,PC 17482,49.5042,C90,C
-712,0,1,"Klaber, Mr. Herman",male,,0,0,113028,26.55,C124,S
-713,1,1,"Taylor, Mr. Elmer Zebley",male,48,1,0,19996,52,C126,S
-714,0,3,"Larsson, Mr. August Viktor",male,29,0,0,7545,9.4833,,S
-715,0,2,"Greenberg, Mr. Samuel",male,52,0,0,250647,13,,S
-716,0,3,"Soholt, Mr. Peter Andreas Lauritz Andersen",male,19,0,0,348124,7.65,F G73,S
-717,1,1,"Endres, Miss. Caroline Louise",female,38,0,0,PC 17757,227.525,C45,C
-718,1,2,"Troutt, Miss. Edwina Celia ""Winnie""",female,27,0,0,34218,10.5,E101,S
-719,0,3,"McEvoy, Mr. Michael",male,,0,0,36568,15.5,,Q
-720,0,3,"Johnson, Mr. Malkolm Joackim",male,33,0,0,347062,7.775,,S
-721,1,2,"Harper, Miss. Annie Jessie ""Nina""",female,6,0,1,248727,33,,S
-722,0,3,"Jensen, Mr. Svend Lauritz",male,17,1,0,350048,7.0542,,S
-723,0,2,"Gillespie, Mr. William Henry",male,34,0,0,12233,13,,S
-724,0,2,"Hodges, Mr. Henry Price",male,50,0,0,250643,13,,S
-725,1,1,"Chambers, Mr. Norman Campbell",male,27,1,0,113806,53.1,E8,S
-726,0,3,"Oreskovic, Mr. Luka",male,20,0,0,315094,8.6625,,S
-727,1,2,"Renouf, Mrs. Peter Henry (Lillian Jefferys)",female,30,3,0,31027,21,,S
-728,1,3,"Mannion, Miss. Margareth",female,,0,0,36866,7.7375,,Q
-729,0,2,"Bryhl, Mr. Kurt Arnold Gottfrid",male,25,1,0,236853,26,,S
-730,0,3,"Ilmakangas, Miss. Pieta Sofia",female,25,1,0,STON/O2. 3101271,7.925,,S
-731,1,1,"Allen, Miss. Elisabeth Walton",female,29,0,0,24160,211.3375,B5,S
-732,0,3,"Hassan, Mr. Houssein G N",male,11,0,0,2699,18.7875,,C
-733,0,2,"Knight, Mr. Robert J",male,,0,0,239855,0,,S
-734,0,2,"Berriman, Mr. William John",male,23,0,0,28425,13,,S
-735,0,2,"Troupiansky, Mr. Moses Aaron",male,23,0,0,233639,13,,S
-736,0,3,"Williams, Mr. Leslie",male,28.5,0,0,54636,16.1,,S
-737,0,3,"Ford, Mrs. Edward (Margaret Ann Watson)",female,48,1,3,W./C. 6608,34.375,,S
-738,1,1,"Lesurer, Mr. Gustave J",male,35,0,0,PC 17755,512.3292,B101,C
-739,0,3,"Ivanoff, Mr. Kanio",male,,0,0,349201,7.8958,,S
-740,0,3,"Nankoff, Mr. Minko",male,,0,0,349218,7.8958,,S
-741,1,1,"Hawksford, Mr. Walter James",male,,0,0,16988,30,D45,S
-742,0,1,"Cavendish, Mr. Tyrell William",male,36,1,0,19877,78.85,C46,S
-743,1,1,"Ryerson, Miss. Susan Parker ""Suzette""",female,21,2,2,PC 17608,262.375,B57 B59 B63 B66,C
-744,0,3,"McNamee, Mr. Neal",male,24,1,0,376566,16.1,,S
-745,1,3,"Stranden, Mr. Juho",male,31,0,0,STON/O 2. 3101288,7.925,,S
-746,0,1,"Crosby, Capt. Edward Gifford",male,70,1,1,WE/P 5735,71,B22,S
-747,0,3,"Abbott, Mr. Rossmore Edward",male,16,1,1,C.A. 2673,20.25,,S
-748,1,2,"Sinkkonen, Miss. Anna",female,30,0,0,250648,13,,S
-749,0,1,"Marvin, Mr. Daniel Warner",male,19,1,0,113773,53.1,D30,S
-750,0,3,"Connaghton, Mr. Michael",male,31,0,0,335097,7.75,,Q
-751,1,2,"Wells, Miss. Joan",female,4,1,1,29103,23,,S
-752,1,3,"Moor, Master. Meier",male,6,0,1,392096,12.475,E121,S
-753,0,3,"Vande Velde, Mr. Johannes Joseph",male,33,0,0,345780,9.5,,S
-754,0,3,"Jonkoff, Mr. Lalio",male,23,0,0,349204,7.8958,,S
-755,1,2,"Herman, Mrs. Samuel (Jane Laver)",female,48,1,2,220845,65,,S
-756,1,2,"Hamalainen, Master. Viljo",male,0.67,1,1,250649,14.5,,S
-757,0,3,"Carlsson, Mr. August Sigfrid",male,28,0,0,350042,7.7958,,S
-758,0,2,"Bailey, Mr. Percy Andrew",male,18,0,0,29108,11.5,,S
-759,0,3,"Theobald, Mr. Thomas Leonard",male,34,0,0,363294,8.05,,S
-760,1,1,"Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards)",female,33,0,0,110152,86.5,B77,S
-761,0,3,"Garfirth, Mr. John",male,,0,0,358585,14.5,,S
-762,0,3,"Nirva, Mr. Iisakki Antino Aijo",male,41,0,0,SOTON/O2 3101272,7.125,,S
-763,1,3,"Barah, Mr. Hanna Assi",male,20,0,0,2663,7.2292,,C
-764,1,1,"Carter, Mrs. William Ernest (Lucile Polk)",female,36,1,2,113760,120,B96 B98,S
-765,0,3,"Eklund, Mr. Hans Linus",male,16,0,0,347074,7.775,,S
-766,1,1,"Hogeboom, Mrs. John C (Anna Andrews)",female,51,1,0,13502,77.9583,D11,S
-767,0,1,"Brewe, Dr. Arthur Jackson",male,,0,0,112379,39.6,,C
-768,0,3,"Mangan, Miss. Mary",female,30.5,0,0,364850,7.75,,Q
-769,0,3,"Moran, Mr. Daniel J",male,,1,0,371110,24.15,,Q
-770,0,3,"Gronnestad, Mr. Daniel Danielsen",male,32,0,0,8471,8.3625,,S
-771,0,3,"Lievens, Mr. Rene Aime",male,24,0,0,345781,9.5,,S
-772,0,3,"Jensen, Mr. Niels Peder",male,48,0,0,350047,7.8542,,S
-773,0,2,"Mack, Mrs. (Mary)",female,57,0,0,S.O./P.P. 3,10.5,E77,S
-774,0,3,"Elias, Mr. Dibo",male,,0,0,2674,7.225,,C
-775,1,2,"Hocking, Mrs. Elizabeth (Eliza Needs)",female,54,1,3,29105,23,,S
-776,0,3,"Myhrman, Mr. Pehr Fabian Oliver Malkolm",male,18,0,0,347078,7.75,,S
-777,0,3,"Tobin, Mr. Roger",male,,0,0,383121,7.75,F38,Q
-778,1,3,"Emanuel, Miss. Virginia Ethel",female,5,0,0,364516,12.475,,S
-779,0,3,"Kilgannon, Mr. Thomas J",male,,0,0,36865,7.7375,,Q
-780,1,1,"Robert, Mrs. Edward Scott (Elisabeth Walton McMillan)",female,43,0,1,24160,211.3375,B3,S
-781,1,3,"Ayoub, Miss. Banoura",female,13,0,0,2687,7.2292,,C
-782,1,1,"Dick, Mrs. Albert Adrian (Vera Gillespie)",female,17,1,0,17474,57,B20,S
-783,0,1,"Long, Mr. Milton Clyde",male,29,0,0,113501,30,D6,S
-784,0,3,"Johnston, Mr. Andrew G",male,,1,2,W./C. 6607,23.45,,S
-785,0,3,"Ali, Mr. William",male,25,0,0,SOTON/O.Q. 3101312,7.05,,S
-786,0,3,"Harmer, Mr. Abraham (David Lishin)",male,25,0,0,374887,7.25,,S
-787,1,3,"Sjoblom, Miss. Anna Sofia",female,18,0,0,3101265,7.4958,,S
-788,0,3,"Rice, Master. George Hugh",male,8,4,1,382652,29.125,,Q
-789,1,3,"Dean, Master. Bertram Vere",male,1,1,2,C.A. 2315,20.575,,S
-790,0,1,"Guggenheim, Mr. Benjamin",male,46,0,0,PC 17593,79.2,B82 B84,C
-791,0,3,"Keane, Mr. Andrew ""Andy""",male,,0,0,12460,7.75,,Q
-792,0,2,"Gaskell, Mr. Alfred",male,16,0,0,239865,26,,S
-793,0,3,"Sage, Miss. Stella Anna",female,,8,2,CA. 2343,69.55,,S
-794,0,1,"Hoyt, Mr. William Fisher",male,,0,0,PC 17600,30.6958,,C
-795,0,3,"Dantcheff, Mr. Ristiu",male,25,0,0,349203,7.8958,,S
-796,0,2,"Otter, Mr. Richard",male,39,0,0,28213,13,,S
-797,1,1,"Leader, Dr. Alice (Farnham)",female,49,0,0,17465,25.9292,D17,S
-798,1,3,"Osman, Mrs. Mara",female,31,0,0,349244,8.6833,,S
-799,0,3,"Ibrahim Shawah, Mr. Yousseff",male,30,0,0,2685,7.2292,,C
-800,0,3,"Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert)",female,30,1,1,345773,24.15,,S
-801,0,2,"Ponesell, Mr. Martin",male,34,0,0,250647,13,,S
-802,1,2,"Collyer, Mrs. Harvey (Charlotte Annie Tate)",female,31,1,1,C.A. 31921,26.25,,S
-803,1,1,"Carter, Master. William Thornton II",male,11,1,2,113760,120,B96 B98,S
-804,1,3,"Thomas, Master. Assad Alexander",male,0.42,0,1,2625,8.5167,,C
-805,1,3,"Hedman, Mr. Oskar Arvid",male,27,0,0,347089,6.975,,S
-806,0,3,"Johansson, Mr. Karl Johan",male,31,0,0,347063,7.775,,S
-807,0,1,"Andrews, Mr. Thomas Jr",male,39,0,0,112050,0,A36,S
-808,0,3,"Pettersson, Miss. Ellen Natalia",female,18,0,0,347087,7.775,,S
-809,0,2,"Meyer, Mr. August",male,39,0,0,248723,13,,S
-810,1,1,"Chambers, Mrs. Norman Campbell (Bertha Griggs)",female,33,1,0,113806,53.1,E8,S
-811,0,3,"Alexander, Mr. William",male,26,0,0,3474,7.8875,,S
-812,0,3,"Lester, Mr. James",male,39,0,0,A/4 48871,24.15,,S
-813,0,2,"Slemen, Mr. Richard James",male,35,0,0,28206,10.5,,S
-814,0,3,"Andersson, Miss. Ebba Iris Alfrida",female,6,4,2,347082,31.275,,S
-815,0,3,"Tomlin, Mr. Ernest Portage",male,30.5,0,0,364499,8.05,,S
-816,0,1,"Fry, Mr. Richard",male,,0,0,112058,0,B102,S
-817,0,3,"Heininen, Miss. Wendla Maria",female,23,0,0,STON/O2. 3101290,7.925,,S
-818,0,2,"Mallet, Mr. Albert",male,31,1,1,S.C./PARIS 2079,37.0042,,C
-819,0,3,"Holm, Mr. John Fredrik Alexander",male,43,0,0,C 7075,6.45,,S
-820,0,3,"Skoog, Master. Karl Thorsten",male,10,3,2,347088,27.9,,S
-821,1,1,"Hays, Mrs. Charles Melville (Clara Jennings Gregg)",female,52,1,1,12749,93.5,B69,S
-822,1,3,"Lulic, Mr. Nikola",male,27,0,0,315098,8.6625,,S
-823,0,1,"Reuchlin, Jonkheer. John George",male,38,0,0,19972,0,,S
-824,1,3,"Moor, Mrs. (Beila)",female,27,0,1,392096,12.475,E121,S
-825,0,3,"Panula, Master. Urho Abraham",male,2,4,1,3101295,39.6875,,S
-826,0,3,"Flynn, Mr. John",male,,0,0,368323,6.95,,Q
-827,0,3,"Lam, Mr. Len",male,,0,0,1601,56.4958,,S
-828,1,2,"Mallet, Master. Andre",male,1,0,2,S.C./PARIS 2079,37.0042,,C
-829,1,3,"McCormack, Mr. Thomas Joseph",male,,0,0,367228,7.75,,Q
-830,1,1,"Stone, Mrs. George Nelson (Martha Evelyn)",female,62,0,0,113572,80,B28,
-831,1,3,"Yasbeck, Mrs. Antoni (Selini Alexander)",female,15,1,0,2659,14.4542,,C
-832,1,2,"Richards, Master. George Sibley",male,0.83,1,1,29106,18.75,,S
-833,0,3,"Saad, Mr. Amin",male,,0,0,2671,7.2292,,C
-834,0,3,"Augustsson, Mr. Albert",male,23,0,0,347468,7.8542,,S
-835,0,3,"Allum, Mr. Owen George",male,18,0,0,2223,8.3,,S
-836,1,1,"Compton, Miss. Sara Rebecca",female,39,1,1,PC 17756,83.1583,E49,C
-837,0,3,"Pasic, Mr. Jakob",male,21,0,0,315097,8.6625,,S
-838,0,3,"Sirota, Mr. Maurice",male,,0,0,392092,8.05,,S
-839,1,3,"Chip, Mr. Chang",male,32,0,0,1601,56.4958,,S
-840,1,1,"Marechal, Mr. Pierre",male,,0,0,11774,29.7,C47,C
-841,0,3,"Alhomaki, Mr. Ilmari Rudolf",male,20,0,0,SOTON/O2 3101287,7.925,,S
-842,0,2,"Mudd, Mr. Thomas Charles",male,16,0,0,S.O./P.P. 3,10.5,,S
-843,1,1,"Serepeca, Miss. Augusta",female,30,0,0,113798,31,,C
-844,0,3,"Lemberopolous, Mr. Peter L",male,34.5,0,0,2683,6.4375,,C
-845,0,3,"Culumovic, Mr. Jeso",male,17,0,0,315090,8.6625,,S
-846,0,3,"Abbing, Mr. Anthony",male,42,0,0,C.A. 5547,7.55,,S
-847,0,3,"Sage, Mr. Douglas Bullen",male,,8,2,CA. 2343,69.55,,S
-848,0,3,"Markoff, Mr. Marin",male,35,0,0,349213,7.8958,,C
-849,0,2,"Harper, Rev. John",male,28,0,1,248727,33,,S
-850,1,1,"Goldenberg, Mrs. Samuel L (Edwiga Grabowska)",female,,1,0,17453,89.1042,C92,C
-851,0,3,"Andersson, Master. Sigvard Harald Elias",male,4,4,2,347082,31.275,,S
-852,0,3,"Svensson, Mr. Johan",male,74,0,0,347060,7.775,,S
-853,0,3,"Boulos, Miss. Nourelain",female,9,1,1,2678,15.2458,,C
-854,1,1,"Lines, Miss. Mary Conover",female,16,0,1,PC 17592,39.4,D28,S
-855,0,2,"Carter, Mrs. Ernest Courtenay (Lilian Hughes)",female,44,1,0,244252,26,,S
-856,1,3,"Aks, Mrs. Sam (Leah Rosen)",female,18,0,1,392091,9.35,,S
-857,1,1,"Wick, Mrs. George Dennick (Mary Hitchcock)",female,45,1,1,36928,164.8667,,S
-858,1,1,"Daly, Mr. Peter Denis ",male,51,0,0,113055,26.55,E17,S
-859,1,3,"Baclini, Mrs. Solomon (Latifa Qurban)",female,24,0,3,2666,19.2583,,C
-860,0,3,"Razi, Mr. Raihed",male,,0,0,2629,7.2292,,C
-861,0,3,"Hansen, Mr. Claus Peter",male,41,2,0,350026,14.1083,,S
-862,0,2,"Giles, Mr. Frederick Edward",male,21,1,0,28134,11.5,,S
-863,1,1,"Swift, Mrs. Frederick Joel (Margaret Welles Barron)",female,48,0,0,17466,25.9292,D17,S
-864,0,3,"Sage, Miss. Dorothy Edith ""Dolly""",female,,8,2,CA. 2343,69.55,,S
-865,0,2,"Gill, Mr. John William",male,24,0,0,233866,13,,S
-866,1,2,"Bystrom, Mrs. (Karolina)",female,42,0,0,236852,13,,S
-867,1,2,"Duran y More, Miss. Asuncion",female,27,1,0,SC/PARIS 2149,13.8583,,C
-868,0,1,"Roebling, Mr. Washington Augustus II",male,31,0,0,PC 17590,50.4958,A24,S
-869,0,3,"van Melkebeke, Mr. Philemon",male,,0,0,345777,9.5,,S
-870,1,3,"Johnson, Master. Harold Theodor",male,4,1,1,347742,11.1333,,S
-871,0,3,"Balkic, Mr. Cerin",male,26,0,0,349248,7.8958,,S
-872,1,1,"Beckwith, Mrs. Richard Leonard (Sallie Monypeny)",female,47,1,1,11751,52.5542,D35,S
-873,0,1,"Carlsson, Mr. Frans Olof",male,33,0,0,695,5,B51 B53 B55,S
-874,0,3,"Vander Cruyssen, Mr. Victor",male,47,0,0,345765,9,,S
-875,1,2,"Abelson, Mrs. Samuel (Hannah Wizosky)",female,28,1,0,P/PP 3381,24,,C
-876,1,3,"Najib, Miss. Adele Kiamie ""Jane""",female,15,0,0,2667,7.225,,C
-877,0,3,"Gustafsson, Mr. Alfred Ossian",male,20,0,0,7534,9.8458,,S
-878,0,3,"Petroff, Mr. Nedelio",male,19,0,0,349212,7.8958,,S
-879,0,3,"Laleff, Mr. Kristo",male,,0,0,349217,7.8958,,S
-880,1,1,"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)",female,56,0,1,11767,83.1583,C50,C
-881,1,2,"Shelley, Mrs. William (Imanita Parrish Hall)",female,25,0,1,230433,26,,S
-882,0,3,"Markun, Mr. Johann",male,33,0,0,349257,7.8958,,S
-883,0,3,"Dahlberg, Miss. Gerda Ulrika",female,22,0,0,7552,10.5167,,S
-884,0,2,"Banfield, Mr. Frederick James",male,28,0,0,C.A./SOTON 34068,10.5,,S
-885,0,3,"Sutehall, Mr. Henry Jr",male,25,0,0,SOTON/OQ 392076,7.05,,S
-886,0,3,"Rice, Mrs. William (Margaret Norton)",female,39,0,5,382652,29.125,,Q
-887,0,2,"Montvila, Rev. Juozas",male,27,0,0,211536,13,,S
-888,1,1,"Graham, Miss. Margaret Edith",female,19,0,0,112053,30,B42,S
-889,0,3,"Johnston, Miss. Catherine Helen ""Carrie""",female,,1,2,W./C. 6607,23.45,,S
-890,1,1,"Behr, Mr. Karl Howell",male,26,0,0,111369,30,C148,C
-891,0,3,"Dooley, Mr. Patrick",male,32,0,0,370376,7.75,,Q
diff --git a/alphapy/examples/NCAAB/config/algos.yml b/alphapy/examples/NCAAB/config/algos.yml
deleted file mode 100644
index 73155fe..0000000
--- a/alphapy/examples/NCAAB/config/algos.yml
+++ /dev/null
@@ -1,250 +0,0 @@
-#
-# Algorithms
-#
-
-AB:
- # AdaBoost
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "random_state" : seed}
- grid : {"n_estimators" : [10, 50, 100, 150, 200],
- "learning_rate" : [0.2, 0.5, 0.7, 1.0, 1.5, 2.0],
- "algorithm" : ['SAMME', 'SAMME.R']}
- scoring : True
-
-GB:
- # Gradient Boosting
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "max_depth" : 3,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"loss" : ['deviance', 'exponential'],
- "learning_rate" : [0.05, 0.1, 0.15],
- "n_estimators" : [50, 100, 200],
- "max_depth" : [3, 5, 10],
- "min_samples_split" : [2, 3],
- "min_samples_leaf" : [1, 2]}
- scoring : True
-
-GBR:
- # Gradient Boosting Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {}
- scoring : False
-
-KNN:
- # K-Nearest Neighbors
- model_type : classification
- params : {"n_jobs" : n_jobs}
- grid : {"n_neighbors" : [3, 5, 7, 10],
- "weights" : ['uniform', 'distance'],
- "algorithm" : ['ball_tree', 'kd_tree', 'brute', 'auto'],
- "leaf_size" : [10, 20, 30, 40, 50]}
- scoring : False
-
-KNR:
- # K-Nearest Neighbor Regression
- model_type : regression
- params : {"n_jobs" : n_jobs}
- grid : {}
- scoring : False
-
-LOGR:
- # Logistic Regression
- model_type : classification
- params : {"random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"penalty" : ['l2'],
- "C" : [0.00001, 0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 1e4, 1e5, 1e6, 1e7],
- "fit_intercept" : [True, False],
- "solver" : ['newton-cg', 'lbfgs', 'liblinear', 'sag']}
- scoring : True
-
-LR:
- # Linear Regression
- model_type : regression
- params : {"n_jobs" : n_jobs}
- grid : {"fit_intercept" : [True, False],
- "normalize" : [True, False],
- "copy_X" : [True, False]}
- scoring : False
-
-LSVC:
- # Linear Support Vector Classification
- model_type : classification
- params : {"C" : 0.01,
- "max_iter" : 2000,
- "penalty" : 'l1',
- "dual" : False,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "penalty" : ['l1', 'l2'],
- "dual" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "max_iter" : [500, 1000, 2000]}
- scoring : False
-
-LSVM:
- # Linear Support Vector Machine
- model_type : classification
- params : {"kernel" : 'linear',
- "probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-NB:
- # Naive Bayes
- model_type : classification
- params : {}
- grid : {"alpha" : [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0, 5.0, 10.0],
- "fit_prior" : [True, False]}
- scoring : True
-
-RBF:
- # Radial Basis Function
- model_type : classification
- params : {"kernel" : 'rbf',
- "probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-RF:
- # Random Forest
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "max_depth" : 10,
- "min_samples_split" : 5,
- "min_samples_leaf" : 3,
- "bootstrap" : True,
- "criterion" : 'entropy',
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"n_estimators" : [21, 51, 101, 201, 501],
- "max_depth" : [5, 7, 10, 20],
- "min_samples_split" : [2, 3, 5, 10],
- "min_samples_leaf" : [1, 2, 3],
- "bootstrap" : [True, False],
- "criterion" : ['gini', 'entropy']}
- scoring : True
-
-RFR:
- # Random Forest Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {}
- scoring : False
-
-SVM:
- # Support Vector Machine
- model_type : classification
- params : {"probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-XGB:
- # XGBoost Binary
- model_type : classification
- params : {"objective" : 'binary:logistic',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 6,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {"n_estimators" : [21, 51, 101, 201, 501],
- "max_depth" : [5, 6, 7, 8, 9, 10, 12, 15, 20],
- "learning_rate" : [0.01, 0.02, 0.05, 0.1, 0.2],
- "min_child_weight" : [1.0, 1.1],
- "subsample" : [0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
- "colsample_bytree" : [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]}
- scoring : False
-
-XGBM:
- # XGBoost Multiclass
- model_type : multiclass
- params : {"objective" : 'multi:softmax',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 10,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {}
- scoring : False
-
-XGBR:
- # XGBoost Regression
- model_type : regression
- params : {"objective" : 'reg:linear',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 10,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "seed" : seed,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {}
- scoring : False
-
-XT:
- # Extra Trees
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"n_estimators" : [21, 51, 101, 201, 501, 1001, 2001],
- "max_features" : ['auto', 'sqrt', 'log2'],
- "max_depth" : [3, 5, 7, 10, 20, 30],
- "min_samples_split" : [2, 3],
- "min_samples_leaf" : [1, 2],
- "bootstrap" : [True, False],
- "warm_start" : [True, False]}
- scoring : True
-
-XTR:
- # Extra Trees Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {}
- scoring : False
diff --git a/alphapy/examples/NCAAB/config/model.yml b/alphapy/examples/NCAAB/config/model.yml
deleted file mode 100644
index f1352be..0000000
--- a/alphapy/examples/NCAAB/config/model.yml
+++ /dev/null
@@ -1,113 +0,0 @@
-project:
- directory : .
- file_extension : csv
- submission_file :
- submit_probas : False
-
-data:
- drop : ['Unnamed: 0', 'index', 'season', 'date', 'home.team', 'away.team',
- 'home.score', 'away.score', 'total_points', 'point_margin_game',
- 'won_on_points', 'lost_on_points', 'cover_margin_game',
- 'lost_on_spread', 'overunder_margin', 'over', 'under']
- features : '*'
- sampling :
- option : False
- method : under_random
- ratio : 0.0
- sentinel : -1
- separator : ','
- shuffle : False
- split : 0.4
- target : won_on_spread
- target_value : True
-
-model:
- algorithms : ['RF', 'XGB']
- balance_classes : False
- calibration :
- option : False
- type : isotonic
- cv_folds : 3
- estimators : 201
- feature_selection :
- option : False
- percentage : 50
- uni_grid : [5, 10, 15, 20, 25]
- score_func : f_classif
- grid_search :
- option : True
- iterations : 50
- random : True
- subsample : False
- sampling_pct : 0.25
- pvalue_level : 0.01
- rfe :
- option : True
- step : 5
- scoring_function : 'roc_auc'
- type : classification
-
-features:
- clustering :
- option : False
- increment : 3
- maximum : 30
- minimum : 3
- counts :
- option : False
- encoding :
- rounding : 3
- type : factorize
- factors : ['line', 'delta.wins', 'delta.losses', 'delta.ties',
- 'delta.point_win_streak', 'delta.point_loss_streak',
- 'delta.cover_win_streak', 'delta.cover_loss_streak',
- 'delta.over_streak', 'delta.under_streak']
- interactions :
- option : True
- poly_degree : 2
- sampling_pct : 5
- isomap :
- option : False
- components : 2
- neighbors : 5
- logtransform :
- option : False
- numpy :
- option : False
- pca :
- option : False
- increment : 3
- maximum : 15
- minimum : 3
- whiten : False
- scaling :
- option : True
- type : standard
- scipy :
- option : False
- text :
- ngrams : 1
- vectorize : False
- tsne :
- option : False
- components : 2
- learning_rate : 1000.0
- perplexity : 30.0
- variance :
- option : True
- threshold : 0.1
-
-pipeline:
- number_jobs : -1
- seed : 13201
- verbosity : 0
-
-plots:
- calibration : True
- confusion_matrix : True
- importances : True
- learning_curve : True
- roc_curve : True
-
-xgboost:
- stopping_rounds : 30
diff --git a/alphapy/examples/NCAAB/config/sport.yml b/alphapy/examples/NCAAB/config/sport.yml
deleted file mode 100644
index 9a38610..0000000
--- a/alphapy/examples/NCAAB/config/sport.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-sport:
- league : NCAAB
- points_max : 100
- points_min : 50
- random_scoring : False
- seasons : []
- rolling_window : 3
diff --git a/alphapy/examples/NCAAB/data/ncaab_game_scores_1g.csv b/alphapy/examples/NCAAB/data/ncaab_game_scores_1g.csv
deleted file mode 100644
index 12591a5..0000000
--- a/alphapy/examples/NCAAB/data/ncaab_game_scores_1g.csv
+++ /dev/null
@@ -1,4020 +0,0 @@
-season,date,away.team,away.score,home.team,home.score,line,over_under
-2015,2015-11-13,COLO,62,ISU,68,-10.0,151.0
-2015,2015-11-13,SDAK,69,WRST,77,-6.5,136.0
-2015,2015-11-13,WAG,57,SJU,66,-5.5,142.0
-2015,2015-11-13,JVST,83,CMU,89,-18.0,142.5
-2015,2015-11-13,NIAG,50,ODU,67,-18.0,132.0
-2015,2015-11-13,ALBY,65,UK,78,-20.0,132.5
-2015,2015-11-13,TEM,67,UNC,91,-9.5,145.0
-2015,2015-11-13,NKU,61,WVU,107,-23.5,147.5
-2015,2015-11-13,SIE,74,DUKE,92,-24.0,155.0
-2015,2015-11-13,WCU,72,CIN,97,-20.0,132.0
-2015,2015-11-13,MSM,56,MD,80,-21.5,140.0
-2015,2015-11-13,CHAT,92,UGA,90,-10.5,136.0
-2015,2015-11-13,SEMO,53,DAY,84,-19.0,140.0
-2015,2015-11-13,DART,67,HALL,84,-11.0,136.0
-2015,2015-11-13,CAN,85,HOF,96,-10.5,150.5
-2015,2015-11-13,JMU,87,RICH,75,-9.0,137.5
-2015,2015-11-13,EIU,49,IND,88,-25.0,150.0
-2015,2015-11-13,FAU,55,MSU,82,-23.5,141.0
-2015,2015-11-13,SAM,45,LOU,86,-23.0,142.0
-2015,2015-11-13,MIOH,72,XAV,81,-15.5,144.5
-2015,2015-11-13,PRIN,64,RID,56,1.0,137.0
-2015,2015-11-13,IUPU,72,INST,70,-8.0,135.5
-2015,2015-11-13,SAC,66,ASU,63,-18.0,144.0
-2015,2015-11-13,AFA,75,SIU,77,-5.5,131.0
-2015,2015-11-13,UNCO,72,KU,109,-29.0,147.5
-2015,2015-11-13,BALL,53,BRAD,54,3.0,135.0
-2015,2015-11-13,USD,45,USC,83,-12.5,140.0
-2015,2015-11-13,UTM,57,OKST,91,-12.0,141.5
-2015,2015-11-13,COR,81,GT,116,-17.0,130.0
-2015,2015-11-13,MOST,65,ORU,80,-4.5,133.5
-2015,2015-11-13,DREX,81,JOES,82,-9.5,127.5
-2015,2015-11-13,WMRY,85,NCST,68,-12.5,149.0
-2015,2015-11-13,SF,78,UIC,75,1.5,148.5
-2015,2015-11-13,PEAY,41,VAN,80,-24.5,144.0
-2015,2015-11-13,CSN,71,NIU,83,-9.5,134.5
-2015,2015-11-13,UCSB,60,OMA,59,-2.5,157.5
-2015,2015-11-13,UTSA,64,LOYI,76,-14.0,138.5
-2015,2015-11-13,BRWN,65,SPU,77,-2.0,130.5
-2015,2015-11-13,NAU,70,WSU,82,-10.5,145.0
-2015,2015-11-13,TROY,82,SF,77,-8.0,138.5
-2015,2015-11-13,ELON,85,CHAR,74,-5.0,146.5
-2015,2015-11-13,NDSU,79,UCD,71,3.0,132.5
-2015,2015-11-13,IPFW,64,VALP,78,-17.0,137.0
-2015,2015-11-13,USU,73,WEB,70,-2.5,141.5
-2015,2015-11-13,BEL,83,MARQ,80,-6.0,144.5
-2015,2015-11-13,GB,89,STAN,93,-8.0,144.0
-2015,2015-11-13,WOF,74,MIZ,83,-2.5,125.0
-2015,2015-11-13,ARST,70,SIUE,79,4.5,140.5
-2015,2015-11-13,BSU,72,MONT,74,5.0,134.5
-2015,2015-11-13,WIU,69,WIS,67,-25.5,133.5
-2015,2015-11-13,EWU,88,MSST,106,-10.5,151.5
-2015,2015-11-13,FLA,59,NAVY,41,13.0,132.5
-2015,2015-11-13,PAC,61,ARIZ,79,-23.0,137.5
-2015,2015-11-13,UAB,74,AUB,75,2.5,150.0
-2015,2015-11-13,ILST,60,SDSU,71,-9.5,128.0
-2015,2015-11-13,PEPP,66,FRES,69,-2.5,136.5
-2015,2015-11-13,CSF,74,LMU,79,-2.0,139.5
-2015,2015-11-13,LIP,65,SCU,63,-7.5,145.0
-2015,2015-11-13,CP,72,UNLV,74,-6.5,138.5
-2015,2015-11-13,SUU,71,UTAH,82,-24.0,141.5
-2015,2015-11-13,MONM,84,UCLA,81,-14.0,144.0
-2015,2015-11-13,TEX,71,WASH,77,11.0,151.0
-2015,2015-11-13,MILW,71,DEN,58,5.0,129.5
-2015,2015-11-13,RICE,65,CAL,97,-16.5,136.5
-2015,2015-11-13,CCAR,56,NEV,73,2.5,140.0
-2015,2015-11-13,MTST,76,HAW,87,-14.5,148.5
-2015,2015-11-14,CSU,84,UNI,78,-7.5,137.0
-2015,2015-11-14,VMI,50,PSU,62,-13.5,150.0
-2015,2015-11-14,TOWS,76,LAS,78,-5.5,134.0
-2015,2015-11-14,SDAK,65,NIU,72,-6.5,141.0
-2015,2015-11-14,HARV,64,PROV,76,-10.0,134.0
-2015,2015-11-14,CSN,72,WRST,67,-8.5,140.0
-2015,2015-11-14,YSU,70,KENT,79,-13.5,143.0
-2015,2015-11-14,CIT,71,BUT,144,-29.5,147.0
-2015,2015-11-14,UCF,85,DAV,90,-16.0,154.0
-2015,2015-11-14,USM,49,MEM,67,-19.0,140.5
-2015,2015-11-14,FOR,72,UTA,77,-2.5,144.5
-2015,2015-11-14,WMU,63,DEP,69,-5.5,148.0
-2015,2015-11-14,IDHO,74,SJSU,54,2.0,144.0
-2015,2015-11-14,DEN,55,SCU,33,-6.0,127.5
-2015,2015-11-14,AKR,65,CLEV,53,9.5,136.0
-2015,2015-11-14,LIP,65,MILW,71,-7.0,146.0
-2015,2015-11-14,NJIT,57,UK,87,-22.5,142.5
-2015,2015-11-15,MSM,54,OSU,76,-13.0,138.0
-2015,2015-11-15,WAKE,90,BUCK,82,-4.0,152.0
-2015,2015-11-15,UTSA,45,CLEM,78,-17.5,134.5
-2015,2015-11-15,IONA,58,VALP,83,-7.5,152.5
-2015,2015-11-15,NDSU,74,ILL,80,-5.5,137.0
-2015,2015-11-15,LIP,69,DEN,82,-3.0,131.5
-2015,2015-11-15,ULM,56,MINN,67,-9.0,137.5
-2015,2015-11-15,SEMO,65,EVAN,80,-20.0,147.5
-2015,2015-11-15,FAIR,65,UNC,92,-24.5,146.5
-2015,2015-11-15,WRST,59,NIU,65,-2.5,133.0
-2015,2015-11-15,NIAG,62,JOES,73,-16.0,142.5
-2015,2015-11-15,MILW,71,SCU,65,4.0,133.0
-2015,2015-11-15,USA,70,NCST,88,-15.0,152.5
-2015,2015-11-15,PORT,66,UCD,79,-3.5,145.0
-2015,2015-11-15,SIE,65,WIS,92,-14.0,140.5
-2015,2015-11-15,LMU,53,UCI,77,-13.0,139.0
-2015,2015-11-15,CCAR,63,HAW,74,-6.5,148.0
-2015,2015-11-15,CP,83,UCLA,88,-7.5,141.5
-2015,2015-11-15,SDAK,76,CSN,72,2.5,147.5
-2015,2015-11-15,NEV,83,MTST,62,9.0,147.5
-2015,2015-11-16,WYO,55,INST,70,-5.0,132.5
-2015,2015-11-16,BUFF,58,ODU,77,-10.5,135.5
-2015,2015-11-16,JMU,73,WVU,86,-11.5,152.5
-2015,2015-11-16,GMU,60,MER,69,-7.5,137.0
-2015,2015-11-16,TENN,67,GT,69,-7.0,148.0
-2015,2015-11-16,ULL,77,MIA,93,-11.0,148.5
-2015,2015-11-16,ELON,68,MICH,88,-19.0,142.5
-2015,2015-11-16,PEAY,76,IND,102,-30.5,156.5
-2015,2015-11-16,CHAR,74,ECU,88,-7.5,144.5
-2015,2015-11-16,TNST,67,OHIO,75,-6.0,142.0
-2015,2015-11-16,EKY,59,UNCW,78,-6.0,153.0
-2015,2015-11-16,EIU,56,BALL,73,-7.0,134.0
-2015,2015-11-16,UVA,68,GW,73,6.5,125.5
-2015,2015-11-16,ORU,66,SC,84,-14.0,146.0
-2015,2015-11-16,BRAD,60,ARIZ,90,-28.0,134.5
-2015,2015-11-16,MORE,66,ILST,67,-11.0,148.0
-2015,2015-11-16,GASO,72,MISS,82,-16.5,147.0
-2015,2015-11-16,DRKE,74,TULN,79,-1.0,128.5
-2015,2015-11-16,WEB,68,SDKS,85,-5.5,144.5
-2015,2015-11-16,TNTC,70,AFA,80,-8.5,145.0
-2015,2015-11-16,IUPU,71,MARQ,75,-13.5,138.0
-2015,2015-11-16,CLMB,71,KSU,81,-4.5,130.0
-2015,2015-11-16,NAU,81,BSU,101,-17.0,146.0
-2015,2015-11-16,SDSU,76,UTAH,81,-5.0,132.5
-2015,2015-11-16,MONM,90,USC,101,-10.5,148.0
-2015,2015-11-16,BEL,74,ASU,83,-4.5,154.5
-2015,2015-11-16,RICE,54,SF,80,-4.5,147.0
-2015,2015-11-16,MONT,61,SJSU,64,12.0,131.5
-2015,2015-11-16,UCSB,67,CAL,85,-16.0,147.0
-2015,2015-11-16,MAN,63,SMC,89,-9.5,137.5
-2015,2015-11-16,BAY,67,ORE,74,2.0,150.0
-2015,2015-11-16,BYU,65,LBSU,66,4.5,163.0
-2015,2015-11-16,NEV,75,HAW,76,-5.0,146.5
-2015,2015-11-16,KENN,69,LSU,91,-23.5,154.0
-2015,2015-11-17,UK,74,DUKE,63,1.0,159.5
-2015,2015-11-17,GTWN,71,MD,75,-9.0,138.5
-2015,2015-11-17,KU,73,MSU,79,4.5,152.5
-2015,2015-11-17,MIZ,66,XAV,78,-13.5,143.0
-2015,2015-11-17,GRAM,55,OSU,82,-38.5,144.0
-2015,2015-11-17,RID,60,LAS,73,-4.0,139.5
-2015,2015-11-17,FUR,79,APP,70,-3.5,137.5
-2015,2015-11-17,SBON,66,SYR,79,-9.0,133.5
-2015,2015-11-17,MILW,78,ND,86,-16.0,148.5
-2015,2015-11-17,DART,63,MRST,73,2.5,136.5
-2015,2015-11-17,UMASS,69,HARV,63,-3.5,142.5
-2015,2015-11-17,USD,62,WMU,74,-10.0,136.0
-2015,2015-11-17,GB,90,ETSU,103,-1.5,146.5
-2015,2015-11-17,SFA,60,UNI,70,-3.5,139.5
-2015,2015-11-17,VALP,58,URI,55,-1.0,134.5
-2015,2015-11-17,ALA,48,DAY,80,-10.0,142.5
-2015,2015-11-17,COLO,91,AUB,84,-1.0,148.5
-2015,2015-11-17,OKLA,84,MEM,78,4.5,150.0
-2015,2015-11-17,DEP,62,PSU,68,-5.0,135.5
-2015,2015-11-17,UTA,68,LT,80,-6.5,152.5
-2015,2015-11-17,WICH,67,TLSA,77,4.5,141.5
-2015,2015-11-17,UND,64,WIS,78,-26.0,141.0
-2015,2015-11-17,UTSA,78,CREI,103,-19.0,153.0
-2015,2015-11-17,MTSU,65,MURR,76,-2.0,139.5
-2015,2015-11-17,UIC,57,WIU,84,-7.0,148.5
-2015,2015-11-17,NEB,63,NOVA,87,-18.5,141.0
-2015,2015-11-17,CSF,77,PAC,76,-7.0,142.5
-2015,2015-11-17,IONA,73,ORST,93,-7.0,144.5
-2015,2015-11-18,BUFF,67,JOES,89,-8.5,147.5
-2015,2015-11-18,ILL,59,PROV,60,-7.0,147.0
-2015,2015-11-18,CIN,83,BGSU,50,12.5,146.0
-2015,2015-11-18,WOF,58,UNC,78,-23.0,153.5
-2015,2015-11-18,RICH,91,WAKE,82,0.0,147.0
-2015,2015-11-18,IUPU,56,NCST,79,-13.0,147.5
-2015,2015-11-18,EMU,81,OAK,91,-6.0,153.5
-2015,2015-11-18,JVST,62,VT,71,-12.0,149.0
-2015,2015-11-18,UCI,61,UCF,60,5.0,149.0
-2015,2015-11-18,WKU,85,BEL,90,-9.0,156.5
-2015,2015-11-18,TOL,100,YSU,78,3.0,161.5
-2015,2015-11-18,BRWN,66,NIAG,75,3.5,147.0
-2015,2015-11-18,FAIR,72,NW,79,-15.0,140.0
-2015,2015-11-18,AKR,88,ARK,80,-6.5,152.0
-2015,2015-11-18,KENT,69,SIU,72,-1.5,142.0
-2015,2015-11-18,IPFW,80,PEAY,77,2.5,152.0
-2015,2015-11-18,SLU,70,SIUE,60,6.5,142.5
-2015,2015-11-18,KENN,53,ASU,91,-21.0,150.0
-2015,2015-11-18,LOYI,51,UNM,75,-6.5,139.5
-2015,2015-11-18,NAU,52,GONZ,91,-25.5,158.5
-2015,2015-11-18,SUU,64,UNLV,84,-13.5,150.5
-2015,2015-11-19,RUTG,59,SJU,61,-6.5,141.5
-2015,2015-11-19,GW,73,SF,67,9.5,142.5
-2015,2015-11-19,LBSU,80,HALL,77,-4.5,147.5
-2015,2015-11-19,MRSH,74,TENN,84,-13.5,160.0
-2015,2015-11-19,FUR,68,CHAR,77,3.0,148.5
-2015,2015-11-19,SDKS,83,ILST,67,-4.5,149.5
-2015,2015-11-19,UAB,79,TROY,63,6.0,152.0
-2015,2015-11-19,BSU,76,ARIZ,88,-12.5,153.0
-2015,2015-11-19,TEM,75,MINN,70,-1.0,142.0
-2015,2015-11-19,MISS,62,GMU,68,12.5,142.0
-2015,2015-11-19,MIA,105,MSST,79,10.0,150.0
-2015,2015-11-19,CREI,65,IND,86,-12.5,166.0
-2015,2015-11-19,GB,77,GT,107,-12.5,159.5
-2015,2015-11-19,IOWA,89,MARQ,61,4.0,146.5
-2015,2015-11-19,USA,66,LSU,78,-18.0,161.0
-2015,2015-11-19,LMU,75,CSU,83,-15.5,149.0
-2015,2015-11-19,ORST,77,RICE,69,10.0,141.0
-2015,2015-11-19,UVA,82,BRAD,57,24.0,127.5
-2015,2015-11-19,SF,71,FRES,78,-10.0,151.5
-2015,2015-11-19,SCU,63,UCRV,77,-7.5,133.0
-2015,2015-11-19,PEPP,67,UCLA,81,-7.0,153.0
-2015,2015-11-19,SMU,85,STAN,70,5.5,145.5
-2015,2015-11-19,BUT,93,MOST,59,17.5,141.0
-2015,2015-11-19,UTAH,73,TTU,63,9.0,141.5
-2015,2015-11-19,OKST,69,TOWS,52,8.5,145.5
-2015,2015-11-20,OHIO,88,TLSA,90,-11.5,145.0
-2015,2015-11-20,ORU,70,UTM,66,3.5,151.0
-2015,2015-11-20,GMU,71,OKST,68,-9.5,133.5
-2015,2015-11-20,TEM,69,BUT,74,-8.5,143.5
-2015,2015-11-20,HOF,82,FSU,77,-7.5,169.0
-2015,2015-11-20,FIU,61,JMU,64,-12.0,142.0
-2015,2015-11-20,MISS,76,TOWS,60,8.0,146.0
-2015,2015-11-20,WIS,61,GTWN,71,2.0,135.0
-2015,2015-11-20,NE,60,FAU,58,11.5,141.5
-2015,2015-11-20,MSST,72,TTU,74,-3.0,148.0
-2015,2015-11-20,DEP,61,SC,76,-7.5,145.0
-2015,2015-11-20,BALL,81,EKY,89,-2.0,143.0
-2015,2015-11-20,UTA,73,OSU,68,-18.5,152.0
-2015,2015-11-20,PSU,52,DUQ,78,-2.5,144.0
-2015,2015-11-20,RID,58,MD,65,-19.0,141.0
-2015,2015-11-20,ETSU,51,NOVA,86,-24.5,161.5
-2015,2015-11-20,MURR,52,UGA,63,-7.5,149.0
-2015,2015-11-20,DEL,77,IONA,92,-9.0,163.5
-2015,2015-11-20,MIA,90,UTAH,66,3.0,151.5
-2015,2015-11-20,HALL,67,BRAD,59,11.5,141.0
-2015,2015-11-20,SDAK,72,KSU,93,-13.5,145.0
-2015,2015-11-20,WRST,63,UK,78,-25.5,138.0
-2015,2015-11-20,CLMB,80,NW,83,-5.5,139.5
-2015,2015-11-20,ULL,93,ALA,105,1.5,152.5
-2015,2015-11-20,DET,79,PITT,95,-17.5,145.5
-2015,2015-11-20,XAV,86,MICH,70,-5.0,145.0
-2015,2015-11-20,PORT,63,COLO,85,-13.5,152.0
-2015,2015-11-20,GASO,62,AUB,92,-11.5,152.5
-2015,2015-11-20,LBSU,52,UVA,87,-16.0,138.5
-2015,2015-11-20,SJSU,69,MTST,81,-7.0,141.0
-2015,2015-11-20,IDST,67,WSU,85,-19.0,157.0
-2015,2015-11-20,ECU,62,CAL,70,-20.0,149.0
-2015,2015-11-20,MOST,69,MINN,74,-11.0,140.5
-2015,2015-11-20,NORF,61,INST,70,-5.5,148.0
-2015,2015-11-20,UTM,66,ORU,70,-4.0,152.0
-2015,2015-11-20,VCU,71,DUKE,79,-10.0,153.0
-2015,2015-11-20,LIP,68,MIOH,70,-9.0,148.5
-2015,2015-11-20,ODU,39,PUR,61,-8.5,139.5
-2015,2015-11-20,JOES,63,FLA,74,-5.5,147.0
-2015,2015-11-21,FAU,75,MIOH,69,-7.5,142.0
-2015,2015-11-21,FUR,58,CONN,83,-18.0,140.0
-2015,2015-11-21,COFC,81,DAV,82,-15.0,151.0
-2015,2015-11-21,NE,79,LIP,67,9.5,144.0
-2015,2015-11-21,BEL,88,EVAN,93,-5.5,160.0
-2015,2015-11-21,UNC,67,UNI,71,6.5,149.5
-2015,2015-11-21,WMRY,66,DAY,69,-10.5,146.5
-2015,2015-11-21,SDKS,76,TCU,67,-1.0,150.0
-2015,2015-11-21,MONM,82,DREX,74,4.0,145.0
-2015,2015-11-21,SIUE,67,IPFW,87,-11.0,146.0
-2015,2015-11-21,PENN,67,WASH,104,-12.5,153.0
-2015,2015-11-21,COR,62,CAN,87,-11.0,157.0
-2015,2015-11-21,UALR,49,SDSU,43,-17.0,140.0
-2015,2015-11-21,BGSU,59,UND,77,3.5,145.5
-2015,2015-11-21,PEAY,64,CP,73,-13.5,148.0
-2015,2015-11-21,NIAG,67,UVM,85,-7.5,146.5
-2015,2015-11-21,ORU,74,JMU,64,-7.5,153.5
-2015,2015-11-21,ORST,71,UCSB,59,2.0,138.5
-2015,2015-11-21,TOL,62,LOYI,69,-5.0,149.0
-2015,2015-11-21,USD,55,CSF,67,-6.0,143.5
-2015,2015-11-21,BRWN,73,PROV,94,-14.5,144.5
-2015,2015-11-21,VMI,52,VT,76,-9.0,151.5
-2015,2015-11-21,ELON,55,SYR,66,-17.0,145.0
-2015,2015-11-21,UNCG,54,UCF,65,-6.0,147.5
-2015,2015-11-21,UMBC,81,UNCO,72,-9.0,149.5
-2015,2015-11-21,WMU,76,UNCW,80,-4.5,144.0
-2015,2015-11-21,MRST,72,KENT,79,-12.0,141.0
-2015,2015-11-21,MORE,64,NKU,56,5.0,148.5
-2015,2015-11-21,CLEV,45,URI,73,-15.0,131.0
-2015,2015-11-21,BUFF,86,NCAT,68,10.5,145.5
-2015,2015-11-21,UTM,62,FIU,69,0.0,143.0
-2015,2015-11-21,MTSU,69,TNST,66,4.5,139.0
-2015,2015-11-21,WIU,83,EIU,63,4.0,137.5
-2015,2015-11-21,CHAT,81,ILL,77,-5.5,146.0
-2015,2015-11-21,UTSA,82,SUU,79,-8.0,156.0
-2015,2015-11-21,SPU,72,PRIN,75,-11.0,134.5
-2015,2015-11-21,TXST,62,UTEP,77,-6.5,132.5
-2015,2015-11-21,UCRV,57,SF,58,-5.5,145.5
-2015,2015-11-21,NEV,85,PAC,82,3.0,141.0
-2015,2015-11-21,UNM,82,USC,90,-6.5,147.5
-2015,2015-11-21,NORF,71,OHIO,93,-4.5,149.5
-2015,2015-11-21,DEP,67,FSU,83,-9.5,153.0
-2015,2015-11-21,YSU,101,FGCU,104,-6.5,159.0
-2015,2015-11-21,UVM,85,NIAG,67,7.5,146.5
-2015,2015-11-21,FIU,69,UTM,62,0.0,143.0
-2015,2015-11-22,WEBB,64,TENN,89,-13.0,151.0
-2015,2015-11-22,LIP,79,FAU,65,-2.5,146.5
-2015,2015-11-22,MOST,70,MSST,84,-6.0,147.5
-2015,2015-11-22,ODU,64,JOES,66,1.5,132.0
-2015,2015-11-22,HARV,56,BC,69,-4.5,134.5
-2015,2015-11-22,ORU,76,FIU,70,4.5,140.5
-2015,2015-11-22,DUKE,86,GTWN,84,6.0,148.5
-2015,2015-11-22,TOWS,62,BRAD,60,3.5,133.5
-2015,2015-11-22,ETSU,69,GT,68,-16.0,161.0
-2015,2015-11-22,OMA,82,COLO,87,-18.0,160.5
-2015,2015-11-22,UTM,78,JMU,75,-11.0,142.5
-2015,2015-11-22,WIS,74,VCU,73,2.0,142.5
-2015,2015-11-22,OAK,89,CSU,95,-7.5,167.5
-2015,2015-11-22,WYO,82,MTST,83,7.0,139.0
-2015,2015-11-22,APP,48,TULN,76,-6.5,139.5
-2015,2015-11-22,AKR,56,NOVA,75,-16.0,143.0
-2015,2015-11-22,YALE,69,SMU,71,-13.5,139.0
-2015,2015-11-22,JVST,55,UAB,61,-16.5,141.5
-2015,2015-11-22,FLA,70,PUR,85,-6.0,142.0
-2015,2015-11-22,VALP,67,ORE,73,-6.5,142.5
-2015,2015-11-22,FRES,82,RICE,65,5.5,141.5
-2015,2015-11-22,NWST,42,ARIZ,61,-30.0,165.0
-2015,2015-11-22,OKST,82,LBSU,77,3.5,136.5
-2015,2015-11-22,BUT,75,MIA,85,-3.0,150.0
-2015,2015-11-22,BUFF,77,UVM,71,-3.5,146.5
-2015,2015-11-22,HOF,84,SC,94,-4.5,156.5
-2015,2015-11-22,GMU,66,UVA,83,-20.0,125.0
-2015,2015-11-22,STAN,61,SMC,78,-3.0,145.0
-2015,2015-11-22,SELA,65,NEB,92,-15.5,147.5
-2015,2015-11-22,AKR,56,NOVA,75,-16.0,143.0
-2015,2015-11-22,TEM,68,UTAH,74,-5.0,137.5
-2015,2015-11-22,HALL,75,MISS,63,-1.5,153.0
-2015,2015-11-22,TTU,81,MINN,68,-1.0,136.5
-2015,2015-11-22,NIAG,73,NCAT,72,5.5,140.5
-2015,2015-11-22,NE,61,MIOH,67,2.0,140.5
-2015,2015-11-22,CP,78,UMBC,65,13.5,138.5
-2015,2015-11-22,PEAY,91,UNCO,76,-2.0,155.0
-2015,2015-11-22,YSU,72,BGSU,79,-4.0,152.0
-2015,2015-11-22,UND,60,FGCU,73,-4.0,149.5
-2015,2015-11-22,INST,59,TLSA,67,-8.0,151.0
-2015,2015-11-23,WAKE,82,IND,78,-13.0,168.0
-2015,2015-11-23,SAM,83,TROY,79,-3.5,156.0
-2015,2015-11-23,IUPU,63,KENN,71,7.0,141.0
-2015,2015-11-23,INST,67,HOF,66,-6.5,156.5
-2015,2015-11-23,NORF,78,DEP,82,-8.0,144.5
-2015,2015-11-23,SJU,55,VAN,92,-14.5,136.0
-2015,2015-11-23,OHIO,81,FSU,90,-11.5,160.5
-2015,2015-11-23,LSU,80,MARQ,81,6.0,147.0
-2015,2015-11-23,EMU,65,MSU,89,-20.5,144.0
-2015,2015-11-23,BGSU,82,FGCU,77,-5.0,141.0
-2015,2015-11-23,CHAT,63,ISU,83,-16.0,161.0
-2015,2015-11-23,UTA,68,MEM,64,-13.0,153.5
-2015,2015-11-23,IDHO,65,UNT,63,-5.5,148.0
-2015,2015-11-23,NKU,66,XAV,78,-24.5,149.0
-2015,2015-11-23,CSN,61,USC,96,-18.5,160.5
-2015,2015-11-23,KU,123,CHAM,72,29.0,169.0
-2015,2015-11-23,TLSA,75,SC,83,-2.5,146.5
-2015,2015-11-23,CLEM,65,UMASS,82,7.5,136.0
-2015,2015-11-23,SCU,61,UCI,79,-16.5,127.5
-2015,2015-11-23,ECU,54,SDSU,79,-15.0,128.5
-2015,2015-11-23,SHSU,63,CAL,89,-20.5,144.5
-2015,2015-11-23,UNLV,75,UCLA,77,-3.5,160.5
-2015,2015-11-23,CREI,85,RUTG,75,12.0,152.5
-2015,2015-11-23,MURR,66,MILW,63,-1.0,145.0
-2015,2015-11-23,PEPP,84,DUQ,70,3.5,154.5
-2015,2015-11-23,YSU,79,UND,69,-3.0,159.5
-2015,2015-11-23,BEL,98,USA,85,10.5,167.5
-2015,2015-11-23,WKU,79,DRKE,81,5.0,141.5
-2015,2015-11-23,NJIT,76,PROV,83,-11.0,146.5
-2015,2015-11-23,MIZ,42,KSU,66,-5.5,144.5
-2015,2015-11-23,MER,71,DAV,77,-12.0,154.0
-2015,2015-11-23,CMU,60,WEB,63,2.0,152.0
-2015,2015-11-23,NW,69,UNC,80,-10.5,150.5
-2015,2015-11-23,NCST,76,ASU,79,1.5,149.0
-2015,2015-11-24,MRSH,61,MORE,85,-7.5,151.0
-2015,2015-11-24,SBON,77,CAN,73,-2.0,153.5
-2015,2015-11-24,IPFW,57,MIOH,53,-3.0,146.0
-2015,2015-11-24,VAN,86,WAKE,64,11.0,156.0
-2015,2015-11-24,NW,67,MIZ,62,7.0,136.0
-2015,2015-11-24,LT,82,OSU,74,-8.5,147.5
-2015,2015-11-24,AKR,63,GB,66,5.0,157.5
-2015,2015-11-24,OAK,88,SIU,97,-1.0,170.0
-2015,2015-11-24,MARQ,78,ASU,73,-4.0,149.0
-2015,2015-11-24,SAM,74,UNT,72,-5.0,149.5
-2015,2015-11-24,WEB,74,DRKE,58,6.5,139.0
-2015,2015-11-24,DUQ,96,MILW,92,0.0,154.5
-2015,2015-11-24,RID,52,CLEV,57,5.0,124.0
-2015,2015-11-24,SJU,73,IND,83,-20.5,155.5
-2015,2015-11-24,CMU,60,WKU,88,4.0,149.0
-2015,2015-11-24,USA,78,IUPU,68,2.0,146.5
-2015,2015-11-24,LSU,72,NCST,83,-1.0,151.5
-2015,2015-11-24,TCU,60,URI,66,-7.5,134.5
-2015,2015-11-24,RAD,86,PSU,74,-8.5,135.0
-2015,2015-11-24,IDHO,69,TROY,63,-1.5,150.0
-2015,2015-11-24,PEPP,55,MURR,59,4.0,141.5
-2015,2015-11-24,ARMY,80,TENN,95,-8.5,161.0
-2015,2015-11-24,WOF,59,CLMB,70,-8.5,137.5
-2015,2015-11-24,KSU,70,UNC,80,-10.5,148.5
-2015,2015-11-24,KU,92,UCLA,73,9.0,162.0
-2015,2015-11-24,UCD,79,SAC,84,-2.5,145.0
-2015,2015-11-24,BU,62,UK,82,-24.5,148.0
-2015,2015-11-24,CSF,80,SUU,66,-3.0,150.0
-2015,2015-11-24,VALP,63,ORST,57,1.0,134.5
-2015,2015-11-24,SDAK,92,HBU,68,19.5,154.5
-2015,2015-11-24,MD,77,ILST,66,10.0,138.0
-2015,2015-11-24,MILW,92,DUQ,96,-1.0,154.0
-2015,2015-11-24,CHAM,73,UNLV,93,-22.0,174.0
-2015,2015-11-24,BEL,80,KENN,55,14.5,160.5
-2015,2015-11-24,CREI,85,RUTG,75,12.0,153.5
-2015,2015-11-25,CMU,78,MILW,84,-1.0,148.5
-2015,2015-11-25,SYR,83,CHAR,70,15.0,140.0
-2015,2015-11-25,WKU,73,DUQ,81,-2.0,155.0
-2015,2015-11-25,SJU,100,CHAM,93,10.5,170.0
-2015,2015-11-25,UVM,62,FLA,86,-13.5,145.0
-2015,2015-11-25,SAM,75,IDHO,58,0.0,148.0
-2015,2015-11-25,SDKS,77,CLEV,66,12.0,140.5
-2015,2015-11-25,GAST,59,MISS,68,-5.5,142.0
-2015,2015-11-25,HP,46,UGA,49,-9.0,140.0
-2015,2015-11-25,TROY,86,UNT,74,-4.5,147.5
-2015,2015-11-25,IDST,69,DEN,79,-12.5,133.5
-2015,2015-11-25,ILST,60,TCU,71,2.5,141.0
-2015,2015-11-25,YALE,61,DUKE,80,-14.0,149.0
-2015,2015-11-25,GMU,67,MAN,69,2.5,140.0
-2015,2015-11-25,ARST,68,ORE,91,-21.5,149.5
-2015,2015-11-25,LAS,64,PENN,80,4.0,144.5
-2015,2015-11-25,TEX,73,TAMU,84,-4.0,144.0
-2015,2015-11-25,COR,49,PITT,93,-24.0,145.5
-2015,2015-11-25,WAKE,80,UCLA,77,-5.5,158.0
-2015,2015-11-25,PV,67,WIS,85,-28.0,140.5
-2015,2015-11-25,MONT,53,NDSU,73,-6.0,136.0
-2015,2015-11-25,MD,86,URI,63,5.5,134.5
-2015,2015-11-25,OMA,105,UNCO,85,5.0,164.5
-2015,2015-11-25,AFA,70,COLO,81,-14.5,140.5
-2015,2015-11-25,CSN,80,LMU,82,-6.0,146.5
-2015,2015-11-25,CONN,74,MICH,60,4.5,136.0
-2015,2015-11-25,CREI,97,UMASS,76,4.0,157.5
-2015,2015-11-25,PRST,73,NEV,76,-10.0,149.0
-2015,2015-11-25,VAN,63,KU,70,-3.0,152.5
-2015,2015-11-25,UCSB,68,SF,61,-2.0,140.5
-2015,2015-11-25,TOL,89,SJSU,74,14.5,148.0
-2015,2015-11-25,CLEM,76,RUTG,58,12.0,135.5
-2015,2015-11-25,USD,57,LOYI,67,-10.0,130.5
-2015,2015-11-25,GONZ,80,WASH,64,9.5,169.0
-2015,2015-11-25,RID,67,HBU,56,11.5,133.5
-2015,2015-11-25,IND,69,UNLV,72,7.5,157.0
-2015,2015-11-25,PEPP,53,DRKE,69,10.0,136.5
-2015,2015-11-25,CIT,95,GASO,90,-9.0,172.5
-2015,2015-11-25,MURR,59,WEB,75,1.0,136.5
-2015,2015-11-26,ALA,45,XAV,64,-10.5,150.0
-2015,2015-11-26,TAMU,62,GONZ,61,-5.0,151.0
-2015,2015-11-26,UALR,54,ECU,46,3.5,132.0
-2015,2015-11-26,SYR,79,CONN,76,-6.0,134.0
-2015,2015-11-26,STAN,45,NOVA,59,-17.0,147.5
-2015,2015-11-26,BC,68,MSU,99,-14.5,149.0
-2015,2015-11-26,EVAN,64,PROV,74,-2.0,150.5
-2015,2015-11-26,MTSU,75,UAA,72,8.5,143.0
-2015,2015-11-26,SCU,73,ARIZ,75,-23.5,135.5
-2015,2015-11-26,CAL,58,SDSU,72,4.5,135.0
-2015,2015-11-26,ARK,73,GT,83,-6.0,157.0
-2015,2015-11-26,WICH,69,USC,72,2.5,152.0
-2015,2015-11-26,UCI,64,BSU,71,-1.5,145.0
-2015,2015-11-26,WVU,67,RICH,59,7.0,161.0
-2015,2015-11-26,ND,68,MONM,70,9.0,152.5
-2015,2015-11-26,MER,71,TULN,61,5.0,134.5
-2015,2015-11-26,UNCA,85,DREX,66,-1.5,145.5
-2015,2015-11-26,IOWA,77,DAY,82,2.0,146.5
-2015,2015-11-26,WASH,70,TEX,82,-3.0,154.0
-2015,2015-11-26,CHAR,47,MICH,102,-13.5,149.0
-2015,2015-11-26,CLEM,76,RUTG,58,12.5,136.5
-2015,2015-11-27,ALST,58,CHAT,95,-10.0,149.5
-2015,2015-11-27,ALA,64,WICH,60,-9.5,137.5
-2015,2015-11-27,ARK,66,STAN,69,1.0,152.0
-2015,2015-11-27,CONN,70,GONZ,73,-3.0,139.5
-2015,2015-11-27,ARST,72,BAY,94,-23.5,151.5
-2015,2015-11-27,CHS,65,JVST,68,-5.0,142.0
-2015,2015-11-27,WCU,56,COFC,57,-6.0,142.0
-2015,2015-11-27,OMA,90,MINN,93,-10.0,160.5
-2015,2015-11-27,GT,52,NOVA,69,-10.5,143.0
-2015,2015-11-27,SYR,74,TAMU,67,-6.0,139.0
-2015,2015-11-27,NE,78,MIA,77,-16.0,143.5
-2015,2015-11-27,UK,84,SF,63,21.5,138.5
-2015,2015-11-27,CLMB,81,FAIR,82,6.5,146.0
-2015,2015-11-27,APP,70,MER,71,-11.5,134.5
-2015,2015-11-27,FGCU,50,FLA,70,-20.0,145.0
-2015,2015-11-27,VT,77,ISU,99,-13.0,150.0
-2015,2015-11-27,IUPU,72,GAST,78,-10.5,135.0
-2015,2015-11-27,JMU,89,MRSH,75,3.0,149.5
-2015,2015-11-27,UCRV,81,RICE,87,1.5,140.0
-2015,2015-11-27,NWST,81,AUB,119,-15.0,156.0
-2015,2015-11-27,LBSU,73,OKST,79,-8.0,144.5
-2015,2015-11-27,PORT,74,CSU,90,-6.0,158.0
-2015,2015-11-27,IDST,72,UTAH,102,-27.0,150.5
-2015,2015-11-27,TENN,70,GW,73,-5.5,147.5
-2015,2015-11-27,UAB,58,ILL,72,2.5,141.5
-2015,2015-11-27,MONM,70,DAY,73,-7.5,146.0
-2015,2015-11-27,PROV,69,ARIZ,65,-5.0,142.0
-2015,2015-11-27,USC,77,XAV,87,-4.0,155.5
-2015,2015-11-27,UCI,80,BC,67,5.5,137.0
-2015,2015-11-27,SIU,66,UTEP,71,-1.5,144.5
-2015,2015-11-27,USD,67,SJSU,76,3.5,130.5
-2015,2015-11-27,BSU,67,MSU,77,-10.0,150.0
-2015,2015-11-27,DREX,65,UAA,71,3.5,145.0
-2015,2015-11-27,NEB,61,CIN,65,-13.0,135.5
-2015,2015-11-27,IOWA,62,ND,68,-2.0,149.0
-2015,2015-11-27,TEX,72,MICH,78,-2.0,140.0
-2015,2015-11-27,MEM,81,OSU,76,0.0,142.5
-2015,2015-11-27,CAL,90,RICH,94,6.0,147.0
-2015,2015-11-27,SCU,57,EVAN,69,-12.0,138.0
-2015,2015-11-27,LOYI,74,TOL,82,0.0,142.0
-2015,2015-11-27,CHAR,66,WASH,71,-13.5,163.0
-2015,2015-11-27,SDSU,50,WVU,72,-2.5,139.0
-2015,2015-11-27,UNCA,61,MTSU,63,-5.0,142.0
-2015,2015-11-28,CLEV,63,MD,80,-21.5,134.5
-2015,2015-11-28,VALP,66,BALL,69,9.0,134.0
-2015,2015-11-28,KENT,78,PITT,85,-13.5,139.0
-2015,2015-11-28,UCF,63,MIOH,64,-3.0,134.5
-2015,2015-11-28,HAW,74,TTU,82,-6.5,145.0
-2015,2015-11-28,HOF,89,SBON,83,-1.5,156.5
-2015,2015-11-28,UALR,64,TLSA,60,-10.5,136.0
-2015,2015-11-28,ODU,67,VCU,76,-8.0,130.5
-2015,2015-11-28,WRST,39,GMU,66,-3.5,132.5
-2015,2015-11-28,UIC,62,DRKE,83,-9.5,148.0
-2015,2015-11-28,UGA,62,HALL,69,-3.0,136.5
-2015,2015-11-28,MISS,67,BRAD,54,9.0,132.0
-2015,2015-11-28,ULM,64,HOU,76,-7.0,139.0
-2015,2015-11-28,SLU,57,LOU,77,-15.0,137.0
-2015,2015-11-28,NEV,66,CSF,75,2.0,149.0
-2015,2015-11-28,ALST,66,CHS,64,3.5,140.0
-2015,2015-11-28,JVST,52,CHAT,62,-12.5,141.5
-2015,2015-11-28,NEB,82,TENN,71,-1.0,143.0
-2015,2015-11-28,GW,56,CIN,61,-5.5,139.5
-2015,2015-11-28,USD,62,DREX,59,-4.5,132.0
-2015,2015-11-28,SJSU,91,UAA,87,-1.0,147.0
-2015,2015-11-28,LOYI,48,UNCA,59,5.0,142.0
-2015,2015-11-28,VT,82,UAB,77,-3.0,143.5
-2015,2015-11-28,ILL,73,ISU,84,-8.5,159.0
-2015,2015-11-28,SIU,80,PORT,79,3.0,151.5
-2015,2015-11-28,UTEP,99,CSU,90,-4.0,152.5
-2015,2015-11-28,SDAK,96,SAC,90,-6.5,149.0
-2015,2015-11-28,EWU,70,PAC,63,-3.0,151.0
-2015,2015-11-28,CAN,96,BUFF,98,-2.5,154.0
-2015,2015-11-28,DET,95,ORU,100,-7.5,151.0
-2015,2015-11-28,LMU,73,SEMO,60,3.5,146.5
-2015,2015-11-28,YSU,88,NIAG,70,-4.0,152.5
-2015,2015-11-28,USA,56,DEN,69,-6.5,140.5
-2015,2015-11-28,UNCW,94,ETSU,73,-1.5,150.5
-2015,2015-11-28,SIUE,73,BUT,89,-29.0,148.5
-2015,2015-11-28,MAN,64,FOR,87,-9.5,143.0
-2015,2015-11-28,UNI,97,UND,51,10.0,139.0
-2015,2015-11-28,IPFW,64,UNCG,58,-1.5,140.0
-2015,2015-11-28,WIU,67,CREI,97,-11.5,151.0
-2015,2015-11-28,USM,46,MORE,61,-19.0,132.5
-2015,2015-11-28,SAM,73,PEAY,74,-1.5,152.5
-2015,2015-11-28,UTM,51,MSST,76,-10.5,152.5
-2015,2015-11-28,GB,81,EIU,72,7.5,149.5
-2015,2015-11-28,SUU,85,EKY,98,-8.0,159.0
-2015,2015-11-28,NIU,66,IDHO,59,2.5,133.0
-2015,2015-11-28,BEL,81,BYU,95,-6.0,171.0
-2015,2015-11-28,MTST,68,WYO,82,-9.0,143.0
-2015,2015-11-28,BRY,47,GTWN,77,-24.0,142.5
-2015,2015-11-28,TXSO,65,WSU,77,-11.5,152.0
-2015,2015-11-28,PV,62,UNLV,80,-19.5,141.0
-2015,2015-11-28,MTSU,78,TOL,70,-5.0,145.5
-2015,2015-11-29,USU,52,DUKE,85,-18.0,150.5
-2015,2015-11-29,WIS,48,OKLA,65,-8.0,146.5
-2015,2015-11-29,BRWN,69,SMU,77,-23.0,148.5
-2015,2015-11-29,DEL,50,TEM,69,-12.5,138.0
-2015,2015-11-29,UCSB,68,ASU,70,-8.0,139.5
-2015,2015-11-29,UTA,92,RICE,74,2.5,150.0
-2015,2015-11-29,CSN,45,UCLA,77,-18.5,151.5
-2015,2015-11-29,WICH,61,IOWA,84,-5.0,137.5
-2015,2015-11-29,MONM,83,USC,73,-5.0,161.5
-2015,2015-11-29,DAY,61,XAV,90,-2.0,146.5
-2015,2015-11-29,ALA,74,ND,73,-10.5,138.0
-2015,2015-11-29,EVAN,75,UCI,56,-3.0,140.5
-2015,2015-11-29,BSU,59,ARIZ,68,-5.5,145.5
-2015,2015-11-29,BC,45,SCU,62,6.0,131.5
-2015,2015-11-29,PROV,64,MSU,77,-8.0,146.5
-2015,2015-11-29,EWU,71,SDAK,77,3.0,155.0
-2015,2015-11-29,PAC,71,SAC,79,-4.5,142.5
-2015,2015-11-29,RID,57,URI,82,-11.5,123.0
-2015,2015-11-29,UNCO,52,COLO,82,-25.0,158.0
-2015,2015-11-29,MER,68,WMU,65,2.5,137.0
-2015,2015-11-29,MONT,63,PEPP,69,-8.0,133.5
-2015,2015-11-29,JKST,61,MARQ,80,-12.5,141.5
-2015,2015-11-30,ILST,63,UK,75,-20.5,141.5
-2015,2015-11-30,WAKE,69,RUTG,68,6.0,155.5
-2015,2015-11-30,LSU,58,COFC,70,5.0,139.5
-2015,2015-11-30,UNT,70,UNI,93,-20.0,138.5
-2015,2015-11-30,FRES,73,ORE,78,-11.5,149.0
-2015,2015-11-30,CLEM,83,MINN,89,-1.0,135.0
-2015,2015-11-30,WCU,53,SC,76,-18.0,153.5
-2015,2015-11-30,CHAT,54,ULM,64,2.5,135.5
-2015,2015-11-30,GB,87,SIUE,69,5.0,158.0
-2015,2015-11-30,ALCN,70,IND,112,-35.5,154.0
-2015,2015-12-01,RICH,56,FLA,76,-8.5,146.5
-2015,2015-12-01,FAU,48,ECU,74,-5.5,135.0
-2015,2015-12-01,VILL,86,JOES,72,13.5,143.5
-2015,2015-12-01,MICH,66,NCST,59,1.0,142.5
-2015,2015-12-01,NW,81,VT,79,1.5,143.0
-2015,2015-12-01,BRAD,47,DEL,70,-8.5,129.5
-2015,2015-12-01,DAV,109,CHAR,74,14.0,164.0
-2015,2015-12-01,ODU,48,WMRY,55,-2.5,133.0
-2015,2015-12-01,MRSH,70,OHIO,85,-11.0,165.5
-2015,2015-12-01,OAK,82,UGA,86,-7.0,155.5
-2015,2015-12-01,UVA,64,OSU,58,7.0,134.5
-2015,2015-12-01,GAST,57,UAB,64,-6.5,132.0
-2015,2015-12-01,USU,69,MOSU,68,4.5,138.5
-2015,2015-12-01,USM,59,TROY,69,-11.5,137.0
-2015,2015-12-01,UTA,73,TEX,80,-9.5,146.0
-2015,2015-12-01,ARST,78,MIZ,88,-8.0,144.5
-2015,2015-12-01,LT,68,MEM,94,-4.5,150.5
-2015,2015-12-01,PUR,72,PITT,59,-1.0,146.5
-2015,2015-12-01,MIA,77,NEB,72,6.5,142.5
-2015,2015-12-01,MD,81,UNC,89,-8.0,151.5
-2015,2015-12-01,SDSU,76,LBSU,72,3.5,132.5
-2015,2015-12-01,WOF,61,GT,77,-11.0,136.0
-2015,2015-12-01,IUPU,58,BALL,61,-7.5,135.0
-2015,2015-12-01,SIE,80,COR,81,7.5,148.5
-2015,2015-12-01,FAIR,77,IONA,101,-10.0,166.0
-2015,2015-12-01,EMU,80,OMA,73,-4.5,163.5
-2015,2015-12-01,INST,62,EIU,68,7.5,136.5
-2015,2015-12-01,SAM,77,JVST,71,0.0,139.5
-2015,2015-12-01,EKY,84,WKU,86,-6.5,158.0
-2015,2015-12-01,NDSU,64,ISU,84,-16.0,148.5
-2015,2015-12-01,ORU,75,UNM,91,-10.5,143.5
-2015,2015-12-01,EWU,81,SF,77,-5.5,142.5
-2015,2015-12-01,UMES,49,GTWN,68,-25.5,145.0
-2015,2015-12-01,SEA,52,CAL,66,-22.0,141.5
-2015,2015-12-02,HALL,64,GW,72,-7.5,140.0
-2015,2015-12-02,SBON,60,BUFF,58,1.5,152.5
-2015,2015-12-02,SJU,57,FOR,73,-6.5,137.0
-2015,2015-12-02,GMU,54,TOWS,75,2.0,129.0
-2015,2015-12-02,HOF,84,LAS,80,3.0,159.0
-2015,2015-12-02,BUT,78,CIN,76,-5.5,135.5
-2015,2015-12-02,CLEV,65,TOL,76,-9.0,141.5
-2015,2015-12-02,HARV,71,NE,80,-7.5,128.0
-2015,2015-12-02,LOU,67,MSU,71,-6.0,136.0
-2015,2015-12-02,WIS,66,SYR,58,-3.5,130.5
-2015,2015-12-02,PSU,67,BC,58,-1.0,130.5
-2015,2015-12-02,VCU,62,MTSU,56,4.5,141.0
-2015,2015-12-02,DEP,82,UIC,55,9.5,153.0
-2015,2015-12-02,DET,52,VAN,102,-19.5,156.0
-2015,2015-12-02,UTSA,53,TXST,76,-10.0,145.5
-2015,2015-12-02,SMU,75,TCU,70,6.5,139.0
-2015,2015-12-02,TLSA,66,OKST,56,-3.0,144.0
-2015,2015-12-02,ASU,79,CREI,77,-8.0,154.5
-2015,2015-12-02,ND,84,ILL,79,2.5,142.5
-2015,2015-12-02,FSU,75,IOWA,78,-5.5,155.0
-2015,2015-12-02,IND,74,DUKE,94,-10.0,164.5
-2015,2015-12-02,BYU,75,UTAH,83,-10.0,155.5
-2015,2015-12-02,LMU,70,ORST,79,-14.0,137.5
-2015,2015-12-02,GONZ,69,WSU,60,10.0,149.5
-2015,2015-12-02,SPU,73,RID,61,-6.0,123.5
-2015,2015-12-02,MURR,78,HOU,93,-8.0,143.5
-2015,2015-12-02,MORE,60,SLU,46,-3.5,128.0
-2015,2015-12-02,SEMO,50,SIU,74,-13.5,150.0
-2015,2015-12-02,ETSU,61,TNTC,63,-2.0,154.5
-2015,2015-12-02,WYO,68,DEN,52,-5.0,123.0
-2015,2015-12-02,CIT,93,AFA,97,-15.5,168.5
-2015,2015-12-02,PORT,78,PRST,72,-2.5,157.5
-2015,2015-12-02,SAC,61,UCD,66,-6.0,151.0
-2015,2015-12-02,GRAM,49,MARQ,95,-28.0,136.5
-2015,2015-12-02,TXSO,73,MSST,86,-12.0,150.0
-2015,2015-12-02,UTEP,59,NMST,73,-4.5,138.0
-2015,2015-12-03,WMU,57,JMU,63,-6.0,142.5
-2015,2015-12-03,SF,58,DEL,67,-4.5,131.5
-2015,2015-12-03,ULL,70,ULM,81,2.0,144.5
-2015,2015-12-03,UNT,67,UTA,90,-16.5,147.0
-2015,2015-12-03,UK,77,UCLA,87,6.5,145.0
-2015,2015-12-03,LBSU,83,CSU,77,-7.5,156.5
-2015,2015-12-03,USC,75,UCSB,63,1.5,148.0
-2015,2015-12-03,BEL,57,VALP,61,-9.0,152.5
-2015,2015-12-03,SIUE,51,MILW,64,-16.0,145.5
-2015,2015-12-03,UNCO,66,UCRV,77,-16.0,152.0
-2015,2015-12-03,IPFW,75,CP,73,-8.0,139.0
-2015,2015-12-03,CARK,68,OKLA,111,-29.5,159.5
-2015,2015-12-04,JOES,80,CLMB,78,-3.0,138.0
-2015,2015-12-04,DUQ,75,PITT,96,-8.5,152.5
-2015,2015-12-04,AKR,75,MRSH,65,7.5,149.5
-2015,2015-12-04,KSU,68,UGA,66,-2.5,131.0
-2015,2015-12-04,ARK,85,WAKE,88,-4.5,166.5
-2015,2015-12-04,ELON,77,FIU,71,-1.5,142.5
-2015,2015-12-04,GAST,59,WRST,46,2.5,126.0
-2015,2015-12-04,NIU,71,MIZ,78,-6.5,133.5
-2015,2015-12-04,ALA,58,USM,55,14.5,128.5
-2015,2015-12-04,UCI,70,PAC,67,6.5,134.0
-2015,2015-12-04,UCD,67,SMC,81,-13.0,140.5
-2015,2015-12-04,ORE,69,UNLV,80,2.0,151.5
-2015,2015-12-04,MAN,54,SIE,89,-8.0,149.0
-2015,2015-12-04,IONA,101,MRST,66,8.0,163.5
-2015,2015-12-04,RID,70,FAIR,74,-1.0,133.0
-2015,2015-12-04,MONM,86,CAN,96,3.5,156.0
-2015,2015-12-04,QUIN,72,NIAG,76,2.5,141.0
-2015,2015-12-04,NDSU,74,ARST,73,5.0,150.0
-2015,2015-12-04,SAM,49,TEX,59,-21.0,146.5
-2015,2015-12-04,SF,50,MONT,82,-7.0,134.0
-2015,2015-12-04,SFU,55,MD,96,-25.0,139.0
-2015,2015-12-05,HALL,84,RUTG,55,5.5,142.5
-2015,2015-12-05,INST,71,BUT,85,-16.5,146.5
-2015,2015-12-05,EMU,70,PSU,81,-4.5,131.5
-2015,2015-12-05,TEM,60,WIS,76,-8.0,128.0
-2015,2015-12-05,SYR,72,GTWN,79,-5.5,135.5
-2015,2015-12-05,DREX,66,LAS,53,-7.5,142.0
-2015,2015-12-05,CREI,65,LOYI,68,4.5,142.0
-2015,2015-12-05,UNM,58,PUR,70,-14.0,141.0
-2015,2015-12-05,NE,73,DET,76,3.0,159.0
-2015,2015-12-05,CAL,78,WYO,72,7.0,135.5
-2015,2015-12-05,HARV,69,KU,75,-23.0,145.5
-2015,2015-12-05,ARIZ,68,GONZ,63,-8.5,140.0
-2015,2015-12-05,MOST,64,OKST,63,-14.0,137.0
-2015,2015-12-05,USA,55,MTSU,68,-10.5,142.5
-2015,2015-12-05,MISS,74,UMASS,64,1.5,151.5
-2015,2015-12-05,PENN,44,GMU,63,-7.0,136.5
-2015,2015-12-05,CHAR,60,MIA,88,-26.5,156.0
-2015,2015-12-05,OHIO,68,SBON,81,-5.0,154.5
-2015,2015-12-05,NEV,62,ORST,66,-9.5,136.5
-2015,2015-12-05,DRKE,63,BGSU,75,-3.5,139.5
-2015,2015-12-05,GT,76,TULN,68,6.0,135.5
-2015,2015-12-05,BUFF,59,DUKE,82,-24.5,153.0
-2015,2015-12-05,PROV,74,URI,72,-3.5,136.0
-2015,2015-12-05,SF,63,SC,81,-19.0,141.5
-2015,2015-12-05,WMRY,52,UVA,67,-14.0,131.5
-2015,2015-12-05,NIU,67,RICH,82,-2.5,143.0
-2015,2015-12-05,KENT,66,CLEV,62,4.0,133.0
-2015,2015-12-05,UIC,58,UCF,88,-14.0,149.0
-2015,2015-12-05,UAB,74,ILST,61,-2.5,136.5
-2015,2015-12-05,SIU,95,UNT,63,6.0,149.5
-2015,2015-12-05,WKU,64,XAV,95,-18.0,149.0
-2015,2015-12-05,WICH,68,SLU,53,6.5,133.0
-2015,2015-12-05,UTA,76,UTEP,62,-1.0,145.5
-2015,2015-12-05,PEPP,70,CSN,55,7.5,137.5
-2015,2015-12-05,FRES,65,CP,77,-1.5,146.5
-2015,2015-12-05,BSU,81,PORT,71,6.5,155.0
-2015,2015-12-05,SJSU,75,SCU,78,-8.0,130.0
-2015,2015-12-05,TAMU,54,ASU,67,3.0,145.0
-2015,2015-12-05,COFC,82,CIT,74,8.5,167.0
-2015,2015-12-05,MIOH,64,IUPU,78,-2.5,132.0
-2015,2015-12-05,IPFW,79,UTAH,96,-20.0,145.5
-2015,2015-12-05,WEB,68,BYU,73,-4.5,147.5
-2015,2015-12-05,SIUE,56,NW,81,-20.0,137.0
-2015,2015-12-05,PEAY,80,TROY,71,-5.0,150.5
-2015,2015-12-05,ORU,70,TLSA,68,-12.5,149.0
-2015,2015-12-05,AFA,61,DEN,59,-4.5,125.0
-2015,2015-12-05,VMI,62,OSU,89,-15.5,135.5
-2015,2015-12-05,MORE,59,IND,92,-13.0,141.5
-2015,2015-12-05,SEMO,65,MEM,80,-23.0,149.0
-2015,2015-12-05,UALR,64,IDHO,54,5.0,123.5
-2015,2015-12-05,WCU,68,ILL,80,-11.5,149.5
-2015,2015-12-05,UND,65,BRAD,59,-2.5,131.5
-2015,2015-12-05,SDAK,85,MINN,81,-11.5,159.5
-2015,2015-12-05,EVAN,85,MURR,81,4.0,141.5
-2015,2015-12-05,NKU,73,EIU,79,-2.0,139.0
-2015,2015-12-05,QUIN,78,CAN,76,-9.5,149.0
-2015,2015-12-05,BING,33,MSU,76,-31.0,139.0
-2015,2015-12-05,NMST,53,LBSU,67,-1.5,142.5
-2015,2015-12-06,MRSH,84,JMU,107,-11.0,154.0
-2015,2015-12-06,DEL,69,CLMB,82,-10.0,134.0
-2015,2015-12-06,COLO,88,CSU,77,2.5,154.0
-2015,2015-12-06,FSU,76,VCU,71,1.0,150.0
-2015,2015-12-06,TOL,71,GB,69,-2.0,165.5
-2015,2015-12-06,DAV,65,UNC,98,-15.0,172.5
-2015,2015-12-06,VAN,67,BAY,69,-2.5,138.5
-2015,2015-12-06,UCI,60,SMC,70,-6.0,136.0
-2015,2015-12-06,LBSU,76,UCLA,83,-11.0,154.0
-2015,2015-12-06,CSF,69,WASH,87,-11.0,157.5
-2015,2015-12-06,UCRV,76,LMU,77,-2.5,140.5
-2015,2015-12-06,MONM,56,NIAG,42,10.5,152.5
-2015,2015-12-06,MRST,75,MAN,70,-5.0,142.5
-2015,2015-12-06,OMA,100,MTST,97,-1.0,169.5
-2015,2015-12-06,SIE,68,SPU,72,4.0,139.0
-2015,2015-12-06,WOF,51,CLEM,66,-10.0,127.0
-2015,2015-12-06,APP,80,HOF,86,-12.5,162.0
-2015,2015-12-06,PRST,67,WSU,91,-10.5,149.5
-2015,2015-12-06,NDSU,62,USM,74,12.0,125.5
-2015,2015-12-06,USD,53,SDSU,48,-17.0,121.5
-2015,2015-12-06,SFNY,56,SJU,63,-7.5,130.5
-2015,2015-12-07,ECU,73,COFC,77,-4.5,128.0
-2015,2015-12-07,OKLA,78,NOVA,55,-5.0,145.5
-2015,2015-12-07,BRWN,57,GTWN,74,-18.5,147.5
-2015,2015-12-07,NE,86,WMU,87,1.5,140.5
-2015,2015-12-07,BUFF,63,ISU,84,-21.0,155.5
-2015,2015-12-07,CSN,61,SF,65,-6.5,137.0
-2015,2015-12-07,VMI,66,BUT,93,-24.0,150.0
-2015,2015-12-07,IUPU,53,PUR,80,-21.5,137.0
-2015,2015-12-07,WIU,56,IOWA,90,-18.0,146.0
-2015,2015-12-07,IDHO,55,USC,74,-19.5,146.5
-2015,2015-12-07,ORE,67,NAVY,47,11.5,135.0
-2015,2015-12-08,UMASS,63,UCF,67,-3.0,143.5
-2015,2015-12-08,PSU,66,GW,76,-9.5,132.0
-2015,2015-12-08,WVU,54,UVA,70,-4.5,135.0
-2015,2015-12-08,PRIN,50,JOES,62,-3.5,152.0
-2015,2015-12-08,WRST,55,XAV,90,-23.0,136.5
-2015,2015-12-08,HOU,57,URI,67,-7.5,144.5
-2015,2015-12-08,FLA,55,MIA,66,-5.5,141.5
-2015,2015-12-08,NIU,73,GMU,65,4.5,130.0
-2015,2015-12-08,AFA,50,OSU,74,-14.5,136.5
-2015,2015-12-08,EVAN,45,ARK,56,-2.5,160.0
-2015,2015-12-08,BRAD,61,UTA,97,-18.0,131.5
-2015,2015-12-08,UTSA,50,TEX,116,-23.5,149.0
-2015,2015-12-08,SJSU,62,MARQ,80,-21.5,150.0
-2015,2015-12-08,MICH,42,SMU,55,-6.5,139.0
-2015,2015-12-08,MD,76,CONN,66,2.5,142.0
-2015,2015-12-08,TCU,67,WASH,92,-6.0,150.5
-2015,2015-12-08,IONA,81,TLSA,90,-7.0,162.5
-2015,2015-12-08,SDKS,84,MINN,70,-3.0,153.0
-2015,2015-12-08,BGSU,79,SEMO,52,5.0,142.0
-2015,2015-12-08,MONT,58,GONZ,61,-18.0,136.0
-2015,2015-12-08,IDST,66,PORT,65,-12.5,156.0
-2015,2015-12-08,WIN,64,UGA,74,-8.5,144.5
-2015,2015-12-08,COLG,51,SYR,78,-21.5,134.5
-2015,2015-12-08,STON,61,ND,86,-8.5,142.0
-2015,2015-12-09,TEM,77,PSU,73,9.5,134.5
-2015,2015-12-09,BC,51,PROV,66,-14.0,140.0
-2015,2015-12-09,VALP,69,INST,63,6.5,129.5
-2015,2015-12-09,TOL,72,DET,75,1.5,164.5
-2015,2015-12-09,DEP,74,DRKE,71,2.0,141.5
-2015,2015-12-09,YALE,65,ILL,69,-3.5,140.5
-2015,2015-12-09,NEB,67,CREI,83,-5.5,148.0
-2015,2015-12-09,MILW,68,WIS,67,-12.5,134.0
-2015,2015-12-09,DAY,72,VAN,67,-9.0,139.0
-2015,2015-12-09,USU,68,BYU,80,-8.5,150.0
-2015,2015-12-09,UNLV,50,WICH,56,-7.0,139.5
-2015,2015-12-09,FRES,72,ARIZ,85,-12.5,141.5
-2015,2015-12-09,LMU,66,BSU,67,-14.5,149.0
-2015,2015-12-09,LBSU,75,PEPP,77,-5.0,139.0
-2015,2015-12-09,IPFW,65,IND,90,-20.5,156.0
-2015,2015-12-09,NIAG,44,SJU,48,-9.0,134.5
-2015,2015-12-09,EKY,67,UK,88,-24.5,161.5
-2015,2015-12-09,EIU,76,MRSH,82,-8.5,151.0
-2015,2015-12-09,CLMB,72,MAN,71,8.0,142.0
-2015,2015-12-09,HOF,68,SIE,81,1.5,163.0
-2015,2015-12-09,EWU,86,DAV,96,-16.0,169.0
-2015,2015-12-09,SIUE,76,SIU,74,-14.5,144.0
-2015,2015-12-09,UTM,49,TTU,68,-14.0,139.5
-2015,2015-12-09,OMA,78,MIZ,85,-6.0,159.5
-2015,2015-12-09,DEN,59,USD,47,0.0,118.5
-2015,2015-12-09,UMES,35,MSU,78,-34.5,140.0
-2015,2015-12-09,HOW,55,PUR,93,-33.0,138.5
-2015,2015-12-09,IW,62,CAL,74,-20.5,151.5
-2015,2015-12-10,ULM,62,KENT,73,-8.5,131.0
-2015,2015-12-10,IOWA,82,ISU,83,-7.5,154.0
-2015,2015-12-10,TROY,69,HALL,78,-15.5,150.0
-2015,2015-12-10,CAN,67,PSU,81,-4.5,145.5
-2015,2015-12-10,IUPU,74,MOST,88,-5.5,133.5
-2015,2015-12-10,WSU,74,IDHO,78,8.0,137.0
-2015,2015-12-11,EWU,51,PITT,84,-19.0,154.0
-2015,2015-12-11,UND,69,NDSU,67,7.5,137.0
-2015,2015-12-12,RUTG,49,GW,83,-18.5,142.0
-2015,2015-12-12,OSU,55,CONN,75,-8.0,135.0
-2015,2015-12-12,PEPP,72,BALL,63,-1.5,129.5
-2015,2015-12-12,OHIO,76,CLEV,67,2.0,142.0
-2015,2015-12-12,MARQ,57,WIS,55,-7.5,136.0
-2015,2015-12-12,ULM,50,PSU,54,-8.0,124.5
-2015,2015-12-12,ODU,64,GAST,68,-2.0,119.0
-2015,2015-12-12,UIC,79,ILL,83,-17.5,152.0
-2015,2015-12-12,YSU,64,PUR,95,-28.5,148.0
-2015,2015-12-12,UNCW,82,GTWN,87,-11.5,148.5
-2015,2015-12-12,TENN,86,BUT,94,-13.0,152.0
-2015,2015-12-12,BGSU,80,DET,95,-6.0,152.0
-2015,2015-12-12,EMU,53,LOU,86,-19.5,140.5
-2015,2015-12-12,ASU,58,UK,72,-12.5,141.0
-2015,2015-12-12,UTAH,50,WICH,67,-2.5,138.0
-2015,2015-12-12,SMC,59,CAL,63,-6.5,141.5
-2015,2015-12-12,KSU,68,TAMU,78,-9.0,139.0
-2015,2015-12-12,GMU,46,JMU,69,-7.5,136.0
-2015,2015-12-12,NIU,57,UNM,76,-4.5,141.0
-2015,2015-12-12,UNC,82,TEX,84,6.0,153.0
-2015,2015-12-12,CIN,55,XAV,65,-5.0,139.5
-2015,2015-12-12,FLA,52,MSU,58,-9.5,135.0
-2015,2015-12-12,DRKE,71,NEV,79,-8.5,136.0
-2015,2015-12-12,OAK,76,TOL,64,-4.5,168.5
-2015,2015-12-12,ORE,72,BSU,74,-3.5,149.0
-2015,2015-12-12,FAU,61,UCF,75,-9.0,133.0
-2015,2015-12-12,PAC,52,FRES,71,-10.0,144.0
-2015,2015-12-12,ULL,79,LT,91,-3.0,164.0
-2015,2015-12-12,ORST,67,KU,82,-13.0,146.5
-2015,2015-12-12,UNT,66,SIU,74,-14.0,144.0
-2015,2015-12-12,EIU,57,WIU,64,-10.5,141.5
-2015,2015-12-12,MINN,60,OKST,62,-2.5,144.0
-2015,2015-12-12,UALR,66,DEP,44,-4.0,132.5
-2015,2015-12-12,LMU,82,CSF,70,-4.0,145.0
-2015,2015-12-12,BYU,83,COLO,92,-5.0,151.5
-2015,2015-12-12,UCI,73,USU,63,-3.0,135.0
-2015,2015-12-12,UNLV,73,UCRV,62,4.5,140.0
-2015,2015-12-12,UCLA,71,GONZ,66,-8.0,147.0
-2015,2015-12-12,DART,50,STAN,64,-11.5,134.0
-2015,2015-12-12,ORU,73,OKLA,96,-21.0,154.0
-2015,2015-12-12,CHAT,61,DAY,59,-12.5,140.0
-2015,2015-12-12,EKY,72,MRSH,96,-1.5,174.5
-2015,2015-12-12,PEAY,68,IPFW,85,-6.5,145.0
-2015,2015-12-12,MISS,75,SEMO,64,15.5,140.5
-2015,2015-12-12,DEL,70,MRST,69,1.0,137.5
-2015,2015-12-12,IUPU,65,CREI,90,-15.0,149.5
-2015,2015-12-12,MONT,62,WASH,92,-10.0,145.5
-2015,2015-12-12,CAN,77,KENT,84,-7.5,156.0
-2015,2015-12-12,WCU,54,DAV,87,-15.0,165.5
-2015,2015-12-12,AUB,81,MTSU,88,2.5,148.0
-2015,2015-12-12,MAN,57,MEM,89,-17.0,148.5
-2015,2015-12-12,PRST,64,SIUE,74,-1.0,148.5
-2015,2015-12-12,TNTC,57,ARK,83,-14.5,164.0
-2015,2015-12-12,SAC,73,PORT,81,-5.5,150.0
-2015,2015-12-12,BRY,67,PROV,74,-19.0,134.5
-2015,2015-12-12,DSU,33,MICH,80,-31.0,131.0
-2015,2015-12-12,UMES,56,MD,77,-32.0,142.5
-2015,2015-12-12,MCNS,60,IND,105,-31.0,156.5
-2015,2015-12-12,STON,62,NE,75,-1.5,141.0
-2015,2015-12-13,SYR,72,SJU,84,10.0,129.5
-2015,2015-12-13,WRST,67,MIOH,72,-5.0,128.5
-2015,2015-12-13,LOYI,61,ND,81,-15.5,133.5
-2015,2015-12-13,INST,62,WKU,75,-2.0,140.5
-2015,2015-12-13,URI,67,NEB,70,-1.5,133.5
-2015,2015-12-13,TLSA,70,MOST,61,6.0,140.0
-2015,2015-12-13,JOES,66,TEM,65,-3.5,140.5
-2015,2015-12-13,NCST,65,SF,46,8.0,141.0
-2015,2015-12-13,YALE,56,USC,68,-6.5,143.5
-2015,2015-12-13,LAS,47,NOVA,76,-25.0,138.5
-2015,2015-12-13,ALA,51,CLEM,50,-7.0,128.5
-2015,2015-12-13,UTEP,68,WSU,84,-7.0,146.5
-2015,2015-12-13,ULM,58,WVU,100,-21.5,133.0
-2015,2015-12-13,MIZ,52,ARIZ,88,-16.5,136.0
-2015,2015-12-13,LSU,98,HOU,105,-2.0,159.5
-2015,2015-12-13,MORE,62,PITT,72,-14.0,132.5
-2015,2015-12-13,WEB,68,DEN,69,2.5,122.5
-2015,2015-12-13,SPU,46,HALL,72,-12.0,137.0
-2015,2015-12-13,MURR,61,ILST,63,-5.5,140.5
-2015,2015-12-13,UCSB,68,SDAK,86,-9.5,139.5
-2015,2015-12-13,MTST,91,SJSU,83,-3.5,155.0
-2015,2015-12-13,CSU,64,UNCO,73,13.5,163.5
-2015,2015-12-13,CHS,35,NW,77,-24.0,140.0
-2015,2015-12-13,WYO,62,NMST,59,-9.0,128.0
-2015,2015-12-14,USM,57,USA,54,-8.0,131.5
-2015,2015-12-14,CP,63,SMC,93,-8.5,136.0
-2015,2015-12-14,EWU,80,WCU,97,-3.5,149.5
-2015,2015-12-15,DREX,54,SC,79,-17.5,144.0
-2015,2015-12-15,GASO,65,DUKE,99,-30.5,154.5
-2015,2015-12-15,NKU,62,MICH,77,-21.5,138.0
-2015,2015-12-15,LT,80,MISS,99,-7.0,150.5
-2015,2015-12-15,APP,55,TEX,67,-20.0,145.5
-2015,2015-12-15,PAC,88,GB,93,-9.0,149.5
-2015,2015-12-15,VCU,64,GT,77,-1.0,145.0
-2015,2015-12-15,ULL,80,UCLA,89,-10.0,167.5
-2015,2015-12-15,DEP,60,STAN,79,-8.5,136.5
-2015,2015-12-15,UCD,55,USD,61,2.5,130.5
-2015,2015-12-15,UCI,63,ORE,78,-8.0,138.5
-2015,2015-12-15,FAU,73,EKY,80,-6.5,154.5
-2015,2015-12-15,UNCG,71,WAKE,81,-15.0,149.0
-2015,2015-12-15,TNTC,69,CHAT,80,-12.0,145.0
-2015,2015-12-15,MONM,83,GTWN,68,-10.0,144.5
-2015,2015-12-15,MER,71,AUB,78,-6.5,146.5
-2015,2015-12-15,NORF,59,CIN,75,-23.0,136.5
-2015,2015-12-15,AMCC,49,WIS,64,-13.5,131.0
-2015,2015-12-15,LONG,55,OKST,73,-16.0,141.0
-2015,2015-12-16,FAU,62,TENN,81,-14.0,147.0
-2015,2015-12-16,ODU,61,RICH,77,-4.0,134.5
-2015,2015-12-16,UNCW,73,ECU,78,3.5,147.0
-2015,2015-12-16,TULN,72,UNC,96,-24.5,149.0
-2015,2015-12-16,NIU,54,OSU,67,-13.0,135.0
-2015,2015-12-16,CLEV,60,LOYI,54,-8.0,125.0
-2015,2015-12-16,ILST,72,UIC,60,8.5,148.0
-2015,2015-12-16,MSST,66,FSU,90,-12.5,153.0
-2015,2015-12-16,ASU,66,UNLV,56,-7.0,138.0
-2015,2015-12-16,SDKS,67,TTU,79,-3.0,143.0
-2015,2015-12-16,ORU,66,MOST,85,-2.0,146.0
-2015,2015-12-16,MTST,64,NDSU,73,-13.0,148.5
-2015,2015-12-16,UTM,82,SLU,76,-9.5,135.0
-2015,2015-12-16,DEN,81,UNCO,77,4.5,135.0
-2015,2015-12-16,SUU,36,SMC,92,-19.5,140.0
-2015,2015-12-16,NAU,37,ARIZ,92,-27.5,147.5
-2015,2015-12-16,WEBB,57,LSU,78,-13.0,160.0
-2015,2015-12-16,KENN,57,LOU,94,-36.0,137.5
-2015,2015-12-16,SAV,53,UTAH,99,-27.5,137.5
-2015,2015-12-16,WIN,60,ALA,72,-8.5,146.0
-2015,2015-12-16,NMST,61,UNM,79,-8.0,136.0
-2015,2015-12-17,MRSH,68,WVU,86,-20.5,162.0
-2015,2015-12-17,CP,82,USC,101,-9.0,151.0
-2015,2015-12-17,BEL,62,MTSU,83,0.0,151.5
-2015,2015-12-17,SDAK,92,MILW,91,-9.0,150.0
-2015,2015-12-17,CSN,77,PRST,71,-4.5,144.0
-2015,2015-12-18,SC,65,CLEM,59,2.5,134.0
-2015,2015-12-18,MISS,85,MEM,79,-3.5,147.5
-2015,2015-12-18,CMU,85,BYU,98,-12.5,161.5
-2015,2015-12-18,TXST,73,WSU,78,-10.0,129.5
-2015,2015-12-18,LBSU,73,ORE,94,-12.5,151.0
-2015,2015-12-18,ULL,59,PEPP,79,-3.0,153.0
-2015,2015-12-18,SCU,69,NEV,72,-8.5,130.0
-2015,2015-12-18,WEB,92,PORT,82,3.0,142.0
-2015,2015-12-18,CSF,69,ORST,82,-10.5,138.5
-2015,2015-12-18,ARST,70,UTM,74,-3.0,152.5
-2015,2015-12-18,MIOH,64,TNTC,77,-1.0,141.5
-2015,2015-12-18,EKY,81,ETSU,87,-4.0,161.5
-2015,2015-12-18,SIU,88,MURR,73,-3.0,141.0
-2015,2015-12-18,USA,72,SAM,70,-6.5,146.0
-2015,2015-12-18,JVST,60,LMU,77,-11.5,137.0
-2015,2015-12-18,IW,73,SJU,51,-7.5,139.5
-2015,2015-12-19,GT,61,UGA,75,-1.0,136.5
-2015,2015-12-19,UTAH,77,DUKE,75,-7.0,151.5
-2015,2015-12-19,NOVA,75,UVA,86,-5.5,130.0
-2015,2015-12-19,WKU,56,LOU,78,-23.0,141.0
-2015,2015-12-19,WICH,76,HALL,80,4.5,131.0
-2015,2015-12-19,AUB,61,XAV,85,-18.0,160.5
-2015,2015-12-19,COR,46,SYR,67,-18.5,144.0
-2015,2015-12-19,MSU,78,NE,58,9.5,140.0
-2015,2015-12-19,UNC,89,UCLA,76,8.0,160.0
-2015,2015-12-19,UCF,89,DET,95,-5.5,153.0
-2015,2015-12-19,NW,78,DEP,70,4.5,137.0
-2015,2015-12-19,ND,73,IND,80,1.5,158.0
-2015,2015-12-19,CHAR,82,APP,66,-4.5,149.5
-2015,2015-12-19,CSU,56,KSU,61,-8.5,146.0
-2015,2015-12-19,CREI,74,OKLA,87,-14.0,159.0
-2015,2015-12-19,ILST,65,JOES,79,-7.0,139.0
-2015,2015-12-19,MOST,45,VALP,74,-14.5,132.5
-2015,2015-12-19,FIU,75,NIU,78,-9.5,130.0
-2015,2015-12-19,UK,67,OSU,74,10.0,135.0
-2015,2015-12-19,COFC,63,MIA,85,-17.5,136.5
-2015,2015-12-19,CIN,69,VCU,63,1.5,136.5
-2015,2015-12-19,TULN,59,MSST,69,-6.5,142.5
-2015,2015-12-19,UIC,47,LOYI,64,-12.0,138.0
-2015,2015-12-19,OAK,97,WASH,83,-11.5,172.5
-2015,2015-12-19,DRKE,64,IOWA,70,-15.5,147.5
-2015,2015-12-19,GAST,66,USM,46,8.5,120.5
-2015,2015-12-19,AFA,67,UCD,60,-4.0,140.0
-2015,2015-12-19,FAU,59,FSU,64,-19.0,145.0
-2015,2015-12-19,PUR,68,BUT,74,4.5,151.0
-2015,2015-12-19,NCST,73,MIZ,59,3.5,140.0
-2015,2015-12-19,YSU,46,MICH,105,-21.0,145.5
-2015,2015-12-19,PRIN,61,MD,82,-12.5,142.0
-2015,2015-12-19,UAB,79,SF,68,7.0,130.5
-2015,2015-12-19,ISU,79,UNI,81,7.5,149.5
-2015,2015-12-19,PSU,63,DREX,57,6.0,128.5
-2015,2015-12-19,DEL,61,BC,69,-5.5,132.5
-2015,2015-12-19,INST,76,SLU,68,-3.5,134.0
-2015,2015-12-19,OKST,70,FLA,72,-9.5,128.5
-2015,2015-12-19,RICE,90,UNM,89,-16.5,149.5
-2015,2015-12-19,BAY,61,TAMU,80,-3.0,140.5
-2015,2015-12-19,UNLV,70,ARIZ,82,-11.0,136.0
-2015,2015-12-19,TENN,79,GONZ,86,-9.5,145.0
-2015,2015-12-19,TEX,75,STAN,73,2.0,134.5
-2015,2015-12-19,CSF,60,PORT,65,-2.0,150.5
-2015,2015-12-19,TLSA,71,ORST,76,0.0,136.0
-2015,2015-12-19,SPU,74,GW,87,-16.5,134.5
-2015,2015-12-19,SUU,68,IUPU,82,-8.0,139.5
-2015,2015-12-19,BEL,65,CLEV,67,6.0,148.0
-2015,2015-12-19,MONT,46,KU,88,-24.5,147.0
-2015,2015-12-19,MTST,73,BUFF,80,-12.0,156.0
-2015,2015-12-19,OMA,75,WYO,76,-4.5,152.0
-2015,2015-12-19,WOF,56,VAN,80,-17.5,133.0
-2015,2015-12-19,SDAK,79,ILL,91,-10.5,152.5
-2015,2015-12-19,EIU,65,HOU,81,-14.5,143.5
-2015,2015-12-19,FUR,50,DAY,70,-18.5,135.5
-2015,2015-12-19,IONA,74,URI,79,-12.0,152.5
-2015,2015-12-19,SEMO,69,NKU,79,-10.5,140.0
-2015,2015-12-19,UNCG,69,ELON,79,-7.5,151.5
-2015,2015-12-19,ORU,77,LSU,100,-11.0,159.5
-2015,2015-12-19,MER,69,ARK,66,-6.5,145.5
-2015,2015-12-19,RID,65,PROV,73,-12.5,133.5
-2015,2015-12-19,HBU,79,ASU,98,-20.0,141.0
-2015,2015-12-19,COPP,51,CAL,84,-31.5,153.0
-2015,2015-12-19,NMST,73,UTEP,53,-3.0,134.5
-2015,2015-12-20,DAV,69,PITT,94,-5.5,159.5
-2015,2015-12-20,ECU,61,JMU,67,-8.0,140.0
-2015,2015-12-20,BRAD,70,BSU,90,-23.0,133.5
-2015,2015-12-20,EVAN,85,FRES,77,-2.5,147.5
-2015,2015-12-20,BGSU,47,WRST,83,-2.5,135.5
-2015,2015-12-20,MONM,73,RUTG,67,10.5,142.5
-2015,2015-12-20,NAU,57,UALR,84,-16.5,129.0
-2015,2015-12-20,EWU,74,DEN,58,-5.5,138.5
-2015,2015-12-20,WCU,52,MORE,60,-8.5,135.0
-2015,2015-12-20,SAM,69,NEB,58,-13.0,142.0
-2015,2015-12-20,NJIT,83,SJU,74,-1.0,138.5
-2015,2015-12-21,AKR,84,UCSB,70,4.0,133.0
-2015,2015-12-21,APP,70,UNC,94,-32.0,157.5
-2015,2015-12-21,YSU,78,ND,87,-24.5,151.5
-2015,2015-12-21,PROV,90,UMASS,66,5.0,150.5
-2015,2015-12-21,SIU,65,SLU,52,1.0,141.0
-2015,2015-12-21,ORE,72,ALA,68,6.5,139.5
-2015,2015-12-21,UNT,82,CREI,105,-20.0,155.5
-2015,2015-12-21,PEPP,73,GONZ,99,-12.0,134.0
-2015,2015-12-21,LMU,60,PORT,87,-2.5,147.0
-2015,2015-12-21,SCU,72,PAC,73,-4.0,131.0
-2015,2015-12-21,SF,52,SMC,74,-17.5,135.5
-2015,2015-12-21,NCCU,63,SOU,88,-6.0,135.0
-2015,2015-12-21,OMA,80,EIU,68,9.0,159.5
-2015,2015-12-21,SHSU,53,UCI,63,-9.5,132.5
-2015,2015-12-21,NORF,85,UTEP,76,-6.5,141.0
-2015,2015-12-21,GCU,78,HOU,69,-2.5,147.0
-2015,2015-12-21,MRSH,90,WYO,82,-3.0,145.5
-2015,2015-12-21,IDST,62,NDSU,67,-16.0,141.0
-2015,2015-12-21,TRGV,69,USU,94,-20.0,140.5
-2015,2015-12-21,EKY,59,WVU,84,-25.5,162.0
-2015,2015-12-21,WIU,67,LOYI,72,-7.5,128.5
-2015,2015-12-21,UNCO,76,JVST,79,-4.0,144.0
-2015,2015-12-21,QUIN,61,ORST,82,-16.0,135.0
-2015,2015-12-21,SIUE,51,USC,70,-21.0,149.5
-2015,2015-12-21,SAC,60,STAN,70,-12.5,141.0
-2015,2015-12-21,ORU,61,NMST,76,-6.5,139.5
-2015,2015-12-21,SHU,67,NW,103,-23.0,145.0
-2015,2015-12-21,CHS,74,MARQ,91,-23.0,141.0
-2015,2015-12-22,MIA,95,LAS,49,16.5,142.5
-2015,2015-12-22,BYU,82,HARV,85,7.5,145.0
-2015,2015-12-22,ULM,96,CAN,108,-2.5,144.5
-2015,2015-12-22,CLEM,48,UGA,71,-2.5,124.0
-2015,2015-12-22,KENN,72,IND,99,-33.0,151.5
-2015,2015-12-22,UVU,77,UNCW,102,-14.5,152.0
-2015,2015-12-22,JOES,79,VT,62,3.0,141.0
-2015,2015-12-22,AUB,83,UNM,78,-4.0,157.0
-2015,2015-12-22,UALR,53,TTU,65,-4.5,129.0
-2015,2015-12-22,IONA,76,UCSB,80,1.5,150.5
-2015,2015-12-22,SFA,73,ASU,80,-6.5,140.5
-2015,2015-12-22,FOR,55,BC,64,4.0,135.5
-2015,2015-12-22,TROY,80,MISS,83,-17.0,154.5
-2015,2015-12-22,OMA,74,SOU,53,2.0,161.5
-2015,2015-12-22,BRWN,83,MRST,84,-2.5,146.5
-2015,2015-12-22,SF,49,HALL,66,-16.0,136.5
-2015,2015-12-22,TNST,55,ILST,66,-8.5,134.5
-2015,2015-12-22,ISU,81,CIN,79,-5.0,144.0
-2015,2015-12-22,XAV,78,WAKE,70,7.0,154.0
-2015,2015-12-22,USM,40,TULN,59,-11.0,124.0
-2015,2015-12-22,UNCG,52,NCST,58,-16.5,140.0
-2015,2015-12-22,MIOH,63,DAY,64,-16.0,133.5
-2015,2015-12-22,URI,65,ODU,71,-1.0,123.0
-2015,2015-12-22,BUFF,69,VCU,90,-13.0,147.0
-2015,2015-12-22,ETSU,67,TENN,76,-11.0,152.5
-2015,2015-12-22,FAU,54,HOF,68,-14.5,149.0
-2015,2015-12-22,DEL,48,NOVA,78,-25.5,137.0
-2015,2015-12-22,PENN,52,DREX,53,-4.0,137.0
-2015,2015-12-22,MSU,99,OAK,93,11.5,157.0
-2015,2015-12-22,MTST,60,SYR,82,-19.0,147.0
-2015,2015-12-22,MURR,49,WRST,65,-2.0,132.0
-2015,2015-12-22,GTWN,62,CHAR,59,12.5,150.5
-2015,2015-12-22,MTSU,62,GAST,64,-4.5,125.5
-2015,2015-12-22,BALL,61,INST,73,-5.5,133.5
-2015,2015-12-22,IPFW,89,WMU,86,-5.0,145.5
-2015,2015-12-22,SBON,70,SIE,73,-1.5,146.0
-2015,2015-12-22,SHSU,68,UTEP,87,-4.5,137.5
-2015,2015-12-22,NDSU,68,TRGV,50,17.0,138.0
-2015,2015-12-22,UND,49,KSU,63,-17.0,139.0
-2015,2015-12-22,VAN,55,PUR,68,-6.0,138.5
-2015,2015-12-22,SEMO,78,MOST,74,-15.5,139.5
-2015,2015-12-22,NEV,69,WICH,98,-16.5,133.0
-2015,2015-12-22,NAU,55,TLSA,90,-20.0,146.5
-2015,2015-12-22,AMER,51,LSU,79,-20.5,135.5
-2015,2015-12-22,CP,88,UTSA,73,10.0,155.0
-2015,2015-12-22,KENT,74,SMU,90,-10.5,140.5
-2015,2015-12-22,DET,74,WKU,79,-3.0,157.0
-2015,2015-12-22,WOF,77,PEAY,84,1.0,136.5
-2015,2015-12-22,IUPU,48,MEM,84,-14.5,145.0
-2015,2015-12-22,HOU,94,WYO,89,6.5,143.0
-2015,2015-12-22,RICE,67,USA,74,-2.5,151.0
-2015,2015-12-22,SUU,52,BUT,88,-26.0,155.5
-2015,2015-12-22,TNTC,63,IOWA,85,-20.0,150.5
-2015,2015-12-22,SJU,61,SC,75,-14.0,139.0
-2015,2015-12-22,LBSU,70,ARIZ,85,-17.0,145.5
-2015,2015-12-22,MER,44,OSU,64,-11.0,129.0
-2015,2015-12-22,GW,61,DEP,82,6.0,142.0
-2015,2015-12-22,CAL,62,UVA,63,-12.0,134.0
-2015,2015-12-22,SDKS,95,WEB,99,1.5,140.0
-2015,2015-12-22,UMKC,47,LOU,75,-24.0,138.5
-2015,2015-12-22,UCI,80,NORF,62,10.5,138.0
-2015,2015-12-22,IDHO,68,UCD,51,-5.5,138.0
-2015,2015-12-22,IDST,58,USU,69,-19.0,146.0
-2015,2015-12-22,DEN,54,UCRV,63,-5.0,127.0
-2015,2015-12-22,SDAK,68,UNLV,103,-13.0,147.5
-2015,2015-12-22,COLO,71,PSU,70,6.5,138.5
-2015,2015-12-22,GCU,85,MRSH,81,4.0,160.0
-2015,2015-12-22,KU,70,SDSU,57,7.5,135.5
-2015,2015-12-22,MCNS,53,UCLA,67,-28.0,154.0
-2015,2015-12-22,OKLA,88,WSU,60,13.5,151.0
-2015,2015-12-22,UNI,52,HAW,68,-4.0,146.0
-2015,2015-12-22,NCCU,57,EIU,52,4.0,133.5
-2015,2015-12-23,MORE,77,DAV,81,-8.0,147.5
-2015,2015-12-23,BGSU,62,CLEV,47,-4.5,130.5
-2015,2015-12-23,UNM,66,BYU,96,-1.5,158.5
-2015,2015-12-23,CCSU,52,CONN,99,-32.5,142.0
-2015,2015-12-23,AKR,78,IONA,64,7.5,152.0
-2015,2015-12-23,UMKC,56,UNCW,76,-8.5,152.0
-2015,2015-12-23,AUB,51,HARV,69,3.5,144.5
-2015,2015-12-23,MONM,78,COR,69,10.0,148.0
-2015,2015-12-23,ILL,68,MIZ,63,5.0,144.0
-2015,2015-12-23,WCU,73,PITT,79,-20.0,146.0
-2015,2015-12-23,UVU,68,LOU,98,-35.5,145.0
-2015,2015-12-23,TRGV,64,IDST,76,-4.5,144.5
-2015,2015-12-23,TCU,53,BRAD,49,10.5,127.5
-2015,2015-12-23,UNCO,69,MSST,93,-15.5,157.5
-2015,2015-12-23,NMSU,70,BAY,85,-12.0,130.0
-2015,2015-12-23,MILW,74,MINN,65,-4.5,142.5
-2015,2015-12-23,PSU,75,KENT,69,1.0,137.0
-2015,2015-12-23,LMU,62,GONZ,85,-17.5,144.0
-2015,2015-12-23,PEPP,79,PORT,87,3.0,141.5
-2015,2015-12-23,GB,79,WIS,84,-11.5,146.5
-2015,2015-12-23,OKLA,84,HAW,81,6.5,149.5
-2015,2015-12-23,LAF,64,USC,100,-23.0,163.5
-2015,2015-12-23,PAC,76,SF,89,-2.0,136.5
-2015,2015-12-23,CSN,63,USD,81,-2.0,126.0
-2015,2015-12-23,NDSU,62,USU,76,-6.0,135.0
-2015,2015-12-23,COLO,66,SMU,70,-5.0,148.5
-2015,2015-12-23,SMC,81,SCU,59,12.0,128.0
-2015,2015-12-23,WSU,59,UNI,63,-4.5,142.0
-2015,2015-12-25,UNM,59,WSU,82,4.0,149.0
-2015,2015-12-25,BYU,84,UNI,76,3.0,146.0
-2015,2015-12-25,AUB,67,HAW,79,-8.5,159.0
-2015,2015-12-25,HARV,71,OKLA,83,-13.0,139.5
-2015,2015-12-26,LOU,73,UK,75,-3.0,139.5
-2015,2015-12-27,PRE,66,MARQ,84,-23.0,139.5
-2015,2015-12-27,TXSO,67,SYR,80,-17.0,137.0
-2015,2015-12-27,MRSH,67,MD,87,-22.0,157.0
-2015,2015-12-27,MTSU,61,SDKS,65,-4.5,138.5
-2015,2015-12-27,SCST,57,OSU,73,-25.0,136.0
-2015,2015-12-27,LOYM,59,NW,74,-20.0,140.0
-2015,2015-12-28,PENN,57,NOVA,77,-26.5,132.0
-2015,2015-12-28,DET,73,EMU,88,-3.5,155.0
-2015,2015-12-28,ELON,66,DUKE,105,-24.5,160.0
-2015,2015-12-28,DAV,60,CAL,86,-9.5,154.5
-2015,2015-12-28,UCSB,83,WASH,78,-9.0,154.0
-2015,2015-12-28,UNCG,63,UNC,96,-27.5,152.0
-2015,2015-12-28,GB,78,MORE,72,-5.0,147.0
-2015,2015-12-28,COR,65,SPU,62,-7.0,139.0
-2015,2015-12-28,IUPU,54,BUT,92,-24.0,153.0
-2015,2015-12-28,DREX,70,IONA,77,-9.0,148.5
-2015,2015-12-28,VALP,81,BEL,85,4.0,143.0
-2015,2015-12-28,UML,66,RUTG,89,-6.0,147.0
-2015,2015-12-28,COPP,77,CREI,102,-30.5,164.0
-2015,2015-12-29,WAKE,77,LSU,71,-7.0,163.0
-2015,2015-12-29,FSU,73,FLA,71,-5.0,138.0
-2015,2015-12-29,DEL,79,BUFF,99,-6.5,140.0
-2015,2015-12-29,CMU,84,WMRY,88,-6.5,150.5
-2015,2015-12-29,SLU,47,KSU,75,-13.0,126.5
-2015,2015-12-29,JVST,59,ALA,67,-18.0,131.0
-2015,2015-12-29,CP,63,TAMU,82,-15.0,147.0
-2015,2015-12-29,NIU,70,UIC,65,9.0,137.5
-2015,2015-12-29,UTM,57,FAU,48,-2.5,130.0
-2015,2015-12-29,TNST,69,TENN,74,-12.0,143.0
-2015,2015-12-29,TULN,65,MEM,77,-12.0,137.5
-2015,2015-12-29,MAN,64,EKY,76,-6.0,161.5
-2015,2015-12-29,TEM,77,CIN,70,-11.5,132.5
-2015,2015-12-29,TXSO,59,BAY,72,-21.0,144.5
-2015,2015-12-29,SMU,81,TLSA,69,5.0,140.5
-2015,2015-12-29,RICH,70,TTU,85,-5.5,144.0
-2015,2015-12-29,LIB,56,ND,73,-31.0,137.0
-2015,2015-12-29,PRIN,64,MIA,76,-15.5,148.0
-2015,2015-12-29,PUR,61,WIS,55,5.0,131.0
-2015,2015-12-29,DUQ,67,GT,73,-9.0,151.5
-2015,2015-12-29,NE,66,NCST,72,-6.5,139.5
-2015,2015-12-29,RMU,67,UGA,79,-18.0,133.0
-2015,2015-12-29,GW,67,UCF,50,5.0,140.0
-2015,2015-12-29,CIT,93,CHAR,111,-8.0,175.0
-2015,2015-12-29,UCI,53,KU,78,-17.0,142.5
-2015,2015-12-29,CONN,71,TEX,66,-2.5,141.5
-2015,2015-12-29,MSU,70,IOWA,83,-2.5,142.0
-2015,2015-12-29,CSN,79,IDST,84,2.0,146.0
-2015,2015-12-29,CSF,82,PRST,89,-2.5,148.0
-2015,2015-12-30,HOU,73,SF,67,7.5,137.5
-2015,2015-12-30,MICH,78,ILL,68,5.5,140.5
-2015,2015-12-30,WVU,88,VT,63,8.0,149.0
-2015,2015-12-30,IND,79,RUTG,72,17.0,150.5
-2015,2015-12-30,LBSU,81,DUKE,103,-21.5,156.5
-2015,2015-12-30,NW,81,NEB,72,-3.5,130.0
-2015,2015-12-30,PSU,64,MD,70,-15.0,135.0
-2015,2015-12-30,OAK,58,UVA,71,-17.0,151.5
-2015,2015-12-30,URI,88,BRWN,85,8.0,137.0
-2015,2015-12-30,MINN,63,OSU,78,-10.5,137.5
-2015,2015-12-30,CLEM,69,UNC,80,-15.0,143.5
-2015,2015-12-30,HALL,83,MARQ,63,-3.5,141.5
-2015,2015-12-30,UCRV,59,OHIO,81,-8.0,145.0
-2015,2015-12-30,NKU,73,TOL,90,-11.5,145.5
-2015,2015-12-30,NIAG,68,SBON,82,-14.5,137.0
-2015,2015-12-30,ORU,84,IPFW,90,-4.5,152.5
-2015,2015-12-30,ARK,81,DAY,85,-8.5,146.0
-2015,2015-12-30,BRAD,44,UNI,80,-20.0,124.5
-2015,2015-12-30,INST,62,EVAN,70,-10.0,147.5
-2015,2015-12-30,MOST,61,ILST,74,-7.5,135.0
-2015,2015-12-30,SIU,72,LOYI,62,-1.5,132.5
-2015,2015-12-30,UALR,69,USA,60,8.0,127.0
-2015,2015-12-30,GAST,70,UTA,85,-4.5,136.5
-2015,2015-12-30,ARST,84,TROY,81,-4.5,157.0
-2015,2015-12-30,GASO,66,TXST,80,-7.0,129.5
-2015,2015-12-30,NEV,76,UNM,88,-8.0,147.0
-2015,2015-12-30,WMU,61,VAN,86,-19.0,140.0
-2015,2015-12-30,SYR,61,PITT,72,-7.5,139.5
-2015,2015-12-30,GTWN,70,DEP,58,3.5,141.0
-2015,2015-12-30,UCD,56,BSU,64,-17.0,145.0
-2015,2015-12-30,WYO,55,SDSU,67,-12.0,123.5
-2015,2015-12-30,USU,80,SJSU,71,7.5,144.5
-2015,2015-12-30,FRES,69,UNLV,66,-7.5,144.5
-2015,2015-12-30,MORE,72,ETSU,75,1.5,137.0
-2015,2015-12-31,XAV,64,NOVA,95,-6.5,143.0
-2015,2015-12-31,DEL,80,HOF,90,-11.5,147.5
-2015,2015-12-31,DREX,63,UNCW,75,-13.5,143.5
-2015,2015-12-31,COFC,65,JMU,62,-6.0,136.0
-2015,2015-12-31,DRKE,47,WICH,67,-18.5,132.5
-2015,2015-12-31,CREI,80,SJU,70,8.0,147.5
-2015,2015-12-31,NE,86,ELON,79,3.0,154.5
-2015,2015-12-31,PROV,81,BUT,73,-7.5,150.0
-2015,2015-12-31,APP,56,ULM,72,-8.5,136.5
-2015,2015-12-31,TOWS,76,WMRY,69,-7.5,138.0
-2015,2015-12-31,GONZ,79,SCU,77,15.0,133.5
-2015,2015-12-31,PORT,95,SF,107,1.5,146.0
-2015,2015-12-31,USD,75,PAC,77,-6.0,132.0
-2015,2015-12-31,BYU,74,SMC,85,-6.0,150.0
-2015,2015-12-31,EIU,84,TNTC,94,-8.0,138.5
-2015,2015-12-31,BEL,92,SEMO,82,13.5,157.0
-2015,2015-12-31,MONT,90,NAU,84,6.5,138.0
-2015,2015-12-31,WOF,57,HARV,77,-7.0,129.0
-2015,2015-12-31,SIUE,67,JVST,72,-3.0,134.0
-2015,2015-12-31,IDHO,74,UND,71,2.5,132.0
-2015,2015-12-31,MTST,82,SUU,93,-1.5,151.0
-2015,2015-12-31,EWU,90,UNCO,96,5.5,157.5
-2015,2016-01-01,WIU,80,OMA,82,-8.0,159.0
-2015,2016-01-01,IUPU,77,SDAK,66,-7.0,150.5
-2015,2016-01-01,UNT,70,UTSA,66,2.5,162.0
-2015,2016-01-01,DEN,59,SDKS,68,-14.0,133.0
-2015,2016-01-01,RICE,60,UTEP,61,-7.0,156.0
-2015,2016-01-01,USC,90,WSU,77,3.5,150.0
-2015,2016-01-01,UTAH,68,STAN,70,5.0,138.0
-2015,2016-01-01,UCLA,93,WASH,96,1.0,160.0
-2015,2016-01-01,COLO,65,CAL,79,-7.5,144.5
-2015,2016-01-02,BUT,69,XAV,88,-5.0,152.0
-2015,2016-01-02,SJSU,57,AFA,64,-9.5,143.5
-2015,2016-01-02,TENN,77,AUB,83,-1.5,158.5
-2015,2016-01-02,TEX,74,TTU,82,-3.5,140.5
-2015,2016-01-02,NCST,68,VT,73,2.5,144.0
-2015,2016-01-02,RUTG,57,WIS,79,-16.5,132.0
-2015,2016-01-02,IONA,78,QUIN,66,5.0,155.0
-2015,2016-01-02,NKU,70,GB,86,-12.5,160.0
-2015,2016-01-02,UIC,47,VALP,75,-25.5,134.5
-2015,2016-01-02,LOYI,58,INST,73,-5.0,127.0
-2015,2016-01-02,MTST,74,NAU,72,-1.5,159.5
-2015,2016-01-02,ETSU,82,WCU,66,-4.0,147.0
-2015,2016-01-02,SAM,50,MER,69,-5.5,128.5
-2015,2016-01-02,SYR,51,MIA,64,-11.5,139.0
-2015,2016-01-02,DAY,66,DUQ,58,7.0,147.5
-2015,2016-01-02,CLEV,68,OAK,86,-13.5,148.0
-2015,2016-01-02,MSU,69,MINN,61,9.0,144.5
-2015,2016-01-02,YSU,87,DET,96,-12.0,169.0
-2015,2016-01-02,MORE,57,MURR,62,-1.5,130.0
-2015,2016-01-02,DEP,74,HALL,78,-10.5,139.0
-2015,2016-01-02,GT,78,UNC,86,-14.5,154.0
-2015,2016-01-02,WVU,87,KSU,83,4.5,138.5
-2015,2016-01-02,JMU,73,DEL,63,4.0,140.0
-2015,2016-01-02,HOU,77,TEM,50,-6.0,144.0
-2015,2016-01-02,PSU,56,MICH,79,-11.0,132.5
-2015,2016-01-02,FSU,75,CLEM,84,2.5,132.0
-2015,2016-01-02,CHAR,65,ODU,74,-14.5,134.5
-2015,2016-01-02,JOES,77,RICH,73,-4.5,147.0
-2015,2016-01-02,CHAT,84,CIT,78,12.5,174.0
-2015,2016-01-02,EWU,71,UND,79,2.0,146.0
-2015,2016-01-02,SJU,65,PROV,83,-16.5,141.0
-2015,2016-01-02,IDHO,75,UNCO,70,3.0,144.5
-2015,2016-01-02,PORT,77,SCU,84,1.5,142.0
-2015,2016-01-02,TCU,48,OKST,69,-6.0,133.0
-2015,2016-01-02,BAY,74,KU,102,-12.0,146.5
-2015,2016-01-02,COFC,70,WMRY,78,-5.5,137.0
-2015,2016-01-02,DREX,78,ELON,83,-5.5,145.5
-2015,2016-01-02,TLSA,57,CIN,76,-8.5,137.0
-2015,2016-01-02,IND,79,NEB,69,5.0,151.5
-2015,2016-01-02,WRST,84,MILW,82,-7.5,133.5
-2015,2016-01-02,EVAN,76,MOST,59,7.0,145.0
-2015,2016-01-02,VMI,57,FUR,85,-6.5,133.0
-2015,2016-01-02,ARK,69,TAMU,92,-11.5,152.5
-2015,2016-01-02,SLU,57,URI,85,-11.0,132.0
-2015,2016-01-02,DUKE,81,BC,64,14.5,142.5
-2015,2016-01-02,ND,66,UVA,77,-9.5,134.5
-2015,2016-01-02,GMU,47,VCU,71,-14.5,135.0
-2015,2016-01-02,ARST,89,USA,67,-3.5,151.5
-2015,2016-01-02,UALR,67,TROY,61,8.0,132.0
-2015,2016-01-02,TNST,72,SEMO,66,5.5,138.5
-2015,2016-01-02,GAST,58,TXST,46,1.5,119.0
-2015,2016-01-02,MARQ,70,GTWN,80,-7.0,142.0
-2015,2016-01-02,EIU,75,JVST,64,-3.0,132.5
-2015,2016-01-02,MEM,76,SC,86,-8.0,148.0
-2015,2016-01-02,WYO,68,NEV,71,-5.5,138.5
-2015,2016-01-02,BYU,81,PAC,67,9.5,156.0
-2015,2016-01-02,UCF,71,ECU,68,-4.0,137.5
-2015,2016-01-02,IOWA,70,PUR,63,-9.0,142.5
-2015,2016-01-02,NE,65,UNCW,63,-5.5,152.5
-2015,2016-01-02,CSU,80,BSU,84,-11.5,153.0
-2015,2016-01-02,MISS,61,UK,83,-11.5,148.5
-2015,2016-01-02,ISU,83,OKLA,87,-7.5,163.0
-2015,2016-01-02,HOF,90,TOWS,58,1.0,145.5
-2015,2016-01-02,USM,57,LT,87,-17.0,131.5
-2015,2016-01-02,CAN,92,MRST,83,5.0,154.0
-2015,2016-01-02,FAIR,66,MAN,72,0.0,152.5
-2015,2016-01-02,NIAG,63,SIE,75,-12.0,140.5
-2015,2016-01-02,UNCG,76,WOF,87,-7.0,132.0
-2015,2016-01-02,CONN,75,TULN,67,10.5,136.5
-2015,2016-01-02,SF,58,SMU,72,-25.5,136.5
-2015,2016-01-02,LMU,65,PEPP,68,-8.0,141.0
-2015,2016-01-02,UGA,63,FLA,77,-8.5,130.0
-2015,2016-01-02,MD,72,NW,59,4.5,138.5
-2015,2016-01-02,DAV,85,SBON,97,-1.0,158.5
-2015,2016-01-02,UNI,73,SIU,75,1.5,139.5
-2015,2016-01-02,EKY,79,PEAY,70,-2.0,163.0
-2015,2016-01-02,GASO,72,UTA,93,-16.5,152.0
-2015,2016-01-02,APP,58,ULL,79,-15.5,163.0
-2015,2016-01-02,SIUE,63,TNTC,86,-7.5,147.5
-2015,2016-01-02,LSU,90,VAN,82,-10.0,147.5
-2015,2016-01-02,MONT,83,SUU,66,4.0,138.0
-2015,2016-01-02,IDST,56,WEB,77,-17.5,149.0
-2015,2016-01-02,UNM,77,FRES,62,-5.0,147.0
-2015,2016-01-02,SDSU,70,USU,67,1.0,126.5
-2015,2016-01-02,USD,46,SMC,79,-20.0,126.0
-2015,2016-01-02,NOVA,85,CREI,71,7.5,153.0
-2015,2016-01-02,SAC,68,PRST,76,-2.0,154.0
-2015,2016-01-02,NMSU,52,UCI,54,-6.0,128.0
-2015,2016-01-02,GONZ,102,SF,94,13.5,143.0
-2015,2016-01-03,WKU,76,MRSH,94,-2.5,161.0
-2015,2016-01-03,ARIZ,94,ASU,82,3.5,138.5
-2015,2016-01-03,DEN,49,NDSU,75,-8.0,124.5
-2015,2016-01-03,WICH,85,BRAD,58,21.0,122.5
-2015,2016-01-03,ILST,67,DRKE,62,-1.5,134.0
-2015,2016-01-03,FAU,59,FIU,76,-5.0,125.0
-2015,2016-01-03,USC,85,WASH,87,2.0,163.0
-2015,2016-01-03,MTSU,67,UAB,78,-6.5,132.5
-2015,2016-01-03,WIU,59,SDKS,63,-13.0,146.0
-2015,2016-01-03,RICE,80,UTSA,85,6.0,160.0
-2015,2016-01-03,UNT,75,UTEP,84,-8.5,147.0
-2015,2016-01-03,ILL,73,OSU,75,-9.0,141.0
-2015,2016-01-03,UMASS,74,LAS,67,1.0,151.0
-2015,2016-01-03,IUPU,71,OMA,76,-9.0,158.5
-2015,2016-01-03,FOR,63,GW,69,-10.0,138.0
-2015,2016-01-03,ORE,57,ORST,70,2.0,143.0
-2015,2016-01-03,UTAH,58,CAL,71,-3.0,141.5
-2015,2016-01-03,WAKE,57,LOU,65,-14.5,149.0
-2015,2016-01-03,SDAK,94,ORU,84,-6.5,159.0
-2015,2016-01-03,UCLA,78,WSU,85,3.5,148.0
-2015,2016-01-03,COLO,56,STAN,55,-2.0,140.0
-2015,2016-01-04,WVU,95,TCU,87,9.5,140.0
-2015,2016-01-04,YSU,100,OAK,98,-17.0,171.5
-2015,2016-01-04,UNC,106,FSU,90,3.5,163.5
-2015,2016-01-04,DART,85,FAIR,97,-5.0,142.5
-2015,2016-01-04,CAN,66,MONM,81,-8.5,165.5
-2015,2016-01-04,NIAG,52,IONA,65,-16.0,149.0
-2015,2016-01-04,SIE,87,MAN,92,3.0,142.5
-2015,2016-01-04,SPU,68,MRST,60,-1.5,134.5
-2015,2016-01-04,RID,60,QUIN,64,1.0,129.0
-2015,2016-01-04,CLEV,80,DET,88,-8.0,148.0
-2015,2016-01-04,WRST,68,GB,76,-6.5,149.0
-2015,2016-01-04,NKU,67,MILW,76,-11.0,144.5
-2015,2016-01-04,OKLA,106,KU,109,-7.5,159.0
-2015,2016-01-04,UVA,68,VT,70,12.5,133.0
-2015,2016-01-04,ALCN,58,TXSO,74,-16.5,144.0
-2015,2016-01-05,RICH,65,URI,77,-5.0,144.5
-2015,2016-01-05,WIS,58,IND,59,-7.5,144.5
-2015,2016-01-05,MINN,77,PSU,86,-5.5,132.5
-2015,2016-01-05,VCU,85,JOES,82,-1.0,144.0
-2015,2016-01-05,MARQ,65,PROV,64,-9.5,151.5
-2015,2016-01-05,ECU,43,TLSA,55,-12.0,142.5
-2015,2016-01-05,KENT,87,WMU,84,1.5,146.5
-2015,2016-01-05,AKR,75,BUFF,71,2.5,142.0
-2015,2016-01-05,SC,81,AUB,69,6.5,157.5
-2015,2016-01-05,BUT,77,DEP,72,9.5,152.5
-2015,2016-01-05,CLEM,74,SYR,73,-4.5,124.0
-2015,2016-01-05,TEM,55,CONN,53,-10.5,141.0
-2015,2016-01-05,KSU,57,TEX,60,-5.5,137.0
-2015,2016-01-05,OKST,62,BAY,79,-9.0,134.5
-2015,2016-01-05,TULN,45,HOU,63,-10.5,141.0
-2015,2016-01-05,NEB,66,IOWA,77,-13.5,141.5
-2015,2016-01-05,UK,67,LSU,85,3.0,156.0
-2015,2016-01-05,GTWN,66,CREI,79,-3.0,152.5
-2015,2016-01-05,VAND,85,ARK,90,2.0,152.5
-2015,2016-01-05,BSU,76,USU,61,1.5,144.5
-2015,2016-01-05,FUR,66,UNCG,67,2.5,131.5
-2015,2016-01-05,WOF,65,VMI,61,4.0,137.5
-2015,2016-01-05,MER,62,CHAT,74,-5.0,127.5
-2015,2016-01-05,CIT,74,SAM,94,-10.5,171.0
-2015,2016-01-06,MIZ,59,UGA,77,-9.5,134.5
-2015,2016-01-06,GT,84,PITT,89,-8.5,146.0
-2015,2016-01-06,DUKE,91,WAKE,75,7.5,158.5
-2015,2016-01-06,DUQ,66,DAV,77,-7.0,166.5
-2015,2016-01-06,LAS,61,FOR,66,-9.0,136.5
-2015,2016-01-06,HALL,63,NOVA,72,-15.0,141.0
-2015,2016-01-06,RUTG,63,MD,88,-23.0,140.5
-2015,2016-01-06,FLA,69,TENN,83,4.5,144.0
-2015,2016-01-06,SF,64,UCF,75,-8.0,133.5
-2015,2016-01-06,MIOH,62,BGSU,73,-3.5,131.5
-2015,2016-01-06,EMU,99,CMU,80,-3.5,150.0
-2015,2016-01-06,TOL,69,BALL,87,2.0,140.5
-2015,2016-01-06,GW,62,SLU,65,9.5,135.0
-2015,2016-01-06,OHIO,69,NIU,80,2.0,141.5
-2015,2016-01-06,LOYI,52,ILST,54,-7.0,126.0
-2015,2016-01-06,UNI,58,MOST,59,6.5,134.5
-2015,2016-01-06,SIU,65,BRAD,44,11.0,131.5
-2015,2016-01-06,EVAN,64,WICH,67,-10.0,139.0
-2015,2016-01-06,INST,79,DRKE,69,1.0,132.5
-2015,2016-01-06,UMASS,63,DAY,93,-13.5,143.0
-2015,2016-01-06,SBON,77,GMU,58,3.5,134.5
-2015,2016-01-06,TAMU,61,MSST,60,7.0,145.5
-2015,2016-01-06,TTU,69,ISU,76,-11.0,155.5
-2015,2016-01-06,XAV,74,SJU,66,15.0,142.5
-2015,2016-01-06,OSU,65,NW,56,-2.0,135.5
-2015,2016-01-06,AFA,52,WYO,64,-5.0,134.5
-2015,2016-01-06,CAL,65,ORE,68,-3.5,142.0
-2015,2016-01-06,UNLV,65,CSU,66,4.0,148.0
-2015,2016-01-06,NEV,63,FRES,85,-7.5,147.0
-2015,2016-01-06,SJSU,62,SDSU,77,-19.5,133.0
-2015,2016-01-06,LBSU,94,CSN,79,5.5,153.5
-2015,2016-01-06,STAN,78,ORST,72,-6.5,134.0
-2015,2016-01-06,SDAK,65,IPFW,85,-5.0,161.5
-2015,2016-01-06,TNST,66,EIU,61,1.0,135.0
-2015,2016-01-06,ORU,75,DEN,78,-6.5,136.5
-2015,2016-01-06,BEL,85,SIUE,77,11.5,156.0
-2015,2016-01-06,CP,73,HAW,86,-10.5,152.0
-2015,2016-01-07,UTEP,72,MTSU,78,-9.0,137.0
-2015,2016-01-07,FAU,67,MRSH,90,-12.0,153.0
-2015,2016-01-07,HOF,61,COFC,72,3.0,145.0
-2015,2016-01-07,UNCW,60,TOWS,76,3.5,144.5
-2015,2016-01-07,DEL,56,NE,88,-11.5,138.5
-2015,2016-01-07,ND,82,BC,54,9.5,139.0
-2015,2016-01-07,ELON,79,JMU,73,-7.5,156.5
-2015,2016-01-07,WMRY,72,DREX,63,4.0,137.0
-2015,2016-01-07,LOU,77,NCST,72,6.5,134.0
-2015,2016-01-07,CIN,57,SMU,59,-6.0,137.0
-2015,2016-01-07,UTA,71,APP,67,12.0,152.0
-2015,2016-01-07,USA,64,GASO,58,-4.0,148.0
-2015,2016-01-07,GB,87,CLEV,67,3.0,149.0
-2015,2016-01-07,TROY,68,GAST,72,-12.0,139.0
-2015,2016-01-07,MILW,81,YSU,65,6.5,154.5
-2015,2016-01-07,CHAR,82,USM,76,4.5,133.0
-2015,2016-01-07,UTSA,82,UAB,104,-20.5,153.0
-2015,2016-01-07,FIU,75,WKU,72,-8.0,135.5
-2015,2016-01-07,ULL,57,UALR,77,-5.5,142.5
-2015,2016-01-07,ULM,65,ARST,68,-2.0,145.0
-2015,2016-01-07,ARIZ,84,UCLA,87,3.0,152.0
-2015,2016-01-07,ALA,66,MISS,74,-5.5,134.0
-2015,2016-01-07,ILL,54,MSU,79,-13.5,142.0
-2015,2016-01-07,MICH,70,PUR,87,-9.0,132.0
-2015,2016-01-07,ODU,56,LT,53,-3.0,136.0
-2015,2016-01-07,PAC,76,PEPP,81,-9.5,138.5
-2015,2016-01-07,SMC,73,LMU,48,12.0,138.5
-2015,2016-01-07,SF,73,USD,65,-2.0,139.0
-2015,2016-01-07,ASU,65,USC,75,-5.5,154.5
-2015,2016-01-07,UCD,55,UCI,76,-12.5,128.0
-2015,2016-01-07,SCU,61,BYU,97,-16.5,152.0
-2015,2016-01-07,CSF,79,UCRV,73,-5.0,138.5
-2015,2016-01-07,SDKS,67,IUPU,74,6.5,143.5
-2015,2016-01-07,SEMO,69,MORE,96,-16.0,135.5
-2015,2016-01-07,SPU,61,NIAG,63,2.5,123.5
-2015,2016-01-07,FAIR,76,SIE,91,-5.5,156.5
-2015,2016-01-07,MAN,94,CAN,86,-10.0,154.5
-2015,2016-01-07,RID,58,IONA,67,-9.5,143.5
-2015,2016-01-07,UTM,78,EKY,70,-4.0,153.5
-2015,2016-01-07,TNTC,71,MURR,65,-6.5,143.5
-2015,2016-01-07,OMA,91,NDSU,82,-6.0,150.5
-2015,2016-01-07,JVST,54,PEAY,73,-8.0,144.5
-2015,2016-01-07,PRST,66,MONT,79,-8.5,140.5
-2015,2016-01-07,UND,62,WEB,74,-14.0,140.0
-2015,2016-01-07,UNCO,78,IDST,83,-2.5,160.0
-2015,2016-01-07,SAC,64,MTST,71,-3.0,155.5
-2015,2016-01-08,VALP,84,OAK,67,2.5,155.5
-2015,2016-01-08,BUFF,76,KENT,67,-6.5,151.5
-2015,2016-01-08,WMU,53,AKR,62,-10.0,141.5
-2015,2016-01-08,UIC,69,DET,87,-16.0,160.5
-2015,2016-01-08,UTAH,56,COLO,54,0.0,142.5
-2015,2016-01-09,TAMU,92,TENN,88,4.0,149.5
-2015,2016-01-09,OKST,60,WVU,77,-14.5,143.5
-2015,2016-01-09,MER,91,CIT,80,9.0,162.5
-2015,2016-01-09,LSU,62,FLA,68,-3.5,152.0
-2015,2016-01-09,NEV,86,AFA,63,-2.5,142.5
-2015,2016-01-09,UTEP,80,UAB,87,-11.0,145.5
-2015,2016-01-09,RICE,74,UNT,85,-1.0,154.0
-2015,2016-01-09,UVA,64,GT,68,6.0,131.0
-2015,2016-01-09,CREI,82,HALL,67,-4.5,152.5
-2015,2016-01-09,SJU,75,MARQ,81,-12.0,142.5
-2015,2016-01-09,DART,70,HARV,77,-9.0,129.0
-2015,2016-01-09,BALL,73,OHIO,79,-8.0,142.0
-2015,2016-01-09,DAY,57,LAS,61,12.0,138.5
-2015,2016-01-09,SPU,70,CAN,53,-8.0,151.0
-2015,2016-01-09,CMU,79,BGSU,67,0.0,149.5
-2015,2016-01-09,QUIN,74,MONM,88,-15.0,142.5
-2015,2016-01-09,ILST,65,INST,77,-5.0,132.5
-2015,2016-01-09,SAM,64,WOF,69,-4.5,136.5
-2015,2016-01-09,SEMO,69,EKY,88,-13.0,162.5
-2015,2016-01-09,USA,55,GAST,70,-13.5,129.0
-2015,2016-01-09,NW,77,MINN,52,2.5,139.5
-2015,2016-01-09,VT,58,DUKE,82,-18.0,155.0
-2015,2016-01-09,DEP,63,GTWN,74,-10.5,140.0
-2015,2016-01-09,SBON,88,UMASS,77,3.0,151.5
-2015,2016-01-09,CHAT,55,FUR,70,5.0,134.5
-2015,2016-01-09,MD,63,WIS,60,2.5,133.0
-2015,2016-01-09,WRST,60,NKU,46,-1.0,136.5
-2015,2016-01-09,VAN,65,SC,69,-2.5,145.5
-2015,2016-01-09,BAY,94,ISU,89,-7.0,156.5
-2015,2016-01-09,EIU,59,BEL,85,-16.0,155.5
-2015,2016-01-09,FAU,82,WKU,86,-12.5,136.5
-2015,2016-01-09,WASH,99,WSU,95,-1.0,160.5
-2015,2016-01-09,MAN,53,NIAG,55,2.5,134.5
-2015,2016-01-09,IUPU,67,WIU,60,-5.5,139.0
-2015,2016-01-09,IDHO,60,EWU,74,-3.0,143.0
-2015,2016-01-09,MILW,65,CLEV,62,5.0,134.5
-2015,2016-01-09,TXST,56,APP,76,2.5,126.0
-2015,2016-01-09,MSST,68,ARK,82,-7.5,157.0
-2015,2016-01-09,SMC,64,PEPP,67,8.5,134.5
-2015,2016-01-09,COFC,54,DREX,61,1.0,130.0
-2015,2016-01-09,TOWS,59,JMU,73,-5.0,133.5
-2015,2016-01-09,PITT,86,ND,82,-5.0,150.0
-2015,2016-01-09,NE,60,WMRY,78,-2.0,144.0
-2015,2016-01-09,MRST,80,IONA,90,-15.0,152.5
-2015,2016-01-09,TOL,84,MIOH,76,3.0,143.0
-2015,2016-01-09,UTSA,71,MTSU,79,-19.5,153.5
-2015,2016-01-09,BRAD,35,EVAN,67,-25.0,133.0
-2015,2016-01-09,MOST,56,LOYI,54,-5.0,125.5
-2015,2016-01-09,WICH,83,SIU,58,7.5,137.5
-2015,2016-01-09,UNCG,83,ETSU,86,-6.5,144.5
-2015,2016-01-09,PRST,77,MTST,70,-2.5,155.5
-2015,2016-01-09,KSU,76,OKLA,86,-13.0,143.0
-2015,2016-01-09,PRIN,73,PENN,71,7.0,140.5
-2015,2016-01-09,VMI,52,WCU,73,-7.5,140.0
-2015,2016-01-09,TROY,88,GASO,93,-1.0,155.0
-2015,2016-01-09,CSU,85,SJSU,84,6.5,151.0
-2015,2016-01-09,NEB,90,RUTG,56,6.0,139.0
-2015,2016-01-09,FSU,59,MIA,72,-9.5,148.0
-2015,2016-01-09,OMA,79,SDAK,73,1.0,168.5
-2015,2016-01-09,ASU,74,UCLA,81,-5.5,150.0
-2015,2016-01-09,UNLV,57,WYO,59,6.5,134.5
-2015,2016-01-09,USU,59,UNM,77,-7.5,145.5
-2015,2016-01-09,FRES,70,BSU,81,-6.5,147.0
-2015,2016-01-09,PAC,60,LMU,58,-3.5,143.5
-2015,2016-01-09,UK,77,ALA,61,6.5,133.5
-2015,2016-01-09,HOF,80,ELON,76,3.0,166.0
-2015,2016-01-09,IPFW,65,DEN,64,-2.0,135.0
-2015,2016-01-09,UTM,58,MORE,64,-7.5,130.0
-2015,2016-01-09,JVST,54,MURR,69,-12.5,133.0
-2015,2016-01-09,ULM,57,UALR,58,-11.0,121.0
-2015,2016-01-09,UCD,47,LBSU,59,-11.5,150.0
-2015,2016-01-09,TEX,57,TCU,58,3.0,140.5
-2015,2016-01-09,UNCW,85,DEL,67,6.5,148.5
-2015,2016-01-09,MEM,78,CONN,81,-7.0,145.0
-2015,2016-01-09,GMU,75,DAV,81,-12.0,148.0
-2015,2016-01-09,CHAR,90,LT,93,-11.5,156.0
-2015,2016-01-09,FIU,81,MRSH,99,-10.0,156.0
-2015,2016-01-09,ARIZ,101,USC,103,3.0,155.5
-2015,2016-01-09,FAIR,69,RID,64,-2.5,143.5
-2015,2016-01-09,GB,93,YSU,103,7.5,169.6
-2015,2016-01-09,TNTC,72,PEAY,66,-2.0,152.0
-2015,2016-01-09,UNC,84,SYR,73,7.5,152.5
-2015,2016-01-09,PORT,74,GONZ,85,-18.0,158.0
-2015,2016-01-09,DUQ,64,GW,91,-10.5,144.5
-2015,2016-01-09,ODU,71,USM,73,12.0,118.5
-2015,2016-01-09,NDSU,65,ORU,66,0.0,147.5
-2015,2016-01-09,DRKE,44,UNI,77,-12.0,133.5
-2015,2016-01-09,ULL,69,ARST,71,3.5,165.5
-2015,2016-01-09,UGA,71,MISS,72,-4.0,138.5
-2015,2016-01-09,EMU,63,NIU,80,-1.5,137.0
-2015,2016-01-09,SIUE,60,TNST,63,-7.5,138.5
-2015,2016-01-09,UNCO,68,WEB,65,-16.5,158.5
-2015,2016-01-09,SAC,58,MONT,77,-8.5,137.5
-2015,2016-01-09,UND,84,IDST,76,-1.0,142.5
-2015,2016-01-09,SF,92,BYU,102,-17.5,163.5
-2015,2016-01-09,AUB,61,MIZ,76,-2.5,146.5
-2015,2016-01-09,NAU,73,SUU,63,-5.0,148.0
-2015,2016-01-09,CSN,85,CSF,75,-5.0,150.5
-2015,2016-01-09,KU,69,TTU,59,7.5,149.0
-2015,2016-01-09,ECU,60,TEM,78,-9.5,132.5
-2015,2016-01-09,CAL,71,ORST,77,2.5,137.0
-2015,2016-01-09,SCU,65,USD,53,-1.5,128.0
-2015,2016-01-09,UCRV,68,UCI,84,-13.0,129.5
-2015,2016-01-09,UCSB,57,HAW,65,-8.5,144.0
-2015,2016-01-10,CIN,54,SF,51,15.5,131.5
-2015,2016-01-10,MSU,92,PSU,65,9.0,134.5
-2015,2016-01-10,LOU,62,CLEM,66,7.0,130.5
-2015,2016-01-10,URI,67,JOES,72,-3.0,140.5
-2015,2016-01-10,VALP,92,DET,74,7.5,149.5
-2015,2016-01-10,OSU,60,IND,85,-7.0,146.0
-2015,2016-01-10,TLSA,81,TULN,67,6.0,127.5
-2015,2016-01-10,RICH,93,FOR,82,2.5,143.0
-2015,2016-01-10,UIC,61,OAK,86,-20.0,163.5
-2015,2016-01-10,UCF,73,SMU,88,-20.0,144.5
-2015,2016-01-10,VCU,72,SLU,56,9.5,135.0
-2015,2016-01-10,PUR,70,ILL,84,10.0,143.0
-2015,2016-01-10,NOVA,60,BUT,55,4.0,150.0
-2015,2016-01-10,NCST,74,WAKE,77,-2.5,148.0
-2015,2016-01-10,STAN,58,ORE,71,-9.0,139.5
-2015,2016-01-11,SAM,57,FUR,77,-4.0,133.0
-2015,2016-01-11,VMI,51,ETSU,88,-11.5,144.0
-2015,2016-01-11,UNCG,77,WCU,83,-5.0,143.0
-2015,2016-01-11,MONM,86,FAIR,74,5.5,160.0
-2015,2016-01-11,CHAT,77,WOF,68,3.0,135.0
-2015,2016-01-11,BUCK,82,LEH,76,2.0,153.5
-2015,2016-01-12,DEP,64,XAV,84,-17.5,148.5
-2015,2016-01-12,WIS,65,NW,70,-1.0,125.0
-2015,2016-01-12,TULN,81,SF,70,1.5,127.5
-2015,2016-01-12,MIOH,68,KENT,76,-9.0,140.0
-2015,2016-01-12,AKR,81,CMU,92,0.0,148.0
-2015,2016-01-12,BUFF,69,EMU,81,-6.5,152.5
-2015,2016-01-12,BGSU,91,OHIO,75,-10.0,143.5
-2015,2016-01-12,BALL,74,WMU,64,-3.0,139.0
-2015,2016-01-12,NIU,71,TOL,66,-7.0,145.0
-2015,2016-01-12,FLA,68,TAMU,71,-6.5,141.5
-2015,2016-01-12,MSST,74,UK,80,-16.0,146.5
-2015,2016-01-12,GW,81,UMASS,70,6.5,150.5
-2015,2016-01-12,KU,63,WVU,74,1.0,156.0
-2015,2016-01-12,MIA,58,UVA,66,-5.0,131.5
-2015,2016-01-12,TTU,70,KSU,83,-3.5,136.0
-2015,2016-01-12,DAV,74,DAY,80,-8.5,154.5
-2015,2016-01-12,DRKE,65,EVAN,84,-16.5,137.5
-2015,2016-01-12,ILST,78,SIU,81,-4.5,139.0
-2015,2016-01-12,PROV,50,CREI,48,-2.5,153.0
-2015,2016-01-12,ISU,91,TEX,94,2.0,154.0
-2015,2016-01-12,MD,67,MICH,70,2.5,139.5
-2015,2016-01-12,AFA,60,USU,79,-9.0,137.5
-2015,2016-01-12,AUB,57,VAN,75,-16.0,148.5
-2015,2016-01-12,ARK,94,MIZ,61,2.0,148.5
-2015,2016-01-12,MINN,59,NEB,84,-8.0,140.0
-2015,2016-01-12,UNM,74,UNLV,86,-5.5,146.5
-2015,2016-01-12,CAN,69,DART,80,2.0,151.0
-2015,2016-01-13,SMU,79,ECU,55,14.0,139.0
-2015,2016-01-13,GTWN,93,SJU,73,8.5,139.0
-2015,2016-01-13,RUTG,68,OSU,94,-20.0,137.5
-2015,2016-01-13,BC,40,SYR,62,-11.0,129.5
-2015,2016-01-13,JOES,87,GMU,73,5.0,135.5
-2015,2016-01-13,URI,64,SBON,69,-1.5,142.0
-2015,2016-01-13,LAS,61,RICH,83,-13.0,142.5
-2015,2016-01-13,FOR,54,VCU,88,-13.0,142.0
-2015,2016-01-13,DUKE,63,CLEM,68,7.5,141.5
-2015,2016-01-13,HOU,59,CIN,70,-9.5,134.0
-2015,2016-01-13,SLU,71,DUQ,81,-8.5,140.0
-2015,2016-01-13,BRAD,54,LOYI,53,-14.5,114.0
-2015,2016-01-13,UNI,60,INST,74,1.5,133.0
-2015,2016-01-13,TENN,72,UGA,81,-4.0,150.0
-2015,2016-01-13,TEM,65,MEM,67,-6.0,141.5
-2015,2016-01-13,TCU,54,BAY,82,-12.5,143.0
-2015,2016-01-13,MARQ,68,NOVA,83,-17.5,144.0
-2015,2016-01-13,PSU,57,PUR,74,-16.5,135.0
-2015,2016-01-13,MISS,81,LSU,90,-10.0,159.5
-2015,2016-01-13,SC,50,ALA,73,4.0,136.0
-2015,2016-01-13,WICH,78,MOST,62,13.5,130.5
-2015,2016-01-13,FSU,85,NCST,78,-2.0,145.0
-2015,2016-01-13,WAKE,91,VT,93,-1.0,151.5
-2015,2016-01-13,GT,64,ND,72,-8.0,150.5
-2015,2016-01-13,OKLA,74,OKST,72,8.0,147.0
-2015,2016-01-13,WYO,55,SJSU,62,4.0,138.0
-2015,2016-01-13,SDSU,69,CSU,62,3.0,138.5
-2015,2016-01-13,BSU,74,NEV,67,4.0,151.0
-2015,2016-01-13,ORST,54,COLO,71,-5.0,140.0
-2015,2016-01-13,USC,89,UCLA,75,-2.5,159.5
-2015,2016-01-13,TNTC,90,UTM,96,-3.0,143.0
-2015,2016-01-13,SDAK,65,NDSU,66,-7.5,145.0
-2015,2016-01-13,JVST,74,SEMO,60,2.0,140.0
-2015,2016-01-14,CONN,51,TLSA,60,0.0,139.0
-2015,2016-01-14,IOWA,76,MSU,59,-9.0,148.5
-2015,2016-01-14,USM,51,FAU,58,-4.0,126.0
-2015,2016-01-14,DREX,61,HOF,69,-10.5,140.0
-2015,2016-01-14,UNCW,91,ELON,82,4.0,162.5
-2015,2016-01-14,JMU,75,NE,63,-5.5,140.5
-2015,2016-01-14,TOWS,79,DEL,77,2.5,136.0
-2015,2016-01-14,UAB,72,ODU,71,-3.0,132.0
-2015,2016-01-14,YSU,64,NKU,84,-5.0,153.5
-2015,2016-01-14,CLEV,53,WRST,70,-7.0,121.0
-2015,2016-01-14,LT,74,FIU,88,4.0,145.5
-2015,2016-01-14,MTSU,73,CHAR,72,3.0,146.5
-2015,2016-01-14,ULL,74,GASO,65,8.0,160.0
-2015,2016-01-14,ULM,51,GAST,65,-7.5,120.0
-2015,2016-01-14,WMRY,63,COFC,61,1.5,137.5
-2015,2016-01-14,GB,78,UIC,76,13.0,159.0
-2015,2016-01-14,MILW,56,VALP,68,-12.0,131.5
-2015,2016-01-14,WSU,73,ASU,84,-8.5,148.0
-2015,2016-01-14,MRSH,97,UNT,78,4.5,170.0
-2015,2016-01-14,TXST,78,USA,67,0.0,122.5
-2015,2016-01-14,APP,55,UALR,81,-15.0,128.5
-2015,2016-01-14,UTA,90,TROY,63,7.0,158.0
-2015,2016-01-14,WKU,73,RICE,83,1.5,153.5
-2015,2016-01-14,WASH,67,ARIZ,99,-14.0,162.0
-2015,2016-01-14,BYU,69,GONZ,68,-7.5,162.5
-2015,2016-01-14,PITT,41,LOU,59,-7.0,145.0
-2015,2016-01-14,ORE,77,UTAH,59,-6.0,140.0
-2015,2016-01-14,UCSB,76,CP,73,-3.5,143.5
-2015,2016-01-14,HAW,80,UCRV,71,5.5,140.5
-2015,2016-01-14,PEPP,60,SCU,62,3.0,133.0
-2015,2016-01-14,USD,82,PORT,71,-9.0,143.5
-2015,2016-01-14,LMU,87,SF,83,-4.0,147.5
-2015,2016-01-14,UCI,58,LBSU,54,-2.0,140.0
-2015,2016-01-14,CSN,62,UCD,63,-2.5,139.0
-2015,2016-01-14,PAC,62,SMC,78,-19.5,136.5
-2015,2016-01-14,CAL,71,STAN,77,3.5,134.5
-2015,2016-01-14,WOF,86,CIT,83,4.5,167.0
-2015,2016-01-14,FUR,65,MER,69,-6.0,127.0
-2015,2016-01-14,ORU,80,IUPU,71,-1.5,149.5
-2015,2016-01-14,WCU,58,CHAT,77,-10.5,141.0
-2015,2016-01-14,ETSU,81,SAM,77,0.0,143.5
-2015,2016-01-14,MRST,100,RID,102,-6.5,133.5
-2015,2016-01-14,MTSU,68,UND,85,-4.5,150.0
-2015,2016-01-14,DEN,76,WIU,69,-5.0,127.0
-2015,2016-01-14,IPFW,76,SDKS,92,-8.5,149.0
-2015,2016-01-14,PEAY,52,TNST,66,-3.5,138.5
-2015,2016-01-14,MORE,70,SIUE,67,6.5,133.0
-2015,2016-01-14,EKY,85,EIU,97,3.5,151.0
-2015,2016-01-14,MUR,73,BEL,81,-8.5,151.5
-2015,2016-01-14,MONT,73,UNCO,66,7.5,149.5
-2015,2016-01-14,SUU,80,EWU,106,-11.0,153.5
-2015,2016-01-14,NAU,76,IDHO,83,-8.5,137.0
-2015,2016-01-14,IDST,71,SAC,82,-10.5,149.5
-2015,2016-01-14,WEB,73,PRST,58,4.0,147.0
-2015,2016-01-15,GW,70,DAY,77,-4.5,137.0
-2015,2016-01-15,EVAN,66,ILST,55,5.5,138.5
-2015,2016-01-15,MONM,110,IONA,102,-1.5,161.5
-2015,2016-01-15,NIAG,68,FAIR,73,-8.0,144.5
-2015,2016-01-15,CAN,65,MAN,62,1.0,154.0
-2015,2016-01-15,SIE,64,QUIN,52,4.5,144.5
-2015,2016-01-15,AKR,64,TOL,78,-3.5,150.0
-2015,2016-01-16,SF,56,MEM,71,-17.5,139.0
-2015,2016-01-16,CIN,65,TEM,67,3.5,126.0
-2015,2016-01-16,VT,78,GT,77,-7.5,146.0
-2015,2016-01-16,SYR,83,WAKE,55,-2.0,144.5
-2015,2016-01-16,OSU,65,MD,100,-10.5,137.5
-2015,2016-01-16,NCST,55,UNC,67,-16.0,157.5
-2015,2016-01-16,SJU,58,BUT,78,-19.5,147.0
-2015,2016-01-16,IND,70,MINN,63,10.5,152.5
-2015,2016-01-16,UMASS,69,DAV,77,-11.5,168.0
-2015,2016-01-16,MIZ,72,SC,81,-14.0,139.0
-2015,2016-01-16,NOVA,55,GTWN,50,7.0,138.0
-2015,2016-01-16,FOR,55,JOES,80,-10.5,147.0
-2015,2016-01-16,DEN,61,IUPU,76,-3.5,127.0
-2015,2016-01-16,FUR,86,CIT,89,7.5,166.0
-2015,2016-01-16,UTM,60,JVST,82,4.5,137.0
-2015,2016-01-16,TAMU,79,UGA,45,3.0,139.5
-2015,2016-01-16,TCU,63,KU,70,-22.5,145.0
-2015,2016-01-16,NE,69,DEL,60,7.5,142.5
-2015,2016-01-16,BC,61,PITT,84,-17.0,136.5
-2015,2016-01-16,ND,95,DUKE,91,-9.0,153.5
-2015,2016-01-16,MIA,65,CLEM,76,4.5,131.0
-2015,2016-01-16,XAV,74,MARQ,66,6.5,152.5
-2015,2016-01-16,WMRY,94,UNCW,97,-5.5,149.5
-2015,2016-01-16,VCU,94,RICH,89,-1.0,150.0
-2015,2016-01-16,MIOH,46,BALL,48,-7.0,133.0
-2015,2016-01-16,BGSU,84,EMU,79,-8.0,144.0
-2015,2016-01-16,IPFW,106,OMA,101,-8.0,164.5
-2015,2016-01-16,EKY,65,SIUE,67,2.0,156.0
-2015,2016-01-16,ULL,87,GAST,54,-4.0,140.0
-2015,2016-01-16,NEB,78,ILL,67,-3.5,145.0
-2015,2016-01-16,LAS,62,URI,73,-14.5,132.0
-2015,2016-01-16,MONT,65,UND,61,4.0,136.5
-2015,2016-01-16,BAY,63,TTU,60,2.0,145.0
-2015,2016-01-16,OAK,86,DET,82,2.0,179.0
-2015,2016-01-16,NAU,73,EWU,96,-11.5,153.0
-2015,2016-01-16,TENN,80,MSST,75,-3.0,156.5
-2015,2016-01-16,CMU,61,BUFF,74,-1.0,160.5
-2015,2016-01-16,WYO,70,UNM,68,-10.5,139.0
-2015,2016-01-16,USU,96,CSU,92,-2.5,145.0
-2015,2016-01-16,UTEP,67,UTSA,71,6.0,159.5
-2015,2016-01-16,PEPP,98,SF,84,3.5,148.5
-2015,2016-01-16,UK,70,AUB,75,11.5,151.0
-2015,2016-01-16,WVU,68,OKLA,70,-6.0,157.5
-2015,2016-01-16,ISU,76,KSU,63,1.5,152.5
-2015,2016-01-16,ELON,65,COFC,64,-6.0,145.5
-2015,2016-01-16,DREX,50,TOWS,69,-6.5,130.5
-2015,2016-01-16,JMU,86,HOF,82,-5.5,149.5
-2015,2016-01-16,MTSU,64,ODU,61,-5.5,125.0
-2015,2016-01-16,MILW,87,UIC,62,11.0,140.0
-2015,2016-01-16,LOYI,51,UNI,41,-12.0,121.0
-2015,2016-01-16,WOF,69,MER,70,-6.5,130.0
-2015,2016-01-16,MORE,82,EIU,84,6.5,126.0
-2015,2016-01-16,ECU,69,UCF,89,-4.5,139.0
-2015,2016-01-16,HALL,81,PROV,72,-5.5,140.5
-2015,2016-01-16,BRWN,68,YALE,77,-15.0,139.5
-2015,2016-01-16,ETSU,84,CHAT,94,-8.5,144.5
-2015,2016-01-16,ULM,51,GASO,66,2.5,136.0
-2015,2016-01-16,UTA,85,USA,88,12.0,147.5
-2015,2016-01-16,TXST,57,TROY,66,-1.5,136.0
-2015,2016-01-16,SDKS,57,NDSU,68,2.0,139.5
-2015,2016-01-16,BYU,81,PORT,84,9.5,169.0
-2015,2016-01-16,ALA,63,VAN,71,-11.0,131.5
-2015,2016-01-16,OKST,69,TEX,74,-7.5,133.5
-2015,2016-01-16,SBON,88,DUQ,95,2.0,150.5
-2015,2016-01-16,MTST,76,UNCO,78,-2.0,164.0
-2015,2016-01-16,SJSU,74,FRES,81,-15.5,146.0
-2015,2016-01-16,YSU,45,WRST,81,-9.5,145.5
-2015,2016-01-16,OHIO,82,KENT,89,-4.5,152.0
-2015,2016-01-16,UAB,74,CHAR,72,5.5,151.0
-2015,2016-01-16,LT,61,FAU,63,7.0,140.0
-2015,2016-01-16,USM,66,FIU,60,-8.5,130.5
-2015,2016-01-16,WASH,89,ASU,85,-6.5,158.5
-2015,2016-01-16,UCI,61,UCSB,52,1.5,129.5
-2015,2016-01-16,NIU,69,WMU,83,-1.0,137.5
-2015,2016-01-16,CLEV,70,NKU,65,-3.5,129.0
-2015,2016-01-16,COR,70,CLMB,74,-9.5,143.5
-2015,2016-01-16,WCU,68,SAM,84,-3.5,141.0
-2015,2016-01-16,APP,86,ARST,72,-8.0,151.5
-2015,2016-01-16,FLA,80,MISS,71,1.5,141.5
-2015,2016-01-16,MRSH,94,RICE,90,3.5,172.0
-2015,2016-01-16,USD,52,GONZ,88,-20.0,135.5
-2015,2016-01-16,PEAY,58,BEL,76,-13.5,159.5
-2015,2016-01-16,WKU,81,UNT,76,4.5,151.5
-2015,2016-01-16,GB,70,VALP,85,-14.0,149.5
-2015,2016-01-16,MOST,61,BRAD,42,5.5,122.5
-2015,2016-01-16,ORU,77,WIU,68,-1.0,151.0
-2015,2016-01-16,ARK,74,LSU,76,-8.0,165.0
-2015,2016-01-16,PSU,71,NW,62,-8.5,132.5
-2015,2016-01-16,MURR,71,TNST,73,1.0,130.5
-2015,2016-01-16,SEMO,55,TNTC,91,-17.0,155.0
-2015,2016-01-16,HAW,86,CSF,79,7.5,150.0
-2015,2016-01-16,WSU,66,ARIZ,90,-18.0,152.5
-2015,2016-01-16,AFA,64,UNLV,100,-16.0,138.5
-2015,2016-01-16,SDSU,56,BSU,53,-4.0,134.0
-2015,2016-01-16,SUU,85,IDHO,83,-10.0,141.0
-2015,2016-01-16,LBSU,92,CP,96,-2.0,153.0
-2015,2016-01-16,IDST,73,PRST,70,-9.5,152.0
-2015,2016-01-16,WEB,85,SAC,74,5.0,143.0
-2015,2016-01-16,UCRV,75,CSN,72,-2.5,143.0
-2015,2016-01-16,LMU,76,SCU,66,-2.0,131.0
-2015,2016-01-17,CREI,91,DEP,80,5.0,151.0
-2015,2016-01-17,MICH,71,IOWA,82,-7.0,143.5
-2015,2016-01-17,CONN,69,HOU,57,1.0,137.5
-2015,2016-01-17,GMU,92,SLU,79,-2.0,131.0
-2015,2016-01-17,SMU,60,TULN,45,14.0,138.0
-2015,2016-01-17,SIU,81,DRKE,76,4.0,142.5
-2015,2016-01-17,INST,62,WICH,82,-15.0,135.0
-2015,2016-01-17,MSU,76,WIS,77,6.5,133.5
-2015,2016-01-17,UVA,62,FSU,69,3.5,137.0
-2015,2016-01-17,ORE,87,COLO,91,-1.0,143.0
-2015,2016-01-17,ORST,53,UTAH,59,-9.0,138.0
-2015,2016-01-17,VMI,68,UNCG,85,-10.0,138.5
-2015,2016-01-17,NIAG,64,MAN,69,-7.0,131.5
-2015,2016-01-17,MRST,67,SPU,76,-6.5,135.5
-2015,2016-01-17,CAN,63,QUIN,53,4.0,148.0
-2015,2016-01-17,IONA,75,RID,79,4.0,146.5
-2015,2016-01-17,AMER,45,ARMY,65,-14.5,132.5
-2015,2016-01-18,TTU,76,TCU,69,3.5,134.0
-2015,2016-01-18,SYR,64,DUKE,62,-11.5,145.0
-2015,2016-01-18,VALP,96,YSU,65,18.0,146.0
-2015,2016-01-18,DET,76,WRST,77,-6.0,146.5
-2015,2016-01-18,UIC,53,CLEV,70,-10.5,132.0
-2015,2016-01-18,PUR,107,RUTG,57,21.0,143.0
-2015,2016-01-18,UALR,73,ARST,76,7.0,134.5
-2015,2016-01-18,OKLA,77,ISU,82,-2.0,169.0
-2015,2016-01-18,SIE,69,MONM,85,-7.5,153.0
-2015,2016-01-18,LOYM,84,BU,87,-6.5,140.0
-2015,2016-01-18,HAMP,80,NCCU,79,-1.0,140.5
-2015,2016-01-19,BUT,68,PROV,71,1.0,149.0
-2015,2016-01-19,TULN,42,CONN,60,-15.0,133.0
-2015,2016-01-19,SC,77,MISS,74,1.5,148.5
-2015,2016-01-19,MSST,78,FLA,81,-10.0,141.5
-2015,2016-01-19,WMU,64,OHIO,82,-6.0,153.5
-2015,2016-01-19,EMU,88,AKR,92,-5.0,147.0
-2015,2016-01-19,KENT,76,BALL,68,-1.0,139.0
-2015,2016-01-19,BUFF,77,MIOH,60,0.0,138.5
-2015,2016-01-19,TOL,81,BGSU,74,1.5,150.5
-2015,2016-01-19,KU,67,OKST,86,9.0,142.0
-2015,2016-01-19,ILL,69,IND,103,-11.5,153.5
-2015,2016-01-19,DAY,85,SBON,79,3.0,139.0
-2015,2016-01-19,NKU,90,OAK,73,-13.0,160.5
-2015,2016-01-19,TLSA,84,ECU,69,7.5,135.0
-2015,2016-01-19,GASO,66,GAST,69,-11.0,134.5
-2015,2016-01-19,NCST,78,PITT,61,-9.0,142.5
-2015,2016-01-19,CLEM,62,UVA,69,-10.0,124.0
-2015,2016-01-19,CMU,70,NIU,75,-3.0,147.5
-2015,2016-01-19,NW,56,MD,62,-12.0,135.0
-2015,2016-01-19,GTWN,81,XAV,72,-10.0,145.5
-2015,2016-01-19,HOU,73,SMU,77,-13.0,139.5
-2015,2016-01-19,LOYI,66,EVAN,74,-13.5,124.5
-2015,2016-01-19,ALA,77,AUB,83,2.0,139.0
-2015,2016-01-19,LSU,57,TAMU,71,-7.0,152.5
-2015,2016-01-19,UNLV,80,USU,68,3.0,148.5
-2015,2016-01-19,FRES,67,SDSU,73,-9.0,128.0
-2015,2016-01-19,SPU,77,FAIR,71,-3.0,143.0
-2015,2016-01-20,UCF,64,SF,54,3.5,135.5
-2015,2016-01-20,NEB,72,MSU,71,-15.0,142.0
-2015,2016-01-20,TEX,56,WVU,49,-12.0,146.5
-2015,2016-01-20,VT,81,ND,83,-13.0,152.0
-2015,2016-01-20,WAKE,68,UNC,83,-19.0,167.0
-2015,2016-01-20,DUQ,71,VCU,93,-15.0,156.0
-2015,2016-01-20,LAS,49,TEM,62,-10.0,128.0
-2015,2016-01-20,GMU,62,FOR,73,-3.5,137.5
-2015,2016-01-20,UGA,60,MIZ,57,2.0,136.5
-2015,2016-01-20,DAV,87,SLU,96,9.0,153.0
-2015,2016-01-20,INST,66,SIU,79,-4.0,148.0
-2015,2016-01-20,ILST,55,BRAD,52,11.0,120.5
-2015,2016-01-20,MOST,79,DRKE,70,-1.0,135.5
-2015,2016-01-20,WICH,74,UNI,55,6.0,130.0
-2015,2016-01-20,DEP,57,MARQ,56,-8.0,148.5
-2015,2016-01-20,KSU,72,BAY,79,-8.5,139.5
-2015,2016-01-20,MINN,69,MICH,74,-16.0,141.0
-2015,2016-01-20,JOES,75,PENN,60,11.0,143.0
-2015,2016-01-20,CSU,83,AFA,79,3.5,145.5
-2015,2016-01-20,VAN,88,TENN,74,2.5,151.0
-2015,2016-01-20,NOVA,72,HALL,71,7.0,139.5
-2015,2016-01-20,MIA,67,BC,53,15.0,134.5
-2015,2016-01-20,FSU,65,LOU,84,-9.5,142.5
-2015,2016-01-20,NEV,75,WYO,69,-3.0,137.0
-2015,2016-01-20,SJSU,69,BSU,94,-18.5,148.5
-2015,2016-01-20,COLO,83,WASH,95,-1.0,164.5
-2015,2016-01-20,LBSU,77,UCSB,67,-2.0,143.5
-2015,2016-01-20,CSF,59,UCI,72,-14.5,134.0
-2015,2016-01-20,UCLA,82,ORST,73,-3.0,146.0
-2015,2016-01-20,WIU,67,SDAK,76,-4.5,148.5
-2015,2016-01-21,COFC,40,TOWS,37,-4.5,127.5
-2015,2016-01-21,ELON,67,WMRY,89,-8.5,159.5
-2015,2016-01-21,MRSH,95,CHAR,103,-1.0,174.0
-2015,2016-01-21,IOWA,90,RUTG,76,22.0,148.5
-2015,2016-01-21,MEM,72,CIN,76,-8.0,134.0
-2015,2016-01-21,DREX,45,JMU,68,-9.0,132.5
-2015,2016-01-21,DEL,70,UNCW,79,-14.0,154.5
-2015,2016-01-21,UK,80,ARK,66,3.0,152.0
-2015,2016-01-21,WKU,62,ODU,68,-8.5,133.0
-2015,2016-01-21,UNT,64,MTSU,86,-13.5,146.0
-2015,2016-01-21,GAST,67,APP,76,4.5,132.5
-2015,2016-01-21,TROY,74,ULM,85,-6.0,134.5
-2015,2016-01-21,HOF,96,NE,92,-3.5,152.0
-2015,2016-01-21,WIS,66,PSU,60,3.0,129.5
-2015,2016-01-21,FIU,72,UTSA,56,3.0,153.0
-2015,2016-01-21,ARST,64,UTA,91,-13.0,159.5
-2015,2016-01-21,USA,82,ULL,92,-17.5,152.5
-2015,2016-01-21,UALR,77,TXST,74,6.5,117.0
-2015,2016-01-21,ASU,70,CAL,75,-7.0,141.0
-2015,2016-01-21,USD,58,PEPP,76,-11.5,130.5
-2015,2016-01-21,OSU,64,PUR,75,-13.0,136.0
-2015,2016-01-21,USC,81,ORE,89,-5.0,159.5
-2015,2016-01-21,FAU,56,UTEP,71,-8.0,136.5
-2015,2016-01-21,RICE,70,UAB,82,-12.0,153.0
-2015,2016-01-21,PORT,61,PAC,70,-1.5,153.0
-2015,2016-01-21,UCRV,55,UCD,58,1.0,133.5
-2015,2016-01-21,CP,74,CSN,76,4.5,155.5
-2015,2016-01-21,ARIZ,71,STAN,57,6.0,140.5
-2015,2016-01-21,BYU,91,LMU,80,9.0,156.5
-2015,2016-01-21,UTAH,92,WSU,71,5.5,146.0
-2015,2016-01-21,SF,74,SCU,61,-2.0,149.5
-2015,2016-01-21,GONZ,67,SMC,70,-5.0,138.5
-2015,2016-01-21,NDSU,74,IPFW,79,-1.5,143.5
-2015,2016-01-21,TNTC,74,MORE,81,-5.5,141.0
-2015,2016-01-21,CHAT,73,UNCG,60,5.0,142.0
-2015,2016-01-21,RID,52,SIE,63,-8.0,135.5
-2015,2016-01-21,SAM,76,VMI,83,6.5,137.5
-2015,2016-01-21,MER,63,ETSU,65,-2.5,136.0
-2015,2016-01-21,JVST,88,EKY,91,-8.5,151.0
-2015,2016-01-21,CIT,92,WCU,91,-9.0,175.5
-2015,2016-01-21,SDKS,86,ORU,74,3.5,155.0
-2015,2016-01-21,SIUE,86,PEAY,90,-6.0,134.0
-2015,2016-01-21,EIU,58,MURR,68,-9.0,137.0
-2015,2016-01-21,MONM,71,MAN,78,9.5,152.0
-2015,2016-01-21,UND,101,NAU,59,1.5,146.0
-2015,2016-01-21,UNCO,90,SUU,80,-2.5,160.0
-2015,2016-01-21,IDHO,63,MONT,58,-8.5,131.0
-2015,2016-01-21,OMA,69,DEN,55,2.0,148.5
-2015,2016-01-21,BEL,82,UTM,72,6.0,157.5
-2015,2016-01-21,EWU,71,MTSU,85,4.0,162.5
-2015,2016-01-21,MSM,71,SHU,76,5.5,145.0
-2015,2016-01-22,URI,58,GW,62,-4.5,135.0
-2015,2016-01-22,VALP,62,WRST,73,8.5,125.5
-2015,2016-01-22,UIC,69,NKU,82,-12.0,135.5
-2015,2016-01-22,SPU,58,IONA,64,-8.5,147.0
-2015,2016-01-22,FAIR,88,MRST,76,2.0,158.0
-2015,2016-01-22,CAN,70,NIAG,61,4.5,142.0
-2015,2016-01-22,ALBY,63,STON,69,-9.0,134.5
-2015,2016-01-22,TOL,49,NIU,58,0.0,147.5
-2015,2016-01-22,DUQ,86,GMU,75,1.0,145.0
-2015,2016-01-22,YALE,90,BRWN,66,8.0,141.5
-2015,2016-01-23,BALL,88,EMU,87,-6.0,143.5
-2015,2016-01-23,GTWN,62,CONN,68,-4.5,136.0
-2015,2016-01-23,SC,69,TENN,78,1.5,157.0
-2015,2016-01-23,OKLA,82,BAY,72,-1.5,151.0
-2015,2016-01-23,SLU,86,UMASS,75,-8.0,153.0
-2015,2016-01-23,BC,49,ND,76,-19.5,140.0
-2015,2016-01-23,NW,57,IND,89,-10.0,143.0
-2015,2016-01-23,WAKE,63,MIA,77,-14.0,148.5
-2015,2016-01-23,WVU,80,TTU,76,3.5,143.0
-2015,2016-01-23,TOWS,79,NE,72,-6.5,130.0
-2015,2016-01-23,FRES,56,AFA,55,7.0,140.0
-2015,2016-01-23,LSU,72,ALA,70,2.5,144.0
-2015,2016-01-23,MISS,77,MSST,83,-7.0,148.0
-2015,2016-01-23,TEX,67,KU,76,-12.5,145.5
-2015,2016-01-23,OAK,111,GB,95,-2.5,183.5
-2015,2016-01-23,MICH,81,NEB,68,-1.0,142.5
-2015,2016-01-23,DUKE,88,NCST,78,4.5,150.0
-2015,2016-01-23,HALL,76,XAV,84,-8.5,149.5
-2015,2016-01-23,MRSH,78,ODU,75,-6.5,150.0
-2015,2016-01-23,DRKE,63,LOYI,68,-7.0,126.0
-2015,2016-01-23,TNTC,89,EKY,83,-1.5,168.0
-2015,2016-01-23,FAU,86,UTSA,71,1.0,141.5
-2015,2016-01-23,NDSU,65,WIU,52,1.5,134.0
-2015,2016-01-23,BRAD,54,WICH,88,-30.0,123.5
-2015,2016-01-23,UNCO,84,NAU,79,1.0,158.0
-2015,2016-01-23,BSU,81,WYO,71,7.0,135.0
-2015,2016-01-23,MIZ,53,TAMU,66,-19.0,138.5
-2015,2016-01-23,VAN,57,UK,76,-6.5,142.5
-2015,2016-01-23,ISU,73,TCU,60,10.0,153.0
-2015,2016-01-23,DEL,58,COFC,59,-8.0,129.0
-2015,2016-01-23,SF,71,HOU,62,-15.5,133.5
-2015,2016-01-23,PITT,74,FSU,72,-2.0,150.0
-2015,2016-01-23,LOU,75,GT,71,6.5,137.5
-2015,2016-01-23,GONZ,71,PAC,61,11.5,143.5
-2015,2016-01-23,KENT,62,BGSU,59,2.5,148.0
-2015,2016-01-23,DET,80,MILW,83,-6.5,162.0
-2015,2016-01-23,CLMB,79,COR,68,5.0,143.5
-2015,2016-01-23,UNI,67,ILST,76,-1.0,126.0
-2015,2016-01-23,UCLA,72,ORE,86,-8.0,160.5
-2015,2016-01-23,CIT,92,ETSU,101,-13.0,180.5
-2015,2016-01-23,WOF,62,FUR,63,-4.5,133.5
-2015,2016-01-23,IDHO,68,MTST,70,-1.0,144.5
-2015,2016-01-23,OHIO,49,CMU,72,-2.5,161.0
-2015,2016-01-23,BUFF,71,WMU,91,1.0,146.5
-2015,2016-01-23,USA,68,ULM,100,-8.0,132.0
-2015,2016-01-23,UNM,83,SJSU,64,7.5,151.5
-2015,2016-01-23,SDKS,79,SDAK,75,6.0,152.0
-2015,2016-01-23,ARST,68,TXST,78,-3.0,136.5
-2015,2016-01-23,USU,55,SDSU,70,-7.5,130.0
-2015,2016-01-23,UND,88,SUU,72,3.0,151.0
-2015,2016-01-23,USD,63,LMU,67,-5.5,133.5
-2015,2016-01-23,ARK,73,UGA,76,-2.0,145.0
-2015,2016-01-23,RICE,73,MTSU,87,-11.0,147.5
-2015,2016-01-23,OKST,73,KSU,89,-6.0,133.5
-2015,2016-01-23,WKU,71,CHAR,88,-3.0,158.5
-2015,2016-01-23,CP,83,CSF,75,4.5,151.0
-2015,2016-01-23,MD,65,MSU,74,-3.0,143.5
-2015,2016-01-23,LBSU,72,UCRV,74,4.0,145.5
-2015,2016-01-23,JMU,82,ELON,64,2.5,152.0
-2015,2016-01-23,HARV,50,DART,63,4.0,133.5
-2015,2016-01-23,CSN,61,UCSB,74,-8.5,143.0
-2015,2016-01-23,MIOH,46,AKR,75,-10.0,133.5
-2015,2016-01-23,IUPU,84,IPFW,82,-6.0,150.0
-2015,2016-01-23,TROY,65,ULL,88,-14.5,163.5
-2015,2016-01-23,BUT,64,CREI,72,-2.0,155.5
-2015,2016-01-23,BYU,65,PEPP,71,3.0,154.0
-2015,2016-01-23,AUB,63,FLA,95,-11.5,146.5
-2015,2016-01-23,LT,70,USM,59,7.0,137.0
-2015,2016-01-23,UNT,57,UAB,78,-16.0,151.5
-2015,2016-01-23,OMA,85,ORU,79,-1.0,169.5
-2015,2016-01-23,EIU,87,PEAY,86,-5.5,141.5
-2015,2016-01-23,SIUE,54,MURR,70,-10.0,132.5
-2015,2016-01-23,UALR,68,UTA,62,-3.5,138.5
-2015,2016-01-23,ILL,76,MINN,71,1.5,147.0
-2015,2016-01-23,ARIZ,73,CAL,74,2.5,143.0
-2015,2016-01-23,WEB,68,IDST,69,11.5,148.0
-2015,2016-01-23,EWU,69,MONT,74,-5.0,147.0
-2015,2016-01-23,COLO,75,WSU,70,3.5,152.0
-2015,2016-01-23,FIU,79,UTEP,69,-5.0,141.0
-2015,2016-01-23,UNLV,63,NEV,65,5.0,152.0
-2015,2016-01-23,PRST,81,SAC,63,-4.5,150.0
-2015,2016-01-23,PORT,74,SMC,89,-17.0,148.0
-2015,2016-01-23,ASU,73,STAN,75,-1.5,137.5
-2015,2016-01-23,UCD,62,HAW,78,-16.5,137.0
-2015,2016-01-24,TULN,75,CIN,97,-16.5,124.0
-2015,2016-01-24,SMU,80,TEM,89,6.0,133.0
-2015,2016-01-24,WMRY,63,HOF,91,-2.0,156.5
-2015,2016-01-24,UNCW,77,DREX,71,6.5,139.0
-2015,2016-01-24,PUR,71,IOWA,83,-3.5,144.5
-2015,2016-01-24,VALP,71,NKU,46,13.0,133.5
-2015,2016-01-24,YSU,70,CLEV,55,-6.0,143.5
-2015,2016-01-24,PROV,82,NOVA,76,-13.0,135.0
-2015,2016-01-24,MER,80,WCU,86,3.5,132.0
-2015,2016-01-24,SAM,78,UNCG,86,-1.5,142.0
-2015,2016-01-24,JVST,78,MORE,74,-12.0,132.5
-2015,2016-01-24,ECU,84,MEM,83,-16.5,141.5
-2015,2016-01-24,UIC,66,WRST,80,-18.0,127.5
-2015,2016-01-24,SIE,99,CAN,78,-2.0,151.5
-2015,2016-01-24,MRST,72,MONM,83,-17.5,157.5
-2015,2016-01-24,UCF,60,TLSA,75,-12.0,140.5
-2015,2016-01-24,UNC,75,VT,70,11.0,161.5
-2015,2016-01-24,USC,70,ORST,85,2.0,148.5
-2015,2016-01-24,SBON,76,VCU,84,-10.5,151.5
-2015,2016-01-24,IONA,91,FAIR,98,4.5,172.5
-2015,2016-01-24,MARQ,78,SJU,73,5.5,143.0
-2015,2016-01-24,DAY,64,FOR,50,8.0,137.0
-2015,2016-01-24,QUIN,52,RID,75,-6.5,127.0
-2015,2016-01-24,EVAN,65,INST,82,3.0,141.5
-2015,2016-01-24,SIU,80,MOST,65,1.0,141.5
-2015,2016-01-24,JOES,69,LAS,48,10.0,140.0
-2015,2016-01-24,TNST,95,BEL,103,-11.5,149.5
-2015,2016-01-24,UTM,60,SEMO,68,8.0,144.5
-2015,2016-01-24,SYR,65,UVA,73,-9.5,126.0
-2015,2016-01-24,UTAH,80,WASH,75,3.0,158.0
-2015,2016-01-25,DUKE,69,MIA,80,-4.0,152.5
-2015,2016-01-25,PSU,46,OSU,66,-9.0,137.0
-2015,2016-01-25,DET,108,GB,115,-5.5,181.5
-2015,2016-01-25,OAK,82,MILW,79,-3.5,163.0
-2015,2016-01-25,KU,72,ISU,85,-1.5,160.5
-2015,2016-01-25,FUR,68,VMI,56,6.5,136.0
-2015,2016-01-25,AAMU,52,SOU,73,-7.5,140.0
-2015,2016-01-25,LAF,67,BUCK,79,-17.0,160.5
-2015,2016-01-25,DAV,78,RICH,70,-6.5,170.5
-2015,2016-01-25,GASO,101,APP,100,-3.5,147.5
-2015,2016-01-26,CREI,73,GTWN,74,-3.5,144.5
-2015,2016-01-26,BALL,64,BUFF,76,-4.5,140.0
-2015,2016-01-26,EMU,58,KENT,73,-5.5,152.0
-2015,2016-01-26,CMU,68,MIOH,51,5.0,141.0
-2015,2016-01-26,NIU,66,AKR,76,-5.5,137.0
-2015,2016-01-26,OHIO,81,TOL,79,-6.5,157.5
-2015,2016-01-26,BGSU,79,WMU,78,-4.5,143.5
-2015,2016-01-26,MSST,74,SC,84,-8.5,148.5
-2015,2016-01-26,MEM,97,UCF,86,4.5,146.0
-2015,2016-01-26,IND,79,WIS,82,1.5,139.0
-2015,2016-01-26,LAS,60,DUQ,87,-12.0,141.5
-2015,2016-01-26,TTU,67,OKLA,91,-12.5,149.0
-2015,2016-01-26,FSU,72,BC,62,10.0,139.0
-2015,2016-01-26,KSU,55,WVU,70,-10.5,143.0
-2015,2016-01-26,TCU,54,TEX,71,-11.0,135.0
-2015,2016-01-26,DRKE,64,ILST,76,-8.5,135.5
-2015,2016-01-26,XAV,75,PROV,68,1.5,148.0
-2015,2016-01-26,USA,66,TROY,58,-7.0,151.5
-2015,2016-01-26,FLA,59,VAN,60,-4.5,140.5
-2015,2016-01-26,UGA,85,LSU,89,-8.0,144.5
-2015,2016-01-26,TENN,57,ALA,63,-2.5,145.0
-2015,2016-01-26,SDSU,57,NEV,54,5.0,131.5
-2015,2016-01-26,WYO,60,FRES,71,-8.0,134.0
-2015,2016-01-26,SIE,82,NIAG,70,8.0,134.0
-2015,2016-01-26,UVA,72,WAKE,71,7.5,140.5
-2015,2016-01-27,FOR,63,URI,79,-10.0,129.5
-2015,2016-01-27,TEM,61,ECU,64,5.5,135.5
-2015,2016-01-27,UMASS,70,JOES,78,-12.5,152.5
-2015,2016-01-27,SJU,60,HALL,79,-16.0,147.0
-2015,2016-01-27,TAMU,71,ARK,74,3.5,150.5
-2015,2016-01-27,RUTG,57,MICH,68,-24.0,147.0
-2015,2016-01-27,PITT,60,CLEM,73,-1.5,136.5
-2015,2016-01-27,DEP,53,BUT,67,-14.0,145.5
-2015,2016-01-27,SLU,37,DAY,73,-17.0,143.0
-2015,2016-01-27,MOST,59,INST,68,-9.0,137.5
-2015,2016-01-27,AUB,63,MISS,80,-6.5,157.0
-2015,2016-01-27,SF,73,TULN,60,-7.0,129.5
-2015,2016-01-27,LOU,91,VT,83,10.0,142.5
-2015,2016-01-27,GT,90,NCST,83,-4.5,143.5
-2015,2016-01-27,TLSA,66,HOU,81,0.0,138.0
-2015,2016-01-27,SJSU,66,CSU,74,-12.0,155.5
-2015,2016-01-27,MIZ,54,UK,88,-19.5,140.5
-2015,2016-01-27,BAY,69,OKST,65,4.0,141.0
-2015,2016-01-27,PUR,68,MINN,64,14.0,141.5
-2015,2016-01-27,LOYI,54,WICH,80,-19.0,124.0
-2015,2016-01-27,STAN,75,COLO,91,-7.5,137.5
-2015,2016-01-27,UNI,68,BRAD,50,14.5,118.5
-2015,2016-01-27,AFA,55,UNM,84,-15.5,142.5
-2015,2016-01-27,UCI,73,CSN,63,7.5,137.5
-2015,2016-01-27,CSF,64,UCD,69,-3.0,135.0
-2015,2016-01-27,CAL,64,UTAH,73,-7.0,134.0
-2015,2016-01-27,BSU,77,UNLV,87,-3.5,150.0
-2015,2016-01-27,PEAY,65,MORE,75,-7.5,140.0
-2015,2016-01-27,MURR,75,EKY,71,1.5,151.0
-2015,2016-01-28,ND,66,SYR,81,-2.0,138.0
-2015,2016-01-28,ELON,64,HOF,66,-11.5,163.0
-2015,2016-01-28,IOWA,68,MD,74,-5.5,148.0
-2015,2016-01-28,CIN,58,CONN,57,-2.0,130.5
-2015,2016-01-28,CHAR,72,FIU,69,-1.5,150.0
-2015,2016-01-28,TOWS,77,DREX,70,2.5,125.0
-2015,2016-01-28,WMRY,94,DEL,79,6.5,144.5
-2015,2016-01-28,ODU,78,FAU,66,7.0,121.5
-2015,2016-01-28,UNCW,78,JMU,73,-4.0,149.0
-2015,2016-01-28,MTSU,66,MRSH,82,-1.5,160.5
-2015,2016-01-28,UTSA,75,LT,85,-17.0,159.0
-2015,2016-01-28,UAB,62,WKU,69,4.5,148.0
-2015,2016-01-28,NE,61,COFC,68,-2.5,125.0
-2015,2016-01-28,YSU,82,UIC,78,3.5,150.5
-2015,2016-01-28,CLEV,52,VALP,77,-20.5,128.0
-2015,2016-01-28,EVAN,85,SIU,78,3.0,149.5
-2015,2016-01-28,UTA,88,ULM,99,3.5,142.0
-2015,2016-01-28,UTEP,58,USM,71,3.5,132.0
-2015,2016-01-28,GASO,67,UALR,80,-15.0,136.5
-2015,2016-01-28,TXST,54,ULL,80,-12.0,140.5
-2015,2016-01-28,ORST,68,ASU,86,-5.5,140.5
-2015,2016-01-28,APP,75,TROY,71,-3.5,154.5
-2015,2016-01-28,GAST,69,ARST,75,3.0,136.0
-2015,2016-01-28,RICH,98,GW,90,-5.0,148.0
-2015,2016-01-28,MSU,76,NW,45,6.0,135.0
-2015,2016-01-28,OSU,68,ILL,63,-2.0,145.0
-2015,2016-01-28,SCU,67,GONZ,84,-18.5,136.5
-2015,2016-01-28,SF,87,PORT,76,-4.5,168.0
-2015,2016-01-28,UCRV,72,CP,68,-8.0,147.0
-2015,2016-01-28,WASH,86,UCLA,84,-5.0,168.0
-2015,2016-01-28,WSU,71,USC,81,-11.5,163.0
-2015,2016-01-28,UCSB,70,LBSU,80,-5.5,143.5
-2015,2016-01-28,PEPP,75,USD,65,6.5,131.5
-2015,2016-01-28,LMU,62,BYU,87,-15.5,160.0
-2015,2016-01-28,ORE,83,ARIZ,75,-7.5,150.5
-2015,2016-01-28,UNCG,102,CIT,95,2.0,172.0
-2015,2016-01-28,ETSU,73,WOF,87,-1.5,144.0
-2015,2016-01-28,VMI,58,MER,73,-13.5,132.0
-2015,2016-01-28,WCU,60,FUR,62,-7.5,137.5
-2015,2016-01-28,MONM,66,QUIN,51,10.5,150.5
-2015,2016-01-28,NIAG,69,MRST,66,-4.5,137.0
-2015,2016-01-28,RID,76,SPU,45,-3.5,124.0
-2015,2016-01-28,UTM,74,EIU,82,-1.0,138.0
-2015,2016-01-28,BEL,72,JVST,63,9.5,156.0
-2015,2016-01-28,OMA,76,SDKS,87,-8.5,165.0
-2015,2016-01-28,IPFW,68,ORU,63,-4.0,160.0
-2015,2016-01-28,NAU,66,WEB,76,-20.5,148.0
-2015,2016-01-28,TNST,79,TNTC,81,-4.0,148.0
-2015,2016-01-28,SEMO,56,SIUE,51,-8.0,139.5
-2015,2016-01-28,SDAK,52,DEN,66,-2.0,136.0
-2015,2016-01-28,SUU,68,IDST,87,-5.5,154.0
-2015,2016-01-28,PRST,83,EWU,112,-6.0,155.5
-2015,2016-01-28,SAC,65,IDHO,63,-4.5,133.0
-2015,2016-01-28,RMU,49,MSM,70,-7.5,133.5
-2015,2016-01-29,PRIN,83,BRWN,59,9.5,153.0
-2015,2016-01-29,VCU,79,DAV,69,2.0,160.0
-2015,2016-01-29,PENN,58,YALE,81,-13.5,132.0
-2015,2016-01-29,COR,77,HARV,65,-10.0,138.0
-2015,2016-01-29,CLMB,77,DART,60,4.0,137.5
-2015,2016-01-29,NKU,91,DET,83,-7.5,160.0
-2015,2016-01-29,WRST,63,OAK,89,-5.5,156.0
-2015,2016-01-29,GB,94,MILW,95,-5.0,164.5
-2015,2016-01-29,WIU,67,IUPU,69,-6.0,140.5
-2015,2016-01-29,MAN,56,IONA,70,-11.5,155.5
-2015,2016-01-29,CAN,77,FAIR,84,-1.0,163.5
-2015,2016-01-29,KENT,61,OHIO,72,-2.5,151.0
-2015,2016-01-30,FOR,78,UMASS,72,-4.0,147.0
-2015,2016-01-30,GT,57,SYR,60,-5.0,138.5
-2015,2016-01-30,CLEM,65,FSU,76,-4.5,138.5
-2015,2016-01-30,WVU,71,FLA,88,1.0,143.5
-2015,2016-01-30,BUT,69,MARQ,75,2.5,144.5
-2015,2016-01-30,UAB,81,MRSH,78,-1.5,165.0
-2015,2016-01-30,HOU,97,ECU,93,4.0,144.0
-2015,2016-01-30,PSU,72,MICH,79,-8.0,134.0
-2015,2016-01-30,VAN,58,TEX,72,-2.5,135.5
-2015,2016-01-30,AKR,73,BALL,64,1.5,135.0
-2015,2016-01-30,UVA,63,LOU,47,-5.5,129.0
-2015,2016-01-30,XAV,86,DEP,65,10.0,147.5
-2015,2016-01-30,LAS,44,DAY,59,-20.0,130.0
-2015,2016-01-30,ISU,62,TAMU,72,-4.5,155.5
-2015,2016-01-30,EMU,86,WMU,94,-1.5,153.5
-2015,2016-01-30,TENN,63,TCU,75,2.0,144.5
-2015,2016-01-30,MISS,64,KSU,69,-6.5,141.5
-2015,2016-01-30,DEL,97,TOWS,101,-9.5,136.5
-2015,2016-01-30,CHAR,77,FAU,82,5.5,142.5
-2015,2016-01-30,MINN,68,IND,74,-19.0,149.5
-2015,2016-01-30,WASH,88,USC,98,-8.5,171.5
-2015,2016-01-30,BRAD,70,DRKE,80,-11.0,122.0
-2015,2016-01-30,MIA,69,NCST,85,5.0,142.5
-2015,2016-01-30,TXST,59,ULM,72,-6.0,128.0
-2015,2016-01-30,NIU,59,MIOH,72,6.0,124.0
-2015,2016-01-30,INST,96,LOYI,104,2.5,127.5
-2015,2016-01-30,HOF,70,DREX,64,7.5,141.0
-2015,2016-01-30,CLEV,70,UIC,72,3.5,134.0
-2015,2016-01-30,BC,62,UNC,89,-26.5,146.0
-2015,2016-01-30,OKLA,77,LSU,75,3.5,165.5
-2015,2016-01-30,TTU,68,ARK,75,-6.0,150.5
-2015,2016-01-30,LMU,69,USD,77,0.0,134.5
-2015,2016-01-30,ILST,81,MOST,84,-1.0,133.5
-2015,2016-01-30,BGSU,65,CMU,77,-7.5,145.5
-2015,2016-01-30,NEB,74,PUR,89,-12.5,142.0
-2015,2016-01-30,AFA,54,SJSU,75,-3.0,137.5
-2015,2016-01-30,UNM,88,BSU,83,-7.5,152.5
-2015,2016-01-30,STAN,74,UTAH,96,-11.5,135.0
-2015,2016-01-30,UGA,73,BAY,83,-11.5,138.0
-2015,2016-01-30,ALA,64,SC,78,-9.5,135.5
-2015,2016-01-30,CSU,76,WYO,83,-2.5,141.5
-2015,2016-01-30,TULN,48,TLSA,62,-14.0,135.5
-2015,2016-01-30,DUQ,78,SLU,67,5.0,153.0
-2015,2016-01-30,SJU,64,URI,55,-3.5,139.0
-2015,2016-01-30,GAST,53,UALR,63,-7.5,120.5
-2015,2016-01-30,ELON,71,NE,67,-6.0,150.0
-2015,2016-01-30,COR,77,DART,73,-4.0,140.0
-2015,2016-01-30,PRIN,75,YALE,79,-4.0,137.5
-2015,2016-01-30,CLMB,55,HARV,54,-1.5,133.5
-2015,2016-01-30,ODU,64,FIU,60,4.0,128.5
-2015,2016-01-30,COFC,55,UNCW,65,-8.0,134.5
-2015,2016-01-30,BUFF,73,TOL,68,-5.5,154.5
-2015,2016-01-30,UK,84,KU,90,-6.0,150.0
-2015,2016-01-30,WSU,50,UCLA,83,-10.0,159.0
-2015,2016-01-30,UTA,75,ULL,90,-6.0,163.0
-2015,2016-01-30,UTSA,70,USM,86,-6.0,140.0
-2015,2016-01-30,MTSU,66,WKU,64,1.5,141.5
-2015,2016-01-30,UNT,87,RICE,95,-8.0,157.5
-2015,2016-01-30,SF,48,GONZ,86,-15.5,157.0
-2015,2016-01-30,SDSU,67,UNLV,52,-4.5,130.0
-2015,2016-01-30,MEM,68,SMU,80,-10.0,149.5
-2015,2016-01-30,PENN,83,BRWN,89,-1.5,148.0
-2015,2016-01-30,YSU,68,VALP,97,-23.5,147.0
-2015,2016-01-30,HALL,75,CREI,65,-5.5,151.5
-2015,2016-01-30,OKST,74,AUB,63,2.0,148.0
-2015,2016-01-30,PROV,73,GTWN,69,-2.5,138.0
-2015,2016-01-30,APP,60,USA,73,-1.5,148.0
-2015,2016-01-30,GASO,71,ARST,66,-3.5,153.0
-2015,2016-01-30,MSST,76,MIZ,62,-2.0,142.5
-2015,2016-01-30,CP,52,UCD,66,4.0,137.5
-2015,2016-01-30,NEV,89,USU,84,-5.5,146.0
-2015,2016-01-30,ORST,63,ARIZ,80,-11.0,145.5
-2015,2016-01-30,UCRV,81,CSF,71,1.0,141.0
-2015,2016-01-30,UCSB,76,UCI,60,-8.0,127.5
-2015,2016-01-30,SCU,90,PORT,84,-5.5,147.5
-2015,2016-01-30,PEPP,77,BYU,88,-11.5,153.0
-2015,2016-01-30,SMC,68,PAC,65,11.5,137.0
-2015,2016-01-30,VMI,75,CIT,78,-6.0,179.0
-2015,2016-01-30,NIAG,68,QUIN,82,-2.5,127.0
-2015,2016-01-30,SAC,67,EWU,74,-8.0,156.0
-2015,2016-01-30,MURR,59,UTM,63,3.0,135.0
-2015,2016-01-30,CHAT,63,SAM,56,4.0,142.5
-2015,2016-01-30,ETSU,70,FUR,74,-3.0,140.0
-2015,2016-01-30,SDKS,67,DEN,56,6.5,131.0
-2015,2016-01-30,UNCG,67,MER,81,-8.0,132.5
-2015,2016-01-30,PEAY,86,SEMO,80,6.0,142.0
-2015,2016-01-30,TNST,78,JVST,53,5.0,134.0
-2015,2016-01-30,EIU,60,SIUE,46,-1.0,136.0
-2015,2016-01-30,MORE,70,EKY,67,0.0,151.5
-2015,2016-01-30,WCU,66,WOF,85,-3.5,141.5
-2015,2016-01-30,MRST,66,SIE,77,-13.5,151.0
-2015,2016-01-30,SPU,57,MONM,73,-12.0,140.5
-2015,2016-01-30,SDAK,83,OMA,96,-7.5,166.5
-2015,2016-01-30,BEL,79,TNTC,89,3.0,169.0
-2015,2016-01-30,NAU,66,IDST,88,-7.0,152.5
-2015,2016-01-30,SUU,50,WEB,77,-18.5,148.5
-2015,2016-01-30,UND,70,UNCO,71,1.0,156.0
-2015,2016-01-30,MONT,80,MTSU,72,4.5,140.5
-2015,2016-01-30,PRST,55,IDHO,56,-2.0,139.0
-2015,2016-01-30,LBSU,78,HAW,64,-8.5,151.5
-2015,2016-01-31,NOVA,68,SJU,53,20.0,140.0
-2015,2016-01-31,GW,76,GMU,70,8.0,136.0
-2015,2016-01-31,LEH,73,BU,75,-3.0,145.5
-2015,2016-01-31,MD,66,OSU,61,4.5,137.5
-2015,2016-01-31,WAKE,62,ND,85,-10.0,157.5
-2015,2016-01-31,WRST,68,DET,75,-2.5,153.5
-2015,2016-01-31,CAN,68,RID,79,-3.5,144.0
-2015,2016-01-31,NDSU,72,IUPU,73,0.0,136.0
-2015,2016-01-31,TEM,70,SF,63,8.0,128.0
-2015,2016-01-31,WIU,67,IPFW,88,-6.5,148.5
-2015,2016-01-31,NW,71,IOWA,85,-11.5,138.0
-2015,2016-01-31,RICH,68,SBON,84,-1.0,157.5
-2015,2016-01-31,WICH,78,EVAN,65,3.0,139.0
-2015,2016-01-31,CONN,67,UCF,41,7.5,135.5
-2015,2016-01-31,UTEP,70,LT,78,-8.5,147.5
-2015,2016-01-31,SIU,58,UNI,67,-4.0,140.0
-2015,2016-01-31,CAL,62,COLO,70,-4.5,144.5
-2015,2016-01-31,RUTG,62,MSU,96,-28.0,143.5
-2015,2016-01-31,VT,71,PITT,90,-10.0,149.0
-2015,2016-01-31,JMU,62,WMRY,68,-4.0,149.5
-2015,2016-01-31,WIS,63,ILL,55,3.5,135.5
-2015,2016-01-31,ORE,91,ASU,74,3.0,154.0
-2015,2016-02-01,UNC,65,LOU,71,-1.0,148.5
-2015,2016-02-01,OAK,85,NKU,74,6.5,160.0
-2015,2016-02-01,SMU,68,HOU,71,6.0,142.0
-2015,2016-02-01,NCST,73,FSU,77,-6.0,147.0
-2015,2016-02-01,TEX,67,BAY,59,-4.5,140.5
-2015,2016-02-01,IONA,75,SPU,67,5.5,141.0
-2015,2016-02-01,MONM,93,SIE,87,1.0,153.5
-2015,2016-02-01,QUIN,64,FAIR,59,-8.5,149.5
-2015,2016-02-01,CIT,85,CHAT,125,-19.5,175.0
-2015,2016-02-01,MER,85,SAM,70,2.5,134.0
-2015,2016-02-02,DRKE,56,INST,63,-10.0,142.5
-2015,2016-02-02,BALL,72,BGSU,64,-3.0,136.5
-2015,2016-02-02,WMU,62,TOL,89,-6.0,153.0
-2015,2016-02-02,AKR,80,OHIO,68,-2.5,147.0
-2015,2016-02-02,KENT,61,CMU,88,-5.0,141.0
-2015,2016-02-02,MIOH,69,EMU,94,-10.0,138.0
-2015,2016-02-02,LSU,80,AUB,68,6.5,160.5
-2015,2016-02-02,UK,77,TENN,84,8.0,152.0
-2015,2016-02-02,SC,56,UGA,69,1.0,141.0
-2015,2016-02-02,URI,56,UMASS,61,2.0,142.5
-2015,2016-02-02,GTWN,76,BUT,87,-4.0,143.0
-2015,2016-02-02,VT,60,SYR,68,-9.0,140.0
-2015,2016-02-02,CLEM,76,WAKE,62,2.0,140.0
-2015,2016-02-02,UNLV,83,UNM,87,-4.0,151.5
-2015,2016-02-02,TCU,72,OKLA,95,-20.0,145.0
-2015,2016-02-02,BRAD,71,MOST,77,-14.5,123.5
-2015,2016-02-02,ULM,65,ULL,72,-10.0,146.5
-2015,2016-02-02,BUFF,90,NIU,78,-3.0,141.5
-2015,2016-02-02,WYO,62,AFA,70,4.5,129.0
-2015,2016-02-02,ALA,82,MSST,80,-5.5,140.0
-2015,2016-02-02,DUKE,80,GT,71,4.0,153.0
-2015,2016-02-02,PROV,70,DEP,77,8.0,140.0
-2015,2016-02-02,WVU,81,ISU,76,-5.0,156.5
-2015,2016-02-02,IND,80,MICH,67,-2.0,149.0
-2015,2016-02-02,CSU,67,SDSU,69,-11.0,137.5
-2015,2016-02-02,USU,67,BSU,70,-11.0,151.5
-2015,2016-02-02,RID,57,MAN,65,1.5,131.0
-2015,2016-02-03,ILL,110,RUTG,101,7.0,142.0
-2015,2016-02-03,SJU,83,XAV,90,-21.5,149.5
-2015,2016-02-03,BC,47,UVA,61,-23.5,123.0
-2015,2016-02-03,ND,70,MIA,79,-5.0,147.5
-2015,2016-02-03,SBON,83,SJU,73,-6.0,150.0
-2015,2016-02-03,PSU,49,IOWA,73,-16.0,143.0
-2015,2016-02-03,VCU,88,LAS,70,15.0,137.0
-2015,2016-02-03,GMU,78,RICH,74,-13.0,149.0
-2015,2016-02-03,EVAN,54,UNI,57,-1.0,132.5
-2015,2016-02-03,ARK,83,FLA,87,-7.5,148.0
-2015,2016-02-03,OKST,61,TTU,63,-6.5,138.5
-2015,2016-02-03,DAV,69,GW,79,-6.5,155.5
-2015,2016-02-03,CREI,58,NOVA,83,-11.5,144.0
-2015,2016-02-03,ILST,78,LOYI,70,-3.0,129.0
-2015,2016-02-03,MARQ,62,HALL,79,-7.0,147.5
-2015,2016-02-03,MD,70,NEB,65,5.5,142.0
-2015,2016-02-03,KSU,59,KU,77,-12.0,144.0
-2015,2016-02-03,SIU,55,WICH,76,-17.5,141.0
-2015,2016-02-03,MISS,76,MIZ,73,3.5,142.5
-2015,2016-02-03,ARIZ,79,WSU,64,10.0,153.0
-2015,2016-02-03,UCI,78,CP,72,2.0,137.0
-2015,2016-02-03,CSN,73,UCRV,71,-5.5,144.0
-2015,2016-02-03,FRES,53,SJSU,65,6.5,143.0
-2015,2016-02-03,ASU,83,WASH,95,-4.5,166.5
-2015,2016-02-03,OMA,76,WIU,83,4.5,157.0
-2015,2016-02-04,TLSA,79,TEM,83,0.0,135.0
-2015,2016-02-04,TAMU,60,VAN,77,-1.5,138.0
-2015,2016-02-04,OSU,68,WIS,79,-6.5,127.5
-2015,2016-02-04,WMRY,86,NE,77,3.0,142.0
-2015,2016-02-04,DEL,56,ELON,83,-7.0,154.5
-2015,2016-02-04,UNCW,70,HOF,67,-3.5,155.0
-2015,2016-02-04,JMU,78,DREX,56,5.0,131.0
-2015,2016-02-04,MILW,83,WRST,84,-2.0,135.5
-2015,2016-02-04,GB,85,NKU,78,3.5,162.5
-2015,2016-02-04,FIU,69,UAB,74,-11.5,138.5
-2015,2016-02-04,DET,71,CLEV,63,3.0,150.0
-2015,2016-02-04,TOWS,47,COFC,65,-2.5,124.0
-2015,2016-02-04,FAU,73,MTSU,85,-14.0,132.0
-2015,2016-02-04,UTA,73,GASO,82,4.5,158.5
-2015,2016-02-04,TXST,56,GAST,59,-7.0,120.0
-2015,2016-02-04,ULL,87,APP,76,8.5,157.0
-2015,2016-02-04,OAK,107,YSU,85,12.5,173.0
-2015,2016-02-04,SF,57,CIN,88,-19.0,130.5
-2015,2016-02-04,USM,54,UNT,70,-4.5,137.0
-2015,2016-02-04,UCF,70,TULN,62,-3.5,134.0
-2015,2016-02-04,WKU,83,UTSA,71,7.5,155.0
-2015,2016-02-04,LT,90,RICE,78,2.0,158.5
-2015,2016-02-04,MINN,58,NW,82,-8.5,134.0
-2015,2016-02-04,TROY,49,UALR,72,-14.0,134.5
-2015,2016-02-04,USA,73,ARST,79,-7.5,148.5
-2015,2016-02-04,SMC,59,BYU,70,-1.5,151.0
-2015,2016-02-04,COLO,56,ORE,76,-10.0,151.0
-2015,2016-02-04,CONN,77,MEM,57,2.5,141.5
-2015,2016-02-04,MRSH,108,UTEP,112,2.0,163.0
-2015,2016-02-04,PAC,43,USD,54,0.0,134.0
-2015,2016-02-04,HAW,76,UCSB,64,-2.0,140.0
-2015,2016-02-04,GONZ,92,LMU,63,12.5,142.5
-2015,2016-02-04,UCD,57,CSF,61,-3.5,135.5
-2015,2016-02-04,UCLA,61,USC,80,-5.0,161.5
-2015,2016-02-04,UTAH,69,ORST,71,2.5,137.5
-2015,2016-02-04,PORT,73,PEPP,70,-10.0,153.0
-2015,2016-02-04,PEAY,77,UTM,86,-4.0,143.0
-2015,2016-02-04,ETSU,71,VMI,60,7.5,143.5
-2015,2016-02-04,WCU,58,UNCG,75,-5.5,146.0
-2015,2016-02-04,MRST,53,QUIN,79,-3.5,139.0
-2015,2016-02-04,WOF,63,CHAT,79,-10.0,139.5
-2015,2016-02-04,FUR,67,SAM,65,1.0,135.5
-2015,2016-02-04,IPFW,95,SDAK,82,-3.0,156.5
-2015,2016-02-04,ORU,63,NDSU,67,-6.0,146.0
-2015,2016-02-04,MORE,67,BEL,73,-7.5,152.0
-2015,2016-02-04,EKY,97,TNST,81,-5.5,155.0
-2015,2016-02-04,IDST,60,UND,76,-7.5,147.0
-2015,2016-02-04,EWU,84,NAU,73,8.5,157.5
-2015,2016-02-04,WEB,64,UNCO,54,8.0,152.0
-2015,2016-02-04,IUPU,51,DEN,53,-2.5,128.0
-2015,2016-02-04,MURR,78,SEMO,72,10.5,137.0
-2015,2016-02-04,IDHO,68,SUU,44,4.5,136.0
-2015,2016-02-04,MTSU,68,PRST,83,-6.5,154.0
-2015,2016-02-04,MONT,79,SAC,83,3.5,137.0
-2015,2016-02-05,CLMB,72,YALE,86,-7.5,137.5
-2015,2016-02-05,DART,64,PENN,71,-1.5,136.5
-2015,2016-02-05,COR,80,BRWN,86,2.0,157.5
-2015,2016-02-05,HARV,62,PRIN,83,-11.0,134.5
-2015,2016-02-05,FAIR,67,MONM,91,-11.5,164.0
-2015,2016-02-05,IONA,84,CAN,66,4.0,164.5
-2015,2016-02-05,RID,66,NIAG,60,4.5,127.5
-2015,2016-02-05,SPU,52,SIE,69,-9.0,137.0
-2015,2016-02-05,CMU,87,AKR,92,-5.0,146.5
-2015,2016-02-06,ASU,67,WSU,55,3.5,153.0
-2015,2016-02-06,USA,43,UALR,74,-15.5,131.0
-2015,2016-02-06,UNLV,104,FRES,111,2.0,143.0
-2015,2016-02-06,CSN,76,LBSU,81,-10.5,151.0
-2015,2016-02-06,TXST,62,GASO,66,-3.5,135.0
-2015,2016-02-06,UNC,76,ND,80,3.0,163.0
-2015,2016-02-06,GB,60,WRST,79,-3.5,155.5
-2015,2016-02-06,UNCW,90,NE,73,3.5,148.0
-2015,2016-02-06,ODU,74,CHAR,69,1.0,139.0
-2015,2016-02-06,FIU,66,MTSU,67,-9.5,138.0
-2015,2016-02-06,DET,94,YSU,92,6.0,175.5
-2015,2016-02-06,MILW,71,NKU,75,5.0,145.0
-2015,2016-02-06,COR,52,YALE,83,-13.5,143.5
-2015,2016-02-06,HARV,57,PENN,67,-1.0,129.5
-2015,2016-02-06,TOL,82,KENT,67,-1.5,147.5
-2015,2016-02-06,TROY,71,ARST,70,-6.5,151.0
-2015,2016-02-06,TENN,67,ARK,85,-7.0,162.0
-2015,2016-02-06,VAN,78,MISS,85,3.0,145.0
-2015,2016-02-06,USM,65,RICE,72,-7.5,140.5
-2015,2016-02-06,BAY,69,WVU,80,-6.0,148.5
-2015,2016-02-06,IND,63,PSU,68,8.5,143.0
-2015,2016-02-06,URI,79,LAS,62,7.5,127.5
-2015,2016-02-06,FAU,67,UAB,104,-14.5,139.0
-2015,2016-02-06,INST,58,BRAD,63,12.0,129.0
-2015,2016-02-06,LOYI,73,SIU,59,-7.0,136.0
-2015,2016-02-06,PEAY,76,MURR,73,-8.5,139.0
-2015,2016-02-06,IUPU,58,SDKS,80,-13.5,144.5
-2015,2016-02-06,MARQ,82,XAV,90,-12.0,148.5
-2015,2016-02-06,KU,75,TCU,56,13.0,144.0
-2015,2016-02-06,UVA,64,PITT,50,2.0,133.0
-2015,2016-02-06,BC,47,LOU,79,-20.5,127.5
-2015,2016-02-06,FSU,91,WAKE,71,3.0,156.5
-2015,2016-02-06,TEM,62,UCF,60,4.0,136.0
-2015,2016-02-06,GW,72,VCU,69,-9.0,145.5
-2015,2016-02-06,MOST,64,EVAN,83,-13.5,139.0
-2015,2016-02-06,SEMO,69,EIU,78,-10.0,141.5
-2015,2016-02-06,CIN,59,MEM,63,3.0,141.5
-2015,2016-02-06,DAV,93,DUQ,82,2.5,167.5
-2015,2016-02-06,OAK,67,CLEV,57,10.0,150.5
-2015,2016-02-06,WOF,78,SAM,75,1.5,141.5
-2015,2016-02-06,WCU,69,VMI,60,3.5,139.0
-2015,2016-02-06,MSU,89,MICH,73,4.5,143.5
-2015,2016-02-06,ISU,64,OKST,59,4.5,147.5
-2015,2016-02-06,BSU,53,AFA,61,11.5,143.0
-2015,2016-02-06,TTU,59,TEX,69,-9.5,133.5
-2015,2016-02-06,RUTG,63,NEB,87,-19.0,146.5
-2015,2016-02-06,NCST,80,DUKE,88,-11.5,152.5
-2015,2016-02-06,DEP,66,CREI,88,-11.5,148.0
-2015,2016-02-06,NIU,69,OHIO,80,-5.5,144.5
-2015,2016-02-06,JOES,82,FOR,60,7.5,139.5
-2015,2016-02-06,MRSH,109,UTSA,91,12.5,175.0
-2015,2016-02-06,WMU,71,BALL,75,-5.0,140.5
-2015,2016-02-06,DEN,75,OMA,72,-9.0,143.5
-2015,2016-02-06,UNI,82,DRKE,66,7.5,131.5
-2015,2016-02-06,NOVA,72,PROV,60,5.0,137.0
-2015,2016-02-06,UTA,90,GAST,69,-2.0,140.0
-2015,2016-02-06,DEL,64,WMRY,90,-13.5,152.5
-2015,2016-02-06,WEB,71,UND,78,4.5,138.5
-2015,2016-02-06,MIZ,71,ALA,80,-10.5,130.5
-2015,2016-02-06,ORU,79,SDAK,91,-1.5,156.5
-2015,2016-02-06,ULM,91,APP,90,3.0,142.5
-2015,2016-02-06,BGSU,51,MIOH,55,1.0,133.0
-2015,2016-02-06,EMU,70,BUFF,80,-6.0,157.5
-2015,2016-02-06,PUR,61,MD,72,-5.5,139.0
-2015,2016-02-06,SC,81,TAMU,78,-9.5,142.0
-2015,2016-02-06,FLA,61,UK,80,-7.5,144.5
-2015,2016-02-06,UNM,71,SDSU,78,-5.0,134.5
-2015,2016-02-06,NEV,67,CSU,76,-3.0,156.0
-2015,2016-02-06,IDHO,70,NAU,72,4.5,134.0
-2015,2016-02-06,PAC,77,BYU,72,-17.0,150.0
-2015,2016-02-06,DREX,38,COFC,60,-8.0,118.5
-2015,2016-02-06,CLEM,57,VT,60,2.5,139.0
-2015,2016-02-06,STAN,61,CAL,76,-7.5,139.5
-2015,2016-02-06,LT,69,UNT,80,5.5,153.0
-2015,2016-02-06,VALP,73,UIC,55,23.0,134.5
-2015,2016-02-06,ARIZ,77,WASH,72,4.5,165.0
-2015,2016-02-06,BUT,89,SJU,56,11.0,148.5
-2015,2016-02-06,CIT,72,MER,88,-15.5,165.0
-2015,2016-02-06,WKU,89,UTEP,93,-2.5,148.0
-2015,2016-02-06,FUR,54,CHAT,62,-11.5,135.5
-2015,2016-02-06,IPFW,46,NDSU,62,-4.0,142.0
-2015,2016-02-06,ETSU,68,UNCG,65,-1.0,150.5
-2015,2016-02-06,AUB,55,UGA,65,-10.5,142.0
-2015,2016-02-06,TNTC,68,JVST,58,7.5,147.0
-2015,2016-02-06,OKLA,69,KSU,80,5.5,148.0
-2015,2016-02-06,DAY,98,GMU,64,9.5,132.0
-2015,2016-02-06,USU,65,WYO,84,-1.0,137.5
-2015,2016-02-06,CLMB,77,BRWN,73,7.0,151.0
-2015,2016-02-06,PORT,92,LMU,78,-2.5,156.0
-2015,2016-02-06,MSST,77,LSU,88,-9.5,159.0
-2015,2016-02-06,TOWS,81,ELON,77,-3.5,145.5
-2015,2016-02-06,EKY,88,BEL,78,-11.5,172.5
-2015,2016-02-06,DART,70,PRIN,83,-15.5,140.5
-2015,2016-02-06,UMASS,53,RICH,69,-12.5,156.0
-2015,2016-02-06,UTM,79,SIUE,62,2.5,133.0
-2015,2016-02-06,COLO,56,ORST,60,-3.0,141.5
-2015,2016-02-06,MORE,76,TNST,77,-1.0,134.5
-2015,2016-02-06,IDST,90,UNCO,57,-4.0,156.0
-2015,2016-02-06,EWU,81,SUU,67,9.5,156.5
-2015,2016-02-06,GTWN,61,HALL,69,-4.5,144.0
-2015,2016-02-06,SMC,60,USD,43,13.5,128.5
-2015,2016-02-06,CSF,68,UCSB,81,-9.0,141.5
-2015,2016-02-06,HAW,75,CP,60,3.5,149.5
-2015,2016-02-06,MONT,82,PRST,80,2.0,142.0
-2015,2016-02-06,UCD,50,UCRV,49,-6.0,129.0
-2015,2016-02-06,WICH,53,ILST,58,12.5,134.5
-2015,2016-02-06,MTST,79,SAC,76,-5.5,153.5
-2015,2016-02-06,SCU,86,SF,89,-4.0,146.0
-2015,2016-02-06,GONZ,69,PEPP,66,6.5,144.5
-2015,2016-02-07,ECU,67,CONN,85,-19.0,134.0
-2015,2016-02-07,SIE,73,MRST,79,8.0,150.5
-2015,2016-02-07,IOWA,77,ILL,65,9.0,149.0
-2015,2016-02-07,MIA,75,GT,68,3.0,144.5
-2015,2016-02-07,SMU,92,SF,58,15.0,137.0
-2015,2016-02-07,SLU,62,SBON,65,-13.0,150.0
-2015,2016-02-07,IONA,75,NIAG,61,10.5,145.5
-2015,2016-02-07,HOF,95,JMU,98,-2.0,145.0
-2015,2016-02-07,HOU,63,TLSA,77,-6.5,141.5
-2015,2016-02-07,RID,61,CAN,67,-1.5,143.0
-2015,2016-02-07,UTAH,66,ORE,76,-6.5,145.0
-2015,2016-02-07,MAN,70,FAIR,80,-4.5,147.0
-2015,2016-02-08,SJU,67,GTWN,92,-14.5,144.0
-2015,2016-02-08,OKST,56,TCU,63,2.0,128.0
-2015,2016-02-08,LOU,65,DUKE,72,-3.5,147.0
-2015,2016-02-08,TEX,60,OKLA,63,-8.0,147.5
-2015,2016-02-08,ND,89,CLEM,83,-1.5,139.0
-2015,2016-02-08,SAM,95,CIT,86,3.0,177.0
-2015,2016-02-08,QUIN,52,SPU,68,-5.0,123.5
-2015,2016-02-08,VMI,60,WOF,92,-11.5,136.5
-2015,2016-02-08,UNCG,72,FUR,79,-5.5,136.5
-2015,2016-02-08,CHAT,72,MER,66,2.0,134.0
-2015,2016-02-08,COLG,72,ARMY,82,-5.0,147.0
-2015,2016-02-09,AUB,45,TENN,71,-10.5,153.0
-2015,2016-02-09,WVU,65,KU,75,-7.0,149.5
-2015,2016-02-09,CIN,69,UCF,51,10.0,133.0
-2015,2016-02-09,PITT,63,MIA,65,-7.5,143.0
-2015,2016-02-09,MSU,81,PUR,82,-2.5,143.0
-2015,2016-02-09,CMU,56,EMU,71,1.5,158.0
-2015,2016-02-09,OHIO,72,BALL,69,-1.5,142.5
-2015,2016-02-09,DUQ,74,DAY,76,-14.5,147.0
-2015,2016-02-09,GMU,63,URI,81,-12.0,132.5
-2015,2016-02-09,AKR,83,BGSU,68,4.0,143.0
-2015,2016-02-09,TOL,71,BUFF,69,-2.0,151.0
-2015,2016-02-09,NIU,74,KENT,75,-3.5,136.0
-2015,2016-02-09,MONM,87,MRST,61,10.0,155.5
-2015,2016-02-09,MIOH,45,WMU,44,-6.0,139.0
-2015,2016-02-09,VT,49,UVA,67,-15.5,132.5
-2015,2016-02-09,NW,63,OSU,71,-4.5,133.0
-2015,2016-02-09,UNC,68,BC,65,20.5,144.5
-2015,2016-02-09,XAV,56,CREI,70,1.5,157.5
-2015,2016-02-09,WICH,74,DRKE,48,17.5,134.0
-2015,2016-02-09,NOVA,86,DEP,59,14.0,137.5
-2015,2016-02-09,UTA,65,TXST,53,4.0,141.5
-2015,2016-02-09,ARK,46,MSST,78,1.5,155.0
-2015,2016-02-09,UGA,48,UK,82,-13.0,139.0
-2015,2016-02-09,MISS,72,FLA,77,-9.0,145.0
-2015,2016-02-09,UNM,72,USU,80,2.0,150.0
-2015,2016-02-10,BSU,93,CSU,97,3.5,156.0
-2015,2016-02-10,MIZ,71,VAN,86,-16.0,138.0
-2015,2016-02-10,ISU,82,TTU,85,2.5,149.5
-2015,2016-02-10,TLSA,82,SMU,77,-9.0,142.5
-2015,2016-02-10,MICH,82,MINN,74,7.0,141.0
-2015,2016-02-10,WASH,82,UTAH,90,-11.0,159.0
-2015,2016-02-10,PEAY,79,EIU,70,-2.5,144.5
-2015,2016-02-10,SJSU,61,UNLV,64,-15.0,149.5
-2015,2016-02-10,AFA,52,NEV,72,-11.0,138.5
-2015,2016-02-10,CSF,67,CSN,75,-5.0,150.5
-2015,2016-02-10,TULN,100,ECU,92,-4.5,132.0
-2015,2016-02-10,BUT,81,HALL,75,-2.5,145.5
-2015,2016-02-10,TAMU,62,ALA,63,5.0,134.5
-2015,2016-02-10,PROV,91,MARQ,96,1.5,145.0
-2015,2016-02-10,LSU,83,SC,94,-4.5,153.5
-2015,2016-02-10,MEM,90,HOU,98,-1.5,147.0
-2015,2016-02-10,WAKE,66,GT,71,-8.5,152.5
-2015,2016-02-10,NEB,61,WIS,72,-8.0,133.5
-2015,2016-02-10,LAS,66,DAV,79,-16.0,148.5
-2015,2016-02-10,SBON,76,FOR,72,4.0,143.0
-2015,2016-02-10,JOES,84,GW,66,-4.5,143.5
-2015,2016-02-10,SIU,85,INST,78,-3.0,145.0
-2015,2016-02-10,RICH,67,SLU,53,7.0,144.0
-2015,2016-02-10,SDKS,92,OMA,96,4.5,163.0
-2015,2016-02-10,LOYI,54,BRAD,43,8.5,120.5
-2015,2016-02-10,MOST,69,UNI,83,-12.5,131.0
-2015,2016-02-10,BAY,82,KSU,72,-2.5,139.0
-2015,2016-02-10,JVST,73,BEL,81,-17.0,149.5
-2015,2016-02-10,TNTC,55,TNST,85,-2.5,151.0
-2015,2016-02-10,SDSU,57,FRES,58,3.5,127.0
-2015,2016-02-11,JMU,56,COFC,52,0.0,127.0
-2015,2016-02-11,GAST,78,USA,79,4.0,130.0
-2015,2016-02-11,ARST,73,ULL,83,-15.0,154.5
-2015,2016-02-11,GASO,77,TROY,71,1.0,151.5
-2015,2016-02-11,APP,68,TXST,69,-4.5,137.0
-2015,2016-02-11,UALR,82,ULM,86,2.0,127.5
-2015,2016-02-11,SUU,53,MONT,86,-18.5,139.0
-2015,2016-02-11,IOWA,78,IND,85,-3.0,152.0
-2015,2016-02-11,PRST,71,IDST,88,-1.0,151.0
-2015,2016-02-11,ORE,63,CAL,83,-1.5,144.0
-2015,2016-02-11,MTSU,63,LT,73,-2.5,143.0
-2015,2016-02-11,WIU,63,DEN,60,-5.0,126.5
-2015,2016-02-11,ILST,70,EVAN,60,-10.0,138.5
-2015,2016-02-11,SAC,50,WEB,63,-13.5,142.5
-2015,2016-02-11,UND,85,EWU,95,-8.0,153.0
-2015,2016-02-11,NAU,58,MTST,101,-9.0,156.5
-2015,2016-02-11,UNCO,67,IDHO,73,-5.5,139.0
-2015,2016-02-11,LMU,77,PAC,72,-4.5,138.5
-2015,2016-02-11,BYU,114,SF,89,7.5,163.5
-2015,2016-02-11,USD,71,SCU,74,-4.5,127.5
-2015,2016-02-11,CP,70,LBSU,73,-6.0,147.0
-2015,2016-02-11,UCSB,72,UCD,66,4.0,126.5
-2015,2016-02-11,WSU,81,COLO,88,-11.5,144.5
-2015,2016-02-11,SFU,68,RMU,57,-2.5,135.0
-2015,2016-02-11,UTEP,84,FIU,74,-4.0,142.5
-2015,2016-02-11,RICE,73,CHAR,102,-9.0,161.5
-2015,2016-02-11,DREX,60,DEL,69,-2.0,136.0
-2015,2016-02-11,HOF,86,WMRY,80,-3.0,156.0
-2015,2016-02-11,NE,47,TOWS,44,-2.5,138.0
-2015,2016-02-11,CONN,58,TEM,63,5.0,127.5
-2015,2016-02-11,MILW,93,OAK,85,-6.5,162.0
-2015,2016-02-11,FSU,72,SYR,85,-3.0,139.0
-2015,2016-02-11,VCU,63,UMASS,69,11.0,150.5
-2015,2016-02-11,ELON,82,UNCW,86,-11.5,159.5
-2015,2016-02-11,UTSA,73,FAU,79,-6.5,149.5
-2015,2016-02-11,UNT,47,ODU,67,-12.5,136.0
-2015,2016-02-11,CAN,67,SIE,90,-7.0,155.5
-2015,2016-02-11,GB,86,DET,85,-2.0,185.5
-2015,2016-02-11,CIT,75,FUR,95,-12.5,167.0
-2015,2016-02-11,SAM,90,ETSU,94,-7.0,149.0
-2015,2016-02-11,MER,70,WOF,79,-1.0,134.0
-2015,2016-02-11,UNCG,72,VMI,86,5.5,141.5
-2015,2016-02-11,EKY,50,MORE,61,-6.0,151.0
-2015,2016-02-11,SEMO,64,UTM,77,-11.5,141.0
-2015,2016-02-11,CHAT,61,WCU,67,8.5,139.0
-2015,2016-02-11,WRST,59,UIC,64,13.0,135.0
-2015,2016-02-11,UAB,80,USM,77,10.5,132.5
-2015,2016-02-11,QUIN,77,MAN,84,-5.0,131.5
-2015,2016-02-11,NDSU,58,SDAK,72,-1.5,141.0
-2015,2016-02-11,NKU,52,VALP,64,-19.5,132.5
-2015,2016-02-11,MURR,70,SIUE,64,6.5,130.0
-2015,2016-02-11,IUPU,56,ORU,77,-5.0,148.5
-2015,2016-02-11,PEPP,69,SMC,63,-11.5,134.5
-2015,2016-02-11,GONZ,92,PORT,66,10.5,157.0
-2015,2016-02-11,ORST,62,STAN,50,-3.0,137.0
-2015,2016-02-11,UCI,52,HAW,74,-5.5,134.5
-2015,2016-02-12,USC,67,ASU,74,-1.5,158.0
-2015,2016-02-12,UCLA,75,ARIZ,81,-11.5,152.5
-2015,2016-02-12,MONM,79,RID,78,5.5,144.0
-2015,2016-02-12,PRIN,85,COR,56,9.5,151.5
-2015,2016-02-12,DAY,68,URI,66,2.5,131.0
-2015,2016-02-12,BRWN,73,HARV,79,-7.0,142.5
-2015,2016-02-12,YALE,75,DART,65,9.5,134.0
-2015,2016-02-12,OHIO,94,BUFF,75,-4.0,151.5
-2015,2016-02-12,NIAG,59,SPU,72,-7.0,124.5
-2015,2016-02-12,PENN,53,CLMB,63,-10.0,139.0
-2015,2016-02-13,UK,89,SC,62,2.5,146.5
-2015,2016-02-13,TCU,42,WVU,73,-18.0,144.0
-2015,2016-02-13,WAKE,88,NCST,99,-8.0,151.0
-2015,2016-02-13,GTWN,72,PROV,75,-4.0,143.0
-2015,2016-02-13,BEL,77,MORE,78,-2.5,149.0
-2015,2016-02-13,KENT,70,EMU,75,-4.5,148.5
-2015,2016-02-13,UNI,53,WICH,50,-14.5,129.0
-2015,2016-02-13,KSU,55,OKST,58,-1.5,131.0
-2015,2016-02-13,TAMU,71,LSU,76,-2.0,151.0
-2015,2016-02-13,DREX,60,NE,70,-11.0,131.5
-2015,2016-02-13,ARK,60,MISS,76,-3.5,153.5
-2015,2016-02-13,RICE,75,ODU,66,-12.5,141.0
-2015,2016-02-13,MEM,87,TULN,94,7.0,143.5
-2015,2016-02-13,PUR,56,MICH,61,1.0,143.5
-2015,2016-02-13,GT,52,CLEM,66,-6.0,138.5
-2015,2016-02-13,WASH,80,COLO,81,-3.5,160.5
-2015,2016-02-13,UAB,76,LT,85,0.0,147.0
-2015,2016-02-13,WMU,74,BGSU,68,-3.5,141.0
-2015,2016-02-13,FAIR,84,QUIN,80,1.5,147.0
-2015,2016-02-13,SIE,81,IONA,78,-7.0,157.5
-2015,2016-02-13,NDSU,69,OMA,76,-4.0,152.0
-2015,2016-02-13,TNST,79,EKY,78,-2.0,156.0
-2015,2016-02-13,KU,76,OKLA,72,-3.5,156.0
-2015,2016-02-13,XAV,74,BUT,57,-3.0,151.5
-2015,2016-02-13,TENN,64,MIZ,75,3.5,148.0
-2015,2016-02-13,JMU,68,UNCW,78,-9.0,142.0
-2015,2016-02-13,UCF,58,HOU,82,-9.5,143.0
-2015,2016-02-13,GB,93,OAK,111,-8.5,185.0
-2015,2016-02-13,MILW,66,DET,80,1.5,165.5
-2015,2016-02-13,WYO,71,BSU,94,-10.0,140.5
-2015,2016-02-13,CHAT,76,ETSU,68,3.0,144.5
-2015,2016-02-13,BYU,96,SCU,62,10.0,152.0
-2015,2016-02-13,WMRY,82,TOWS,99,2.5,141.5
-2015,2016-02-13,ECU,60,CIN,75,-18.5,135.0
-2015,2016-02-13,LOU,66,ND,71,-2.0,143.5
-2015,2016-02-13,OSU,79,RUTG,69,12.5,144.0
-2015,2016-02-13,DAV,59,GMU,60,6.0,158.0
-2015,2016-02-13,GW,57,SBON,64,-2.0,149.0
-2015,2016-02-13,UNT,79,CHAR,103,-11.0,155.5
-2015,2016-02-13,NKU,77,UIC,79,5.0,138.0
-2015,2016-02-13,DRKE,60,SIU,75,-12.0,146.0
-2015,2016-02-13,ORE,72,STAN,76,6.5,143.5
-2015,2016-02-13,MER,74,FUR,85,-2.5,128.5
-2015,2016-02-13,SUU,73,MTST,80,-13.5,150.5
-2015,2016-02-13,INST,85,MOST,89,1.0,142.5
-2015,2016-02-13,UVA,62,DUKE,63,-2.0,138.0
-2015,2016-02-13,AKR,79,NIU,80,2.0,141.5
-2015,2016-02-13,BALL,75,CMU,63,-8.5,140.5
-2015,2016-02-13,SAM,71,WCU,76,-2.5,143.5
-2015,2016-02-13,ARST,73,ULM,78,-10.0,145.0
-2015,2016-02-13,HOF,77,DEL,66,9.5,151.5
-2015,2016-02-13,GASO,76,USA,80,1.0,143.0
-2015,2016-02-13,UNCO,80,EWU,97,-12.5,163.0
-2015,2016-02-13,UALR,68,ULL,64,-3.5,139.0
-2015,2016-02-13,GAST,53,TROY,54,3.0,133.0
-2015,2016-02-13,ALA,61,FLA,55,-8.5,134.5
-2015,2016-02-13,SDAK,68,SDKS,85,-12.5,155.0
-2015,2016-02-13,SJSU,58,UNM,74,-14.0,148.5
-2015,2016-02-13,UTEP,89,FAU,82,3.0,145.0
-2015,2016-02-13,USD,51,SF,68,-6.0,142.5
-2015,2016-02-13,VAN,86,AUB,57,10.0,139.0
-2015,2016-02-13,SLU,52,VCU,85,-19.0,140.0
-2015,2016-02-13,PSU,54,NEB,70,-7.0,134.0
-2015,2016-02-13,FOR,67,RICH,71,-11.5,141.0
-2015,2016-02-13,PENN,92,COR,84,-3.0,143.0
-2015,2016-02-13,WIS,70,MD,57,-8.5,131.5
-2015,2016-02-13,ORST,71,CAL,83,-9.5,137.5
-2015,2016-02-13,FRES,72,NEV,77,-3.5,143.5
-2015,2016-02-13,BRWN,70,DART,87,-4.0,150.0
-2015,2016-02-13,COFC,66,ELON,62,-2.0,133.5
-2015,2016-02-13,UTSA,65,FIU,79,-12.5,152.5
-2015,2016-02-13,DEN,84,IPFW,88,-7.0,135.0
-2015,2016-02-13,MAN,81,MRST,73,1.0,144.0
-2015,2016-02-13,MIOH,49,TOL,93,-11.5,136.5
-2015,2016-02-13,CLEV,64,YSU,59,-1.0,140.5
-2015,2016-02-13,PRIN,88,CLMB,83,3.0,146.5
-2015,2016-02-13,YALE,67,HARV,55,8.0,130.0
-2015,2016-02-13,CIT,89,WOF,99,-13.5,175.5
-2015,2016-02-13,UGA,66,MSST,57,-4.5,140.0
-2015,2016-02-13,TTU,84,BAY,66,-10.0,142.5
-2015,2016-02-13,TLSA,73,CONN,75,-8.0,134.0
-2015,2016-02-13,ILL,56,NW,58,-7.0,137.0
-2015,2016-02-13,WRST,61,VALP,59,-13.0,127.0
-2015,2016-02-13,CREI,65,MARQ,62,1.0,150.0
-2015,2016-02-13,SJU,63,NOVA,73,-26.0,140.0
-2015,2016-02-13,LAS,62,JOES,88,-17.0,138.0
-2015,2016-02-13,MRSH,96,WKU,93,0.0,169.5
-2015,2016-02-13,MTSU,76,USM,54,7.5,127.0
-2015,2016-02-13,SIUE,72,EIU,64,-6.5,133.0
-2015,2016-02-13,SEMO,56,MURR,83,-14.5,138.0
-2015,2016-02-13,WIU,66,ORU,72,-6.5,146.5
-2015,2016-02-13,APP,60,UTA,91,-13.0,158.0
-2015,2016-02-13,LBSU,57,UCD,48,5.0,135.0
-2015,2016-02-13,TEX,75,ISU,85,-5.0,147.0
-2015,2016-02-13,UTM,85,PEAY,84,-3.5,146.0
-2015,2016-02-13,JVST,70,TNTC,72,-12.0,147.0
-2015,2016-02-13,SAC,64,IDST,66,-2.5,149.5
-2015,2016-02-13,PRST,78,WEB,87,-12.5,143.0
-2015,2016-02-13,NAU,67,MONT,85,-16.5,144.0
-2015,2016-02-13,CSU,80,UNLV,87,-7.0,154.0
-2015,2016-02-13,AFA,61,SDSU,70,-17.5,119.0
-2015,2016-02-13,UND,64,IDHO,65,0.0,136.0
-2015,2016-02-13,PEPP,65,PAC,63,2.5,135.5
-2015,2016-02-13,GONZ,60,SMU,69,-6.0,143.0
-2015,2016-02-13,CSN,84,UCI,93,-10.5,136.0
-2015,2016-02-13,CP,86,UCRV,78,1.5,142.0
-2015,2016-02-13,LMU,62,SMC,68,-18.0,137.0
-2015,2016-02-13,CSF,59,HAW,76,-15.5,146.0
-2015,2016-02-14,UMASS,108,DUQ,99,-7.5,157.0
-2015,2016-02-14,BRAD,60,ILST,75,-17.5,123.0
-2015,2016-02-14,EVAN,74,LOYI,73,5.0,131.5
-2015,2016-02-14,IND,69,MSU,88,-7.5,148.5
-2015,2016-02-14,PITT,64,UNC,85,-10.5,153.0
-2015,2016-02-14,SYR,75,BC,61,10.5,124.5
-2015,2016-02-14,NIAG,59,RID,77,-9.5,129.5
-2015,2016-02-14,USF,65,TEM,77,-14.0,129.0
-2015,2016-02-14,CAN,57,SPU,61,-2.0,140.0
-2015,2016-02-14,WSU,47,UTAH,88,-16.5,145.0
-2015,2016-02-14,MIA,67,FSU,65,-1.0,147.5
-2015,2016-02-14,MINN,71,IOWA,75,-19.5,147.5
-2015,2016-02-14,USC,78,ARIZ,86,-9.5,157.5
-2015,2016-02-14,UCLA,78,ASU,65,-2.0,151.5
-2015,2016-02-15,NCST,53,UVA,73,-11.5,129.0
-2015,2016-02-15,OAK,89,WRST,73,1.5,152.5
-2015,2016-02-15,MILW,68,GB,70,-2.0,169.5
-2015,2016-02-15,OKST,67,KU,94,-15.0,136.5
-2015,2016-02-15,MRST,73,FAIR,76,-11.0,156.5
-2015,2016-02-15,MAN,70,MONM,79,-14.0,150.0
-2015,2016-02-15,QUIN,59,IONA,78,-15.0,147.5
-2015,2016-02-15,WOF,61,UNCG,65,-1.0,145.5
-2015,2016-02-15,WCU,77,ETSU,83,-7.0,148.5
-2015,2016-02-15,NMST,41,WICH,71,-16.0,129.5
-2015,2016-02-15,LI,82,SFNY,67,-4.0,141.0
-2015,2016-02-15,MORG,79,HAMP,87,-9.5,143.5
-2015,2016-02-15,HC,59,LEH,64,-12.0,135.0
-2015,2016-02-15,ARPB,60,ALCN,79,-9.0,128.0
-2015,2016-02-16,WAKE,82,PITT,82,-11.5,152.0
-2015,2016-02-16,RICH,79,DAV,83,-1.0,156.0
-2015,2016-02-16,NW,61,PUR,71,-11.5,134.5
-2015,2016-02-16,WVU,78,TEX,85,-2.0,136.0
-2015,2016-02-16,SC,67,MIZ,72,8.0,144.5
-2015,2016-02-16,VALP,66,CLEV,43,15.0,122.0
-2015,2016-02-16,BUFF,70,AKR,80,-7.5,150.0
-2015,2016-02-16,CREI,75,BUT,88,-5.5,147.5
-2015,2016-02-16,BALL,73,MIOH,56,1.5,124.5
-2015,2016-02-16,WMU,78,KENT,85,-4.5,142.5
-2015,2016-02-16,TOL,69,CMU,77,-1.5,153.0
-2015,2016-02-16,EMU,64,OHIO,86,-4.0,157.0
-2015,2016-02-16,UIC,91,YSU,92,-6.5,155.5
-2015,2016-02-16,DET,74,NKU,68,1.0,158.5
-2015,2016-02-16,USF,69,ECU,52,-6.5,136.0
-2015,2016-02-16,MICH,66,OSU,76,-1.5,137.0
-2015,2016-02-16,URI,67,VCU,83,-9.5,136.5
-2015,2016-02-16,TROY,61,USA,54,-2.5,144.5
-2015,2016-02-16,KSU,63,TCU,49,4.5,134.0
-2015,2016-02-16,BGSU,60,NIU,71,-5.5,139.0
-2015,2016-02-16,VAN,74,MSST,75,3.0,146.0
-2015,2016-02-16,FLA,57,UGA,53,1.5,134.0
-2015,2016-02-16,MISS,56,TAMU,71,-9.5,144.0
-2015,2016-02-16,RUTG,66,ILL,82,-15.0,143.0
-2015,2016-02-16,ISU,91,BAY,100,-2.0,157.0
-2015,2016-02-16,UNLV,74,AFA,79,7.5,140.0
-2015,2016-02-17,DAY,70,JOES,79,-1.5,142.0
-2015,2016-02-17,IOWA,75,PSU,79,9.0,140.5
-2015,2016-02-17,SYR,58,LOU,72,-8.5,127.5
-2015,2016-02-17,PROV,74,XAV,85,-9.0,150.0
-2015,2016-02-17,NOVA,83,TEM,67,10.0,132.5
-2015,2016-02-17,BC,54,CLEM,65,-16.0,124.0
-2015,2016-02-17,GW,81,DUQ,74,2.5,154.0
-2015,2016-02-17,UMASS,66,FOR,76,-3.0,143.5
-2015,2016-02-17,SBON,64,LAS,71,9.0,140.5
-2015,2016-02-17,UCF,56,MEM,73,-12.0,148.5
-2015,2016-02-17,AUB,90,ARK,86,-16.5,147.0
-2015,2016-02-17,SLU,79,GMU,77,-5.0,136.5
-2015,2016-02-17,DEP,65,SJU,80,2.5,144.5
-2015,2016-02-17,INST,50,ILST,78,-6.0,138.0
-2015,2016-02-17,UNI,56,LOYI,59,4.5,124.0
-2015,2016-02-17,BRAD,59,SIU,71,-16.5,131.0
-2015,2016-02-17,NEB,64,IND,80,-12.0,148.0
-2015,2016-02-17,OKLA,63,TTU,65,4.0,148.0
-2015,2016-02-17,VT,49,MIA,65,-14.5,143.5
-2015,2016-02-17,HALL,72,GTWN,64,-2.5,143.5
-2015,2016-02-17,GT,86,FSU,80,-7.0,148.0
-2015,2016-02-17,DUKE,74,UNC,73,-8.5,162.5
-2015,2016-02-17,CSU,59,USU,72,-3.5,153.5
-2015,2016-02-17,EVAN,80,DRKE,74,10.0,144.0
-2015,2016-02-17,ALA,76,LSU,69,-8.0,144.0
-2015,2016-02-17,ASU,61,ARIZ,99,-12.5,148.5
-2015,2016-02-17,FRES,79,WYO,75,-1.5,135.0
-2015,2016-02-17,HOU,82,TULN,69,5.5,138.5
-2015,2016-02-17,UCI,96,CSF,77,7.0,134.5
-2015,2016-02-17,BSU,78,UNM,80,-2.5,152.5
-2015,2016-02-17,NEV,61,SJSU,55,4.0,142.5
-2015,2016-02-17,COLO,72,USC,79,-7.5,152.0
-2015,2016-02-17,OMA,76,IUPU,88,1.5,158.0
-2015,2016-02-17,WIU,54,NDSU,63,-7.5,130.0
-2015,2016-02-17,MAN,69,SPU,70,-3.5,130.0
-2015,2016-02-18,ELON,81,DREX,76,3.5,144.5
-2015,2016-02-18,NE,95,JMU,94,-5.0,136.5
-2015,2016-02-18,UNCW,69,WMRY,87,-4.5,158.0
-2015,2016-02-18,TOWS,82,HOF,84,-8.0,144.0
-2015,2016-02-18,MOST,68,WICH,99,-22.0,134.0
-2015,2016-02-18,CHAR,72,MRSH,87,-4.5,179.5
-2015,2016-02-18,COFC,59,DEL,62,4.5,127.0
-2015,2016-02-18,SMU,62,CONN,68,-3.0,134.5
-2015,2016-02-18,USA,75,APP,71,-5.5,146.0
-2015,2016-02-18,UALR,57,GAST,49,4.5,120.0
-2015,2016-02-18,ARST,59,GASO,90,-4.0,149.0
-2015,2016-02-18,FIU,75,UNT,77,2.0,143.5
-2015,2016-02-18,ODU,59,WKU,56,0.0,132.0
-2015,2016-02-18,MD,63,MINN,68,10.0,139.5
-2015,2016-02-18,FAU,85,RICE,90,-5.5,150.5
-2015,2016-02-18,ULL,83,UTA,84,-2.0,160.0
-2015,2016-02-18,ULM,76,TXST,57,2.0,129.5
-2015,2016-02-18,TENN,70,UK,80,-17.0,150.0
-2015,2016-02-18,CIN,68,TLSA,70,-1.5,134.5
-2015,2016-02-18,USM,73,UTEP,78,-10.0,136.5
-2015,2016-02-18,PAC,68,GONZ,90,-18.0,136.5
-2015,2016-02-18,WIS,57,MSU,69,-9.5,135.5
-2015,2016-02-18,LT,87,UTSA,74,10.5,160.0
-2015,2016-02-18,HAW,69,CSN,63,6.0,148.5
-2015,2016-02-18,UCD,53,CP,58,-8.5,133.0
-2015,2016-02-18,STAN,72,WSU,56,2.0,139.0
-2015,2016-02-18,UTAH,75,UCLA,73,-1.5,147.0
-2015,2016-02-18,SMC,74,PORT,72,9.5,146.0
-2015,2016-02-18,SCU,76,LMU,72,-3.0,139.5
-2015,2016-02-18,SF,82,PEPP,72,-8.5,149.5
-2015,2016-02-18,BYU,69,USD,67,11.5,146.5
-2015,2016-02-18,CAL,78,WASH,75,1.5,158.5
-2015,2016-02-18,UCSB,65,UCRV,55,5.0,136.5
-2015,2016-02-18,ETSU,67,CIT,51,6.5,183.0
-2015,2016-02-18,WCU,72,MER,65,-7.0,136.5
-2015,2016-02-18,VMI,59,CHAT,85,-19.0,136.0
-2015,2016-02-18,EIU,84,UTM,87,-7.0,142.5
-2015,2016-02-18,TNST,61,MORE,66,-4.5,136.5
-2015,2016-02-18,MRST,72,NIAG,76,-6.0,137.5
-2015,2016-02-18,SDKS,79,IPFW,91,4.0,156.0
-2015,2016-02-18,SIUE,72,SEMO,69,2.0,137.0
-2015,2016-02-18,SPU,55,QUIN,56,-2.0,123.5
-2015,2016-02-18,FAIR,74,CAN,71,-4.0,159.5
-2015,2016-02-18,UNCG,82,SAM,77,-3.5,146.0
-2015,2016-02-18,IDST,68,NAU,81,3.0,150.0
-2015,2016-02-18,WEB,87,SUU,83,15.0,140.5
-2015,2016-02-18,BEL,86,EKY,78,3.0,169.5
-2015,2016-02-18,EWU,93,SAC,88,3.0,156.0
-2015,2016-02-18,IDHO,80,PRST,74,-4.0,139.5
-2015,2016-02-18,CHSO,76,WEBB,84,-9.0,144.0
-2015,2016-02-19,OAK,84,VALP,86,-9.0,153.5
-2015,2016-02-19,DET,83,UIC,72,8.5,160.0
-2015,2016-02-19,AKR,76,KENT,85,2.5,146.0
-2015,2016-02-19,HARV,76,CLMB,90,-8.0,132.5
-2015,2016-02-19,NIU,59,BALL,63,-3.0,135.0
-2015,2016-02-19,BRWN,74,PENN,79,-7.0,148.5
-2015,2016-02-19,DART,78,COR,66,-2.0,145.5
-2015,2016-02-19,RICH,74,VCU,87,-9.0,151.0
-2015,2016-02-19,SIE,84,RID,64,-1.5,138.5
-2015,2016-02-19,YALE,63,PRIN,75,-3.0,140.5
-2015,2016-02-19,DEN,58,ORU,62,-6.0,135.5
-2015,2016-02-19,IONA,83,MONM,67,-5.0,166.5
-2015,2016-02-20,ARMY,80,NAVY,78,-4.5,139.0
-2015,2016-02-20,UNM,72,AFA,76,8.0,143.5
-2015,2016-02-20,FIU,70,RICE,86,-1.0,150.0
-2015,2016-02-20,BAY,78,TEX,64,-5.5,138.5
-2015,2016-02-20,DREX,74,WMRY,69,-14.0,139.0
-2015,2016-02-20,PITT,66,SYR,52,-2.0,134.0
-2015,2016-02-20,MARQ,73,DEP,60,4.5,142.0
-2015,2016-02-20,MIOH,64,OHIO,76,-11.5,138.0
-2015,2016-02-20,JOES,93,DAV,99,2.0,159.5
-2015,2016-02-20,CMU,85,WMU,92,1.0,146.5
-2015,2016-02-20,YSU,90,GB,107,-15.0,177.5
-2015,2016-02-20,ARST,61,GAST,69,-8.0,137.0
-2015,2016-02-20,MSST,67,ALA,61,-5.5,140.0
-2015,2016-02-20,BUT,67,NOVA,77,-11.0,141.0
-2015,2016-02-20,UNCO,73,UND,74,-7.5,153.0
-2015,2016-02-20,FSU,73,VT,83,3.5,151.0
-2015,2016-02-20,CLEM,74,NCST,77,-2.5,137.5
-2015,2016-02-20,CHAR,54,WKU,59,-2.5,155.0
-2015,2016-02-20,MRST,66,CAN,81,-9.5,152.0
-2015,2016-02-20,FAIR,71,NIAG,59,3.0,146.0
-2015,2016-02-20,VMI,67,SAM,73,-11.0,142.5
-2015,2016-02-20,SDKS,87,WIU,67,7.5,143.5
-2015,2016-02-20,MEM,71,USF,80,8.5,141.0
-2015,2016-02-20,XAV,88,GTWN,70,3.0,149.5
-2015,2016-02-20,SBON,79,DAY,72,-10.0,142.0
-2015,2016-02-20,DUKE,64,LOU,71,-7.0,143.0
-2015,2016-02-20,FLA,69,SC,73,-2.5,142.5
-2015,2016-02-20,UGA,67,VAN,80,-8.5,134.0
-2015,2016-02-20,ELON,56,TOWS,67,-6.0,148.5
-2015,2016-02-20,BGSU,74,BUFF,88,-7.0,146.5
-2015,2016-02-20,TOL,85,EMU,91,2.5,151.0
-2015,2016-02-20,MIA,71,UNC,96,-7.5,147.0
-2015,2016-02-20,PSU,70,RUTG,58,8.5,139.0
-2015,2016-02-20,WCU,102,CIT,97,4.0,176.5
-2015,2016-02-20,TROY,74,APP,78,-3.5,149.0
-2015,2016-02-20,WYO,84,CSU,66,-6.5,146.5
-2015,2016-02-20,SF,87,LMU,100,2.0,152.5
-2015,2016-02-20,OKLA,76,WVU,62,-4.0,151.5
-2015,2016-02-20,DEL,50,JMU,75,-11.0,144.5
-2015,2016-02-20,CONN,60,CIN,65,-3.5,126.5
-2015,2016-02-20,USM,53,UTSA,74,1.0,145.0
-2015,2016-02-20,SIU,71,EVAN,83,-7.0,147.5
-2015,2016-02-20,ILST,66,UNI,75,-5.5,129.0
-2015,2016-02-20,CLEV,54,MILW,88,-12.0,130.5
-2015,2016-02-20,ETSU,77,MER,74,-3.5,139.0
-2015,2016-02-20,UNCG,79,CHAT,64,-13.0,142.5
-2015,2016-02-20,MISS,69,AUB,59,6.0,148.0
-2015,2016-02-20,IUPU,59,NDSU,63,-7.5,131.5
-2015,2016-02-20,EIU,71,SEMO,68,4.0,144.5
-2015,2016-02-20,ULL,57,TXST,61,8.0,139.0
-2015,2016-02-20,LSU,65,TENN,81,2.5,159.5
-2015,2016-02-20,BRWN,66,PRIN,77,-18.0,158.0
-2015,2016-02-20,LT,80,UTEP,91,-2.0,154.5
-2015,2016-02-20,WEB,77,NAU,74,11.0,144.5
-2015,2016-02-20,KU,72,KSU,63,4.5,143.5
-2015,2016-02-20,UNCW,59,COFC,55,3.5,133.0
-2015,2016-02-20,TNTC,86,BEL,95,-8.5,165.5
-2015,2016-02-20,HARV,76,COR,74,2.0,140.0
-2015,2016-02-20,UK,77,TAMU,79,1.5,141.5
-2015,2016-02-20,UALR,75,GASO,61,5.5,135.5
-2015,2016-02-20,USU,68,FRES,75,-4.5,141.0
-2015,2016-02-20,OSU,65,NEB,62,-2.0,137.0
-2015,2016-02-20,NKU,64,WRST,67,-8.5,131.0
-2015,2016-02-20,DART,54,CLMB,73,-9.0,138.0
-2015,2016-02-20,DUQ,74,URI,77,-8.5,148.0
-2015,2016-02-20,ODU,65,MRSH,82,-3.0,150.0
-2015,2016-02-20,OMA,90,IPFW,94,-3.5,170.5
-2015,2016-02-20,YALE,79,PENN,58,8.5,135.0
-2015,2016-02-20,FUR,73,WOF,77,-2.5,135.5
-2015,2016-02-20,SIUE,51,UTM,68,-8.0,136.0
-2015,2016-02-20,MIZ,72,ARK,84,-12.5,147.0
-2015,2016-02-20,TCU,83,ISU,92,-17.5,147.5
-2015,2016-02-20,MURR,76,PEAY,60,1.0,141.5
-2015,2016-02-20,SCU,76,PEPP,88,-10.0,137.5
-2015,2016-02-20,FOR,68,SLU,76,1.0,133.0
-2015,2016-02-20,ND,62,GT,63,2.5,151.5
-2015,2016-02-20,FAU,62,UNT,70,-5.0,146.5
-2015,2016-02-20,STAN,53,WASH,64,-5.5,156.0
-2015,2016-02-20,DRKE,70,BRAD,73,3.5,127.0
-2015,2016-02-20,ULM,64,UTA,61,-7.0,148.5
-2015,2016-02-20,PUR,73,IND,77,-4.0,147.0
-2015,2016-02-20,JVST,46,TNST,61,-11.0,137.0
-2015,2016-02-20,IDST,89,SUU,71,1.5,149.5
-2015,2016-02-20,MTST,78,MONT,87,-10.5,144.5
-2015,2016-02-20,USD,33,BYU,91,-18.0,145.0
-2015,2016-02-20,TTU,71,OKST,61,-1.5,129.5
-2015,2016-02-20,NEV,91,UNLV,102,-5.5,148.0
-2015,2016-02-20,CSN,75,CP,71,-6.5,149.5
-2015,2016-02-20,SMC,63,GONZ,58,-6.0,138.0
-2015,2016-02-20,PAC,67,PORT,80,-4.5,150.0
-2015,2016-02-20,UCD,55,UCSB,62,-12.0,124.5
-2015,2016-02-20,ORST,81,ORE,91,-12.0,146.0
-2015,2016-02-20,IDHO,65,SAC,68,-2.0,135.5
-2015,2016-02-20,EWU,91,PRST,107,3.5,162.5
-2015,2016-02-20,CSF,57,LBSU,70,-11.5,149.0
-2015,2016-02-20,COLO,53,UCLA,77,-5.0,149.0
-2015,2016-02-20,HAW,75,UCI,71,-4.0,136.5
-2015,2016-02-21,HALL,62,SJU,61,10.5,146.0
-2015,2016-02-21,MICH,82,MD,86,-9.5,139.0
-2015,2016-02-21,NE,60,HOF,65,-7.5,148.5
-2015,2016-02-21,TLSA,75,UCF,67,9.0,137.5
-2015,2016-02-21,ECU,63,SMU,74,-19.0,144.0
-2015,2016-02-21,MAN,63,QUIN,59,1.0,136.0
-2015,2016-02-21,MONM,82,SPU,75,6.0,138.5
-2015,2016-02-21,BU,59,BUCK,80,-6.0,154.5
-2015,2016-02-21,LAS,50,GW,90,-16.5,137.5
-2015,2016-02-21,DET,74,VALP,90,-14.0,151.5
-2015,2016-02-21,DEN,76,SDAK,71,-5.5,136.5
-2015,2016-02-21,SDSU,78,SJSU,56,9.0,125.0
-2015,2016-02-21,GMU,64,UMASS,70,-6.0,144.5
-2015,2016-02-21,WICH,84,INST,51,12.0,137.0
-2015,2016-02-21,LOYI,75,MOST,62,-1.5,134.0
-2015,2016-02-21,OAK,74,UIC,63,15.0,163.0
-2015,2016-02-21,UAB,77,MTSU,67,-2.5,142.0
-2015,2016-02-21,UTAH,80,USC,69,-1.5,148.0
-2015,2016-02-21,BC,48,WAKE,74,-9.0,139.0
-2015,2016-02-21,TEM,69,HOU,66,-4.0,139.5
-2015,2016-02-21,ILL,60,WIS,69,-11.5,136.0
-2015,2016-02-21,CAL,80,WSU,62,10.0,144.0
-2015,2016-02-22,UVA,61,MIA,64,-2.0,128.5
-2015,2016-02-22,TEX,71,KSU,70,-1.0,131.5
-2015,2016-02-22,IONA,87,SIE,81,-1.5,158.0
-2015,2016-02-22,CLEV,61,GB,78,-13.0,149.5
-2015,2016-02-22,YSU,51,MILW,87,-16.5,157.0
-2015,2016-02-22,ISU,87,WVU,97,-6.0,156.5
-2015,2016-02-22,COPP,77,NORF,85,-13.5,148.5
-2015,2016-02-23,GAST,52,GASO,54,-1.5,134.5
-2015,2016-02-23,URI,54,DAV,65,-3.0,149.0
-2015,2016-02-23,KENT,70,BUFF,87,-5.5,148.0
-2015,2016-02-23,ALA,53,UK,78,-13.5,136.0
-2015,2016-02-23,LSU,65,ARK,85,-4.0,157.5
-2015,2016-02-23,VAN,87,FLA,74,-2.5,138.5
-2015,2016-02-23,TEM,55,TLSA,74,-6.5,136.5
-2015,2016-02-23,CLEM,73,GT,75,-2.5,135.0
-2015,2016-02-23,OHIO,82,BGSU,87,3.0,146.5
-2015,2016-02-23,AKR,64,MIOH,77,6.0,132.5
-2015,2016-02-23,NIU,64,CMU,76,-6.0,143.0
-2015,2016-02-23,WMU,62,EMU,73,-5.5,152.5
-2015,2016-02-23,RID,58,MRST,71,5.0,140.0
-2015,2016-02-23,KU,66,BAY,60,2.5,149.5
-2015,2016-02-23,DAY,52,SLU,49,13.0,134.5
-2015,2016-02-23,BALL,67,TOL,77,-8.0,142.0
-2015,2016-02-23,SPU,61,MAN,40,-4.5,131.0
-2015,2016-02-23,RUTG,61,MINN,83,-12.5,142.0
-2015,2016-02-23,MIZ,76,MISS,85,-10.5,143.0
-2015,2016-02-23,TCU,79,TTU,83,-11.5,135.0
-2015,2016-02-23,VT,71,BC,56,5.5,134.0
-2015,2016-02-23,MSU,81,OSU,62,6.5,139.0
-2015,2016-02-23,EVAN,67,BRAD,55,15.5,130.5
-2015,2016-02-23,UNM,69,CSU,86,1.0,157.0
-2015,2016-02-23,UNLV,69,BSU,81,-8.0,154.5
-2015,2016-02-24,FOR,56,LAS,53,3.0,134.0
-2015,2016-02-24,JOES,74,UMASS,57,7.5,151.5
-2015,2016-02-24,GWU,73,RICH,61,-1.0,146.5
-2015,2016-02-24,DUQ,76,SBON,80,-6.5,160.0
-2015,2016-02-24,NW,63,MICH,72,-7.0,135.5
-2015,2016-02-24,NOVA,83,XAV,90,1.0,145.0
-2015,2016-02-24,SIU,50,ILST,73,-4.5,140.5
-2015,2016-02-24,HOU,88,UCF,61,6.0,143.5
-2015,2016-02-24,VCU,69,GMU,76,11.0,143.0
-2015,2016-02-24,UGA,81,AUB,84,5.5,137.5
-2015,2016-02-24,MSST,66,TAMU,68,-11.5,144.5
-2015,2016-02-24,INST,44,UNI,66,-10.0,133.5
-2015,2016-02-24,DRKE,52,MOST,61,-6.0,143.5
-2015,2016-02-24,MARQ,66,CREI,61,-7.5,148.0
-2015,2016-02-24,ECU,79,TULN,73,-3.0,137.0
-2015,2016-02-24,LOU,67,PITT,60,1.0,134.5
-2015,2016-02-24,UNC,80,NCST,68,8.0,154.5
-2015,2016-02-24,OKST,49,OKLA,71,-16.0,139.0
-2015,2016-02-24,ND,69,WAKE,58,7.5,154.5
-2015,2016-02-24,WIS,67,IOWA,59,-6.5,138.0
-2015,2016-02-24,WICH,76,LOYI,54,14.0,126.5
-2015,2016-02-24,TENN,58,SC,84,-7.5,147.5
-2015,2016-02-24,ARIZ,72,COLO,75,5.5,146.5
-2015,2016-02-24,WSU,62,ORE,76,-18.0,147.5
-2015,2016-02-24,SDSU,73,WYO,61,5.0,126.0
-2015,2016-02-24,AFA,63,FRES,64,-11.0,135.5
-2015,2016-02-24,LBSU,67,UCI,90,-5.0,139.5
-2015,2016-02-24,USU,68,NEV,73,-4.0,144.0
-2015,2016-02-24,WASH,81,ORST,82,-4.0,154.5
-2015,2016-02-24,SIE,69,FAIR,76,4.5,156.5
-2015,2016-02-25,DEL,64,DREX,74,-4.0,135.5
-2015,2016-02-25,UTEP,53,ODU,74,-7.5,136.5
-2015,2016-02-25,COFC,57,NE,58,-4.0,121.5
-2015,2016-02-25,HOF,70,UNCW,69,-3.5,155.0
-2015,2016-02-25,SMU,69,MEM,62,4.5,151.5
-2015,2016-02-25,NEB,55,PSU,56,-1.0,135.0
-2015,2016-02-25,FSU,65,DUKE,80,-9.5,156.5
-2015,2016-02-25,PROV,52,HALL,70,-4.5,142.5
-2015,2016-02-25,WMRY,75,ELON,65,3.0,159.0
-2015,2016-02-25,UTSA,108,CHAR,114,-15.5,162.5
-2015,2016-02-25,WKU,78,MTSU,72,-7.0,138.5
-2015,2016-02-25,CIT,63,UNCG,92,-10.5,179.0
-2015,2016-02-25,FUR,75,ETSU,80,-3.5,141.0
-2015,2016-02-25,MER,82,VMI,91,7.0,135.5
-2015,2016-02-25,WOF,48,WCU,53,-1.0,144.0
-2015,2016-02-25,MORE,69,TNTC,59,-1.0,145.5
-2015,2016-02-25,TNST,56,UTM,72,-1.5,140.5
-2015,2016-02-25,SDAK,85,IUPU,82,-3.0,148.0
-2015,2016-02-25,APP,63,GASO,88,-6.5,152.5
-2015,2016-02-25,CONN,81,USF,51,13.5,129.0
-2015,2016-02-25,NKU,58,CLEV,63,0.0,126.0
-2015,2016-02-25,WRST,87,YSU,81,8.5,147.0
-2015,2016-02-25,PRST,77,UND,80,-5.0,151.5
-2015,2016-02-25,RICE,76,USM,74,2.0,142.0
-2015,2016-02-25,JMU,67,TOWS,69,-2.5,135.0
-2015,2016-02-25,MRSH,91,UAB,95,-7.5,170.0
-2015,2016-02-25,NIAG,60,CAN,65,-9.0,140.5
-2015,2016-02-25,ORU,98,OMA,102,-6.0,167.5
-2015,2016-02-25,NDSU,59,SDKS,71,-9.5,135.0
-2015,2016-02-25,PEAY,80,SIUE,75,2.0,141.0
-2015,2016-02-25,EKY,76,JVST,54,5.0,147.0
-2015,2016-02-25,ULM,66,USA,59,5.0,138.0
-2015,2016-02-25,UTA,60,UALR,72,-6.0,138.0
-2015,2016-02-25,ULL,73,TROY,63,8.0,149.5
-2015,2016-02-25,TXST,71,ARST,60,-3.0,134.5
-2015,2016-02-25,SAC,67,UNCO,72,-2.0,155.0
-2015,2016-02-25,IND,74,ILL,47,7.5,151.0
-2015,2016-02-25,SJU,75,DEP,83,-4.5,141.5
-2015,2016-02-25,WIN,85,HP,87,-5.0,158.5
-2015,2016-02-25,UCLA,63,CAL,75,-7.0,146.5
-2015,2016-02-25,UNT,62,LT,73,-12.0,155.0
-2015,2016-02-25,ASU,46,UTAH,81,-12.5,145.5
-2015,2016-02-25,IPFW,87,WIU,75,3.5,148.0
-2015,2016-02-25,MONT,90,IDST,77,5.0,143.5
-2015,2016-02-25,MTST,60,WEB,68,-9.5,148.5
-2015,2016-02-25,MURR,74,EIU,85,5.0,136.5
-2015,2016-02-25,SF,70,PAC,79,-2.0,148.0
-2015,2016-02-25,CSF,78,CP,77,-8.5,144.5
-2015,2016-02-25,GONZ,82,USD,60,14.5,133.5
-2015,2016-02-25,UCSB,78,CSN,63,2.5,144.5
-2015,2016-02-25,PORT,81,BYU,99,-18.0,168.5
-2015,2016-02-25,SCU,50,SMC,75,-16.5,136.0
-2015,2016-02-25,USC,64,STAN,84,1.0,144.5
-2015,2016-02-25,UCRV,77,HAW,71,-14.5,139.0
-2015,2016-02-26,UIC,69,GB,85,-16.0,160.0
-2015,2016-02-26,DET,97,OAK,108,-10.0,182.0
-2015,2016-02-26,RID,58,MONM,79,-9.0,143.0
-2015,2016-02-26,CLMB,83,PRIN,88,-7.5,142.5
-2015,2016-02-26,DART,83,BRWN,84,0.0,149.0
-2015,2016-02-26,BGSU,54,AKR,89,-8.5,145.5
-2015,2016-02-26,IONA,86,MAN,73,7.0,149.0
-2015,2016-02-26,QUIN,77,MRST,91,-2.5,140.0
-2015,2016-02-26,COR,67,PENN,79,-4.5,148.5
-2015,2016-02-26,HARV,50,YALE,59,-11.5,132.0
-2015,2016-02-26,VALP,80,MILW,76,5.0,135.5
-2015,2016-02-27,EWU,62,IDHO,66,1.5,149.5
-2015,2016-02-27,PEPP,83,LMU,90,5.5,142.5
-2015,2016-02-27,UK,62,VAN,74,2.0,144.0
-2015,2016-02-27,TAMU,84,MIZ,69,10.0,141.0
-2015,2016-02-27,SUU,69,NAU,59,-5.0,151.5
-2015,2016-02-27,COFC,63,HOF,72,-7.5,129.0
-2015,2016-02-27,NE,61,DREX,59,4.0,130.5
-2015,2016-02-27,ND,56,FSU,77,2.5,152.0
-2015,2016-02-27,MD,79,PUR,83,-4.5,136.5
-2015,2016-02-27,DEP,66,PROV,87,-11.0,142.5
-2015,2016-02-27,BUFF,96,OHIO,103,-3.5,156.0
-2015,2016-02-27,UMASS,83,SBON,85,-9.0,151.0
-2015,2016-02-27,WOF,66,ETSU,71,-4.5,144.5
-2015,2016-02-27,WMU,67,NIU,76,-4.5,140.0
-2015,2016-02-27,UCLA,70,STAN,79,1.0,142.5
-2015,2016-02-27,SAM,66,CHAT,77,-12.5,142.5
-2015,2016-02-27,AUB,57,ALA,65,-11.0,138.0
-2015,2016-02-27,TTU,58,KU,67,-13.5,144.5
-2015,2016-02-27,MISS,66,UGA,80,-2.5,141.0
-2015,2016-02-27,CIN,65,ECU,56,11.5,135.5
-2015,2016-02-27,UCF,61,TEM,63,-11.0,135.5
-2015,2016-02-27,GT,76,BC,71,9.5,131.5
-2015,2016-02-27,BUT,90,GTWN,87,1.0,147.0
-2015,2016-02-27,URI,75,DAY,66,-7.5,130.5
-2015,2016-02-27,WKU,67,UAB,71,-9.0,147.0
-2015,2016-02-27,LEH,82,ARMY,72,-2.0,152.0
-2015,2016-02-27,VCU,69,GW,65,1.5,145.0
-2015,2016-02-27,TOWS,68,UNCW,74,-7.0,144.5
-2015,2016-02-27,WRST,55,CLEV,51,7.5,122.5
-2015,2016-02-27,CIT,95,VMI,111,-3.5,174.5
-2015,2016-02-27,IPFW,77,IUPU,80,2.5,152.5
-2015,2016-02-27,NOVA,89,MARQ,79,8.5,141.0
-2015,2016-02-27,OKLA,63,TEX,76,2.5,145.5
-2015,2016-02-27,ARIZ,64,UTAH,70,-3.5,144.0
-2015,2016-02-27,LOU,65,MIA,73,-2.5,135.0
-2015,2016-02-27,ELON,77,DEL,59,4.0,151.5
-2015,2016-02-27,NCST,66,SYR,75,-4.5,136.0
-2015,2016-02-27,RUTG,59,NW,98,-18.0,135.5
-2015,2016-02-27,DAV,82,FOR,91,3.5,149.0
-2015,2016-02-27,GMU,68,LAS,76,2.5,133.5
-2015,2016-02-27,FIU,71,FAU,63,2.5,136.5
-2015,2016-02-27,EMU,79,BALL,115,-4.0,140.0
-2015,2016-02-27,FAIR,68,SPU,72,-3.0,138.5
-2015,2016-02-27,BRAD,58,INST,77,-13.5,130.0
-2015,2016-02-27,LOYI,59,DRKE,69,3.5,131.0
-2015,2016-02-27,UNI,54,EVAN,52,-4.5,133.0
-2015,2016-02-27,ILST,58,WICH,74,-16.5,132.0
-2015,2016-02-27,FUR,62,WCU,73,-1.0,137.0
-2015,2016-02-27,APP,70,GAST,83,-9.0,138.0
-2015,2016-02-27,SC,58,MSST,68,1.0,147.5
-2015,2016-02-27,WMRY,65,JMU,71,1.0,147.5
-2015,2016-02-27,SAC,71,UND,97,-5.0,144.5
-2015,2016-02-27,KENT,65,MIOH,74,2.0,132.5
-2015,2016-02-27,ULL,70,USA,83,11.0,148.0
-2015,2016-02-27,ULM,66,TROY,51,4.0,138.5
-2015,2016-02-27,MORE,82,JVST,71,10.0,129.0
-2015,2016-02-27,ORU,65,SDKS,73,-12.0,154.5
-2015,2016-02-27,BSU,66,SDSU,63,-6.5,131.5
-2015,2016-02-27,HARV,61,BRWN,52,1.0,144.5
-2015,2016-02-27,WVU,70,OKST,56,7.0,137.5
-2015,2016-02-27,KSU,61,ISU,80,-8.5,149.0
-2015,2016-02-27,RICH,83,DUQ,67,1.0,156.5
-2015,2016-02-27,MRSH,74,MTSU,83,-3.0,163.5
-2015,2016-02-27,NDSU,59,DEN,70,-1.5,120.5
-2015,2016-02-27,COR,60,PRIN,74,-17.5,153.5
-2015,2016-02-27,UNC,74,UVA,79,-2.5,137.0
-2015,2016-02-27,TXST,68,UALR,73,-12.5,119.5
-2015,2016-02-27,UTEP,78,CHAR,88,-6.0,161.0
-2015,2016-02-27,UCRV,55,LBSU,66,-10.5,141.5
-2015,2016-02-27,RICE,69,LT,88,-8.5,158.0
-2015,2016-02-27,CMU,76,TOL,74,-8.0,153.0
-2015,2016-02-27,NKU,75,YSU,94,3.5,152.5
-2015,2016-02-27,CLMB,93,PENN,65,6.0,140.0
-2015,2016-02-27,ARK,75,TENN,65,0.0,154.5
-2015,2016-02-27,SEMO,75,PEAY,83,-11.0,149.0
-2015,2016-02-27,UTA,79,ARST,75,7.0,155.0
-2015,2016-02-27,WYO,74,UNLV,79,-9.5,144.5
-2015,2016-02-27,GONZ,71,BYU,68,-3.0,154.5
-2015,2016-02-27,BAY,86,TCU,71,9.0,142.5
-2015,2016-02-27,DART,71,YALE,76,-15.0,135.0
-2015,2016-02-27,UTSA,56,ODU,78,-16.5,139.5
-2015,2016-02-27,UNT,70,USM,81,-1.5,134.5
-2015,2016-02-27,MOST,68,SIU,78,-8.0,142.5
-2015,2016-02-27,UTM,55,MURR,79,-6.5,136.5
-2015,2016-02-27,SDAK,76,WIU,90,1.5,150.0
-2015,2016-02-27,FLA,91,LSU,96,-1.0,147.5
-2015,2016-02-27,EKY,82,TNTC,92,-2.5,164.5
-2015,2016-02-27,PRST,89,UNCO,86,1.0,160.0
-2015,2016-02-27,SJSU,70,USU,88,-11.0,141.0
-2015,2016-02-27,PAC,65,SCU,69,-1.0,137.0
-2015,2016-02-27,MONT,54,WEB,60,-3.5,136.5
-2015,2016-02-27,UCSB,80,CSF,62,5.0,141.0
-2015,2016-02-27,PORT,76,USD,85,2.5,143.5
-2015,2016-02-27,MTST,69,IDST,76,-1.0,155.0
-2015,2016-02-27,FRES,92,UNM,82,-6.5,147.5
-2015,2016-02-27,SMC,84,SF,72,8.5,144.0
-2015,2016-02-27,CSN,78,HAW,89,-13.5,149.5
-2015,2016-02-27,UCI,62,UCD,61,8.5,124.5
-2015,2016-02-28,XAV,81,HALL,90,2.0,150.5
-2015,2016-02-28,HOU,75,CONN,68,-10.0,136.0
-2015,2016-02-28,SLU,63,JOES,77,-17.0,138.0
-2015,2016-02-28,MER,65,UNCG,69,-3.5,139.0
-2015,2016-02-28,DUKE,62,PITT,76,0.0,148.0
-2015,2016-02-28,QUIN,65,SIE,80,-14.0,140.5
-2015,2016-02-28,PSU,57,MSU,88,-17.5,137.5
-2015,2016-02-28,SJU,59,CREI,100,-15.0,148.5
-2015,2016-02-28,TULN,53,SMU,74,-19.5,136.5
-2015,2016-02-28,VALP,70,GB,68,5.5,151.5
-2015,2016-02-28,UIC,85,MILW,98,-17.0,141.5
-2015,2016-02-28,BEL,72,TNST,87,-1.0,155.5
-2015,2016-02-28,TLSA,82,MEM,92,2.0,147.0
-2015,2016-02-28,IOWA,64,OSU,68,4.0,142.0
-2015,2016-02-28,CAN,78,IONA,86,-12.0,158.5
-2015,2016-02-28,ASU,69,COLO,79,-7.5,144.5
-2015,2016-02-28,CSU,80,NEV,87,-3.0,150.0
-2015,2016-02-28,NIAG,68,MONM,77,-17.0,142.0
-2015,2016-02-28,MICH,57,WIS,68,-6.0,134.0
-2015,2016-02-28,MAN,57,RID,60,-6.0,132.5
-2015,2016-02-28,VT,81,WAKE,74,-4.0,150.5
-2015,2016-02-28,WSU,49,ORST,69,-11.5,139.0
-2015,2016-02-28,MINN,71,ILL,84,-4.5,142.5
-2015,2016-02-28,USC,65,CAL,87,-8.0,149.5
-2015,2016-02-28,WASH,73,ORE,86,-11.0,166.0
-2015,2016-02-29,OKST,50,ISU,58,-14.0,145.0
-2015,2016-02-29,SYR,70,UNC,75,-12.5,146.0
-2015,2016-02-29,CHAT,67,VMI,65,12.5,144.0
-2015,2016-02-29,KU,86,TEX,56,3.5,142.0
-2015,2016-02-29,ALST,86,TXSO,96,-10.0,143.5
-2015,2016-03-01,UVA,64,CLEM,57,4.0,122.0
-2015,2016-03-01,MIOH,67,BUFF,59,-10.0,141.5
-2015,2016-03-01,OHIO,76,AKR,91,-6.0,154.0
-2015,2016-03-01,CMU,65,BALL,57,-3.0,140.0
-2015,2016-03-01,BGSU,54,KENT,70,-6.0,143.0
-2015,2016-03-01,TOL,64,WMU,70,3.5,148.0
-2015,2016-03-01,NIU,71,EMU,75,-4.5,143.5
-2015,2016-03-01,DEP,62,NOVA,83,-22.0,139.5
-2015,2016-03-01,TENN,69,VAN,86,-13.0,146.0
-2015,2016-03-01,UK,88,FLA,79,4.5,140.5
-2015,2016-03-01,DAY,85,RICH,84,1.5,141.5
-2015,2016-03-01,GT,53,LOU,56,-12.0,138.0
-2015,2016-03-01,WAKE,71,DUKE,79,-16.0,154.5
-2015,2016-03-01,BAY,71,OKLA,73,-7.5,149.0
-2015,2016-03-01,PUR,81,NEB,62,4.0,139.0
-2015,2016-03-01,GMU,52,GW,74,-12.0,139.0
-2015,2016-03-01,TXST,69,UTA,75,-9.5,138.5
-2015,2016-03-01,ARST,80,UALR,89,-14.5,139.0
-2015,2016-03-01,USU,78,AFA,65,4.0,138.5
-2015,2016-03-01,IND,81,IOWA,78,-4.5,152.0
-2015,2016-03-01,GTWN,87,MARQ,88,-3.5,145.0
-2015,2016-03-01,TAMU,81,AUB,63,11.5,144.5
-2015,2016-03-01,MIZ,71,LSU,80,-13.5,155.5
-2015,2016-03-01,SDSU,83,UNM,56,1.0,134.0
-2015,2016-03-01,KENN,64,FGCU,74,-7.0,143.0
-2015,2016-03-01,LIP,92,JAC,89,-1.5,159.5
-2015,2016-03-01,UPST,69,UNF,92,-14.0,157.5
-2015,2016-03-01,STET,82,NJIT,67,-10.5,155.0
-2015,2016-03-01,LAF,70,NAVY,78,-10.5,135.5
-2015,2016-03-01,HC,72,LOYM,67,-5.0,132.0
-2015,2016-03-02,FOR,78,DUQ,69,-4.5,149.5
-2015,2016-03-02,TTU,68,WVU,90,-10.5,145.0
-2015,2016-03-02,MIA,68,ND,50,-4.0,143.5
-2015,2016-03-02,PITT,61,VT,65,5.0,144.0
-2015,2016-03-02,MSU,97,RUTG,66,24.5,148.5
-2015,2016-03-02,SLU,68,LAS,76,-1.5,131.0
-2015,2016-03-02,TULN,65,UCF,73,-5.0,136.5
-2015,2016-03-02,DAV,60,VCU,70,-11.0,157.5
-2015,2016-03-02,MSST,78,MISS,86,-4.5,148.0
-2015,2016-03-02,JOES,90,SBON,98,3.5,151.5
-2015,2016-03-02,TCU,54,KSU,79,-11.0,134.0
-2015,2016-03-02,HALL,78,BUT,85,-5.5,148.0
-2015,2016-03-02,BC,72,NCST,73,-15.0,135.5
-2015,2016-03-02,WIS,62,MINN,49,10.0,131.5
-2015,2016-03-02,ECU,52,USF,39,1.0,136.0
-2015,2016-03-02,CREI,66,PROV,70,-3.5,145.5
-2015,2016-03-02,ARK,62,ALA,61,-1.5,140.0
-2015,2016-03-02,ORE,76,UCLA,68,3.0,154.5
-2015,2016-03-02,SJSU,78,WYO,81,-10.0,137.5
-2015,2016-03-02,NEV,57,BSU,76,-12.0,146.0
-2015,2016-03-02,LBSU,75,CSF,73,5.5,149.5
-2015,2016-03-02,ORST,70,USC,81,-6.0,149.0
-2015,2016-03-02,WSU,91,WASH,99,-12.0,156.5
-2015,2016-03-02,CSU,73,FRES,87,-4.5,148.0
-2015,2016-03-02,PEAY,92,TNTC,72,-4.0,154.5
-2015,2016-03-02,EIU,62,MURR,78,-6.5,137.5
-2015,2016-03-02,BALT,76,STON,86,-23.5,141.5
-2015,2016-03-02,HART,68,ALBY,59,-18.5,148.0
-2015,2016-03-02,MAINE,82,UVM,99,-18.0,161.0
-2015,2016-03-02,BING,51,UNH,56,-10.0,126.0
-2015,2016-03-02,RMU,50,WAG,59,-10.0,131.5
-2015,2016-03-02,SFU,72,FDU,74,-6.0,154.0
-2015,2016-03-02,LI,84,SHU,76,-2.0,160.0
-2015,2016-03-02,MSM,60,SFNY,51,-3.5,126.0
-2015,2016-03-03,LT,97,MRSH,94,-5.5,171.0
-2015,2016-03-03,ILL,55,MD,81,-15.5,143.0
-2015,2016-03-03,UMASS,50,URI,68,-10.0,140.0
-2015,2016-03-03,UGA,74,SC,72,-7.0,137.5
-2015,2016-03-03,MTSU,76,FAU,59,7.5,137.5
-2015,2016-03-03,MEM,62,TEM,72,-3.5,146.0
-2015,2016-03-03,UAB,77,FIU,60,5.5,142.0
-2015,2016-03-03,UALR,63,APP,69,9.5,139.0
-2015,2016-03-03,GASO,76,ULM,83,-8.5,142.0
-2015,2016-03-03,CHAR,88,RICE,75,1.5,163.5
-2015,2016-03-03,ODU,76,UNT,70,7.0,134.0
-2015,2016-03-03,USA,79,UTA,92,-14.5,149.0
-2015,2016-03-03,GAST,72,ULL,69,-8.5,134.5
-2015,2016-03-03,TROY,57,TXST,78,-6.5,132.5
-2015,2016-03-03,NW,71,PSU,61,2.5,131.0
-2015,2016-03-03,CONN,54,SMU,80,-4.5,132.5
-2015,2016-03-03,CAL,61,ARIZ,64,-7.0,147.0
-2015,2016-03-03,CIN,56,HOU,69,2.5,135.5
-2015,2016-03-03,USM,60,WKU,75,-12.0,132.5
-2015,2016-03-03,UCRV,55,UCSB,81,-10.0,133.0
-2015,2016-03-03,HAW,67,UCD,65,8.5,132.5
-2015,2016-03-03,STAN,64,ASU,74,-2.5,141.5
-2015,2016-03-03,CP,62,UCI,72,-8.5,141.5
-2015,2016-03-03,BRAD,66,LOYI,74,-10.5,117.5
-2015,2016-03-03,DRKE,67,MOST,69,-2.5,137.0
-2015,2016-03-03,IDST,75,EWU,71,-11.0,162.5
-2015,2016-03-03,UNCO,63,MTST,81,-7.0,158.0
-2015,2016-03-03,UND,46,MONT,71,-7.5,142.5
-2015,2016-03-03,WEB,58,IDHO,62,3.5,130.5
-2015,2016-03-03,NAU,81,PRST,89,-11.5,156.0
-2015,2016-03-03,SUU,63,SAC,69,-9.5,149.5
-2015,2016-03-03,QUIN,57,RID,60,-5.5,130.5
-2015,2016-03-03,NIAG,97,CAN,102,-8.5,138.5
-2015,2016-03-03,MRST,63,MAN,81,-3.0,145.0
-2015,2016-03-03,PEAY,74,TNST,72,-7.0,144.0
-2015,2016-03-03,MURR,66,MORE,75,-2.5,130.5
-2015,2016-03-03,CHSU,69,LONG,75,-3.5,148.5
-2015,2016-03-03,PRE,65,RAD,64,-6.5,136.0
-2015,2016-03-03,CAMP,69,WEBB,79,-1.5,145.5
-2015,2016-03-03,STET,96,LIP,75,-6.5,163.0
-2015,2016-03-03,FGCU,89,UNF,56,-6.5,154.0
-2015,2016-03-03,HC,77,BUCK,72,-13.5,141.5
-2015,2016-03-03,COLG,72,ARMY,79,-7.0,147.5
-2015,2016-03-03,AMER,69,BU,64,-8.0,127.5
-2015,2016-03-03,NAVY,63,LEH,65,-6.0,134.0
-2015,2016-03-04,BRWN,63,CLMB,66,-16.0,149.5
-2015,2016-03-04,PENN,64,DART,72,-4.5,136.0
-2015,2016-03-04,OHIO,67,MIOH,65,2.5,140.5
-2015,2016-03-04,KENT,60,AKR,74,-8.0,149.0
-2015,2016-03-04,BALL,69,NIU,80,1.0,136.0
-2015,2016-03-04,BUFF,87,BGSU,83,2.5,147.0
-2015,2016-03-04,WMU,91,CMU,82,-7.5,146.5
-2015,2016-03-04,EMU,79,TOL,75,-9.0,159.0
-2015,2016-03-04,PRIN,71,HARV,73,8.0,135.5
-2015,2016-03-04,RID,48,MONM,59,-9.0,139.5
-2015,2016-03-04,MOST,56,EVAN,66,-14.0,139.5
-2015,2016-03-04,CIT,69,MER,71,-9.5,169.5
-2015,2016-03-04,PEAY,97,BEL,96,-10.0,160.0
-2015,2016-03-04,LONG,78,HP,89,-5.5,147.0
-2015,2016-03-04,LOYI,58,WICH,66,-18.5,128.5
-2015,2016-03-04,LIB,49,UNCA,80,-8.5,133.0
-2015,2016-03-04,SIU,60,UNI,66,-6.0,132.0
-2015,2016-03-04,VMI,85,SAM,92,-6.0,147.5
-2015,2016-03-04,YALE,88,COR,64,13.5,143.5
-2015,2016-03-04,DREX,57,ELON,56,-4.5,138.0
-2015,2016-03-04,PRE,53,WIN,67,-13.0,151.5
-2015,2016-03-04,WEBB,69,CCAR,65,-5.0,139.5
-2015,2016-03-04,DEL,63,COFC,67,-7.0,126.5
-2015,2016-03-04,TEX,62,OKST,50,5.0,128.5
-2015,2016-03-04,USD,61,LMU,64,-4.0,136.0
-2015,2016-03-04,INST,65,ILST,57,-3.5,136.0
-2015,2016-03-04,CAN,55,IONA,73,-12.5,158.5
-2015,2016-03-04,MORE,70,UTM,83,5.0,134.5
-2015,2016-03-05,PROV,90,SJU,76,9.0,145.0
-2015,2016-03-05,OKLA,75,TCU,67,13.0,144.5
-2015,2016-03-05,MINN,52,RUTG,75,-2.0,141.0
-2015,2016-03-05,UNCA,80,HP,69,6.0,143.0
-2015,2016-03-05,LSU,77,UK,94,-13.5,155.0
-2015,2016-03-05,ODU,74,RICE,67,5.5,140.5
-2015,2016-03-05,WVU,69,BAY,58,-3.5,148.5
-2015,2016-03-05,SYR,73,FSU,78,-4.0,143.0
-2015,2016-03-05,PITT,59,GT,63,1.0,140.5
-2015,2016-03-05,URI,61,FOR,64,2.5,131.5
-2015,2016-03-05,MSM,75,FDU,80,-1.5,145.0
-2015,2016-03-05,OSU,76,MSU,91,-14.5,140.0
-2015,2016-03-05,GTWN,71,NOVA,84,-14.0,143.0
-2015,2016-03-05,VAN,67,TAMU,76,-3.5,140.0
-2015,2016-03-05,MISS,83,TENN,60,3.0,149.5
-2015,2016-03-05,NCST,75,ND,89,-9.0,148.0
-2015,2016-03-05,CLEM,66,BC,50,8.0,126.5
-2015,2016-03-05,HALL,80,DEP,66,7.0,142.5
-2015,2016-03-05,UAB,73,FAU,70,11.0,143.5
-2015,2016-03-05,CLEV,53,GB,65,-12.0,142.5
-2015,2016-03-05,SAM,54,CHAT,59,-10.5,141.0
-2015,2016-03-05,DREX,67,HOF,80,-10.5,136.0
-2015,2016-03-05,AUB,66,MSST,79,-12.0,147.0
-2015,2016-03-05,MARQ,74,BUT,95,-10.0,151.0
-2015,2016-03-05,CREI,93,XAV,98,-9.5,155.0
-2015,2016-03-05,WMRY,79,JMU,64,3.0,144.5
-2015,2016-03-05,NKU,69,MILW,86,-9.0,143.5
-2015,2016-03-05,WCU,88,WOF,83,-3.0,139.5
-2015,2016-03-05,GAST,78,ULM,91,-5.5,127.0
-2015,2016-03-05,KSU,71,TTU,80,-5.0,134.0
-2015,2016-03-05,WEBB,69,WIN,82,-4.5,155.5
-2015,2016-03-05,ARST,73,APP,80,-2.5,155.5
-2015,2016-03-05,GW,80,DAV,87,-1.0,152.0
-2015,2016-03-05,UNI,57,WICH,52,-9.5,123.0
-2015,2016-03-05,UNCO,78,MONT,72,-14.0,148.5
-2015,2016-03-05,AFA,73,CSU,87,-10.0,145.0
-2015,2016-03-05,UTSA,74,UTEP,81,-12.5,162.5
-2015,2016-03-05,ALA,63,UGA,70,-5.5,127.5
-2015,2016-03-05,ISU,78,KU,85,-11.0,157.0
-2015,2016-03-05,MIA,62,VT,77,6.0,140.0
-2015,2016-03-05,DUQ,78,JOES,70,-12.0,159.5
-2015,2016-03-05,STAN,62,ARIZ,94,-14.0,140.5
-2015,2016-03-05,ORE,76,USC,66,2.5,159.0
-2015,2016-03-05,SCU,60,BYU,72,-15.5,153.5
-2015,2016-03-05,LIU,65,WAG,81,-8.5,145.0
-2015,2016-03-05,UND,82,MTST,89,-2.5,150.5
-2015,2016-03-05,BSU,63,SJSU,68,10.5,144.0
-2015,2016-03-05,SC,76,ARK,61,-4.5,149.0
-2015,2016-03-05,USF,74,TLSA,84,-17.0,135.0
-2015,2016-03-05,UCI,76,UCRV,66,7.5,134.0
-2015,2016-03-05,UIC,43,WRST,74,-12.0,134.0
-2015,2016-03-05,WEB,79,EWU,77,-1.0,152.0
-2015,2016-03-05,USA,57,TXST,68,-6.5,131.0
-2015,2016-03-05,BRWN,71,COR,75,-4.0,155.0
-2015,2016-03-05,RICH,73,GMU,83,7.0,145.0
-2015,2016-03-05,MTSU,61,FIU,58,3.5,135.5
-2015,2016-03-05,SF,86,PEPP,90,-4.0,147.5
-2015,2016-03-05,PEAY,83,UTM,73,-3.5,146.0
-2015,2016-03-05,COFC,64,UNCW,66,-4.5,128.5
-2015,2016-03-05,MER,65,ETSU,81,-4.0,140.0
-2015,2016-03-05,INST,42,EVAN,68,-7.0,137.0
-2015,2016-03-05,UNC,76,DUKE,72,2.5,160.5
-2015,2016-03-05,ORST,86,UCLA,82,-6.5,147.0
-2015,2016-03-05,HAW,72,LBSU,74,-2.5,147.5
-2015,2016-03-05,CP,50,UCSB,69,-6.5,140.0
-2015,2016-03-05,PRIN,84,DART,65,9.5,143.0
-2015,2016-03-05,USM,106,MRSH,108,-16.5,151.5
-2015,2016-03-05,YALE,71,CLMB,55,2.0,139.0
-2015,2016-03-05,PENN,56,HARV,74,-6.0,131.0
-2015,2016-03-05,SDAK,70,IPFW,86,-4.5,160.5
-2015,2016-03-05,MAN,76,SIE,89,-8.5,143.5
-2015,2016-03-05,FLA,82,MIZ,72,8.0,144.0
-2015,2016-03-05,YSU,79,DET,92,-13.0,178.5
-2015,2016-03-05,SBON,76,SLU,67,6.5,143.0
-2015,2016-03-05,IOWA,71,MICH,61,-1.5,145.5
-2015,2016-03-05,VCU,67,DAY,68,-2.0,140.0
-2015,2016-03-05,LAS,52,UMASS,69,-8.0,142.0
-2015,2016-03-05,CHAR,77,UNT,80,6.5,156.5
-2015,2016-03-05,CAL,68,ASU,65,5.0,143.0
-2015,2016-03-05,LT,90,WKU,96,-2.0,148.0
-2015,2016-03-05,TROY,55,UTA,90,-14.0,148.5
-2015,2016-03-05,GASO,78,ULL,87,-12.0,153.5
-2015,2016-03-05,LOU,46,UVA,68,-5.5,124.0
-2015,2016-03-05,NE,71,TOWS,60,2.0,133.0
-2015,2016-03-05,UNCG,64,FUR,80,-1.0,138.5
-2015,2016-03-05,FRES,86,USU,85,-3.5,145.5
-2015,2016-03-05,COLO,55,UTAH,57,-12.0,139.0
-2015,2016-03-05,ORU,70,SDKS,73,-10.0,150.0
-2015,2016-03-05,FAIR,64,SPU,55,-1.5,137.0
-2015,2016-03-05,UNLV,56,SDSU,92,-9.5,133.0
-2015,2016-03-05,UNM,71,NEV,66,-2.0,149.5
-2015,2016-03-05,IDST,70,IDHO,80,-6.5,137.0
-2015,2016-03-05,LMU,48,SMC,60,-15.0,135.0
-2015,2016-03-05,NAU,51,SAC,64,-8.5,148.5
-2015,2016-03-05,SUU,86,PRST,88,-10.5,157.5
-2015,2016-03-05,UCD,87,CSN,83,-6.0,133.0
-2015,2016-03-05,PORT,67,GONZ,92,-15.5,154.5
-2015,2016-03-06,SMU,54,CIN,61,-1.5,131.5
-2015,2016-03-06,ILL,79,PSU,86,-4.0,135.0
-2015,2016-03-06,HC,60,ARMY,38,-9.0,138.0
-2015,2016-03-06,UCF,46,CONN,67,-17.0,132.5
-2015,2016-03-06,TEM,64,TULN,56,6.0,133.0
-2015,2016-03-06,NEB,54,NW,65,-4.5,134.0
-2015,2016-03-06,AMER,62,LEH,78,-11.5,124.5
-2015,2016-03-06,MEM,83,ECU,53,5.0,149.0
-2015,2016-03-06,MD,62,IND,80,-5.5,148.0
-2015,2016-03-06,NDSU,60,IUPU,45,4.5,131.0
-2015,2016-03-06,STET,78,FGCU,80,-9.0,147.0
-2015,2016-03-06,WIS,80,PUR,91,-6.0,129.5
-2015,2016-03-06,DEN,78,OMA,70,-4.5,146.0
-2015,2016-03-06,MILW,61,GB,70,3.0,159.5
-2015,2016-03-06,DET,72,WRST,82,-2.0,149.0
-2015,2016-03-06,UNI,56,EVAN,54,1.0,123.5
-2015,2016-03-06,WMRY,67,HOF,70,-1.5,155.5
-2015,2016-03-06,NE,70,UNCW,73,-3.5,139.0
-2015,2016-03-06,WCU,69,CHAT,73,-8.0,132.5
-2015,2016-03-06,FUR,76,ETSU,84,-1.5,139.0
-2015,2016-03-06,FAIR,63,MONM,76,-9.5,155.5
-2015,2016-03-06,SIE,70,IONA,81,-2.5,156.0
-2015,2016-03-06,UNCA,77,WIN,68,1.5,153.0
-2015,2016-03-07,GB,99,VALP,92,-9.5,143.5
-2015,2016-03-07,WRST,59,OAK,55,-6.5,153.5
-2015,2016-03-07,MIOH,49,BALL,47,-6.5,126.0
-2015,2016-03-07,BGSU,70,KENT,69,-7.5,142.5
-2015,2016-03-07,TOL,60,EMU,69,2.0,156.0
-2015,2016-03-07,WMU,50,NIU,56,-4.0,140.0
-2015,2016-03-07,UNCW,80,HOF,73,-2.0,148.0
-2015,2016-03-07,PEPP,66,SMC,81,-7.5,131.5
-2015,2016-03-07,BYU,84,GONZ,88,-4.0,151.0
-2015,2016-03-07,NDSU,69,IPFW,68,-3.5,136.0
-2015,2016-03-07,DEN,53,SDKS,54,-10.5,129.0
-2015,2016-03-07,ETSU,67,CHAT,73,-5.5,140.0
-2015,2016-03-07,IONA,79,MONM,76,0.0,155.5
-2015,2016-03-07,DSU,58,SAV,63,-7.0,118.0
-2015,2016-03-07,COPP,98,NCAT,91,-1.5,141.5
-2015,2016-03-07,HART,64,STON,80,-18.0,141.5
-2015,2016-03-07,UNH,56,UVM,63,-8.5,143.5
-2015,2016-03-08,NAU,52,EWU,74,-12.5,154.5
-2015,2016-03-08,WAKE,72,NCST,75,-3.0,150.0
-2015,2016-03-08,BC,66,FSU,88,-11.5,134.5
-2015,2016-03-08,UNCO,67,PRST,74,-5.0,161.5
-2015,2016-03-08,GRAM,73,MVSU,87,1.5,129.0
-2015,2016-03-08,MORG,65,UMES,58,-2.5,138.5
-2015,2016-03-08,UTSA,58,FAU,82,-3.0,147.5
-2015,2016-03-08,SUU,80,UND,85,-9.0,147.0
-2015,2016-03-08,HOW,66,NCCU,68,-5.0,135.0
-2015,2016-03-08,FDU,87,WAG,79,-9.0,141.0
-2015,2016-03-08,GB,78,WRST,69,-1.5,142.0
-2015,2016-03-08,PENN,71,PRIN,72,-15.5,145.0
-2015,2016-03-08,SAC,79,MTST,75,-2.5,145.0
-2015,2016-03-08,NDSU,59,SDKS,67,-5.5,129.0
-2015,2016-03-08,GONZ,85,SMC,75,2.5,134.0
-2015,2016-03-08,ARPB,53,AAMU,61,-4.5,130.0
-2015,2016-03-09,SYR,71,PITT,72,-4.0,133.0
-2015,2016-03-09,NCST,89,DUKE,92,-8.0,148.0
-2015,2016-03-09,GT,88,CLEM,85,-2.5,134.0
-2015,2016-03-09,FSU,85,VT,96,5.0,147.0
-2015,2016-03-09,UNT,76,WKU,84,-8.0,146.5
-2015,2016-03-09,FAU,46,ODU,72,-10.5,125.5
-2015,2016-03-09,RICE,69,CHAR,79,-6.0,160.0
-2015,2016-03-09,FIU,77,UTEP,85,-2.5,144.5
-2015,2016-03-09,OKST,71,KSU,75,-5.0,127.0
-2015,2016-03-09,TCU,67,TTU,62,-7.5,135.0
-2015,2016-03-09,STAN,68,WASH,91,-3.0,150.0
-2015,2016-03-09,WSU,56,COLO,80,-9.5,139.5
-2015,2016-03-09,UCLA,71,USC,95,-2.0,156.0
-2015,2016-03-09,ASU,66,ORST,75,-4.0,140.5
-2015,2016-03-09,USU,88,WYO,70,2.5,141.0
-2015,2016-03-09,AFA,102,UNLV,108,-10.0,144.0
-2015,2016-03-09,SJSU,61,CSU,80,-7.5,149.5
-2015,2016-03-09,MINN,52,ILL,85,-11.0,135.5
-2015,2016-03-09,RUTG,72,NEB,89,-14.5,141.0
-2015,2016-03-09,SLU,83,GMU,78,-4.0,134.5
-2015,2016-03-09,LAS,88,DUQ,73,-7.5,144.0
-2015,2016-03-09,DEP,53,GTWN,70,-9.0,141.0
-2015,2016-03-09,SJU,93,MARQ,101,-8.5,146.5
-2015,2016-03-09,AUB,59,TENN,97,-2.5,145.0
-2015,2016-03-09,HC,59,LEH,56,-9.5,129.5
-2015,2016-03-09,MORG,81,HAMP,83,-5.5,142.5
-2015,2016-03-09,NCCU,47,NORF,66,-6.0,145.5
-2015,2016-03-09,UNO,74,SELA,84,-2.0,147.0
-2015,2016-03-09,NICH,94,MCNS,90,1.5,139.5
-2015,2016-03-09,MVSU,64,ALCN,61,-5.5,138.5
-2015,2016-03-09,AAMU,69,TXSO,77,-10.0,139.5
-2015,2016-03-10,NW,70,MICH,72,-2.5,134.0
-2015,2016-03-10,ILL,68,IOWA,66,-10.5,143.5
-2015,2016-03-10,PSU,75,OSU,79,-6.0,128.5
-2015,2016-03-10,NEB,70,WIS,58,-6.0,129.0
-2015,2016-03-10,PITT,71,UNC,88,-7.5,150.0
-2015,2016-03-10,DUKE,79,ND,84,2.0,156.5
-2015,2016-03-10,GT,52,UVA,72,-10.0,127.5
-2015,2016-03-10,VT,82,MIA,88,-9.5,140.0
-2015,2016-03-10,GTWN,67,NOVA,81,-11.5,140.5
-2015,2016-03-10,BUT,60,PROV,74,3.5,147.0
-2015,2016-03-10,MARQ,72,XAV,90,-10.5,154.5
-2015,2016-03-10,CREI,73,HALL,81,-1.0,146.5
-2015,2016-03-10,RICH,70,FOR,55,3.5,141.0
-2015,2016-03-10,SLU,65,GW,73,-14.0,136.0
-2015,2016-03-10,UMASS,67,URI,62,-7.0,135.0
-2015,2016-03-10,LAS,63,DAV,78,-11.0,147.0
-2015,2016-03-10,BAY,75,TEX,61,2.5,138.0
-2015,2016-03-10,KSU,63,KU,85,-12.5,140.0
-2015,2016-03-10,TCU,66,WVU,86,-16.5,141.0
-2015,2016-03-10,ISU,76,OKLA,79,-4.0,159.0
-2015,2016-03-10,ARK,61,FLA,68,-2.5,147.0
-2015,2016-03-10,TENN,67,VAN,65,-12.0,146.0
-2015,2016-03-10,ALA,81,MISS,73,-3.0,135.0
-2015,2016-03-10,MSST,69,UGA,79,-2.0,138.0
-2015,2016-03-10,WKU,88,UAB,77,-7.0,144.0
-2015,2016-03-10,ODU,68,LT,52,3.0,132.0
-2015,2016-03-10,CHAR,61,MTSU,79,-3.5,145.0
-2015,2016-03-10,UTEP,85,MRSH,87,-6.0,176.5
-2015,2016-03-10,EMU,63,AKR,65,-5.0,153.0
-2015,2016-03-10,BGSU,62,CMU,59,-6.0,146.0
-2015,2016-03-10,NIU,62,OHIO,79,-2.5,145.0
-2015,2016-03-10,MIOH,81,BUFF,94,-6.0,136.5
-2015,2016-03-10,WASH,77,ORE,83,-8.0,162.0
-2015,2016-03-10,COLO,78,ARIZ,82,-7.5,144.5
-2015,2016-03-10,USC,72,UTAH,80,-6.5,147.0
-2015,2016-03-10,ORST,68,CAL,76,-8.0,138.0
-2015,2016-03-10,USU,65,SDSU,71,-8.0,130.0
-2015,2016-03-10,NEV,64,UNM,62,-4.0,146.0
-2015,2016-03-10,UNLV,82,FRES,95,-3.0,148.0
-2015,2016-03-10,CSU,88,BSU,81,-7.0,152.5
-2015,2016-03-10,UCD,61,UCSB,87,-8.0,123.0
-2015,2016-03-10,CSF,44,HAW,75,-10.5,146.5
-2015,2016-03-10,CP,64,UCI,84,-6.0,138.5
-2015,2016-03-10,UCRV,74,LBSU,82,-8.0,136.5
-2015,2016-03-10,USF,71,ECU,66,-2.5,128.0
-2015,2016-03-10,TULN,65,UCF,63,-3.5,134.0
-2015,2016-03-10,USA,67,GASO,61,-4.0,144.0
-2015,2016-03-10,TXST,63,GAST,61,-2.0,121.0
-2015,2016-03-10,PRST,74,WEB,78,-8.5,147.5
-2015,2016-03-10,UND,83,IDST,49,2.5,147.5
-2015,2016-03-10,SAC,53,MONT,70,-8.5,138.5
-2015,2016-03-10,EWU,73,IDHO,77,1.5,142.5
-2015,2016-03-10,UMKC,80,UVU,78,2.0,154.5
-2015,2016-03-10,CHS,57,CSB,79,-18.5,134.0
-2015,2016-03-10,TRGV,52,SEA,75,-6.5,132.0
-2015,2016-03-10,COPP,80,SCST,90,-5.5,143.0
-2015,2016-03-10,SAV,57,COOK,50,-1.0,121.5
-2015,2016-03-10,SELA,68,HBU,73,-1.5,152.5
-2015,2016-03-10,NICH,59,SHU,60,-10.0,136.0
-2015,2016-03-10,PV,51,JKST,69,-5.5,129.0
-2015,2016-03-10,ALST,63,SOU,83,-2.0,143.0
-2015,2016-03-11,UND,78,WEB,83,-5.5,139.5
-2015,2016-03-11,TXST,63,UTA,72,-9.0,136.0
-2015,2016-03-11,SHSU,76,AMCC,79,-3.5,136.0
-2015,2016-03-11,NEB,86,MD,97,-8.0,137.0
-2015,2016-03-11,UMKC,64,NMSU,78,-10.5,131.0
-2015,2016-03-11,NEV,55,SDSU,67,-8.0,128.5
-2015,2016-03-11,ARIZ,89,ORE,95,1.0,152.5
-2015,2016-03-11,DAV,90,SBON,86,-1.0,161.0
-2015,2016-03-11,BUFF,88,OHIO,74,-1.5,159.5
-2015,2016-03-11,HALL,87,XAV,83,-5.0,153.0
-2015,2016-03-11,UGA,65,SC,64,-1.5,138.5
-2015,2016-03-11,SOU,81,TXSO,73,-5.5,145.5
-2015,2016-03-11,UCSB,76,HAW,88,-3.5,137.5
-2015,2016-03-11,MIA,68,UVA,73,-4.0,126.0
-2015,2016-03-11,MEM,89,TLSA,67,-5.0,149.0
-2015,2016-03-11,OKLA,67,WVU,69,-1.0,147.5
-2015,2016-03-11,MICH,72,IND,69,-7.5,147.5
-2015,2016-03-11,RICH,54,DAY,69,-5.0,140.5
-2015,2016-03-11,USF,62,TEM,79,-10.5,127.5
-2015,2016-03-11,FLA,66,TAMU,72,-5.5,137.0
-2015,2016-03-11,ILL,58,PUR,89,-11.5,140.0
-2015,2016-03-11,CONN,104,CIN,97,-2.0,124.0
-2015,2016-03-11,GW,80,JOES,86,-2.0,143.5
-2015,2016-03-11,MVSU,68,JKST,74,-9.5,133.5
-2015,2016-03-11,TENN,75,LSU,84,-5.0,152.5
-2015,2016-03-11,WKU,77,ODU,89,-4.0,128.5
-2015,2016-03-11,HBU,68,SFA,104,-18.5,146.0
-2015,2016-03-11,USA,68,ULL,90,-13.0,147.0
-2015,2016-03-11,SAV,55,HAMP,89,-6.5,128.0
-2015,2016-03-11,OSU,54,MSU,81,-13.5,143.5
-2015,2016-03-11,PROV,68,NOVA,76,-8.5,138.5
-2015,2016-03-11,BGSU,66,AKR,80,-8.5,143.5
-2015,2016-03-11,UMASS,70,VCU,85,-13.5,142.5
-2015,2016-03-11,MRSH,90,MTSU,99,-1.5,160.5
-2015,2016-03-11,BAY,66,KU,70,-7.5,145.0
-2015,2016-03-11,ND,47,UNC,78,-7.5,159.0
-2015,2016-03-11,ALA,59,UK,85,-13.5,137.0
-2015,2016-03-11,TULN,72,HOU,69,-12.5,137.5
-2015,2016-03-11,SCST,67,NORF,65,-4.5,148.5
-2015,2016-03-11,IDHO,72,MONT,81,-3.5,127.0
-2015,2016-03-11,SEA,47,CSB,72,-11.5,129.0
-2015,2016-03-11,CSU,56,FRES,64,-5.5,151.0
-2015,2016-03-11,CAL,78,UTAH,82,-2.0,137.5
-2015,2016-03-11,LBSU,77,UCI,72,-4.0,139.5
-2015,2016-03-12,UVM,74,STON,80,-6.0,140.0
-2015,2016-03-12,MICH,59,PUR,76,-6.5,142.0
-2015,2016-03-12,LSU,38,TAMU,71,-7.0,146.0
-2015,2016-03-12,SCST,69,HAMP,81,-3.0,144.5
-2015,2016-03-12,JOES,82,DAY,79,-2.5,142.0
-2015,2016-03-12,ULL,65,UALR,72,-3.0,138.0
-2015,2016-03-12,ODU,53,MTSU,55,2.5,125.0
-2015,2016-03-12,CONN,77,TEM,62,2.0,127.5
-2015,2016-03-12,MD,61,MSU,64,-6.5,146.0
-2015,2016-03-12,UGA,80,UK,93,-10.5,138.0
-2015,2016-03-12,DAV,54,VCU,76,-8.0,152.0
-2015,2016-03-12,UTA,71,ULM,82,1.5,147.0
-2015,2016-03-12,HALL,69,NOVA,67,-6.5,139.0
-2015,2016-03-12,TULN,54,MEM,74,-11.0,142.5
-2015,2016-03-12,WVU,71,KU,81,-4.0,143.5
-2015,2016-03-12,FRES,68,SDSU,63,-4.5,127.5
-2015,2016-03-12,SOU,54,JKST,53,2.0,133.0
-2015,2016-03-12,BUFF,64,AKR,61,-4.5,150.5
-2015,2016-03-12,MONT,59,WEB,62,1.0,132.5
-2015,2016-03-12,UVA,57,UNC,61,-2.5,138.5
-2015,2016-03-12,AMCC,60,SFA,82,-10.0,138.0
-2015,2016-03-12,UTAH,57,ORE,88,-1.5,142.0
-2015,2016-03-12,CSB,57,NMSU,54,0.0,129.0
-2015,2016-03-12,LBSU,60,HAW,64,-4.0,144.5
-2015,2016-03-13,UK,82,TAMU,77,4.0,143.0
-2015,2016-03-13,ULM,50,UALR,70,-2.5,128.5
-2015,2016-03-13,JOES,87,VCU,74,-4.0,147.5
-2015,2016-03-13,PUR,62,MSU,66,-5.0,142.5
-2015,2016-03-13,MEM,58,CONN,72,-5.5,138.0
-2015,2016-03-14,SCST,74,GCU,78,-13.0,151.5
-2015,2016-03-14,JKST,81,SHSU,77,-6.5,139.5
-2015,2016-03-15,AKR,63,OSU,72,-4.5,147.0
-2015,2016-03-15,MORE,84,SIE,80,-6.0,149.5
-2015,2016-03-15,BALL,78,TNST,73,-4.0,139.5
-2015,2016-03-15,FDU,65,FGCU,96,-5.5,153.5
-2015,2016-03-15,DAV,74,FSU,84,-9.0,168.5
-2015,2016-03-15,HP,66,SC,88,-16.5,145.5
-2015,2016-03-15,MER,57,CCAR,65,-6.0,142.0
-2015,2016-03-15,ULM,57,FUR,58,1.5,142.0
-2015,2016-03-15,ALA,54,CREI,72,-8.0,144.5
-2015,2016-03-15,LBSU,102,WASH,107,-9.0,167.5
-2015,2016-03-15,FLA,97,UNF,68,7.5,162.0
-2015,2016-03-15,WICH,70,VAN,50,4.0,133.5
-2015,2016-03-15,TXSO,73,VALP,84,-15.0,143.5
-2015,2016-03-15,IPFW,55,SDSU,79,-9.5,143.5
-2015,2016-03-15,NMSU,56,SMC,58,-10.5,131.5
-2015,2016-03-16,OMA,112,DUQ,120,-5.0,180.5
-2015,2016-03-16,BUCK,80,MONM,90,-8.5,161.5
-2015,2016-03-16,ARMY,65,NJIT,79,-3.5,154.0
-2015,2016-03-16,PRIN,81,VT,86,-4.0,153.5
-2015,2016-03-16,HOF,80,GW,82,-6.0,152.5
-2015,2016-03-16,UCI,89,UND,86,6.5,143.0
-2015,2016-03-16,AMCC,72,ULL,96,-9.0,154.5
-2015,2016-03-16,HOU,62,GT,81,-3.5,152.5
-2015,2016-03-16,HC,59,SOU,55,-2.0,129.0
-2015,2016-03-16,WAG,79,SBON,75,-9.0,146.0
-2015,2016-03-16,BEL,84,UGA,93,-7.5,158.0
-2015,2016-03-16,ALBY,90,OHIO,94,-3.0,150.0
-2015,2016-03-16,HBU,65,UNCG,69,-8.0,153.5
-2015,2016-03-16,WCU,74,UVM,79,-6.0,147.0
-2015,2016-03-16,BU,69,FOR,66,-8.0,147.5
-2015,2016-03-16,UTM,76,CMU,73,-9.0,149.0
-2015,2016-03-16,UNH,77,FAIR,62,-5.0,150.5
-2015,2016-03-16,NORF,54,CLMB,86,-12.5,151.0
-2015,2016-03-16,UTA,75,SAV,59,12.5,138.0
-2015,2016-03-16,PEPP,72,EWU,79,2.0,160.5
-2015,2016-03-16,TLSA,62,MICH,67,-2.0,142.5
-2015,2016-03-16,UAB,79,BYU,97,-9.5,166.5
-2015,2016-03-16,MONT,75,NEV,79,-3.0,138.5
-2015,2016-03-16,IDHO,63,SEA,68,2.5,133.0
-2015,2016-03-17,WICH,65,ARIZ,55,0.0,137.0
-2015,2016-03-17,STON,57,UK,85,-13.0,143.5
-2015,2016-03-17,PROV,70,USC,69,2.5,149.5
-2015,2016-03-17,JKST,54,GCU,64,-10.5,143.5
-2015,2016-03-17,GONZ,68,HALL,52,2.0,146.0
-2015,2016-03-17,UNCW,85,DUKE,93,-10.0,154.0
-2015,2016-03-17,BUT,71,TTU,61,3.5,144.0
-2015,2016-03-17,CONN,74,COLO,67,3.5,131.5
-2015,2016-03-17,IONA,81,ISU,94,-7.0,165.5
-2015,2016-03-17,YALE,79,BAY,75,-5.5,136.5
-2015,2016-03-17,HAMP,45,UVA,81,-23.0,130.0
-2015,2016-03-17,PEAY,79,KU,105,-25.0,151.0
-2015,2016-03-17,UALR,85,PUR,83,-8.5,127.5
-2015,2016-03-17,BUFF,72,MIA,79,-14.0,148.0
-2015,2016-03-17,FSU,69,VALP,81,-4.5,148.0
-2015,2016-03-17,CHAT,74,IND,99,-11.0,148.0
-2015,2016-03-17,FGCU,67,UNC,83,-23.5,150.0
-2015,2016-03-17,FRES,69,UTAH,80,-8.5,138.5
-2015,2016-03-18,PITT,43,WIS,47,1.0,130.0
-2015,2016-03-18,SFA,70,WVU,56,-7.0,145.5
-2015,2016-03-18,GB,65,TAMU,92,-13.0,154.0
-2015,2016-03-18,SYR,70,DAY,51,1.0,129.5
-2015,2016-03-18,UNCA,56,NOVA,86,-17.5,142.5
-2015,2016-03-18,VCU,75,ORST,67,4.5,141.5
-2015,2016-03-18,HAW,77,CAL,66,-5.5,140.0
-2015,2016-03-18,MTSU,90,MSU,81,-16.5,141.5
-2015,2016-03-18,TEM,70,IOWA,72,-7.0,139.5
-2015,2016-03-18,CSB,68,OKLA,82,-15.0,140.0
-2015,2016-03-18,SDKS,74,MD,79,-9.0,142.0
-2015,2016-03-18,HC,52,ORE,91,-22.5,134.0
-2015,2016-03-18,WEB,53,XAV,71,-13.0,148.0
-2015,2016-03-18,VT,77,BYU,80,-8.0,163.5
-2015,2016-03-18,MICH,63,ND,70,-2.5,144.0
-2015,2016-03-18,UNI,75,TEX,72,-4.0,126.0
-2015,2016-03-18,CIN,76,JOES,78,3.0,136.5
-2015,2016-03-19,WAG,54,CREI,87,-14.5,145.0
-2015,2016-03-19,WICH,57,MIA,65,2.0,129.0
-2015,2016-03-19,ULL,80,FUR,72,2.0,150.0
-2015,2016-03-19,UNH,62,CCAR,71,-5.5,137.0
-2015,2016-03-19,YALE,64,DUKE,71,-7.0,146.5
-2015,2016-03-19,IND,73,UK,67,-3.5,156.0
-2015,2016-03-19,UALR,61,ISU,78,-6.0,144.5
-2015,2016-03-19,BUT,69,UVA,77,-8.0,130.5
-2015,2016-03-19,CONN,61,KU,73,-8.0,141.0
-2015,2016-03-19,GONZ,82,UTAH,59,1.5,139.0
-2015,2016-03-19,PROV,66,UNC,85,-11.0,152.5
-2015,2016-03-20,FLA,74,OSU,66,-1.0,139.5
-2015,2016-03-20,IOWA,68,NOVA,87,-6.5,146.5
-2015,2016-03-20,SFA,75,ND,76,0.0,140.5
-2015,2016-03-20,VCU,81,OKLA,85,-6.0,147.5
-2015,2016-03-20,UTM,80,BALL,83,-7.0,135.5
-2015,2016-03-20,MTSU,50,SYR,75,-6.0,128.5
-2015,2016-03-20,HAW,60,MD,73,-7.0,144.0
-2015,2016-03-20,UGA,65,SMC,77,-6.5,134.5
-2015,2016-03-20,UNI,88,TAMU,92,-7.0,128.5
-2015,2016-03-20,WIS,66,XAV,63,-4.0,136.0
-2015,2016-03-20,JOES,64,ORE,69,-6.5,159.0
-2015,2016-03-21,GW,87,MONM,71,-2.0,153.0
-2015,2016-03-21,DUQ,72,MORE,82,-5.5,157.0
-2015,2016-03-21,UNCG,67,OHIO,72,-8.5,156.0
-2015,2016-03-21,BU,72,NJIT,83,-4.5,150.0
-2015,2016-03-21,GT,83,SC,66,-4.0,146.5
-2015,2016-03-21,EWU,70,NEV,85,-5.0,159.0
-2015,2016-03-21,UVM,73,SEA,54,4.5,137.5
-2015,2016-03-21,WASH,78,SDSU,93,-5.5,149.0
-2015,2016-03-22,SMC,44,VALP,60,-3.5,136.0
-2015,2016-03-22,CREI,82,BYU,88,-4.5,166.0
-2015,2016-03-23,FLA,77,GW,82,-2.0,147.0
-2015,2016-03-23,MORE,77,OHIO,72,-3.0,151.5
-2015,2016-03-23,GCU,58,CCAR,60,-3.5,142.0
-2015,2016-03-23,BALL,67,CLMB,69,-7.0,138.5
-2015,2016-03-23,UCI,67,ULL,66,-3.5,153.0
-2015,2016-03-23,GT,56,SDSU,72,-5.0,135.0
-2015,2016-03-23,UVM,72,NEV,86,-4.5,146.0
-2015,2016-03-24,MIA,69,NOVA,92,-4.0,140.0
-2015,2016-03-24,UTA,60,NJIT,63,3.0,155.0
-2015,2016-03-24,TAMU,63,OKLA,77,-3.0,146.5
-2015,2016-03-24,MD,63,KU,79,-6.0,144.0
-2015,2016-03-24,DUKE,68,ORE,82,-3.0,157.0
-2015,2016-03-25,GONZ,60,SYR,63,4.0,135.5
-2015,2016-03-25,IND,86,UNC,101,-5.0,158.0
-2015,2016-03-25,ISU,71,UVA,84,-6.5,140.5
-2015,2016-03-25,WIS,56,ND,61,-1.5,132.0
-2015,2016-03-26,OKLA,80,ORE,68,-2.0,152.0
-2015,2016-03-26,NOVA,64,KU,59,-2.0,146.0
-2015,2016-03-27,NJIT,65,CLMB,80,-9.0,144.0
-2015,2016-03-27,SYR,68,UVA,62,-8.0,124.5
-2015,2016-03-27,ND,74,UNC,88,-9.5,154.5
-2015,2016-03-27,UCI,66,CCAR,47,5.0,133.5
-2015,2016-03-28,TOWS,72,OAK,90,-5.0,159.5
-2015,2016-03-28,ODU,75,TNTC,59,8.0,137.5
-2015,2016-03-28,NIU,63,UCSB,70,-5.0,137.0
-2015,2016-03-28,ETSU,88,LT,83,-3.0,157.0
-2015,2016-03-28,NEV,83,MORE,86,-5.5,144.0
-2015,2016-03-29,UCSB,49,ODU,64,-2.0,124.0
-2015,2016-03-29,GW,65,SDSU,46,-3.5,132.5
-2015,2016-03-29,BYU,70,VALP,72,-2.5,148.5
-2015,2016-03-29,UCI,67,CLMB,73,-1.5,140.0
-2015,2016-03-29,ETSU,81,OAK,104,-6.5,174.5
-2015,2016-03-30,MORE,68,NEV,77,-4.5,146.5
-2015,2016-03-30,ODU,68,OAK,67,-2.0,145.5
-2015,2016-03-31,GW,76,VALP,60,-2.5,134.0
-2015,2016-04-01,MORE,82,NEV,85,-3.0,145.5
-2015,2016-04-02,NOVA,95,OKLA,51,2.0,144.0
-2015,2016-04-02,SYR,66,UNC,83,-9.5,145.0
-2015,2016-04-04,NOVA,77,UNC,74,-2.0,149.5
diff --git a/alphapy/examples/Trading Model/A Trading Model.ipynb b/alphapy/examples/Trading Model/A Trading Model.ipynb
deleted file mode 100644
index ec98951..0000000
--- a/alphapy/examples/Trading Model/A Trading Model.ipynb
+++ /dev/null
@@ -1,328 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### This notebook analyzes the predictions of the trading model.
At different thresholds, how effective is the model at predicting
larger-than-average range days?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import pandas as pd"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'/Users/markconway/Projects/AlphaPy/alphapy/examples/Trading Model'"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "pwd"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "/Users/markconway/Projects/AlphaPy/alphapy/examples/Trading Model/output\n"
- ]
- }
- ],
- "source": [
- "cd output"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "predictions_20170425.csv rankings_20170425.csv\r\n",
- "probabilities_20170425.csv\r\n"
- ]
- }
- ],
- "source": [
- "ls"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This file contains the ranked predictions of the test set."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "ranking_frame = pd.read_csv('rankings_20170425.csv')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Index(['date', 'tag', 'open', 'high', 'low', 'close', 'volume', 'adjclose',\n",
- " 'cma_3', 'abovema_3',\n",
- " ...\n",
- " 'rmax_5', 'wr_5', 'rmax_6', 'wr_6', 'rmax_7', 'wr_7', 'rmax_10',\n",
- " 'wr_10', 'prediction', 'probability'],\n",
- " dtype='object', length=180)"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "ranking_frame.columns"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The probabilities are in descending order. Observe the greater number of True values at the top of the rankings versus the bottom."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0 True\n",
- "1 True\n",
- "2 True\n",
- "3 True\n",
- "4 False\n",
- "5 True\n",
- "6 True\n",
- "7 True\n",
- "8 True\n",
- "9 False\n",
- "10 True\n",
- "11 False\n",
- "12 False\n",
- "13 False\n",
- "14 False\n",
- "15 True\n",
- "16 True\n",
- "17 False\n",
- "18 True\n",
- "19 True\n",
- "Name: rrover, dtype: bool"
- ]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "ranking_frame.rrover.head(20)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "436 False\n",
- "437 False\n",
- "438 False\n",
- "439 False\n",
- "440 False\n",
- "441 False\n",
- "442 False\n",
- "443 False\n",
- "444 True\n",
- "445 False\n",
- "446 False\n",
- "447 True\n",
- "448 False\n",
- "449 False\n",
- "450 False\n",
- "451 False\n",
- "452 False\n",
- "453 False\n",
- "454 False\n",
- "455 False\n",
- "Name: rrover, dtype: bool"
- ]
- },
- "execution_count": 9,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "ranking_frame.rrover.tail(20)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Let's plot the True/False ratios for each probability decile. These ratios should roughly reflect the trend in the calibration plot."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "ranking_frame['bins'] = pd.qcut(ranking_frame.probability, 10, labels=False)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "grouped = ranking_frame.groupby('bins')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_ratio(series):\n",
- " ratio = series.value_counts()[1] / series.size\n",
- " return ratio"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 13,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEGCAYAAACevtWaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAETNJREFUeJzt3X2QXXV9x/H3hw0wovVhZIuaEBNrEHF8GF2DVTvqtGgQ\np1Frp0BHrC1mqKboH+2QqZb+4diBsTOtHdFMBqPjqM1U60MqUWhtkfqcoAiEGI2IJqgY0cKAjCHy\n7R/3YC+3m+zd7N2b3V/er5lMzvmdX+75ZB8+e/bce85NVSFJastxRzuAJGn0LHdJapDlLkkNstwl\nqUGWuyQ1yHKXpAZZ7pLUIMtdkhpkuUtSg5YcrR2ffPLJtWLFiqO1e0lalK6//vqfVtXkTPOOWrmv\nWLGCHTt2HK3dS9KilOT7w8zztIwkNchyl6QGWe6S1CDLXZIaZLlLUoMsd0lqkOUuSQ2y3CWpQUft\nIiZJas2KDVfN+TFuu+ycESTxyF2SmmS5S1KDLHdJapDlLkkNstwlqUGWuyQ1yHKXpAZZ7pLUIMtd\nkhpkuUtSgyx3SWqQ5S5JDbLcJalBQ5V7kjVJdifZk2TDIea8OMkNSXYm+fxoY0qSZmPGW/4mmQCu\nAM4C9gHbk2ytqlv65jwaeA+wpqp+kOQ35yuwJGlmwxy5rwb2VNWtVXUA2AKsHZhzPvDxqvoBQFX9\nZLQxJUmzMUy5LwX29q3v68b6nQY8Jsm1Sa5PcsF0D5RkXZIdSXbs37//yBJLkmY0qidUlwDPAc4B\nXgb8TZLTBidV1aaqmqqqqcnJyRHtWpI0aJi32bsdOLVvfVk31m8fcGdV3Qvcm+Q64JnAt0eSUpI0\nK8McuW8HViVZmeQE4Fxg68CcTwEvTLIkyUnAmcCu0UaVJA1rxiP3qjqYZD1wNTABbK6qnUku6rZv\nrKpdST4L3Ag8AFxZVTfPZ3BJ0qENc1qGqtoGbBsY2ziw/k7gnaOLJkk6Ul6hKkkNstwlqUGWuyQ1\nyHKXpAZZ7pLUIMtdkhpkuUtSgyx3SWqQ5S5JDbLcJalBlrskNchyl6QGWe6S1CDLXZIaZLlLUoMs\nd0lqkOUuSQ2y3CWpQZa7JDXIcpekBlnuktQgy12SGjRUuSdZk2R3kj1JNkyz/cVJ7kpyQ/fn0tFH\nlSQNa8lME5JMAFcAZwH7gO1JtlbVLQNT/7uqXjEPGSVJszTMkftqYE9V3VpVB4AtwNr5jSVJmoth\nyn0psLdvfV83Nuj5SW5M8pkkTxtJOknSEZnxtMyQvg4sr6p7krwc+CSwanBSknXAOoDly5ePaNeS\npEHDHLnfDpzat76sG/u1qrq7qu7plrcBxyc5efCBqmpTVU1V1dTk5OQcYkuSDmeYct8OrEqyMskJ\nwLnA1v4JSR6XJN3y6u5x7xx1WEnScGY8LVNVB5OsB64GJoDNVbUzyUXd9o3Aa4A/T3IQuA84t6pq\nHnNL0q+t2HDVnB/jtsvOGUGShWOoc+7dqZZtA2Mb+5bfDbx7tNEkSUfKK1QlqUGWuyQ1yHKXpAZZ\n7pLUIMtdkhpkuUtSgyx3SWqQ5S5JDbLcJalBlrskNchyl6QGWe6S1CDLXZIaZLlLUoMsd0lqkOUu\nSQ2y3CWpQZa7JDXIcpekBlnuktQgy12SGmS5S1KDlhztAJIWtxUbrprzY9x22TkjSKJ+Qx25J1mT\nZHeSPUk2HGbec5McTPKa0UWUJM3WjOWeZAK4AjgbOAM4L8kZh5h3OXDNqENKkmZnmCP31cCeqrq1\nqg4AW4C108z7C+BfgZ+MMJ8k6QgMc859KbC3b30fcGb/hCRLgVcBLwGee6gHSrIOWAewfPny2WaV\nPL8rDWlUr5b5R+CSqnrgcJOqalNVTVXV1OTk5Ih2LUkaNMyR++3AqX3ry7qxflPAliQAJwMvT3Kw\nqj45kpSSpFkZpty3A6uSrKRX6ucC5/dPqKqVDy4n+QDwaYtdLfP0kBa6Gcu9qg4mWQ9cDUwAm6tq\nZ5KLuu0b5zmjJGmWhrqIqaq2AdsGxqYt9ar6k7nHkiTNhbcfkKQGefsBaZHyvL8OxyN3SWqQ5S5J\nDbLcJalBlrskNchyl6QGWe6S1CDLXZIaZLlLUoMsd0lqkOUuSQ2y3CWpQZa7JDXIcpekBlnuktQg\ny12SGmS5S1KDfLOOGfiGCJIWI4/cJalBlrskNchyl6QGWe6S1KChnlBNsgZ4FzABXFlVlw1sXwu8\nHXgAOAi8paq+MOKsx7S5PrHrk7rSsWXGck8yAVwBnAXsA7Yn2VpVt/RN+xywtaoqyTOAfwFOn4/A\nkqSZDXNaZjWwp6puraoDwBZgbf+EqrqnqqpbfThQSJKOmmHKfSmwt299Xzf2EEleleRbwFXAn073\nQEnWJdmRZMf+/fuPJK8kaQgje0K1qj5RVacDr6R3/n26OZuqaqqqpiYnJ0e1a0nSgGHK/Xbg1L71\nZd3YtKrqOuBJSU6eYzZJ0hEapty3A6uSrExyAnAusLV/QpInJ0m3/GzgRODOUYeVJA1nxlfLVNXB\nJOuBq+m9FHJzVe1MclG3fSPwB8AFSe4H7gP+qO8JVknSmA31Oveq2gZsGxjb2Ld8OXD5aKNJko6U\nV6hKUoMsd0lqkOUuSQ2y3CWpQZa7JDXIcpekBlnuktQg3yBbQ/PNwqXFwyN3SWqQ5S5JDbLcJalB\nlrskNchyl6QGWe6S1CDLXZIaZLlLUoMsd0lqkOUuSQ2y3CWpQZa7JDXIcpekBlnuktQgy12SGjRU\nuSdZk2R3kj1JNkyz/Y+T3JjkpiRfSvLM0UeVJA1rxnJPMgFcAZwNnAGcl+SMgWnfA15UVU8H3g5s\nGnVQSdLwhjlyXw3sqapbq+oAsAVY2z+hqr5UVT/vVr8CLBttTEnSbAxT7kuBvX3r+7qxQ/kz4DPT\nbUiyLsmOJDv2798/fEpJ0qyM9AnVJC+hV+6XTLe9qjZV1VRVTU1OTo5y15KkPsO8QfbtwKl968u6\nsYdI8gzgSuDsqrpzNPEkSUdimCP37cCqJCuTnACcC2ztn5BkOfBx4LVV9e3Rx5QkzcaMR+5VdTDJ\neuBqYALYXFU7k1zUbd8IXAo8FnhPEoCDVTU1f7ElSYczzGkZqmobsG1gbGPf8oXAhaONJkk6Ul6h\nKkkNstwlqUGWuyQ1yHKXpAZZ7pLUIMtdkhpkuUtSgyx3SWqQ5S5JDRrqCtWjZcWGq+b072+77JwR\nJZGkxcUjd0lqkOUuSQ2y3CWpQZa7JDXIcpekBlnuktQgy12SGmS5S1KDLHdJapDlLkkNstwlqUGW\nuyQ1aKhyT7Imye4ke5JsmGb76Um+nOSXSf5y9DElSbMx410hk0wAVwBnAfuA7Um2VtUtfdN+BlwM\nvHJeUkqSZmWYI/fVwJ6qurWqDgBbgLX9E6rqJ1W1Hbh/HjJKkmZpmHJfCuztW9/XjUmSFqixPqGa\nZF2SHUl27N+/f5y7lqRjyjDlfjtwat/6sm5s1qpqU1VNVdXU5OTkkTyEJGkIw5T7dmBVkpVJTgDO\nBbbObyxJ0lzM+GqZqjqYZD1wNTABbK6qnUku6rZvTPI4YAfwSOCBJG8Bzqiqu+cxuyTpEIZ6g+yq\n2gZsGxjb2Lf8Y3qnayRJC4BXqEpSgyx3SWqQ5S5JDbLcJalBlrskNchyl6QGWe6S1CDLXZIaZLlL\nUoMsd0lqkOUuSQ2y3CWpQZa7JDXIcpekBlnuktQgy12SGmS5S1KDLHdJapDlLkkNstwlqUGWuyQ1\nyHKXpAZZ7pLUoKHKPcmaJLuT7EmyYZrtSfJP3fYbkzx79FElScOasdyTTABXAGcDZwDnJTljYNrZ\nwKruzzrgvSPOKUmahWGO3FcDe6rq1qo6AGwB1g7MWQt8sHq+Ajw6yeNHnFWSNKRU1eEnJK8B1lTV\nhd36a4Ezq2p935xPA5dV1Re69c8Bl1TVjoHHWkfvyB7gKcDuOeY/GfjpHB9jrhZCBlgYORZCBlgY\nORZCBlgYORZCBlgYOUaR4YlVNTnTpCVz3MmsVNUmYNOoHi/JjqqaGtXjLdYMCyXHQsiwUHIshAwL\nJcdCyLBQcowzwzCnZW4HTu1bX9aNzXaOJGlMhin37cCqJCuTnACcC2wdmLMVuKB71czzgLuq6kcj\nzipJGtKMp2Wq6mCS9cDVwASwuap2Jrmo274R2Aa8HNgD/AJ4/fxFfoiRneKZg4WQARZGjoWQARZG\njoWQARZGjoWQARZGjrFlmPEJVUnS4uMVqpLUIMtdkhpkuUtSgyx3SWrQWC9imqskp9O71cHSbuh2\nYGtV7Tp6qY6O7mOxFPhqVd3TN76mqj47pgyrgaqq7d39htYA36qqbePY/yEyfbCqLjha++8yvJDe\nbTturqprxrjfM4FdVXV3kocBG4BnA7cAf1dVd40hw8XAJ6pq73zv6zAZHnzJ9g+r6j+SnA88H9gF\nbKqq+8eY5UnAq+ldB/Qr4NvAR6rq7nnf92J5tUySS4Dz6N3bZl83vIzeJ3FLVV12tLI9KMnrq+r9\nY9jPxcCb6H2xPgt4c1V9qtv29aqa97tyJvlbejeMWwL8O3Am8F/AWcDVVfWOMWQYvN4iwEuA/wSo\nqt+f7wxdjq9V1epu+Q30PjefAF4K/Nu4vjaT7ASe2b18eRO9lyV/DPjdbvzVY8hwF3Av8F3gn4GP\nVtX++d7vQIYP0/u6PAn4H+ARwMfpfRxSVa8bU46LgVcA19F7qfg3ujyvAt5YVdfOa4CqWhR/6P3E\nO36a8ROA7xztfF2WH4xpPzcBj+iWVwA76BU8wDfGmGGC3jfQ3cAju/GHATeOKcPXgQ8BLwZe1P39\no275RWP8vH+jb3k7MNktPxy4aYw5dvV/bAa23TCujwW9070vBd4H7Ac+C7wO+I0xZbix+3sJcAcw\n0a1nXF+b3f5u6tv3ScC13fLycXyfLqbTMg8ATwC+PzD++G7bWCS58VCbgFPGFOO46k7FVNVtSV4M\nfCzJE7sc43Cwqn4F/CLJd6v7NbOq7ksyrs/HFPBm4K3AX1XVDUnuq6rPj2n/DzouyWPoldpEdUeq\nVXVvkoNjzHFz32+P30wyVVU7kpwGjOtURFXVA8A1wDVJjqf3G955wN8DM97wagSO607NPJxeqT4K\n+BlwInD8GPbfbwm90zEn0vsNgqr6QfdxmfcdLxZvAT6X5DvAg+fzlgNPBtYf8l+N3inAy4CfD4wH\n+NKYMtyR5FlVdQNAVd2T5BXAZuDpY8pwIMlJVfUL4DkPDiZ5FGP6YduVyD8k+Wj39x0cna/pRwHX\n0/saqCSPr6ofJXkE4/thC3Ah8K4kb6N358EvJ9lL7/vlwjFleMj/t3rnt7cCW5OcNKYM7wO+Re83\ny7cCH01yK/A8eqd1x+VKYHuSrwK/A1wOkGSS3g+bebVozrkDJDmO3hNV/U+obu+OIMeV4X3A+6u7\nvfHAto9U1fljyLCM3pHzj6fZ9oKq+uIYMpxYVb+cZvxk4PFVddN8Z5hm3+cAL6iqvx73vqfTldkp\nVfW9Me/3kcBKej/o9lXVHWPc92lV9e1x7e8wOZ4AUFU/TPJo4PfonTb92phzPA14Kr0n17811n0v\npnKXJA3H17lLUoMsd0lqkOWuY0qSFUlunmb8ymne+F1atBbTq2WkeVPdewRLrfDIXceiJUk+nGRX\nko8lOSnJtUmmAJLck+QdSb6Z5CtJTunG/zDJzd34dUf3vyAdnuWuY9FTgPdU1VPpXV37xoHtDwe+\nUlXPpHfp+Bu68UuBl3XjY7m1gXSkLHcdi/b2XQvwIeCFA9sPAJ/ulq+nd4sHgC8CH+juHzMx3yGl\nubDcdSwavLhjcP3++r8LQH5F99xUVV0EvI3eHf6uT/LYeU0pzYHlrmPR8iS/3S2fD/y/q42nk+S3\nquqrVXUpvRtinTpfAaW5stx1LNoNvCnJLuAxwHuH/HfvTHJT91LKLwHfnK+A0lx5+wFJapBH7pLU\nIMtdkhpkuUtSgyx3SWqQ5S5JDbLcJalBlrskNeh/AasVfAv7ToPgAAAAAElFTkSuQmCC\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "grouped['rrover'].apply(get_ratio).plot(kind='bar')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### We conclude that the model does have some value, especially with more training data.
1. For high probabilities, we could deploy a breakout or trend system.
2. For low probabilities, we could use a counter-trend system.
3. Mid-range probabilities have no predictive power in this model."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "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.6.0"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/alphapy/examples/Trading Model/config/algos.yml b/alphapy/examples/Trading Model/config/algos.yml
deleted file mode 100644
index 73155fe..0000000
--- a/alphapy/examples/Trading Model/config/algos.yml
+++ /dev/null
@@ -1,250 +0,0 @@
-#
-# Algorithms
-#
-
-AB:
- # AdaBoost
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "random_state" : seed}
- grid : {"n_estimators" : [10, 50, 100, 150, 200],
- "learning_rate" : [0.2, 0.5, 0.7, 1.0, 1.5, 2.0],
- "algorithm" : ['SAMME', 'SAMME.R']}
- scoring : True
-
-GB:
- # Gradient Boosting
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "max_depth" : 3,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"loss" : ['deviance', 'exponential'],
- "learning_rate" : [0.05, 0.1, 0.15],
- "n_estimators" : [50, 100, 200],
- "max_depth" : [3, 5, 10],
- "min_samples_split" : [2, 3],
- "min_samples_leaf" : [1, 2]}
- scoring : True
-
-GBR:
- # Gradient Boosting Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {}
- scoring : False
-
-KNN:
- # K-Nearest Neighbors
- model_type : classification
- params : {"n_jobs" : n_jobs}
- grid : {"n_neighbors" : [3, 5, 7, 10],
- "weights" : ['uniform', 'distance'],
- "algorithm" : ['ball_tree', 'kd_tree', 'brute', 'auto'],
- "leaf_size" : [10, 20, 30, 40, 50]}
- scoring : False
-
-KNR:
- # K-Nearest Neighbor Regression
- model_type : regression
- params : {"n_jobs" : n_jobs}
- grid : {}
- scoring : False
-
-LOGR:
- # Logistic Regression
- model_type : classification
- params : {"random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"penalty" : ['l2'],
- "C" : [0.00001, 0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 1e4, 1e5, 1e6, 1e7],
- "fit_intercept" : [True, False],
- "solver" : ['newton-cg', 'lbfgs', 'liblinear', 'sag']}
- scoring : True
-
-LR:
- # Linear Regression
- model_type : regression
- params : {"n_jobs" : n_jobs}
- grid : {"fit_intercept" : [True, False],
- "normalize" : [True, False],
- "copy_X" : [True, False]}
- scoring : False
-
-LSVC:
- # Linear Support Vector Classification
- model_type : classification
- params : {"C" : 0.01,
- "max_iter" : 2000,
- "penalty" : 'l1',
- "dual" : False,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "penalty" : ['l1', 'l2'],
- "dual" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "max_iter" : [500, 1000, 2000]}
- scoring : False
-
-LSVM:
- # Linear Support Vector Machine
- model_type : classification
- params : {"kernel" : 'linear',
- "probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-NB:
- # Naive Bayes
- model_type : classification
- params : {}
- grid : {"alpha" : [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0, 5.0, 10.0],
- "fit_prior" : [True, False]}
- scoring : True
-
-RBF:
- # Radial Basis Function
- model_type : classification
- params : {"kernel" : 'rbf',
- "probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-RF:
- # Random Forest
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "max_depth" : 10,
- "min_samples_split" : 5,
- "min_samples_leaf" : 3,
- "bootstrap" : True,
- "criterion" : 'entropy',
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"n_estimators" : [21, 51, 101, 201, 501],
- "max_depth" : [5, 7, 10, 20],
- "min_samples_split" : [2, 3, 5, 10],
- "min_samples_leaf" : [1, 2, 3],
- "bootstrap" : [True, False],
- "criterion" : ['gini', 'entropy']}
- scoring : True
-
-RFR:
- # Random Forest Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {}
- scoring : False
-
-SVM:
- # Support Vector Machine
- model_type : classification
- params : {"probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-XGB:
- # XGBoost Binary
- model_type : classification
- params : {"objective" : 'binary:logistic',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 6,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {"n_estimators" : [21, 51, 101, 201, 501],
- "max_depth" : [5, 6, 7, 8, 9, 10, 12, 15, 20],
- "learning_rate" : [0.01, 0.02, 0.05, 0.1, 0.2],
- "min_child_weight" : [1.0, 1.1],
- "subsample" : [0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
- "colsample_bytree" : [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]}
- scoring : False
-
-XGBM:
- # XGBoost Multiclass
- model_type : multiclass
- params : {"objective" : 'multi:softmax',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 10,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {}
- scoring : False
-
-XGBR:
- # XGBoost Regression
- model_type : regression
- params : {"objective" : 'reg:linear',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 10,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "seed" : seed,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {}
- scoring : False
-
-XT:
- # Extra Trees
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"n_estimators" : [21, 51, 101, 201, 501, 1001, 2001],
- "max_features" : ['auto', 'sqrt', 'log2'],
- "max_depth" : [3, 5, 7, 10, 20, 30],
- "min_samples_split" : [2, 3],
- "min_samples_leaf" : [1, 2],
- "bootstrap" : [True, False],
- "warm_start" : [True, False]}
- scoring : True
-
-XTR:
- # Extra Trees Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {}
- scoring : False
diff --git a/alphapy/examples/Trading Model/config/market.yml b/alphapy/examples/Trading Model/config/market.yml
deleted file mode 100644
index 7f73975..0000000
--- a/alphapy/examples/Trading Model/config/market.yml
+++ /dev/null
@@ -1,134 +0,0 @@
-market:
- data_history : 2000
- forecast_period : 1
- fractal : 1d
- leaders : ['gap', 'gapbadown', 'gapbaup', 'gapdown', 'gapup']
- predict_history : 100
- schema : prices
- target_group : test
-
-groups:
- all : ['aaoi', 'aapl', 'acia', 'adbe', 'adi', 'adp', 'agn', 'aig', 'akam',
- 'algn', 'alk', 'alxn', 'amat', 'amba', 'amd', 'amgn', 'amt', 'amzn',
- 'antm', 'arch', 'asml', 'athn', 'atvi', 'auph', 'avgo', 'axp', 'ayx',
- 'azo', 'ba', 'baba', 'bac', 'bby', 'bidu', 'biib', 'brcd', 'bvsn',
- 'bwld', 'c', 'cacc', 'cara', 'casy', 'cat', 'cde', 'celg', 'cern',
- 'chkp', 'chtr', 'clvs', 'cme', 'cmg', 'cof', 'cohr', 'comm', 'cost',
- 'cpk', 'crm', 'crus', 'csco', 'ctsh', 'ctxs', 'csx', 'cvs', 'cybr',
- 'data', 'ddd', 'deck', 'dgaz', 'dia', 'dis', 'dish', 'dnkn', 'dpz',
- 'drys', 'dust', 'ea', 'ebay', 'edc', 'edz', 'eem', 'elli', 'eog',
- 'esrx', 'etrm', 'ewh', 'ewt', 'expe', 'fang', 'fas', 'faz', 'fb',
- 'fcx', 'fdx', 'ffiv', 'fit', 'five', 'fnsr', 'fslr', 'ftnt', 'gddy',
- 'gdx', 'gdxj', 'ge', 'gild', 'gld', 'glw', 'gm', 'googl', 'gpro',
- 'grub', 'gs', 'gwph', 'hal', 'has', 'hd', 'hdp', 'hlf', 'hog', 'hum',
- 'ibb', 'ibm', 'ice', 'idxx', 'ilmn', 'ilmn', 'incy', 'intc', 'intu',
- 'ip', 'isrg', 'iwm', 'ivv', 'iwf', 'iwm', 'jack', 'jcp', 'jdst', 'jnj',
- 'jnpr', 'jnug', 'jpm', 'kite', 'klac', 'ko', 'kss', 'labd', 'labu',
- 'len', 'lite', 'lmt', 'lnkd', 'lrcx', 'lulu', 'lvs', 'mbly', 'mcd',
- 'mchp', 'mdy', 'meoh', 'mnst', 'mo', 'momo', 'mon', 'mrk', 'ms', 'msft',
- 'mtb', 'mu', 'nflx', 'nfx', 'nke', 'ntap', 'ntes', 'ntnx', 'nugt',
- 'nvda', 'nxpi', 'nxst', 'oii', 'oled', 'orcl', 'orly', 'p', 'panw',
- 'pcln', 'pg', 'pm', 'pnra', 'prgo', 'pxd', 'pypl', 'qcom', 'qqq',
- 'qrvo', 'rht', 'sam', 'sbux', 'sds', 'sgen', 'shld', 'shop', 'sig',
- 'sina', 'siri', 'skx', 'slb', 'slv', 'smh', 'snap', 'sncr', 'soda',
- 'splk', 'spy', 'stld', 'stmp', 'stx', 'svxy', 'swks', 'symc', 't',
- 'tbt', 'teva', 'tgt', 'tho', 'tlt', 'tmo', 'tna', 'tqqq', 'trip',
- 'tsla', 'ttwo', 'tvix', 'twlo', 'twtr', 'tza', 'uaa', 'ugaz', 'uhs',
- 'ulta', 'ulti', 'unh', 'unp', 'upro', 'uri', 'ups', 'uri', 'uthr',
- 'utx', 'uvxy', 'v', 'veev', 'viav', 'vlo', 'vmc', 'vrsn', 'vrtx', 'vrx',
- 'vwo', 'vxx', 'vz', 'wday', 'wdc', 'wfc', 'wfm', 'wmt', 'wynn', 'x',
- 'xbi', 'xhb', 'xiv', 'xle', 'xlf', 'xlk', 'xlnx', 'xom', 'xlp', 'xlu',
- 'xlv', 'xme', 'xom', 'wix', 'yelp', 'z']
- etf : ['dia', 'dust', 'edc', 'edz', 'eem', 'ewh', 'ewt', 'fas', 'faz',
- 'gld', 'hyg', 'iwm', 'ivv', 'iwf', 'jnk', 'mdy', 'nugt', 'qqq',
- 'sds', 'smh', 'spy', 'tbt', 'tlt', 'tna', 'tvix', 'tza', 'upro',
- 'uvxy', 'vwo', 'vxx', 'xhb', 'xiv', 'xle', 'xlf', 'xlk', 'xlp',
- 'xlu', 'xlv', 'xme']
- tech : ['aapl', 'adbe', 'amat', 'amgn', 'amzn', 'avgo', 'baba', 'bidu',
- 'brcd', 'csco', 'ddd', 'emc', 'expe', 'fb', 'fit', 'fslr', 'goog',
- 'intc', 'isrg', 'lnkd', 'msft', 'nflx', 'nvda', 'pcln', 'qcom',
- 'qqq', 'tsla', 'twtr']
- test : ['aapl', 'amzn', 'goog', 'fb', 'nvda', 'tsla']
-
-features: ['abovema_3', 'abovema_5', 'abovema_10', 'abovema_20', 'abovema_50',
- 'adx', 'atr', 'bigdown', 'bigup', 'diminus', 'diplus', 'doji',
- 'gap', 'gapbadown', 'gapbaup', 'gapdown', 'gapup',
- 'hc', 'hh', 'ho', 'hl', 'lc', 'lh', 'll', 'lo', 'hookdown', 'hookup',
- 'inside', 'outside', 'madelta_3', 'madelta_5', 'madelta_7', 'madelta_10',
- 'madelta_12', 'madelta_15', 'madelta_18', 'madelta_20', 'madelta',
- 'net', 'netdown', 'netup', 'nr_3', 'nr_4', 'nr_5', 'nr_7', 'nr_8',
- 'nr_10', 'nr_18', 'roi', 'roi_2', 'roi_3', 'roi_4', 'roi_5', 'roi_10',
- 'roi_20', 'rr_1_4', 'rr_1_7', 'rr_1_10', 'rr_2_5', 'rr_2_7', 'rr_2_10',
- 'rr_3_8', 'rr_3_14', 'rr_4_10', 'rr_4_20', 'rr_5_10', 'rr_5_20',
- 'rr_5_30', 'rr_6_14', 'rr_6_25', 'rr_7_14', 'rr_7_35', 'rr_8_22',
- 'rrhigh', 'rrlow', 'rrover', 'rrunder', 'rsi_3', 'rsi_4', 'rsi_5',
- 'rsi_6', 'rsi_8', 'rsi_10', 'rsi_14', 'sep_3_3', 'sep_5_5', 'sep_8_8',
- 'sep_10_10', 'sep_14_14', 'sep_21_21', 'sep_30_30', 'sep_40_40',
- 'sephigh', 'seplow', 'trend', 'vma', 'vmover', 'vmratio', 'vmunder',
- 'volatility_3', 'volatility_5', 'volatility', 'volatility_20',
- 'wr_2', 'wr_3', 'wr', 'wr_5', 'wr_6', 'wr_7', 'wr_10']
-
-aliases:
- atr : 'ma_truerange'
- aver : 'ma_hlrange'
- cma : 'ma_close'
- cmax : 'highest_close'
- cmin : 'lowest_close'
- hc : 'higher_close'
- hh : 'higher_high'
- hl : 'higher_low'
- ho : 'higher_open'
- hmax : 'highest_high'
- hmin : 'lowest_high'
- lc : 'lower_close'
- lh : 'lower_high'
- ll : 'lower_low'
- lo : 'lower_open'
- lmax : 'highest_low'
- lmin : 'lowest_low'
- net : 'net_close'
- netdown : 'down_net'
- netup : 'up_net'
- omax : 'highest_open'
- omin : 'lowest_open'
- rmax : 'highest_hlrange'
- rmin : 'lowest_hlrange'
- rr : 'maratio_hlrange'
- rixc : 'rindex_close_high_low'
- rixo : 'rindex_open_high_low'
- roi : 'netreturn_close'
- rsi : 'rsi_close'
- sepma : 'ma_sep'
- vma : 'ma_volume'
- vmratio : 'maratio_volume'
- upmove : 'net_high'
-
-variables:
- abovema : 'close > cma_50'
- belowma : 'close < cma_50'
- bigup : 'rrover & sephigh & netup'
- bigdown : 'rrover & sephigh & netdown'
- doji : 'sepdoji & rrunder'
- hookdown : 'open > high[1] & close < close[1]'
- hookup : 'open < low[1] & close > close[1]'
- inside : 'low > low[1] & high < high[1]'
- madelta : '(close - cma_50) / atr_10'
- nr : 'hlrange == rmin_4'
- outside : 'low < low[1] & high > high[1]'
- roihigh : 'roi_5 >= 5'
- roilow : 'roi_5 < -5'
- roiminus : 'roi_5 < 0'
- roiplus : 'roi_5 > 0'
- rrhigh : 'rr_1_10 >= 1.2'
- rrlow : 'rr_1_10 <= 0.8'
- rrover : 'rr_1_10 >= 1.0'
- rrunder : 'rr_1_10 < 1.0'
- sep : 'rixc_1 - rixo_1'
- sepdoji : 'abs(sep) <= 15'
- sephigh : 'abs(sep_1_1) >= 70'
- seplow : 'abs(sep_1_1) <= 30'
- trend : 'rrover & sephigh'
- vmover : 'vmratio >= 1'
- vmunder : 'vmratio < 1'
- volatility : 'atr_10 / close'
- wr : 'hlrange == rmax_4'
diff --git a/alphapy/examples/Trading Model/config/model.yml b/alphapy/examples/Trading Model/config/model.yml
deleted file mode 100644
index 82d4574..0000000
--- a/alphapy/examples/Trading Model/config/model.yml
+++ /dev/null
@@ -1,124 +0,0 @@
-project:
- directory : .
- file_extension : csv
- submission_file :
- submit_probas : False
-
-data:
- drop : ['date', 'tag', 'open', 'high', 'low', 'close', 'volume', 'adjclose',
- 'low[1]', 'high[1]', 'net', 'close[1]', 'rmin_3', 'rmin_4', 'rmin_5',
- 'rmin_7', 'rmin_8', 'rmin_10', 'rmin_18', 'pval', 'mval', 'vma',
- 'rmax_2', 'rmax_3', 'rmax_4', 'rmax_5', 'rmax_6', 'rmax_7', 'rmax_10']
- features : '*'
- sampling :
- option : True
- method : under_random
- ratio : 0.5
- sentinel : -1
- separator : ','
- shuffle : True
- split : 0.4
- target : rrover
- target_value : True
-
-model:
- algorithms : ['RF']
- balance_classes : True
- calibration :
- option : False
- type : isotonic
- cv_folds : 3
- estimators : 501
- feature_selection :
- option : True
- percentage : 50
- uni_grid : [5, 10, 15, 20, 25]
- score_func : f_classif
- grid_search :
- option : False
- iterations : 100
- random : True
- subsample : True
- sampling_pct : 0.25
- pvalue_level : 0.01
- rfe :
- option : True
- step : 10
- scoring_function : 'roc_auc'
- type : classification
-
-features:
- clustering :
- option : False
- increment : 3
- maximum : 30
- minimum : 3
- counts :
- option : False
- encoding :
- rounding : 3
- type : factorize
- factors : []
- interactions :
- option : True
- poly_degree : 2
- sampling_pct : 5
- isomap :
- option : False
- components : 2
- neighbors : 5
- logtransform :
- option : False
- numpy :
- option : False
- pca :
- option : False
- increment : 3
- maximum : 15
- minimum : 3
- whiten : False
- scaling :
- option : True
- type : standard
- scipy :
- option : False
- text :
- ngrams : 1
- vectorize : False
- tsne :
- option : False
- components : 2
- learning_rate : 1000.0
- perplexity : 30.0
- variance :
- option : True
- threshold : 0.1
-
-treatments:
- doji : ['alphapy.features', 'runs_test', ['all'], 18]
- hc : ['alphapy.features', 'runs_test', ['all'], 18]
- hh : ['alphapy.features', 'runs_test', ['all'], 18]
- hl : ['alphapy.features', 'runs_test', ['all'], 18]
- ho : ['alphapy.features', 'runs_test', ['all'], 18]
- rrhigh : ['alphapy.features', 'runs_test', ['all'], 18]
- rrlow : ['alphapy.features', 'runs_test', ['all'], 18]
- rrover : ['alphapy.features', 'runs_test', ['all'], 18]
- rrunder : ['alphapy.features', 'runs_test', ['all'], 18]
- sephigh : ['alphapy.features', 'runs_test', ['all'], 18]
- seplow : ['alphapy.features', 'runs_test', ['all'], 18]
- trend : ['alphapy.features', 'runs_test', ['all'], 18]
-
-pipeline:
- number_jobs : -1
- seed : 10231
- verbosity : 0
-
-plots:
- calibration : True
- confusion_matrix : True
- importances : True
- learning_curve : True
- roc_curve : True
-
-xgboost:
- stopping_rounds : 20
diff --git a/alphapy/examples/Trading System/A Trading System.ipynb b/alphapy/examples/Trading System/A Trading System.ipynb
deleted file mode 100644
index 9d51134..0000000
--- a/alphapy/examples/Trading System/A Trading System.ipynb
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "import pyfolio as pf"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "pwd"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "cd systems"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "ls"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "df = pd.read_csv('faang_closer_returns_1d.csv', index_col='date', squeeze=True)\n",
- "df.index = pd.to_datetime(df.index, utc=True)\n",
- "pf.create_returns_tear_sheet(df)"
- ]
- }
- ],
- "metadata": {
- "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.6.0"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/alphapy/examples/Trading System/config/algos.yml b/alphapy/examples/Trading System/config/algos.yml
deleted file mode 100644
index 73155fe..0000000
--- a/alphapy/examples/Trading System/config/algos.yml
+++ /dev/null
@@ -1,250 +0,0 @@
-#
-# Algorithms
-#
-
-AB:
- # AdaBoost
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "random_state" : seed}
- grid : {"n_estimators" : [10, 50, 100, 150, 200],
- "learning_rate" : [0.2, 0.5, 0.7, 1.0, 1.5, 2.0],
- "algorithm" : ['SAMME', 'SAMME.R']}
- scoring : True
-
-GB:
- # Gradient Boosting
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "max_depth" : 3,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"loss" : ['deviance', 'exponential'],
- "learning_rate" : [0.05, 0.1, 0.15],
- "n_estimators" : [50, 100, 200],
- "max_depth" : [3, 5, 10],
- "min_samples_split" : [2, 3],
- "min_samples_leaf" : [1, 2]}
- scoring : True
-
-GBR:
- # Gradient Boosting Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {}
- scoring : False
-
-KNN:
- # K-Nearest Neighbors
- model_type : classification
- params : {"n_jobs" : n_jobs}
- grid : {"n_neighbors" : [3, 5, 7, 10],
- "weights" : ['uniform', 'distance'],
- "algorithm" : ['ball_tree', 'kd_tree', 'brute', 'auto'],
- "leaf_size" : [10, 20, 30, 40, 50]}
- scoring : False
-
-KNR:
- # K-Nearest Neighbor Regression
- model_type : regression
- params : {"n_jobs" : n_jobs}
- grid : {}
- scoring : False
-
-LOGR:
- # Logistic Regression
- model_type : classification
- params : {"random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"penalty" : ['l2'],
- "C" : [0.00001, 0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 1e4, 1e5, 1e6, 1e7],
- "fit_intercept" : [True, False],
- "solver" : ['newton-cg', 'lbfgs', 'liblinear', 'sag']}
- scoring : True
-
-LR:
- # Linear Regression
- model_type : regression
- params : {"n_jobs" : n_jobs}
- grid : {"fit_intercept" : [True, False],
- "normalize" : [True, False],
- "copy_X" : [True, False]}
- scoring : False
-
-LSVC:
- # Linear Support Vector Classification
- model_type : classification
- params : {"C" : 0.01,
- "max_iter" : 2000,
- "penalty" : 'l1',
- "dual" : False,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "penalty" : ['l1', 'l2'],
- "dual" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "max_iter" : [500, 1000, 2000]}
- scoring : False
-
-LSVM:
- # Linear Support Vector Machine
- model_type : classification
- params : {"kernel" : 'linear',
- "probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-NB:
- # Naive Bayes
- model_type : classification
- params : {}
- grid : {"alpha" : [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0, 5.0, 10.0],
- "fit_prior" : [True, False]}
- scoring : True
-
-RBF:
- # Radial Basis Function
- model_type : classification
- params : {"kernel" : 'rbf',
- "probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-RF:
- # Random Forest
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "max_depth" : 10,
- "min_samples_split" : 5,
- "min_samples_leaf" : 3,
- "bootstrap" : True,
- "criterion" : 'entropy',
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"n_estimators" : [21, 51, 101, 201, 501],
- "max_depth" : [5, 7, 10, 20],
- "min_samples_split" : [2, 3, 5, 10],
- "min_samples_leaf" : [1, 2, 3],
- "bootstrap" : [True, False],
- "criterion" : ['gini', 'entropy']}
- scoring : True
-
-RFR:
- # Random Forest Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {}
- scoring : False
-
-SVM:
- # Support Vector Machine
- model_type : classification
- params : {"probability" : True,
- "random_state" : seed,
- "verbose" : verbosity}
- grid : {"C" : np.logspace(-2, 10, 13),
- "gamma" : np.logspace(-9, 3, 13),
- "shrinking" : [True, False],
- "tol" : [0.0005, 0.001, 0.005],
- "decision_function_shape" : ['ovo', 'ovr']}
- scoring : False
-
-XGB:
- # XGBoost Binary
- model_type : classification
- params : {"objective" : 'binary:logistic',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 6,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {"n_estimators" : [21, 51, 101, 201, 501],
- "max_depth" : [5, 6, 7, 8, 9, 10, 12, 15, 20],
- "learning_rate" : [0.01, 0.02, 0.05, 0.1, 0.2],
- "min_child_weight" : [1.0, 1.1],
- "subsample" : [0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
- "colsample_bytree" : [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]}
- scoring : False
-
-XGBM:
- # XGBoost Multiclass
- model_type : multiclass
- params : {"objective" : 'multi:softmax',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 10,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {}
- scoring : False
-
-XGBR:
- # XGBoost Regression
- model_type : regression
- params : {"objective" : 'reg:linear',
- "n_estimators" : n_estimators,
- "seed" : seed,
- "max_depth" : 10,
- "learning_rate" : 0.1,
- "min_child_weight" : 1.1,
- "subsample" : 0.9,
- "colsample_bytree" : 0.9,
- "seed" : seed,
- "nthread" : n_jobs,
- "silent" : True}
- grid : {}
- scoring : False
-
-XT:
- # Extra Trees
- model_type : classification
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {"n_estimators" : [21, 51, 101, 201, 501, 1001, 2001],
- "max_features" : ['auto', 'sqrt', 'log2'],
- "max_depth" : [3, 5, 7, 10, 20, 30],
- "min_samples_split" : [2, 3],
- "min_samples_leaf" : [1, 2],
- "bootstrap" : [True, False],
- "warm_start" : [True, False]}
- scoring : True
-
-XTR:
- # Extra Trees Regression
- model_type : regression
- params : {"n_estimators" : n_estimators,
- "random_state" : seed,
- "n_jobs" : n_jobs,
- "verbose" : verbosity}
- grid : {}
- scoring : False
diff --git a/alphapy/examples/Trading System/config/market.yml b/alphapy/examples/Trading System/config/market.yml
deleted file mode 100644
index 635824e..0000000
--- a/alphapy/examples/Trading System/config/market.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-market:
- data_history : 1000
- forecast_period : 1
- fractal : 1d
- leaders : []
- predict_history : 50
- schema : prices
- target_group : faang
-
-system:
- name : 'closer'
- holdperiod : 0
- longentry : hc
- longexit :
- shortentry : lc
- shortexit :
- scale : False
-
-groups:
- faang : ['fb', 'aapl', 'amzn', 'nflx', 'googl']
-
-features : ['hc', 'lc']
-
-aliases:
- hc : 'higher_close'
- lc : 'lower_close'
diff --git a/alphapy/examples/Trading System/config/model.yml b/alphapy/examples/Trading System/config/model.yml
deleted file mode 100644
index 292f656..0000000
--- a/alphapy/examples/Trading System/config/model.yml
+++ /dev/null
@@ -1,107 +0,0 @@
-project:
- directory : .
- file_extension : csv
- submission_file :
- submit_probas : False
-
-data:
- drop : ['date', 'tag', 'open', 'high', 'low', 'close', 'adjclose']
- features : '*'
- sampling :
- option : True
- method : under_random
- ratio : 0.5
- sentinel : -1
- separator : ','
- shuffle : True
- split : 0.4
- target : wr
- target_value : True
-
-model:
- algorithms : ['XGB']
- balance_classes : True
- calibration :
- option : False
- type : sigmoid
- cv_folds : 3
- estimators : 501
- feature_selection :
- option : False
- percentage : 10
- uni_grid : [5, 10, 15, 20, 25]
- score_func : f_classif
- grid_search :
- option : False
- iterations : 100
- random : True
- subsample : True
- sampling_pct : 0.25
- pvalue_level : 0.01
- rfe :
- option : False
- step : 10
- scoring_function : 'roc_auc'
- type : classification
-
-features:
- clustering :
- option : False
- increment : 3
- maximum : 30
- minimum : 3
- counts :
- option : False
- encoding :
- rounding : 3
- type : factorize
- factors : []
- interactions :
- option : True
- poly_degree : 2
- sampling_pct : 5
- isomap :
- option : False
- components : 2
- neighbors : 5
- logtransform :
- option : False
- numpy :
- option : False
- pca :
- option : False
- increment : 3
- maximum : 15
- minimum : 3
- whiten : False
- scaling :
- option : True
- type : standard
- scipy :
- option : False
- text :
- ngrams : 1
- vectorize : False
- tsne :
- option : False
- components : 2
- learning_rate : 1000.0
- perplexity : 30.0
- variance :
- option : True
- threshold : 0.1
-
-pipeline:
- number_jobs : -1
- seed : 10231
- verbosity : 1
-
-plots:
- calibration : True
- confusion_matrix : True
- importances : True
- learning_curve : True
- roc_curve : True
-
-xgboost:
- stopping_rounds : 30
diff --git a/alphapy/features.py b/alphapy/features.py
index 9d10737..cb64957 100644
--- a/alphapy/features.py
+++ b/alphapy/features.py
@@ -4,7 +4,7 @@
# Module : features
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,26 +26,28 @@
# Imports
#
-from alphapy.globals import BSEP, NULLTEXT, PSEP, SSEP, USEP
+from alphapy.globals import BSEP, LOFF, NULLTEXT
+from alphapy.globals import PSEP, SSEP, USEP
from alphapy.globals import Encoders
from alphapy.globals import ModelType
from alphapy.globals import Scalers
-from alphapy.market_variables import Variable
+from alphapy.variables import Variable
+from alphapy.variables import vparse
import category_encoders as ce
from importlib import import_module
-from itertools import groupby
+import itertools
import logging
import math
import numpy as np
+import os
import pandas as pd
import re
from scipy import sparse
import scipy.stats as sps
from sklearn.cluster import MiniBatchKMeans
from sklearn.decomposition import PCA
-from sklearn.feature_extraction.text import CountVectorizer
-from sklearn.feature_extraction.text import TfidfTransformer
+from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_selection import chi2
from sklearn.feature_selection import f_classif
from sklearn.feature_selection import f_regression
@@ -55,12 +57,13 @@
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import SelectPercentile
from sklearn.feature_selection import VarianceThreshold
+from sklearn.impute import SimpleImputer
from sklearn.manifold import Isomap
from sklearn.manifold import TSNE
-from sklearn.preprocessing import Imputer
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
+import sys
#
@@ -84,325 +87,32 @@
#
-# Function rtotal
+# Define Encoder map
#
-def rtotal(vec):
- r"""Calculate the running total.
-
- Parameters
- ----------
- vec : pandas.Series
- The input array for calculating the running total.
-
- Returns
- -------
- running_total : int
- The final running total.
-
- Example
- -------
-
- >>> vec.rolling(window=20).apply(rtotal)
-
- """
- tcount = np.count_nonzero(vec)
- fcount = len(vec) - tcount
- running_total = tcount - fcount
- return running_total
-
-
-#
-# Function runs
-#
-
-def runs(vec):
- r"""Calculate the total number of runs.
-
- Parameters
- ----------
- vec : pandas.Series
- The input array for calculating the number of runs.
-
- Returns
- -------
- runs_value : int
- The total number of runs.
-
- Example
- -------
-
- >>> vec.rolling(window=20).apply(runs)
-
- """
- runs_value = len(list(groupby(vec)))
- return runs_value
-
-
-#
-# Function streak
-#
-
-def streak(vec):
- r"""Determine the length of the latest streak.
-
- Parameters
- ----------
- vec : pandas.Series
- The input array for calculating the latest streak.
-
- Returns
- -------
- latest_streak : int
- The length of the latest streak.
-
- Example
- -------
-
- >>> vec.rolling(window=20).apply(streak)
-
- """
- latest_streak = [len(list(g)) for k, g in groupby(vec)][-1]
- return latest_streak
-
-
-#
-# Function zscore
-#
-
-def zscore(vec):
- r"""Calculate the Z-Score.
-
- Parameters
- ----------
- vec : pandas.Series
- The input array for calculating the Z-Score.
-
- Returns
- -------
- zscore : float
- The value of the Z-Score.
-
- References
- ----------
- To calculate the Z-Score, you can find more information here [ZSCORE]_.
-
- .. [ZSCORE] https://en.wikipedia.org/wiki/Standard_score
-
- Example
- -------
-
- >>> vec.rolling(window=20).apply(zscore)
-
- """
- n1 = np.count_nonzero(vec)
- n2 = len(vec) - n1
- fac1 = float(2 * n1 * n2)
- fac2 = float(n1 + n2)
- rbar = fac1 / fac2 + 1
- sr2num = fac1 * (fac1 - n1 - n2)
- sr2den = math.pow(fac2, 2) * (fac2 - 1)
- sr = math.sqrt(sr2num / sr2den)
- if sr2den and sr:
- zscore = (runs(vec) - rbar) / sr
- else:
- zscore = 0
- return zscore
-
-
-#
-# Function runs_test
-#
-
-def runs_test(f, c, wfuncs, window):
- r"""Perform a runs test on binary series.
-
- Parameters
- ----------
- f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the column in the dataframe ``f``.
- wfuncs : list
- The set of runs test functions to apply to the column:
-
- ``'all'``:
- Run all of the functions below.
- ``'rtotal'``:
- The running total over the ``window`` period.
- ``'runs'``:
- Total number of runs in ``window``.
- ``'streak'``:
- The length of the latest streak.
- ``'zscore'``:
- The Z-Score over the ``window`` period.
- window : int
- The rolling period.
-
- Returns
- -------
- new_features : pandas.DataFrame
- The dataframe containing the runs test features.
-
- References
- ----------
- For more information about runs tests for detecting non-randomness,
- refer to [RUNS]_.
-
- .. [RUNS] http://www.itl.nist.gov/div898/handbook/eda/section3/eda35d.htm
-
- """
-
- fc = f[c]
- all_funcs = {'runs' : runs,
- 'streak' : streak,
- 'rtotal' : rtotal,
- 'zscore' : zscore}
- # use all functions
- if 'all' in wfuncs:
- wfuncs = list(all_funcs.keys())
- # apply each of the runs functions
- new_features = pd.DataFrame()
- for w in wfuncs:
- if w in all_funcs:
- new_feature = fc.rolling(window=window).apply(all_funcs[w])
- new_feature.fillna(0, inplace=True)
- new_column_name = PSEP.join([c, w])
- new_feature = new_feature.rename(new_column_name)
- frames = [new_features, new_feature]
- new_features = pd.concat(frames, axis=1)
- else:
- logger.info("Runs Function %s not found", w)
- return new_features
+encoder_map = {Encoders.backdiff : ce.BackwardDifferenceEncoder,
+ Encoders.basen : ce.BaseNEncoder,
+ Encoders.binary : ce.BinaryEncoder,
+ Encoders.catboost : ce.CatBoostEncoder,
+ Encoders.hashing : ce.HashingEncoder,
+ Encoders.helmert : ce.HelmertEncoder,
+ Encoders.jstein : ce.JamesSteinEncoder,
+ Encoders.leaveone : ce.LeaveOneOutEncoder,
+ Encoders.mestimate : ce.MEstimateEncoder,
+ Encoders.onehot : ce.OneHotEncoder,
+ Encoders.ordinal : ce.OrdinalEncoder,
+ Encoders.polynomial : ce.PolynomialEncoder,
+ Encoders.sum : ce.SumEncoder,
+ Encoders.target : ce.TargetEncoder,
+ Encoders.woe : ce.WOEEncoder}
#
-# Function split_to_letters
+# Function apply_transform
#
-def split_to_letters(f, c):
- r"""Separate text into distinct characters.
-
- Parameters
- ----------
- f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the text column in the dataframe ``f``.
-
- Returns
- -------
- new_feature : pandas.Series
- The array containing the new feature.
-
- Example
- -------
- The value 'abc' becomes 'a b c'.
-
- """
- fc = f[c]
- new_feature = None
- dtype = fc.dtypes
- if dtype == 'object':
- fc.fillna(NULLTEXT, inplace=True)
- maxlen = fc.str.len().max()
- if maxlen > 1:
- new_feature = fc.apply(lambda x: BSEP.join(list(x)))
- return new_feature
-
-
-#
-# Function texplode
-#
-
-def texplode(f, c):
- r"""Get dummy values for a text column.
-
- Parameters
- ----------
- f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the text column in the dataframe ``f``.
-
- Returns
- -------
- dummies : pandas.DataFrame
- The dataframe containing the dummy variables.
-
- Example
- -------
-
- This function is useful for columns that appear to
- have separate character codes but are consolidated
- into a single column. Here, the column ``c`` is
- transformed into five dummy variables.
-
- === === === === === ===
- c 0_a 1_x 1_b 2_x 2_z
- === === === === === ===
- abz 1 0 1 0 1
- abz 1 0 1 0 1
- axx 1 1 0 1 0
- abz 1 0 1 0 1
- axz 1 1 0 0 1
- === === === === === ===
-
- """
- fc = f[c]
- maxlen = fc.str.len().max()
- fc.fillna(maxlen * BSEP, inplace=True)
- fpad = str().join(['{:', BSEP, '>', str(maxlen), '}'])
- fcpad = fc.apply(fpad.format)
- fcex = fcpad.apply(lambda x: pd.Series(list(x)))
- dummies = pd.get_dummies(fcex)
- return dummies
-
-
-#
-# Function cvectorize
-#
-
-def cvectorize(f, c, n):
- r"""Use the Count Vectorizer and TF-IDF Transformer.
-
- Parameters
- ----------
- f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the text column in the dataframe ``f``.
- n : int
- The number of n-grams.
-
- Returns
- -------
- new_features : sparse matrix
- The transformed features.
-
- References
- ----------
- To use count vectorization and TF-IDF, you can find more
- information here [TFE]_.
-
- .. [TFE] http://scikit-learn.org/stable/modules/feature_extraction.html#text-feature-extraction
-
- """
- fc = f[c]
- fc.fillna(BSEP, inplace=True)
- cvect = CountVectorizer(ngram_range=[1, n], analyzer='char')
- cfeat = cvect.fit_transform(fc)
- tfidf_transformer = TfidfTransformer()
- new_features = tfidf_transformer.fit_transform(cfeat).toarray()
- return new_features
-
-
-#
-# Function apply_treatment
-#
-
-def apply_treatment(fname, df, fparams):
- r"""Apply a treatment function to a column of the dataframe.
+def apply_transform(fname, df, fparams):
+ r"""Apply a transform function to a column of the dataframe.
Parameters
----------
@@ -411,60 +121,62 @@ def apply_treatment(fname, df, fparams):
df : pandas.DataFrame
Dataframe containing the column ``fname``.
fparams : list
- The module, function, and parameter list of the treatment
+ The module, function, and parameter list of the transform
function
Returns
-------
new_features : pandas.DataFrame
- The set of features after applying a treatment function.
+ The set of features after applying a transform function.
"""
- # Extract the treatment parameter list
+ # Extract the transform parameter list
module = fparams[0]
func_name = fparams[1]
plist = fparams[2:]
- # Import the external treatment function
+ # Append to system path
+ sys.path.append(os.getcwd())
+ # Import the external transform function
ext_module = import_module(module)
func = getattr(ext_module, func_name)
# Prepend the parameter list with the data frame and feature name
plist.insert(0, fname)
plist.insert(0, df)
- # Apply the treatment
+ # Apply the transform
logger.info("Applying function %s from module %s to feature %s",
func_name, module, fname)
return func(*plist)
#
-# Function apply_treatments
+# Function apply_transforms
#
-def apply_treatments(model, X):
+def apply_transforms(model, X):
r"""Apply special functions to the original features.
Parameters
----------
model : alphapy.Model
- Model specifications indicating any treatments.
+ Model specifications indicating any transforms.
X : pandas.DataFrame
Combined train and test data, or just prediction data.
Returns
-------
all_features : pandas.DataFrame
- All features, including treatments.
+ All features, including transforms.
Raises
------
IndexError
- The number of treatment rows must match the number of
+ The number of transform rows must match the number of
rows in ``X``.
"""
# Extract model parameters
- treatments = model.specs['treatments']
+ transforms = model.specs['transforms']
# Log input parameters
@@ -473,20 +185,37 @@ def apply_treatments(model, X):
# Iterate through columns, dispatching and transforming each feature.
- logger.info("Applying Treatments")
+ logger.info("Applying transforms")
all_features = X
- for fname in X:
- if treatments and fname in treatments:
- features = apply_treatment(fname, X, treatments[fname])
- if features is not None:
- if features.shape[0] == X.shape[0]:
- all_features = pd.concat([all_features, features], axis=1)
+ if transforms:
+ for fname in transforms:
+ # find feature series
+ fcols = []
+ for col in X.columns:
+ if col.split(LOFF)[0] == fname:
+ fcols.append(col)
+ # get lag values
+ lag_values = []
+ for item in fcols:
+ _, _, _, lag = vparse(item)
+ lag_values.append(lag)
+ # apply transform to the most recent value
+ if lag_values:
+ f_latest = fcols[lag_values.index(min(lag_values))]
+ features = apply_transform(f_latest, X, transforms[fname])
+ if features is not None:
+ if features.shape[0] == X.shape[0]:
+ all_features = pd.concat([all_features, features], axis=1)
+ else:
+ raise IndexError("The number of transform rows [%d] must match X [%d]" %
+ (features.shape[0], X.shape[0]))
else:
- raise IndexError("The number of treatment rows [%d] must match X [%d]" %
- (features.shape[0], X.shape[0]))
+ logger.info("Could not apply transform for feature %s", fname)
else:
- logger.info("Could not apply treatment for feature %s", fname)
+ logger.info("Feature %s is missing for transform", fname)
+ else:
+ logger.info("No transforms Specified")
logger.info("New Feature Count : %d", all_features.shape[1])
@@ -498,15 +227,15 @@ def apply_treatments(model, X):
# Function impute_values
#
-def impute_values(features, dt, sentinel):
+def impute_values(feature, dt, sentinel):
r"""Impute values for a given data type. The *median* strategy
is applied for floating point values, and the *most frequent*
strategy is applied for integer or Boolean values.
Parameters
----------
- features : pandas.DataFrame
- Dataframe containing the features for imputation.
+ feature : pandas.Series or numpy.array
+ The feature for imputation.
dt : str
The values ``'float64'``, ``'int64'``, or ``'bool'``.
sentinel : float
@@ -514,8 +243,8 @@ def impute_values(features, dt, sentinel):
Returns
-------
- imputed_features : numpy array
- The features after imputation.
+ imputed : numpy.array
+ The feature after imputation.
Raises
------
@@ -529,24 +258,31 @@ def impute_values(features, dt, sentinel):
.. [IMP] http://scikit-learn.org/stable/modules/preprocessing.html#imputation
"""
+
try:
- nfeatures = features.shape[1]
+ # for pandas series
+ feature = feature.values.reshape(-1, 1)
except:
- features = features.values.reshape(-1, 1)
+ # for numpy array
+ feature = feature.reshape(-1, 1)
+
if dt == 'float64':
- imp = Imputer(missing_values='NaN', strategy='median', axis=0)
- elif dt == 'int64' or dt == 'bool':
- imp = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
- else:
- raise TypeError("Data Type %s is invalid for imputation" % dt)
- imputed = imp.fit_transform(features)
- if imputed.shape[1] == 0:
- nans = np.isnan(features)
- features[nans] = sentinel
- imputed_features = features
+ logger.info(" Imputation for Data Type %s: Median Strategy" % dt)
+ # replace infinity with imputed value
+ feature[np.isinf(feature)] = np.nan
+ imp = SimpleImputer(missing_values=np.nan, strategy='median')
+ elif dt == 'int64':
+ logger.info(" Imputation for Data Type %s: Most Frequent Strategy" % dt)
+ imp = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
+ elif dt != 'bool':
+ logger.info(" Imputation for Data Type %s: Fill Strategy with %d" % (dt, sentinel))
+ imp = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=sentinel)
else:
- imputed_features = imputed
- return imputed_features
+ logger.info(" No Imputation for Data Type %s" % dt)
+ imp = None
+
+ imputed = imp.fit_transform(feature) if imp else feature
+ return imputed
#
@@ -581,6 +317,8 @@ def get_numerical_features(fnum, fname, df, nvalues, dt,
-------
new_values : numpy array
The set of imputed and transformed features.
+ new_fnames : list
+ The new feature name(s) for the numerical variable.
"""
feature = df[fname]
@@ -593,13 +331,16 @@ def get_numerical_features(fnum, fname, df, nvalues, dt,
# imputer for float, integer, or boolean data types
new_values = impute_values(feature, dt, sentinel)
# log-transform any values that do not fit a normal distribution
+ new_fname = fname
if logt and np.all(new_values > 0):
- stat, pvalue = sps.normaltest(new_values)
+ _, pvalue = sps.normaltest(new_values)
if pvalue <= plevel:
logger.info("Feature %d: %s is not normally distributed [p-value: %f]",
fnum, fname, pvalue)
new_values = np.log(new_values)
- return new_values
+ else:
+ new_fname = USEP.join([new_fname, 'log'])
+ return new_values, [new_fname]
#
@@ -620,6 +361,8 @@ def get_polynomials(features, poly_degree):
-------
poly_features : numpy array
The interaction features only.
+ poly_fnames : list
+ List of polynomial feature names.
References
----------
@@ -632,7 +375,8 @@ def get_polynomials(features, poly_degree):
degree=poly_degree,
include_bias=False)
poly_features = polyf.fit_transform(features)
- return poly_features
+ poly_fnames = polyf.get_feature_names()
+ return poly_features, poly_fnames
#
@@ -662,6 +406,8 @@ def get_text_features(fnum, fname, df, nvalues, vectorize, ngrams_max):
-------
new_features : numpy array
The vectorized or factorized text features.
+ new_fnames : list
+ The new feature name(s) for the numerical variable.
References
----------
@@ -670,8 +416,8 @@ def get_text_features(fnum, fname, df, nvalues, vectorize, ngrams_max):
"""
feature = df[fname]
- min_length = int(feature.str.len().min())
- max_length = int(feature.str.len().max())
+ min_length = int(feature.astype(str).str.len().min())
+ max_length = int(feature.astype(str).str.len().max())
if len(feature) == nvalues:
logger.info("Feature %d: %s is a text feature [%d:%d] with maximum number of values %d",
fnum, fname, min_length, max_length, nvalues)
@@ -683,19 +429,20 @@ def get_text_features(fnum, fname, df, nvalues, vectorize, ngrams_max):
# vectorization creates many columns, otherwise just factorize
if vectorize:
logger.info("Feature %d: %s => Attempting Vectorization", fnum, fname)
- count_vect = CountVectorizer(ngram_range=[1, ngrams_max])
+ vectorizer = TfidfVectorizer(ngram_range=[1, ngrams_max])
try:
- count_feature = count_vect.fit_transform(feature)
- tfidf_transformer = TfidfTransformer()
- new_features = tfidf_transformer.fit_transform(count_feature).todense()
+ new_features = vectorizer.fit_transform(feature)
+ new_fnames = vectorizer.get_feature_names()
logger.info("Feature %d: %s => Vectorization Succeeded", fnum, fname)
except:
logger.info("Feature %d: %s => Vectorization Failed", fnum, fname)
- new_features, uniques = pd.factorize(feature)
+ new_features, _ = pd.factorize(feature)
+ new_fnames = [USEP.join([fname, 'factor'])]
else:
logger.info("Feature %d: %s => Factorization", fnum, fname)
- new_features, uniques = pd.factorize(feature)
- return new_features
+ new_features, _ = pd.factorize(feature)
+ new_fnames = [USEP.join([fname, 'factor'])]
+ return new_features, new_fnames
#
@@ -752,7 +499,6 @@ def create_crosstabs(model):
# Extract model parameters
factors = model.specs['factors']
- target_value = model.specs['target_value']
# Iterate through columns, dispatching and transforming each feature.
@@ -773,16 +519,20 @@ def create_crosstabs(model):
# Function get_factors
#
-def get_factors(model, df, fnum, fname, nvalues, dtype,
- encoder, rounding, sentinel):
+def get_factors(model, X_train, X_test, y_train, fnum, fname,
+ nvalues, dtype, encoder, rounding, sentinel):
r"""Convert the original feature to a factor.
Parameters
----------
model : alphapy.Model
Model object with the feature specifications.
- df : pandas.DataFrame
- Dataframe containing the column ``fname``.
+ X_train : pandas.DataFrame
+ Training dataframe containing the column ``fname``.
+ X_test : pandas.DataFrame
+ Testing dataframe containing the column ``fname``.
+ y_train : pandas.Series
+ Training series for target variable.
fnum : int
Feature number, strictly for logging purposes
fname : str
@@ -802,6 +552,8 @@ def get_factors(model, df, fnum, fname, nvalues, dtype,
-------
all_features : numpy array
The features that have been transformed to factors.
+ all_fnames : list
+ The feature names for the encodings.
"""
@@ -809,65 +561,40 @@ def get_factors(model, df, fnum, fname, nvalues, dtype,
fnum, fname, dtype, nvalues)
logger.info("Encoding: %s", encoder)
- # Extract model data
-
- feature_map = model.feature_map
- model_type = model.specs['model_type']
- target_value = model.specs['target_value']
-
# get feature
- feature = df[fname]
+ feature_train = X_train[fname]
+ feature_test = X_test[fname]
# convert float to factor
if dtype == 'float64':
logger.info("Rounding: %d", rounding)
- feature = feature.apply(float_factor, args=[rounding])
+ feature_train = feature_train.apply(float_factor, args=[rounding])
+ feature_test = feature_test.apply(float_factor, args=[rounding])
+ # create data frames for the feature
+ df_train = pd.DataFrame(feature_train)
+ df_test = pd.DataFrame(feature_test)
# encoders
enc = None
- ef = pd.DataFrame(feature)
- if encoder == Encoders.factorize:
- pd_factors = pd.factorize(feature)[0]
- pd_features = pd.DataFrame(pd_factors)
- elif encoder == Encoders.onehot:
- pd_features = pd.get_dummies(feature)
- elif encoder == Encoders.ordinal:
- enc = ce.OrdinalEncoder(cols=[fname])
- elif encoder == Encoders.binary:
- enc = ce.BinaryEncoder(cols=[fname])
- elif encoder == Encoders.helmert:
- enc = ce.HelmertEncoder(cols=[fname])
- elif encoder == Encoders.sumcont:
- enc = ce.SumEncoder(cols=[fname])
- elif encoder == Encoders.polynomial:
- enc = ce.PolynomialEncoder(cols=[fname])
- elif encoder == Encoders.backdiff:
- enc = ce.BackwardDifferenceEncoder(cols=[fname])
- else:
+ try:
+ enc = encoder_map[encoder](cols=[fname])
+ except:
raise ValueError("Unknown Encoder %s" % encoder)
- # If encoding worked, calculate target percentages for classifiers.
- pd_exists = not pd_features.empty
- enc_exists = enc is not None
- all_features = None
- if pd_exists or enc_exists:
- if pd_exists:
- all_features = pd_features
- elif enc_exists:
- all_features = enc.fit_transform(ef, None)
- # Calculate target percentages for factors
- if (model_type == ModelType.classification and
- fname in feature_map['crosstabs']):
- # Get the crosstab for this feature
- ct = feature_map['crosstabs'][fname]
- # map target percentages to the new feature
- ct_map = ct.to_dict()[target_value]
- ct_feature = df[[fname]].applymap(ct_map.get)
- # impute sentinel for any values that could not be mapped
- ct_feature.fillna(value=sentinel, inplace=True)
- # concatenate all generated features
- all_features = np.column_stack((all_features, ct_feature))
- logger.info("Applied target percentages for %s", fname)
+ # Transform the train and test features.
+ if enc is not None:
+ # fit training features
+ logger.info("Fitting training features for %s", fname)
+ ftrain = enc.fit_transform(df_train, y_train)
+ # fit testing features
+ logger.info("Transforming testing features for %s", fname)
+ ftest = enc.transform(df_test)
+ # get feature names
+ all_fnames = enc.get_feature_names()
+ # concatenate all generated features
+ all_features = np.row_stack((ftrain, ftest))
else:
- raise RuntimeError("Encoding for feature %s failed" % fname)
- return all_features
+ all_features = None
+ all_fnames = None
+ logger.info("Encoding for feature %s failed" % fname)
+ return all_features, all_fnames
#
@@ -889,6 +616,8 @@ def create_numpy_features(base_features, sentinel):
-------
np_features : numpy array
The calculated NumPy features.
+ np_fnames : list
+ The NumPy feature names.
"""
@@ -896,25 +625,27 @@ def create_numpy_features(base_features, sentinel):
# Calculate the total, mean, standard deviation, and variance.
- logger.info("NumPy Feature: sum")
- row_sum = np.sum(base_features, axis=1)
- logger.info("NumPy Feature: mean")
- row_mean = np.mean(base_features, axis=1)
- logger.info("NumPy Feature: standard deviation")
- row_std = np.std(base_features, axis=1)
- logger.info("NumPy Feature: variance")
- row_var = np.var(base_features, axis=1)
+ np_funcs = {'sum' : np.sum,
+ 'mean' : np.mean,
+ 'std' : np.std,
+ 'var' : np.var}
- # Impute, scale, and stack all new features.
+ features = []
+ for k in np_funcs:
+ logger.info("NumPy Feature: %s", k)
+ feature = np_funcs[k](base_features, axis=1)
+ feature = impute_values(feature, 'float64', sentinel)
+ features.append(feature)
- np_features = np.column_stack((row_sum, row_mean, row_std, row_var))
- np_features = impute_values(np_features, 'float64', sentinel)
+ # Stack and scale the new features.
+
+ np_features = np.column_stack(features)
np_features = StandardScaler().fit_transform(np_features)
# Return new NumPy features
logger.info("NumPy Feature Count : %d", np_features.shape[1])
- return np_features
+ return np_features, np_funcs.keys()
#
@@ -936,6 +667,8 @@ def create_scipy_features(base_features, sentinel):
-------
sp_features : numpy array
The calculated SciPy features.
+ sp_fnames : list
+ The SciPy feature names.
"""
@@ -971,7 +704,16 @@ def create_scipy_features(base_features, sentinel):
# Return new SciPy features
logger.info("SciPy Feature Count : %d", sp_features.shape[1])
- return sp_features
+ sp_fnames = ['sp_geometric_mean',
+ 'sp_kurtosis',
+ 'sp_kurtosis_test',
+ 'sp_normal_test',
+ 'sp_skew',
+ 'sp_skew_test',
+ 'sp_variation',
+ 'sp_signal_to_noise',
+ 'sp_standard_error_of_mean']
+ return sp_features, sp_fnames
#
@@ -992,6 +734,8 @@ def create_clusters(features, model):
-------
cfeatures : numpy array
The calculated clusters.
+ cnames : list
+ The cluster feature names.
References
----------
@@ -1008,7 +752,6 @@ def create_clusters(features, model):
cluster_inc = model.specs['cluster_inc']
cluster_max = model.specs['cluster_max']
cluster_min = model.specs['cluster_min']
- n_jobs = model.specs['n_jobs']
seed = model.specs['seed']
# Log model parameters
@@ -1020,6 +763,7 @@ def create_clusters(features, model):
# Generate clustering features
cfeatures = np.zeros((features.shape[0], 1))
+ cnames = []
for i in range(cluster_min, cluster_max+1, cluster_inc):
logger.info("k = %d", i)
km = MiniBatchKMeans(n_clusters=i, random_state=seed)
@@ -1027,12 +771,13 @@ def create_clusters(features, model):
labels = km.predict(features)
labels = labels.reshape(-1, 1)
cfeatures = np.column_stack((cfeatures, labels))
+ cnames.append(USEP.join(['cluster', str(i)]))
cfeatures = np.delete(cfeatures, 0, axis=1)
# Return new clustering features
logger.info("Clustering Feature Count : %d", cfeatures.shape[1])
- return cfeatures
+ return cfeatures, cnames
#
@@ -1053,6 +798,8 @@ def create_pca_features(features, model):
-------
pfeatures : numpy array
The PCA features.
+ pnames : list
+ The PCA feature names.
References
----------
@@ -1081,16 +828,18 @@ def create_pca_features(features, model):
# Generate clustering features
pfeatures = np.zeros((features.shape[0], 1))
+ pnames = []
for i in range(pca_min, pca_max+1, pca_inc):
logger.info("n_components = %d", i)
X_pca = PCA(n_components=i, whiten=pca_whiten).fit_transform(features)
pfeatures = np.column_stack((pfeatures, X_pca))
+ pnames.append(USEP.join(['pca', str(i)]))
pfeatures = np.delete(pfeatures, 0, axis=1)
# Return new clustering features
logger.info("PCA Feature Count : %d", pfeatures.shape[1])
- return pfeatures
+ return pfeatures, pnames
#
@@ -1111,6 +860,8 @@ def create_isomap_features(features, model):
-------
ifeatures : numpy array
The Isomap features.
+ inames : list
+ The Isomap feature names.
Notes
-----
@@ -1144,11 +895,12 @@ def create_isomap_features(features, model):
model = Isomap(n_neighbors=iso_neighbors, n_components=iso_components,
n_jobs=n_jobs)
ifeatures = model.fit_transform(features)
+ inames = [USEP.join(['isomap', str(i+1)]) for i in range(iso_components)]
# Return new Isomap features
logger.info("Isomap Feature Count : %d", ifeatures.shape[1])
- return ifeatures
+ return ifeatures, inames
#
@@ -1169,6 +921,8 @@ def create_tsne_features(features, model):
-------
tfeatures : numpy array
The t-SNE features.
+ tnames : list
+ The t-SNE feature names.
References
----------
@@ -1198,18 +952,19 @@ def create_tsne_features(features, model):
model = TSNE(n_components=tsne_components, perplexity=tsne_perplexity,
learning_rate=tsne_learn_rate, random_state=seed)
tfeatures = model.fit_transform(features)
+ tnames = [USEP.join(['tsne', str(i+1)]) for i in range(tsne_components)]
# Return new T-SNE features
logger.info("T-SNE Feature Count : %d", tfeatures.shape[1])
- return tfeatures
+ return tfeatures, tnames
#
# Function create_features
#
-def create_features(model, X):
+def create_features(model, X, X_train, X_test, y_train):
r"""Create features for the train and test set.
Parameters
@@ -1218,6 +973,12 @@ def create_features(model, X):
Model object with the feature specifications.
X : pandas.DataFrame
Combined train and test data.
+ X_train : pandas.DataFrame
+ Training data.
+ X_test : pandas.DataFrame
+ Testing data.
+ y_train : pandas.DataFrame
+ Target variable for training data.
Returns
-------
@@ -1239,7 +1000,6 @@ def create_features(model, X):
factors = model.specs['factors']
isomap = model.specs['isomap']
logtransform = model.specs['logtransform']
- model_type = model.specs['model_type']
ngrams_max = model.specs['ngrams_max']
numpy_flag = model.specs['numpy']
pca = model.specs['pca']
@@ -1249,7 +1009,6 @@ def create_features(model, X):
scaler = model.specs['scaler_type']
scipy_flag = model.specs['scipy']
sentinel = model.specs['sentinel']
- target_value = model.specs['target_value']
tsne = model.specs['tsne']
vectorize = model.specs['vectorize']
@@ -1258,10 +1017,6 @@ def create_features(model, X):
logger.info("Original Features : %s", X.columns)
logger.info("Feature Count : %d", X.shape[1])
- # Set classification flag
-
- classify = True if model_type == ModelType.classification else False
-
# Count zero and NaN values
if counts_flag:
@@ -1278,27 +1033,35 @@ def create_features(model, X):
logger.info("Creating Base Features")
all_features = np.zeros((X.shape[0], 1))
+ model.feature_names = []
- for i, fc in enumerate(X):
+ for i, fname in enumerate(X):
fnum = i + 1
- dtype = X[fc].dtypes
- nunique = len(X[fc].unique())
+ dtype = X[fname].dtypes
+ nunique = len(X[fname].unique())
# standard processing of numerical, categorical, and text features
- if fc in factors:
- features = get_factors(model, X, fnum, fc, nunique, dtype,
- encoder, rounding, sentinel)
+ if factors and fname in factors:
+ features, fnames = get_factors(model, X_train, X_test, y_train, fnum, fname,
+ nunique, dtype, encoder, rounding, sentinel)
elif dtype == 'float64' or dtype == 'int64' or dtype == 'bool':
- features = get_numerical_features(fnum, fc, X, nunique, dtype,
- sentinel, logtransform, pvalue_level)
+
+ features, fnames = get_numerical_features(fnum, fname, X, nunique, dtype,
+ sentinel, logtransform, pvalue_level)
+ if nunique == 1 and np.isnan(X[fname].unique()):
+ # all nan, features shape is (len, 0), cause Mismatched Features and Names
+ features = np.zeros((X.shape[0], 1))
elif dtype == 'object':
- features = get_text_features(fnum, fc, X, nunique, vectorize, ngrams_max)
+ features, fnames = get_text_features(fnum, fname, X, nunique, vectorize, ngrams_max)
else:
raise TypeError("Base Feature Error with unrecognized type %s" % dtype)
if features.shape[0] == all_features.shape[0]:
+ # add features
all_features = np.column_stack((all_features, features))
+ # add feature names
+ model.feature_names.extend(fnames)
else:
logger.info("Feature %s has the wrong number of rows: %d",
- fc, features.shape[0])
+ fname, features.shape[0])
all_features = np.delete(all_features, 0, axis=1)
logger.info("New Feature Count : %d", all_features.shape[1])
@@ -1322,46 +1085,53 @@ def create_features(model, X):
# Calculate the total, mean, standard deviation, and variance
if numpy_flag:
- np_features = create_numpy_features(base_features, sentinel)
+ np_features, fnames = create_numpy_features(base_features, sentinel)
all_features = np.column_stack((all_features, np_features))
+ model.feature_names.extend(fnames)
logger.info("New Feature Count : %d", all_features.shape[1])
# Generate scipy features
if scipy_flag:
- sp_features = create_scipy_features(base_features, sentinel)
+ sp_features, fnames = create_scipy_features(base_features, sentinel)
all_features = np.column_stack((all_features, sp_features))
+ model.feature_names.extend(fnames)
logger.info("New Feature Count : %d", all_features.shape[1])
# Create clustering features
if clustering:
- cfeatures = create_clusters(base_features, model)
+ cfeatures, fnames = create_clusters(base_features, model)
all_features = np.column_stack((all_features, cfeatures))
+ model.feature_names.extend(fnames)
logger.info("New Feature Count : %d", all_features.shape[1])
# Create PCA features
if pca:
- pfeatures = create_pca_features(base_features, model)
+ pfeatures, fnames = create_pca_features(base_features, model)
all_features = np.column_stack((all_features, pfeatures))
+ model.feature_names.extend(fnames)
logger.info("New Feature Count : %d", all_features.shape[1])
# Create Isomap features
if isomap:
- ifeatures = create_isomap_features(base_features, model)
+ ifeatures, fnames = create_isomap_features(base_features, model)
all_features = np.column_stack((all_features, ifeatures))
+ model.feature_names.extend(fnames)
logger.info("New Feature Count : %d", all_features.shape[1])
# Create T-SNE features
if tsne:
- tfeatures = create_tsne_features(base_features, model)
+ tfeatures, fnames = create_tsne_features(base_features, model)
all_features = np.column_stack((all_features, tfeatures))
+ model.feature_names.extend(fnames)
logger.info("New Feature Count : %d", all_features.shape[1])
# Return all transformed training and test features
+ assert all_features.shape[1] == len(model.feature_names), "Mismatched Features and Names"
return all_features
@@ -1432,6 +1202,11 @@ def select_features(model):
model.X_train = X_train_new
model.X_test = X_test_new
+ # Mask the feature names and test that feature and name lengths are equal
+
+ model.feature_names = list(itertools.compress(model.feature_names, support))
+ assert X_train_new.shape[1] == len(model.feature_names), "Mismatched Features and Names"
+
# Return the modified model
return model
@@ -1508,11 +1283,8 @@ def create_interactions(model, X):
interactions = model.specs['interactions']
isample_pct = model.specs['isample_pct']
model_type = model.specs['model_type']
- n_jobs = model.specs['n_jobs']
poly_degree = model.specs['poly_degree']
predict_mode = model.specs['predict_mode']
- seed = model.specs['seed']
- verbosity = model.specs['verbosity']
# Extract model data
@@ -1543,7 +1315,8 @@ def create_interactions(model, X):
model.feature_map['poly_support'] = support
else:
support = model.feature_map['poly_support']
- pfeatures = get_polynomials(X[:, support], poly_degree)
+ pfeatures, pnames = get_polynomials(X[:, support], poly_degree)
+ model.feature_names.extend(pnames)
logger.info("Polynomial Feature Count : %d", pfeatures.shape[1])
pfeatures = StandardScaler().fit_transform(pfeatures)
all_features = np.hstack((all_features, pfeatures))
@@ -1552,6 +1325,7 @@ def create_interactions(model, X):
logger.info("Skipping Interactions")
# Return all features
+ assert all_features.shape[1] == len(model.feature_names), "Mismatched Features and Names"
return all_features
@@ -1575,7 +1349,16 @@ def drop_features(X, drop):
The dataframe without the dropped features.
"""
- X.drop(drop, axis=1, inplace=True, errors='ignore')
+ drop_cols = []
+ if drop:
+ for d in drop:
+ for col in X.columns:
+ if col.split(LOFF)[0] == d:
+ drop_cols.append(col)
+ logger.info("Dropping Features: %s", drop_cols)
+ logger.info("Original Feature Count : %d", X.shape[1])
+ X.drop(drop_cols, axis=1, inplace=True, errors='ignore')
+ logger.info("Reduced Feature Count : %d", X.shape[1])
return X
@@ -1627,9 +1410,11 @@ def remove_lv_features(model, X):
else:
support = model.feature_map['lv_support']
X_reduced = X[:, support]
+ model.feature_names = list(itertools.compress(model.feature_names, support))
logger.info("Reduced Feature Count : %d", X_reduced.shape[1])
else:
X_reduced = X
logger.info("Skipping Low-Variance Features")
+ assert X_reduced.shape[1] == len(model.feature_names), "Mismatched Features and Names"
return X_reduced
diff --git a/alphapy/frame.py b/alphapy/frame.py
index 8121ef0..0b09c59 100644
--- a/alphapy/frame.py
+++ b/alphapy/frame.py
@@ -27,6 +27,7 @@
#
from alphapy.globals import PSEP, SSEP, USEP
+from alphapy.globals import TAG_ID
import logging
import pandas as pd
@@ -162,9 +163,9 @@ def read_frame(directory, filename, extension, separator,
logger.info("Loading data from %s", file_all)
try:
df = pd.read_csv(file_all, sep=separator, index_col=index_col,
- squeeze=squeeze)
+ squeeze=squeeze, low_memory=False)
except:
- df = None
+ df = pd.DataFrame()
logger.info("Could not find or access %s", file_all)
return df
@@ -174,7 +175,7 @@ def read_frame(directory, filename, extension, separator,
#
def write_frame(df, directory, filename, extension, separator,
- index=False, index_label=None):
+ index=False, index_label=None, columns=None):
r"""Write a dataframe into a delimiter-separated file.
Parameters
@@ -193,6 +194,8 @@ def write_frame(df, directory, filename, extension, separator,
If ``True``, write the row names (index).
index_label : str, optional
A column label for the ``index``.
+ columns : str, optional
+ A list of column names.
Returns
-------
@@ -203,7 +206,8 @@ def write_frame(df, directory, filename, extension, separator,
file_all = SSEP.join([directory, file_only])
logger.info("Writing data frame to %s", file_all)
try:
- df.to_csv(file_all, sep=separator, index=index, index_label=index_label)
+ df.to_csv(file_all, sep=separator, index=index,
+ index_label=index_label, columns=columns)
except:
logger.info("Could not write data frame to %s", file_all)
@@ -227,8 +231,8 @@ def load_frames(group, directory, extension, separator, splits=False):
The delimiter between fields in the file.
splits : bool, optional
If ``True``, then all the members of the group are stored in
- one file. If ``False``, then the data are stored in separate
- files corresponding with each member.
+ separate files corresponding with each member. If ``False``,
+ then the data are stored in a single file.
Returns
-------
@@ -256,17 +260,17 @@ def load_frames(group, directory, extension, separator, splits=False):
logger.info("Load Data Frame %s from file", fname)
df = read_frame(directory, fname, extension, separator)
# add this frame to the consolidated frame list
- if len(df) > 0:
+ if not df.empty:
# set the name
- df.insert(0, 'tag', gn)
+ df.insert(0, TAG_ID, gn)
all_frames.append(df)
else:
- logger.info("Empty Data Frame for: %s", gn)
+ logger.debug("Empty Data Frame for: %s", gn)
else:
# no splits, so use data from consolidated files
fname = frame_name(gname, gspace)
df = read_frame(directory, fname, extension, separator)
- if df is not None:
+ if not df.empty:
all_frames.append(df)
return all_frames
@@ -305,3 +309,56 @@ def dump_frames(group, directory, extension, separator):
write_frame(df, directory, fname, extension, separator, index=True)
else:
logger.info("Data Frame for %s not found", fname)
+
+
+#
+# Function sequence_frame
+#
+
+def sequence_frame(df, target, forecast_period=1, leaders=[], lag_period=1):
+ r"""Create sequences of lagging and leading values.
+
+ Parameters
+ ----------
+ df : pandas.DataFrame
+ The original dataframe.
+ target : str
+ The target variable for prediction.
+ forecast_period : int
+ The period for forecasting the target of the analysis.
+ leaders : list
+ The features that are contemporaneous with the target.
+ lag_period : int
+ The number of lagged rows for prediction.
+
+ Returns
+ -------
+ new_frame : pandas.DataFrame
+ The transformed dataframe with variable sequences.
+
+ """
+
+ # Set Leaders and Laggards
+ le_cols = sorted(leaders)
+ le_len = len(le_cols)
+ df_cols = sorted(list(set(df.columns) - set(le_cols)))
+ df_len = len(df_cols)
+
+ # Add lagged columns
+ new_cols, new_names = list(), list()
+ for i in range(lag_period, 0, -1):
+ new_cols.append(df[df_cols].shift(i))
+ new_names += ['%s[%d]' % (df_cols[j], i) for j in range(df_len)]
+
+ # Preserve leader columns
+ new_cols.append(df[le_cols])
+ new_names += [le_cols[j] for j in range(le_len)]
+
+ # Forecast Target(s)
+ new_cols.append(pd.DataFrame(df[target].shift(1-forecast_period)))
+ new_names.append(target)
+
+ # Collect all columns into new frame
+ new_frame = pd.concat(new_cols, axis=1)
+ new_frame.columns = new_names
+ return new_frame
diff --git a/alphapy/globals.py b/alphapy/globals.py
index 9c26eb4..f473048 100644
--- a/alphapy/globals.py
+++ b/alphapy/globals.py
@@ -4,7 +4,7 @@
# Module : globals
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -58,14 +58,21 @@
#
NULLTEXT = 'NULLTEXT'
+TAG_ID = 'tag'
WILDCARD = '*'
#
# Dictionaries
#
-MULTIPLIERS = {'stock' : 1.0}
+MULTIPLIERS = {'crypto' : 1.0,
+ 'stock' : 1.0}
+#
+# Pandas Time Offset Aliases
+#
+
+PD_INTRADAY_OFFSETS = ['H', 'T', 'min', 'S', 'L', 'ms', 'U', 'us', 'N']
#
# Encoder Types
@@ -83,13 +90,20 @@ class Encoders(Enum):
"""
backdiff = 1
- binary = 2
- factorize = 3
- helmert = 4
- onehot = 5
- ordinal = 6
- polynomial = 7
- sumcont = 8
+ basen = 2
+ binary = 3
+ catboost = 4
+ hashing = 5
+ helmert = 6
+ jstein = 7
+ leaveone = 8
+ mestimate = 9
+ onehot = 10
+ ordinal = 11
+ polynomial = 12
+ sum = 13
+ target = 14
+ woe = 15
#
diff --git a/alphapy/market_flow.py b/alphapy/market_flow.py
index b4e631c..f535d43 100644
--- a/alphapy/market_flow.py
+++ b/alphapy/market_flow.py
@@ -4,7 +4,7 @@
# Module : market_flow
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,18 +22,30 @@
################################################################################
+#
+# Suppress Warnings
+#
+
+import warnings
+warnings.simplefilter(action='ignore', category=DeprecationWarning)
+warnings.simplefilter(action='ignore', category=FutureWarning)
+
+
#
# Imports
#
+print(__doc__)
+
from alphapy.alias import Alias
from alphapy.analysis import Analysis
from alphapy.analysis import run_analysis
-from alphapy.data import get_feed_data
+from alphapy.data import get_market_data
+from alphapy.globals import PD_INTRADAY_OFFSETS
from alphapy.globals import PSEP, SSEP
from alphapy.group import Group
-from alphapy.market_variables import Variable
-from alphapy.market_variables import vmapply
+from alphapy.variables import Variable
+from alphapy.variables import vmapply
from alphapy.model import get_model_config
from alphapy.model import Model
from alphapy.portfolio import gen_portfolio
@@ -47,6 +59,7 @@
import logging
import os
import pandas as pd
+import sys
import yaml
@@ -81,7 +94,7 @@ def get_market_config():
full_path = SSEP.join([PSEP, 'config', 'market.yml'])
with open(full_path, 'r') as ymlfile:
- cfg = yaml.load(ymlfile)
+ cfg = yaml.load(ymlfile, Loader=yaml.FullLoader)
# Store configuration parameters in dictionary
@@ -89,17 +102,40 @@ def get_market_config():
# Section: market [this section must be first]
+ specs['create_model'] = cfg['market']['create_model']
+ fractal = cfg['market']['data_fractal']
+ try:
+ _ = pd.to_timedelta(fractal)
+ except:
+ logger.info("data_fractal [%s] is an invalid pandas offset",
+ fractal)
+ specs['data_fractal'] = fractal
+ specs['data_history'] = cfg['market']['data_history']
specs['forecast_period'] = cfg['market']['forecast_period']
- specs['fractal'] = cfg['market']['fractal']
+ fractal = cfg['market']['fractal']
+ try:
+ test_interval = pd.to_timedelta(fractal)
+ except:
+ logger.info("fractal [%s] is an invalid pandas offset",
+ fractal)
+ specs['fractal'] = fractal
+ specs['lag_period'] = cfg['market']['lag_period']
specs['leaders'] = cfg['market']['leaders']
- specs['data_history'] = cfg['market']['data_history']
specs['predict_history'] = cfg['market']['predict_history']
specs['schema'] = cfg['market']['schema']
+ specs['subschema'] = cfg['market']['subschema']
+ specs['api_key_name'] = cfg['market']['api_key_name']
+ specs['api_key'] = cfg['market']['api_key']
+ specs['subject'] = cfg['market']['subject']
specs['target_group'] = cfg['market']['target_group']
+ # Set API Key environment variable
+ if specs['api_key']:
+ os.environ[specs['api_key_name']] = specs['api_key']
+
# Create the subject/schema/fractal namespace
- sspecs = ['stock', specs['schema'], specs['fractal']]
+ sspecs = [specs['subject'], specs['schema'], specs['fractal']]
space = Space(*sspecs)
# Section: features
@@ -141,8 +177,13 @@ def get_market_config():
# Section: variables
+ logger.info("Defining AlphaPy Variables [phigh, plow]")
+
+ Variable('phigh', 'probability >= 0.7')
+ Variable('plow', 'probability <= 0.3')
+
try:
- logger.info("Defining Variables")
+ logger.info("Defining User Variables")
for k, v in list(cfg['variables'].items()):
Variable(k, v)
except:
@@ -160,13 +201,20 @@ def get_market_config():
# Log the stock parameters
logger.info('MARKET PARAMETERS:')
+ logger.info('api_key = %s', specs['api_key'])
+ logger.info('api_key_name = %s', specs['api_key_name'])
+ logger.info('create_model = %r', specs['create_model'])
+ logger.info('data_fractal = %s', specs['data_fractal'])
+ logger.info('data_history = %d', specs['data_history'])
logger.info('features = %s', specs['features'])
logger.info('forecast_period = %d', specs['forecast_period'])
logger.info('fractal = %s', specs['fractal'])
+ logger.info('lag_period = %d', specs['lag_period'])
logger.info('leaders = %s', specs['leaders'])
- logger.info('data_history = %d', specs['data_history'])
logger.info('predict_history = %s', specs['predict_history'])
logger.info('schema = %s', specs['schema'])
+ logger.info('subject = %s', specs['subject'])
+ logger.info('subschema = %s', specs['subschema'])
logger.info('system = %s', specs['system'])
logger.info('target_group = %s', specs['target_group'])
@@ -205,71 +253,81 @@ def market_pipeline(model, market_specs):
logger.info("Running MarketFlow Pipeline")
- # Get any model specifications
+ # Get model specifications
predict_mode = model.specs['predict_mode']
target = model.specs['target']
- # Get any market specifications
+ # Get market specifications
+ create_model = market_specs['create_model']
data_history = market_specs['data_history']
features = market_specs['features']
forecast_period = market_specs['forecast_period']
+ fractal = market_specs['fractal']
functions = market_specs['functions']
+ lag_period = market_specs['lag_period']
leaders = market_specs['leaders']
predict_history = market_specs['predict_history']
target_group = market_specs['target_group']
- # Get the system specifications
-
- system_specs = market_specs['system']
- if system_specs:
- system_name = system_specs['name']
- try:
- longshort = True
- longentry = system_specs['longentry']
- shortentry = system_specs['shortentry']
- longexit = system_specs['longexit']
- shortexit = system_specs['shortexit']
- holdperiod = system_specs['holdperiod']
- scale = system_specs['scale']
- logger.info("Running Long/Short System %s", system_name)
- except:
- longshort = False
- system_params = system_specs['params']
- logger.info("Running System %s", system_name)
-
# Set the target group
group = Group.groups[target_group]
- logger.info("All Members: %s", group.members)
+ logger.info("All Symbols: %s", group.members)
- # Get stock data
+ # Determine whether or not this is an intraday analysis.
+
+ intraday = any(substring in fractal for substring in PD_INTRADAY_OFFSETS)
+
+ # Get stock data. If we can't get all the data, then
+ # predict_history resets to the actual history obtained.
lookback = predict_history if predict_mode else data_history
- daily = get_feed_data(group, lookback)
+ npoints = get_market_data(model, market_specs, group, lookback, intraday)
+ if npoints > 0:
+ logger.info("Number of Data Points: %d", npoints)
+ else:
+ raise ValueError("Could not get market data from source")
- # Apply the features to all of the frames
+ # Run an analysis to create the model
- vmapply(group, features, functions)
- vmapply(group, [target], functions)
+ if create_model:
+ logger.info("Creating Model")
+ # apply features to all of the frames
+ vmapply(group, features, functions)
+ vmapply(group, [target], functions)
+ # run the analysis, including the model pipeline
+ a = Analysis(model, group)
+ run_analysis(a, lag_period, forecast_period, leaders, predict_history)
+ else:
+ logger.info("No Model (System Only)")
- # Run a system or an analysis
+ # Run a system
+ system_specs = market_specs['system']
if system_specs:
+ # get the system specs
+ system_name = system_specs['name']
+ longentry = system_specs['longentry']
+ shortentry = system_specs['shortentry']
+ longexit = system_specs['longexit']
+ shortexit = system_specs['shortexit']
+ holdperiod = system_specs['holdperiod']
+ scale = system_specs['scale']
+ logger.info("Running System %s", system_name)
+ logger.info("Long Entry : %s", longentry)
+ logger.info("Short Entry : %s", shortentry)
+ logger.info("Long Exit : %s", longexit)
+ logger.info("Short Exit : %s", shortexit)
+ logger.info("Hold Period : %d", holdperiod)
+ logger.info("Scale : %r", scale)
# create and run the system
- if longshort:
- system_ls = System(system_name, longentry, shortentry,
- longexit, shortexit, holdperiod, scale)
- tfs = run_system(model, system_ls, group)
- else:
- tfs = run_system(model, system_name, group, system_params)
+ system = System(system_name, longentry, shortentry,
+ longexit, shortexit, holdperiod, scale)
+ tfs = run_system(model, system, group, intraday)
# generate a portfolio
gen_portfolio(model, system_name, group, tfs)
- else:
- # run the analysis, including the model pipeline
- a = Analysis(model, group)
- results = run_analysis(a, forecast_period, leaders, predict_history)
# Return the completed model
return model
@@ -370,9 +428,7 @@ def main(args=None):
logger.info("Creating directory %s", output_dir)
os.makedirs(output_dir)
- # Create a model from the arguments
-
- logger.info("Creating Model")
+ # Create a model object from the specifications
model = Model(model_specs)
# Start the pipeline
diff --git a/alphapy/model.py b/alphapy/model.py
index 1649970..d093aaf 100644
--- a/alphapy/model.py
+++ b/alphapy/model.py
@@ -4,7 +4,7 @@
# Module : model
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -38,29 +38,34 @@
from alphapy.globals import PSEP, SSEP, USEP
from alphapy.globals import SamplingMethod
from alphapy.globals import Scalers
-from alphapy.utilities import np_store_data
+from alphapy.utilities import get_datestamp
+from alphapy.utilities import most_recent_file
from copy import copy
from datetime import datetime
-import glob
+import itertools
+import joblib
+from keras.models import load_model
import logging
import numpy as np
-import os
import pandas as pd
from sklearn.calibration import CalibratedClassifierCV
-from sklearn.externals import joblib
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import RidgeCV
from sklearn.metrics import accuracy_score
from sklearn.metrics import auc
from sklearn.metrics import average_precision_score
+from sklearn.metrics import balanced_accuracy_score
+from sklearn.metrics import brier_score_loss
from sklearn.metrics import classification_report
+from sklearn.metrics import cohen_kappa_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import explained_variance_score
from sklearn.metrics import f1_score
from sklearn.metrics import log_loss
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
+from sklearn.metrics import mean_squared_log_error
from sklearn.metrics import median_absolute_error
from sklearn.metrics import precision_score
from sklearn.metrics import r2_score
@@ -68,6 +73,7 @@
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve
from sklearn.metrics.cluster import adjusted_rand_score
+from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
import sys
import yaml
@@ -132,9 +138,9 @@ class Model:
stored in ``algolist``.
"""
-
+
# __init__
-
+
def __init__(self,
specs):
# specifications
@@ -155,6 +161,9 @@ def __init__(self,
self.algolist = self.specs['algorithms']
except:
raise KeyError("Model specs must include the key: algorithms")
+ self.best_algo = None
+ # feature names
+ self.feature_names = []
# feature map
self.feature_map = {}
# Key: (algorithm)
@@ -162,12 +171,13 @@ def __init__(self,
self.importances = {}
self.coefs = {}
self.support = {}
+ self.fnames_algo = {}
# Keys: (algorithm, partition)
self.preds = {}
self.probas = {}
# Keys: (algorithm, partition, metric)
self.metrics = {}
-
+
# __str__
def __str__(self):
@@ -208,7 +218,7 @@ def get_model_config():
full_path = SSEP.join([PSEP, 'config', 'model.yml'])
with open(full_path, 'r') as ymlfile:
- cfg = yaml.load(ymlfile)
+ cfg = yaml.load(ymlfile, Loader=yaml.FullLoader)
# Store configuration parameters in dictionary
@@ -308,7 +318,6 @@ def get_model_config():
# Section: model
specs['algorithms'] = cfg['model']['algorithms']
- specs['balance_classes'] = cfg['model']['balance_classes']
specs['cv_folds'] = cfg['model']['cv_folds']
# determine whether or not model type is valid
model_types = {x.name: x.value for x in ModelType}
@@ -358,13 +367,13 @@ def get_model_config():
specs['learning_curve'] = cfg['plots']['learning_curve']
specs['roc_curve'] = cfg['plots']['roc_curve']
- # Section: treatments
+ # Section: transforms
try:
- specs['treatments'] = cfg['treatments']
+ specs['transforms'] = cfg['transforms']
except:
- specs['treatments'] = None
- logger.info("No Treatments Found")
+ specs['transforms'] = None
+ logger.info("No transforms Found")
# Section: xgboost
@@ -374,7 +383,6 @@ def get_model_config():
logger.info('MODEL PARAMETERS:')
logger.info('algorithms = %s', specs['algorithms'])
- logger.info('balance_classes = %s', specs['balance_classes'])
logger.info('calibration = %r', specs['calibration'])
logger.info('cal_type = %s', specs['cal_type'])
logger.info('calibration_plot = %r', specs['calibration'])
@@ -443,7 +451,7 @@ def get_model_config():
logger.info('submit_probas = %r', specs['submit_probas'])
logger.info('target [y] = %s', specs['target'])
logger.info('target_value = %d', specs['target_value'])
- logger.info('treatments = %s', specs['treatments'])
+ logger.info('transforms = %s', specs['transforms'])
logger.info('tsne = %r', specs['tsne'])
logger.info('tsne_components = %d', specs['tsne_components'])
logger.info('tsne_learn_rate = %f', specs['tsne_learn_rate'])
@@ -475,18 +483,22 @@ def load_predictor(directory):
"""
- # Create search path
- search_path = SSEP.join([directory, 'model', 'model_*.pkl'])
+ # Locate the model Pickle or HD5 file
- # Locate the model Pickle file
+ search_dir = SSEP.join([directory, 'model'])
+ file_name = most_recent_file(search_dir, 'model_*.*')
- try:
- # find the latest file
- filename = max(glob.iglob(search_path), key=os.path.getctime)
- logger.info("Loading model predictor from %s", filename)
+ # Load the model from the file
+
+ file_ext = file_name.split(PSEP)[-1]
+ if file_ext == 'pkl' or file_ext == 'h5':
+ logger.info("Loading model predictor from %s", file_name)
# load the model predictor
- predictor = joblib.load(filename)
- except:
+ if file_ext == 'pkl':
+ predictor = joblib.load(file_name)
+ elif file_ext == 'h5':
+ predictor = load_model(file_name)
+ else:
logging.error("Could not find model predictor in %s", search_path)
# Return the model predictor
@@ -521,15 +533,18 @@ def save_predictor(model, timestamp):
# Get the best predictor
predictor = model.estimators['BEST']
- # Create full path name.
-
- filename = 'model_' + timestamp + '.pkl'
- full_path = SSEP.join([directory, 'model', filename])
-
# Save model object
- logger.info("Writing model predictor to %s", full_path)
- joblib.dump(predictor, full_path)
+ if 'KERAS' in model.best_algo:
+ filename = 'model_' + timestamp + '.h5'
+ full_path = SSEP.join([directory, 'model', filename])
+ logger.info("Writing model predictor to %s", full_path)
+ predictor.model.save(full_path)
+ else:
+ filename = 'model_' + timestamp + '.pkl'
+ full_path = SSEP.join([directory, 'model', filename])
+ logger.info("Writing model predictor to %s", full_path)
+ joblib.dump(predictor, full_path)
#
@@ -554,20 +569,17 @@ def load_feature_map(model, directory):
"""
- # Create search path
- search_path = SSEP.join([directory, 'model', 'feature_map_*.pkl'])
-
# Locate the feature map and load it
try:
- # find the latest file
- filename = max(glob.iglob(search_path), key=os.path.getctime)
- logger.info("Loading feature map from %s", filename)
+ search_dir = SSEP.join([directory, 'model'])
+ file_name = most_recent_file(search_dir, 'feature_map_*.pkl')
+ logger.info("Loading feature map from %s", file_name)
# load the feature map
- feature_map = joblib.load(filename)
+ feature_map = joblib.load(file_name)
model.feature_map = feature_map
except:
- logging.error("Could not find feature map in %s", search_path)
+ logging.error("Could not find feature map in %s", search_dir)
# Return the model with the feature map
return model
@@ -609,56 +621,6 @@ def save_feature_map(model, timestamp):
joblib.dump(model.feature_map, full_path)
-#
-# Function get_class_weights
-#
-
-def get_class_weights(model):
- r"""Set the class weights for fitting the model.
-
- Parameters
- ----------
- model : alphapy.Model
- The model object with specifications.
-
- Returns
- -------
- model : alphapy.Model
- The model object with class weights.
-
- """
-
- # Extract model parameters.
-
- balance_classes = model.specs['balance_classes']
- target = model.specs['target']
- target_value = model.specs['target_value']
-
- # Extract model data.
-
- y_train = model.y_train
-
- # Calculate sample weights
-
- sw = None
- if balance_classes:
- logger.info("Getting Class Weights")
- uv, uc = np.unique(y_train, return_counts=True)
- target_index = np.where(uv == target_value)[0][0]
- nontarget_index = np.where(uv != target_value)[0][0]
- weight = uc[nontarget_index] / uc[target_index]
- logger.info("Class Weight for target %s [%r]: %f",
- target, target_value, weight)
- sw = [weight if x==target_value else 1.0 for x in y_train]
- else:
- logger.info("Skipping Class Weights")
-
- # Set weights
-
- model.specs['class_weights'] = sw
- return model
-
-
#
# Function first_fit
#
@@ -694,18 +656,13 @@ def first_fit(model, algo, est):
# Extract model parameters.
+ cv_folds = model.specs['cv_folds']
esr = model.specs['esr']
- model_type = model.specs['model_type']
+ n_jobs = model.specs['n_jobs']
scorer = model.specs['scorer']
seed = model.specs['seed']
split = model.specs['split']
-
- # Initialize class weights.
-
- if model_type == ModelType.classification:
- class_weights = model.specs['class_weights']
- else:
- class_weights = None
+ verbosity = model.specs['verbosity']
# Extract model data.
@@ -714,20 +671,29 @@ def first_fit(model, algo, est):
# Fit the initial model.
- if 'XGB' in algo and scorer in xgb_score_map:
+ algo_xgb = 'XGB' in algo
+
+ if algo_xgb and scorer in xgb_score_map:
X1, X2, y1, y2 = train_test_split(X_train, y_train, test_size=split,
random_state=seed)
eval_set = [(X1, y1), (X2, y2)]
eval_metric = xgb_score_map[scorer]
est.fit(X1, y1, eval_set=eval_set, eval_metric=eval_metric,
early_stopping_rounds=esr)
- elif class_weights and model_type != ModelType.classification:
- est.fit(X_train, y_train, sample_weight=class_weights)
else:
est.fit(X_train, y_train)
- # Store the estimator
+ # Get the initial scores
+
+ logger.info("Cross-Validation")
+ try:
+ scores = cross_val_score(est, X_train, y_train, scoring=scorer, cv=cv_folds,
+ n_jobs=n_jobs, verbose=verbosity)
+ logger.info("Cross-Validation Scores: %s", scores)
+ except:
+ logger.info("Cross-Validation Failed: Try setting number_jobs = 1 in model.yml")
+ # Store the estimator
model.estimators[algo] = est
# Record importances and coefficients if necessary.
@@ -779,13 +745,6 @@ def make_predictions(model, algo, calibrate):
cv_folds = model.specs['cv_folds']
model_type = model.specs['model_type']
- # Initialize class weights.
-
- if model_type == ModelType.classification:
- class_weights = model.specs['class_weights']
- else:
- class_weights = None
-
# Get the estimator
est = model.estimators[algo]
@@ -807,7 +766,7 @@ def make_predictions(model, algo, calibrate):
if calibrate:
logger.info("Calibrating Classifier")
est = CalibratedClassifierCV(est, cv=cv_folds, method=cal_type)
- est.fit(X_train, y_train, sample_weight=class_weights)
+ est.fit(X_train, y_train)
model.estimators[algo] = est
logger.info("Calibration Complete")
else:
@@ -917,6 +876,7 @@ def predict_best(model):
# Record predictions of best estimator
logger.info("Best Model is %s with a %s score of %.4f", best_algo, scorer, best_score)
+ model.best_algo = best_algo
model.estimators[best_tag] = model.estimators[best_algo]
model.preds[(best_tag, Partition.train)] = model.preds[(best_algo, Partition.train)]
model.preds[(best_tag, Partition.test)] = model.preds[(best_algo, Partition.test)]
@@ -1022,7 +982,7 @@ def predict_blend(model):
model.probas[(blend_tag, Partition.test)] = clf.predict_proba(X_blend_test)[:, 1]
else:
alphas = [0.0001, 0.005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5,
- 1.0, 5.0, 10.0, 50.0, 100.0, 500.0, 1000.0]
+ 1.0, 5.0, 10.0, 50.0, 100.0, 500.0, 1000.0]
rcvr = RidgeCV(alphas=alphas, normalize=True, cv=cv_folds)
rcvr.fit(X_blend_train, y_train)
model.estimators[blend_tag] = rcvr
@@ -1101,66 +1061,80 @@ def generate_metrics(model, partition):
for algo in algolist:
# get predictions for the given algorithm
predicted = model.preds[(algo, partition)]
- try:
- model.metrics[(algo, partition, 'accuracy')] = accuracy_score(expected, predicted)
- except:
- logger.info("Accuracy Score not calculated")
- try:
- model.metrics[(algo, partition, 'adjusted_rand_score')] = adjusted_rand_score(expected, predicted)
- except:
- logger.info("Adjusted Rand Index not calculated")
- try:
- model.metrics[(algo, partition, 'confusion_matrix')] = confusion_matrix(expected, predicted)
- except:
- logger.info("Confusion Matrix not calculated")
- try:
- model.metrics[(algo, partition, 'explained_variance')] = explained_variance_score(expected, predicted)
- except:
- logger.info("Explained Variance Score not calculated")
- try:
- model.metrics[(algo, partition, 'f1')] = f1_score(expected, predicted)
- except:
- logger.info("F1 Score not calculated")
- try:
- model.metrics[(algo, partition, 'mean_absolute_error')] = mean_absolute_error(expected, predicted)
- except:
- logger.info("Mean Absolute Error not calculated")
- try:
- model.metrics[(algo, partition, 'median_absolute_error')] = median_absolute_error(expected, predicted)
- except:
- logger.info("Median Absolute Error not calculated")
- try:
- model.metrics[(algo, partition, 'neg_mean_squared_error')] = mean_squared_error(expected, predicted)
- except:
- logger.info("Mean Squared Error not calculated")
- try:
- model.metrics[(algo, partition, 'precision')] = precision_score(expected, predicted)
- except:
- logger.info("Precision Score not calculated")
- try:
- model.metrics[(algo, partition, 'r2')] = r2_score(expected, predicted)
- except:
- logger.info("R-Squared Score not calculated")
- try:
- model.metrics[(algo, partition, 'recall')] = recall_score(expected, predicted)
- except:
- logger.info("Recall Score not calculated")
- # Probability-Based Metrics
+ # classification metrics
if model_type == ModelType.classification:
- predicted = model.probas[(algo, partition)]
+ probas = model.probas[(algo, partition)]
try:
- model.metrics[(algo, partition, 'average_precision')] = average_precision_score(expected, predicted)
+ model.metrics[(algo, partition, 'accuracy')] = accuracy_score(expected, predicted)
+ except:
+ logger.info("Accuracy Score not calculated")
+ try:
+ model.metrics[(algo, partition, 'average_precision')] = average_precision_score(expected, probas)
except:
logger.info("Average Precision Score not calculated")
try:
- model.metrics[(algo, partition, 'neg_log_loss')] = log_loss(expected, predicted)
+ model.metrics[(algo, partition, 'balanced_accuracy')] = balanced_accuracy_score(expected, predicted)
+ except:
+ logger.info("Accuracy Score not calculated")
+ try:
+ model.metrics[(algo, partition, 'brier_score_loss')] = brier_score_loss(expected, probas)
+ except:
+ logger.info("Brier Score not calculated")
+ try:
+ model.metrics[(algo, partition, 'cohen_kappa')] = cohen_kappa_score(expected, predicted)
+ except:
+ logger.info("Cohen's Kappa Score not calculated")
+ try:
+ model.metrics[(algo, partition, 'confusion_matrix')] = confusion_matrix(expected, predicted)
+ except:
+ logger.info("Confusion Matrix not calculated")
+ try:
+ model.metrics[(algo, partition, 'f1')] = f1_score(expected, predicted)
+ except:
+ logger.info("F1 Score not calculated")
+ try:
+ model.metrics[(algo, partition, 'neg_log_loss')] = log_loss(expected, probas)
except:
logger.info("Log Loss not calculated")
try:
- fpr, tpr, _ = roc_curve(expected, predicted)
+ model.metrics[(algo, partition, 'precision')] = precision_score(expected, predicted)
+ except:
+ logger.info("Precision Score not calculated")
+ try:
+ model.metrics[(algo, partition, 'recall')] = recall_score(expected, predicted)
+ except:
+ logger.info("Recall Score not calculated")
+ try:
+ fpr, tpr, _ = roc_curve(expected, probas)
model.metrics[(algo, partition, 'roc_auc')] = auc(fpr, tpr)
except:
logger.info("ROC AUC Score not calculated")
+ # regression metrics
+ elif model_type == ModelType.regression:
+ try:
+ model.metrics[(algo, partition, 'explained_variance')] = explained_variance_score(expected, predicted)
+ except:
+ logger.info("Explained Variance Score not calculated")
+ try:
+ model.metrics[(algo, partition, 'neg_mean_absolute_error')] = mean_absolute_error(expected, predicted)
+ except:
+ logger.info("Mean Absolute Error not calculated")
+ try:
+ model.metrics[(algo, partition, 'neg_median_absolute_error')] = median_absolute_error(expected, predicted)
+ except:
+ logger.info("Median Absolute Error not calculated")
+ try:
+ model.metrics[(algo, partition, 'neg_mean_squared_error')] = mean_squared_error(expected, predicted)
+ except:
+ logger.info("Mean Squared Error not calculated")
+ try:
+ model.metrics[(algo, partition, 'neg_mean_squared_log_error')] = mean_squared_log_error(expected, predicted)
+ except:
+ logger.info("Mean Squared Log Error not calculated")
+ try:
+ model.metrics[(algo, partition, 'r2')] = r2_score(expected, predicted)
+ except:
+ logger.info("R-Squared Score not calculated")
# log the metrics for each algorithm
for algo in model.algolist:
logger.info('-'*80)
@@ -1209,10 +1183,7 @@ def save_predictions(model, tag, partition):
separator = model.specs['separator']
# Get date stamp to record file creation
-
- d = datetime.now()
- f = "%Y%m%d"
- timestamp = d.strftime(f)
+ timestamp = get_datestamp()
# Specify input and output directories
@@ -1220,7 +1191,10 @@ def save_predictions(model, tag, partition):
output_dir = SSEP.join([directory, 'output'])
# Read the prediction frame
- pf = read_frame(input_dir, datasets[partition], extension, separator)
+ file_spec = ''.join([datasets[partition], '*'])
+ file_name = most_recent_file(input_dir, file_spec)
+ file_name = file_name.split(SSEP)[-1].split(PSEP)[0]
+ pf = read_frame(input_dir, file_name, extension, separator)
# Cull records before the prediction date
@@ -1232,16 +1206,20 @@ def save_predictions(model, tag, partition):
if found_pdate:
pd_indices = pf[pf.date >= predict_date].index.tolist()
- pf = pf.ix[pd_indices]
+ pf = pf.iloc[pd_indices]
+ else:
+ pd_indices = pf.index.tolist()
# Save predictions for all projects
logger.info("Saving Predictions")
output_file = USEP.join(['predictions', timestamp])
- preds = model.preds[(tag, partition)]
+ preds = model.preds[(tag, partition)].squeeze()
if found_pdate:
preds = np.take(preds, pd_indices)
- np_store_data(preds, output_dir, output_file, extension, separator)
+ pred_series = pd.Series(preds, index=pd_indices)
+ df_pred = pd.DataFrame(pred_series, columns=['prediction'])
+ write_frame(df_pred, output_dir, output_file, extension, separator)
# Save probabilities for classification projects
@@ -1249,17 +1227,19 @@ def save_predictions(model, tag, partition):
if model_type == ModelType.classification:
logger.info("Saving Probabilities")
output_file = USEP.join(['probabilities', timestamp])
- probas = model.probas[(tag, partition)]
+ probas = model.probas[(tag, partition)].squeeze()
if found_pdate:
probas = np.take(probas, pd_indices)
- np_store_data(probas, output_dir, output_file, extension, separator)
+ prob_series = pd.Series(probas, index=pd_indices)
+ df_prob = pd.DataFrame(prob_series, columns=['probability'])
+ write_frame(df_prob, output_dir, output_file, extension, separator)
# Save ranked predictions
logger.info("Saving Ranked Predictions")
- pf['prediction'] = pd.Series(preds, index=pf.index)
+ pf['prediction'] = pred_series
if model_type == ModelType.classification:
- pf['probability'] = pd.Series(probas, index=pf.index)
+ pf['probability'] = prob_series
pf.sort_values('probability', ascending=False, inplace=True)
else:
pf.sort_values('prediction', ascending=False, inplace=True)
diff --git a/alphapy/optimize.py b/alphapy/optimize.py
index 8d4d7ed..61f379f 100644
--- a/alphapy/optimize.py
+++ b/alphapy/optimize.py
@@ -4,7 +4,7 @@
# Module : optimize
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,9 +29,9 @@
from alphapy.globals import ModelType
from datetime import datetime
+import itertools
import logging
import numpy as np
-from sklearn.feature_selection import RFE
from sklearn.feature_selection import RFECV
from sklearn.feature_selection import SelectPercentile
from sklearn.model_selection import GridSearchCV
@@ -68,10 +68,6 @@ def rfecv_search(model, algo):
The model object with the RFE support vector and the best
estimator.
- See Also
- --------
- rfe_search
-
Notes
-----
If a scoring function is available, then AlphaPy can perform RFE
@@ -95,6 +91,7 @@ def rfecv_search(model, algo):
# Extract model parameters.
cv_folds = model.specs['cv_folds']
+ n_jobs = model.specs['n_jobs']
rfe_step = model.specs['rfe_step']
scorer = model.specs['scorer']
verbosity = model.specs['verbosity']
@@ -104,7 +101,7 @@ def rfecv_search(model, algo):
logger.info("Recursive Feature Elimination with CV")
rfecv = RFECV(estimator, step=rfe_step, cv=cv_folds,
- scoring=scorer, verbose=verbosity)
+ scoring=scorer, verbose=verbosity, n_jobs=n_jobs)
start = time()
selector = rfecv.fit(X_train, y_train)
logger.info("RFECV took %.2f seconds for step %d and %d folds",
@@ -112,86 +109,20 @@ def rfecv_search(model, algo):
logger.info("Algorithm: %s, Selected Features: %d, Ranking: %s",
algo, selector.n_features_, selector.ranking_)
- # Record the new estimator and support vector
+ # Record the new estimator, support vector, feature names, and importances
- model.estimators[algo] = selector.estimator_
+ best_estimator = selector.estimator_
+ model.estimators[algo] = best_estimator
model.support[algo] = selector.support_
+ model.fnames_algo[algo] = list(itertools.compress(model.fnames_algo[algo], selector.support_))
+ if hasattr(best_estimator, "feature_importances_"):
+ model.importances[algo] = best_estimator.feature_importances_
# Return the model with the support vector
return model
-#
-# Function rfe_search
-#
-
-def rfe_search(model, algo):
- r"""Return the best feature set using recursive feature elimination.
-
- Parameters
- ----------
- model : alphapy.Model
- The model object with RFE parameters.
- algo : str
- Abbreviation of the algorithm to run.
-
- Returns
- -------
- model : alphapy.Model
- The model object with the RFE support vector and the best
- estimator.
-
- See Also
- --------
- rfecv_search
-
- Notes
- -----
- If a scoring function is available, then AlphaPy can perform RFE
- with Cross-Validation (CV); otherwise, it just does RFE without CV,
- as in this function.
-
- References
- ----------
- For more information about Recursive Feature Elimination,
- refer to [RFE]_.
-
- .. [RFE] http://scikit-learn.org/stable/modules/feature_selection.html#recursive-feature-elimination
-
- """
-
- # Extract model data.
-
- X_train = model.X_train
- y_train = model.y_train
-
- # Extract model parameters.
-
- rfe_step = model.specs['rfe_step']
- verbosity = model.specs['verbosity']
- estimator = model.estimators[algo]
-
- # Perform Recursive Feature Elimination
-
- logger.info("Recursive Feature Elimination")
- rfe = RFE(estimator, step=rfe_step, verbose=verbosity)
- start = time()
- selector = rfe.fit(X_train, y_train)
- logger.info("RFE took %.2f seconds for step %d",
- (time() - start), rfe_step)
- logger.info("Algorithm: %s, Selected Features: %d, Ranking: %s",
- algo, selector.n_features_, selector.ranking_)
-
- # Record the new estimator and support vector
-
- model.estimators[algo] = selector.estimator_
- model.support[algo] = selector.support_
-
- # Return the model with the support vector
- return model
-
-
#
# Function grid_report
#
diff --git a/alphapy/plots.py b/alphapy/plots.py
index 916c7d4..dc91f56 100644
--- a/alphapy/plots.py
+++ b/alphapy/plots.py
@@ -4,7 +4,7 @@
# Module : plots
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -63,10 +63,11 @@
from alphapy.utilities import remove_list_items
from bokeh.plotting import figure, show, output_file
-from itertools import cycle
-from itertools import product
+import itertools
import logging
import math
+import matplotlib
+matplotlib.use('PS')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
@@ -74,9 +75,8 @@
from scipy import interp
import seaborn as sns
from sklearn.calibration import calibration_curve
-from sklearn.ensemble.partial_dependence import partial_dependence
-from sklearn.ensemble.partial_dependence import plot_partial_dependence
-from sklearn.learning_curve import validation_curve
+from sklearn.inspection import partial_dependence
+from sklearn.inspection import plot_partial_dependence
from sklearn.metrics import auc
from sklearn.metrics import confusion_matrix
from sklearn.metrics import roc_curve
@@ -84,6 +84,8 @@
from sklearn.model_selection import learning_curve
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import train_test_split
+from sklearn.model_selection import validation_curve
+from sklearn.utils.multiclass import unique_labels
#
@@ -387,36 +389,44 @@ def plot_importance(model, partition):
plot_dir = get_plot_directory(model)
pstring = datasets[partition]
- # Get X, Y for correct partition
-
- X, y = get_partition_data(model, partition)
-
# For each algorithm that has importances, generate the plot.
- n_top = 10
+ n_top = 20
+
for algo in model.algolist:
logger.info("Feature Importances for Algorithm: %s", algo)
try:
- importances = model.importances[algo]
- # forest was input parameter
+ # get feature importances
+ importances = np.array(model.importances[algo])
+ imp_flag = True
+ except:
+ imp_flag = False
+ if imp_flag:
+ # sort the importances by index
indices = np.argsort(importances)[::-1]
+ # get feature names
+ feature_names = np.array(model.fnames_algo[algo])
+ n_features = len(feature_names)
# log the feature ranking
logger.info("Feature Ranking:")
- for f in range(n_top):
- logger.info("%d. Feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))
+ n_min = min(n_top, n_features)
+ for i in range(n_min):
+ logger.info("%d. %s (%f)" % (i + 1,
+ feature_names[indices[i]],
+ importances[indices[i]]))
# plot the feature importances
title = BSEP.join([algo, "Feature Importances [", pstring, "]"])
- plt.style.use('classic')
plt.figure()
plt.title(title)
- plt.bar(list(range(n_top)), importances[indices][:n_top], color="b", align="center")
- plt.xticks(list(range(n_top)), indices[:n_top])
- plt.xlim([-1, n_top])
+ plt.barh(range(n_min), importances[indices][:n_min][::-1])
+ plt.yticks(range(n_min), feature_names[indices][:n_min][::-1])
+ plt.ylim([-1, n_min])
+ plt.xlabel('Relative Importance')
# save the plot
tag = USEP.join([pstring, algo])
write_plot('matplotlib', plt, 'feature_importance', tag, plot_dir)
- except:
- logger.info("%s does not have feature importances", algo)
+ else:
+ logger.info("No Feature Importances for %s" % algo)
#
@@ -468,7 +478,7 @@ def plot_learning_curve(model, partition):
cv = StratifiedKFold(n_splits=cv_folds, shuffle=shuffle, random_state=seed)
- # Plot a learning curve for each algorithm.
+ # Plot a learning curve for each algorithm.
ylim = (0.4, 1.01)
@@ -554,15 +564,12 @@ def plot_roc_curve(model, partition):
plt.style.use('classic')
plt.figure()
- colors = cycle(['cyan', 'indigo', 'seagreen', 'yellow', 'blue', 'darkorange'])
lw = 2
# Plot a ROC Curve for each algorithm.
for algo in model.algolist:
logger.info("ROC Curve for Algorithm: %s", algo)
- # get estimator
- estimator = model.estimators[algo]
# compute ROC curve and ROC area for each class
probas = model.probas[(algo, partition)]
fpr, tpr, _ = roc_curve(y, probas)
@@ -620,45 +627,64 @@ def plot_confusion_matrix(model, partition):
return None
# Get X, Y for correct partition.
-
X, y = get_partition_data(model, partition)
+ # Plot Parameters
+ np.set_printoptions(precision=2)
+ cmap = plt.cm.Blues
+ fmt = '.2f'
+
+ # Generate a Confusion Matrix for each algorithm
+
for algo in model.algolist:
logger.info("Confusion Matrix for Algorithm: %s", algo)
+
# get predictions for this partition
y_pred = model.preds[(algo, partition)]
+
# compute confusion matrix
cm = confusion_matrix(y, y_pred)
logger.info('Confusion Matrix:')
logger.info('%s', cm)
+
+ # normalize confusion matrix
+ cm_pct = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
+
# initialize plot
- np.set_printoptions(precision=2)
- plt.style.use('classic')
- plt.figure()
- # plot the confusion matrix
- cmap = plt.cm.Blues
- plt.imshow(cm, interpolation='nearest', cmap=cmap)
- title = BSEP.join([algo, "Confusion Matrix [", pstring, "]"])
+ _, ax = plt.subplots()
+
+ # set the title of the confusion matrix
+ title = algo + " Confusion Matrix: " + pstring + " [" + str(np.sum(cm)) + "]"
plt.title(title)
- plt.colorbar()
- # set up x and y axes
- y_values, y_counts = np.unique(y, return_counts=True)
- tick_marks = np.arange(len(y_values))
- plt.xticks(tick_marks, y_values, rotation=45)
- plt.yticks(tick_marks, y_values)
- # normalize confusion matrix
- cmn = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
- # place text in square of confusion matrix
- thresh = (cm.max() + cm.min()) / 2.0
- for i, j in product(list(range(cm.shape[0])), list(range(cm.shape[1]))):
- cmr = round(cmn[i, j], 3)
- plt.text(j, i, cmr,
- horizontalalignment="center",
- color="white" if cm[i, j] > thresh else "black")
- # labels
- plt.tight_layout()
- plt.ylabel('True Label')
- plt.xlabel('Predicted Label')
+
+ # only use the labels that appear in the data
+ classes = unique_labels(y, y_pred)
+
+ # show all ticks
+ ax.set(xticks=np.arange(cm.shape[1]),
+ yticks=np.arange(cm.shape[0]),
+ xticklabels=classes, yticklabels=classes,
+ title=title,
+ ylabel='True Label',
+ xlabel='Predicted Label')
+
+ # rotate the tick labels and set their alignment
+ plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
+ rotation_mode="anchor")
+
+ # loop over data dimensions and create text annotations
+ thresh = (cm_pct.max() + cm_pct.min()) / 2.0
+ for i in range(cm.shape[0]):
+ for j in range(cm.shape[1]):
+ cm_text = format(cm_pct[i, j], fmt) + " [" + str(cm[i, j]) + "]"
+ ax.text(j, i, cm_text,
+ ha="center", va="center",
+ color="white" if cm_pct[i, j] >= thresh else "black")
+
+ # show the color bar
+ im = ax.imshow(cm_pct, interpolation='nearest', cmap=cmap)
+ ax.figure.colorbar(im, ax=ax)
+
# save the chart
tag = USEP.join([pstring, algo])
write_plot('matplotlib', plt, 'confusion', tag, plot_dir)
@@ -714,7 +740,7 @@ def plot_validation_curve(model, partition, pname, prange):
alpha = 0.2
# Calculate a validation curve for each algorithm.
-
+
for algo in model.algolist:
logger.info("Algorithm: %s", algo)
# get estimator
diff --git a/alphapy/portfolio.py b/alphapy/portfolio.py
index 767f245..8343222 100644
--- a/alphapy/portfolio.py
+++ b/alphapy/portfolio.py
@@ -4,7 +4,7 @@
# Module : portfolio
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -437,7 +437,7 @@ def valuate_position(position, tdate):
# get current price
pdata = position.pdata
if tdate in pdata.index:
- cp = float(pdata.ix[tdate]['close'])
+ cp = float(pdata.loc[tdate]['close'])
# start valuation
multiplier = position.multiplier
netpos = 0
@@ -524,7 +524,7 @@ def close_position(p, position, tdate):
tradesize = -pq
position.date = tdate
pdata = position.pdata
- cp = pdata.ix[tdate]['close']
+ cp = pdata.loc[tdate]['close']
newtrade = Trade(position.name, tradesize, cp, tdate)
p = update_portfolio(p, position, newtrade)
position.quantity = 0
@@ -719,7 +719,7 @@ def balance(p, tdate, cashlevel):
estr = '.'.join('pos', weightby)
bdata[i] = eval(estr)
else:
- bdata[i] = pos.pdata.ix[tdate][weightby]
+ bdata[i] = pos.pdata.loc[tdate][weightby]
if invert:
bweights = (2 * bdata.mean() - bdata) / sum(bdata)
else:
@@ -728,7 +728,7 @@ def balance(p, tdate, cashlevel):
for i, pos in enumerate(positions):
multiplier = pos.multiplier
bdelta = bweights[i] * pvalue - pos.value
- cp = pos.pdata.ix[tdate]['close']
+ cp = pos.pdata.loc[tdate]['close']
tradesize = math.trunc(bdelta / cp)
ntv = abs(tradesize) * cp * multiplier
if tradesize > 0:
@@ -792,7 +792,7 @@ def kick_out(p, tdate):
estr = '.'.join('pos', koby)
kovalue[i] = eval(estr)
else:
- kovalue[i] = pos.pdata.ix[tdate][koby]
+ kovalue[i] = pos.pdata.loc[tdate][koby]
koorder = np.argsort(np.argsort(kovalues))
if descending:
koorder = [i for i in reversed(koorder)]
@@ -985,7 +985,7 @@ def exec_trade(p, name, order, quantity, price, tdate):
else:
if order == Orders.le or order == Orders.se:
pf = Frame.frames[frame_name(name, p.space)].df
- cv = float(pf.ix[tdate][p.posby])
+ cv = float(pf.loc[tdate][p.posby])
tsize = math.trunc((p.value * p.fixedfrac) / cv)
if quantity < 0:
tsize = -tsize
@@ -1101,7 +1101,7 @@ def gen_portfolio(model, system, group, tframe,
for d in drange:
# process today's trades
if d in trange:
- trades = tframe.ix[d]
+ trades = tframe.loc[d]
if isinstance(trades, Series):
trades = DataFrame(trades).transpose()
for t in trades.iterrows():
@@ -1114,7 +1114,7 @@ def gen_portfolio(model, system, group, tframe,
logger.info("Trade could not be executed for %s", row['name'])
# iterate through current positions
positions = p.positions
- pfrow = pf.ix[d]
+ pfrow = pf.loc[d]
for key in positions:
pos = positions[key]
if pos.quantity > 0:
@@ -1135,7 +1135,7 @@ def gen_portfolio(model, system, group, tframe,
logger.info("Recording Returns Frame")
rspace = Space(system, 'returns', gspace.fractal)
- rf = DataFrame.from_items(rs, orient='index', columns=['return'])
+ rf = DataFrame.from_dict(dict(rs), orient='index', columns=['return'])
rfname = frame_name(gname, rspace)
write_frame(rf, system_dir, rfname, extension, separator,
index=True, index_label='date')
@@ -1154,7 +1154,7 @@ def gen_portfolio(model, system, group, tframe,
logger.info("Recording Transactions Frame")
tspace = Space(system, 'transactions', gspace.fractal)
- tf = DataFrame.from_items(ts, orient='index', columns=['amount', 'price', 'symbol'])
+ tf = DataFrame.from_dict(dict(ts), orient='index', columns=['amount', 'price', 'symbol'])
tfname = frame_name(gname, tspace)
write_frame(tf, system_dir, tfname, extension, separator,
index=True, index_label='date')
diff --git a/alphapy/sport_flow.py b/alphapy/sport_flow.py
index e6d74c4..3d693d7 100644
--- a/alphapy/sport_flow.py
+++ b/alphapy/sport_flow.py
@@ -4,7 +4,7 @@
# Module : sport_flow
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +22,15 @@
################################################################################
+#
+# Suppress Warnings
+#
+
+import warnings
+warnings.simplefilter(action='ignore', category=DeprecationWarning)
+warnings.simplefilter(action='ignore', category=FutureWarning)
+
+
#
# Imports
#
@@ -48,6 +57,7 @@
import numpy as np
import os
import pandas as pd
+import sys
import yaml
@@ -153,7 +163,7 @@ def get_sport_config():
full_path = SSEP.join(['.', 'config', 'sport.yml'])
with open(full_path, 'r') as ymlfile:
- cfg = yaml.load(ymlfile)
+ cfg = yaml.load(ymlfile, Loader=yaml.FullLoader)
# Store configuration parameters in dictionary
@@ -780,7 +790,7 @@ def main(args=None):
# Generate a frame for each season
gf = df[df['season'] == season]
- gf = gf.reset_index(level=0)
+ gf = gf.reset_index()
# Generate derived variables for the game frame
@@ -790,6 +800,9 @@ def main(args=None):
gf['away.score'] = np.random.randint(points_min, points_max, total_games)
gf['total_points'] = gf['home.score'] + gf['away.score']
+ # gf['line_delta'] = gf['line'] - gf['line_open']
+ # gf['over_under_delta'] = gf['over_under'] - gf['over_under_open']
+
gf = add_features(gf, game_dict, gf.shape[0])
for index, row in gf.iterrows():
gf['point_margin_game'].at[index] = get_point_margin(row, 'home.score', 'away.score')
@@ -810,7 +823,7 @@ def main(args=None):
team_frame = USEP.join([league, team.lower(), series, str(season)])
logger.info("Generating team frame: %s", team_frame)
tf = get_team_frame(gf, team, home_team, away_team)
- tf = tf.reset_index(level=0)
+ tf = tf.reset_index()
tf = generate_team_frame(team, tf, home_team, away_team, window)
team_frames[team_frame] = tf
@@ -853,7 +866,6 @@ def main(args=None):
mpos = np.where((mf[away_team] == key_team) & (mf['date'] == key_date))[0][0]
except:
raise IndexError("Team/Date Key not found in Model Frame")
- # print team, gindex, mpos
# insert team data into model row
mf = insert_model_data(mf, mpos, mdict, tf, index, team1_prefix if at_home else team2_prefix)
diff --git a/alphapy/system.py b/alphapy/system.py
index 3f53940..f9a5562 100644
--- a/alphapy/system.py
+++ b/alphapy/system.py
@@ -4,7 +4,7 @@
# Module : system
# Created : July 11, 2013
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,14 +28,18 @@
from alphapy.frame import Frame
from alphapy.frame import frame_name
+from alphapy.frame import read_frame
from alphapy.frame import write_frame
from alphapy.globals import Orders
-from alphapy.globals import SSEP
-from alphapy.market_variables import vexec
+from alphapy.globals import BSEP, SSEP
+from alphapy.variables import vexec
from alphapy.space import Space
from alphapy.portfolio import Trade
+from alphapy.utilities import most_recent_file
import logging
+import numbers
+import pandas as pd
from pandas import DataFrame
@@ -131,24 +135,24 @@ def __str__(self):
#
-# Function long_short
+# Function trade_system
#
-def long_short(system, name, space, quantity):
- r"""Run a long/short system.
-
- A long/short system is always in the market. At any given
- time, either a long position is active, or a short position
- is active.
+def trade_system(model, system, space, intraday, name, quantity):
+ r"""Trade the given system.
Parameters
----------
+ model : alphapy.Model
+ The model object with specifications.
system : alphapy.System
The long/short system to run.
- name : str
- The symbol to trade.
space : alphapy.Space
Namespace of instrument prices.
+ intraday : bool
+ If True, then run an intraday system.
+ name : str
+ The symbol to trade.
quantity : float
The amount of the ``name`` to trade, e.g., number of shares
@@ -163,48 +167,76 @@ def long_short(system, name, space, quantity):
All of the data frames containing price data.
"""
- # extract the system parameters
+
+ # Unpack the model data.
+
+ directory = model.specs['directory']
+ extension = model.specs['extension']
+ separator = model.specs['separator']
+
+ # Unpack the system parameters.
+
longentry = system.longentry
shortentry = system.shortentry
longexit = system.longexit
shortexit = system.shortexit
holdperiod = system.holdperiod
scale = system.scale
- # price frame
+
+ # Determine whether or not this is a model-driven system.
+
+ entries_and_exits = [longentry, shortentry, longexit, shortexit]
+ active_signals = [x for x in entries_and_exits if x is not None]
+ use_model = False
+ for signal in active_signals:
+ if any(x in signal for x in ['phigh', 'plow']):
+ use_model = True
+
+ # Read in the price frame
pf = Frame.frames[frame_name(name, space)].df
- # initialize the trade list
- tradelist = []
- # evaluate the long and short events
- if longentry:
- vexec(pf, longentry)
- if shortentry:
- vexec(pf, shortentry)
- if longexit:
- vexec(pf, longexit)
- if shortexit:
- vexec(pf, shortexit)
- # generate trade file
+
+ # Use model output probabilities as input to the system
+
+ if use_model:
+ # get latest probabilities file
+ probs_dir = SSEP.join([directory, 'output'])
+ file_path = most_recent_file(probs_dir, 'probabilities*')
+ file_name = file_path.split(SSEP)[-1].split('.')[0]
+ # read the probabilities frame and trim the price frame
+ probs_frame = read_frame(probs_dir, file_name, extension, separator)
+ pf = pf[-probs_frame.shape[0]:]
+ probs_frame.index = pf.index
+ probs_frame.columns = ['probability']
+ # add probability column to price frame
+ pf = pd.concat([pf, probs_frame], axis=1)
+
+ # Evaluate the long and short events in the price frame
+
+ for signal in active_signals:
+ vexec(pf, signal)
+
+ # Initialize trading state variables
+
inlong = False
inshort = False
h = 0
p = 0
q = quantity
+ tradelist = []
+
+ # Loop through prices and generate trades
+
for dt, row in pf.iterrows():
- # evaluate entry and exit conditions
- lerow = None
- if longentry:
- lerow = row[longentry]
- serow = None
- if shortentry:
- serow = row[shortentry]
- lxrow = None
- if longexit:
- lxrow = row[longexit]
- sxrow = None
- if shortexit:
- sxrow = row[shortexit]
# get closing price
c = row['close']
+ if intraday:
+ bar_number = row['bar_number']
+ end_of_day = row['end_of_day']
+ # evaluate entry and exit conditions
+ lerow = row[longentry] if longentry else None
+ serow = row[shortentry] if shortentry else None
+ lxrow = row[longexit] if longexit else None
+ sxrow = row[shortexit] if shortexit else None
# process the long and short events
if lerow:
if p < 0:
@@ -244,7 +276,7 @@ def long_short(system, name, space, quantity):
h = 0
p = 0
# if a holding period was given, then check for exit
- if holdperiod > 0 and h >= holdperiod:
+ if holdperiod and h >= holdperiod:
if inlong:
tradelist.append((dt, [name, Orders.lh, -p, c]))
inlong = False
@@ -256,98 +288,17 @@ def long_short(system, name, space, quantity):
# increment the hold counter
if inlong or inshort:
h += 1
- return tradelist
-
-
-#
-# Function open_range_breakout
-#
-
-def open_range_breakout(name, space, quantity, t1=3, t2=12):
- r"""Run an Opening Range Breakout (ORB) system.
-
- An ORB system is an intraday strategy that waits for price to
- "break out" in a certain direction after establishing an
- initial High-Low range. The timing of the trade is either
- time-based (e.g., 30 minutes after the Open) or price-based
- (e.g., 20% of the average daily range). Either the position
- is held until the end of the trading day, or the position is
- closed with a stop loss (e.g., the other side of the opening
- range).
-
- Parameters
- ----------
- name : str
- The symbol to trade.
- space : alphapy.Space
- Namespace of instrument prices.
- quantity : float
- The amount of the ``name`` to trade, e.g., number of shares
-
- Returns
- -------
- tradelist : list
- List of trade entries and exits.
-
- Other Parameters
- ----------------
- Frame.frames : dict
- All of the data frames containing price data.
-
- """
- # price frame
- pf = Frame.frames[frame_name(name, space)].df
- # initialize the trade list
- tradelist = []
- # generate trade file
- for dt, row in pf.iterrows():
- # extract data from row
- bar_number = row['bar_number']
- h = row['high']
- l = row['low']
- c = row['close']
- end_of_day = row['end_of_day']
- # open range breakout
- if bar_number == 0:
- # new day
- traded = False
- inlong = False
- inshort = False
- hh = h
- ll = l
- elif bar_number < t1:
- # set opening range
- if h > hh:
- hh = h
- if l < ll:
- ll = l
- else:
- if not traded and bar_number < t2:
- # trigger trade
- if h > hh:
- # long breakout triggers
- tradelist.append((dt, [name, Orders.le, quantity, hh]))
- inlong = True
- traded = True
- if l < ll and not traded:
- # short breakout triggers
- tradelist.append((dt, [name, Orders.se, -quantity, ll]))
- inshort = True
- traded = True
- # test stop loss
- if inlong and l < ll:
- tradelist.append((dt, [name, Orders.lx, -quantity, ll]))
- inlong = False
- if inshort and h > hh:
- tradelist.append((dt, [name, Orders.sx, quantity, hh]))
- inshort = False
- # exit any positions at the end of the day
- if inlong and end_of_day:
- # long active, so exit long
- tradelist.append((dt, [name, Orders.lx, -quantity, c]))
- if inshort and end_of_day:
- # short active, so exit short
- tradelist.append((dt, [name, Orders.sx, quantity, c]))
+ if intraday and end_of_day:
+ if inlong:
+ # long active, so exit long
+ tradelist.append((dt, [name, Orders.lx, -p, c]))
+ inlong = False
+ if inshort:
+ # short active, so exit short
+ tradelist.append((dt, [name, Orders.sx, -p, c]))
+ inshort = False
+ h = 0
+ p = 0
return tradelist
@@ -358,7 +309,7 @@ def open_range_breakout(name, space, quantity, t1=3, t2=12):
def run_system(model,
system,
group,
- system_params=None,
+ intraday = False,
quantity = 1):
r"""Run a system for a given group, creating a trades frame.
@@ -366,13 +317,12 @@ def run_system(model,
----------
model : alphapy.Model
The model object with specifications.
- system : alphapy.System or str
- The system to run, either a long/short system or a local one
- identified by function name, e.g., 'open_range_breakout'.
+ system : alphapy.System
+ The system to run.
group : alphapy.Group
- The group of symbols to test.
- system_params : list, optional
- The parameters for the given system.
+ The group of symbols to trade.
+ intraday : bool, optional
+ If true, this is an intraday system.
quantity : float, optional
The amount to trade for each symbol, e.g., number of shares
@@ -383,11 +333,7 @@ def run_system(model,
"""
- if system.__class__ == str:
- system_name = system
- else:
- system_name = system.name
-
+ system_name = system.name
logger.info("Generating Trades for System %s", system_name)
# Unpack the model data.
@@ -407,18 +353,8 @@ def run_system(model,
gtlist = []
for symbol in gmembers:
# generate the trades for this member
- if system.__class__ == str:
- try:
- tlist = globals()[system_name](symbol, gspace, quantity,
- *system_params)
- except:
- logger.info("Could not execute system for %s", symbol)
- else:
- # call default long/short system
- tlist = long_short(system, symbol, gspace, quantity)
+ tlist = trade_system(model, system, gspace, intraday, symbol, quantity)
if tlist:
- # create the local trades frame
- df = DataFrame.from_items(tlist, orient='index', columns=Trade.states)
# add trades to global trade list
for item in tlist:
gtlist.append(item)
@@ -431,11 +367,14 @@ def run_system(model,
if gtlist:
tspace = Space(system_name, "trades", group.space.fractal)
gtlist = sorted(gtlist, key=lambda x: x[0])
- tf = DataFrame.from_items(gtlist, orient='index', columns=Trade.states)
+ tf = DataFrame.from_dict(dict(gtlist), orient='index', columns=Trade.states)
tfname = frame_name(gname, tspace)
system_dir = SSEP.join([directory, 'systems'])
+ labels = ['date']
+ if intraday:
+ labels.append('time')
write_frame(tf, system_dir, tfname, extension, separator,
- index=True, index_label='date')
+ index=True, index_label=labels)
del tspace
else:
logger.info("No trades were found")
diff --git a/alphapy/market_variables.py b/alphapy/transforms.py
similarity index 67%
rename from alphapy/market_variables.py
rename to alphapy/transforms.py
index 1756b34..08e7889 100644
--- a/alphapy/market_variables.py
+++ b/alphapy/transforms.py
@@ -1,10 +1,10 @@
################################################################################
#
# Package : AlphaPy
-# Module : market_variables
-# Created : July 11, 2013
+# Module : transforms
+# Created : March 14, 2020
#
-# Copyright 2017 ScottFree Analytics LLC
+# Copyright 2020 ScottFree Analytics LLC
# Mark Conway & Robert D. Scott II
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,43 +22,21 @@
################################################################################
-#
-# Variables
-# ---------
-#
-# Numeric substitution is allowed for any number in the expression.
-# Offsets are allowed in event expressions but cannot be substituted.
-#
-# Examples
-# --------
-#
-# Variable('rrunder', 'rr_3_20 <= 0.9')
-#
-# 'rrunder_2_10_0.7'
-# 'rrunder_2_10_0.9'
-# 'xmaup_20_50_20_200'
-# 'xmaup_10_50_20_50'
-#
-
-
#
# Imports
#
-from alphapy.alias import get_alias
-from alphapy.frame import Frame
-from alphapy.frame import frame_name
-from alphapy.globals import BSEP, LOFF, ROFF, USEP
-from alphapy.utilities import valid_name
+from alphapy.calendrical import biz_day_month
+from alphapy.calendrical import biz_day_week
+from alphapy.globals import NULLTEXT
+from alphapy.globals import BSEP, PSEP, USEP
+from alphapy.variables import vexec
-from collections import OrderedDict
-from importlib import import_module
+import itertools
import logging
+import math
import numpy as np
import pandas as pd
-import parser
-import re
-import sys
#
@@ -69,627 +47,332 @@
#
-# Class Variable
+# Function abovema
#
-class Variable(object):
- """Create a new variable as a key-value pair. All variables are stored
- in ``Variable.variables``. Duplicate keys or values are not allowed,
- unless the ``replace`` parameter is ``True``.
+def abovema(f, c, p = 50):
+ r"""Determine those values of the dataframe that are above the
+ moving average.
Parameters
----------
- name : str
- Variable key.
- expr : str
- Variable value.
- replace : bool, optional
- Replace the current key-value pair if it already exists.
-
- Attributes
- ----------
- variables : dict
- Class variable for storing all known variables
+ f : pandas.DataFrame
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ p : int
+ The period of the moving average.
- Examples
- --------
-
- >>> Variable('rrunder', 'rr_3_20 <= 0.9')
- >>> Variable('hc', 'higher_close')
+ Returns
+ -------
+ new_column : pandas.Series (bool)
+ The array containing the new feature.
"""
-
- # class variable to track all variables
-
- variables = {}
-
- # function __new__
-
- def __new__(cls,
- name,
- expr,
- replace = False):
- # code
- efound = expr in [Variable.variables[key].expr for key in Variable.variables]
- if efound:
- key = [key for key in Variable.variables if expr in Variable.variables[key].expr]
- logger.info("Expression '%s' already exists for key %s", expr, key)
- return
- else:
- if replace or not name in Variable.variables:
- if not valid_name(name):
- logger.info("Invalid variable key: %s", name)
- return
- try:
- result = parser.expr(expr)
- except:
- logger.info("Invalid expression: %s", expr)
- return
- return super(Variable, cls).__new__(cls)
- else:
- logger.info("Key %s already exists", name)
-
- # function __init__
-
- def __init__(self,
- name,
- expr,
- replace = False):
- # code
- self.name = name;
- self.expr = expr;
- # add key with expression
- Variable.variables[name] = self
-
- # function __str__
-
- def __str__(self):
- return self.expr
+ new_column = f[c] > ma(f, c, p)
+ return new_column
#
-# Function vparse
+# Function adx
#
-def vparse(vname):
- r"""Parse a variable name into its respective components.
+def adx(f, p = 14):
+ r"""Calculate the Average Directional Index (ADX).
Parameters
----------
- vname : str
- The name of the variable.
+ f : pandas.DataFrame
+ Dataframe with all columns required for calculation. If you
+ are applying ADX through ``vapply``, then these columns are
+ calculated automatically.
+ p : int
+ The period over which to calculate the ADX.
Returns
-------
- vxlag : str
- Variable name without the ``lag`` component.
- root : str
- The base variable name without the parameters.
- plist : list
- The parameter list.
- lag : int
- The offset starting with the current value [0]
- and counting back, e.g., an offset [1] means the
- previous value of the variable.
-
- Notes
- -----
-
- **AlphaPy** makes feature creation easy. The syntax
- of a variable name maps to a function call:
-
- xma_20_50 => xma(20, 50)
-
- Examples
- --------
-
- >>> vparse('xma_20_50[1]')
- # ('xma_20_50', 'xma', ['20', '50'], 1)
-
- """
-
- # split along lag first
- lsplit = vname.split(LOFF)
- vxlag = lsplit[0]
- # if necessary, substitute any alias
- root = vxlag.split(USEP)[0]
- alias = get_alias(root)
- if alias:
- vxlag = vxlag.replace(root, alias)
- vsplit = vxlag.split(USEP)
- root = vsplit[0]
- plist = vsplit[1:]
- # extract lag
- lag = 0
- if len(lsplit) > 1:
- # lag is present
- slag = lsplit[1].replace(ROFF, '')
- if len(slag) > 0:
- lpat = r'(^-?[0-9]+$)'
- lre = re.compile(lpat)
- if lre.match(slag):
- lag = int(slag)
- # return all components
- return vxlag, root, plist, lag
-
-
-#
-# Function allvars
-#
-
-def allvars(expr):
- r"""Get the list of valid names in the expression.
+ new_column : pandas.Series (float)
+ The array containing the new feature.
- Parameters
+ References
----------
- expr : str
- A valid expression conforming to the Variable Definition Language.
+ The Average Directional Movement Index (ADX) was invented by J. Welles
+ Wilder in 1978 [WIKI_ADX]_. Its value reflects the strength of trend in any
+ given instrument.
- Returns
- -------
- vlist : list
- List of valid variable names.
+ .. [WIKI_ADX] https://en.wikipedia.org/wiki/Average_directional_movement_index
"""
- regex = re.compile('\w+')
- items = regex.findall(expr)
- vlist = []
- for item in items:
- if valid_name(item):
- vlist.append(item)
- return vlist
+ c1 = 'diplus'
+ vexec(f, c1)
+ c2 = 'diminus'
+ vexec(f, c2)
+ # calculations
+ dip = f[c1]
+ dim = f[c2]
+ didiff = abs(dip - dim)
+ disum = dip + dim
+ new_column = 100 * didiff.ewm(span=p).mean() / disum
+ return new_column
#
-# Function vtree
+# Function belowma
#
-def vtree(vname):
- r"""Get all of the antecedent variables.
-
- Before applying a variable to a dataframe, we have to recursively
- get all of the child variables, beginning with the starting variable's
- expression. Then, we have to extract the variables from all the
- subsequent expressions. This process continues until all antecedent
- variables are obtained.
+def belowma(f, c, p = 50):
+ r"""Determine those values of the dataframe that are below the
+ moving average.
Parameters
----------
- vname : str
- A valid variable stored in ``Variable.variables``.
+ f : pandas.DataFrame
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ p : int
+ The period of the moving average.
Returns
-------
- all_variables : list
- The variables that need to be applied before ``vname``.
-
- Other Parameters
- ----------------
- Variable.variables : dict
- Global dictionary of variables
+ new_column : pandas.Series (bool)
+ The array containing the new feature.
"""
- allv = []
- def vwalk(allv, vname):
- vxlag, root, plist, lag = vparse(vname)
- if root in Variable.variables:
- root_expr = Variable.variables[root].expr
- expr = vsub(vname, root_expr)
- av = allvars(expr)
- for v in av:
- vwalk(allv, v)
- else:
- for p in plist:
- if valid_name(p):
- vwalk(allv, p)
- allv.append(vname)
- return allv
- allv = vwalk(allv, vname)
- all_variables = list(OrderedDict.fromkeys(allv))
- return all_variables
+ new_column = f[c] < ma(f, c, p)
+ return new_column
#
-# Function vsub
+# Function c2max
#
-
-def vsub(v, expr):
- r"""Substitute the variable parameters into the expression.
-
- This function performs the parameter substitution when
- applying features to a dataframe. It is a mechanism for
- the user to override the default values in any given
- expression when defining a feature, instead of having
- to programmatically call a function with new values.
+
+def c2max(f, c1, c2):
+ r"""Take the maximum value between two columns in a dataframe.
Parameters
----------
- v : str
- Variable name.
- expr : str
- The expression for substitution.
+ f : pandas.DataFrame
+ Dataframe containing the two columns ``c1`` and ``c2``.
+ c1 : str
+ Name of the first column in the dataframe ``f``.
+ c2 : str
+ Name of the second column in the dataframe ``f``.
Returns
-------
- newexpr
- The expression with the new, substituted values.
+ max_val : float
+ The maximum value of the two columns.
"""
- # numbers pattern
- npat = '[-+]?[0-9]*\.?[0-9]+'
- nreg = re.compile(npat)
- # find all number locations in variable name
- vnums = nreg.findall(v)
- viter = nreg.finditer(v)
- vlocs = []
- for match in viter:
- vlocs.append(match.span())
- # find all number locations in expression
- # find all non-number locations as well
- elen = len(expr)
- enums = nreg.findall(expr)
- eiter = nreg.finditer(expr)
- elocs = []
- enlocs = []
- index = 0
- for match in eiter:
- eloc = match.span()
- elocs.append(eloc)
- enlocs.append((index, eloc[0]))
- index = eloc[1]
- # build new expression
- newexpr = str()
- for i, enloc in enumerate(enlocs):
- if i < len(vlocs):
- newexpr += expr[enloc[0]:enloc[1]] + v[vlocs[i][0]:vlocs[i][1]]
- else:
- newexpr += expr[enloc[0]:enloc[1]] + expr[elocs[i][0]:elocs[i][1]]
- if elocs:
- estart = elocs[len(elocs)-1][1]
- else:
- estart = 0
- newexpr += expr[estart:elen]
- return newexpr
+ max_val = max(f[c1], f[c2])
+ return max_val
+
-
#
-# Function vexec
+# Function c2min
#
-
-def vexec(f, v, vfuncs=None):
- r"""Add a variable to the given dataframe.
-
- This is the core function for adding a variable to a dataframe.
- The default variable functions are already defined locally
- in ``alphapy.var``; however, you may want to define your
- own variable functions. If so, then the ``vfuncs`` parameter
- will contain the list of modules and functions to be imported
- and applied by the ``vexec`` function.
-
- To write your own variable function, your function must have
- a pandas *DataFrame* as an input parameter and must return
- a pandas *Series* that represents the new variable.
+
+def c2min(f, c1, c2):
+ r"""Take the minimum value between two columns in a dataframe.
Parameters
----------
f : pandas.DataFrame
- Dataframe to contain the new variable.
- v : str
- Variable to add to the dataframe.
- vfuncs : dict, optional
- Dictionary of external modules and functions.
+ Dataframe containing the two columns ``c1`` and ``c2``.
+ c1 : str
+ Name of the first column in the dataframe ``f``.
+ c2 : str
+ Name of the second column in the dataframe ``f``.
Returns
-------
- f : pandas.DataFrame
- Dataframe with the new variable.
-
- Other Parameters
- ----------------
- Variable.variables : dict
- Global dictionary of variables
+ min_val : float
+ The minimum value of the two columns.
"""
- vxlag, root, plist, lag = vparse(v)
- logger.debug("vexec : %s", v)
- logger.debug("vxlag : %s", vxlag)
- logger.debug("root : %s", root)
- logger.debug("plist : %s", plist)
- logger.debug("lag : %s", lag)
- if vxlag not in f.columns:
- if root in Variable.variables:
- logger.debug("Found variable %s: ", root)
- vroot = Variable.variables[root]
- expr = vroot.expr
- expr_new = vsub(vxlag, expr)
- estr = "%s" % expr_new
- estr = BSEP.join([vxlag, '=', estr])
- logger.debug("Expression: %s", estr)
- # pandas eval
- f.eval(estr, inplace=True)
- else:
- logger.debug("Did not find variable: %s", root)
- # Must be a function call
- func_name = root
- # Convert the parameter list and prepend the data frame
- newlist = []
- for p in plist:
- try:
- newlist.append(int(p))
- except:
- try:
- newlist.append(float(p))
- except:
- newlist.append(p)
- newlist.insert(0, f)
- # Find the module and function
- module = None
- if vfuncs:
- for m in vfuncs:
- funcs = vfuncs[m]
- if func_name in funcs:
- module = m
- break
- # If the module was found, import the external treatment function,
- # else search the local namespace.
- if module:
- ext_module = import_module(module)
- func = getattr(my_module, func_name)
- # Create the variable by calling the function
- f[v] = func(*newlist)
- else:
- modname = globals()['__name__']
- module = sys.modules[modname]
- if func_name in dir(module):
- func = getattr(module, func_name)
- # Create the variable
- f[v] = func(*newlist)
- else:
- logger.debug("Could not find function %s", func_name)
- # if necessary, add the lagged variable
- if lag > 0 and vxlag in f.columns:
- f[v] = f[vxlag].shift(lag)
- # output frame
- return f
-
-
-#
-# Function vapply
-#
-
-def vapply(group, vname, vfuncs=None):
- r"""Apply a variable to multiple dataframes.
-
- Parameters
- ----------
- group : alphapy.Group
- The input group.
- vname : str
- The variable to apply to the ``group``.
- vfuncs : dict, optional
- Dictionary of external modules and functions.
-
- Returns
- -------
- None : None
-
- Other Parameters
- ----------------
- Frame.frames : dict
- Global dictionary of dataframes
+ min_val = min(f[c1], f[c2])
+ return min_val
- See Also
- --------
- vunapply
-
- """
- # get all frame names to apply variables
- gnames = [item.lower() for item in group.members]
- # get all the precedent variables
- allv = vtree(vname)
- # apply the variables to each frame
- for g in gnames:
- fname = frame_name(g, group.space)
- if fname in Frame.frames:
- f = Frame.frames[fname].df
- if not f.empty:
- for v in allv:
- logger.debug("Applying variable %s to %s", v, g)
- f = vexec(f, v, vfuncs)
- else:
- logger.info("Frame for %s is empty", g)
- else:
- logger.info("Frame not found: %s", fname)
-
#
-# Function vmapply
+# Function diff
#
-def vmapply(group, vs, vfuncs=None):
- r"""Apply multiple variables to multiple dataframes.
+def diff(f, c, n = 1):
+ r"""Calculate the n-th order difference for the given variable.
Parameters
----------
- group : alphapy.Group
- The input group.
- vs : list
- The list of variables to apply to the ``group``.
- vfuncs : dict, optional
- Dictionary of external modules and functions.
+ f : pandas.DataFrame
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ n : int
+ The number of times that the values are differenced.
Returns
-------
- None : None
-
- See Also
- --------
- vmunapply
+ new_column : pandas.Series (float)
+ The array containing the new feature.
"""
- for v in vs:
- logger.info("Applying variable: %s", v)
- vapply(group, v, vfuncs)
+ new_column = np.diff(f[c], n)
+ return new_column
+
-
#
-# Function vunapply
+# Function diminus
#
-def vunapply(group, vname):
- r"""Remove a variable from multiple dataframes.
+def diminus(f, p = 14):
+ r"""Calculate the Minus Directional Indicator (-DI).
Parameters
----------
- group : alphapy.Group
- The input group.
- vname : str
- The variable to remove from the ``group``.
+ f : pandas.DataFrame
+ Dataframe with columns ``high`` and ``low``.
+ p : int
+ The period over which to calculate the -DI.
Returns
-------
- None : None
+ new_column : pandas.Series (float)
+ The array containing the new feature.
- Other Parameters
- ----------------
- Frame.frames : dict
- Global dictionary of dataframes
+ References
+ ----------
+ *A component of the average directional index (ADX) that is used to
+ measure the presence of a downtrend. When the -DI is sloping downward,
+ it is a signal that the downtrend is getting stronger* [IP_NDI]_.
- See Also
- --------
- vapply
+ .. [IP_NDI] http://www.investopedia.com/terms/n/negativedirectionalindicator.asp
"""
- # get all frame names to apply variables
- gnames = [item.lower() for item in group.all_members()]
- # apply the variables to each frame
- for g in gnames:
- fname = frame_name(g, group.space)
- if fname in Frame.frames:
- f = Frame.frames[fname].df
- logger.info("Unapplying variable %s from %s", vname, g)
- if vname not in f.columns:
- logger.info("Variable %s not in %s frame", vname, g)
- else:
- estr = "Frame.frames['%s'].df = f.df.drop('%s', axis=1)" \
- % (fname, vname)
- exec(estr)
- else:
- logger.info("Frame not found: %s", fname)
-
+ tr = 'truerange'
+ vexec(f, tr)
+ atr = USEP.join(['atr', str(p)])
+ vexec(f, atr)
+ dmm = 'dmminus'
+ f[dmm] = dminus(f)
+ new_column = 100 * dminus(f).ewm(span=p).mean() / f[atr]
+ return new_column
+
#
-# Function vmunapply
+# Function diplus
#
-def vmunapply(group, vs):
- r"""Remove a list of variables from multiple dataframes.
+def diplus(f, p = 14):
+ r"""Calculate the Plus Directional Indicator (+DI).
Parameters
----------
- group : alphapy.Group
- The input group.
- vs : list
- The list of variables to remove from the ``group``.
+ f : pandas.DataFrame
+ Dataframe with columns ``high`` and ``low``.
+ p : int
+ The period over which to calculate the +DI.
Returns
-------
- None : None
+ new_column : pandas.Series (float)
+ The array containing the new feature.
- See Also
- --------
- vmapply
+ References
+ ----------
+ *A component of the average directional index (ADX) that is used to
+ measure the presence of an uptrend. When the +DI is sloping upward,
+ it is a signal that the uptrend is getting stronger* [IP_PDI]_.
+
+ .. [IP_PDI] http://www.investopedia.com/terms/p/positivedirectionalindicator.asp
"""
- for v in vs:
- vunapply(group, v)
+ tr = 'truerange'
+ vexec(f, tr)
+ atr = USEP.join(['atr', str(p)])
+ vexec(f, atr)
+ dmp = 'dmplus'
+ vexec(f, dmp)
+ new_column = 100 * f[dmp].ewm(span=p).mean() / f[atr]
+ return new_column
#
-# This is the reference for all internal and external variable functions.
-#
-#
-# 1. datetime functions
-#
-# date, datetime, time, timedelta
-#
-# 2. numpy unary ufuncs (PDA p. 96)
-#
-# abs, ceil, cos, exp, floor, log, log10, log2, modf, rint, sign,
-# sin, square, sqrt, tan
-#
-# 3. moving window and exponential functions (PDA p. 323)
-#
-# rolling, ewm
-#
-# 5. pandas descriptive and summary statistical functions (PDA p. 139)
-#
-# argmin, argmax, count, cummax, cummin, cumprod, cumsum, describe,
-# diff, idxmin, idxmax, kurt, mad, max, mean, median, min, pct_change,
-# quantile, skew, std, sum, var
-#
-# 6. time series (PDA p. 289-328)
+# Function dminus
#
-
-#
-# Function c2max
-#
-
-def c2max(f, c1, c2):
- r"""Take the maximum value between two columns in a dataframe.
+def dminus(f):
+ r"""Calculate the Minus Directional Movement (-DM).
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the two columns ``c1`` and ``c2``.
- c1 : str
- Name of the first column in the dataframe ``f``.
- c2 : str
- Name of the second column in the dataframe ``f``.
+ Dataframe with columns ``high`` and ``low``.
Returns
-------
- max_val : float
- The maximum value of the two columns.
+ new_column : pandas.Series (float)
+ The array containing the new feature.
+
+ References
+ ----------
+ *Directional movement is negative (minus) when the prior low minus
+ the current low is greater than the current high minus the prior high.
+ This so-called Minus Directional Movement (-DM) equals the prior low
+ minus the current low, provided it is positive. A negative value
+ would simply be entered as zero* [SC_ADX]_.
"""
- max_val = max(f[c1], f[c2])
- return max_val
+ c1 = 'downmove'
+ f[c1] = -net(f, 'low')
+ c2 = 'upmove'
+ f[c2] = net(f, 'high')
+ new_column = f.apply(gtval0, axis=1, args=[c1, c2])
+ return new_column
#
-# Function c2min
+# Function dmplus
#
-
-def c2min(f, c1, c2):
- r"""Take the minimum value between two columns in a dataframe.
+
+def dmplus(f):
+ r"""Calculate the Plus Directional Movement (+DM).
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the two columns ``c1`` and ``c2``.
- c1 : str
- Name of the first column in the dataframe ``f``.
- c2 : str
- Name of the second column in the dataframe ``f``.
+ Dataframe with columns ``high`` and ``low``.
Returns
-------
- min_val : float
- The minimum value of the two columns.
+ new_column : pandas.Series (float)
+ The array containing the new feature.
+
+ References
+ ----------
+ *Directional movement is positive (plus) when the current high minus
+ the prior high is greater than the prior low minus the current low.
+ This so-called Plus Directional Movement (+DM) then equals the current
+ high minus the prior high, provided it is positive. A negative value
+ would simply be entered as zero* [SC_ADX]_.
+
+ .. [SC_ADX] http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_directional_index_adx
"""
- min_val = min(f[c1], f[c2])
- return min_val
+ c1 = 'upmove'
+ f[c1] = net(f, 'high')
+ c2 = 'downmove'
+ f[c2] = -net(f, 'low')
+ new_column = f.apply(gtval0, axis=1, args=[c1, c2])
+ return new_column
#
-# Function pchange1
+# Function down
#
-
-def pchange1(f, c, o = 1):
- r"""Calculate the percentage change within the same variable.
+
+def down(f, c):
+ r"""Find the negative values in the series.
Parameters
----------
@@ -697,34 +380,30 @@ def pchange1(f, c, o = 1):
Dataframe containing the column ``c``.
c : str
Name of the column in the dataframe ``f``.
- o : int
- Offset to the previous value.
Returns
-------
- new_column : pandas.Series (float)
+ new_column : pandas.Series (bool)
The array containing the new feature.
"""
- new_column = f[c] / f[c].shift(o) - 1.0
+ new_column = f[c] < 0
return new_column
#
-# Function pchange2
+# Function dpc
#
-def pchange2(f, c1, c2):
- r"""Calculate the percentage change between two variables.
+def dpc(f, c):
+ r"""Get the negative values, with positive values zeroed.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the two columns ``c1`` and ``c2``.
- c1 : str
- Name of the first column in the dataframe ``f``.
- c2 : str
- Name of the second column in the dataframe ``f``.
+ Dataframe with column ``c``.
+ c : str
+ Name of the column.
Returns
-------
@@ -732,16 +411,16 @@ def pchange2(f, c1, c2):
The array containing the new feature.
"""
- new_column = f[c1] / f[c2] - 1.0
+ new_column = f.apply(mval, axis=1, args=[c])
return new_column
#
-# Function diff
+# Function ema
#
-def diff(f, c, n = 1):
- r"""Calculate the n-th order difference for the given variable.
+def ema(f, c, p = 20):
+ r"""Calculate the mean on a rolling basis.
Parameters
----------
@@ -749,459 +428,475 @@ def diff(f, c, n = 1):
Dataframe containing the column ``c``.
c : str
Name of the column in the dataframe ``f``.
- n : int
- The number of times that the values are differenced.
+ p : int
+ The period over which to calculate the rolling mean.
Returns
-------
new_column : pandas.Series (float)
The array containing the new feature.
+ References
+ ----------
+ *An exponential moving average (EMA) is a type of moving average
+ that is similar to a simple moving average, except that more weight
+ is given to the latest data* [IP_EMA]_.
+
+ .. [IP_EMA] http://www.investopedia.com/terms/e/ema.asp
+
"""
- new_column = np.diff(f[c], n)
+ new_column = pd.ewma(f[c], span=p)
return new_column
#
-# Function down
+# Function extract_bizday
#
-def down(f, c):
- r"""Find the negative values in the series.
+def extract_bizday(f, c):
+ r"""Extract business day of month and week.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
+ Dataframe containing the date column ``c``.
c : str
- Name of the column in the dataframe ``f``.
+ Name of the date column in the dataframe ``f``.
Returns
-------
- new_column : pandas.Series (bool)
- The array containing the new feature.
-
+ date_features : pandas.DataFrame
+ The dataframe containing the date features.
"""
- new_column = f[c] < 0
- return new_column
+
+ date_features = pd.DataFrame()
+ try:
+ date_features = extract_date(f, c)
+ rdate = date_features.apply(get_rdate, axis=1)
+ bdm = pd.Series(rdate.apply(biz_day_month), name='bizday_month')
+ bdw = pd.Series(rdate.apply(biz_day_week), name='bizday_week')
+ frames = [date_features, bdm, bdw]
+ date_features = pd.concat(frames, axis=1)
+ except:
+ logger.info("Could not extract business date information from %s column", c)
+ return date_features
#
-# Function up
+# Function extract_date
#
-def up(f, c):
- r"""Find the positive values in the series.
+def extract_date(f, c):
+ r"""Extract date into its components: year, month, day, dayofweek.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
+ Dataframe containing the date column ``c``.
c : str
- Name of the column in the dataframe ``f``.
+ Name of the date column in the dataframe ``f``.
Returns
-------
- new_column : pandas.Series (bool)
- The array containing the new feature.
-
+ date_features : pandas.DataFrame
+ The dataframe containing the date features.
"""
- new_column = f[c] > 0
- return new_column
+
+ fc = pd.to_datetime(f[c])
+ date_features = pd.DataFrame()
+ try:
+ fyear = pd.Series(fc.dt.year, name='year')
+ fmonth = pd.Series(fc.dt.month, name='month')
+ fday = pd.Series(fc.dt.day, name='day')
+ fdow = pd.Series(fc.dt.dayofweek, name='day_of_week')
+ frames = [fyear, fmonth, fday, fdow]
+ date_features = pd.concat(frames, axis=1)
+ except:
+ logger.info("Could not extract date information from %s column", c)
+ return date_features
#
-# Function higher
+# Function extract_time
#
-def higher(f, c, o = 1):
- r"""Determine whether or not a series value is higher than
- the value ``o`` periods back.
+def extract_time(f, c):
+ r"""Extract time into its components: hour, minute, second.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
+ Dataframe containing the time column ``c``.
c : str
- Name of the column in the dataframe ``f``.
- o : int, optional
- Offset value for shifting the series.
+ Name of the time column in the dataframe ``f``.
Returns
-------
- new_column : pandas.Series (bool)
- The array containing the new feature.
-
+ time_features : pandas.DataFrame
+ The dataframe containing the time features.
"""
- new_column = f[c] > f[c].shift(o)
- return new_column
+
+ fc = pd.to_datetime(f[c])
+ time_features = pd.DataFrame()
+ try:
+ fhour = pd.Series(fc.dt.hour, name='year')
+ fminute = pd.Series(fc.dt.minute, name='month')
+ fsecond = pd.Series(fc.dt.second, name='day')
+ frames = [fhour, fminute, fsecond]
+ time_features = pd.concat(frames, axis=1)
+ except:
+ logger.info("Could not extract time information from %s column", c)
+ return time_features
#
-# Function highest
+# Function gap
#
-def highest(f, c, p = 20):
- r"""Calculate the highest value on a rolling basis.
+def gap(f):
+ r"""Calculate the gap percentage between the current open and
+ the previous close.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the column in the dataframe ``f``.
- p : int
- The period over which to calculate the rolling maximum.
+ Dataframe with columns ``open`` and ``close``.
Returns
-------
new_column : pandas.Series (float)
The array containing the new feature.
+ References
+ ----------
+ *A gap is a break between prices on a chart that occurs when the
+ price of a stock makes a sharp move up or down with no trading
+ occurring in between* [IP_GAP]_.
+
+ .. [IP_GAP] http://www.investopedia.com/terms/g/gap.asp
+
"""
- new_column = f[c].rolling(p).max()
+ c1 = 'open'
+ c2 = 'close[1]'
+ vexec(f, c2)
+ new_column = 100 * pchange2(f, c1, c2)
return new_column
#
-# Function lower
+# Function gapbadown
#
-def lower(f, c, o = 1):
- r"""Determine whether or not a series value is lower than
- the value ``o`` periods back.
+def gapbadown(f):
+ r"""Determine whether or not there has been a breakaway gap down.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the column in the dataframe ``f``.
- o : int, optional
- Offset value for shifting the series.
+ Dataframe with columns ``open`` and ``low``.
Returns
-------
new_column : pandas.Series (bool)
The array containing the new feature.
+ References
+ ----------
+ *A breakaway gap represents a gap in the movement of a stock price
+ supported by levels of high volume* [IP_BAGAP]_.
+
+ .. [IP_BAGAP] http://www.investopedia.com/terms/b/breakawaygap.asp
+
"""
- new_column = f[c] < f[c].shift(o)
+ new_column = f['open'] < f['low'].shift(1)
return new_column
#
-# Function lowest
+# Function gapbaup
#
-def lowest(f, c, p = 20):
- r"""Calculate the lowest value on a rolling basis.
+def gapbaup(f):
+ r"""Determine whether or not there has been a breakaway gap up.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the column in the dataframe ``f``.
- p : int
- The period over which to calculate the rolling minimum.
+ Dataframe with columns ``open`` and ``high``.
Returns
-------
- new_column : pandas.Series (float)
+ new_column : pandas.Series (bool)
The array containing the new feature.
+ References
+ ----------
+ *A breakaway gap represents a gap in the movement of a stock price
+ supported by levels of high volume* [IP_BAGAP]_.
+
"""
- return f[c].rolling(p).min()
+ new_column = f['open'] > f['high'].shift(1)
+ return new_column
#
-# Function ma
+# Function gapdown
#
-def ma(f, c, p = 20):
- r"""Calculate the mean on a rolling basis.
+def gapdown(f):
+ r"""Determine whether or not there has been a gap down.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the column in the dataframe ``f``.
- p : int
- The period over which to calculate the rolling mean.
+ Dataframe with columns ``open`` and ``close``.
Returns
-------
- new_column : pandas.Series (float)
+ new_column : pandas.Series (bool)
The array containing the new feature.
References
----------
- *In statistics, a moving average (rolling average or running average)
- is a calculation to analyze data points by creating series of averages
- of different subsets of the full data set* [WIKI_MA]_.
-
- .. [WIKI_MA] https://en.wikipedia.org/wiki/Moving_average
+ *A gap is a break between prices on a chart that occurs when the
+ price of a stock makes a sharp move up or down with no trading
+ occurring in between* [IP_GAP]_.
"""
- new_column = f[c].rolling(p).mean()
+ new_column = f['open'] < f['close'].shift(1)
return new_column
#
-# Function ema
+# Function gapup
#
-def ema(f, c, p = 20):
- r"""Calculate the mean on a rolling basis.
+def gapup(f):
+ r"""Determine whether or not there has been a gap up.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the column in the dataframe ``f``.
- p : int
- The period over which to calculate the rolling mean.
+ Dataframe with columns ``open`` and ``close``.
Returns
-------
- new_column : pandas.Series (float)
+ new_column : pandas.Series (bool)
The array containing the new feature.
References
----------
- *An exponential moving average (EMA) is a type of moving average
- that is similar to a simple moving average, except that more weight
- is given to the latest data* [IP_EMA]_.
-
- .. [IP_EMA] http://www.investopedia.com/terms/e/ema.asp
+ *A gap is a break between prices on a chart that occurs when the
+ price of a stock makes a sharp move up or down with no trading
+ occurring in between* [IP_GAP]_.
"""
- new_column = pd.ewma(f[c], span=p)
+ new_column = f['open'] > f['close'].shift(1)
return new_column
#
-# Function maratio
+# Function gtval
#
-def maratio(f, c, p1 = 1, p2 = 10):
- r"""Calculate the ratio of two moving averages.
+def gtval(f, c1, c2):
+ r"""Determine whether or not the first column of a dataframe
+ is greater than the second.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the column in the dataframe ``f``.
- p1 : int
- The period of the first moving average.
- p2 : int
- The period of the second moving average.
+ Dataframe containing the two columns ``c1`` and ``c2``.
+ c1 : str
+ Name of the first column in the dataframe ``f``.
+ c2 : str
+ Name of the second column in the dataframe ``f``.
Returns
-------
- new_column : pandas.Series (float)
+ new_column : pandas.Series (bool)
The array containing the new feature.
"""
- new_column = ma(f, c, p1) / ma(f, c, p2)
+ new_column = f[c1] > f[c2]
return new_column
#
-# Function net
+# Function gtval0
#
-def net(f, c='close', o = 1):
- r"""Calculate the net change of a given column.
+def gtval0(f, c1, c2):
+ r"""For positive values in the first column of the dataframe
+ that are greater than the second column, get the value in
+ the first column, otherwise return zero.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the column in the dataframe ``f``.
- o : int, optional
- Offset value for shifting the series.
+ Dataframe containing the two columns ``c1`` and ``c2``.
+ c1 : str
+ Name of the first column in the dataframe ``f``.
+ c2 : str
+ Name of the second column in the dataframe ``f``.
Returns
-------
- new_column : pandas.Series (float)
- The array containing the new feature.
-
- References
- ----------
- *Net change is the difference between the closing price of a security
- on the day's trading and the previous day's closing price. Net change
- can be positive or negative and is quoted in terms of dollars* [IP_NET]_.
-
- .. [IP_NET] http://www.investopedia.com/terms/n/netchange.asp
+ new_val : float
+ A positive value or zero.
"""
- new_column = f[c] - f[c].shift(o)
- return new_column
+ if f[c1] > f[c2] and f[c1] > 0:
+ new_val = f[c1]
+ else:
+ new_val = 0
+ return new_val
#
-# Function gap
+# Function higher
#
-def gap(f):
- r"""Calculate the gap percentage between the current open and
- the previous close.
+def higher(f, c, o = 1):
+ r"""Determine whether or not a series value is higher than
+ the value ``o`` periods back.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``open`` and ``close``.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ o : int, optional
+ Offset value for shifting the series.
Returns
-------
- new_column : pandas.Series (float)
+ new_column : pandas.Series (bool)
The array containing the new feature.
- References
- ----------
- *A gap is a break between prices on a chart that occurs when the
- price of a stock makes a sharp move up or down with no trading
- occurring in between* [IP_GAP]_.
-
- .. [IP_GAP] http://www.investopedia.com/terms/g/gap.asp
-
"""
- c1 = 'open'
- c2 = 'close[1]'
- vexec(f, c2)
- new_column = 100 * pchange2(f, c1, c2)
+ new_column = f[c] > f[c].shift(o)
return new_column
#
-# Function gapdown
+# Function highest
#
-def gapdown(f):
- r"""Determine whether or not there has been a gap down.
+def highest(f, c, p = 20):
+ r"""Calculate the highest value on a rolling basis.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``open`` and ``close``.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ p : int
+ The period over which to calculate the rolling maximum.
Returns
-------
- new_column : pandas.Series (bool)
+ new_column : pandas.Series (float)
The array containing the new feature.
- References
- ----------
- *A gap is a break between prices on a chart that occurs when the
- price of a stock makes a sharp move up or down with no trading
- occurring in between* [IP_GAP]_.
-
"""
- new_column = f['open'] < f['close'].shift(1)
+ new_column = f[c].rolling(p).max()
return new_column
#
-# Function gapup
+# Function hlrange
#
-def gapup(f):
- r"""Determine whether or not there has been a gap up.
+def hlrange(f, p = 1):
+ r"""Calculate the Range, the difference between High and Low.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``open`` and ``close``.
+ Dataframe with columns ``high`` and ``low``.
+ p : int
+ The period over which the range is calculated.
Returns
-------
- new_column : pandas.Series (bool)
+ new_column : pandas.Series (float)
The array containing the new feature.
- References
- ----------
- *A gap is a break between prices on a chart that occurs when the
- price of a stock makes a sharp move up or down with no trading
- occurring in between* [IP_GAP]_.
-
"""
- new_column = f['open'] > f['close'].shift(1)
+ new_column = highest(f, 'high', p) - lowest(f, 'low', p)
return new_column
#
-# Function gapbadown
+# Function lower
#
-def gapbadown(f):
- r"""Determine whether or not there has been a breakaway gap down.
+def lower(f, c, o = 1):
+ r"""Determine whether or not a series value is lower than
+ the value ``o`` periods back.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``open`` and ``low``.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ o : int, optional
+ Offset value for shifting the series.
Returns
-------
new_column : pandas.Series (bool)
The array containing the new feature.
- References
- ----------
- *A breakaway gap represents a gap in the movement of a stock price
- supported by levels of high volume* [IP_BAGAP]_.
-
- .. [IP_BAGAP] http://www.investopedia.com/terms/b/breakawaygap.asp
-
"""
- new_column = f['open'] < f['low'].shift(1)
+ new_column = f[c] < f[c].shift(o)
return new_column
#
-# Function gapbaup
+# Function lowest
#
-def gapbaup(f):
- r"""Determine whether or not there has been a breakaway gap up.
+def lowest(f, c, p = 20):
+ r"""Calculate the lowest value on a rolling basis.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``open`` and ``high``.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ p : int
+ The period over which to calculate the rolling minimum.
Returns
-------
- new_column : pandas.Series (bool)
+ new_column : pandas.Series (float)
The array containing the new feature.
- References
- ----------
- *A breakaway gap represents a gap in the movement of a stock price
- supported by levels of high volume* [IP_BAGAP]_.
-
"""
- new_column = f['open'] > f['high'].shift(1)
- return new_column
+ return f[c].rolling(p).min()
#
-# Function truehigh
+# Function ma
#
-def truehigh(f):
- r"""Calculate the *True High* value.
+def ma(f, c, p = 20):
+ r"""Calculate the mean on a rolling basis.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``high`` and ``low``.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ p : int
+ The period over which to calculate the rolling mean.
Returns
-------
@@ -1210,94 +905,100 @@ def truehigh(f):
References
----------
- *Today's high, or the previous close, whichever is higher* [TS_TR]_.
+ *In statistics, a moving average (rolling average or running average)
+ is a calculation to analyze data points by creating series of averages
+ of different subsets of the full data set* [WIKI_MA]_.
- .. [TS_TR] http://help.tradestation.com/09_01/tradestationhelp/charting_definitions/true_range.htm
+ .. [WIKI_MA] https://en.wikipedia.org/wiki/Moving_average
"""
- c1 = 'low[1]'
- vexec(f, c1)
- c2 = 'high'
- new_column = f.apply(c2max, axis=1, args=[c1, c2])
+ new_column = f[c].rolling(p).mean()
return new_column
#
-# Function truelow
+# Function maratio
#
-def truelow(f):
- r"""Calculate the *True Low* value.
+def maratio(f, c, p1 = 1, p2 = 10):
+ r"""Calculate the ratio of two moving averages.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``high`` and ``low``.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ p1 : int
+ The period of the first moving average.
+ p2 : int
+ The period of the second moving average.
Returns
-------
new_column : pandas.Series (float)
The array containing the new feature.
- References
- ----------
- *Today's low, or the previous close, whichever is lower* [TS_TR]_.
-
"""
- c1 = 'high[1]'
- vexec(f, c1)
- c2 = 'low'
- new_column = f.apply(c2min, axis=1, args=[c1, c2])
+ new_column = ma(f, c, p1) / ma(f, c, p2)
return new_column
#
-# Function truerange
+# Function mval
#
-
-def truerange(f):
- r"""Calculate the *True Range* value.
+
+def mval(f, c):
+ r"""Get the negative value, otherwise zero.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``high`` and ``low``.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
Returns
-------
- new_column : pandas.Series (float)
- The array containing the new feature.
-
- References
- ----------
- *True High - True Low* [TS_TR]_.
+ new_val : float
+ Negative value or zero.
"""
- new_column = truehigh(f) - truelow(f)
- return new_column
+ new_val = -f[c] if f[c] < 0 else 0
+ return new_val
#
-# Function hlrange
+# Function net
#
-def hlrange(f, p = 1):
- r"""Calculate the Range, the difference between High and Low.
+def net(f, c='close', o = 1):
+ r"""Calculate the net change of a given column.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``high`` and ``low``.
- p : int
- The period over which the range is calculated.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ o : int, optional
+ Offset value for shifting the series.
Returns
-------
new_column : pandas.Series (float)
The array containing the new feature.
+ References
+ ----------
+ *Net change is the difference between the closing price of a security
+ on the day's trading and the previous day's closing price. Net change
+ can be positive or negative and is quoted in terms of dollars* [IP_NET]_.
+
+ .. [IP_NET] http://www.investopedia.com/terms/n/netchange.asp
+
"""
- new_column = highest(f, 'high', p) - lowest(f, 'low', p)
+ new_column = f[c] - f[c].shift(o)
return new_column
@@ -1337,32 +1038,20 @@ def netreturn(f, c, o = 1):
#
-# Function rindex
+# Function pchange1
#
-
-def rindex(f, ci, ch, cl, p = 1):
- r"""Calculate the *range index* spanning a given period ``p``.
-
- The **range index** is a number between 0 and 100 that
- relates the value of the index column ``ci`` to the
- high column ``ch`` and the low column ``cl``. For example,
- if the low value of the range is 10 and the high value
- is 20, then the range index for a value of 15 would be 50%.
- The range index for 18 would be 80%.
+
+def pchange1(f, c, o = 1):
+ r"""Calculate the percentage change within the same variable.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the columns ``ci``, ``ch``, and ``cl``.
- ci : str
- Name of the index column in the dataframe ``f``.
- ch : str
- Name of the high column in the dataframe ``f``.
- cl : str
- Name of the low column in the dataframe ``f``.
- p : int
- The period over which the range index of column ``ci``
- is calculated.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ o : int
+ Offset to the previous value.
Returns
-------
@@ -1370,37 +1059,34 @@ def rindex(f, ci, ch, cl, p = 1):
The array containing the new feature.
"""
- o = p-1 if f[ci].name == 'open' else 0
- hh = highest(f, ch, p)
- ll = lowest(f, cl, p)
- fn = f[ci].shift(o) - ll
- fd = hh - ll
- new_column = 100 * fn / fd
+ new_column = f[c] / f[c].shift(o) - 1.0
return new_column
#
-# Function mval
+# Function pchange2
#
-
-def mval(f, c):
- r"""Get the negative value, otherwise zero.
+
+def pchange2(f, c1, c2):
+ r"""Calculate the percentage change between two variables.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
- c : str
- Name of the column in the dataframe ``f``.
+ Dataframe containing the two columns ``c1`` and ``c2``.
+ c1 : str
+ Name of the first column in the dataframe ``f``.
+ c2 : str
+ Name of the second column in the dataframe ``f``.
Returns
-------
- new_val : float
- Negative value or zero.
+ new_column : pandas.Series (float)
+ The array containing the new feature.
"""
- new_val = -f[c] if f[c] < 0 else 0
- return new_val
+ new_column = f[c1] / f[c2] - 1.0
+ return new_column
#
@@ -1428,42 +1114,32 @@ def pval(f, c):
#
-# Function dpc
+# Function rindex
#
-def dpc(f, c):
- r"""Get the negative values, with positive values zeroed.
-
- Parameters
- ----------
- f : pandas.DataFrame
- Dataframe with column ``c``.
- c : str
- Name of the column.
-
- Returns
- -------
- new_column : pandas.Series (float)
- The array containing the new feature.
-
- """
- new_column = f.apply(mval, axis=1, args=[c])
- return new_column
-
-
-#
-# Function upc
-#
+def rindex(f, ci, ch, cl, p = 1):
+ r"""Calculate the *range index* spanning a given period ``p``.
-def upc(f, c):
- r"""Get the positive values, with negative values zeroed.
+ The **range index** is a number between 0 and 100 that
+ relates the value of the index column ``ci`` to the
+ high column ``ch`` and the low column ``cl``. For example,
+ if the low value of the range is 10 and the high value
+ is 20, then the range index for a value of 15 would be 50%.
+ The range index for 18 would be 80%.
Parameters
----------
f : pandas.DataFrame
- Dataframe with column ``c``.
- c : str
- Name of the column.
+ Dataframe containing the columns ``ci``, ``ch``, and ``cl``.
+ ci : str
+ Name of the index column in the dataframe ``f``.
+ ch : str
+ Name of the high column in the dataframe ``f``.
+ cl : str
+ Name of the low column in the dataframe ``f``.
+ p : int
+ The period over which the range index of column ``ci``
+ is calculated.
Returns
-------
@@ -1471,7 +1147,12 @@ def upc(f, c):
The array containing the new feature.
"""
- new_column = f.apply(pval, axis=1, args=[c])
+ o = p-1 if f[ci].name == 'open' else 0
+ hh = highest(f, ch, p)
+ ll = lowest(f, cl, p)
+ fn = f[ci].shift(o) - ll
+ fd = hh - ll
+ new_column = 100 * fn / fd
return new_column
@@ -1515,146 +1196,248 @@ def rsi(f, c, p = 14):
#
-# Function gtval
+# Function rtotal
#
-def gtval(f, c1, c2):
- r"""Determine whether or not the first column of a dataframe
- is greater than the second.
+def rtotal(vec):
+ r"""Calculate the running total.
Parameters
----------
- f : pandas.DataFrame
- Dataframe containing the two columns ``c1`` and ``c2``.
- c1 : str
- Name of the first column in the dataframe ``f``.
- c2 : str
- Name of the second column in the dataframe ``f``.
+ vec : pandas.Series
+ The input array for calculating the running total.
Returns
-------
- new_column : pandas.Series (bool)
- The array containing the new feature.
+ running_total : int
+ The final running total.
+
+ Example
+ -------
+
+ >>> vec.rolling(window=20).apply(rtotal)
"""
- new_column = f[c1] > f[c2]
- return new_column
+ tcount = np.count_nonzero(vec)
+ fcount = len(vec) - tcount
+ running_total = tcount - fcount
+ return running_total
#
-# Function gtval0
+# Function runs
#
-def gtval0(f, c1, c2):
- r"""For positive values in the first column of the dataframe
- that are greater than the second column, get the value in
- the first column, otherwise return zero.
+def runs(vec):
+ r"""Calculate the total number of runs.
Parameters
----------
- f : pandas.DataFrame
- Dataframe containing the two columns ``c1`` and ``c2``.
- c1 : str
- Name of the first column in the dataframe ``f``.
- c2 : str
- Name of the second column in the dataframe ``f``.
+ vec : pandas.Series
+ The input array for calculating the number of runs.
Returns
-------
- new_val : float
- A positive value or zero.
+ runs_value : int
+ The total number of runs.
+
+ Example
+ -------
+
+ >>> vec.rolling(window=20).apply(runs)
"""
- if f[c1] > f[c2] and f[c1] > 0:
- new_val = f[c1]
- else:
- new_val = 0
- return new_val
+ runs_value = len(list(itertools.groupby(vec)))
+ return runs_value
#
-# Function dmplus
+# Function runs_test
#
-def dmplus(f):
- r"""Calculate the Plus Directional Movement (+DM).
+def runs_test(f, c, wfuncs, window):
+ r"""Perform a runs test on binary series.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``high`` and ``low``.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the column in the dataframe ``f``.
+ wfuncs : list
+ The set of runs test functions to apply to the column:
+
+ ``'all'``:
+ Run all of the functions below.
+ ``'rtotal'``:
+ The running total over the ``window`` period.
+ ``'runs'``:
+ Total number of runs in ``window``.
+ ``'streak'``:
+ The length of the latest streak.
+ ``'zscore'``:
+ The Z-Score over the ``window`` period.
+ window : int
+ The rolling period.
Returns
-------
- new_column : pandas.Series (float)
- The array containing the new feature.
+ new_features : pandas.DataFrame
+ The dataframe containing the runs test features.
References
----------
- *Directional movement is positive (plus) when the current high minus
- the prior high is greater than the prior low minus the current low.
- This so-called Plus Directional Movement (+DM) then equals the current
- high minus the prior high, provided it is positive. A negative value
- would simply be entered as zero* [SC_ADX]_.
+ For more information about runs tests for detecting non-randomness,
+ refer to [RUNS]_.
- .. [SC_ADX] http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_directional_index_adx
+ .. [RUNS] http://www.itl.nist.gov/div898/handbook/eda/section3/eda35d.htm
"""
- c1 = 'upmove'
- f[c1] = net(f, 'high')
- c2 = 'downmove'
- f[c2] = -net(f, 'low')
- new_column = f.apply(gtval0, axis=1, args=[c1, c2])
- return new_column
+
+ fc = f[c]
+ all_funcs = {'runs' : runs,
+ 'streak' : streak,
+ 'rtotal' : rtotal,
+ 'zscore' : zscore}
+ # use all functions
+ if 'all' in wfuncs:
+ wfuncs = list(all_funcs.keys())
+ # apply each of the runs functions
+ new_features = pd.DataFrame()
+ for w in wfuncs:
+ if w in all_funcs:
+ new_feature = fc.rolling(window=window).apply(all_funcs[w])
+ new_feature.fillna(0, inplace=True)
+ new_column_name = PSEP.join([c, w])
+ new_feature = new_feature.rename(new_column_name)
+ frames = [new_features, new_feature]
+ new_features = pd.concat(frames, axis=1)
+ else:
+ logger.info("Runs Function %s not found", w)
+ return new_features
#
-# Function dminus
+# Function split_to_letters
#
-def dminus(f):
- r"""Calculate the Minus Directional Movement (-DM).
+def split_to_letters(f, c):
+ r"""Separate text into distinct characters.
Parameters
----------
f : pandas.DataFrame
- Dataframe with columns ``high`` and ``low``.
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the text column in the dataframe ``f``.
Returns
-------
- new_column : pandas.Series (float)
+ new_feature : pandas.Series
The array containing the new feature.
- References
+ Example
+ -------
+ The value 'abc' becomes 'a b c'.
+
+ """
+ fc = f[c]
+ new_feature = None
+ dtype = fc.dtypes
+ if dtype == 'object':
+ fc.fillna(NULLTEXT, inplace=True)
+ maxlen = fc.astype(str).str.len().max()
+ if maxlen > 1:
+ new_feature = fc.apply(lambda x: BSEP.join(list(x)))
+ return new_feature
+
+
+#
+# Function streak
+#
+
+def streak(vec):
+ r"""Determine the length of the latest streak.
+
+ Parameters
----------
- *Directional movement is negative (minus) when the prior low minus
- the current low is greater than the current high minus the prior high.
- This so-called Minus Directional Movement (-DM) equals the prior low
- minus the current low, provided it is positive. A negative value
- would simply be entered as zero* [SC_ADX]_.
+ vec : pandas.Series
+ The input array for calculating the latest streak.
+
+ Returns
+ -------
+ latest_streak : int
+ The length of the latest streak.
+
+ Example
+ -------
+
+ >>> vec.rolling(window=20).apply(streak)
"""
- c1 = 'downmove'
- f[c1] = -net(f, 'low')
- c2 = 'upmove'
- f[c2] = net(f, 'high')
- new_column = f.apply(gtval0, axis=1, args=[c1, c2])
- return new_column
+ latest_streak = [len(list(g)) for k, g in itertools.groupby(vec)][-1]
+ return latest_streak
#
-# Function diplus
+# Function texplode
#
-def diplus(f, p = 14):
- r"""Calculate the Plus Directional Indicator (+DI).
+def texplode(f, c):
+ r"""Get dummy values for a text column.
+
+ Parameters
+ ----------
+ f : pandas.DataFrame
+ Dataframe containing the column ``c``.
+ c : str
+ Name of the text column in the dataframe ``f``.
+
+ Returns
+ -------
+ dummies : pandas.DataFrame
+ The dataframe containing the dummy variables.
+
+ Example
+ -------
+
+ This function is useful for columns that appear to
+ have separate character codes but are consolidated
+ into a single column. Here, the column ``c`` is
+ transformed into five dummy variables.
+
+ === === === === === ===
+ c 0_a 1_x 1_b 2_x 2_z
+ === === === === === ===
+ abz 1 0 1 0 1
+ abz 1 0 1 0 1
+ axx 1 1 0 1 0
+ abz 1 0 1 0 1
+ axz 1 1 0 0 1
+ === === === === === ===
+
+ """
+ fc = f[c]
+ maxlen = fc.astype(str).str.len().max()
+ fc.fillna(maxlen * BSEP, inplace=True)
+ fpad = str().join(['{:', BSEP, '>', str(maxlen), '}'])
+ fcpad = fc.apply(fpad.format)
+ fcex = fcpad.apply(lambda x: pd.Series(list(x)))
+ dummies = pd.get_dummies(fcex)
+ return dummies
+
+
+#
+# Function truehigh
+#
+
+def truehigh(f):
+ r"""Calculate the *True High* value.
Parameters
----------
f : pandas.DataFrame
Dataframe with columns ``high`` and ``low``.
- p : int
- The period over which to calculate the +DI.
Returns
-------
@@ -1663,36 +1446,29 @@ def diplus(f, p = 14):
References
----------
- *A component of the average directional index (ADX) that is used to
- measure the presence of an uptrend. When the +DI is sloping upward,
- it is a signal that the uptrend is getting stronger* [IP_PDI]_.
+ *Today's high, or the previous close, whichever is higher* [TS_TR]_.
- .. [IP_PDI] http://www.investopedia.com/terms/p/positivedirectionalindicator.asp
+ .. [TS_TR] http://help.tradestation.com/09_01/tradestationhelp/charting_definitions/true_range.htm
"""
- tr = 'truerange'
- vexec(f, tr)
- atr = USEP.join(['atr', str(p)])
- vexec(f, atr)
- dmp = 'dmplus'
- vexec(f, dmp)
- new_column = 100 * f[dmp].ewm(span=p).mean() / f[atr]
+ c1 = 'low[1]'
+ vexec(f, c1)
+ c2 = 'high'
+ new_column = f.apply(c2max, axis=1, args=[c1, c2])
return new_column
#
-# Function diminus
+# Function truelow
#
-def diminus(f, p = 14):
- r"""Calculate the Minus Directional Indicator (-DI).
+def truelow(f):
+ r"""Calculate the *True Low* value.
Parameters
----------
f : pandas.DataFrame
Dataframe with columns ``high`` and ``low``.
- p : int
- The period over which to calculate the -DI.
Returns
-------
@@ -1701,38 +1477,27 @@ def diminus(f, p = 14):
References
----------
- *A component of the average directional index (ADX) that is used to
- measure the presence of a downtrend. When the -DI is sloping downward,
- it is a signal that the downtrend is getting stronger* [IP_NDI]_.
-
- .. [IP_NDI] http://www.investopedia.com/terms/n/negativedirectionalindicator.asp
+ *Today's low, or the previous close, whichever is lower* [TS_TR]_.
"""
- tr = 'truerange'
- vexec(f, tr)
- atr = USEP.join(['atr', str(p)])
- vexec(f, atr)
- dmm = 'dmminus'
- f[dmm] = dminus(f)
- new_column = 100 * dminus(f).ewm(span=p).mean() / f[atr]
+ c1 = 'high[1]'
+ vexec(f, c1)
+ c2 = 'low'
+ new_column = f.apply(c2min, axis=1, args=[c1, c2])
return new_column
#
-# Function adx
+# Function truerange
#
-def adx(f, p = 14):
- r"""Calculate the Average Directional Index (ADX).
+def truerange(f):
+ r"""Calculate the *True Range* value.
Parameters
----------
f : pandas.DataFrame
- Dataframe with all columns required for calculation. If you
- are applying ADX through ``vapply``, then these columns are
- calculated automatically.
- p : int
- The period over which to calculate the ADX.
+ Dataframe with columns ``high`` and ``low``.
Returns
-------
@@ -1741,33 +1506,19 @@ def adx(f, p = 14):
References
----------
- The Average Directional Movement Index (ADX) was invented by J. Welles
- Wilder in 1978 [WIKI_ADX]_. Its value reflects the strength of trend in any
- given instrument.
-
- .. [WIKI_ADX] https://en.wikipedia.org/wiki/Average_directional_movement_index
+ *True High - True Low* [TS_TR]_.
"""
- c1 = 'diplus'
- vexec(f, c1)
- c2 = 'diminus'
- vexec(f, c2)
- # calculations
- dip = f[c1]
- dim = f[c2]
- didiff = abs(dip - dim)
- disum = dip + dim
- new_column = 100 * didiff.ewm(span=p).mean() / disum
+ new_column = truehigh(f) - truelow(f)
return new_column
#
-# Function abovema
+# Function up
#
-def abovema(f, c, p = 50):
- r"""Determine those values of the dataframe that are above the
- moving average.
+def up(f, c):
+ r"""Find the positive values in the series.
Parameters
----------
@@ -1775,8 +1526,6 @@ def abovema(f, c, p = 50):
Dataframe containing the column ``c``.
c : str
Name of the column in the dataframe ``f``.
- p : int
- The period of the moving average.
Returns
-------
@@ -1784,34 +1533,31 @@ def abovema(f, c, p = 50):
The array containing the new feature.
"""
- new_column = f[c] > ma(f, c, p)
+ new_column = f[c] > 0
return new_column
#
-# Function belowma
+# Function upc
#
-def belowma(f, c, p = 50):
- r"""Determine those values of the dataframe that are below the
- moving average.
+def upc(f, c):
+ r"""Get the positive values, with negative values zeroed.
Parameters
----------
f : pandas.DataFrame
- Dataframe containing the column ``c``.
+ Dataframe with column ``c``.
c : str
- Name of the column in the dataframe ``f``.
- p : int
- The period of the moving average.
+ Name of the column.
Returns
-------
- new_column : pandas.Series (bool)
+ new_column : pandas.Series (float)
The array containing the new feature.
"""
- new_column = f[c] < ma(f, c, p)
+ new_column = f.apply(pval, axis=1, args=[c])
return new_column
@@ -1897,3 +1643,47 @@ def xmaup(f, c='close', pfast = 20, pslow = 50):
lma_prev = lma.shift(1)
new_column = (sma > lma) & (sma_prev < lma_prev)
return new_column
+
+
+#
+# Function zscore
+#
+
+def zscore(vec):
+ r"""Calculate the Z-Score.
+
+ Parameters
+ ----------
+ vec : pandas.Series
+ The input array for calculating the Z-Score.
+
+ Returns
+ -------
+ zscore : float
+ The value of the Z-Score.
+
+ References
+ ----------
+ To calculate the Z-Score, you can find more information here [ZSCORE]_.
+
+ .. [ZSCORE] https://en.wikipedia.org/wiki/Standard_score
+
+ Example
+ -------
+
+ >>> vec.rolling(window=20).apply(zscore)
+
+ """
+ n1 = np.count_nonzero(vec)
+ n2 = len(vec) - n1
+ fac1 = float(2 * n1 * n2)
+ fac2 = float(n1 + n2)
+ rbar = fac1 / fac2 + 1
+ sr2num = fac1 * (fac1 - n1 - n2)
+ sr2den = math.pow(fac2, 2) * (fac2 - 1)
+ sr = math.sqrt(sr2num / sr2den)
+ if sr2den and sr:
+ zscore = (runs(vec) - rbar) / sr
+ else:
+ zscore = 0
+ return zscore
diff --git a/alphapy/utilities.py b/alphapy/utilities.py
index db4ae24..f395ffe 100644
--- a/alphapy/utilities.py
+++ b/alphapy/utilities.py
@@ -30,10 +30,12 @@
import argparse
from datetime import datetime, timedelta
+import glob
import inspect
from itertools import groupby
import logging
import numpy as np
+import os
from os import listdir
from os.path import isfile, join
import re
@@ -46,6 +48,53 @@
logger = logging.getLogger(__name__)
+#
+# Function get_datestamp
+#
+
+def get_datestamp():
+ r"""Returns today's datestamp.
+
+ Returns
+ -------
+ datestamp : str
+ The valid date string in YYYY-mm-dd format.
+
+ """
+ d = datetime.now()
+ f = "%Y%m%d"
+ datestamp = d.strftime(f)
+ return datestamp
+
+
+#
+# Function most_recent_file
+#
+
+def most_recent_file(directory, file_spec):
+ r"""Find the most recent file in a directory.
+
+ Parameters
+ ----------
+ directory : str
+ Full directory specification.
+ file_spec : str
+ Wildcard search string for the file to locate.
+
+ Returns
+ -------
+ file_name : str
+ Name of the file to read, excluding the ``extension``.
+
+ """
+ # Create search path
+ search_path = SSEP.join([directory, file_spec])
+ # find the latest file
+ file_name = max(glob.iglob(search_path), key=os.path.getctime)
+ # load the model predictor
+ return file_name
+
+
#
# Function np_store_data
#
diff --git a/alphapy/variables.py b/alphapy/variables.py
new file mode 100644
index 0000000..8477647
--- /dev/null
+++ b/alphapy/variables.py
@@ -0,0 +1,612 @@
+################################################################################
+#
+# Package : AlphaPy
+# Module : variables
+# Created : July 11, 2013
+#
+# Copyright 2020 ScottFree Analytics LLC
+# Mark Conway & Robert D. Scott II
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+
+#
+# Variables
+# ---------
+#
+# Numeric substitution is allowed for any number in the expression.
+# Offsets are allowed in event expressions but cannot be substituted.
+#
+# Examples
+# --------
+#
+# Variable('rrunder', 'rr_3_20 <= 0.9')
+#
+# 'rrunder_2_10_0.7'
+# 'rrunder_2_10_0.9'
+# 'xmaup_20_50_20_200'
+# 'xmaup_10_50_20_50'
+#
+
+
+#
+# Imports
+#
+
+from alphapy.alias import get_alias
+from alphapy.frame import Frame
+from alphapy.frame import frame_name
+from alphapy.globals import BSEP, LOFF, ROFF, USEP
+from alphapy.utilities import valid_name
+
+import builtins
+from collections import OrderedDict
+from importlib import import_module
+import logging
+import numpy as np
+import pandas as pd
+import parser
+import re
+import sys
+
+
+#
+# Initialize logger
+#
+
+logger = logging.getLogger(__name__)
+
+
+#
+# Class Variable
+#
+
+class Variable(object):
+ """Create a new variable as a key-value pair. All variables are stored
+ in ``Variable.variables``. Duplicate keys or values are not allowed,
+ unless the ``replace`` parameter is ``True``.
+
+ Parameters
+ ----------
+ name : str
+ Variable key.
+ expr : str
+ Variable value.
+ replace : bool, optional
+ Replace the current key-value pair if it already exists.
+
+ Attributes
+ ----------
+ variables : dict
+ Class variable for storing all known variables
+
+ Examples
+ --------
+
+ >>> Variable('rrunder', 'rr_3_20 <= 0.9')
+ >>> Variable('hc', 'higher_close')
+
+ """
+
+ # class variable to track all variables
+
+ variables = {}
+
+ # function __new__
+
+ def __new__(cls,
+ name,
+ expr,
+ replace = False):
+ # code
+ efound = expr in [Variable.variables[key].expr for key in Variable.variables]
+ if efound:
+ key = [key for key in Variable.variables if expr in Variable.variables[key].expr]
+ logger.info("Expression '%s' already exists for key %s", expr, key)
+ return
+ else:
+ if replace or not name in Variable.variables:
+ if not valid_name(name):
+ logger.info("Invalid variable key: %s", name)
+ return
+ try:
+ result = parser.expr(expr)
+ except:
+ logger.info("Invalid expression: %s", expr)
+ return
+ return super(Variable, cls).__new__(cls)
+ else:
+ logger.info("Key %s already exists", name)
+
+ # function __init__
+
+ def __init__(self,
+ name,
+ expr,
+ replace = False):
+ # code
+ self.name = name;
+ self.expr = expr;
+ # add key with expression
+ Variable.variables[name] = self
+
+ # function __str__
+
+ def __str__(self):
+ return self.expr
+
+
+#
+# Function vparse
+#
+
+def vparse(vname):
+ r"""Parse a variable name into its respective components.
+
+ Parameters
+ ----------
+ vname : str
+ The name of the variable.
+
+ Returns
+ -------
+ vxlag : str
+ Variable name without the ``lag`` component.
+ root : str
+ The base variable name without the parameters.
+ plist : list
+ The parameter list.
+ lag : int
+ The offset starting with the current value [0]
+ and counting back, e.g., an offset [1] means the
+ previous value of the variable.
+
+ Notes
+ -----
+
+ **AlphaPy** makes feature creation easy. The syntax
+ of a variable name maps to a function call:
+
+ xma_20_50 => xma(20, 50)
+
+ Examples
+ --------
+
+ >>> vparse('xma_20_50[1]')
+ # ('xma_20_50', 'xma', ['20', '50'], 1)
+
+ """
+
+ # split along lag first
+ lsplit = vname.split(LOFF)
+ vxlag = lsplit[0]
+ # if necessary, substitute any alias
+ root = vxlag.split(USEP)[0]
+ alias = get_alias(root)
+ if alias:
+ vxlag = vxlag.replace(root, alias)
+ vsplit = vxlag.split(USEP)
+ root = vsplit[0]
+ plist = vsplit[1:]
+ # extract lag
+ lag = 0
+ if len(lsplit) > 1:
+ # lag is present
+ slag = lsplit[1].replace(ROFF, '')
+ if len(slag) > 0:
+ lpat = r'(^-?[0-9]+$)'
+ lre = re.compile(lpat)
+ if lre.match(slag):
+ lag = int(slag)
+ # return all components
+ return vxlag, root, plist, lag
+
+
+#
+# Function allvars
+#
+
+def allvars(expr):
+ r"""Get the list of valid names in the expression.
+
+ Parameters
+ ----------
+ expr : str
+ A valid expression conforming to the Variable Definition Language.
+
+ Returns
+ -------
+ vlist : list
+ List of valid variable names.
+
+ """
+ regex = re.compile('\w+')
+ items = regex.findall(expr)
+ vlist = []
+ for item in items:
+ if valid_name(item):
+ vlist.append(item)
+ return vlist
+
+
+#
+# Function vtree
+#
+
+def vtree(vname):
+ r"""Get all of the antecedent variables.
+
+ Before applying a variable to a dataframe, we have to recursively
+ get all of the child variables, beginning with the starting variable's
+ expression. Then, we have to extract the variables from all the
+ subsequent expressions. This process continues until all antecedent
+ variables are obtained.
+
+ Parameters
+ ----------
+ vname : str
+ A valid variable stored in ``Variable.variables``.
+
+ Returns
+ -------
+ all_variables : list
+ The variables that need to be applied before ``vname``.
+
+ Other Parameters
+ ----------------
+ Variable.variables : dict
+ Global dictionary of variables
+
+ """
+ allv = []
+ def vwalk(allv, vname):
+ vxlag, root, plist, lag = vparse(vname)
+ if root in Variable.variables:
+ root_expr = Variable.variables[root].expr
+ expr = vsub(vname, root_expr)
+ av = allvars(expr)
+ for v in av:
+ vwalk(allv, v)
+ else:
+ for p in plist:
+ if valid_name(p):
+ vwalk(allv, p)
+ allv.append(vname)
+ return allv
+ allv = vwalk(allv, vname)
+ all_variables = list(OrderedDict.fromkeys(allv))
+ return all_variables
+
+
+#
+# Function vsub
+#
+
+def vsub(v, expr):
+ r"""Substitute the variable parameters into the expression.
+
+ This function performs the parameter substitution when
+ applying features to a dataframe. It is a mechanism for
+ the user to override the default values in any given
+ expression when defining a feature, instead of having
+ to programmatically call a function with new values.
+
+ Parameters
+ ----------
+ v : str
+ Variable name.
+ expr : str
+ The expression for substitution.
+
+ Returns
+ -------
+ newexpr
+ The expression with the new, substituted values.
+
+ """
+ # numbers pattern
+ npat = '[-+]?[0-9]*\.?[0-9]+'
+ nreg = re.compile(npat)
+ # find all number locations in variable name
+ vnums = nreg.findall(v)
+ viter = nreg.finditer(v)
+ vlocs = []
+ for match in viter:
+ vlocs.append(match.span())
+ # find all number locations in expression
+ # find all non-number locations as well
+ elen = len(expr)
+ enums = nreg.findall(expr)
+ eiter = nreg.finditer(expr)
+ elocs = []
+ enlocs = []
+ index = 0
+ for match in eiter:
+ eloc = match.span()
+ elocs.append(eloc)
+ enlocs.append((index, eloc[0]))
+ index = eloc[1]
+ # build new expression
+ newexpr = str()
+ for i, enloc in enumerate(enlocs):
+ if i < len(vlocs):
+ newexpr += expr[enloc[0]:enloc[1]] + v[vlocs[i][0]:vlocs[i][1]]
+ else:
+ newexpr += expr[enloc[0]:enloc[1]] + expr[elocs[i][0]:elocs[i][1]]
+ if elocs:
+ estart = elocs[len(elocs)-1][1]
+ else:
+ estart = 0
+ newexpr += expr[estart:elen]
+ return newexpr
+
+
+#
+# Function vexec
+#
+
+def vexec(f, v, vfuncs=None):
+ r"""Add a variable to the given dataframe.
+
+ This is the core function for adding a variable to a dataframe.
+ The default variable functions are already defined locally
+ in ``alphapy.transforms``; however, you may want to define your
+ own variable functions. If so, then the ``vfuncs`` parameter
+ will contain the list of modules and functions to be imported
+ and applied by the ``vexec`` function.
+
+ To write your own variable function, your function must have
+ a pandas *DataFrame* as an input parameter and must return
+ a pandas *DataFrame* with the new variable(s).
+
+ Parameters
+ ----------
+ f : pandas.DataFrame
+ Dataframe to contain the new variable.
+ v : str
+ Variable to add to the dataframe.
+ vfuncs : dict, optional
+ Dictionary of external modules and functions.
+
+ Returns
+ -------
+ f : pandas.DataFrame
+ Dataframe with the new variable.
+
+ Other Parameters
+ ----------------
+ Variable.variables : dict
+ Global dictionary of variables
+
+ """
+ vxlag, root, plist, lag = vparse(v)
+ logger.debug("vexec : %s", v)
+ logger.debug("vxlag : %s", vxlag)
+ logger.debug("root : %s", root)
+ logger.debug("plist : %s", plist)
+ logger.debug("lag : %s", lag)
+ if vxlag not in f.columns:
+ if root in Variable.variables:
+ logger.debug("Found variable %s: ", root)
+ vroot = Variable.variables[root]
+ expr = vroot.expr
+ expr_new = vsub(vxlag, expr)
+ estr = "%s" % expr_new
+ logger.debug("Expression: %s", estr)
+ # pandas eval
+ f[vxlag] = f.eval(estr)
+ else:
+ logger.debug("Did not find variable: %s", root)
+ # Must be a function call
+ func_name = root
+ # Convert the parameter list and prepend the data frame
+ newlist = []
+ for p in plist:
+ try:
+ newlist.append(int(p))
+ except:
+ try:
+ newlist.append(float(p))
+ except:
+ newlist.append(p)
+ newlist.insert(0, f)
+ # Find the module and function
+ module = None
+ if vfuncs:
+ for m in vfuncs:
+ funcs = vfuncs[m]
+ if func_name in funcs:
+ module = m
+ break
+ # If the module was found, import the external transform function,
+ # else search the local namespace and AlphaPy.
+ if module:
+ ext_module = import_module(module)
+ func = getattr(ext_module, func_name)
+ else:
+ modname = globals()['__name__']
+ module = sys.modules[modname]
+ if func_name in dir(module):
+ func = getattr(module, func_name)
+ else:
+ try:
+ ap_module = import_module('alphapy.transforms')
+ func = getattr(ap_module, func_name)
+ except:
+ func = None
+ if func:
+ # Create the variable by calling the function
+ f[v] = func(*newlist)
+ elif func_name not in dir(builtins):
+ module_error = "*** Could not find module to execute function {} ***".format(func_name)
+ logger.error(module_error)
+ sys.exit(module_error)
+ # if necessary, add the lagged variable
+ if lag > 0 and vxlag in f.columns:
+ f[v] = f[vxlag].shift(lag)
+ # output frame
+ return f
+
+
+#
+# Function vapply
+#
+
+def vapply(group, vname, vfuncs=None):
+ r"""Apply a variable to multiple dataframes.
+
+ Parameters
+ ----------
+ group : alphapy.Group
+ The input group.
+ vname : str
+ The variable to apply to the ``group``.
+ vfuncs : dict, optional
+ Dictionary of external modules and functions.
+
+ Returns
+ -------
+ None : None
+
+ Other Parameters
+ ----------------
+ Frame.frames : dict
+ Global dictionary of dataframes
+
+ See Also
+ --------
+ vunapply
+
+ """
+ # get all frame names to apply variables
+ gnames = [item.lower() for item in group.members]
+ # get all the precedent variables
+ allv = vtree(vname)
+ # apply the variables to each frame
+ for g in gnames:
+ fname = frame_name(g, group.space)
+ if fname in Frame.frames:
+ f = Frame.frames[fname].df
+ if not f.empty:
+ for v in allv:
+ logger.debug("Applying variable %s to %s", v, g)
+ f = vexec(f, v, vfuncs)
+ else:
+ logger.debug("Frame for %s is empty", g)
+ else:
+ logger.debug("Frame not found: %s", fname)
+
+
+#
+# Function vmapply
+#
+
+def vmapply(group, vs, vfuncs=None):
+ r"""Apply multiple variables to multiple dataframes.
+
+ Parameters
+ ----------
+ group : alphapy.Group
+ The input group.
+ vs : list
+ The list of variables to apply to the ``group``.
+ vfuncs : dict, optional
+ Dictionary of external modules and functions.
+
+ Returns
+ -------
+ None : None
+
+ See Also
+ --------
+ vmunapply
+
+ """
+ for v in vs:
+ logger.info("Applying variable: %s", v)
+ vapply(group, v, vfuncs)
+
+
+#
+# Function vunapply
+#
+
+def vunapply(group, vname):
+ r"""Remove a variable from multiple dataframes.
+
+ Parameters
+ ----------
+ group : alphapy.Group
+ The input group.
+ vname : str
+ The variable to remove from the ``group``.
+
+ Returns
+ -------
+ None : None
+
+ Other Parameters
+ ----------------
+ Frame.frames : dict
+ Global dictionary of dataframes
+
+ See Also
+ --------
+ vapply
+
+ """
+ # get all frame names to apply variables
+ gnames = [item.lower() for item in group.all_members()]
+ # apply the variables to each frame
+ for g in gnames:
+ fname = frame_name(g, group.space)
+ if fname in Frame.frames:
+ f = Frame.frames[fname].df
+ logger.info("Unapplying variable %s from %s", vname, g)
+ if vname not in f.columns:
+ logger.info("Variable %s not in %s frame", vname, g)
+ else:
+ estr = "Frame.frames['%s'].df = f.df.drop('%s', axis=1)" \
+ % (fname, vname)
+ exec(estr)
+ else:
+ logger.info("Frame not found: %s", fname)
+
+
+#
+# Function vmunapply
+#
+
+def vmunapply(group, vs):
+ r"""Remove a list of variables from multiple dataframes.
+
+ Parameters
+ ----------
+ group : alphapy.Group
+ The input group.
+ vs : list
+ The list of variables to remove from the ``group``.
+
+ Returns
+ -------
+ None : None
+
+ See Also
+ --------
+ vmapply
+
+ """
+ for v in vs:
+ vunapply(group, v)
diff --git a/docs/.DS_Store b/docs/.DS_Store
new file mode 100644
index 0000000..3131e2b
Binary files /dev/null and b/docs/.DS_Store differ
diff --git a/docs/conf.py b/docs/conf.py
index ec841cf..acf340d 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -34,7 +34,9 @@
# ones.
extensions = ['sphinx.ext.autodoc',
'sphinx.ext.napoleon',
- 'sphinx.ext.mathjax']
+ 'sphinx.ext.mathjax',
+ 'sphinx_rtd_theme',
+ 'sphinx_rtd_dark_mode']
napoleon_google_docstring = False
napoleon_use_param = False
@@ -54,7 +56,7 @@
# General information about the project.
project = 'AlphaPy'
-copyright = '2017, ScottFree Analytics LLC'
+copyright = '2024, ScottFree Analytics LLC'
author = 'Robert D. Scott II, Mark Conway'
# The version info for the project you're documenting, acts as replacement for
@@ -62,16 +64,16 @@
# built documents.
#
# The short X.Y version.
-version = '2.0'
+version = '2.5.0'
# The full version, including alpha/beta/rc tags.
-release = '2.0'
+release = '2.5.0'
# 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
+language = 'en'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
@@ -156,6 +158,6 @@
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'AlphaPy', 'AlphaPy Documentation',
- author, 'AlphaPy', 'One line description of project.',
+ author, 'AlphaPy', 'AutoML for Data Scientists and Speculators',
'Miscellaneous'),
]
diff --git a/docs/source/alphapy.rst b/docs/source/alphapy.rst
index 058c8e1..1786679 100644
--- a/docs/source/alphapy.rst
+++ b/docs/source/alphapy.rst
@@ -28,6 +28,14 @@ alphapy.analysis module
:undoc-members:
:show-inheritance:
+alphapy.calendrical module
+--------------------------
+
+.. automodule:: alphapy.calendrical
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
alphapy.data module
-------------------
@@ -84,14 +92,6 @@ alphapy.market_flow module
:undoc-members:
:show-inheritance:
-alphapy.market_variables module
--------------------------------
-
-.. automodule:: alphapy.market_variables
- :members:
- :undoc-members:
- :show-inheritance:
-
alphapy.model module
--------------------
@@ -148,6 +148,14 @@ alphapy.system module
:undoc-members:
:show-inheritance:
+alphapy.transforms module
+-------------------------
+
+.. automodule:: alphapy.transforms
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
alphapy.utilities module
------------------------
@@ -155,3 +163,11 @@ alphapy.utilities module
:members:
:undoc-members:
:show-inheritance:
+
+alphapy.variables module
+------------------------
+
+.. automodule:: alphapy.variables
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/tutorials/closer_market.yml b/docs/tutorials/closer_market.yml
index 635824e..76debb1 100644
--- a/docs/tutorials/closer_market.yml
+++ b/docs/tutorials/closer_market.yml
@@ -1,10 +1,14 @@
market:
- data_history : 1000
+ create_model : False
+ data_fractal : 1d
+ data_history : 500
forecast_period : 1
fractal : 1d
+ lag_period : 1
leaders : []
predict_history : 50
- schema : prices
+ schema : quandl_wiki
+ subject : stock
target_group : faang
system:
diff --git a/docs/tutorials/market.rst b/docs/tutorials/market.rst
index a227c4a..06d0fc6 100644
--- a/docs/tutorials/market.rst
+++ b/docs/tutorials/market.rst
@@ -85,7 +85,7 @@ what we are trying to predict.
**Step 2**: Now, let's run MarketFlow::
- mflow --pdate 2017-01-01
+ mflow --pdate 2017-10-01
As ``mflow`` runs, you will see the progress of the workflow,
and the logging output is saved in ``market_flow.log``. When the
@@ -100,7 +100,9 @@ with a different datestamp::
├── model.yml
└── data
└── input
+ ├── test_20170420.csv
├── test.csv
+ ├── train_20170420.csv
├── train.csv
└── model
├── feature_map_20170420.pkl
diff --git a/docs/tutorials/rrover_market.yml b/docs/tutorials/rrover_market.yml
index 7f73975..4d9ed20 100644
--- a/docs/tutorials/rrover_market.yml
+++ b/docs/tutorials/rrover_market.yml
@@ -1,10 +1,14 @@
market:
- data_history : 2000
+ create_model : True
+ data_fractal : 1d
+ data_history : 500
forecast_period : 1
fractal : 1d
+ lag_period : 1
leaders : ['gap', 'gapbadown', 'gapbaup', 'gapdown', 'gapup']
predict_history : 100
- schema : prices
+ schema : yahoo
+ subject : stock
target_group : test
groups:
diff --git a/docs/user_guide/alphapy.log b/docs/user_guide/alphapy.log
index 0f81e31..053f136 100644
--- a/docs/user_guide/alphapy.log
+++ b/docs/user_guide/alphapy.log
@@ -1,354 +1,361 @@
-[04/18/17 12:08:34] INFO ********************************************************************************
-[04/18/17 12:08:34] INFO AlphaPy Start
-[04/18/17 12:08:34] INFO ********************************************************************************
-[04/18/17 12:08:34] INFO Model Configuration
-[04/18/17 12:08:34] INFO No Treatments Found
-[04/18/17 12:08:34] INFO MODEL PARAMETERS:
-[04/18/17 12:08:34] INFO algorithms = ['RF', 'XGB']
-[04/18/17 12:08:34] INFO balance_classes = True
-[04/18/17 12:08:34] INFO calibration = False
-[04/18/17 12:08:34] INFO cal_type = sigmoid
-[04/18/17 12:08:34] INFO calibration_plot = False
-[04/18/17 12:08:34] INFO clustering = True
-[04/18/17 12:08:34] INFO cluster_inc = 3
-[04/18/17 12:08:34] INFO cluster_max = 30
-[04/18/17 12:08:34] INFO cluster_min = 3
-[04/18/17 12:08:34] INFO confusion_matrix = True
-[04/18/17 12:08:34] INFO counts = True
-[04/18/17 12:08:34] INFO cv_folds = 3
-[04/18/17 12:08:34] INFO directory = /Users/markconway/Projects/Titanic
-[04/18/17 12:08:34] INFO extension = csv
-[04/18/17 12:08:34] INFO drop = ['PassengerId']
-[04/18/17 12:08:34] INFO encoder =
-[04/18/17 12:08:34] INFO esr = 20
-[04/18/17 12:08:34] INFO factors = []
-[04/18/17 12:08:34] INFO features [X] = *
-[04/18/17 12:08:34] INFO feature_selection = False
-[04/18/17 12:08:34] INFO fs_percentage = 50
-[04/18/17 12:08:34] INFO fs_score_func =
-[04/18/17 12:08:34] INFO fs_uni_grid = [5, 10, 15, 20, 25]
-[04/18/17 12:08:34] INFO grid_search = True
-[04/18/17 12:08:34] INFO gs_iters = 50
-[04/18/17 12:08:34] INFO gs_random = True
-[04/18/17 12:08:34] INFO gs_sample = False
-[04/18/17 12:08:34] INFO gs_sample_pct = 0.200000
-[04/18/17 12:08:34] INFO importances = True
-[04/18/17 12:08:34] INFO interactions = True
-[04/18/17 12:08:34] INFO isomap = False
-[04/18/17 12:08:34] INFO iso_components = 2
-[04/18/17 12:08:34] INFO iso_neighbors = 5
-[04/18/17 12:08:34] INFO isample_pct = 10
-[04/18/17 12:08:34] INFO learning_curve = True
-[04/18/17 12:08:34] INFO logtransform = False
-[04/18/17 12:08:34] INFO lv_remove = True
-[04/18/17 12:08:34] INFO lv_threshold = 0.100000
-[04/18/17 12:08:34] INFO model_type =
-[04/18/17 12:08:34] INFO n_estimators = 51
-[04/18/17 12:08:34] INFO n_jobs = -1
-[04/18/17 12:08:34] INFO ngrams_max = 3
-[04/18/17 12:08:34] INFO numpy = True
-[04/18/17 12:08:34] INFO pca = False
-[04/18/17 12:08:34] INFO pca_inc = 1
-[04/18/17 12:08:34] INFO pca_max = 10
-[04/18/17 12:08:34] INFO pca_min = 2
-[04/18/17 12:08:34] INFO pca_whiten = False
-[04/18/17 12:08:34] INFO poly_degree = 5
-[04/18/17 12:08:34] INFO pvalue_level = 0.010000
-[04/18/17 12:08:34] INFO rfe = True
-[04/18/17 12:08:34] INFO rfe_step = 3
-[04/18/17 12:08:34] INFO roc_curve = True
-[04/18/17 12:08:34] INFO rounding = 2
-[04/18/17 12:08:34] INFO sampling = False
-[04/18/17 12:08:34] INFO sampling_method =
-[04/18/17 12:08:34] INFO sampling_ratio = 0.500000
-[04/18/17 12:08:34] INFO scaler_option = True
-[04/18/17 12:08:34] INFO scaler_type =
-[04/18/17 12:08:34] INFO scipy = False
-[04/18/17 12:08:34] INFO scorer = roc_auc
-[04/18/17 12:08:34] INFO seed = 42
-[04/18/17 12:08:34] INFO sentinel = -1
-[04/18/17 12:08:34] INFO separator = ,
-[04/18/17 12:08:34] INFO shuffle = False
-[04/18/17 12:08:34] INFO split = 0.400000
-[04/18/17 12:08:34] INFO submission_file = gender_submission
-[04/18/17 12:08:34] INFO submit_probas = False
-[04/18/17 12:08:34] INFO target [y] = Survived
-[04/18/17 12:08:34] INFO target_value = 1
-[04/18/17 12:08:34] INFO treatments = None
-[04/18/17 12:08:34] INFO tsne = False
-[04/18/17 12:08:34] INFO tsne_components = 2
-[04/18/17 12:08:34] INFO tsne_learn_rate = 1000.000000
-[04/18/17 12:08:34] INFO tsne_perplexity = 30.000000
-[04/18/17 12:08:34] INFO vectorize = False
-[04/18/17 12:08:34] INFO verbosity = 0
-[04/18/17 12:08:34] INFO Creating Model
-[04/18/17 12:08:34] INFO Calling Pipeline
-[04/18/17 12:08:34] INFO Training Pipeline
-[04/18/17 12:08:34] INFO Loading Data
-[04/18/17 12:08:34] INFO Loading data from /Users/markconway/Projects/Titanic/input/train.csv
-[04/18/17 12:08:34] INFO Found target Survived in data frame
-[04/18/17 12:08:34] INFO Dropping target Survived from data frame
-[04/18/17 12:08:34] INFO Loading Data
-[04/18/17 12:08:34] INFO Loading data from /Users/markconway/Projects/Titanic/input/test.csv
-[04/18/17 12:08:34] INFO Target Survived not found in partition Partition.test
-[04/18/17 12:08:34] INFO Saving New Features in Model
-[04/18/17 12:08:34] INFO Dropping Features: ['PassengerId']
-[04/18/17 12:08:34] INFO Saving New Features in Model
-[04/18/17 12:08:34] INFO Original Feature Statistics
-[04/18/17 12:08:34] INFO Number of Training Rows : 891
-[04/18/17 12:08:34] INFO Number of Training Columns : 10
-[04/18/17 12:08:34] INFO Unique Training Values for Survived : [0 1]
-[04/18/17 12:08:34] INFO Unique Training Counts for Survived : [549 342]
-[04/18/17 12:08:34] INFO Number of Testing Rows : 418
-[04/18/17 12:08:34] INFO Number of Testing Columns : 10
-[04/18/17 12:08:34] INFO Original Features : Index(['Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare',
- 'Cabin', 'Embarked'],
+[12/30/17 23:17:49] INFO ********************************************************************************
+[12/30/17 23:17:49] INFO AlphaPy Start
+[12/30/17 23:17:49] INFO ********************************************************************************
+[12/30/17 23:17:49] INFO Model Configuration
+[12/30/17 23:17:49] INFO No Treatments Found
+[12/30/17 23:17:49] INFO MODEL PARAMETERS:
+[12/30/17 23:17:49] INFO algorithms = ['RF', 'XGB']
+[12/30/17 23:17:49] INFO balance_classes = True
+[12/30/17 23:17:49] INFO calibration = False
+[12/30/17 23:17:49] INFO cal_type = sigmoid
+[12/30/17 23:17:49] INFO calibration_plot = False
+[12/30/17 23:17:49] INFO clustering = True
+[12/30/17 23:17:49] INFO cluster_inc = 3
+[12/30/17 23:17:49] INFO cluster_max = 30
+[12/30/17 23:17:49] INFO cluster_min = 3
+[12/30/17 23:17:49] INFO confusion_matrix = True
+[12/30/17 23:17:49] INFO counts = True
+[12/30/17 23:17:49] INFO cv_folds = 3
+[12/30/17 23:17:49] INFO directory = .
+[12/30/17 23:17:49] INFO extension = csv
+[12/30/17 23:17:49] INFO drop = ['PassengerId']
+[12/30/17 23:17:49] INFO encoder =
+[12/30/17 23:17:50] INFO esr = 20
+[12/30/17 23:17:50] INFO factors = []
+[12/30/17 23:17:50] INFO features [X] = *
+[12/30/17 23:17:50] INFO feature_selection = False
+[12/30/17 23:17:50] INFO fs_percentage = 50
+[12/30/17 23:17:50] INFO fs_score_func =
+[12/30/17 23:17:50] INFO fs_uni_grid = [5, 10, 15, 20, 25]
+[12/30/17 23:17:50] INFO grid_search = True
+[12/30/17 23:17:50] INFO gs_iters = 50
+[12/30/17 23:17:50] INFO gs_random = True
+[12/30/17 23:17:50] INFO gs_sample = False
+[12/30/17 23:17:50] INFO gs_sample_pct = 0.200000
+[12/30/17 23:17:50] INFO importances = True
+[12/30/17 23:17:50] INFO interactions = True
+[12/30/17 23:17:50] INFO isomap = False
+[12/30/17 23:17:50] INFO iso_components = 2
+[12/30/17 23:17:50] INFO iso_neighbors = 5
+[12/30/17 23:17:50] INFO isample_pct = 10
+[12/30/17 23:17:50] INFO learning_curve = True
+[12/30/17 23:17:50] INFO logtransform = False
+[12/30/17 23:17:50] INFO lv_remove = True
+[12/30/17 23:17:50] INFO lv_threshold = 0.100000
+[12/30/17 23:17:50] INFO model_type =
+[12/30/17 23:17:50] INFO n_estimators = 51
+[12/30/17 23:17:50] INFO n_jobs = -1
+[12/30/17 23:17:50] INFO ngrams_max = 3
+[12/30/17 23:17:50] INFO numpy = True
+[12/30/17 23:17:50] INFO pca = False
+[12/30/17 23:17:50] INFO pca_inc = 1
+[12/30/17 23:17:50] INFO pca_max = 10
+[12/30/17 23:17:50] INFO pca_min = 2
+[12/30/17 23:17:50] INFO pca_whiten = False
+[12/30/17 23:17:50] INFO poly_degree = 5
+[12/30/17 23:17:50] INFO pvalue_level = 0.010000
+[12/30/17 23:17:50] INFO rfe = True
+[12/30/17 23:17:50] INFO rfe_step = 3
+[12/30/17 23:17:50] INFO roc_curve = True
+[12/30/17 23:17:50] INFO rounding = 2
+[12/30/17 23:17:50] INFO sampling = False
+[12/30/17 23:17:50] INFO sampling_method =
+[12/30/17 23:17:50] INFO sampling_ratio = 0.500000
+[12/30/17 23:17:50] INFO scaler_option = True
+[12/30/17 23:17:50] INFO scaler_type =
+[12/30/17 23:17:50] INFO scipy = False
+[12/30/17 23:17:50] INFO scorer = roc_auc
+[12/30/17 23:17:50] INFO seed = 42
+[12/30/17 23:17:50] INFO sentinel = -1
+[12/30/17 23:17:50] INFO separator = ,
+[12/30/17 23:17:50] INFO shuffle = False
+[12/30/17 23:17:50] INFO split = 0.400000
+[12/30/17 23:17:50] INFO submission_file = gender_submission
+[12/30/17 23:17:50] INFO submit_probas = False
+[12/30/17 23:17:50] INFO target [y] = Survived
+[12/30/17 23:17:50] INFO target_value = 1
+[12/30/17 23:17:50] INFO treatments = None
+[12/30/17 23:17:50] INFO tsne = False
+[12/30/17 23:17:50] INFO tsne_components = 2
+[12/30/17 23:17:50] INFO tsne_learn_rate = 1000.000000
+[12/30/17 23:17:50] INFO tsne_perplexity = 30.000000
+[12/30/17 23:17:50] INFO vectorize = False
+[12/30/17 23:17:50] INFO verbosity = 0
+[12/30/17 23:17:50] INFO Creating directory ./data
+[12/30/17 23:17:50] INFO Creating directory ./model
+[12/30/17 23:17:50] INFO Creating directory ./output
+[12/30/17 23:17:50] INFO Creating directory ./plots
+[12/30/17 23:17:50] INFO Creating Model
+[12/30/17 23:17:50] INFO Calling Pipeline
+[12/30/17 23:17:50] INFO Training Pipeline
+[12/30/17 23:17:50] INFO Loading Data
+[12/30/17 23:17:50] INFO Loading data from ./input/train.csv
+[12/30/17 23:17:50] INFO Found target Survived in data frame
+[12/30/17 23:17:50] INFO Labels (y) found for Partition.train
+[12/30/17 23:17:50] INFO Loading Data
+[12/30/17 23:17:50] INFO Loading data from ./input/test.csv
+[12/30/17 23:17:50] INFO Target Survived not found in Partition.test
+[12/30/17 23:17:50] INFO Saving New Features in Model
+[12/30/17 23:17:50] INFO Original Feature Statistics
+[12/30/17 23:17:50] INFO Number of Training Rows : 891
+[12/30/17 23:17:50] INFO Number of Training Columns : 11
+[12/30/17 23:17:50] INFO Unique Training Values for Survived : [0 1]
+[12/30/17 23:17:50] INFO Unique Training Counts for Survived : [549 342]
+[12/30/17 23:17:50] INFO Number of Testing Rows : 418
+[12/30/17 23:17:50] INFO Number of Testing Columns : 11
+[12/30/17 23:17:50] INFO Original Features : Index(['PassengerId', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch',
+ 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
-[04/18/17 12:08:34] INFO Feature Count : 10
-[04/18/17 12:08:34] INFO Applying Treatments
-[04/18/17 12:08:34] INFO New Feature Count : 10
-[04/18/17 12:08:34] INFO Saving New Features in Model
-[04/18/17 12:08:34] INFO Creating Cross-Tabulations
-[04/18/17 12:08:34] INFO Original Features : Index(['Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare',
+[12/30/17 23:17:50] INFO Feature Count : 11
+[12/30/17 23:17:50] INFO Applying Treatments
+[12/30/17 23:17:50] INFO No Treatments Specified
+[12/30/17 23:17:50] INFO New Feature Count : 11
+[12/30/17 23:17:50] INFO Dropping Features: ['PassengerId']
+[12/30/17 23:17:50] INFO Original Feature Count : 11
+[12/30/17 23:17:50] INFO Reduced Feature Count : 10
+[12/30/17 23:17:50] INFO Writing data frame to ./input/train_20171230.csv
+[12/30/17 23:17:50] INFO Writing data frame to ./input/test_20171230.csv
+[12/30/17 23:17:50] INFO Creating Cross-Tabulations
+[12/30/17 23:17:50] INFO Original Features : Index(['Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare',
'Cabin', 'Embarked'],
dtype='object')
-[04/18/17 12:08:34] INFO Feature Count : 10
-[04/18/17 12:08:34] INFO Creating Count Features
-[04/18/17 12:08:34] INFO NA Counts
-[04/18/17 12:08:34] INFO Number Counts
-[04/18/17 12:08:34] INFO New Feature Count : 21
-[04/18/17 12:08:34] INFO Creating Base Features
-[04/18/17 12:08:34] INFO Feature 1: Pclass is a numerical feature of type int64 with 3 unique values
-[04/18/17 12:08:34] INFO Feature 2: Name is a text feature [12:82] with 1307 unique values
-[04/18/17 12:08:34] INFO Feature 2: Name => Factorization
-[04/18/17 12:08:34] INFO Feature 3: Sex is a text feature [4:6] with 2 unique values
-[04/18/17 12:08:34] INFO Feature 3: Sex => Factorization
-[04/18/17 12:08:34] INFO Feature 4: Age is a numerical feature of type float64 with 99 unique values
-[04/18/17 12:08:34] INFO Feature 5: SibSp is a numerical feature of type int64 with 7 unique values
-[04/18/17 12:08:34] INFO Feature 6: Parch is a numerical feature of type int64 with 8 unique values
-[04/18/17 12:08:34] INFO Feature 7: Ticket is a text feature [3:18] with 929 unique values
-[04/18/17 12:08:34] INFO Feature 7: Ticket => Factorization
-[04/18/17 12:08:34] INFO Feature 8: Fare is a numerical feature of type float64 with 282 unique values
-[04/18/17 12:08:34] INFO Feature 9: Cabin is a text feature [1:15] with 187 unique values
-[04/18/17 12:08:34] INFO Feature 9: Cabin => Factorization
-[04/18/17 12:08:34] INFO Feature 10: Embarked is a text feature [1:1] with 4 unique values
-[04/18/17 12:08:34] INFO Feature 10: Embarked => Factorization
-[04/18/17 12:08:34] INFO Feature 11: nan_count is a numerical feature of type int64 with 3 unique values
-[04/18/17 12:08:34] INFO Feature 12: count_0 is a numerical feature of type int64 with 4 unique values
-[04/18/17 12:08:34] INFO Feature 13: count_1 is a numerical feature of type int64 with 4 unique values
-[04/18/17 12:08:34] INFO Feature 14: count_2 is a numerical feature of type int64 with 4 unique values
-[04/18/17 12:08:34] INFO Feature 15: count_3 is a numerical feature of type int64 with 4 unique values
-[04/18/17 12:08:34] INFO Feature 16: count_4 is a numerical feature of type int64 with 3 unique values
-[04/18/17 12:08:34] INFO Feature 17: count_5 is a numerical feature of type int64 with 2 unique values
-[04/18/17 12:08:34] INFO Feature 18: count_6 is a numerical feature of type int64 with 2 unique values
-[04/18/17 12:08:34] INFO Feature 19: count_7 is a numerical feature of type int64 with 2 unique values
-[04/18/17 12:08:34] INFO Feature 20: count_8 is a numerical feature of type int64 with 3 unique values
-[04/18/17 12:08:34] INFO Feature 21: count_9 is a numerical feature of type int64 with 3 unique values
-[04/18/17 12:08:34] INFO New Feature Count : 21
-[04/18/17 12:08:34] INFO Scaling Base Features
-[04/18/17 12:08:34] INFO Creating NumPy Features
-[04/18/17 12:08:34] INFO NumPy Feature: sum
-[04/18/17 12:08:34] INFO NumPy Feature: mean
-[04/18/17 12:08:34] INFO NumPy Feature: standard deviation
-[04/18/17 12:08:34] INFO NumPy Feature: variance
-[04/18/17 12:08:34] INFO NumPy Feature Count : 4
-[04/18/17 12:08:34] INFO New Feature Count : 25
-[04/18/17 12:08:34] INFO Creating Clustering Features
-[04/18/17 12:08:34] INFO Cluster Minimum : 3
-[04/18/17 12:08:34] INFO Cluster Maximum : 30
-[04/18/17 12:08:34] INFO Cluster Increment : 3
-[04/18/17 12:08:34] INFO k = 3
-[04/18/17 12:08:34] INFO k = 6
-[04/18/17 12:08:34] INFO k = 9
-[04/18/17 12:08:34] INFO k = 12
-[04/18/17 12:08:34] INFO k = 15
-[04/18/17 12:08:34] INFO k = 18
-[04/18/17 12:08:34] INFO k = 21
-[04/18/17 12:08:34] INFO k = 24
-[04/18/17 12:08:34] INFO k = 27
-[04/18/17 12:08:34] INFO k = 30
-[04/18/17 12:08:35] INFO Clustering Feature Count : 10
-[04/18/17 12:08:35] INFO New Feature Count : 35
-[04/18/17 12:08:35] INFO Saving New Features in Model
-[04/18/17 12:08:35] INFO Creating Interactions
-[04/18/17 12:08:35] INFO Initial Feature Count : 35
-[04/18/17 12:08:35] INFO Generating Polynomial Features
-[04/18/17 12:08:35] INFO Interaction Percentage : 10
-[04/18/17 12:08:35] INFO Polynomial Degree : 5
-[04/18/17 12:08:35] INFO Polynomial Feature Count : 15
-[04/18/17 12:08:35] INFO New Total Feature Count : 50
-[04/18/17 12:08:35] INFO Saving New Features in Model
-[04/18/17 12:08:35] INFO Removing Low-Variance Features
-[04/18/17 12:08:35] INFO Low-Variance Threshold : 0.10
-[04/18/17 12:08:35] INFO Original Feature Count : 50
-[04/18/17 12:08:35] INFO Reduced Feature Count : 50
-[04/18/17 12:08:35] INFO Saving New Features in Model
-[04/18/17 12:08:35] INFO Skipping Shuffling
-[04/18/17 12:08:35] INFO Skipping Sampling
-[04/18/17 12:08:35] INFO Getting Class Weights
-[04/18/17 12:08:35] INFO Class Weight for target Survived [1]: 1.605263
-[04/18/17 12:08:35] INFO Getting All Estimators
-[04/18/17 12:08:35] INFO Algorithm Configuration
-[04/18/17 12:08:35] INFO Selecting Models
-[04/18/17 12:08:35] INFO Algorithm: RF
-[04/18/17 12:08:35] INFO Fitting Initial Model
-[04/18/17 12:08:35] INFO Recursive Feature Elimination with CV
-[04/18/17 12:08:58] INFO RFECV took 23.22 seconds for step 3 and 3 folds
-[04/18/17 12:08:58] INFO Algorithm: RF, Selected Features: 14, Ranking: [ 5 1 1 1 8 11 1 1 4 8 11 8 9 9 9 13 12 13 13 11 12 1 1 1 1
- 12 10 7 6 2 7 4 6 7 3 3 1 5 10 1 2 10 1 4 6 1 2 3 5 1]
-[04/18/17 12:08:58] INFO Randomized Grid Search
-[04/18/17 12:09:39] INFO Grid Search took 40.42 seconds for 50 candidate parameter settings.
-[04/18/17 12:09:39] INFO Model with rank: 1
-[04/18/17 12:09:39] INFO Mean validation score: 0.862 (std: 0.022)
-[04/18/17 12:09:39] INFO Parameters: {'est__n_estimators': 201, 'est__min_samples_split': 10, 'est__min_samples_leaf': 1, 'est__max_depth': 7, 'est__criterion': 'entropy', 'est__bootstrap': True}
-[04/18/17 12:09:39] INFO Model with rank: 2
-[04/18/17 12:09:39] INFO Mean validation score: 0.860 (std: 0.019)
-[04/18/17 12:09:39] INFO Parameters: {'est__n_estimators': 201, 'est__min_samples_split': 10, 'est__min_samples_leaf': 3, 'est__max_depth': 10, 'est__criterion': 'gini', 'est__bootstrap': True}
-[04/18/17 12:09:39] INFO Model with rank: 3
-[04/18/17 12:09:39] INFO Mean validation score: 0.859 (std: 0.022)
-[04/18/17 12:09:39] INFO Parameters: {'est__n_estimators': 201, 'est__min_samples_split': 2, 'est__min_samples_leaf': 3, 'est__max_depth': 5, 'est__criterion': 'gini', 'est__bootstrap': True}
-[04/18/17 12:09:39] INFO Algorithm: RF, Best Score: 0.8617, Best Parameters: {'est__n_estimators': 201, 'est__min_samples_split': 10, 'est__min_samples_leaf': 1, 'est__max_depth': 7, 'est__criterion': 'entropy', 'est__bootstrap': True}
-[04/18/17 12:09:39] INFO Final Model Predictions for RF
-[04/18/17 12:09:39] INFO Skipping Calibration
-[04/18/17 12:09:39] INFO Making Predictions
-[04/18/17 12:09:39] INFO Predictions Complete
-[04/18/17 12:09:39] INFO Algorithm: XGB
-[04/18/17 12:09:39] INFO Fitting Initial Model
-[04/18/17 12:09:39] INFO No RFE Available for XGB
-[04/18/17 12:09:39] INFO Randomized Grid Search
-[04/18/17 12:10:03] INFO Grid Search took 23.32 seconds for 50 candidate parameter settings.
-[04/18/17 12:10:03] INFO Model with rank: 1
-[04/18/17 12:10:03] INFO Mean validation score: 0.857 (std: 0.016)
-[04/18/17 12:10:03] INFO Parameters: {'est__subsample': 0.5, 'est__n_estimators': 51, 'est__min_child_weight': 1.1, 'est__max_depth': 9, 'est__learning_rate': 0.02, 'est__colsample_bytree': 0.8}
-[04/18/17 12:10:03] INFO Model with rank: 2
-[04/18/17 12:10:03] INFO Mean validation score: 0.857 (std: 0.017)
-[04/18/17 12:10:03] INFO Parameters: {'est__subsample': 0.5, 'est__n_estimators': 21, 'est__min_child_weight': 1.1, 'est__max_depth': 10, 'est__learning_rate': 0.01, 'est__colsample_bytree': 1.0}
-[04/18/17 12:10:03] INFO Model with rank: 3
-[04/18/17 12:10:03] INFO Mean validation score: 0.857 (std: 0.016)
-[04/18/17 12:10:03] INFO Parameters: {'est__subsample': 0.8, 'est__n_estimators': 51, 'est__min_child_weight': 1.1, 'est__max_depth': 5, 'est__learning_rate': 0.05, 'est__colsample_bytree': 0.9}
-[04/18/17 12:10:03] INFO Algorithm: XGB, Best Score: 0.8574, Best Parameters: {'est__subsample': 0.5, 'est__n_estimators': 51, 'est__min_child_weight': 1.1, 'est__max_depth': 9, 'est__learning_rate': 0.02, 'est__colsample_bytree': 0.8}
-[04/18/17 12:10:03] INFO Final Model Predictions for XGB
-[04/18/17 12:10:03] INFO Skipping Calibration
-[04/18/17 12:10:03] INFO Making Predictions
-[04/18/17 12:10:03] INFO Predictions Complete
-[04/18/17 12:10:03] INFO Blending Models
-[04/18/17 12:10:03] INFO Blending Start: 2017-04-18 12:10:03.066771
-[04/18/17 12:10:03] INFO Blending Complete: 0:00:00.008102
-[04/18/17 12:10:03] INFO ================================================================================
-[04/18/17 12:10:03] INFO Metrics for: Partition.train
-[04/18/17 12:10:03] INFO --------------------------------------------------------------------------------
-[04/18/17 12:10:03] INFO Algorithm: RF
-[04/18/17 12:10:03] INFO accuracy: 0.894500561167
-[04/18/17 12:10:03] INFO adjusted_rand_score: 0.61985360714
-[04/18/17 12:10:03] INFO average_precision: 0.937994687253
-[04/18/17 12:10:03] INFO confusion_matrix: [[525 24]
- [ 70 272]]
-[04/18/17 12:10:03] INFO explained_variance: 0.565195624154
-[04/18/17 12:10:03] INFO f1: 0.852664576803
-[04/18/17 12:10:03] INFO mean_absolute_error: 0.105499438833
-[04/18/17 12:10:03] INFO median_absolute_error: 0.0
-[04/18/17 12:10:03] INFO neg_log_loss: 0.304153797611
-[04/18/17 12:10:03] INFO neg_mean_squared_error: 0.105499438833
-[04/18/17 12:10:03] INFO precision: 0.918918918919
-[04/18/17 12:10:03] INFO r2: 0.553925798102
-[04/18/17 12:10:03] INFO recall: 0.795321637427
-[04/18/17 12:10:03] INFO roc_auc: 0.953855494839
-[04/18/17 12:10:03] INFO --------------------------------------------------------------------------------
-[04/18/17 12:10:03] INFO Algorithm: XGB
-[04/18/17 12:10:03] INFO accuracy: 0.89898989899
-[04/18/17 12:10:03] INFO adjusted_rand_score: 0.634084281404
-[04/18/17 12:10:03] INFO average_precision: 0.933465422975
-[04/18/17 12:10:03] INFO confusion_matrix: [[529 20]
- [ 70 272]]
-[04/18/17 12:10:03] INFO explained_variance: 0.586222690911
-[04/18/17 12:10:03] INFO f1: 0.858044164038
-[04/18/17 12:10:03] INFO mean_absolute_error: 0.10101010101
-[04/18/17 12:10:03] INFO median_absolute_error: 0.0
-[04/18/17 12:10:03] INFO neg_log_loss: 0.413047928351
-[04/18/17 12:10:03] INFO neg_mean_squared_error: 0.10101010101
-[04/18/17 12:10:03] INFO precision: 0.931506849315
-[04/18/17 12:10:03] INFO r2: 0.572907679034
-[04/18/17 12:10:03] INFO recall: 0.795321637427
-[04/18/17 12:10:03] INFO roc_auc: 0.950199192578
-[04/18/17 12:10:03] INFO ================================================================================
-[04/18/17 12:10:03] INFO Metrics for: Partition.test
-[04/18/17 12:10:03] INFO No labels for generating Partition.test metrics
-[04/18/17 12:10:03] INFO ================================================================================
-[04/18/17 12:10:03] INFO Selecting Best Model
-[04/18/17 12:10:03] INFO Scoring for: Partition.train
-[04/18/17 12:10:03] INFO Best Model Selection Start: 2017-04-18 12:10:03.106245
-[04/18/17 12:10:03] INFO Scoring RF Model
-[04/18/17 12:10:03] INFO Scoring XGB Model
-[04/18/17 12:10:03] INFO Scoring BLEND Model
-[04/18/17 12:10:03] INFO Best Model is BLEND with a roc_auc score of 0.9539
-[04/18/17 12:10:03] INFO Best Model Selection Complete: 0:00:00.001146
-[04/18/17 12:10:03] INFO ================================================================================
-[04/18/17 12:10:03] INFO Generating Plots for partition: train
-[04/18/17 12:10:03] INFO Generating Calibration Plot
-[04/18/17 12:10:03] INFO Calibration for Algorithm: RF
-[04/18/17 12:10:03] INFO Calibration for Algorithm: XGB
-[04/18/17 12:10:03] INFO Writing plot to /Users/markconway/Projects/Titanic/plots/calibration_train.png
-[04/18/17 12:10:03] INFO Generating Confusion Matrices
-[04/18/17 12:10:03] INFO Confusion Matrix for Algorithm: RF
-[04/18/17 12:10:03] INFO Confusion Matrix:
-[04/18/17 12:10:03] INFO [[525 24]
- [ 70 272]]
-[04/18/17 12:10:03] INFO Writing plot to /Users/markconway/Projects/Titanic/plots/confusion_train_RF.png
-[04/18/17 12:10:03] INFO Confusion Matrix for Algorithm: XGB
-[04/18/17 12:10:03] INFO Confusion Matrix:
-[04/18/17 12:10:03] INFO [[529 20]
- [ 70 272]]
-[04/18/17 12:10:03] INFO Writing plot to /Users/markconway/Projects/Titanic/plots/confusion_train_XGB.png
-[04/18/17 12:10:04] INFO Generating ROC Curves
-[04/18/17 12:10:04] INFO ROC Curve for Algorithm: RF
-[04/18/17 12:10:04] INFO ROC Curve for Algorithm: XGB
-[04/18/17 12:10:04] INFO Writing plot to /Users/markconway/Projects/Titanic/plots/roc_curve_train.png
-[04/18/17 12:10:04] INFO Generating Learning Curves
-[04/18/17 12:10:04] INFO Algorithm Configuration
-[04/18/17 12:10:04] INFO Learning Curve for Algorithm: RF
-[04/18/17 12:10:06] INFO Writing plot to /Users/markconway/Projects/Titanic/plots/learning_curve_train_RF.png
-[04/18/17 12:10:06] INFO Learning Curve for Algorithm: XGB
-[04/18/17 12:10:06] INFO Writing plot to /Users/markconway/Projects/Titanic/plots/learning_curve_train_XGB.png
-[04/18/17 12:10:06] INFO Generating Feature Importance Plots
-[04/18/17 12:10:06] INFO Feature Importances for Algorithm: RF
-[04/18/17 12:10:06] INFO Feature Ranking:
-[04/18/17 12:10:06] INFO 1. Feature 2 (0.108046)
-[04/18/17 12:10:06] INFO 2. Feature 36 (0.073566)
-[04/18/17 12:10:06] INFO 3. Feature 39 (0.057581)
-[04/18/17 12:10:06] INFO 4. Feature 3 (0.051578)
-[04/18/17 12:10:06] INFO 5. Feature 7 (0.046824)
-[04/18/17 12:10:06] INFO 6. Feature 42 (0.046571)
-[04/18/17 12:10:06] INFO 7. Feature 24 (0.045251)
-[04/18/17 12:10:06] INFO 8. Feature 23 (0.044804)
-[04/18/17 12:10:06] INFO 9. Feature 22 (0.038629)
-[04/18/17 12:10:06] INFO 10. Feature 21 (0.037361)
-[04/18/17 12:10:06] INFO Writing plot to /Users/markconway/Projects/Titanic/plots/feature_importance_train_RF.png
-[04/18/17 12:10:07] INFO Feature Importances for Algorithm: XGB
-[04/18/17 12:10:07] INFO Feature Ranking:
-[04/18/17 12:10:07] INFO 1. Feature 2 (0.138577)
-[04/18/17 12:10:07] INFO 2. Feature 3 (0.119850)
-[04/18/17 12:10:07] INFO 3. Feature 0 (0.116105)
-[04/18/17 12:10:07] INFO 4. Feature 7 (0.108614)
-[04/18/17 12:10:07] INFO 5. Feature 31 (0.104869)
-[04/18/17 12:10:07] INFO 6. Feature 23 (0.074906)
-[04/18/17 12:10:07] INFO 7. Feature 40 (0.067416)
-[04/18/17 12:10:07] INFO 8. Feature 4 (0.033708)
-[04/18/17 12:10:07] INFO 9. Feature 33 (0.029963)
-[04/18/17 12:10:07] INFO 10. Feature 9 (0.029963)
-[04/18/17 12:10:07] INFO Writing plot to /Users/markconway/Projects/Titanic/plots/feature_importance_train_XGB.png
-[04/18/17 12:10:07] INFO ================================================================================
-[04/18/17 12:10:07] INFO Saving Model Predictor
-[04/18/17 12:10:07] INFO Writing model predictor to /Users/markconway/Projects/Titanic/model/model_20170418.pkl
-[04/18/17 12:10:07] INFO Saving Feature Map
-[04/18/17 12:10:07] INFO Writing feature map to /Users/markconway/Projects/Titanic/model/feature_map_20170418.pkl
-[04/18/17 12:10:07] INFO Loading data from /Users/markconway/Projects/Titanic/input/test.csv
-[04/18/17 12:10:07] INFO Saving Predictions
-[04/18/17 12:10:07] INFO Storing output to /Users/markconway/Projects/Titanic/output/predictions_20170418.csv
-[04/18/17 12:10:07] INFO Saving Probabilities
-[04/18/17 12:10:07] INFO Storing output to /Users/markconway/Projects/Titanic/output/probabilities_20170418.csv
-[04/18/17 12:10:07] INFO Saving Ranked Predictions
-[04/18/17 12:10:07] INFO Writing data frame to /Users/markconway/Projects/Titanic/output/rankings_20170418.csv
-[04/18/17 12:10:07] INFO Saving Submission
-[04/18/17 12:10:07] INFO ********************************************************************************
-[04/18/17 12:10:07] INFO AlphaPy End
-[04/18/17 12:10:07] INFO ********************************************************************************
+[12/30/17 23:17:50] INFO Feature Count : 10
+[12/30/17 23:17:50] INFO Creating Count Features
+[12/30/17 23:17:50] INFO NA Counts
+[12/30/17 23:17:50] INFO Number Counts
+[12/30/17 23:17:50] INFO New Feature Count : 21
+[12/30/17 23:17:50] INFO Creating Base Features
+[12/30/17 23:17:50] INFO Feature 1: Pclass is a numerical feature of type int64 with 3 unique values
+[12/30/17 23:17:50] INFO Feature 2: Name is a text feature [12:82] with 1307 unique values
+[12/30/17 23:17:50] INFO Feature 2: Name => Factorization
+[12/30/17 23:17:50] INFO Feature 3: Sex is a text feature [4:6] with 2 unique values
+[12/30/17 23:17:50] INFO Feature 3: Sex => Factorization
+[12/30/17 23:17:50] INFO Feature 4: Age is a numerical feature of type float64 with 99 unique values
+[12/30/17 23:17:50] INFO Feature 5: SibSp is a numerical feature of type int64 with 7 unique values
+[12/30/17 23:17:50] INFO Feature 6: Parch is a numerical feature of type int64 with 8 unique values
+[12/30/17 23:17:50] INFO Feature 7: Ticket is a text feature [3:18] with 929 unique values
+[12/30/17 23:17:50] INFO Feature 7: Ticket => Factorization
+[12/30/17 23:17:50] INFO Feature 8: Fare is a numerical feature of type float64 with 282 unique values
+[12/30/17 23:17:50] INFO Feature 9: Cabin is a text feature [1:15] with 187 unique values
+[12/30/17 23:17:50] INFO Feature 9: Cabin => Factorization
+[12/30/17 23:17:50] INFO Feature 10: Embarked is a text feature [1:1] with 4 unique values
+[12/30/17 23:17:50] INFO Feature 10: Embarked => Factorization
+[12/30/17 23:17:50] INFO Feature 11: nan_count is a numerical feature of type int64 with 3 unique values
+[12/30/17 23:17:50] INFO Feature 12: count_0 is a numerical feature of type int64 with 4 unique values
+[12/30/17 23:17:50] INFO Feature 13: count_1 is a numerical feature of type int64 with 4 unique values
+[12/30/17 23:17:50] INFO Feature 14: count_2 is a numerical feature of type int64 with 4 unique values
+[12/30/17 23:17:50] INFO Feature 15: count_3 is a numerical feature of type int64 with 4 unique values
+[12/30/17 23:17:50] INFO Feature 16: count_4 is a numerical feature of type int64 with 3 unique values
+[12/30/17 23:17:50] INFO Feature 17: count_5 is a numerical feature of type int64 with 2 unique values
+[12/30/17 23:17:50] INFO Feature 18: count_6 is a numerical feature of type int64 with 2 unique values
+[12/30/17 23:17:50] INFO Feature 19: count_7 is a numerical feature of type int64 with 2 unique values
+[12/30/17 23:17:50] INFO Feature 20: count_8 is a numerical feature of type int64 with 3 unique values
+[12/30/17 23:17:50] INFO Feature 21: count_9 is a numerical feature of type int64 with 3 unique values
+[12/30/17 23:17:50] INFO New Feature Count : 21
+[12/30/17 23:17:50] INFO Scaling Base Features
+[12/30/17 23:17:50] INFO Creating NumPy Features
+[12/30/17 23:17:50] INFO NumPy Feature: sum
+[12/30/17 23:17:50] INFO NumPy Feature: mean
+[12/30/17 23:17:50] INFO NumPy Feature: standard deviation
+[12/30/17 23:17:50] INFO NumPy Feature: variance
+[12/30/17 23:17:50] INFO NumPy Feature Count : 4
+[12/30/17 23:17:50] INFO New Feature Count : 25
+[12/30/17 23:17:50] INFO Creating Clustering Features
+[12/30/17 23:17:50] INFO Cluster Minimum : 3
+[12/30/17 23:17:50] INFO Cluster Maximum : 30
+[12/30/17 23:17:50] INFO Cluster Increment : 3
+[12/30/17 23:17:50] INFO k = 3
+[12/30/17 23:17:50] INFO k = 6
+[12/30/17 23:17:50] INFO k = 9
+[12/30/17 23:17:50] INFO k = 12
+[12/30/17 23:17:50] INFO k = 15
+[12/30/17 23:17:50] INFO k = 18
+[12/30/17 23:17:50] INFO k = 21
+[12/30/17 23:17:50] INFO k = 24
+[12/30/17 23:17:50] INFO k = 27
+[12/30/17 23:17:51] INFO k = 30
+[12/30/17 23:17:51] INFO Clustering Feature Count : 10
+[12/30/17 23:17:51] INFO New Feature Count : 35
+[12/30/17 23:17:51] INFO Saving New Features in Model
+[12/30/17 23:17:51] INFO Creating Interactions
+[12/30/17 23:17:51] INFO Initial Feature Count : 35
+[12/30/17 23:17:51] INFO Generating Polynomial Features
+[12/30/17 23:17:51] INFO Interaction Percentage : 10
+[12/30/17 23:17:51] INFO Polynomial Degree : 5
+[12/30/17 23:17:51] INFO Polynomial Feature Count : 15
+[12/30/17 23:17:51] INFO New Total Feature Count : 50
+[12/30/17 23:17:51] INFO Saving New Features in Model
+[12/30/17 23:17:51] INFO Removing Low-Variance Features
+[12/30/17 23:17:51] INFO Low-Variance Threshold : 0.10
+[12/30/17 23:17:51] INFO Original Feature Count : 50
+[12/30/17 23:17:51] INFO Reduced Feature Count : 50
+[12/30/17 23:17:51] INFO Saving New Features in Model
+[12/30/17 23:17:51] INFO Skipping Shuffling
+[12/30/17 23:17:51] INFO Skipping Sampling
+[12/30/17 23:17:51] INFO Getting Class Weights
+[12/30/17 23:17:51] INFO Class Weight for target Survived [1]: 1.605263
+[12/30/17 23:17:51] INFO Getting All Estimators
+[12/30/17 23:17:51] INFO Algorithm Configuration
+[12/30/17 23:17:51] INFO Selecting Models
+[12/30/17 23:17:51] INFO Algorithm: RF
+[12/30/17 23:17:51] INFO Fitting Initial Model
+[12/30/17 23:17:51] INFO Recursive Feature Elimination with CV
+[12/30/17 23:18:14] INFO RFECV took 22.72 seconds for step 3 and 3 folds
+[12/30/17 23:18:14] INFO Algorithm: RF, Selected Features: 20, Ranking: [ 2 1 1 1 5 9 1 1 2 6 8 7 8 6 7 10 11 11 11 10 10 1 1 1 1
+ 9 6 9 5 1 5 4 2 4 1 1 1 3 7 1 1 8 1 1 4 1 1 3 3 1]
+[12/30/17 23:18:14] INFO Randomized Grid Search
+[12/30/17 23:19:08] INFO Grid Search took 54.03 seconds for 50 candidate parameter settings.
+[12/30/17 23:19:08] INFO Model with rank: 1
+[12/30/17 23:19:08] INFO Mean validation score: 0.863 (std: 0.014)
+[12/30/17 23:19:08] INFO Parameters: {'est__n_estimators': 501, 'est__min_samples_split': 5, 'est__min_samples_leaf': 3, 'est__max_depth': 7, 'est__criterion': 'entropy', 'est__bootstrap': True}
+[12/30/17 23:19:08] INFO Model with rank: 2
+[12/30/17 23:19:08] INFO Mean validation score: 0.862 (std: 0.015)
+[12/30/17 23:19:08] INFO Parameters: {'est__n_estimators': 201, 'est__min_samples_split': 10, 'est__min_samples_leaf': 2, 'est__max_depth': 7, 'est__criterion': 'entropy', 'est__bootstrap': True}
+[12/30/17 23:19:08] INFO Model with rank: 3
+[12/30/17 23:19:08] INFO Mean validation score: 0.861 (std: 0.014)
+[12/30/17 23:19:08] INFO Parameters: {'est__n_estimators': 101, 'est__min_samples_split': 2, 'est__min_samples_leaf': 3, 'est__max_depth': 7, 'est__criterion': 'entropy', 'est__bootstrap': True}
+[12/30/17 23:19:08] INFO Algorithm: RF, Best Score: 0.8627, Best Parameters: {'est__n_estimators': 501, 'est__min_samples_split': 5, 'est__min_samples_leaf': 3, 'est__max_depth': 7, 'est__criterion': 'entropy', 'est__bootstrap': True}
+[12/30/17 23:19:08] INFO Final Model Predictions for RF
+[12/30/17 23:19:08] INFO Skipping Calibration
+[12/30/17 23:19:08] INFO Making Predictions
+[12/30/17 23:19:09] INFO Predictions Complete
+[12/30/17 23:19:09] INFO Algorithm: XGB
+[12/30/17 23:19:09] INFO Fitting Initial Model
+[12/30/17 23:19:09] INFO No RFE Available for XGB
+[12/30/17 23:19:09] INFO Randomized Grid Search
+[12/30/17 23:19:32] INFO Grid Search took 23.44 seconds for 50 candidate parameter settings.
+[12/30/17 23:19:32] INFO Model with rank: 1
+[12/30/17 23:19:32] INFO Mean validation score: 0.863 (std: 0.020)
+[12/30/17 23:19:32] INFO Parameters: {'est__subsample': 0.6, 'est__n_estimators': 21, 'est__min_child_weight': 1.1, 'est__max_depth': 12, 'est__learning_rate': 0.1, 'est__colsample_bytree': 0.7}
+[12/30/17 23:19:32] INFO Model with rank: 2
+[12/30/17 23:19:32] INFO Mean validation score: 0.856 (std: 0.014)
+[12/30/17 23:19:32] INFO Parameters: {'est__subsample': 0.5, 'est__n_estimators': 51, 'est__min_child_weight': 1.0, 'est__max_depth': 8, 'est__learning_rate': 0.01, 'est__colsample_bytree': 0.7}
+[12/30/17 23:19:32] INFO Model with rank: 3
+[12/30/17 23:19:32] INFO Mean validation score: 0.855 (std: 0.023)
+[12/30/17 23:19:32] INFO Parameters: {'est__subsample': 0.5, 'est__n_estimators': 21, 'est__min_child_weight': 1.0, 'est__max_depth': 7, 'est__learning_rate': 0.05, 'est__colsample_bytree': 0.6}
+[12/30/17 23:19:32] INFO Algorithm: XGB, Best Score: 0.8627, Best Parameters: {'est__subsample': 0.6, 'est__n_estimators': 21, 'est__min_child_weight': 1.1, 'est__max_depth': 12, 'est__learning_rate': 0.1, 'est__colsample_bytree': 0.7}
+[12/30/17 23:19:32] INFO Final Model Predictions for XGB
+[12/30/17 23:19:32] INFO Skipping Calibration
+[12/30/17 23:19:32] INFO Making Predictions
+[12/30/17 23:19:32] INFO Predictions Complete
+[12/30/17 23:19:32] INFO Blending Models
+[12/30/17 23:19:32] INFO Blending Start: 2017-12-30 23:19:32.734086
+[12/30/17 23:19:32] INFO Blending Complete: 0:00:00.010781
+[12/30/17 23:19:32] INFO ================================================================================
+[12/30/17 23:19:32] INFO Metrics for: Partition.train
+[12/30/17 23:19:32] INFO --------------------------------------------------------------------------------
+[12/30/17 23:19:32] INFO Algorithm: RF
+[12/30/17 23:19:32] INFO accuracy: 0.895622895623
+[12/30/17 23:19:32] INFO adjusted_rand_score: 0.623145355109
+[12/30/17 23:19:32] INFO average_precision: 0.939127507197
+[12/30/17 23:19:32] INFO confusion_matrix: [[530 19]
+ [ 74 268]]
+[12/30/17 23:19:32] INFO explained_variance: 0.574782432706
+[12/30/17 23:19:32] INFO f1: 0.852146263911
+[12/30/17 23:19:32] INFO mean_absolute_error: 0.104377104377
+[12/30/17 23:19:32] INFO median_absolute_error: 0.0
+[12/30/17 23:19:32] INFO neg_log_loss: 0.299193724458
+[12/30/17 23:19:32] INFO neg_mean_squared_error: 0.104377104377
+[12/30/17 23:19:32] INFO precision: 0.933797909408
+[12/30/17 23:19:32] INFO r2: 0.558671268335
+[12/30/17 23:19:32] INFO recall: 0.783625730994
+[12/30/17 23:19:32] INFO roc_auc: 0.954665047561
+[12/30/17 23:19:32] INFO --------------------------------------------------------------------------------
+[12/30/17 23:19:32] INFO Algorithm: XGB
+[12/30/17 23:19:32] INFO accuracy: 0.915824915825
+[12/30/17 23:19:32] INFO adjusted_rand_score: 0.689583531462
+[12/30/17 23:19:32] INFO average_precision: 0.958117084885
+[12/30/17 23:19:32] INFO confusion_matrix: [[532 17]
+ [ 58 284]]
+[12/30/17 23:19:32] INFO explained_variance: 0.653042746514
+[12/30/17 23:19:32] INFO f1: 0.883359253499
+[12/30/17 23:19:32] INFO mean_absolute_error: 0.0841750841751
+[12/30/17 23:19:32] INFO median_absolute_error: 0.0
+[12/30/17 23:19:32] INFO neg_log_loss: 0.295991903662
+[12/30/17 23:19:32] INFO neg_mean_squared_error: 0.0841750841751
+[12/30/17 23:19:32] INFO precision: 0.943521594684
+[12/30/17 23:19:32] INFO r2: 0.644089732528
+[12/30/17 23:19:32] INFO recall: 0.830409356725
+[12/30/17 23:19:32] INFO roc_auc: 0.971127728246
+[12/30/17 23:19:32] INFO ================================================================================
+[12/30/17 23:19:32] INFO Metrics for: Partition.test
+[12/30/17 23:19:32] INFO No labels for generating Partition.test metrics
+[12/30/17 23:19:32] INFO ================================================================================
+[12/30/17 23:19:32] INFO Selecting Best Model
+[12/30/17 23:19:32] INFO Scoring for: Partition.train
+[12/30/17 23:19:32] INFO Best Model Selection Start: 2017-12-30 23:19:32.779281
+[12/30/17 23:19:32] INFO Scoring RF Model
+[12/30/17 23:19:32] INFO Scoring XGB Model
+[12/30/17 23:19:32] INFO Scoring BLEND Model
+[12/30/17 23:19:32] INFO Best Model is XGB with a roc_auc score of 0.9711
+[12/30/17 23:19:32] INFO Best Model Selection Complete: 0:00:00.000801
+[12/30/17 23:19:32] INFO ================================================================================
+[12/30/17 23:19:32] INFO Generating Plots for partition: train
+[12/30/17 23:19:32] INFO Generating Calibration Plot
+[12/30/17 23:19:32] INFO Calibration for Algorithm: RF
+[12/30/17 23:19:32] INFO Calibration for Algorithm: XGB
+[12/30/17 23:19:32] INFO Writing plot to ./plots/calibration_train.png
+[12/30/17 23:19:33] INFO Generating Confusion Matrices
+[12/30/17 23:19:33] INFO Confusion Matrix for Algorithm: RF
+[12/30/17 23:19:33] INFO Confusion Matrix:
+[12/30/17 23:19:33] INFO [[530 19]
+ [ 74 268]]
+[12/30/17 23:19:33] INFO Writing plot to ./plots/confusion_train_RF.png
+[12/30/17 23:19:33] INFO Confusion Matrix for Algorithm: XGB
+[12/30/17 23:19:33] INFO Confusion Matrix:
+[12/30/17 23:19:33] INFO [[532 17]
+ [ 58 284]]
+[12/30/17 23:19:33] INFO Writing plot to ./plots/confusion_train_XGB.png
+[12/30/17 23:19:33] INFO Generating ROC Curves
+[12/30/17 23:19:33] INFO ROC Curve for Algorithm: RF
+[12/30/17 23:19:33] INFO ROC Curve for Algorithm: XGB
+[12/30/17 23:19:33] INFO Writing plot to ./plots/roc_curve_train.png
+[12/30/17 23:19:33] INFO Generating Learning Curves
+[12/30/17 23:19:33] INFO Algorithm Configuration
+[12/30/17 23:19:33] INFO Learning Curve for Algorithm: RF
+[12/30/17 23:19:35] INFO Writing plot to ./plots/learning_curve_train_RF.png
+[12/30/17 23:19:35] INFO Learning Curve for Algorithm: XGB
+[12/30/17 23:19:36] INFO Writing plot to ./plots/learning_curve_train_XGB.png
+[12/30/17 23:19:36] INFO Generating Feature Importance Plots
+[12/30/17 23:19:36] INFO Feature Importances for Algorithm: RF
+[12/30/17 23:19:36] INFO Feature Ranking:
+[12/30/17 23:19:36] INFO 1. Feature 2 (0.106345)
+[12/30/17 23:19:36] INFO 2. Feature 36 (0.074083)
+[12/30/17 23:19:36] INFO 3. Feature 39 (0.055330)
+[12/30/17 23:19:36] INFO 4. Feature 3 (0.050339)
+[12/30/17 23:19:36] INFO 5. Feature 7 (0.049228)
+[12/30/17 23:19:36] INFO 6. Feature 23 (0.044868)
+[12/30/17 23:19:36] INFO 7. Feature 22 (0.042925)
+[12/30/17 23:19:36] INFO 8. Feature 42 (0.042850)
+[12/30/17 23:19:36] INFO 9. Feature 21 (0.039954)
+[12/30/17 23:19:36] INFO 10. Feature 24 (0.038563)
+[12/30/17 23:19:36] INFO Writing plot to ./plots/feature_importance_train_RF.png
+[12/30/17 23:19:36] INFO Feature Importances for Algorithm: XGB
+[12/30/17 23:19:36] INFO Feature Ranking:
+[12/30/17 23:19:36] INFO 1. Feature 2 (0.142857)
+[12/30/17 23:19:36] INFO 2. Feature 3 (0.120301)
+[12/30/17 23:19:36] INFO 3. Feature 0 (0.116541)
+[12/30/17 23:19:36] INFO 4. Feature 7 (0.109023)
+[12/30/17 23:19:36] INFO 5. Feature 31 (0.105263)
+[12/30/17 23:19:36] INFO 6. Feature 23 (0.075188)
+[12/30/17 23:19:36] INFO 7. Feature 40 (0.071429)
+[12/30/17 23:19:36] INFO 8. Feature 8 (0.033835)
+[12/30/17 23:19:36] INFO 9. Feature 4 (0.030075)
+[12/30/17 23:19:36] INFO 10. Feature 9 (0.030075)
+[12/30/17 23:19:36] INFO Writing plot to ./plots/feature_importance_train_XGB.png
+[12/30/17 23:19:36] INFO ================================================================================
+[12/30/17 23:19:36] INFO Saving Model Predictor
+[12/30/17 23:19:36] INFO Writing model predictor to ./model/model_20171230.pkl
+[12/30/17 23:19:36] INFO Saving Feature Map
+[12/30/17 23:19:36] INFO Writing feature map to ./model/feature_map_20171230.pkl
+[12/30/17 23:19:36] INFO Loading data from ./input/test.csv
+[12/30/17 23:19:36] INFO Saving Predictions
+[12/30/17 23:19:36] INFO Storing output to ./output/predictions_20171230.csv
+[12/30/17 23:19:36] INFO Saving Probabilities
+[12/30/17 23:19:36] INFO Storing output to ./output/probabilities_20171230.csv
+[12/30/17 23:19:36] INFO Saving Ranked Predictions
+[12/30/17 23:19:36] INFO Writing data frame to ./output/rankings_20171230.csv
+[12/30/17 23:19:36] INFO Saving Submission to ./output/submission_20171230.csv
+[12/30/17 23:19:36] INFO ********************************************************************************
+[12/30/17 23:19:36] INFO AlphaPy End
+[12/30/17 23:19:36] INFO ********************************************************************************
diff --git a/environment.yml b/environment.yml
index e7c1153..d0e4579 100644
--- a/environment.yml
+++ b/environment.yml
@@ -4,18 +4,23 @@ channels:
- conda-forge
dependencies:
-- bokeh>=0.12
-- ipython>=3.2.3
-- matplotlib>=2.0.0
-- numpy>=1.9.1
-- pandas>=0.19.0
-- pyyaml>=3.12
-- scikit-learn>=0.17.1
-- scipy>=0.18.1
-- seaborn>=0.7.1
-- xgboost>=0.6a2
+- bokeh>=1.3
+- ipython>=7.2
+- keras>=2.3.1
+- matplotlib>=3.0
+- numpy>=1.17
+- pandas>=1.0
+- pyyaml>=5.0
+- scikit-learn>=0.23.1
+- scipy==1.4.1
+- seaborn>=0.9
+- tensorflow>=2.0
- pip:
- - category_encoders>=1.2.0
- - imbalanced-learn>=0.2.1
- - pandas-datareader>=0.3
- - pyfolio>=0.7
\ No newline at end of file
+ - arrow>=0.13
+ - category_encoders>=2.1
+ - iexfinance>=0.4.3
+ - imbalanced-learn>=0.5
+ - pandas-datareader>=0.8
+ - pyfolio>=0.9
+ - sphinx-rtd-dark-mode>=1.3.0
+ - sphinx_rtd_theme>=2.0
diff --git a/readthedocs.yml b/readthedocs.yml
index 40c0954..36efe40 100644
--- a/readthedocs.yml
+++ b/readthedocs.yml
@@ -1,2 +1,27 @@
+# .readthedocs.yaml
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+# Set the version of Python and other tools you might need
+build:
+ os: ubuntu-20.04
+ tools:
+ python: "mambaforge-4.10"
+ # You can also specify other tool versions:
+ # nodejs: "16"
+ # rust: "1.55"
+ # golang: "1.17"
+
+# Build documentation in the docs/ directory with Sphinx
+sphinx:
+ configuration: docs/conf.py
+
+# If using Sphinx, optionally build your docs in additional formats such as PDF
+# formats:
+# - pdf
+
conda:
- file: environment.yml
\ No newline at end of file
+ environment: environment.yml
diff --git a/setup.py b/setup.py
index 9b75c6e..4e121e8 100644
--- a/setup.py
+++ b/setup.py
@@ -7,16 +7,16 @@
LONG_DESCRIPTION = "alphapy is a Python library for machine learning using scikit-learn. We have a stock market pipeline and a sports pipeline so that speculators can test predictive models, along with functions for trading systems and portfolio management."
MAINTAINER = 'ScottFree LLC [Robert D. Scott II, Mark Conway]'
-MAINTAINER_EMAIL = 'mark.conway@scottfreellc.com'
+MAINTAINER_EMAIL = 'scottfree.analytics@scottfreellc.com'
URL = "https://github.com/ScottFreeLLC/AlphaPy"
-LICENSE = "Apache License, Version 2.0"
-VERSION = "2.0"
+LICENSE = "Apache License, Version 2"
+VERSION = "2.5.0"
classifiers = ['Development Status :: 4 - Beta',
'Programming Language :: Python',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.4',
- 'Programming Language :: Python :: 3.5',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
'License :: OSI Approved :: Apache Software License',
'Intended Audience :: Science/Research',
'Topic :: Scientific/Engineering',
@@ -24,20 +24,23 @@
'Operating System :: OS Independent']
install_reqs = [
- 'bokeh>=0.12',
- 'category_encoders>=1.2.0',
- 'imbalanced-learn>=0.2.1',
- 'ipython>=3.2.3',
- 'matplotlib>=2.0.0',
- 'numpy>=1.9.1',
- 'pandas>=0.19.0',
- 'pandas-datareader>=0.3',
- 'pyfolio>=0.7',
- 'pyyaml>=3.12',
- 'scikit-learn>=0.17.1',
- 'scipy>=0.18.1',
- 'seaborn>=0.7.1',
- 'xgboost>=0.6a2',
+ 'arrow>=0.13',
+ 'bokeh>=1.3',
+ 'category_encoders>=2.1',
+ 'iexfinance>=0.4.3',
+ 'imbalanced-learn>=0.5',
+ 'ipython>=7.2',
+ 'keras>=2.3',
+ 'matplotlib>=3.0',
+ 'numpy>=1.17',
+ 'pandas>=1.0',
+ 'pandas-datareader>=0.8',
+ 'pyfolio>=0.9',
+ 'pyyaml>=5.0',
+ 'scikit-learn>=0.23.1',
+ 'scipy==1.10.0',
+ 'seaborn>=0.9',
+ 'tensorflow>=2.0',
]
if __name__ == "__main__":