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__":